From 0fea8a4d92638e39950225e2fb41c246d22441e1 Mon Sep 17 00:00:00 2001 From: Tadas Dailyda Date: Tue, 25 Jul 2017 14:02:15 +0300 Subject: [PATCH 1/2] tests for abstract/swappable model initialization --- polymorphic/tests/__init__.py | 17 +++++++++++++++++ runtests.py | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/polymorphic/tests/__init__.py b/polymorphic/tests/__init__.py index b16a917..32e1838 100644 --- a/polymorphic/tests/__init__.py +++ b/polymorphic/tests/__init__.py @@ -400,6 +400,23 @@ class DateModel(PolymorphicModel): date = models.DateTimeField() +# Define abstract and swappable (being swapped for SwappedModel) models +# To test manager validation (should be skipped for such models) +class AbstractModel(PolymorphicModel): + class Meta: + abstract = True + + +class SwappableModel(AbstractModel): + class Meta: + swappable = 'POLYMORPHIC_TEST_SWAPPABLE' + + +class SwappedModel(AbstractModel): + pass + + + # Import tests from .test_admin import * from .test_orm import * diff --git a/runtests.py b/runtests.py index 0e76c03..f0a1609 100755 --- a/runtests.py +++ b/runtests.py @@ -57,7 +57,8 @@ if not settings.configured: ), }, }, - ] + ], + POLYMORPHIC_TEST_SWAPPABLE='polymorphic.swappedmodel', ) From 02330a5ec835b118d67aacf071cc2deef1250829 Mon Sep 17 00:00:00 2001 From: Tadas Dailyda Date: Tue, 25 Jul 2017 14:11:37 +0300 Subject: [PATCH 2/2] skip manager validation on swapped models --- polymorphic/base.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/polymorphic/base.py b/polymorphic/base.py index b6a5a74..89fa482 100644 --- a/polymorphic/base.py +++ b/polymorphic/base.py @@ -94,11 +94,12 @@ class PolymorphicModelBase(ModelBase): new_class._default_manager = user_manager._copy_to_model(new_class) new_class._default_manager._inherited = False # the default mgr was defined by the user, not inherited - # validate resulting default manager - if django.VERSION >= (1, 10) and not new_class._meta.abstract: - self.validate_model_manager(new_class.objects, model_name, 'objects') - else: - self.validate_model_manager(new_class._default_manager, model_name, '_default_manager') + # validate resulting default manager (only on non-abstract and non-swapped models) + if not new_class._meta.abstract and not new_class._meta.swapped: + if django.VERSION >= (1, 10): + self.validate_model_manager(new_class.objects, model_name, 'objects') + else: + self.validate_model_manager(new_class._default_manager, model_name, '_default_manager') # for __init__ function of this class (monkeypatching inheritance accessors) new_class.polymorphic_super_sub_accessors_replaced = False