aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework/permissions.py
diff options
context:
space:
mode:
authorTom Christie2012-02-11 13:00:38 +0000
committerTom Christie2012-02-11 13:00:38 +0000
commit88561a4ee2762409810b1aa7f85bda923169b69d (patch)
treea9477ee30ce71c9f730c49c83c3f8e14efe20975 /djangorestframework/permissions.py
parent0e97074fd7ec5de475cf6d787fde54f80c311d5b (diff)
downloaddjango-rest-framework-88561a4ee2762409810b1aa7f85bda923169b69d.tar.bz2
Fix up DjangoModelPermissions.
Diffstat (limited to 'djangorestframework/permissions.py')
-rw-r--r--djangorestframework/permissions.py66
1 files changed, 34 insertions, 32 deletions
diff --git a/djangorestframework/permissions.py b/djangorestframework/permissions.py
index cf556dd6..7c61251d 100644
--- a/djangorestframework/permissions.py
+++ b/djangorestframework/permissions.py
@@ -89,45 +89,47 @@ class IsUserOrIsAnonReadOnly(BasePermission):
raise _403_FORBIDDEN_RESPONSE
-class DjangoModelPermisson(BasePermission):
+class DjangoModelPermission(BasePermission):
"""
The request is authenticated against the Django user's permissions on the
- `Resource`'s `Model`, if the resource is a `ModelResource`.
- """
-
- def check_permission(self, user):
-
- # GET-style methods are always allowed.
- if self.view.request.method in ('GET', 'OPTIONS', 'HEAD',):
- return
+ `Resource`'s `Model`.
- klass = self.view.resource.model
-
- # If it doesn't look like a model, we can't check permissions.
- if not klass or not getattr(klass, '_meta', None):
- return
-
- # User must be logged in to check permissions.
- if not hasattr(self.view.request, 'user') or not self.view.request.user.is_authenticated():
- raise _403_FORBIDDEN_RESPONSE
+ This permission should only be used on views with a `ModelResource`.
+ """
- permission_map = {
- 'POST': ['%s.add_%s'],
- 'PUT': ['%s.change_%s'],
- 'DELETE': ['%s.delete_%s'],
- 'PATCH': ['%s.add_%s', '%s.change_%s', '%s.delete_%s'],
+ # Map methods into required permission codes.
+ # Override this if you need to also provide 'read' permissions,
+ # or other custom behaviour.
+ perms_map = {
+ 'GET': [],
+ 'OPTIONS': [],
+ 'HEAD': [],
+ 'POST': ['%(app_label)s.add_%(model_name)s'],
+ 'PUT': ['%(app_label)s.change_%(model_name)s'],
+ 'PATCH': ['%(app_label)s.change_%(model_name)s'],
+ 'DELETE': ['%(app_label)s.delete_%(model_name)s'],
+ }
+
+ def get_required_permissions(self, method, model_cls):
+ """
+ Given a model and an HTTP method, return the list of permission
+ codes that the user is required to have.
+ """
+ kwargs = {
+ 'app_label': model_cls._meta.app_label,
+ 'model_name': model_cls.__name__.lower()
}
- permission_codes = []
+ try:
+ return [perm % kwargs for perm in self.perms_map[method]]
+ except KeyError:
+ ErrorResponse(status.HTTP_405_METHOD_NOT_ALLOWED)
- # If we don't recognize the HTTP method, we don't know what
- # permissions to check. Deny.
- if self.view.request.method not in permission_map:
- raise _403_FORBIDDEN_RESPONSE
-
- for perm in permission_map[self.view.request.method]:
- permission_codes.append(perm % (klass._meta.app_label, klass._meta.module_name))
+ def check_permission(self, user):
+ method = self.view.method
+ model_cls = self.view.resource.model
+ perms = self.get_required_permissions(method, model_cls)
- if not self.view.request.user.has_perms(permission_codes):
+ if not user.has_perms(perms):
raise _403_FORBIDDEN_RESPONSE