*Aim to achieve* - Get call stacks where specific model classes are used. 
(Example -  MyModel.objects.save(), MyModel.objects.filter(), etc)



*My Approach - *
Add this in order to override *Save* and *Delete*.
Class MyModelClass(CallStackMixin, models.Model)

In order to override *get_query_set*, I am overriding Model classes by
objects = CallStackManager()


In both *CallStackManager* and *CallStackMixin* I am calling 
*capture_call_stack* which eventually logs calls.

ex. 
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()

Also, I am defining a decorator *@donottrack* functionality where obvious 
calls to model classes are made. So that I would just log the new unique 
call stacks.

Definition for *@donottrack* is here -

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

*HALT_TRACKING* here is global var which keeps track of model classes not 
to be tracked scoped to that particular function. 
Also, using *Wrapt* in order to retain identity of wrapped functions. 

Strangely,  *HALT_TRACKING.pop()* gets executed before the call to *Save*, 
*delete* or *get_query_set* is made.
Any idea why it is so?

-- 
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/2f5b709f-9749-40b3-99fe-416bfe0e79d4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to