Skip to content

Commit 4dfb224

Browse files
newforms-admin: Added has_add_permission(), has_change_permission() and has_delete_permission() hooks to ModelAdminView. This hook can be used to implement per-object permissions.
git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@4324 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent a828114 commit 4dfb224

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

django/contrib/admin/views/main.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ class ModelAdminView(object):
118118
"Class that encapsulates all admin views for a given model."
119119
def __init__(self, model):
120120
self.model = model
121+
self.opts = model._meta
121122

122123
def __call__(self, request, url):
123124
if url is None:
@@ -131,17 +132,38 @@ def __call__(self, request, url):
131132
else:
132133
return self.change_view(request, unquote(url))
133134

135+
def has_add_permission(self, request):
136+
"Returns True if the given request has permission to add an object."
137+
opts = self.opts
138+
return request.user.has_perm(opts.app_label + '.' + opts.get_add_permission())
139+
140+
def has_change_permission(self, request, object_id):
141+
"""
142+
Returns True if the given request has permission to change the object
143+
with the given object_id.
144+
"""
145+
opts = self.opts
146+
return request.user.has_perm(opts.app_label + '.' + opts.get_change_permission())
147+
148+
def has_delete_permission(self, request, object_id):
149+
"""
150+
Returns True if the given request has permission to change the object
151+
with the given object_id.
152+
"""
153+
opts = self.opts
154+
return request.user.has_perm(opts.app_label + '.' + opts.get_delete_permission())
155+
134156
def add_view(self, request, show_delete=False, form_url='', post_url=None, post_url_continue='../%s/', object_id_override=None):
135157
"The 'add' admin view for this model."
136158
model = self.model
137159
opts = model._meta
138160
app_label = opts.app_label
139161

140-
if not request.user.has_perm(app_label + '.' + opts.get_add_permission()):
162+
if not self.has_add_permission(request):
141163
raise PermissionDenied
142164

143165
if post_url is None:
144-
if request.user.has_perm(app_label + '.' + opts.get_change_permission()):
166+
if self.has_change_permission(request, None):
145167
# redirect to list view
146168
post_url = '../'
147169
else:
@@ -211,7 +233,7 @@ def change_view(self, request, object_id):
211233
opts = model._meta
212234
app_label = opts.app_label
213235

214-
if not request.user.has_perm(app_label + '.' + opts.get_change_permission()):
236+
if not self.has_change_permission(request, object_id):
215237
raise PermissionDenied
216238

217239
if request.POST and request.POST.has_key("_saveasnew"):
@@ -305,7 +327,7 @@ def change_list_view(self, request):
305327
"The 'change list' admin view for this model."
306328
opts = self.model._meta
307329
app_label = opts.app_label
308-
if not request.user.has_perm(app_label + '.' + opts.get_change_permission()):
330+
if not self.has_change_permission(request, None):
309331
raise PermissionDenied
310332
try:
311333
cl = ChangeList(request, self.model)
@@ -332,7 +354,7 @@ def delete_view(self, request, object_id):
332354
"The 'delete' admin view for this model."
333355
opts = self.model._meta
334356
app_label = opts.app_label
335-
if not request.user.has_perm(app_label + '.' + opts.get_delete_permission()):
357+
if not self.has_delete_permission(request, object_id):
336358
raise PermissionDenied
337359
obj = get_object_or_404(self.model, pk=object_id)
338360

0 commit comments

Comments
 (0)