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/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..e2794ea --- /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 = models.Manager() + + +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/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 diff --git a/runtests.py b/runtests.py index f0a1609..57d2f52 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=( @@ -35,6 +36,7 @@ if not settings.configured: 'django.contrib.sites', 'django.contrib.admin', 'polymorphic', + 'polymorphic.tests', ), MIDDLEWARE_CLASSES=(), SITE_ID=3, 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