From 74389bb23dcf7459322ebc0341d494527fdaaae2 Mon Sep 17 00:00:00 2001 From: floppya Date: Wed, 20 Mar 2013 17:38:03 -0600 Subject: [PATCH] Update for proxy models and Django 1.5 Only monkeypatch when using Django < 1.5 Updated test --- polymorphic/__init__.py | 50 ++++++++++++++++++++--------------------- polymorphic/tests.py | 22 ++---------------- 2 files changed, 26 insertions(+), 46 deletions(-) diff --git a/polymorphic/__init__.py b/polymorphic/__init__.py index 83ced79..35a33e1 100644 --- a/polymorphic/__init__.py +++ b/polymorphic/__init__.py @@ -6,6 +6,7 @@ Copyright: This code and affiliated files are (C) by Bert Constantin and individual contributors. Please see LICENSE and AUTHORS for more information. """ +import django from polymorphic_model import PolymorphicModel from manager import PolymorphicManager from query import PolymorphicQuerySet @@ -25,37 +26,34 @@ def get_version(): version += ' %s' % VERSION[3] return version -from django.contrib.contenttypes.models import ContentTypeManager -from django.utils.encoding import smart_unicode - -# Monkey-patch Django to allow ContentTypes for proxy models. This is compatible with an -# upcoming change in Django 1.5 and should be removed when we upgrade. There is a test -# in MonkeyPatchTests that checks for this. -# https://code.djangoproject.com/ticket/18399 - -def get_for_model(self, model, for_concrete_model=True): +# Monkey-patch Django < 1.5 to allow ContentTypes for proxy models. +if django.VERSION[:2] < (1, 5): + from django.contrib.contenttypes.models import ContentTypeManager from django.utils.encoding import smart_unicode - if for_concrete_model: - model = model._meta.concrete_model - elif model._deferred: - model = model._meta.proxy_for_model + def get_for_model(self, model, for_concrete_model=True): + from django.utils.encoding import smart_unicode - opts = model._meta + if for_concrete_model: + model = model._meta.concrete_model + elif model._deferred: + model = model._meta.proxy_for_model - try: - ct = self._get_from_cache(opts) - except KeyError: - ct, created = self.get_or_create( - app_label = opts.app_label, - model = opts.object_name.lower(), - defaults = {'name': smart_unicode(opts.verbose_name_raw)}, - ) - self._add_to_cache(self.db, ct) + opts = model._meta - return ct + try: + ct = self._get_from_cache(opts) + except KeyError: + ct, created = self.get_or_create( + app_label = opts.app_label, + model = opts.object_name.lower(), + defaults = {'name': smart_unicode(opts.verbose_name_raw)}, + ) + self._add_to_cache(self.db, ct) -ContentTypeManager.get_for_model__original = ContentTypeManager.get_for_model -ContentTypeManager.get_for_model = get_for_model + return ct + + ContentTypeManager.get_for_model__original = ContentTypeManager.get_for_model + ContentTypeManager.get_for_model = get_for_model diff --git a/polymorphic/tests.py b/polymorphic/tests.py index dac0825..da727a2 100644 --- a/polymorphic/tests.py +++ b/polymorphic/tests.py @@ -750,9 +750,8 @@ class RegressionTests(TestCase): self.assertQuerysetEqual(Bottom.objects.all(), [repr(r) for r in expected_queryset]) -class MonkeyPatchTests(TestCase): - - def test_content_types_for_proxy_models_patch(self): +class ProxiedModelTests(TestCase): + def test_content_types_for_proxy_models(self): from django.db.models import Model from django.contrib.contenttypes.models import ContentType @@ -766,20 +765,3 @@ class MonkeyPatchTests(TestCase): ct = ContentType.objects.get_for_model(Proxy, for_concrete_model=False) self.assertEqual(Proxy, ct.model_class()) - def test_content_types_for_proxy_models_patch_still_required(self): - """ - If this test fails then our monkey patch of ContentTypeManager.get_for_model - is no longer required and should be removed - """ - from django.db.models import Model - from django.contrib.contenttypes.models import ContentType - - class MyModel(Model): - pass - - self.assertRaisesMessage( - TypeError, - "get_for_model() got an unexpected keyword argument 'for_concrete_model'", - ContentType.objects.get_for_model__original, - MyModel, for_concrete_model=False - )