diff options
| author | Przemysław Buczkowski <przemub@creditdigital.co.uk> | 2018-09-13 13:36:14 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-10-02 09:17:23 -0400 |
| commit | 70d0a1ca02f42c0f8984b6234ca0f9d7e354a135 (patch) | |
| tree | 11a9e6d5c92e55124567da316204f977bd3ef0ca | |
| parent | 7598cd4748dc402b0209e5eedb6d2a83c3da1620 (diff) | |
Fixed #29711 -- Added a system check for uniquness of admin actions' __name__.
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/contrib/admin/checks.py | 13 | ||||
| -rw-r--r-- | docs/ref/checks.txt | 2 | ||||
| -rw-r--r-- | tests/modeladmin/test_checks.py | 27 |
4 files changed, 43 insertions, 0 deletions
@@ -686,6 +686,7 @@ answer newbie questions, and generally made Django that much better: Preston Holmes <preston@ptone.com> Preston Timmons <prestontimmons@gmail.com> Priyansh Saxena <askpriyansh@gmail.com> + Przemysław Buczkowski <przemub@przemub.pl> Przemysław Suliga <http://suligap.net> Rachel Tobin <rmtobin@me.com> Rachel Willmer <http://www.willmer.com/kb/> diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py index d129acb124..4007a781fb 100644 --- a/django/contrib/admin/checks.py +++ b/django/contrib/admin/checks.py @@ -606,6 +606,7 @@ class ModelAdminChecks(BaseModelAdminChecks): *self._check_search_fields(admin_obj), *self._check_date_hierarchy(admin_obj), *self._check_action_permission_methods(admin_obj), + *self._check_actions_uniqueness(admin_obj), ] def _check_save_as(self, obj): @@ -944,6 +945,18 @@ class ModelAdminChecks(BaseModelAdminChecks): ) return errors + def _check_actions_uniqueness(self, obj): + """Check that every action has a unique __name__.""" + names = [name for _, name, _ in obj._get_base_actions()] + if len(names) != len(set(names)): + return [checks.Error( + '__name__ attributes of actions defined in %s must be ' + 'unique.' % obj.__class__, + obj=obj.__class__, + id='admin.E130', + )] + return [] + class InlineModelAdminChecks(BaseModelAdminChecks): diff --git a/docs/ref/checks.txt b/docs/ref/checks.txt index 67813067f2..c8b13aa100 100644 --- a/docs/ref/checks.txt +++ b/docs/ref/checks.txt @@ -593,6 +593,8 @@ with the admin site: ``DateTimeField``. * **admin.E129**: ``<modeladmin>`` must define a ``has_<foo>_permission()`` method for the ``<action>`` action. +* **admin.E130**: ``__name__`` attributes of actions defined in + ``<modeladmin>`` must be unique. ``InlineModelAdmin`` ~~~~~~~~~~~~~~~~~~~~ diff --git a/tests/modeladmin/test_checks.py b/tests/modeladmin/test_checks.py index 6a10441471..89fde35d3c 100644 --- a/tests/modeladmin/test_checks.py +++ b/tests/modeladmin/test_checks.py @@ -1309,3 +1309,30 @@ class ActionsCheckTests(CheckTestCase): 'custom_permission_action action.', id='admin.E129', ) + + def test_actions_not_unique(self): + def action(modeladmin, request, queryset): + pass + + class BandAdmin(ModelAdmin): + actions = (action, action) + + self.assertIsInvalid( + BandAdmin, Band, + "__name__ attributes of actions defined in " + "<class 'modeladmin.test_checks.ActionsCheckTests." + "test_actions_not_unique.<locals>.BandAdmin'> must be unique.", + id='admin.E130', + ) + + def test_actions_unique(self): + def action1(modeladmin, request, queryset): + pass + + def action2(modeladmin, request, queryset): + pass + + class BandAdmin(ModelAdmin): + actions = (action1, action2) + + self.assertIsValid(BandAdmin, Band) |
