-
{% block object-tools-items %}
+ {% if has_add_permission %}
- {% url cl.opts|admin_urlname:'add' as add_url %} {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} + {% endif %} {% endblock %}
diff --git a/docs/releases/1.10.txt b/docs/releases/1.10.txt index 31e15663ba7..34294e901af 100644 --- a/docs/releases/1.10.txt +++ b/docs/releases/1.10.txt @@ -47,6 +47,10 @@ Minor features classes on inline fieldsets. Inlines with a ``collapse`` class will be initially collapsed and their header will have a small "show" link. +* If a user doesn't have the add permission, the ``object-tools`` block on a + model's changelist will now be rendered (without the add button, of course). + This makes it easier to add custom tools in this case. + :mod:`django.contrib.admindocs` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/admin_changelist/admin.py b/tests/admin_changelist/admin.py index 4ca5ae587a6..51d183dfdbc 100644 --- a/tests/admin_changelist/admin.py +++ b/tests/admin_changelist/admin.py @@ -22,6 +22,9 @@ class EventAdmin(admin.ModelAdmin): def event_date_func(self, event): return event.date + def has_add_permission(self, request): + return False + site.register(Event, EventAdmin) diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py index 93910dc3b00..81bf3bdfc6d 100644 --- a/tests/admin_changelist/tests.py +++ b/tests/admin_changelist/tests.py @@ -21,9 +21,10 @@ from .admin import ( BandAdmin, ChildAdmin, ChordsBandAdmin, ConcertAdmin, CustomPaginationAdmin, CustomPaginator, DynamicListDisplayChildAdmin, DynamicListDisplayLinksChildAdmin, DynamicListFilterChildAdmin, - DynamicSearchFieldsChildAdmin, EmptyValueChildAdmin, FilteredChildAdmin, - GroupAdmin, InvitationAdmin, NoListDisplayLinksParentAdmin, ParentAdmin, - QuartetAdmin, SwallowAdmin, site as custom_site, + DynamicSearchFieldsChildAdmin, EmptyValueChildAdmin, EventAdmin, + FilteredChildAdmin, GroupAdmin, InvitationAdmin, + NoListDisplayLinksParentAdmin, ParentAdmin, QuartetAdmin, SwallowAdmin, + site as custom_site, ) from .models import ( Band, Child, ChordsBand, ChordsMusician, Concert, CustomIdUser, Event, @@ -761,6 +762,20 @@ class ChangeListTests(TestCase): list(real_page_range), ) + def test_object_tools_displayed_no_add_permission(self): + """ + When ModelAdmin.has_add_permission() returns False, the object-tools + block is still shown. + """ + superuser = self._create_superuser('superuser') + m = EventAdmin(Event, custom_site) + request = self._mocked_authenticated_request('/event/', superuser) + self.assertFalse(m.has_add_permission(request)) + response = m.changelist_view(request) + self.assertIn('
- ', response.rendered_content)
+ # The "Add" button inside the object-tools shouldn't appear.
+ self.assertNotIn('Add', response.rendered_content)
+
class AdminLogNodeTestCase(TestCase):