Update parentadmin.py

- fix parent admin form not behaving like an admin form (eg log out button context missing)
- add test for model type add form correctly embedding in the rest of the admin
- separate playwright admin form tests
- update changelog

Co-authored-by: TarunvirBains <61893384+TarunvirBains@users.noreply.github.com>
Co-authored-by: Brian Kohan <bkohan@example.com>
This commit is contained in:
TarunvirBains 2024-02-20 17:22:35 -07:00 committed by Brian Kohan
parent 3d4cacb5af
commit 47323bd72e
No known key found for this signature in database
GPG Key ID: 5C6CE8BA38C43FC1
4 changed files with 118 additions and 4 deletions

View File

@ -4,6 +4,7 @@ Changelog
v4.2.0 (2025-12-01)
-------------------
* Fixed `Show full admin context (breadcrumb and logout nav) in model type selection admin form <https://github.com/jazzband/django-polymorphic/pull/580>`_
* Fixed `Issue with Autocomplete Fields in StackedPolymorphicInline.Child Inline <https://github.com/jazzband/django-polymorphic/issues/546>`_
* Support Python 3.14 and Django 6.0, drop support for EOL python 3.9, Django 3.2, 4.0, 4.1 and 5.0.
* `Modernized package management with new build, test, docs tooling and improved CI

View File

@ -345,6 +345,7 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
"opts": opts,
"add": True,
"save_on_top": self.save_on_top,
**self.admin_site.each_context(request),
}
)
@ -356,7 +357,7 @@ class PolymorphicParentModelAdmin(admin.ModelAdmin):
]
request.current_app = self.admin_site.name
return TemplateResponse(request, templates, context)
return self.admin_site.admin_view(TemplateResponse)(request, templates, context)
@property
def change_list_template(self):

View File

@ -1,6 +1,33 @@
from django.contrib.admin import register, ModelAdmin
from polymorphic.admin import StackedPolymorphicInline, PolymorphicInlineSupportMixin
from polymorphic.tests.models import PlainA, InlineModelA, InlineModelB, InlineParent
from django.contrib.admin import register, ModelAdmin, site as admin_site
from polymorphic.admin import (
StackedPolymorphicInline,
PolymorphicInlineSupportMixin,
PolymorphicChildModelAdmin,
PolymorphicChildModelFilter,
PolymorphicParentModelAdmin,
)
from polymorphic.tests.models import (
PlainA,
Model2A,
Model2B,
Model2C,
Model2D,
InlineModelA,
InlineModelB,
InlineParent,
)
@register(Model2A)
class Model2Admin(PolymorphicParentModelAdmin):
list_filter = (PolymorphicChildModelFilter,)
child_models = (Model2B, Model2C, Model2D)
admin_site.register(Model2B, PolymorphicChildModelAdmin)
admin_site.register(Model2C, PolymorphicChildModelAdmin)
admin_site.register(Model2D, PolymorphicChildModelAdmin)
@register(PlainA)

View File

@ -278,3 +278,88 @@ class StackedInlineTests(_GenericAdminFormTest):
suggestions = self.page.locator("ul.select2-results__options > li").all_inner_texts()
assert suggestions == ["Brian"]
class PolymorphicFormTests(_GenericAdminFormTest):
def setUp(self):
Model2A.objects.all().delete()
super().setUp()
def tearDown(self):
Model2A.objects.all().delete()
super().tearDown()
def test_admin_polymorphic_add(self):
model2b_ct = ContentType.objects.get_for_model(Model2B)
model2c_ct = ContentType.objects.get_for_model(Model2C)
model2d_ct = ContentType.objects.get_for_model(Model2D)
for model_type, fields in [
(
model2b_ct,
{
"field1": "2B1",
"field2": "2B2",
},
),
(
model2c_ct,
{
"field1": "2C1",
"field2": "2C2",
"field3": "2C3",
},
),
(
model2d_ct,
{
"field1": "2D1",
"field2": "2D2",
"field3": "2D3",
"field4": "2D4",
},
),
]:
self.page.goto(self.add_url(Model2A))
# https://github.com/jazzband/django-polymorphic/pull/580
expect(self.page.locator("div.breadcrumbs")).to_have_count(1)
expect(self.page.locator("form#logout-form")).to_have_count(1)
self.page.locator(f"input[type=radio][value='{model_type.pk}']").check()
with self.page.expect_navigation(timeout=10000) as nav_info:
self.page.click("input[name='_save']")
response = nav_info.value
assert response.status < 400
for field, value in fields.items():
self.page.fill(f"input[name='{field}']", value)
with self.page.expect_navigation(timeout=10000) as nav_info:
self.page.click("input[name='_save']")
response = nav_info.value
assert response.status < 400
assert Model2A.objects.count() == 3
object_ids = [int(oid) for oid in self.get_object_ids(Model2A)]
assert len(object_ids) == 3
assert Model2B.objects.first().pk in object_ids
assert Model2C.objects.first().pk in object_ids
assert Model2D.objects.first().pk in object_ids
assert Model2B.objects.first().field1 == "2B1"
assert Model2B.objects.first().field2 == "2B2"
assert Model2C.objects.first().field1 == "2C1"
assert Model2C.objects.first().field2 == "2C2"
assert Model2C.objects.first().field3 == "2C3"
assert Model2D.objects.first().field1 == "2D1"
assert Model2D.objects.first().field2 == "2D2"
assert Model2D.objects.first().field3 == "2D3"
assert Model2D.objects.first().field4 == "2D4"