Skip to content

Commit 22a3fc9

Browse files
committed
Added check for the permission to change permissions before running the admin action. Updated docs.
1 parent 6a2b56a commit 22a3fc9

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

docs/handling_admin.txt

+8-9
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@ Handling permissions using Django's admin interface
66

77
*to be written*
88

9+
.. note:: Django admin actions are available in Django 1.1 or later.
10+
911
Apply permissions using Django's admin actions
1012
==============================================
1113

12-
.. note:: Django admin actions are available in Django 1.1 or later.
14+
This feature is limited to superusers and users with either the
15+
"Can change permission" (``change_permission``) or the
16+
"Can change foreign permission" (``change_foreign_permission``) `permission`_.
1317

1418
.. image:: .static/admin-action-permission.png
19+
.. _permission: http://docs.djangoproject.com/en/dev/topics/auth/#permissions
1520

1621
Disable the admin action site-wide
1722
----------------------------------
@@ -22,13 +27,7 @@ One of your app ``admin.py`` files might be a good place::
2227
admin.site.disable_action('edit_permissions')
2328

2429
Further informations are available in Django's documentation:
25-
`Disabling a site-wide action`_. If you encounter an error like::
26-
27-
Exception Type: KeyError at /admin/weblog/entry/
28-
Exception Value: 'edit_permissions'
29-
30-
Make sure you placed ``authority.autodiscover()`` before ``admin.autodiscover()``.
31-
See :ref:`configuration` for details.
30+
`Disabling a site-wide action`_.
3231

3332
.. _Disabling a site-wide action: http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-a-site-wide-action
3433

@@ -48,4 +47,4 @@ action within the ``get_actions`` method. Here is an example::
4847
Further informations are available in Django's documentation:
4948
`Conditionally enabling or disabling actions`_.
5049

51-
.. _Conditionally enabling or disabling actions: http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#conditionally-enabling-or-disabling-actions
50+
.. _Conditionally enabling or disabling actions: http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#conditionally-enabling-or-disabling-actions

src/authority/admin.py

+8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from django.contrib.admin import helpers
1010
from django.contrib.contenttypes import generic
1111
from django.contrib.contenttypes.models import ContentType
12+
from django.core.exceptions import PermissionDenied
1213

1314
try:
1415
from django.contrib.admin import actions
@@ -46,6 +47,13 @@ def __init__(self, inline_formsets):
4647
def edit_permissions(modeladmin, request, queryset):
4748
opts = modeladmin.model._meta
4849
app_label = opts.app_label
50+
51+
# Check that the user has the permission to edit permissions
52+
if not (request.user.is_superuser or
53+
request.user.has_perm('authority.change_permission') or
54+
request.user.has_perm('authority.change_foreign_permissions')):
55+
raise PermissionDenied
56+
4957
inline = ActionPermissionInline(queryset.model, modeladmin.admin_site)
5058
formsets = []
5159
for obj in queryset:

0 commit comments

Comments
 (0)