summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Donaghy <adamdonaghy1994@gmail.com>2020-01-06 22:10:40 +1100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-01-10 14:00:28 +0100
commit8b3e714ecf409ed6c9628c3f2a4e033cbfa4253b (patch)
treea73fd0ff983283482318a9465d0beb3ccefb5497
parente2d9d66a22f9004c0349f6aa9f8762fa558bdee8 (diff)
Fixed #30980 -- Improved error message when checking uniqueness of admin actions' __name__.
Thanks Keshav Kumar for the initial patch.
-rw-r--r--django/contrib/admin/checks.py24
-rw-r--r--docs/ref/checks.txt2
-rw-r--r--tests/modeladmin/test_checks.py5
3 files changed, 18 insertions, 13 deletions
diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py
index 0c32301284..ba754bd873 100644
--- a/django/contrib/admin/checks.py
+++ b/django/contrib/admin/checks.py
@@ -1,3 +1,4 @@
+import collections
from itertools import chain
from django.apps import apps
@@ -985,15 +986,20 @@ class ModelAdminChecks(BaseModelAdminChecks):
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 []
+ errors = []
+ names = collections.Counter(name for _, name, _ in obj._get_base_actions())
+ for name, count in names.items():
+ if count > 1:
+ errors.append(checks.Error(
+ '__name__ attributes of actions defined in %s must be '
+ 'unique. Name %r is not unique.' % (
+ obj.__class__.__name__,
+ name,
+ ),
+ obj=obj.__class__,
+ id='admin.E130',
+ ))
+ return errors
class InlineModelAdminChecks(BaseModelAdminChecks):
diff --git a/docs/ref/checks.txt b/docs/ref/checks.txt
index fcbfec98cb..a080b5bdf5 100644
--- a/docs/ref/checks.txt
+++ b/docs/ref/checks.txt
@@ -633,7 +633,7 @@ with the admin site:
* **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.
+ ``<modeladmin>`` must be unique. Name ``<name>`` is not unique.
``InlineModelAdmin``
~~~~~~~~~~~~~~~~~~~~
diff --git a/tests/modeladmin/test_checks.py b/tests/modeladmin/test_checks.py
index 98cc56d67c..308f4a19eb 100644
--- a/tests/modeladmin/test_checks.py
+++ b/tests/modeladmin/test_checks.py
@@ -1441,9 +1441,8 @@ class ActionsCheckTests(CheckTestCase):
self.assertIsInvalid(
BandAdmin, Band,
- "__name__ attributes of actions defined in "
- "<class 'modeladmin.test_checks.ActionsCheckTests."
- "test_actions_not_unique.<locals>.BandAdmin'> must be unique.",
+ "__name__ attributes of actions defined in BandAdmin must be "
+ "unique. Name 'action' is not unique.",
id='admin.E130',
)