From 9f92f894b8c171f71632d3e59fe4e57dde7814d2 Mon Sep 17 00:00:00 2001 From: Andy Babic Date: Fri, 7 Oct 2016 23:29:48 +0100 Subject: [PATCH] Improve consistency of modeladmin views --- CHANGELOG.txt | 1 + docs/releases/1.8.rst | 1 + wagtail/contrib/modeladmin/views.py | 92 ++++++++++++++++------------- 3 files changed, 53 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index ff1b080663..01052bb538 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -12,6 +12,7 @@ Changelog * Fix: Use specific page model for the parent page in the explore index (Gagaro) * Fix: Remove responsive styles in embed when there is no ratio available (Gagaro) * Fix: Parent page link in page search modal no longer disappears on hover (Dan Braghis) + * Fix: ModelAdmin views now consistently call `get_context_data` (Andy Babic) 1.7 (20.10.2016) diff --git a/docs/releases/1.8.rst b/docs/releases/1.8.rst index 9ca95a427b..a501b848e2 100644 --- a/docs/releases/1.8.rst +++ b/docs/releases/1.8.rst @@ -27,6 +27,7 @@ Bug fixes * Use specific page model for the parent page in the explore index (Gagaro) * Remove responsive styles in embed when there is no ratio available (Gagaro) * Parent page link in page search modal no longer disappears on hover (Dan Braghis) + * ModelAdmin views now consistently call ``get_context_data`` (Andy Babic) Upgrade considerations diff --git a/wagtail/contrib/modeladmin/views.py b/wagtail/contrib/modeladmin/views.py index 4f8d79adc1..7a1580eb90 100644 --- a/wagtail/contrib/modeladmin/views.py +++ b/wagtail/contrib/modeladmin/views.py @@ -19,7 +19,7 @@ from django.db.models.constants import LOOKUP_SEP from django.db.models.fields import FieldDoesNotExist from django.db.models.fields.related import ForeignObjectRel, ManyToManyField from django.db.models.sql.constants import QUERY_TERMS -from django.shortcuts import get_object_or_404, redirect, render +from django.shortcuts import get_object_or_404, redirect from django.template.defaultfilters import filesizeformat from django.utils import six from django.utils.decorators import method_decorator @@ -100,6 +100,14 @@ class WMABaseView(TemplateView): def get_base_queryset(self, request=None): return self.model_admin.get_queryset(request or self.request) + def get_context_data(self, **kwargs): + context = { + 'view': self, + 'model_admin': self.model_admin, + } + context.update(kwargs) + return super(WMABaseView, self).get_context_data(**kwargs) + class ModelFormView(WMABaseView, FormView): @@ -133,18 +141,16 @@ class ModelFormView(WMABaseView, FormView): ) def get_context_data(self, **kwargs): - context = super(ModelFormView, self).get_context_data(**kwargs) instance = self.get_instance() edit_handler_class = self.get_edit_handler_class() form = self.get_form() - context.update({ - 'view': self, - 'model_admin': self.model_admin, + context = { 'is_multipart': form.is_multipart(), 'edit_handler': edit_handler_class(instance=instance, form=form), 'form': form, - }) - return context + } + context.update(kwargs) + return super(ModelFormView, self).get_context_data(**context) def get_success_message(self, instance): return _("{model_name} '{instance}' created.").format( @@ -200,10 +206,14 @@ class InstanceSpecificView(WMABaseView): def delete_url(self): return self.url_helper.get_action_url('delete', self.pk_quoted) + def get_context_data(self, **kwargs): + context = {'instance': self.instance} + context.update(kwargs) + return super(InstanceSpecificView, self).get_context_data(**context) + class IndexView(WMABaseView): - # IndexView settings ORDER_VAR = 'o' ORDER_TYPE_VAR = 'ot' PAGE_VAR = 'p' @@ -607,7 +617,7 @@ class IndexView(WMABaseView): return True return False - def get_context_data(self, *args, **kwargs): + def get_context_data(self, **kwargs): user = self.request.user all_count = self.get_base_queryset().count() queryset = self.get_queryset() @@ -638,7 +648,9 @@ class IndexView(WMABaseView): 'no_valid_parents': not valid_parent_count, 'required_parent_types': allowed_parent_types, }) - return context + + context.update(kwargs) + return super(IndexView, self).get_context_data(**context) def get_template_names(self): return self.model_admin.get_index_template() @@ -701,9 +713,12 @@ class EditView(ModelFormView, InstanceSpecificView): model_name=capfirst(self.verbose_name), instance=instance) def get_context_data(self, **kwargs): - kwargs['user_can_delete'] = self.permission_helper.user_can_delete_obj( - self.request.user, self.instance) - return super(EditView, self).get_context_data(**kwargs) + context = { + 'user_can_delete': self.permission_helper.user_can_delete_obj( + self.request.user, self.instance) + } + context.update(kwargs) + return super(EditView, self).get_context_data(**context) def get_error_message(self): name = self.verbose_name @@ -728,20 +743,25 @@ class ChooseParentView(WMABaseView): def get(self, request, *args, **kwargs): form = self.get_form(request) - context = {'view': self, 'form': form} - return render(request, self.get_template(), context) + context = self.get_context_data(form=form) + return self.render_to_response(context) def post(self, request, *args, **kargs): form = self.get_form(request) if form.is_valid(): - parent_pk = quote(form.cleaned_data['parent_page'].pk) - return redirect(self.url_helper.get_action_url( - 'add', self.app_label, self.model_name, parent_pk)) + return self.form_valid(form) + return self.form_invalid(form) - context = {'view': self, 'form': form} - return render(request, self.get_template(), context) + def form_valid(self, form): + parent_pk = quote(form.cleaned_data['parent_page'].pk) + return redirect(self.url_helper.get_action_url( + 'add', self.app_label, self.model_name, parent_pk)) - def get_template(self): + def form_invalid(self, form): + context = self.get_context_data(form=form) + return self.render_to_response(context) + + def get_template_names(self): return self.model_admin.get_choose_parent_template() @@ -770,10 +790,6 @@ class DeleteView(InstanceSpecificView): "site are related to it, they may also be affected." ) % self.verbose_name - def get(self, request, *args, **kwargs): - context = {'view': self, 'instance': self.instance} - return self.render_to_response(context) - def delete_instance(self): self.instance.delete() @@ -794,13 +810,10 @@ class DeleteView(InstanceSpecificView): qs = getattr(self.instance, rel.get_accessor_name()) for obj in qs.all(): linked_objects.append(obj) - - context = { - 'view': self, - 'instance': self.instance, - 'protected_error': True, - 'linked_objects': linked_objects, - } + context = self.get_context_data( + protected_error=True, + linked_objects=linked_objects + ) return self.render_to_response(context) def get_template_names(self): @@ -920,16 +933,13 @@ class InspectView(InstanceSpecificView): return fields def get_context_data(self, **kwargs): - context = super(InspectView, self).get_context_data(**kwargs) - buttons = self.button_helper.get_buttons_for_obj( - self.instance, exclude=['inspect']) - context.update({ - 'view': self, + context = { 'fields': self.get_fields_dict(), - 'buttons': buttons, - 'instance': self.instance, - }) - return context + 'buttons': self.button_helper.get_buttons_for_obj( + self.instance, exclude=['inspect']), + } + context.update(kwargs) + return super(InspectView, self).get_context_data(**context) def get_template_names(self): return self.model_admin.get_inspect_template()