Exemplo n.º 1
0
    def contribute_to_class(self, model, name):
        """
        Specialization managers contribute to the model in a different way, so
        the code overrides what Django normally does.
        
        """

        # django.db.models.options.Options does not set these fields up, so we
        # might have to do it ourselves:
        if not hasattr(model._meta, 'abstract_specialization_managers'):
            model._meta.abstract_specialization_managers = []
        if not hasattr(model._meta, 'concrete_specialization_managers'):
            model._meta.concrete_specialization_managers = []

        self.model = model
        setattr(model, name, ManagerDescriptor(self))

        if (not getattr(model, '_default_specialization_manager', None)
                or self.creation_counter <
                model._default_specialization_manager.creation_counter):

            model._default_specialization_manager = self
        if model._meta.abstract or (self._inherited
                                    and not self.model._meta.proxy):
            model._meta.abstract_specialization_managers.append(
                (self.creation_counter, name, self))
        else:
            model._meta.concrete_specialization_managers.append(
                (self.creation_counter, name, self))
Exemplo n.º 2
0
 def contribute_to_class(self, model, name):
     """
     Newer versions of Django explicitly prevent managers being
     accessed from abstract classes, which is behaviour the search
     API has always relied on. Here we reinstate it.
     """
     super(SearchableManager, self).contribute_to_class(model, name)
     setattr(model, name, ManagerDescriptor(self))
Exemplo n.º 3
0
    def contribute_to_class(self, model, name):
        self.model = model

        # The ManagerDescriptor attribute prevents this controller from being accessed via model instances.
        setattr(model, name, ManagerDescriptor(self))

        models.signals.post_save.connect(self.post_save, sender=model)
        models.signals.post_delete.connect(self.post_delete, sender=model)
Exemplo n.º 4
0
    def contribute_to_class(self, model, name):
        if not self.name:
            self.name = name
        self.model = model

        opts = model._meta
        if DJANGO_VERSION < (1, 10):
            if opts.abstract:
                setattr(model, name, AbstractManagerDescriptor(model))
            elif opts.swapped:
                setattr(model, name, SwappedManagerDescriptor(model))
            else:
                setattr(model, name, ManagerDescriptor(self))

            abstract = (opts.abstract or (self._inherited and not opts.proxy))
            opts.managers.append((self.creation_counter, self, abstract))
        else:
            setattr(model, name, ManagerDescriptor(self))
            opts.add_manager(self)
Exemplo n.º 5
0
def setup_managers(sender):
    from .models.managers import money_manager

    if VERSION >= (1, 10):
        for manager in filter(lambda m: m.name == 'objects', sender._meta.managers):
            setattr(sender, manager.name, ManagerDescriptor(money_manager(manager)))
    else:
        sender.copy_managers([
            (_id, name, money_manager(manager))
            for _id, name, manager in sender._meta.concrete_managers if name == 'objects'
        ])
Exemplo n.º 6
0
    def contribute_to_class(self, model, name):
        self.model = model

        if self.related_fields:

            def load_related(instance, *args):
                related_fields = args if args else self.related_fields
                for field in related_fields:
                    model_field = self.model._meta.get_field_by_name(field)[0]
                    related_pk = getattr(instance, model_field.attname)
                    related_instance = model_field.rel.to.cache.get(
                        pk=related_pk) if related_pk else None
                    setattr(instance, model_field.get_cache_name(),
                            related_instance)

            self.model.load_related = load_related
        setattr(model, name, ManagerDescriptor(self))

        models.signals.post_save.connect(self._post_save, sender=model)
        models.signals.post_delete.connect(self._post_delete, sender=model)