app/django/db/models/manager.py
changeset 323 ff1a9aa48cfd
parent 54 03e267d67478
--- a/app/django/db/models/manager.py	Tue Oct 14 12:36:55 2008 +0000
+++ b/app/django/db/models/manager.py	Tue Oct 14 16:00:59 2008 +0000
@@ -1,11 +1,10 @@
 import copy
 
 from django.db.models.query import QuerySet, EmptyQuerySet, insert_query
-from django.dispatch import dispatcher
 from django.db.models import signals
 from django.db.models.fields import FieldDoesNotExist
 
-def ensure_default_manager(sender):
+def ensure_default_manager(sender, **kwargs):
     cls = sender
     if not getattr(cls, '_default_manager', None) and not cls._meta.abstract:
         # Create the default manager, if needed.
@@ -16,7 +15,7 @@
             pass
         cls.add_to_class('objects', Manager())
 
-dispatcher.connect(ensure_default_manager, signal=signals.class_prepared)
+signals.class_prepared.connect(ensure_default_manager)
 
 class Manager(object):
     # Tracks each time a Manager instance is created. Used to retain order.
@@ -24,10 +23,9 @@
 
     def __init__(self):
         super(Manager, self).__init__()
-        # Increase the creation counter, and save our local copy.
-        self.creation_counter = Manager.creation_counter
-        Manager.creation_counter += 1
+        self._set_creation_counter()
         self.model = None
+        self._inherited = False
 
     def contribute_to_class(self, model, name):
         # TODO: Use weakref because of possible memory leak / circular reference.
@@ -35,6 +33,17 @@
         setattr(model, name, ManagerDescriptor(self))
         if not getattr(model, '_default_manager', None) or self.creation_counter < model._default_manager.creation_counter:
             model._default_manager = self
+        if model._meta.abstract or self._inherited:
+            model._meta.abstract_managers.append((self.creation_counter, name,
+                    self))
+
+    def _set_creation_counter(self):
+        """
+        Sets the creation counter value for this instance and increments the
+        class-level copy.
+        """
+        self.creation_counter = Manager.creation_counter
+        Manager.creation_counter += 1
 
     def _copy_to_model(self, model):
         """
@@ -44,7 +53,9 @@
         """
         assert issubclass(model, self.model)
         mgr = copy.copy(self)
+        mgr._set_creation_counter()
         mgr.model = model
+        mgr._inherited = True
         return mgr
 
     #######################