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 django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
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