[Python-modules-commits] [python-django-mptt] 05/06: merge patched into master

Thomas Goirand zigo at moszumanska.debian.org
Fri Aug 5 09:20:44 UTC 2016


This is an automated email from the git hooks/post-receive script.

zigo pushed a commit to branch master
in repository python-django-mptt.

commit b460d48315aeee2011137a195aa19852da28ab80
Merge: ccb566a 53f25a8
Author: Thomas Goirand <zigo at debian.org>
Date:   Fri Aug 5 09:16:38 2016 +0000

    merge patched into master

 debian/.git-dpm                                    |   4 +-
 ...-Prepare-the-manager-using-code-for-Djang.patch | 388 +++++++++++++++++++++
 debian/patches/series                              |   1 +
 mptt/admin.py                                      |   4 +-
 mptt/forms.py                                      |   2 +-
 mptt/managers.py                                   |  18 +-
 mptt/models.py                                     |  52 +--
 mptt/querysets.py                                  |   4 +-
 mptt/templatetags/mptt_tags.py                     |   2 +-
 mptt/utils.py                                      |   2 +-
 tests/myapp/doctests.txt                           |  20 +-
 tests/myapp/models.py                              |   3 -
 tests/myapp/tests.py                               |  25 +-
 tests/myapp/urls.py                                |   4 +-
 14 files changed, 431 insertions(+), 98 deletions(-)

diff --cc debian/.git-dpm
index 6f63ae7,0000000..e5f8023
mode 100644,000000..100644
--- a/debian/.git-dpm
+++ b/debian/.git-dpm
@@@ -1,11 -1,0 +1,11 @@@
 +# see git-dpm(1) from git-dpm package
- 74b1458b16004b3b50cb640c51af814de7282ba7
- 74b1458b16004b3b50cb640c51af814de7282ba7
++53f25a8b35fbec95b19adcb00d083d2269f9dcec
++53f25a8b35fbec95b19adcb00d083d2269f9dcec
 +74b1458b16004b3b50cb640c51af814de7282ba7
 +74b1458b16004b3b50cb640c51af814de7282ba7
 +python-django-mptt_0.8.5.orig.tar.gz
 +0e206684f5a0fdd5eeccd2e7da931370a3502024
 +119755
 +debianTag="debian/%e%v"
 +patchedTag="patched/%e%v"
 +upstreamTag="upstream/%e%u"
diff --cc debian/patches/0001-django-1.10-Prepare-the-manager-using-code-for-Djang.patch
index 0000000,0000000..e6fb3a2
new file mode 100644
--- /dev/null
+++ b/debian/patches/0001-django-1.10-Prepare-the-manager-using-code-for-Djang.patch
@@@ -1,0 -1,0 +1,388 @@@
++From 53f25a8b35fbec95b19adcb00d083d2269f9dcec Mon Sep 17 00:00:00 2001
++From: Thomas Goirand <zigo at debian.org>
++Date: Fri, 5 Aug 2016 09:16:07 +0000
++Subject: django-1.10 Prepare the manager-using code for Django 1.10
++
++This change simply requires the programmer to ensure that
++_default_manager returns a tree manager. Custom manager classes
++must extend TreeManager.
++---
++ mptt/admin.py                  |  4 ++--
++ mptt/forms.py                  |  2 +-
++ mptt/managers.py               | 18 +++++----------
++ mptt/models.py                 | 52 ++++++++----------------------------------
++ mptt/querysets.py              |  4 ++--
++ mptt/templatetags/mptt_tags.py |  2 +-
++ mptt/utils.py                  |  2 +-
++ tests/myapp/doctests.txt       | 20 ++++++++--------
++ tests/myapp/models.py          |  3 ---
++ tests/myapp/tests.py           | 25 ++++----------------
++ tests/myapp/urls.py            |  4 ++--
++ 11 files changed, 40 insertions(+), 96 deletions(-)
++
++diff --git a/mptt/admin.py b/mptt/admin.py
++index 730a146..aa4ccb3 100644
++--- a/mptt/admin.py
+++++ b/mptt/admin.py
++@@ -68,7 +68,7 @@ class MPTTModelAdmin(ModelAdmin):
++         # If this is True, the confirmation page has been displayed
++         if request.POST.get('post'):
++             n = 0
++-            with queryset.model._tree_manager.delay_mptt_updates():
+++            with queryset.model._default_manager.delay_mptt_updates():
++                 for obj in queryset:
++                     if self.has_delete_permission(request, obj):
++                         obj.delete()
++@@ -218,7 +218,7 @@ class DraggableMPTTAdmin(MPTTModelAdmin):
++             return http.HttpResponse('FAIL, no permission.')
++ 
++         try:
++-            self.model._tree_manager.move_node(cut_item, pasted_on, position)
+++            self.model._default_manager.move_node(cut_item, pasted_on, position)
++         except InvalidMove as e:
++             self.message_user(request, '%s' % e)
++             return http.HttpResponse('FAIL, invalid move.')
++diff --git a/mptt/forms.py b/mptt/forms.py
++index ecbf421..e294aee 100644
++--- a/mptt/forms.py
+++++ b/mptt/forms.py
++@@ -121,7 +121,7 @@ class MoveNodeForm(forms.Form):
++         super(MoveNodeForm, self).__init__(*args, **kwargs)
++         opts = node._mptt_meta
++         if valid_targets is None:
++-            valid_targets = node._tree_manager.exclude(**{
+++            valid_targets = node.__class__._default_manager.exclude(**{
++                 opts.tree_id_attr: getattr(node, opts.tree_id_attr),
++                 opts.left_attr + '__gte': getattr(node, opts.left_attr),
++                 opts.right_attr + '__lte': getattr(node, opts.right_attr),
++diff --git a/mptt/managers.py b/mptt/managers.py
++index a216429..e46df06 100644
++--- a/mptt/managers.py
+++++ b/mptt/managers.py
++@@ -66,6 +66,7 @@ def delegate_manager(method):
++     """
++     @functools.wraps(method)
++     def wrapped(self, *args, **kwargs):
+++        return method(self, *args, **kwargs)  # FIXME what should this really do?
++         if self._base_manager:
++             return getattr(self._base_manager, method.__name__)(*args, **kwargs)
++         return method(self, *args, **kwargs)
++@@ -78,16 +79,9 @@ class TreeManager(models.Manager.from_queryset(TreeQuerySet)):
++     A manager for working with trees of objects.
++     """
++ 
++-    def contribute_to_class(self, model, name):
++-        super(TreeManager, self).contribute_to_class(model, name)
++-
++-        if not model._meta.abstract:
++-            self.tree_model = _get_tree_model(model)
++-
++-            self._base_manager = None
++-            if self.tree_model is not model:
++-                # _base_manager is the treemanager on tree_model
++-                self._base_manager = self.tree_model._tree_manager
+++    @property
+++    def tree_model(self):
+++        return _get_tree_model(self.model)
++ 
++     def get_queryset(self, *args, **kwargs):
++         """
++@@ -482,7 +476,7 @@ class TreeManager(models.Manager.from_queryset(TreeQuerySet)):
++                     'rel_table': qn(rel_model._meta.db_table),
++                     'mptt_fk': qn(rel_model._meta.get_field(rel_field).column),
++                     'mptt_table': qn(self.tree_model._meta.db_table),
++-                    'mptt_rel_to': qn(mptt_field.rel.field_name),
+++                    'mptt_rel_to': qn(mptt_field.remote_field.field_name),
++                     'tree_id': qn(meta.get_field(self.tree_id_attr).column),
++                     'left': qn(meta.get_field(self.left_attr).column),
++                     'right': qn(meta.get_field(self.right_attr).column),
++@@ -492,7 +486,7 @@ class TreeManager(models.Manager.from_queryset(TreeQuerySet)):
++                     'rel_table': qn(rel_model._meta.db_table),
++                     'mptt_fk': qn(rel_model._meta.get_field(rel_field).column),
++                     'mptt_table': qn(self.tree_model._meta.db_table),
++-                    'mptt_rel_to': qn(mptt_field.rel.field_name),
+++                    'mptt_rel_to': qn(mptt_field.remote_field.field_name),
++                 }
++         return queryset.extra(select={count_attr: subquery})
++ 
++diff --git a/mptt/models.py b/mptt/models.py
++index 1442124..dcf4acd 100644
++--- a/mptt/models.py
+++++ b/mptt/models.py
++@@ -212,7 +212,7 @@ class MPTTOptions(object):
++                 # Fall back on tree id ordering if multiple root nodes have
++                 # the same values.
++                 order_by.append(opts.tree_id_attr)
++-            queryset = node.__class__._tree_manager.db_manager(node._state.db).filter(filters).order_by(*order_by)
+++            queryset = node._tree_manager.db_manager(node._state.db).filter(filters).order_by(*order_by)
++             if node.pk:
++                 queryset = queryset.exclude(pk=node.pk)
++             try:
++@@ -271,7 +271,7 @@ class MPTTModelBase(ModelBase):
++             bases = [base for base in cls.mro() if issubclass(base, MPTTModel)]
++         for base in bases:
++             if (not (base._meta.abstract or base._meta.proxy) and
++-                    base._tree_manager.tree_model is base):
+++                    getattr(base._default_manager, 'tree_model', None) is base):
++                 cls._mptt_tracking_base = base
++                 break
++         if cls is cls._mptt_tracking_base:
++@@ -294,8 +294,6 @@ class MPTTModelBase(ModelBase):
++         if not hasattr(cls, '_mptt_meta'):
++             cls._mptt_meta = MPTTOptions(**kwargs)
++ 
++-        abstract = getattr(cls._meta, 'abstract', False)
++-
++         try:
++             MPTTModel
++         except NameError:
++@@ -333,40 +331,6 @@ class MPTTModelBase(ModelBase):
++                         field = models.PositiveIntegerField(db_index=True, editable=False)
++                         field.contribute_to_class(cls, field_name)
++ 
++-            # Add a tree manager, if there isn't one already
++-            if not abstract:
++-                manager = getattr(cls, 'objects', None)
++-                if manager is None:
++-                    manager = cls._default_manager._copy_to_model(cls)
++-                    manager.contribute_to_class(cls, 'objects')
++-                elif manager.model != cls:
++-                    # manager was inherited
++-                    manager = manager._copy_to_model(cls)
++-                    manager.contribute_to_class(cls, 'objects')
++-
++-                # make sure we have a tree manager somewhere
++-                tree_manager = None
++-                if hasattr(cls._meta, 'concrete_managers'):  # Django < 1.10
++-                    cls_managers = cls._meta.concrete_managers + cls._meta.abstract_managers
++-                    cls_managers = [r[2] for r in cls_managers]
++-                else:
++-                    cls_managers = cls._meta.managers
++-
++-                for cls_manager in cls_managers:
++-                    if isinstance(cls_manager, TreeManager):
++-                        # prefer any locally defined manager (i.e. keep going if not local)
++-                        if cls_manager.model is cls:
++-                            tree_manager = cls_manager
++-                            break
++-
++-                if tree_manager and tree_manager.model is not cls:
++-                    tree_manager = tree_manager._copy_to_model(cls)
++-                elif tree_manager is None:
++-                    tree_manager = TreeManager()
++-                tree_manager.contribute_to_class(cls, '_tree_manager')
++-
++-                # avoid using ManagerDescriptor, so instances can refer to self._tree_manager
++-                setattr(cls, '_tree_manager', tree_manager)
++         return cls
++ 
++ 
++@@ -386,7 +350,8 @@ class MPTTModel(six.with_metaclass(MPTTModelBase, models.Model)):
++     """
++     Base class for tree models.
++     """
++-    _default_manager = TreeManager()
+++
+++    objects = TreeManager()
++ 
++     class Meta:
++         abstract = True
++@@ -394,7 +359,10 @@ class MPTTModel(six.with_metaclass(MPTTModelBase, models.Model)):
++     def __init__(self, *args, **kwargs):
++         super(MPTTModel, self).__init__(*args, **kwargs)
++         self._mptt_meta.update_mptt_cached_fields(self)
++-        self._tree_manager = self._tree_manager.db_manager(self._state.db)
+++
+++    @property
+++    def _tree_manager(self):
+++        return _get_tree_model(self.__class__)._default_manager
++ 
++     def _mpttfield(self, fieldname):
++         translated_fieldname = getattr(self._mptt_meta, fieldname + '_attr')
++@@ -789,7 +757,7 @@ class MPTTModel(six.with_metaclass(MPTTModelBase, models.Model)):
++         if not self.pk or self._mpttfield('tree_id') is None:
++             return False
++         opts = self._meta
++-        if opts.pk.rel is None:
+++        if opts.pk.remote_field is None:
++             return True
++         else:
++             if not hasattr(self, '_mptt_saved'):
++@@ -1031,7 +999,7 @@ class MPTTModel(six.with_metaclass(MPTTModelBase, models.Model)):
++     def _mptt_refresh(self):
++         if not self.pk:
++             return
++-        manager = type(self)._tree_manager
+++        manager = type(self)._default_manager
++         opts = self._mptt_meta
++         values = manager.filter(pk=self.pk).values(
++             opts.left_attr,
++diff --git a/mptt/querysets.py b/mptt/querysets.py
++index dcad16a..cc72d4e 100644
++--- a/mptt/querysets.py
+++++ b/mptt/querysets.py
++@@ -8,14 +8,14 @@ class TreeQuerySet(models.query.QuerySet):
++         """
++         Alias to `mptt.managers.TreeManager.get_queryset_descendants`.
++         """
++-        return self.model._tree_manager.get_queryset_descendants(self, *args, **kwargs)
+++        return self.model._default_manager.get_queryset_descendants(self, *args, **kwargs)
++     get_descendants.queryset_only = True
++ 
++     def get_ancestors(self, *args, **kwargs):
++         """
++         Alias to `mptt.managers.TreeManager.get_queryset_ancestors`.
++         """
++-        return self.model._tree_manager.get_queryset_ancestors(self, *args, **kwargs)
+++        return self.model._default_manager.get_queryset_ancestors(self, *args, **kwargs)
++     get_ancestors.queryset_only = True
++ 
++     def get_cached_trees(self):
++diff --git a/mptt/templatetags/mptt_tags.py b/mptt/templatetags/mptt_tags.py
++index 8af257d..ff4f055 100644
++--- a/mptt/templatetags/mptt_tags.py
+++++ b/mptt/templatetags/mptt_tags.py
++@@ -30,7 +30,7 @@ class FullTreeForModelNode(template.Node):
++             raise template.TemplateSyntaxError(
++                 _('full_tree_for_model tag was given an invalid model: %s') % self.model
++             )
++-        context[self.context_var] = cls._tree_manager.all()
+++        context[self.context_var] = cls._default_manager.all()
++         return ''
++ 
++ 
++diff --git a/mptt/utils.py b/mptt/utils.py
++index 49e4779..c0ae9dc 100644
++--- a/mptt/utils.py
+++++ b/mptt/utils.py
++@@ -144,7 +144,7 @@ def drilldown_tree_for_node(node, rel_cls=None, rel_field=None, count_attr=None,
++        descendants, otherwise it will be for each child itself.
++     """
++     if rel_cls and rel_field and count_attr:
++-        children = node._tree_manager.add_related_count(
+++        children = node.__class__._default_manager.add_related_count(
++             node.get_children(), rel_cls, rel_field, count_attr, cumulative)
++     else:
++         children = node.get_children()
++diff --git a/tests/myapp/doctests.txt b/tests/myapp/doctests.txt
++index 607331e..97c7743 100644
++--- a/tests/myapp/doctests.txt
+++++ b/tests/myapp/doctests.txt
++@@ -208,23 +208,23 @@
++ 
++ # TreeManager Methods #########################################################
++ # check that tree manager is the explicitly defined tree manager for Person
++->>> Person._tree_manager == Person.objects
+++>>> Person._default_manager == Person.objects
++ True
++ 
++-# managers of non-abstract bases don't get inherited, so:
++->>> Student._tree_manager == Student.objects
++-False
+++# managers of non-abstract bases get inherited, so:
+++>>> Student._default_manager == Student.objects
+++True
++ 
++->>> Student._tree_manager == Person._tree_manager
++-False
+++>>> Student._default_manager == Person._default_manager
+++True
++ 
++->>> Student._tree_manager.model
+++>>> Student._default_manager.model
++ <class 'myapp.models.Student'>
++->>> Student._tree_manager.tree_model
+++>>> Student._default_manager.tree_model
++ <class 'myapp.models.Person'>
++->>> Person._tree_manager.model
+++>>> Person._default_manager.model
++ <class 'myapp.models.Person'>
++->>> Person._tree_manager.tree_model
+++>>> Person._default_manager.tree_model
++ <class 'myapp.models.Person'>
++ 
++ >>> Genre.objects.root_node(action.tree_id)
++diff --git a/tests/myapp/models.py b/tests/myapp/models.py
++index d86c1e5..756eeb7 100644
++--- a/tests/myapp/models.py
+++++ b/tests/myapp/models.py
++@@ -164,9 +164,6 @@ class Person(MPTTModel):
++     # just testing it's actually possible to override the tree manager
++     objects = CustomTreeManager()
++ 
++-    # This line is set because of https://github.com/django-mptt/django-mptt/issues/369
++-    _default_manager = objects
++-
++     def __str__(self):
++         return self.name
++ 
++diff --git a/tests/myapp/tests.py b/tests/myapp/tests.py
++index 0a2ad8a..49dd700 100644
++--- a/tests/myapp/tests.py
+++++ b/tests/myapp/tests.py
++@@ -9,7 +9,7 @@ import unittest
++ 
++ from django import forms
++ from django.contrib.auth.models import Group, User
++-from django.db.models import Q
+++from django.db.models import Q, Manager
++ from django.db.models.query_utils import DeferredAttribute
++ from django.apps import apps
++ from django.forms.models import modelform_factory
++@@ -1151,7 +1151,7 @@ class ManagerTests(TreeTestCase):
++         for model in apps.get_models():
++             if not issubclass(model, MPTTModel):
++                 continue
++-            tm = model._tree_manager
+++            tm = model._default_manager
++             if id(tm) in seen:
++                 self.fail(
++                     "Tree managers for %s and %s are the same manager"
++@@ -1163,27 +1163,12 @@ class ManagerTests(TreeTestCase):
++         for model in apps.get_models():
++             if not issubclass(model, MPTTModel):
++                 continue
++-            self.assertEqual(model._tree_manager.model, model)
++-
++-    def test_base_manager_infinite_recursion(self):
++-        # repeatedly calling _base_manager should eventually return None
++-        for model in apps.get_models():
++-            if not issubclass(model, MPTTModel):
++-                continue
++-            manager = model._tree_manager
++-            for i in range(20):
++-                manager = manager._base_manager
++-                if manager is None:
++-                    break
++-            else:
++-                self.fail("Detected infinite recursion in %s._tree_manager._base_manager" % model)
+++            self.assertEqual(model._default_manager.model, model)
++ 
++     def test_proxy_custom_manager(self):
++-        self.assertIsInstance(SingleProxyModel._tree_manager, CustomTreeManager)
++-        self.assertIsInstance(SingleProxyModel._tree_manager._base_manager, TreeManager)
++-
+++        self.assertIsInstance(SingleProxyModel._default_manager, CustomTreeManager)
++         self.assertIsInstance(SingleProxyModel.objects, CustomTreeManager)
++-        self.assertIsInstance(SingleProxyModel.objects._base_manager, TreeManager)
+++        self.assertIsInstance(SingleProxyModel._base_manager, Manager)
++ 
++     def test_get_queryset_descendants(self):
++         def get_desc_names(qs, include_self=False):
++diff --git a/tests/myapp/urls.py b/tests/myapp/urls.py
++index 5f2b4a4..a0d606d 100644
++--- a/tests/myapp/urls.py
+++++ b/tests/myapp/urls.py
++@@ -1,4 +1,4 @@
++-from django.conf.urls import include, url
+++from django.conf.urls import url
++ 
++ from django.contrib import admin
++ 
++@@ -7,5 +7,5 @@ admin.autodiscover()
++ 
++ 
++ urlpatterns = [
++-    url(r'^admin/', include(admin.site.urls)),
+++    url(r'^admin/', admin.site.urls),
++ ]
diff --cc debian/patches/series
index 0000000,0000000..99c10d1
new file mode 100644
--- /dev/null
+++ b/debian/patches/series
@@@ -1,0 -1,0 +1,1 @@@
++0001-django-1.10-Prepare-the-manager-using-code-for-Djang.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-django-mptt.git



More information about the Python-modules-commits mailing list