From ad2eb44d297ed2b3decd59a97090ca70266f04c7 Mon Sep 17 00:00:00 2001
From: Sebastian Noack <sebastian.noack@gmail.com>
Date: Fri, 2 May 2008 13:22:20 +0200
Subject: [PATCH] Now all managers, not only the default manager gets copied to the derived model of an abstract model.

---
 django/db/models/base.py    |   16 +++++++---------
 django/db/models/manager.py |   11 -----------
 2 files changed, 7 insertions(+), 20 deletions(-)

diff --git a/django/db/models/base.py b/django/db/models/base.py
index 181d845..a881f56 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -15,6 +15,7 @@ from django.db.models.options import Options, AdminOptions
 from django.db import connection, transaction
 from django.db.models import signals
 from django.db.models.loading import register_models, get_model
+from django.db.models.manager import Manager
 from django.dispatch import dispatcher
 from django.utils.datastructures import SortedDict
 from django.utils.functional import curry
@@ -65,12 +66,6 @@ class ModelBase(type):
                 if not hasattr(meta, 'get_latest_by'):
                     new_class._meta.get_latest_by = base_meta.get_latest_by
 
-        old_default_mgr = None
-        if getattr(new_class, '_default_manager', None):
-            # We have a parent who set the default manager.
-            if new_class._default_manager.model._meta.abstract:
-                old_default_mgr = new_class._default_manager
-            new_class._default_manager = None
         if getattr(new_class._meta, 'app_label', None) is None:
             # Figure out the app_label by looking one level up.
             # For 'django.contrib.sites.models', this would be 'sites'.
@@ -106,7 +101,7 @@ class ModelBase(type):
                     new_class.add_to_class(attr_name, field)
                 new_class._meta.parents[base] = field
             else:
-                # The abstract base class case.
+                # Copy fields from the abstract base class.
                 names = set([f.name for f in new_class._meta.local_fields + new_class._meta.many_to_many])
                 for field in base._meta.local_fields + base._meta.local_many_to_many:
                     if field.name in names:
@@ -114,6 +109,11 @@ class ModelBase(type):
                                 % (field.name, name, base.__name__))
                     new_class.add_to_class(field.name, copy.deepcopy(field))
 
+                # Copy managers from the abstract base class.
+                for attr, value in ((attr, getattr(base, attr)) for attr in dir(base)):
+                    if value == getattr(new_class, attr) and isinstance(value, Manager):
+                        new_class.add_to_class(attr, copy.copy(value))
+
         if abstract:
             # Abstract base models can't be instantiated and don't appear in
             # the list of models for an app. We do the final setup for them a
@@ -122,8 +122,6 @@ class ModelBase(type):
             new_class.Meta = attr_meta
             return new_class
 
-        if old_default_mgr and not new_class._default_manager:
-            new_class._default_manager = old_default_mgr._copy_to_model(new_class)
         new_class._prepare()
         register_models(new_class._meta.app_label, new_class)
 
diff --git a/django/db/models/manager.py b/django/db/models/manager.py
index 3a9da34..697c0f9 100644
--- a/django/db/models/manager.py
+++ b/django/db/models/manager.py
@@ -36,17 +36,6 @@ class Manager(object):
         if not getattr(model, '_default_manager', None) or self.creation_counter < model._default_manager.creation_counter:
             model._default_manager = self
 
-    def _copy_to_model(self, model):
-        """
-        Makes a copy of the manager and assigns it to 'model', which should be
-        a child of the existing model (used when inheriting a manager from an
-        abstract base class).
-        """
-        assert issubclass(model, self.model)
-        mgr = copy.copy(self)
-        mgr.model = model
-        return mgr
-
     #######################
     # PROXIES TO QUERYSET #
     #######################
-- 
1.5.3.7

