Skip to content

Commit fee9d35

Browse files
committed
address test warnings, add inheritance tests
1 parent 447e8c2 commit fee9d35

File tree

6 files changed

+101
-22
lines changed

6 files changed

+101
-22
lines changed

src/polymorphic/tests/admin.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from inspect import isclass
22
from django.contrib.admin import register, ModelAdmin, site as admin_site
3+
from django.db.models.query import QuerySet
4+
from django.http import HttpRequest
35
from polymorphic.admin import (
46
StackedPolymorphicInline,
57
PolymorphicInlineSupportMixin,
@@ -35,6 +37,9 @@ class Model2Admin(PolymorphicParentModelAdmin):
3537
class PlainAAdmin(ModelAdmin):
3638
search_fields = ["field1"]
3739

40+
def get_queryset(self, request: HttpRequest) -> QuerySet:
41+
return super().get_queryset(request).order_by("pk")
42+
3843

3944
class Inline(StackedPolymorphicInline):
4045
model = InlineModelA

src/polymorphic/tests/migrations/0001_initial.py

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.2.27 on 2025-12-08 15:20
1+
# Generated by Django 4.2.27 on 2025-12-09 01:30
22

33
from django.conf import settings
44
from django.db import migrations, models
@@ -13,8 +13,8 @@ class Migration(migrations.Migration):
1313
initial = True
1414

1515
dependencies = [
16-
('auth', '0012_alter_user_first_name_max_length'),
1716
('contenttypes', '0002_remove_content_type_name'),
17+
('auth', '0012_alter_user_first_name_max_length'),
1818
]
1919

2020
operations = [
@@ -581,6 +581,17 @@ class Migration(migrations.Migration):
581581
},
582582
bases=('tests.one2onerelatingmodel',),
583583
),
584+
migrations.CreateModel(
585+
name='ParentLinkAndRelatedName',
586+
fields=[
587+
('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')),
588+
],
589+
options={
590+
'abstract': False,
591+
'base_manager_name': 'objects',
592+
},
593+
bases=('tests.modelshow1_plain',),
594+
),
584595
migrations.CreateModel(
585596
name='PlainB',
586597
fields=[
@@ -647,17 +658,6 @@ class Migration(migrations.Migration):
647658
},
648659
bases=('tests.subclassselectorabstractbasemodel',),
649660
),
650-
migrations.CreateModel(
651-
name='TestParentLinkAndRelatedName',
652-
fields=[
653-
('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')),
654-
],
655-
options={
656-
'abstract': False,
657-
'base_manager_name': 'objects',
658-
},
659-
bases=('tests.modelshow1_plain',),
660-
),
661661
migrations.CreateModel(
662662
name='UserProfile',
663663
fields=[
@@ -889,6 +889,17 @@ class Migration(migrations.Migration):
889889
'base_manager_name': 'objects',
890890
},
891891
),
892+
migrations.CreateModel(
893+
name='Foo',
894+
fields=[
895+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
896+
('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype')),
897+
],
898+
options={
899+
'abstract': False,
900+
'base_manager_name': 'objects',
901+
},
902+
),
892903
migrations.CreateModel(
893904
name='DateModel',
894905
fields=[
@@ -928,6 +939,30 @@ class Migration(migrations.Migration):
928939
},
929940
bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model),
930941
),
942+
migrations.CreateModel(
943+
name='Baz',
944+
fields=[
945+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
946+
('created_at', models.DateTimeField(auto_now_add=True)),
947+
('modified_at', models.DateTimeField(auto_now=True)),
948+
('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype')),
949+
],
950+
options={
951+
'abstract': False,
952+
},
953+
),
954+
migrations.CreateModel(
955+
name='Bar',
956+
fields=[
957+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
958+
('created_at', models.DateTimeField(auto_now_add=True)),
959+
('modified_at', models.DateTimeField(auto_now=True)),
960+
('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype')),
961+
],
962+
options={
963+
'abstract': False,
964+
},
965+
),
931966
migrations.CreateModel(
932967
name='ArtProject',
933968
fields=[

src/polymorphic/tests/models.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ class RelatedNameClash(ShowFieldType, PolymorphicModel):
405405
# class with a parent_link to superclass, and a related_name back to subclass
406406

407407

408-
class TestParentLinkAndRelatedName(ModelShow1_plain):
408+
class ParentLinkAndRelatedName(ModelShow1_plain):
409409
superclass = models.OneToOneField(
410410
ModelShow1_plain,
411411
on_delete=models.CASCADE,
@@ -584,3 +584,31 @@ class SpecialAccount1_1(SpecialAccount1):
584584

585585
class SpecialAccount2(Account):
586586
extra1 = models.CharField(default="", blank=True, max_length=30)
587+
588+
589+
class ModelMixin(models.Model):
590+
class Meta:
591+
abstract = True
592+
593+
created_at = models.DateTimeField(auto_now_add=True)
594+
modified_at = models.DateTimeField(auto_now=True)
595+
596+
597+
class PolymorphicMixin(PolymorphicModel):
598+
class Meta:
599+
abstract = True
600+
601+
created_at = models.DateTimeField(auto_now_add=True)
602+
modified_at = models.DateTimeField(auto_now=True)
603+
604+
605+
class Foo(PolymorphicModel):
606+
pass
607+
608+
609+
class Bar(PolymorphicMixin, PolymorphicModel):
610+
pass
611+
612+
613+
class Baz(ModelMixin, PolymorphicModel):
614+
pass

src/polymorphic/tests/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,5 @@
138138
ALLOWED_HOSTS = ["*"]
139139

140140
ROOT_URLCONF = "polymorphic.tests.urls"
141+
142+
USE_TZ = False
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from polymorphic.tests.models import Foo, Bar, Baz
2+
from polymorphic.managers import PolymorphicManager
3+
from django.test import TestCase
4+
5+
6+
class InheritanceTests(TestCase):
7+
def test_mixin_inherited_managers(self):
8+
self.assertIsInstance(Foo._base_manager, PolymorphicManager)
9+
self.assertIsInstance(Bar._base_manager, PolymorphicManager)
10+
self.assertIsInstance(Baz._base_manager, PolymorphicManager)

src/polymorphic/tests/test_orm.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
SubclassSelectorAbstractConcreteModel,
8787
SubclassSelectorProxyBaseModel,
8888
SubclassSelectorProxyConcreteModel,
89-
TestParentLinkAndRelatedName,
89+
ParentLinkAndRelatedName,
9090
UUIDArtProject,
9191
UUIDPlainA,
9292
UUIDPlainB,
@@ -458,8 +458,7 @@ def test_foreignkey_field(self):
458458
def test_onetoone_field(self):
459459
self.create_model2abcd()
460460

461-
# FIXME: We should not use base_objects here.
462-
a = Model2A.base_objects.get(field1="C1")
461+
a = Model2A.objects.non_polymorphic().get(field1="C1")
463462
b = One2OneRelatingModelDerived.objects.create(one2one=a, field1="f1", field2="f2")
464463

465464
# FIXME: this result is basically wrong, probably due to Django cacheing (we used base_objects), but should not be a problem
@@ -960,17 +959,17 @@ def test_fix_getattribute(self):
960959
assert o.bar == "XYZ"
961960

962961
def test_parent_link_and_related_name(self):
963-
t = TestParentLinkAndRelatedName(field1="TestParentLinkAndRelatedName")
962+
t = ParentLinkAndRelatedName(field1="ParentLinkAndRelatedName")
964963
t.save()
965-
p = ModelShow1_plain.objects.get(field1="TestParentLinkAndRelatedName")
964+
p = ModelShow1_plain.objects.get(field1="ParentLinkAndRelatedName")
966965

967966
# check that p is equal to the
968-
assert isinstance(p, TestParentLinkAndRelatedName)
967+
assert isinstance(p, ParentLinkAndRelatedName)
969968
assert p == t
970969

971970
# check that the accessors to parent and sublass work correctly and return the right object
972-
p = ModelShow1_plain.objects.non_polymorphic().get(field1="TestParentLinkAndRelatedName")
973-
# p should be Plain1 and t TestParentLinkAndRelatedName, so not equal
971+
p = ModelShow1_plain.objects.non_polymorphic().get(field1="ParentLinkAndRelatedName")
972+
# p should be Plain1 and t ParentLinkAndRelatedName, so not equal
974973
assert p != t
975974
assert p == t.superclass
976975
assert p.related_name_subclass == t

0 commit comments

Comments
 (0)