Dear All,

My aim is to obtain all unique call stacks where model classes are 
accessed. 

To implement it, I thought of overriding save(), delete(), and 
get_query_set() methods, as follows -

class MyModelClass(CallStackMixin, models.Model) # Mixin to override save, 
and delete
        objects = CallStackManager() # Manager which overrides the 
get_query_set


Overriding those methods as follows -

class CallStackMixin(object):
    """ A mixin class for getting call stacks when Save() and Delete() 
methods are called
    """


    def save(self, *args, **kwargs):
        """
        Logs before save and overrides respective model API save()
        """
        capture_call_stack(type(self))
        return super(CallStackMixin, self).save(*args, **kwargs)


    def delete(self, *args, **kwargs):
        """
        Logs before delete and overrides respective model API delete()
        """
        capture_call_stack(type(self))
        return super(CallStackMixin, self).delete(*args, **kwargs)

class CallStackManager(Manager):
    """ A Manager class which overrides the default Manager class for 
getting call stacks
    """
    def get_query_set(self):
        """overriding the default queryset API method
        """
        capture_call_stack(type(self))
        return super(CallStackManager, self).get_query_set()

where *capture_call_stack *is a method which logs call stacks. 

There is also a functionality of *@donottrack* which is a decorator that 
avoids logging obvious calls made where we know the call stack.

The *@donottrack* is as follows -

def donottrack(*classes_not_to_be_tracked):
    """function decorator which deals with toggling call stack
    Args:
        classes_not_to_be_tracked: model classes where tracking is 
undesirable
    Returns:
        wrapped function
    """
    @wrapt.decorator
    def real_donottrack(wrapped, instance, args, kwargs):  # pylint: 
disable=W0613
        """takes function to be decorated and returns wrapped function


        Args:
            function - wrapped function i.e. real_donottrack
        """
        global HALT_TRACKING  # pylint: disable=W0603
        HALT_TRACKING.append(classes_not_to_be_tracked)
        HALT_TRACKING[-1] = list(set([x for sublist in HALT_TRACKING for x 
in sublist]))
        return_value = wrapped(*args, **kwargs)
        HALT_TRACKING.pop()
        return return_value
    return real_donottrack

Where *HALT_TRACKING *is a stack which is a global data structure, and it 
pops wrt to value associated with function.

I am using *@wrapt *for retaining identity of functions, and *ModelBase* 
class. Strangely, *HALT_TRACKING.pop() *executes first and then wrapped 
function seems to be in action. However, I desire to execute wrapped first 
and then pop *HALT_TRACKING*

Any idea what exactly is going wrong here?



-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/b386f27f-bea1-4d0f-a4e2-ee0ddbf71625%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to