summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authortschilling <schillingt@better-simple.com>2013-09-03 21:01:45 -0400
committerTim Graham <timograham@gmail.com>2013-09-20 07:47:24 -0400
commit0d1ba84d13eb6000c9f6e54b03d52863fcd31f27 (patch)
tree02f448190c944e7c7fcdf45e41adad71db1b4da3 /django
parentf8f47718abb4c93ef00f93dde42101a8dd17a700 (diff)
Fixed #20702 -- Deprecated get_formsets in favor of get_formsets_with_inlines.
Thanks stanislas.guerra at gmail.com for the report.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/admin/options.py59
1 files changed, 48 insertions, 11 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 937bbd1ebb..c5096076a9 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -602,10 +602,48 @@ class ModelAdmin(BaseModelAdmin):
self.get_changelist_form(request), extra=0,
fields=self.list_editable, **defaults)
- def get_formsets(self, request, obj=None):
+ def _get_formsets(self, request, obj):
+ """
+ Helper function that exists to allow the deprecation warning to be
+ executed while this function continues to return a generator.
+ """
for inline in self.get_inline_instances(request, obj):
yield inline.get_formset(request, obj)
+ def get_formsets(self, request, obj=None):
+ warnings.warn(
+ "ModelAdmin.get_formsets() is deprecated and will be removed in "
+ "Django 1.9. Use ModelAdmin.get_formsets_with_inlines() instead.",
+ PendingDeprecationWarning, stacklevel=2
+ )
+ return self._get_formsets(request, obj)
+
+ def get_formsets_with_inlines(self, request, obj=None):
+ """
+ Yields formsets and the corresponding inlines.
+ """
+ # We call get_formsets() [deprecated] and check if it triggers a
+ # warning. If it does, then it's ours and we can safely ignore it, but
+ # if it doesn't then it has been overridden so we must warn about the
+ # deprecation.
+ with warnings.catch_warnings(record=True) as w:
+ warnings.simplefilter("always")
+ formsets = self.get_formsets(request, obj)
+
+ if len(w) != 1 or not issubclass(w[0].category, PendingDeprecationWarning):
+ warnings.warn(
+ "ModelAdmin.get_formsets() is deprecated and will be removed in "
+ "Django 1.9. Use ModelAdmin.get_formsets_with_inlines() instead.",
+ PendingDeprecationWarning
+ )
+ if formsets:
+ zipped = zip(formsets, self.get_inline_instances(request, None))
+ for formset, inline in zipped:
+ yield formset, inline
+ else:
+ for inline in self.get_inline_instances(request, obj):
+ yield inline.get_formset(request, obj), inline
+
def get_paginator(self, request, queryset, per_page, orphans=0, allow_empty_first_page=True):
return self.paginator(queryset, per_page, orphans, allow_empty_first_page)
@@ -1185,8 +1223,6 @@ class ModelAdmin(BaseModelAdmin):
raise PermissionDenied
ModelForm = self.get_form(request)
- formsets = []
- inline_instances = self.get_inline_instances(request, None)
if request.method == 'POST':
form = ModelForm(request.POST, request.FILES)
if form.is_valid():
@@ -1195,7 +1231,7 @@ class ModelAdmin(BaseModelAdmin):
else:
form_validated = False
new_object = self.model()
- formsets = self._create_formsets(request, new_object, inline_instances)
+ formsets, inline_instances = self._create_formsets(request, new_object)
if all_valid(formsets) and form_validated:
self.save_model(request, new_object, form, False)
self.save_related(request, form, formsets, False)
@@ -1213,7 +1249,7 @@ class ModelAdmin(BaseModelAdmin):
if isinstance(f, models.ManyToManyField):
initial[k] = initial[k].split(",")
form = ModelForm(initial=initial)
- formsets = self._create_formsets(request, self.model(), inline_instances)
+ formsets, inline_instances = self._create_formsets(request, self.model())
adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
self.get_prepopulated_fields(request),
@@ -1266,7 +1302,6 @@ class ModelAdmin(BaseModelAdmin):
current_app=self.admin_site.name))
ModelForm = self.get_form(request, obj)
- inline_instances = self.get_inline_instances(request, obj)
if request.method == 'POST':
form = ModelForm(request.POST, request.FILES, instance=obj)
if form.is_valid():
@@ -1275,7 +1310,7 @@ class ModelAdmin(BaseModelAdmin):
else:
form_validated = False
new_object = obj
- formsets = self._create_formsets(request, new_object, inline_instances)
+ formsets, inline_instances = self._create_formsets(request, new_object)
if all_valid(formsets) and form_validated:
self.save_model(request, new_object, form, True)
self.save_related(request, form, formsets, True)
@@ -1285,7 +1320,7 @@ class ModelAdmin(BaseModelAdmin):
else:
form = ModelForm(instance=obj)
- formsets = self._create_formsets(request, obj, inline_instances)
+ formsets, inline_instances = self._create_formsets(request, obj)
adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj),
self.get_prepopulated_fields(request, obj),
@@ -1566,14 +1601,15 @@ class ModelAdmin(BaseModelAdmin):
"admin/object_history.html"
], context, current_app=self.admin_site.name)
- def _create_formsets(self, request, obj, inline_instances):
+ def _create_formsets(self, request, obj):
"Helper function to generate formsets for add/change_view."
formsets = []
+ inline_instances = []
prefixes = {}
get_formsets_args = [request]
if obj.pk:
get_formsets_args.append(obj)
- for FormSet, inline in zip(self.get_formsets(*get_formsets_args), inline_instances):
+ for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args):
prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1 or not prefix:
@@ -1590,7 +1626,8 @@ class ModelAdmin(BaseModelAdmin):
'save_as_new': '_saveasnew' in request.POST
})
formsets.append(FormSet(**formset_params))
- return formsets
+ inline_instances.append(inline)
+ return formsets, inline_instances
class InlineModelAdmin(BaseModelAdmin):