Skip to content

Commit a66d42a

Browse files
TarunvirBainsBrian Kohan
authored andcommitted
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 Co-authored-by: TarunvirBains <[email protected]> Co-authored-by: Brian Kohan <[email protected]>
1 parent 3d4cacb commit a66d42a

File tree

3 files changed

+109
-4
lines changed

3 files changed

+109
-4
lines changed

src/polymorphic/admin/parentadmin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ def render_add_type_form(self, request, context, form_url=""):
345345
"opts": opts,
346346
"add": True,
347347
"save_on_top": self.save_on_top,
348+
**self.admin_site.each_context(request),
348349
}
349350
)
350351

@@ -356,7 +357,7 @@ def render_add_type_form(self, request, context, form_url=""):
356357
]
357358

358359
request.current_app = self.admin_site.name
359-
return TemplateResponse(request, templates, context)
360+
return self.admin_site.admin_view(TemplateResponse)(request, templates, context)
360361

361362
@property
362363
def change_list_template(self):

src/polymorphic/tests/admin.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,33 @@
1-
from django.contrib.admin import register, ModelAdmin
2-
from polymorphic.admin import StackedPolymorphicInline, PolymorphicInlineSupportMixin
3-
from polymorphic.tests.models import PlainA, InlineModelA, InlineModelB, InlineParent
1+
from django.contrib.admin import register, ModelAdmin, site as admin_site
2+
from polymorphic.admin import (
3+
StackedPolymorphicInline,
4+
PolymorphicInlineSupportMixin,
5+
PolymorphicChildModelAdmin,
6+
PolymorphicChildModelFilter,
7+
PolymorphicParentModelAdmin,
8+
)
9+
10+
from polymorphic.tests.models import (
11+
PlainA,
12+
Model2A,
13+
Model2B,
14+
Model2C,
15+
Model2D,
16+
InlineModelA,
17+
InlineModelB,
18+
InlineParent,
19+
)
20+
21+
22+
@register(Model2A)
23+
class Model2Admin(PolymorphicParentModelAdmin):
24+
list_filter = (PolymorphicChildModelFilter,)
25+
child_models = (Model2B, Model2C, Model2D)
26+
27+
28+
admin_site.register(Model2B, PolymorphicChildModelAdmin)
29+
admin_site.register(Model2C, PolymorphicChildModelAdmin)
30+
admin_site.register(Model2D, PolymorphicChildModelAdmin)
431

532

633
@register(PlainA)

src/polymorphic/tests/test_admin.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,15 @@ def tearDown(self):
225225

226226
class StackedInlineTests(_GenericAdminFormTest):
227227
def setUp(self):
228+
Model2A.objects.all().delete()
228229
PlainA.objects.all().delete()
229230
InlineParent.objects.all().delete()
230231
super().setUp()
231232
for name in ["Brian", "Alice", "Emma", "Anna"]:
232233
PlainA.objects.create(field1=name)
233234

234235
def tearDown(self):
236+
Model2A.objects.all().delete()
235237
PlainA.objects.all().delete()
236238
InlineParent.objects.all().delete()
237239
super().tearDown()
@@ -278,3 +280,78 @@ def test_admin_inline_add_autocomplete(self):
278280

279281
suggestions = self.page.locator("ul.select2-results__options > li").all_inner_texts()
280282
assert suggestions == ["Brian"]
283+
284+
def test_admin_polymorphic_add(self):
285+
model2b_ct = ContentType.objects.get_for_model(Model2B)
286+
model2c_ct = ContentType.objects.get_for_model(Model2C)
287+
model2d_ct = ContentType.objects.get_for_model(Model2D)
288+
289+
for model_type, fields in [
290+
(
291+
model2b_ct,
292+
{
293+
"field1": "2B1",
294+
"field2": "2B2",
295+
},
296+
),
297+
(
298+
model2c_ct,
299+
{
300+
"field1": "2C1",
301+
"field2": "2C2",
302+
"field3": "2C3",
303+
},
304+
),
305+
(
306+
model2d_ct,
307+
{
308+
"field1": "2D1",
309+
"field2": "2D2",
310+
"field3": "2D3",
311+
"field4": "2D4",
312+
},
313+
),
314+
]:
315+
self.page.goto(self.add_url(Model2A))
316+
317+
# https://github.com/jazzband/django-polymorphic/pull/580
318+
expect(self.page.locator("div.breadcrumbs")).to_have_count(1)
319+
expect(self.page.locator("form#logout-form")).to_have_count(1)
320+
321+
self.page.locator(f"input[type=radio][value='{model_type.pk}']").check()
322+
with self.page.expect_navigation(timeout=10000) as nav_info:
323+
self.page.click("input[name='_save']")
324+
325+
response = nav_info.value
326+
assert response.status < 400
327+
328+
for field, value in fields.items():
329+
self.page.fill(f"input[name='{field}']", value)
330+
331+
with self.page.expect_navigation(timeout=10000) as nav_info:
332+
self.page.click("input[name='_save']")
333+
334+
response = nav_info.value
335+
assert response.status < 400
336+
337+
assert Model2A.objects.count() == 3
338+
339+
object_ids = [int(oid) for oid in self.get_object_ids(Model2A)]
340+
341+
assert len(object_ids) == 3
342+
343+
assert Model2B.objects.first().pk in object_ids
344+
assert Model2C.objects.first().pk in object_ids
345+
assert Model2D.objects.first().pk in object_ids
346+
347+
assert Model2B.objects.first().field1 == "2B1"
348+
assert Model2B.objects.first().field2 == "2B2"
349+
350+
assert Model2C.objects.first().field1 == "2C1"
351+
assert Model2C.objects.first().field2 == "2C2"
352+
assert Model2C.objects.first().field3 == "2C3"
353+
354+
assert Model2D.objects.first().field1 == "2D1"
355+
assert Model2D.objects.first().field2 == "2D2"
356+
assert Model2D.objects.first().field3 == "2D3"
357+
assert Model2D.objects.first().field4 == "2D4"

0 commit comments

Comments
 (0)