aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework/permissions.py
diff options
context:
space:
mode:
authorCamille Harang2012-02-11 01:49:28 +0100
committerCamille Harang2012-02-11 01:49:28 +0100
commitbc80eb266f071e0c090fcf882722d4dd056ccf61 (patch)
tree99b9fa227eea2ea3b6a2437f1f23e0d83dbf3224 /djangorestframework/permissions.py
parentda8187d2c293e095969c00751c21338d53c7f3f2 (diff)
downloaddjango-rest-framework-bc80eb266f071e0c090fcf882722d4dd056ccf61.tar.bz2
DjangoModelPermisson
Diffstat (limited to 'djangorestframework/permissions.py')
-rw-r--r--djangorestframework/permissions.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/djangorestframework/permissions.py b/djangorestframework/permissions.py
index dfe55ce9..100a976e 100644
--- a/djangorestframework/permissions.py
+++ b/djangorestframework/permissions.py
@@ -89,6 +89,46 @@ class IsUserOrIsAnonReadOnly(BasePermission):
raise _403_FORBIDDEN_RESPONSE
+class DjangoModelPermisson(BasePermission):
+ """
+ """
+
+ def check_permission(self, user):
+
+ # GET-style methods are always allowed.
+ if self.view.request.method in ('GET', 'OPTIONS', 'HEAD',):
+ 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
+
+ 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
+
+ permission_map = {
+ 'POST': ['%s.add_%s'],
+ 'PUT': ['%s.change_%s'],
+ 'DELETE': ['%s.delete_%s'],
+ 'PATCH': ['%s.add_%s', '%s.change_%s', '%s.delete_%s'],
+ }
+ permission_codes = []
+
+ # 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))
+
+ if not self.view.request.user.has_perms(permission_codes):
+ raise _403_FORBIDDEN_RESPONSE
+
+
class BaseThrottle(BasePermission):
"""
Rate throttling of requests.