From a5e0238f492bd257eb68594e38953b9df9482111 Mon Sep 17 00:00:00 2001 From: Hugo Osvaldo Barrera Date: Fri, 14 Jul 2017 11:38:02 -0300 Subject: [PATCH 1/3] Run tests with postgres --- .travis.yml | 10 ++++++++++ runtests.py | 17 +++++++++-------- tox.ini | 4 ++++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index c5cef80..6dcf7f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,12 @@ env: - TOXENV=py35-djangomaster - TOXENV=py36-django111 - TOXENV=py36-djangomaster + # XXX: Use a matrix to build these? + - TOXENV=py36-django111-postgres DB=postgres + - TOXENV=py36-djangomaster-postgres DB=postgres + +services: + - postgres matrix: fast_finish: true @@ -40,6 +46,10 @@ cache: - $HOME/.cache/pip - $TRAVIS_BUILD_DIR/.tox +before_install: +- psql -c 'CREATE DATABASE default;' -U postgres || true +- psql -c 'CREATE DATABASE secondary;' -U postgres || true + install: - pip install --upgrade pip wheel setuptools - pip install codecov coverage tox diff --git a/runtests.py b/runtests.py index f0a1609..fd67216 100755 --- a/runtests.py +++ b/runtests.py @@ -2,6 +2,7 @@ import sys from os.path import abspath, dirname +import dj_database_url import django from django.conf import settings from django.core.management import execute_from_command_line @@ -18,14 +19,14 @@ if not settings.configured: settings.configure( DEBUG=False, DATABASES={ - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': ':memory:' - }, - 'secondary': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': ':memory:' - } + 'default': dj_database_url.config( + env='PRIMARY_DATABASE', + default='sqlite://:memory:', + ), + 'secondary': dj_database_url.config( + env='SECONDARY_DATABASE', + default='sqlite://:memory:', + ), }, TEST_RUNNER="django.test.runner.DiscoverRunner", INSTALLED_APPS=( diff --git a/tox.ini b/tox.ini index b6fc999..f8e95a8 100644 --- a/tox.ini +++ b/tox.ini @@ -9,11 +9,15 @@ envlist = [testenv] setenv = PYTHONWARNINGS = all + postgres: DEFAULT_DATABASE = postgres:///default + postgres: SECONDARY_DATABASE = postgres:///secondary deps = coverage + dj-database-url django110: Django >= 1.10, < 1.11 django111: Django >= 1.11, < 2.0 djangomaster: https://github.com/django/django/archive/master.tar.gz + postgres: psycopg2 commands = coverage run --source polymorphic runtests.py From a507345c6dd116d5e5ac07932154dc21c169bdf7 Mon Sep 17 00:00:00 2001 From: Hugo Osvaldo Barrera Date: Wed, 6 Sep 2017 18:51:29 -0300 Subject: [PATCH 2/3] Move test models into models.py and add migrations Tests were failing on postgres due to foreign keys pointing to missing tables. In order for these tables to be present, we need migrations which declare depending on `content_type`. --- polymorphic/tests/__init__.py | 416 -------- polymorphic/tests/migrations/0001_initial.py | 1008 ++++++++++++++++++ polymorphic/tests/migrations/__init__.py | 0 polymorphic/tests/models.py | 416 ++++++++ runtests.py | 1 + 5 files changed, 1425 insertions(+), 416 deletions(-) create mode 100644 polymorphic/tests/migrations/0001_initial.py create mode 100644 polymorphic/tests/migrations/__init__.py create mode 100644 polymorphic/tests/models.py diff --git a/polymorphic/tests/__init__.py b/polymorphic/tests/__init__.py index 758233e..e69de29 100644 --- a/polymorphic/tests/__init__.py +++ b/polymorphic/tests/__init__.py @@ -1,416 +0,0 @@ -# -*- coding: utf-8 -*- - -import uuid - -from django.contrib.contenttypes.models import ContentType -from django.db import models -from django.db.models.query import QuerySet - -from polymorphic.managers import PolymorphicManager -from polymorphic.models import PolymorphicModel -from polymorphic.query import PolymorphicQuerySet -from polymorphic.showfields import ShowFieldContent, ShowFieldType, ShowFieldTypeAndContent - - -class PlainA(models.Model): - field1 = models.CharField(max_length=10) - - -class PlainB(PlainA): - field2 = models.CharField(max_length=10) - - -class PlainC(PlainB): - field3 = models.CharField(max_length=10) - - -class Model2A(ShowFieldType, PolymorphicModel): - field1 = models.CharField(max_length=10) - polymorphic_showfield_deferred = True - - -class Model2B(Model2A): - field2 = models.CharField(max_length=10) - - -class Model2C(Model2B): - field3 = models.CharField(max_length=10) - - -class Model2D(Model2C): - field4 = models.CharField(max_length=10) - - -class ModelExtraA(ShowFieldTypeAndContent, PolymorphicModel): - field1 = models.CharField(max_length=10) - - -class ModelExtraB(ModelExtraA): - field2 = models.CharField(max_length=10) - - -class ModelExtraC(ModelExtraB): - field3 = models.CharField(max_length=10) - - -class ModelExtraExternal(models.Model): - topic = models.CharField(max_length=10) - - -class ModelShow1(ShowFieldType, PolymorphicModel): - field1 = models.CharField(max_length=10) - m2m = models.ManyToManyField('self') - - -class ModelShow2(ShowFieldContent, PolymorphicModel): - field1 = models.CharField(max_length=10) - m2m = models.ManyToManyField('self') - - -class ModelShow3(ShowFieldTypeAndContent, PolymorphicModel): - field1 = models.CharField(max_length=10) - m2m = models.ManyToManyField('self') - - -class ModelShow1_plain(PolymorphicModel): - field1 = models.CharField(max_length=10) - - -class ModelShow2_plain(ModelShow1_plain): - field2 = models.CharField(max_length=10) - - -class Base(ShowFieldType, PolymorphicModel): - field_b = models.CharField(max_length=10) - - -class ModelX(Base): - field_x = models.CharField(max_length=10) - - -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): - 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 RelationBase(ShowFieldTypeAndContent, PolymorphicModel): - field_base = models.CharField(max_length=10) - fk = models.ForeignKey('self', on_delete=models.CASCADE, null=True, related_name='relationbase_set') - m2m = models.ManyToManyField('self') - - -class RelationA(RelationBase): - field_a = models.CharField(max_length=10) - - -class RelationB(RelationBase): - field_b = models.CharField(max_length=10) - - -class RelationBC(RelationB): - field_c = models.CharField(max_length=10) - - -class RelatingModel(models.Model): - many2many = models.ManyToManyField(Model2A) - - -class One2OneRelatingModel(PolymorphicModel): - one2one = models.OneToOneField(Model2A, on_delete=models.CASCADE) - field1 = models.CharField(max_length=10) - - -class One2OneRelatingModelDerived(One2OneRelatingModel): - field2 = models.CharField(max_length=10) - - -class ModelUnderRelParent(PolymorphicModel): - field1 = models.CharField(max_length=10) - _private = models.CharField(max_length=10) - - -class ModelUnderRelChild(PolymorphicModel): - parent = models.ForeignKey(ModelUnderRelParent, on_delete=models.CASCADE, related_name='children') - _private2 = models.CharField(max_length=10) - - -class MyManagerQuerySet(PolymorphicQuerySet): - - def my_queryset_foo(self): - return self.all() # Just a method to prove the existance of the custom queryset. - - -class MyManager(PolymorphicManager): - queryset_class = MyManagerQuerySet - - def get_queryset(self): - return super(MyManager, self).get_queryset().order_by('-field1') - - def my_queryset_foo(self): - return self.all().my_queryset_foo() - - -class ModelWithMyManager(ShowFieldTypeAndContent, Model2A): - objects = MyManager() - field4 = models.CharField(max_length=10) - - -class ModelWithMyManagerNoDefault(ShowFieldTypeAndContent, Model2A): - objects = PolymorphicManager() - my_objects = MyManager() - field4 = models.CharField(max_length=10) - - -class ModelWithMyManagerDefault(ShowFieldTypeAndContent, Model2A): - my_objects = MyManager() - objects = PolymorphicManager() - field4 = models.CharField(max_length=10) - - -class ModelWithMyManager2(ShowFieldTypeAndContent, Model2A): - objects = MyManagerQuerySet.as_manager() - field4 = models.CharField(max_length=10) - - -class MROBase1(ShowFieldType, PolymorphicModel): - objects = MyManager() - field1 = models.CharField(max_length=10) # needed as MyManager uses it - - -class MROBase2(MROBase1): - pass # Django vanilla inheritance does not inherit MyManager as _default_manager here - - -class MROBase3(models.Model): - base_3_id = models.AutoField(primary_key=True) # make sure 'id' field doesn't clash, detected by Django 1.11 - objects = PolymorphicManager() - - -class MRODerived(MROBase2, MROBase3): - pass - - -class ParentModelWithManager(PolymorphicModel): - pass - - -class ChildModelWithManager(PolymorphicModel): - # Also test whether foreign keys receive the manager: - fk = models.ForeignKey(ParentModelWithManager, on_delete=models.CASCADE, related_name='childmodel_set') - objects = MyManager() - - -class PlainMyManagerQuerySet(QuerySet): - - def my_queryset_foo(self): - return self.all() # Just a method to prove the existance of the custom queryset. - - -class PlainMyManager(models.Manager): - - def my_queryset_foo(self): - return self.get_queryset().my_queryset_foo() - - def get_queryset(self): - return PlainMyManagerQuerySet(self.model, using=self._db) - - -class PlainParentModelWithManager(models.Model): - pass - - -class PlainChildModelWithManager(models.Model): - fk = models.ForeignKey(PlainParentModelWithManager, on_delete=models.CASCADE, related_name='childmodel_set') - objects = PlainMyManager() - - -class MgrInheritA(models.Model): - mgrA = models.Manager() - mgrA2 = models.Manager() - field1 = models.CharField(max_length=10) - - -class MgrInheritB(MgrInheritA): - mgrB = models.Manager() - field2 = models.CharField(max_length=10) - - -class MgrInheritC(ShowFieldTypeAndContent, MgrInheritB): - pass - - -class BlogBase(ShowFieldTypeAndContent, PolymorphicModel): - name = models.CharField(max_length=10) - - -class BlogA(BlogBase): - info = models.CharField(max_length=10) - - -class BlogB(BlogBase): - pass - - -class BlogEntry(ShowFieldTypeAndContent, PolymorphicModel): - blog = models.ForeignKey(BlogA, on_delete=models.CASCADE) - text = models.CharField(max_length=10) - - -class BlogEntry_limit_choices_to(ShowFieldTypeAndContent, PolymorphicModel): - blog = models.ForeignKey(BlogBase, on_delete=models.CASCADE) - text = models.CharField(max_length=10) - - -class ModelFieldNameTest(ShowFieldType, PolymorphicModel): - modelfieldnametest = models.CharField(max_length=10) - - -class InitTestModel(ShowFieldType, PolymorphicModel): - bar = models.CharField(max_length=100) - - def __init__(self, *args, **kwargs): - kwargs['bar'] = self.x() - super(InitTestModel, self).__init__(*args, **kwargs) - - -class InitTestModelSubclass(InitTestModel): - - def x(self): - return 'XYZ' - -# models from github issue - - -class Top(PolymorphicModel): - name = models.CharField(max_length=50) - - -class Middle(Top): - description = models.TextField() - - -class Bottom(Middle): - author = models.CharField(max_length=50) - - -class UUIDProject(ShowFieldTypeAndContent, PolymorphicModel): - uuid_primary_key = models.UUIDField(primary_key=True, default=uuid.uuid1) - topic = models.CharField(max_length=30) - - -class UUIDArtProject(UUIDProject): - artist = models.CharField(max_length=30) - - -class UUIDResearchProject(UUIDProject): - supervisor = models.CharField(max_length=30) - - -class UUIDPlainA(models.Model): - uuid_primary_key = models.UUIDField(primary_key=True, default=uuid.uuid1) - field1 = models.CharField(max_length=10) - - -class UUIDPlainB(UUIDPlainA): - field2 = models.CharField(max_length=10) - - -class UUIDPlainC(UUIDPlainB): - field3 = models.CharField(max_length=10) - -# base -> proxy - - -class ProxyBase(PolymorphicModel): - some_data = models.CharField(max_length=128) - - -class ProxyChild(ProxyBase): - - class Meta: - proxy = True - - -class NonProxyChild(ProxyBase): - name = models.CharField(max_length=10) - -# base -> proxy -> real models - - -class ProxiedBase(ShowFieldTypeAndContent, PolymorphicModel): - name = models.CharField(max_length=10) - - -class ProxyModelBase(ProxiedBase): - - class Meta: - proxy = True - - -class ProxyModelA(ProxyModelBase): - field1 = models.CharField(max_length=10) - - -class ProxyModelB(ProxyModelBase): - field2 = models.CharField(max_length=10) - - -# test bad field name -# class TestBadFieldModel(ShowFieldType, PolymorphicModel): -# instance_of = models.CharField(max_length=10) - -# validation error: "polymorphic.relatednameclash: Accessor for field 'polymorphic_ctype' clashes -# with related field 'ContentType.relatednameclash_set'." (reported by Andrew Ingram) -# fixed with related_name -class RelatedNameClash(ShowFieldType, PolymorphicModel): - ctype = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, editable=False) - -# class with a parent_link to superclass, and a related_name back to subclass - - -class TestParentLinkAndRelatedName(ModelShow1_plain): - superclass = models.OneToOneField( - ModelShow1_plain, on_delete=models.CASCADE, parent_link=True, related_name='related_name_subclass' - ) - - -class CustomPkBase(ShowFieldTypeAndContent, PolymorphicModel): - b = models.CharField(max_length=1) - - -class CustomPkInherit(CustomPkBase): - custom_id = models.AutoField(primary_key=True) - i = models.CharField(max_length=1) - - -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 diff --git a/polymorphic/tests/migrations/0001_initial.py b/polymorphic/tests/migrations/0001_initial.py new file mode 100644 index 0000000..c3c5ed3 --- /dev/null +++ b/polymorphic/tests/migrations/0001_initial.py @@ -0,0 +1,1008 @@ +import uuid + +import django.db.models.deletion +import django.db.models.manager +from django.db import migrations, models + +import polymorphic.showfields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ] + + operations = [ + migrations.CreateModel( + name='SwappableModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.swappablemodel_set+', to='contenttypes.ContentType')), + ], + options={ + 'swappable': 'POLYMORPHIC_TEST_SWAPPABLE', + }, + ), + migrations.CreateModel( + name='Base', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field_b', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldType, models.Model), + ), + migrations.CreateModel( + name='BlogBase', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='BlogEntry', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.CharField(max_length=10)), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.blogentry_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='BlogEntry_limit_choices_to', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='ChildModelWithManager', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + ), + migrations.CreateModel( + name='CustomPkBase', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('b', models.CharField(max_length=1)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='DateModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateTimeField()), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.datemodel_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + ), + migrations.CreateModel( + name='Enhance_Base', + fields=[ + ('base_id', models.AutoField(primary_key=True, serialize=False)), + ('field_b', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='Enhance_Plain', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field_p', models.CharField(max_length=10)), + ], + ), + migrations.CreateModel( + name='InitTestModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('bar', models.CharField(max_length=100)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldType, models.Model), + ), + migrations.CreateModel( + name='MgrInheritA', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ], + managers=[ + ('mgrA', django.db.models.manager.Manager()), + ], + ), + migrations.CreateModel( + name='Model2A', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldType, models.Model), + ), + migrations.CreateModel( + name='ModelExtraA', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='ModelExtraExternal', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('topic', models.CharField(max_length=10)), + ], + ), + migrations.CreateModel( + name='ModelFieldNameTest', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('modelfieldnametest', models.CharField(max_length=10)), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.modelfieldnametest_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldType, models.Model), + ), + migrations.CreateModel( + name='ModelShow1', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ('m2m', models.ManyToManyField(related_name='_modelshow1_m2m_+', to='tests.ModelShow1')), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.modelshow1_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldType, models.Model), + ), + migrations.CreateModel( + name='ModelShow1_plain', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + ), + migrations.CreateModel( + name='ModelShow2', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ('m2m', models.ManyToManyField(related_name='_modelshow2_m2m_+', to='tests.ModelShow2')), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.modelshow2_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldContent, models.Model), + ), + migrations.CreateModel( + name='ModelShow3', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ('m2m', models.ManyToManyField(related_name='_modelshow3_m2m_+', to='tests.ModelShow3')), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.modelshow3_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='ModelUnderRelChild', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('_private2', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + ), + migrations.CreateModel( + name='ModelUnderRelParent', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ('_private', models.CharField(max_length=10)), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.modelunderrelparent_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + ), + migrations.CreateModel( + name='MROBase1', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldType, models.Model), + ), + migrations.CreateModel( + name='MROBase3', + fields=[ + ('base_3_id', models.AutoField(primary_key=True, serialize=False)), + ], + ), + migrations.CreateModel( + name='One2OneRelatingModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + ), + migrations.CreateModel( + name='ParentModelWithManager', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.parentmodelwithmanager_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + ), + migrations.CreateModel( + name='PlainA', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field1', models.CharField(max_length=10)), + ], + ), + migrations.CreateModel( + name='PlainChildModelWithManager', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='PlainParentModelWithManager', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='ProxiedBase', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=10)), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.proxiedbase_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='ProxyBase', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('some_data', models.CharField(max_length=128)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + ), + migrations.CreateModel( + name='RelatedNameClash', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.relatednameclash_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldType, models.Model), + ), + migrations.CreateModel( + name='RelatingModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='RelationBase', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field_base', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='SwappedModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.swappedmodel_set+', to='contenttypes.ContentType')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Top', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + ), + migrations.CreateModel( + name='UUIDPlainA', + fields=[ + ('uuid_primary_key', models.UUIDField(default=uuid.uuid1, primary_key=True, serialize=False)), + ('field1', models.CharField(max_length=10)), + ], + ), + migrations.CreateModel( + name='UUIDProject', + fields=[ + ('uuid_primary_key', models.UUIDField(default=uuid.uuid1, primary_key=True, serialize=False)), + ('topic', models.CharField(max_length=30)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model), + ), + migrations.CreateModel( + name='BlogA', + fields=[ + ('blogbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.BlogBase')), + ('info', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.blogbase',), + ), + migrations.CreateModel( + name='BlogB', + fields=[ + ('blogbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.BlogBase')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.blogbase',), + ), + migrations.CreateModel( + name='CustomPkInherit', + fields=[ + ('custompkbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='tests.CustomPkBase')), + ('custom_id', models.AutoField(primary_key=True, serialize=False)), + ('i', models.CharField(max_length=1)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.custompkbase',), + ), + migrations.CreateModel( + name='Enhance_Inherit', + fields=[ + ('enhance_plain_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='tests.Enhance_Plain')), + ('enhance_base_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Enhance_Base')), + ('field_i', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.enhance_base', 'tests.enhance_plain'), + ), + migrations.CreateModel( + name='InitTestModelSubclass', + fields=[ + ('inittestmodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.InitTestModel')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.inittestmodel',), + ), + migrations.CreateModel( + name='MgrInheritB', + fields=[ + ('mgrinherita_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.MgrInheritA')), + ('field2', models.CharField(max_length=10)), + ], + bases=('tests.mgrinherita',), + managers=[ + ('mgrB', django.db.models.manager.Manager()), + ], + ), + migrations.CreateModel( + name='Middle', + fields=[ + ('top_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Top')), + ('description', models.TextField()), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.top',), + ), + migrations.CreateModel( + name='Model2B', + fields=[ + ('model2a_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Model2A')), + ('field2', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.model2a',), + ), + migrations.CreateModel( + name='ModelExtraB', + fields=[ + ('modelextraa_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.ModelExtraA')), + ('field2', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.modelextraa',), + ), + migrations.CreateModel( + name='ModelShow2_plain', + fields=[ + ('modelshow1_plain_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.ModelShow1_plain')), + ('field2', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.modelshow1_plain',), + ), + migrations.CreateModel( + name='ModelWithMyManager', + fields=[ + ('model2a_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Model2A')), + ('field4', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, 'tests.model2a'), + ), + migrations.CreateModel( + name='ModelWithMyManager2', + fields=[ + ('model2a_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Model2A')), + ('field4', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, 'tests.model2a'), + ), + migrations.CreateModel( + name='ModelWithMyManagerDefault', + fields=[ + ('model2a_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Model2A')), + ('field4', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, 'tests.model2a'), + managers=[ + ('my_objects', django.db.models.manager.Manager()), + ('objects', django.db.models.manager.Manager()), + ], + ), + migrations.CreateModel( + name='ModelWithMyManagerNoDefault', + fields=[ + ('model2a_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Model2A')), + ('field4', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=(polymorphic.showfields.ShowFieldTypeAndContent, 'tests.model2a'), + ), + migrations.CreateModel( + name='ModelX', + fields=[ + ('base_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Base')), + ('field_x', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.base',), + ), + migrations.CreateModel( + name='ModelY', + fields=[ + ('base_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Base')), + ('field_y', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.base',), + ), + migrations.CreateModel( + name='MROBase2', + fields=[ + ('mrobase1_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.MROBase1')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.mrobase1',), + managers=[ + ('objects', django.db.models.manager.Manager()), + ('base_objects', django.db.models.manager.Manager()), + ], + ), + migrations.CreateModel( + name='NonProxyChild', + fields=[ + ('proxybase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.ProxyBase')), + ('name', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.proxybase',), + ), + migrations.CreateModel( + name='One2OneRelatingModelDerived', + fields=[ + ('one2onerelatingmodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.One2OneRelatingModel')), + ('field2', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.one2onerelatingmodel',), + ), + migrations.CreateModel( + name='PlainB', + fields=[ + ('plaina_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.PlainA')), + ('field2', models.CharField(max_length=10)), + ], + bases=('tests.plaina',), + ), + migrations.CreateModel( + name='RelationA', + fields=[ + ('relationbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.RelationBase')), + ('field_a', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.relationbase',), + ), + migrations.CreateModel( + name='RelationB', + fields=[ + ('relationbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.RelationBase')), + ('field_b', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.relationbase',), + ), + migrations.CreateModel( + name='TestParentLinkAndRelatedName', + fields=[ + ('superclass', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, related_name='related_name_subclass', serialize=False, to='tests.ModelShow1_plain')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.modelshow1_plain',), + ), + migrations.CreateModel( + name='UUIDArtProject', + fields=[ + ('uuidproject_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.UUIDProject')), + ('artist', models.CharField(max_length=30)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.uuidproject',), + ), + migrations.CreateModel( + name='UUIDPlainB', + fields=[ + ('uuidplaina_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.UUIDPlainA')), + ('field2', models.CharField(max_length=10)), + ], + bases=('tests.uuidplaina',), + ), + migrations.CreateModel( + name='UUIDResearchProject', + fields=[ + ('uuidproject_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.UUIDProject')), + ('supervisor', models.CharField(max_length=30)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.uuidproject',), + ), + migrations.AddField( + model_name='uuidproject', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.uuidproject_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='top', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.top_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='relationbase', + name='fk', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='relationbase_set', to='tests.RelationBase'), + ), + migrations.AddField( + model_name='relationbase', + name='m2m', + field=models.ManyToManyField(related_name='_relationbase_m2m_+', to='tests.RelationBase'), + ), + migrations.AddField( + model_name='relationbase', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.relationbase_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='relatingmodel', + name='many2many', + field=models.ManyToManyField(to='tests.Model2A'), + ), + migrations.AddField( + model_name='proxybase', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.proxybase_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='plainchildmodelwithmanager', + name='fk', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='childmodel_set', to='tests.PlainParentModelWithManager'), + ), + migrations.AddField( + model_name='one2onerelatingmodel', + name='one2one', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='tests.Model2A'), + ), + migrations.AddField( + model_name='one2onerelatingmodel', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.one2onerelatingmodel_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='mrobase1', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.mrobase1_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='modelunderrelchild', + name='parent', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='children', to='tests.ModelUnderRelParent'), + ), + migrations.AddField( + model_name='modelunderrelchild', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.modelunderrelchild_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='modelshow1_plain', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.modelshow1_plain_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='modelextraa', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.modelextraa_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='model2a', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.model2a_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='inittestmodel', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.inittestmodel_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='enhance_base', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.enhance_base_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='custompkbase', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.custompkbase_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='childmodelwithmanager', + name='fk', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='childmodel_set', to='tests.ParentModelWithManager'), + ), + migrations.AddField( + model_name='childmodelwithmanager', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.childmodelwithmanager_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='blogentry_limit_choices_to', + name='blog', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tests.BlogBase'), + ), + migrations.AddField( + model_name='blogentry_limit_choices_to', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.blogentry_limit_choices_to_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='blogbase', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.blogbase_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='base', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_tests.base_set+', to='contenttypes.ContentType'), + ), + migrations.CreateModel( + name='ProxyChild', + fields=[ + ], + options={ + 'proxy': True, + }, + bases=('tests.proxybase',), + ), + migrations.CreateModel( + name='ProxyModelBase', + fields=[ + ], + options={ + 'proxy': True, + }, + bases=('tests.proxiedbase',), + ), + migrations.CreateModel( + name='Bottom', + fields=[ + ('middle_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Middle')), + ('author', models.CharField(max_length=50)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.middle',), + ), + migrations.CreateModel( + name='MgrInheritC', + fields=[ + ('mgrinheritb_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.MgrInheritB')), + ], + bases=(polymorphic.showfields.ShowFieldTypeAndContent, 'tests.mgrinheritb'), + ), + migrations.CreateModel( + name='Model2C', + fields=[ + ('model2b_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Model2B')), + ('field3', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.model2b',), + ), + migrations.CreateModel( + name='ModelExtraC', + fields=[ + ('modelextrab_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.ModelExtraB')), + ('field3', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.modelextrab',), + ), + migrations.CreateModel( + name='MRODerived', + fields=[ + ('mrobase3_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='tests.MROBase3')), + ('mrobase2_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.MROBase2')), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.mrobase2', 'tests.mrobase3'), + managers=[ + ('objects', django.db.models.manager.Manager()), + ('base_objects', django.db.models.manager.Manager()), + ], + ), + migrations.CreateModel( + name='PlainC', + fields=[ + ('plainb_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.PlainB')), + ('field3', models.CharField(max_length=10)), + ], + bases=('tests.plainb',), + ), + migrations.CreateModel( + name='ProxyModelA', + fields=[ + ('proxiedbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.ProxiedBase')), + ('field1', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.proxymodelbase',), + ), + migrations.CreateModel( + name='ProxyModelB', + fields=[ + ('proxiedbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.ProxiedBase')), + ('field2', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.proxymodelbase',), + ), + migrations.CreateModel( + name='RelationBC', + fields=[ + ('relationb_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.RelationB')), + ('field_c', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.relationb',), + ), + migrations.CreateModel( + name='UUIDPlainC', + fields=[ + ('uuidplainb_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.UUIDPlainB')), + ('field3', models.CharField(max_length=10)), + ], + bases=('tests.uuidplainb',), + ), + migrations.AddField( + model_name='blogentry', + name='blog', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tests.BlogA'), + ), + migrations.CreateModel( + name='Model2D', + fields=[ + ('model2c_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.Model2C')), + ('field4', models.CharField(max_length=10)), + ], + options={ + 'abstract': False, + 'base_manager_name': 'objects', + }, + bases=('tests.model2c',), + ), + ] diff --git a/polymorphic/tests/migrations/__init__.py b/polymorphic/tests/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/polymorphic/tests/models.py b/polymorphic/tests/models.py new file mode 100644 index 0000000..758233e --- /dev/null +++ b/polymorphic/tests/models.py @@ -0,0 +1,416 @@ +# -*- coding: utf-8 -*- + +import uuid + +from django.contrib.contenttypes.models import ContentType +from django.db import models +from django.db.models.query import QuerySet + +from polymorphic.managers import PolymorphicManager +from polymorphic.models import PolymorphicModel +from polymorphic.query import PolymorphicQuerySet +from polymorphic.showfields import ShowFieldContent, ShowFieldType, ShowFieldTypeAndContent + + +class PlainA(models.Model): + field1 = models.CharField(max_length=10) + + +class PlainB(PlainA): + field2 = models.CharField(max_length=10) + + +class PlainC(PlainB): + field3 = models.CharField(max_length=10) + + +class Model2A(ShowFieldType, PolymorphicModel): + field1 = models.CharField(max_length=10) + polymorphic_showfield_deferred = True + + +class Model2B(Model2A): + field2 = models.CharField(max_length=10) + + +class Model2C(Model2B): + field3 = models.CharField(max_length=10) + + +class Model2D(Model2C): + field4 = models.CharField(max_length=10) + + +class ModelExtraA(ShowFieldTypeAndContent, PolymorphicModel): + field1 = models.CharField(max_length=10) + + +class ModelExtraB(ModelExtraA): + field2 = models.CharField(max_length=10) + + +class ModelExtraC(ModelExtraB): + field3 = models.CharField(max_length=10) + + +class ModelExtraExternal(models.Model): + topic = models.CharField(max_length=10) + + +class ModelShow1(ShowFieldType, PolymorphicModel): + field1 = models.CharField(max_length=10) + m2m = models.ManyToManyField('self') + + +class ModelShow2(ShowFieldContent, PolymorphicModel): + field1 = models.CharField(max_length=10) + m2m = models.ManyToManyField('self') + + +class ModelShow3(ShowFieldTypeAndContent, PolymorphicModel): + field1 = models.CharField(max_length=10) + m2m = models.ManyToManyField('self') + + +class ModelShow1_plain(PolymorphicModel): + field1 = models.CharField(max_length=10) + + +class ModelShow2_plain(ModelShow1_plain): + field2 = models.CharField(max_length=10) + + +class Base(ShowFieldType, PolymorphicModel): + field_b = models.CharField(max_length=10) + + +class ModelX(Base): + field_x = models.CharField(max_length=10) + + +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): + 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 RelationBase(ShowFieldTypeAndContent, PolymorphicModel): + field_base = models.CharField(max_length=10) + fk = models.ForeignKey('self', on_delete=models.CASCADE, null=True, related_name='relationbase_set') + m2m = models.ManyToManyField('self') + + +class RelationA(RelationBase): + field_a = models.CharField(max_length=10) + + +class RelationB(RelationBase): + field_b = models.CharField(max_length=10) + + +class RelationBC(RelationB): + field_c = models.CharField(max_length=10) + + +class RelatingModel(models.Model): + many2many = models.ManyToManyField(Model2A) + + +class One2OneRelatingModel(PolymorphicModel): + one2one = models.OneToOneField(Model2A, on_delete=models.CASCADE) + field1 = models.CharField(max_length=10) + + +class One2OneRelatingModelDerived(One2OneRelatingModel): + field2 = models.CharField(max_length=10) + + +class ModelUnderRelParent(PolymorphicModel): + field1 = models.CharField(max_length=10) + _private = models.CharField(max_length=10) + + +class ModelUnderRelChild(PolymorphicModel): + parent = models.ForeignKey(ModelUnderRelParent, on_delete=models.CASCADE, related_name='children') + _private2 = models.CharField(max_length=10) + + +class MyManagerQuerySet(PolymorphicQuerySet): + + def my_queryset_foo(self): + return self.all() # Just a method to prove the existance of the custom queryset. + + +class MyManager(PolymorphicManager): + queryset_class = MyManagerQuerySet + + def get_queryset(self): + return super(MyManager, self).get_queryset().order_by('-field1') + + def my_queryset_foo(self): + return self.all().my_queryset_foo() + + +class ModelWithMyManager(ShowFieldTypeAndContent, Model2A): + objects = MyManager() + field4 = models.CharField(max_length=10) + + +class ModelWithMyManagerNoDefault(ShowFieldTypeAndContent, Model2A): + objects = PolymorphicManager() + my_objects = MyManager() + field4 = models.CharField(max_length=10) + + +class ModelWithMyManagerDefault(ShowFieldTypeAndContent, Model2A): + my_objects = MyManager() + objects = PolymorphicManager() + field4 = models.CharField(max_length=10) + + +class ModelWithMyManager2(ShowFieldTypeAndContent, Model2A): + objects = MyManagerQuerySet.as_manager() + field4 = models.CharField(max_length=10) + + +class MROBase1(ShowFieldType, PolymorphicModel): + objects = MyManager() + field1 = models.CharField(max_length=10) # needed as MyManager uses it + + +class MROBase2(MROBase1): + pass # Django vanilla inheritance does not inherit MyManager as _default_manager here + + +class MROBase3(models.Model): + base_3_id = models.AutoField(primary_key=True) # make sure 'id' field doesn't clash, detected by Django 1.11 + objects = PolymorphicManager() + + +class MRODerived(MROBase2, MROBase3): + pass + + +class ParentModelWithManager(PolymorphicModel): + pass + + +class ChildModelWithManager(PolymorphicModel): + # Also test whether foreign keys receive the manager: + fk = models.ForeignKey(ParentModelWithManager, on_delete=models.CASCADE, related_name='childmodel_set') + objects = MyManager() + + +class PlainMyManagerQuerySet(QuerySet): + + def my_queryset_foo(self): + return self.all() # Just a method to prove the existance of the custom queryset. + + +class PlainMyManager(models.Manager): + + def my_queryset_foo(self): + return self.get_queryset().my_queryset_foo() + + def get_queryset(self): + return PlainMyManagerQuerySet(self.model, using=self._db) + + +class PlainParentModelWithManager(models.Model): + pass + + +class PlainChildModelWithManager(models.Model): + fk = models.ForeignKey(PlainParentModelWithManager, on_delete=models.CASCADE, related_name='childmodel_set') + objects = PlainMyManager() + + +class MgrInheritA(models.Model): + mgrA = models.Manager() + mgrA2 = models.Manager() + field1 = models.CharField(max_length=10) + + +class MgrInheritB(MgrInheritA): + mgrB = models.Manager() + field2 = models.CharField(max_length=10) + + +class MgrInheritC(ShowFieldTypeAndContent, MgrInheritB): + pass + + +class BlogBase(ShowFieldTypeAndContent, PolymorphicModel): + name = models.CharField(max_length=10) + + +class BlogA(BlogBase): + info = models.CharField(max_length=10) + + +class BlogB(BlogBase): + pass + + +class BlogEntry(ShowFieldTypeAndContent, PolymorphicModel): + blog = models.ForeignKey(BlogA, on_delete=models.CASCADE) + text = models.CharField(max_length=10) + + +class BlogEntry_limit_choices_to(ShowFieldTypeAndContent, PolymorphicModel): + blog = models.ForeignKey(BlogBase, on_delete=models.CASCADE) + text = models.CharField(max_length=10) + + +class ModelFieldNameTest(ShowFieldType, PolymorphicModel): + modelfieldnametest = models.CharField(max_length=10) + + +class InitTestModel(ShowFieldType, PolymorphicModel): + bar = models.CharField(max_length=100) + + def __init__(self, *args, **kwargs): + kwargs['bar'] = self.x() + super(InitTestModel, self).__init__(*args, **kwargs) + + +class InitTestModelSubclass(InitTestModel): + + def x(self): + return 'XYZ' + +# models from github issue + + +class Top(PolymorphicModel): + name = models.CharField(max_length=50) + + +class Middle(Top): + description = models.TextField() + + +class Bottom(Middle): + author = models.CharField(max_length=50) + + +class UUIDProject(ShowFieldTypeAndContent, PolymorphicModel): + uuid_primary_key = models.UUIDField(primary_key=True, default=uuid.uuid1) + topic = models.CharField(max_length=30) + + +class UUIDArtProject(UUIDProject): + artist = models.CharField(max_length=30) + + +class UUIDResearchProject(UUIDProject): + supervisor = models.CharField(max_length=30) + + +class UUIDPlainA(models.Model): + uuid_primary_key = models.UUIDField(primary_key=True, default=uuid.uuid1) + field1 = models.CharField(max_length=10) + + +class UUIDPlainB(UUIDPlainA): + field2 = models.CharField(max_length=10) + + +class UUIDPlainC(UUIDPlainB): + field3 = models.CharField(max_length=10) + +# base -> proxy + + +class ProxyBase(PolymorphicModel): + some_data = models.CharField(max_length=128) + + +class ProxyChild(ProxyBase): + + class Meta: + proxy = True + + +class NonProxyChild(ProxyBase): + name = models.CharField(max_length=10) + +# base -> proxy -> real models + + +class ProxiedBase(ShowFieldTypeAndContent, PolymorphicModel): + name = models.CharField(max_length=10) + + +class ProxyModelBase(ProxiedBase): + + class Meta: + proxy = True + + +class ProxyModelA(ProxyModelBase): + field1 = models.CharField(max_length=10) + + +class ProxyModelB(ProxyModelBase): + field2 = models.CharField(max_length=10) + + +# test bad field name +# class TestBadFieldModel(ShowFieldType, PolymorphicModel): +# instance_of = models.CharField(max_length=10) + +# validation error: "polymorphic.relatednameclash: Accessor for field 'polymorphic_ctype' clashes +# with related field 'ContentType.relatednameclash_set'." (reported by Andrew Ingram) +# fixed with related_name +class RelatedNameClash(ShowFieldType, PolymorphicModel): + ctype = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, editable=False) + +# class with a parent_link to superclass, and a related_name back to subclass + + +class TestParentLinkAndRelatedName(ModelShow1_plain): + superclass = models.OneToOneField( + ModelShow1_plain, on_delete=models.CASCADE, parent_link=True, related_name='related_name_subclass' + ) + + +class CustomPkBase(ShowFieldTypeAndContent, PolymorphicModel): + b = models.CharField(max_length=1) + + +class CustomPkInherit(CustomPkBase): + custom_id = models.AutoField(primary_key=True) + i = models.CharField(max_length=1) + + +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 diff --git a/runtests.py b/runtests.py index fd67216..57d2f52 100755 --- a/runtests.py +++ b/runtests.py @@ -36,6 +36,7 @@ if not settings.configured: 'django.contrib.sites', 'django.contrib.admin', 'polymorphic', + 'polymorphic.tests', ), MIDDLEWARE_CLASSES=(), SITE_ID=3, From e102a0502cb532a25a57a1f0d4f0014f03d51610 Mon Sep 17 00:00:00 2001 From: Hugo Osvaldo Barrera Date: Wed, 6 Sep 2017 19:47:50 -0300 Subject: [PATCH 3/3] Update a bunch of failing tests Tests were failing because of: * Models weren't being imported from their new location. * PolymorphicManager doesn't work with non-polymorphic models, but migrations run models' manager, so having MROBase3 with PolymorphicManager failed. * Some tests failed due to have assertions were being done (since they hardcoded expected instance ids). Update tests to use comparisons similar to #312 --- polymorphic/tests/models.py | 2 +- polymorphic/tests/test_admin.py | 2 +- polymorphic/tests/test_contrib.py | 5 +- polymorphic/tests/test_multidb.py | 70 ++++++++---- polymorphic/tests/test_orm.py | 164 +++++++++++++++++++++++---- polymorphic/tests/test_regression.py | 2 +- polymorphic/tests/test_utils.py | 2 +- 7 files changed, 195 insertions(+), 52 deletions(-) diff --git a/polymorphic/tests/models.py b/polymorphic/tests/models.py index 758233e..e2794ea 100644 --- a/polymorphic/tests/models.py +++ b/polymorphic/tests/models.py @@ -195,7 +195,7 @@ class MROBase2(MROBase1): class MROBase3(models.Model): base_3_id = models.AutoField(primary_key=True) # make sure 'id' field doesn't clash, detected by Django 1.11 - objects = PolymorphicManager() + objects = models.Manager() class MRODerived(MROBase2, MROBase3): diff --git a/polymorphic/tests/test_admin.py b/polymorphic/tests/test_admin.py index a5d72ca..2b2a2fe 100644 --- a/polymorphic/tests/test_admin.py +++ b/polymorphic/tests/test_admin.py @@ -2,7 +2,7 @@ from django.contrib.admin import AdminSite from django.test import TestCase from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter -from polymorphic.tests import Model2A, Model2B, Model2C, Model2D +from polymorphic.tests.models import Model2A, Model2B, Model2C, Model2D class MultipleDatabasesTests(TestCase): diff --git a/polymorphic/tests/test_contrib.py b/polymorphic/tests/test_contrib.py index ae8f24a..42997d6 100644 --- a/polymorphic/tests/test_contrib.py +++ b/polymorphic/tests/test_contrib.py @@ -1,7 +1,10 @@ from unittest import TestCase from polymorphic.contrib.guardian import get_polymorphic_base_content_type -from polymorphic.tests import * # all models +from polymorphic.tests.models import ( + Model2D, + PlainC, +) class ContribTests(TestCase): diff --git a/polymorphic/tests/test_multidb.py b/polymorphic/tests/test_multidb.py index 3636808..31c9fd9 100644 --- a/polymorphic/tests/test_multidb.py +++ b/polymorphic/tests/test_multidb.py @@ -4,7 +4,19 @@ from django.contrib.contenttypes.models import ContentType from django.db.models import Q from django.test import TestCase -from polymorphic.tests import * # all models +from polymorphic.tests.models import ( + Base, + BlogA, + BlogEntry, + Model2A, + Model2B, + Model2C, + Model2D, + ModelX, + ModelY, + One2OneRelatingModel, + RelatingModel, +) class MultipleDatabasesTests(TestCase): @@ -16,15 +28,17 @@ class MultipleDatabasesTests(TestCase): Model2B.objects.create(field1='B1', field2='B2') Model2D(field1='D1', field2='D2', field3='D3', field4='D4').save() - default_objects = list(Model2A.objects.order_by('id')) - self.assertEqual(len(default_objects), 2) - self.assertEqual(repr(default_objects[0]), '') - self.assertEqual(repr(default_objects[1]), '') + self.assertQuerysetEqual( + Model2A.objects.order_by('id'), + [Model2B, Model2D], + transform=lambda o: o.__class__, + ) - secondary_objects = list(Model2A.objects.db_manager('secondary').order_by('id')) - self.assertEqual(len(secondary_objects), 2) - self.assertEqual(repr(secondary_objects[0]), '') - self.assertEqual(repr(secondary_objects[1]), '') + self.assertQuerysetEqual( + Model2A.objects.db_manager('secondary').order_by('id'), + [Model2A, Model2C], + transform=lambda o: o.__class__, + ) def test_instance_of_filter_on_non_default_database(self): Base.objects.db_manager('secondary').create(field_b='B1') @@ -32,23 +46,33 @@ class MultipleDatabasesTests(TestCase): ModelY.objects.db_manager('secondary').create(field_b='Y', field_y='Y') objects = Base.objects.db_manager('secondary').filter(instance_of=Base) - self.assertEqual(len(objects), 3) - self.assertEqual(repr(objects[0]), '') - self.assertEqual(repr(objects[1]), '') - self.assertEqual(repr(objects[2]), '') + self.assertQuerysetEqual( + objects, + [Base, ModelX, ModelY], + transform=lambda o: o.__class__, + ordered=False, + ) - objects = Base.objects.db_manager('secondary').filter(instance_of=ModelX) - self.assertEqual(len(objects), 1) - self.assertEqual(repr(objects[0]), '') + self.assertQuerysetEqual( + Base.objects.db_manager('secondary').filter(instance_of=ModelX), + [ModelX], + transform=lambda o: o.__class__, + ) - objects = Base.objects.db_manager('secondary').filter(instance_of=ModelY) - self.assertEqual(len(objects), 1) - self.assertEqual(repr(objects[0]), '') + self.assertQuerysetEqual( + Base.objects.db_manager('secondary').filter(instance_of=ModelY), + [ModelY], + transform=lambda o: o.__class__, + ) - objects = Base.objects.db_manager('secondary').filter(Q(instance_of=ModelX) | Q(instance_of=ModelY)) - self.assertEqual(len(objects), 2) - self.assertEqual(repr(objects[0]), '') - self.assertEqual(repr(objects[1]), '') + self.assertQuerysetEqual( + Base.objects.db_manager('secondary').filter( + Q(instance_of=ModelX) | Q(instance_of=ModelY) + ), + [ModelX, ModelY], + transform=lambda o: o.__class__, + ordered=False, + ) def test_forward_many_to_one_descriptor_on_non_default_database(self): def func(): diff --git a/polymorphic/tests/test_orm.py b/polymorphic/tests/test_orm.py index 41d6c12..065c0bb 100644 --- a/polymorphic/tests/test_orm.py +++ b/polymorphic/tests/test_orm.py @@ -1,12 +1,82 @@ import re +import uuid import django +from django.db import models from django.db.models import Case, Count, Q, When from django.test import TestCase, TransactionTestCase from django.utils import six +from polymorphic.managers import PolymorphicManager from polymorphic.models import PolymorphicTypeUndefined -from polymorphic.tests import * # all models +from polymorphic.tests.models import ( + Base, + BlogA, + BlogB, + BlogBase, + BlogEntry, + BlogEntry_limit_choices_to, + ChildModelWithManager, + CustomPkBase, + CustomPkInherit, + Enhance_Base, + Enhance_Inherit, + InitTestModelSubclass, + MRODerived, + Model2A, + Model2B, + Model2C, + Model2D, + ModelExtraA, + ModelExtraB, + ModelExtraC, + ModelExtraExternal, + ModelFieldNameTest, + ModelShow1, + ModelShow1_plain, + ModelShow2, + ModelShow2_plain, + ModelShow3, + ModelUnderRelChild, + ModelUnderRelParent, + ModelWithMyManager, + ModelWithMyManager2, + ModelWithMyManagerDefault, + ModelWithMyManagerNoDefault, + ModelX, + ModelY, + MyManager, + MyManagerQuerySet, + NonProxyChild, + One2OneRelatingModel, + One2OneRelatingModelDerived, + ParentModelWithManager, + PlainA, + PlainB, + PlainC, + PlainChildModelWithManager, + PlainMyManager, + PlainMyManagerQuerySet, + PlainParentModelWithManager, + ProxiedBase, + ProxyBase, + ProxyChild, + ProxyModelA, + ProxyModelB, + ProxyModelBase, + QuerySet, + RelationA, + RelationB, + RelationBC, + RelationBase, + TestParentLinkAndRelatedName, + UUIDArtProject, + UUIDPlainA, + UUIDPlainB, + UUIDPlainC, + UUIDProject, + UUIDResearchProject, +) class PolymorphicTests(TransactionTestCase): @@ -252,28 +322,52 @@ class PolymorphicTests(TransactionTestCase): ) def test_base_manager(self): - def show_base_manager(model): - return "{0} {1}".format( - repr(type(model._base_manager)), - repr(model._base_manager.model) + def base_manager(model): + return ( + type(model._base_manager), + model._base_manager.model ) - self.assertEqual(show_base_manager(PlainA), " ") - self.assertEqual(show_base_manager(PlainB), " ") - self.assertEqual(show_base_manager(PlainC), " ") + self.assertEqual( + base_manager(PlainA), + (models.Manager, PlainA), + ) + self.assertEqual( + base_manager(PlainB), + (models.Manager, PlainB), + ) + self.assertEqual( + base_manager(PlainC), + (models.Manager, PlainC), + ) - self.assertEqual(show_base_manager(Model2A), " ") - self.assertEqual(show_base_manager(Model2B), " ") - self.assertEqual(show_base_manager(Model2C), " ") + self.assertEqual( + base_manager(Model2A), + (PolymorphicManager, Model2A), + ) + self.assertEqual( + base_manager(Model2B), + (PolymorphicManager, Model2B), + ) + self.assertEqual( + base_manager(Model2C), + (PolymorphicManager, Model2C), + ) - self.assertEqual(show_base_manager(One2OneRelatingModel), " ") - self.assertEqual(show_base_manager(One2OneRelatingModelDerived), " ") + self.assertEqual( + base_manager(One2OneRelatingModel), + (PolymorphicManager, One2OneRelatingModel), + ) + self.assertEqual( + base_manager(One2OneRelatingModelDerived), + (PolymorphicManager, One2OneRelatingModelDerived), + ) def test_instance_default_manager(self): - def show_default_manager(instance): - return "{0} {1}".format( - repr(type(instance.__class__._default_manager)), - repr(instance.__class__._default_manager.model) + def default_manager(instance): + return ( + type(instance.__class__._default_manager), + instance.__class__._default_manager.model ) plain_a = PlainA(field1='C1') @@ -284,13 +378,31 @@ class PolymorphicTests(TransactionTestCase): model_2b = Model2B(field2='C1') model_2c = Model2C(field3='C1') - self.assertEqual(show_default_manager(plain_a), " ") - self.assertEqual(show_default_manager(plain_b), " ") - self.assertEqual(show_default_manager(plain_c), " ") + self.assertEqual( + default_manager(plain_a), + (models.Manager, PlainA), + ) + self.assertEqual( + default_manager(plain_b), + (models.Manager, PlainB), + ) + self.assertEqual( + default_manager(plain_c), + (models.Manager, PlainC), + ) - self.assertEqual(show_default_manager(model_2a), " ") - self.assertEqual(show_default_manager(model_2b), " ") - self.assertEqual(show_default_manager(model_2c), " ") + self.assertEqual( + default_manager(model_2a), + (PolymorphicManager, Model2A), + ) + self.assertEqual( + default_manager(model_2b), + (PolymorphicManager, Model2B), + ) + self.assertEqual( + default_manager(model_2c), + (PolymorphicManager, Model2C), + ) def test_foreignkey_field(self): self.create_model2abcd() @@ -376,7 +488,11 @@ class PolymorphicTests(TransactionTestCase): ModelExtraExternal.objects.create(topic='extra1') ModelExtraExternal.objects.create(topic='extra2') ModelExtraExternal.objects.create(topic='extra3') - objects = ModelExtraA.objects.extra(tables=["polymorphic_modelextraexternal"], select={"topic": "polymorphic_modelextraexternal.topic"}, where=["polymorphic_modelextraa.id = polymorphic_modelextraexternal.id"]) + objects = ModelExtraA.objects.extra( + tables=["tests_modelextraexternal"], + select={"topic": "tests_modelextraexternal.topic"}, + where=["tests_modelextraa.id = tests_modelextraexternal.id"], + ) if six.PY3: self.assertEqual(repr(objects[0]), '') self.assertEqual(repr(objects[1]), '') diff --git a/polymorphic/tests/test_regression.py b/polymorphic/tests/test_regression.py index 3766dba..073992a 100644 --- a/polymorphic/tests/test_regression.py +++ b/polymorphic/tests/test_regression.py @@ -1,5 +1,5 @@ from django.test import TestCase -from . import Top, Middle, Bottom +from polymorphic.tests.models import Bottom, Middle, Top class RegressionTests(TestCase): diff --git a/polymorphic/tests/test_utils.py b/polymorphic/tests/test_utils.py index e857f64..410ef26 100644 --- a/polymorphic/tests/test_utils.py +++ b/polymorphic/tests/test_utils.py @@ -1,7 +1,7 @@ from django.test import TransactionTestCase from polymorphic.models import PolymorphicTypeUndefined -from polymorphic.tests import Model2A, Model2B, Model2C, Model2D +from polymorphic.tests.models import Model2A, Model2B, Model2C, Model2D from polymorphic.utils import reset_polymorphic_ctype, sort_by_subclass