From 02b71d8ba9b730aaf78b7775b968d26978ac77e8 Mon Sep 17 00:00:00 2001 From: Diederik van der Boor Date: Mon, 20 Nov 2017 15:22:03 +0100 Subject: [PATCH 1/3] Improve fix of PR #321 checking hasattr(self, 'fieldsets') alway returns true, and produces different effects. The hasattr(self, 'declared_fieldsets') was designed to detect whether Django injected that attribute. Amends: 5e150ea85ab7821adf9bdb730979ef89546ecc0a --- polymorphic/admin/childadmin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polymorphic/admin/childadmin.py b/polymorphic/admin/childadmin.py index bc10bc5..4255eda 100644 --- a/polymorphic/admin/childadmin.py +++ b/polymorphic/admin/childadmin.py @@ -183,7 +183,7 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): def get_fieldsets(self, request, obj=None): # If subclass declares fieldsets or fields, this is respected - if hasattr(self, 'fieldsets') or hasattr(self, 'fields') or not self.base_fieldsets: + if self.fieldsets or or self.fields or not self.base_fieldsets: return super(PolymorphicChildModelAdmin, self).get_fieldsets(request, obj) # Have a reasonable default fieldsets, From 15426dc695f67a06ce46539b3f44208057bb67a5 Mon Sep 17 00:00:00 2001 From: Tadas Dailyda Date: Mon, 20 Nov 2017 16:15:10 +0200 Subject: [PATCH 2/3] further childadmin fieldsets improvements --- polymorphic/admin/childadmin.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/polymorphic/admin/childadmin.py b/polymorphic/admin/childadmin.py index 4255eda..41d12bb 100644 --- a/polymorphic/admin/childadmin.py +++ b/polymorphic/admin/childadmin.py @@ -62,6 +62,10 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): # If the derived class sets the model explicitly, respect that setting. kwargs.setdefault('form', self.base_form or self.form) + # prevent infinite recursion when this is called from get_subclass_fields + if not hasattr(self, 'fieldsets') and not hasattr(self, 'fields'): + kwargs.setdefault('fields', None) + return super(PolymorphicChildModelAdmin, self).get_form(request, obj, **kwargs) def get_model_perms(self, request): @@ -181,9 +185,14 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): # ---- Extra: improving the form/fieldset default display ---- + def get_base_fieldsets(self, request, obj=None): + return self.base_fieldsets + def get_fieldsets(self, request, obj=None): + base_fieldsets = self.get_base_fieldsets(request, obj) + # If subclass declares fieldsets or fields, this is respected - if self.fieldsets or or self.fields or not self.base_fieldsets: + if self.fieldsets or self.fields or not self.base_fieldsets: return super(PolymorphicChildModelAdmin, self).get_fieldsets(request, obj) # Have a reasonable default fieldsets, @@ -192,11 +201,11 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): if other_fields: return ( - self.base_fieldsets[0], + base_fieldsets[0], (self.extra_fieldset_title, {'fields': other_fields}), - ) + self.base_fieldsets[1:] + ) + base_fieldsets[1:] else: - return self.base_fieldsets + return base_fieldsets def get_subclass_fields(self, request, obj=None): # Find out how many fields would really be on the form, @@ -210,7 +219,7 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): subclass_fields = list(six.iterkeys(form.base_fields)) + list(self.get_readonly_fields(request, obj)) # Find which fields are not part of the common fields. - for fieldset in self.base_fieldsets: + for fieldset in self.get_base_fieldsets(request, obj): for field in fieldset[1]['fields']: try: subclass_fields.remove(field) From 180df8e98c84df02c06412adb0c8c29a44ba9330 Mon Sep 17 00:00:00 2001 From: Tadas Dailyda Date: Mon, 20 Nov 2017 17:34:05 +0200 Subject: [PATCH 3/3] fix detecting whether childadmin has explicitly defined fields/fieldsets --- polymorphic/admin/childadmin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/polymorphic/admin/childadmin.py b/polymorphic/admin/childadmin.py index 41d12bb..2695d1a 100644 --- a/polymorphic/admin/childadmin.py +++ b/polymorphic/admin/childadmin.py @@ -63,8 +63,8 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): kwargs.setdefault('form', self.base_form or self.form) # prevent infinite recursion when this is called from get_subclass_fields - if not hasattr(self, 'fieldsets') and not hasattr(self, 'fields'): - kwargs.setdefault('fields', None) + if not self.fieldsets and not self.fields: + kwargs.setdefault('fields', '__all__') return super(PolymorphicChildModelAdmin, self).get_form(request, obj, **kwargs)