From af4843e54b96b0d9334f76d48d7a710dc7946166 Mon Sep 17 00:00:00 2001 From: Chad Shryock Date: Wed, 10 Sep 2014 23:13:51 -0400 Subject: [PATCH 1/9] Cleared up the Django 1.8 Warning messages. --- polymorphic/admin.py | 9 ++++++++- polymorphic/manager.py | 6 +++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/polymorphic/admin.py b/polymorphic/admin.py index 4dc0b4e..52e71cd 100644 --- a/polymorphic/admin.py +++ b/polymorphic/admin.py @@ -231,8 +231,15 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin): def queryset(self, request): + self.get_queryset(request) + + + def get_queryset(self, request): # optimize the list display. - qs = super(PolymorphicParentModelAdmin, self).queryset(request) + try: + qs = super(PolymorphicParentModelAdmin, self).get_queryset(request) + except: + qs = super(PolymorphicParentModelAdmin, self).queryset(request) if not self.polymorphic_list: qs = qs.non_polymorphic() return qs diff --git a/polymorphic/manager.py b/polymorphic/manager.py index 3e0e6d8..47d0c27 100644 --- a/polymorphic/manager.py +++ b/polymorphic/manager.py @@ -30,9 +30,13 @@ class PolymorphicManager(models.Manager): super(PolymorphicManager, self).__init__(*args, **kwrags) - def get_query_set(self): + def get_queryset(self): return self.queryset_class(self.model, using=self._db) + def get_query_set(self): + return self.get_queryset() + + # Proxy all unknown method calls to the queryset, so that its members are # directly accessible as PolymorphicModel.objects.* # The advantage of this method is that not yet known member functions of derived querysets will be proxied as well. From e84a2072fc8e0fee255c3b87faa8cb7c1bbf1ec6 Mon Sep 17 00:00:00 2001 From: Chad Shryock Date: Tue, 16 Sep 2014 22:10:48 -0400 Subject: [PATCH 2/9] Upgraded script to be Django 1.7 friendly --- runtests.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/runtests.py b/runtests.py index bd4a86b..206fd19 100755 --- a/runtests.py +++ b/runtests.py @@ -18,6 +18,10 @@ sys.stderr.write('Using Django version {0} from {1}\n'.format( # Detect location and available modules module_root = dirname(realpath(__file__)) +test_runner = 'django.test.runner.DiscoverRunner' +if django.VERSION[:2] < (1, 6): + test_runner = 'django.test.simple.DjangoTestSuiteRunner' + # Inline settings file settings.configure( DEBUG = False, # will be False anyway by DjangoTestRunner. @@ -43,9 +47,15 @@ settings.configure( 'polymorphic', ), SITE_ID = 3, + TEST_RUNNER = test_runner, + MIDDLEWARE_CLASSES = (), ) -call_command('syncdb', verbosity=1, interactive=False) +if django.VERSION[:2] > (1, 6): + django.setup() + call_command('migrate', verbosity=1, interactive=False) +else: + call_command('syncdb', verbosity=1, interactive=False) # ---- app start From 734752c2e761e1f7128c813058993f43ec73b125 Mon Sep 17 00:00:00 2001 From: Chad Shryock Date: Tue, 16 Sep 2014 22:11:13 -0400 Subject: [PATCH 3/9] Django 1.7 upgrades --- polymorphic/admin.py | 6 +++- polymorphic/tests.py | 74 +++++++++++++++++++++++++++++++++----------- 2 files changed, 61 insertions(+), 19 deletions(-) diff --git a/polymorphic/admin.py b/polymorphic/admin.py index 52e71cd..0c0d97d 100644 --- a/polymorphic/admin.py +++ b/polymorphic/admin.py @@ -19,6 +19,7 @@ from django.utils.http import urlencode from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ + try: # Django 1.6 implements this from django.contrib.admin.templatetags.admin_urls import add_preserved_filters @@ -280,7 +281,10 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin): Expose the custom URLs for the subclasses and the URL resolver. """ urls = super(PolymorphicParentModelAdmin, self).get_urls() - info = self.model._meta.app_label, self.model._meta.module_name + try: + info = self.model._meta.app_label, self.model._meta.model_name + except: + info = self.model._meta.app_label, self.model._meta.module_name # Patch the change URL so it's not a big catch-all; allowing all custom URLs to be added to the end. # The url needs to be recreated, patching url.regex is not an option Django 1.4's LocaleRegexProvider changed it. diff --git a/polymorphic/tests.py b/polymorphic/tests.py index 47d3c90..4794db3 100644 --- a/polymorphic/tests.py +++ b/polymorphic/tests.py @@ -5,6 +5,7 @@ from __future__ import print_function import uuid import re +import django from django.db.models.query import QuerySet from django.test import TestCase @@ -66,21 +67,45 @@ class ModelX(Base): class ModelY(Base): field_y = models.CharField(max_length=10) -class Enhance_Plain(models.Model): - field_p = models.CharField(max_length=10) -class Enhance_Base(ShowFieldTypeAndContent, PolymorphicModel): - field_b = models.CharField(max_length=10) -class Enhance_Inherit(Enhance_Base, Enhance_Plain): - field_i = models.CharField(max_length=10) +if django.VERSION[:2] > (1, 6): + class Enhance_Plain(models.Model): + field_p = models.CharField(max_length=10) + class Enhance_Base(ShowFieldTypeAndContent, PolymorphicModel): + base_id = models.AutoField(primary_key=True) + field_b = models.CharField(max_length=10) + class Enhance_Inherit(Enhance_Base, Enhance_Plain): + field_i = models.CharField(max_length=10) -class DiamondBase(models.Model): - field_b = models.CharField(max_length=10) -class DiamondX(DiamondBase): - field_x = models.CharField(max_length=10) -class DiamondY(DiamondBase): - field_y = models.CharField(max_length=10) -class DiamondXY(DiamondX, DiamondY): - pass + class DiamondBase(models.Model): + field_b = models.CharField(max_length=10) + class DiamondX(DiamondBase): + x_id = models.AutoField(primary_key=True) + field_x = models.CharField(max_length=10) + class DiamondY(DiamondBase): + y_id = models.AutoField(primary_key=True) + field_y = models.CharField(max_length=10) + class DiamondXY(DiamondBase): + xy_id = models.AutoField(primary_key=True) + field_x = models.CharField(max_length=10) + field_y = models.CharField(max_length=10) +else: + class Enhance_Plain(models.Model): + field_p = models.CharField(max_length=10) + class Enhance_Base(ShowFieldTypeAndContent, PolymorphicModel): + field_b = models.CharField(max_length=10) + class Enhance_Inherit(Enhance_Base, Enhance_Plain): + field_i = models.CharField(max_length=10) + + class DiamondBase(models.Model): + field_b = models.CharField(max_length=10) + class DiamondX(DiamondBase): + x_id = models.AutoField(primary_key=True) + field_x = models.CharField(max_length=10) + class DiamondY(DiamondBase): + y_id = models.AutoField(primary_key=True) + field_y = models.CharField(max_length=10) + class DiamondXY(DiamondX, DiamondY): + xy_id = models.AutoField(primary_key=True) class RelationBase(ShowFieldTypeAndContent, PolymorphicModel): field_base = models.CharField(max_length=10) @@ -110,6 +135,9 @@ class MyManagerQuerySet(PolymorphicQuerySet): class MyManager(PolymorphicManager): queryset_class = MyManagerQuerySet + def get_queryset(self): + return super(MyManager, self).get_queryset().order_by('-field1') + def get_query_set(self): return super(MyManager, self).get_query_set().order_by('-field1') @@ -143,9 +171,12 @@ class PlainMyManager(models.Manager): def my_queryset_foo(self): return self.get_query_set().my_queryset_foo() - def get_query_set(self): + def get_queryset(self): return PlainMyManagerQuerySet(self.model, using=self._db) + def get_query_set(self): + return self.get_queryset() + class PlainParentModelWithManager(models.Model): pass @@ -254,6 +285,10 @@ class PolymorphicTests(TestCase): The test suite """ def test_diamond_inheritance(self): + if django.VERSION[:2] > (1, 6): + print('') + print("# Django 1.7 doesn't allow multiple inheritance when two id fields exist. https://docs.djangoproject.com/en/dev/topics/db/models/#multiple-inheritance") + # Django diamond problem # https://code.djangoproject.com/ticket/10808 o1 = DiamondXY.objects.create(field_b='b', field_x='x', field_y='y') @@ -616,11 +651,14 @@ class PolymorphicTests(TestCase): Enhance_Inherit.objects.create(field_b='b-inherit', field_p='p', field_i='i') qs = Enhance_Base.objects.all() - self.assertEqual(repr(qs[0]), '') - self.assertEqual(repr(qs[1]), '') + if django.VERSION[:2] > (1, 6): + self.assertEqual(repr(qs[0]), '') + self.assertEqual(repr(qs[1]), '') + else: + self.assertEqual(repr(qs[0]), '') + self.assertEqual(repr(qs[1]), '') self.assertEqual(len(qs), 2) - def test_relation_base(self): # ForeignKey, ManyToManyField obase = RelationBase.objects.create(field_base='base') From 4dff05405bc59912301207d98c6fd65031c84a04 Mon Sep 17 00:00:00 2001 From: Chad Shryock Date: Tue, 16 Sep 2014 22:17:06 -0400 Subject: [PATCH 4/9] Updated the docs to be Django 1.7 friendly --- docs/managers.rst | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/managers.rst b/docs/managers.rst index 8ab35b0..fcda5ee 100644 --- a/docs/managers.rst +++ b/docs/managers.rst @@ -13,12 +13,12 @@ explicitly add the default manager first, and then your custom manager:: from polymorphic import PolymorphicModel, PolymorphicManager class TimeOrderedManager(PolymorphicManager): - def get_query_set(self): - qs = super(TimeOrderedManager,self).get_query_set() + def get_queryset(self): + qs = super(TimeOrderedManager,self).get_queryset() return qs.order_by('-start_date') # order the queryset def most_recent(self): - qs = self.get_query_set() # get my ordered queryset + qs = self.get_queryset() # get my ordered queryset return qs[:10] # limit => get ten most recent entries class Project(PolymorphicModel): @@ -31,6 +31,8 @@ Django as automatic manager for several purposes, including accessing related objects. It must not filter objects and it's safest to use the plain ``PolymorphicManager`` here. + Note that get_query_set is deprecated in Django 1.8 and creates warnings in Django 1.7. + Manager Inheritance ------------------- @@ -42,12 +44,12 @@ expected in models inheriting from this base model:: from polymorphic import PolymorphicModel, PolymorphicManager class TimeOrderedManager(PolymorphicManager): - def get_query_set(self): - qs = super(TimeOrderedManager,self).get_query_set() + def get_queryset(self): + qs = super(TimeOrderedManager,self).get_queryset() return qs.order_by('-start_date') # order the queryset def most_recent(self): - qs = self.get_query_set() # get my ordered queryset + qs = self.get_queryset() # get my ordered queryset return qs[:10] # limit => get ten most recent entries class Project(PolymorphicModel): @@ -65,6 +67,8 @@ regarding their start time and ``ArtProject.objects_ordered.most_recent()`` will return the ten most recent art projects. . + Note that get_query_set is deprecated in Django 1.8 and creates warnings in Django 1.7. + Using a Custom Queryset Class ----------------------------- From 35debe37985b5c84099fe055214cf4b1b52bcd64 Mon Sep 17 00:00:00 2001 From: Chad Shryock Date: Tue, 16 Sep 2014 22:30:27 -0400 Subject: [PATCH 5/9] Test Django 1.7! --- tox.ini | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tox.ini b/tox.ini index ebcd5ee..a642ae1 100644 --- a/tox.ini +++ b/tox.ini @@ -7,12 +7,15 @@ envlist= py27-django14, py27-django15, py27-django16, + py27-django17, py32-django15, py32-django16, + py32-django17, py33-django15, py33-django16, + py33-django17, py33-django-dev, docs, @@ -53,6 +56,11 @@ basepython=python2.7 deps= django==1.6 +[testenv:py27-django17] +basepython=python2.7 +deps= + django==1.7 + [testenv:py32-django15] basepython=python3.2 deps= @@ -63,6 +71,11 @@ basepython=python3.2 deps= django==1.6 +[testenv:py32-django17] +basepython=python3.2 +deps= + django==1.7 + [testenv:py33-django15] basepython=python3.3 deps= @@ -73,6 +86,11 @@ basepython=python3.3 deps= django==1.6 +[testenv:py33-django17] +basepython=python3.3 +deps= + django==1.7 + [testenv:py33-django-dev] basepython=python3.3 deps= From d0fe45242bb5a8bb4d5f0309f3866e62f6e31f4d Mon Sep 17 00:00:00 2001 From: Chad Shryock Date: Tue, 16 Sep 2014 22:35:12 -0400 Subject: [PATCH 6/9] Okay. Now I think Travis will run D1.7 tests! --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 17b28a9..0ff17d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ env: - DJANGO=django==1.4.5 - DJANGO=django==1.5 - DJANGO=django==1.6 + - DJANGO=django==1.7 #- DJANGO=https://github.com/django/django/archive/stable/1.6.x.zip matrix: From 112808d057c55e944e562e2d6fa871aad5b2a030 Mon Sep 17 00:00:00 2001 From: Chad Shryock Date: Tue, 16 Sep 2014 22:38:56 -0400 Subject: [PATCH 7/9] Django 1.7 no run on Python 2.6. Exclude tests. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0ff17d7..78118db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,8 @@ matrix: env: DJANGO=django==1.4.5 - python: "3.2" env: DJANGO=django==1.4.5 + - python: "2.6" + env: DJANGO=django==1.7 install: - pip install $DJANGO coverage==3.6 From b9654b7138868c4559ce2fe641b7c5bdb668c972 Mon Sep 17 00:00:00 2001 From: Chad Shryock Date: Wed, 17 Sep 2014 08:26:28 -0400 Subject: [PATCH 8/9] Missing return. --- polymorphic/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polymorphic/admin.py b/polymorphic/admin.py index 0c0d97d..5b325ba 100644 --- a/polymorphic/admin.py +++ b/polymorphic/admin.py @@ -232,7 +232,7 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin): def queryset(self, request): - self.get_queryset(request) + return self.get_queryset(request) def get_queryset(self, request): From cc53b3003e1665725e097f2c80e8e21729d37669 Mon Sep 17 00:00:00 2001 From: Chad Shryock Date: Wed, 17 Sep 2014 08:30:12 -0400 Subject: [PATCH 9/9] Remove exception. --- polymorphic/admin.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/polymorphic/admin.py b/polymorphic/admin.py index 5b325ba..985a3d9 100644 --- a/polymorphic/admin.py +++ b/polymorphic/admin.py @@ -237,10 +237,12 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin): def get_queryset(self, request): # optimize the list display. - try: - qs = super(PolymorphicParentModelAdmin, self).get_queryset(request) - except: - qs = super(PolymorphicParentModelAdmin, self).queryset(request) + parent_self = super(PolymorphicParentModelAdmin, self) + if hasattr(parent_self, 'get_queryset'): + qs = parent_self.get_queryset(request) + else: + qs = parent_self.queryset(request) + if not self.polymorphic_list: qs = qs.non_polymorphic() return qs @@ -281,10 +283,8 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin): Expose the custom URLs for the subclasses and the URL resolver. """ urls = super(PolymorphicParentModelAdmin, self).get_urls() - try: - info = self.model._meta.app_label, self.model._meta.model_name - except: - info = self.model._meta.app_label, self.model._meta.module_name + meta = self.model._meta + info = meta.app_label, getattr(meta, 'model_name', meta.module_name) # Patch the change URL so it's not a big catch-all; allowing all custom URLs to be added to the end. # The url needs to be recreated, patching url.regex is not an option Django 1.4's LocaleRegexProvider changed it.