From 7a89d3d503cad96689fee3028a218ff5456f73f1 Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Sun, 2 Jan 2011 01:32:40 +0000 Subject: [PATCH] Fixed #11700 -- Stopped admin actions and list_editable fields to show up in popups. Thanks to Simon Meers for the initial patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@15129 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/admin/options.py | 7 ++++--- django/contrib/admin/views/main.py | 5 ++++- tests/regressiontests/admin_views/tests.py | 18 +++++++++++++++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 6fd14d83d47..d1f02be843b 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -535,7 +535,8 @@ class ModelAdmin(BaseModelAdmin): """ # If self.actions is explicitally set to None that means that we don't # want *any* actions enabled on this page. - if self.actions is None: + from django.contrib.admin.views.main import IS_POPUP_VAR + if self.actions is None or IS_POPUP_VAR in request.GET: return [] actions = [] @@ -1081,7 +1082,7 @@ class ModelAdmin(BaseModelAdmin): formset = cl.formset = None # Handle POSTed bulk-edit data. - if (request.method == "POST" and self.list_editable and + if (request.method == "POST" and cl.list_editable and '_save' in request.POST and not action_failed): FormSet = self.get_changelist_formset(request) formset = cl.formset = FormSet(request.POST, request.FILES, queryset=cl.result_list) @@ -1111,7 +1112,7 @@ class ModelAdmin(BaseModelAdmin): return HttpResponseRedirect(request.get_full_path()) # Handle GET -- construct a formset for display. - elif self.list_editable: + elif cl.list_editable: FormSet = self.get_changelist_formset(request) formset = cl.formset = FormSet(queryset=cl.result_list) diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index 0b98f11a499..886ccd9be75 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -39,7 +39,6 @@ class ChangeList(object): self.search_fields = search_fields self.list_select_related = list_select_related self.list_per_page = list_per_page - self.list_editable = list_editable self.model_admin = model_admin # Get search parameters from the query string. @@ -58,6 +57,10 @@ class ChangeList(object): if ERROR_FLAG in self.params: del self.params[ERROR_FLAG] + if self.is_popup: + self.list_editable = () + else: + self.list_editable = list_editable self.order_field, self.order_type = self.get_ordering() self.query = request.GET.get(SEARCH_VAR, '') self.query_set = self.get_query_set() diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 75c6698db10..eb35b418609 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -16,6 +16,7 @@ from django.contrib.admin.models import LogEntry, DELETION from django.contrib.admin.sites import LOGIN_FORM_KEY from django.contrib.admin.util import quote from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME +from django.contrib.admin.views.main import IS_POPUP_VAR from django.forms.util import ErrorList import django.template.context from django.test import TestCase @@ -1450,7 +1451,14 @@ class AdminViewListEditable(TestCase): self.assertEqual(Person.objects.get(name="John Mauchly").alive, False) self.assertEqual(Person.objects.get(name="Grace Hopper").gender, 2) - + def test_list_editable_popup(self): + """ + Fields should not be list-editable in popups. + """ + response = self.client.get('/test_admin/admin/admin_views/person/') + self.assertNotEqual(response.context['cl'].list_editable, ()) + response = self.client.get('/test_admin/admin/admin_views/person/?%s' % IS_POPUP_VAR) + self.assertEqual(response.context['cl'].list_editable, ()) class AdminSearchTest(TestCase): @@ -1701,6 +1709,14 @@ class AdminActionsTest(TestCase): response = self.client.get('/test_admin/admin/admin_views/subscriber/') self.assertContains(response, '0 of 2 selected') + def test_popup_actions(self): + """ Actions should not be shown in popups. """ + response = self.client.get('/test_admin/admin/admin_views/subscriber/') + self.assertNotEquals(response.context["action_form"], None) + response = self.client.get( + '/test_admin/admin/admin_views/subscriber/?%s' % IS_POPUP_VAR) + self.assertEquals(response.context["action_form"], None) + class TestCustomChangeList(TestCase): fixtures = ['admin-views-users.xml']