From 59e387883592ad0a07aadcc2eca329b3beaec515 Mon Sep 17 00:00:00 2001 From: Diederik van der Boor Date: Tue, 9 Aug 2016 01:21:37 +0200 Subject: [PATCH] Add detection for missing PolymorphicInlineSupportMixin --- polymorphic/admin/inlines.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/polymorphic/admin/inlines.py b/polymorphic/admin/inlines.py index fc1657c..779625f 100644 --- a/polymorphic/admin/inlines.py +++ b/polymorphic/admin/inlines.py @@ -7,10 +7,12 @@ from functools import partial from django.contrib.admin.options import InlineModelAdmin from django.contrib.admin.utils import flatten_fieldsets +from django.core.exceptions import ImproperlyConfigured from django.forms import Media from polymorphic.formsets import polymorphic_child_forms_factory, BasePolymorphicInlineFormSet, PolymorphicFormSetChild from polymorphic.formsets.utils import add_media +from .helpers import PolymorphicInlineSupportMixin class PolymorphicInlineModelAdmin(InlineModelAdmin): @@ -50,6 +52,16 @@ class PolymorphicInlineModelAdmin(InlineModelAdmin): def __init__(self, parent_model, admin_site): super(PolymorphicInlineModelAdmin, self).__init__(parent_model, admin_site) + # Extra check to avoid confusion + # While we could monkeypatch the admin here, better stay explicit. + parent_admin = admin_site._registry.get(parent_model, None) + if parent_admin is not None: # Can be None during check + if not isinstance(parent_admin, PolymorphicInlineSupportMixin): + raise ImproperlyConfigured( + "To use polymorphic inlines, add the `PolymorphicInlineSupportMixin` mixin " + "to the ModelAdmin that hosts the inline." + ) + # While the inline is created per request, the 'request' object is not known here. # Hence, creating all child inlines unconditionally, without checking permissions. self.child_inline_instances = self.get_child_inline_instances()