You could use a metaclass to keep track of all the classes that inherit
from a given one, in a pure Python way it would be something like this

class PluginMeta(type):
    # we use __init__ rather than __new__ here because we want
    # to modify attributes of the class *after* they have been
    # created
    def __init__(cls, name, bases, dct):
        if not hasattr(cls, 'registry'):
            # this is the base class.  Create an empty registry
            cls.registry = {}
        else:
            # this is a derived class.  Add cls to the registry
            interface_id = name.lower()
            cls.registry[interface_id] = cls
        super(PluginMeta, cls).__init__(name, bases, dct)
class Plugin(object):
    __metaclass__ = PluginMeta



So, all the classes that inherit from Plugin are stored in Plugin.registry.
Not sure if it works for mixins though.

On Mon, Oct 31, 2016 at 4:03 PM, Radek Svarz <[email protected]> wrote:

> Hi,
>
> I am using my custom permission mixin on several of my apps's models (not
> all).
>
> For the case when I need to merge from the "old - context" permission to
> the "new - context" permission I want to have function which changes the
> corresponding permission reference attribute in all models, which
> subclassed this mixin.
>
> How do I know which models subclassed this permission mixin and that they
> have the inherited permission reference attribute?
>
> In fact I want to have such function in my mixin:
>
> @classmethod
> def merge_to(cls, from_perm_context, to_perm_context):
>
>     perm_context_models = []  # How to get this?
>
>     try:
>         with transaction.atomic():
>             for model in perm_context_models:
>                 model.objects.filter(
>                     perm_context=from_perm_context,
>                 ).update(perm_context=to_perm_context)
>     except IntegrityError as e:  # or DatabaseError
>         raise e
>
>
>
>
> Thanks,
>
> Radek
>
> --
> 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 https://groups.google.com/group/django-users.
> To view this discussion on the web visit https://groups.google.com/d/
> msgid/django-users/576474f7-dace-4986-b121-0eb2e5428122%40googlegroups.com
> <https://groups.google.com/d/msgid/django-users/576474f7-dace-4986-b121-0eb2e5428122%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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 https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CALn3ei2uBoMi7SOE8RHH9-SALG%2BViYAz9Rj8e5ZLKwEztMnzzg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to