diff options
| author | Camille Harang | 2012-02-11 01:49:28 +0100 |
|---|---|---|
| committer | Camille Harang | 2012-02-11 01:49:28 +0100 |
| commit | bc80eb266f071e0c090fcf882722d4dd056ccf61 (patch) | |
| tree | 99b9fa227eea2ea3b6a2437f1f23e0d83dbf3224 /djangorestframework/permissions.py | |
| parent | da8187d2c293e095969c00751c21338d53c7f3f2 (diff) | |
| download | django-rest-framework-bc80eb266f071e0c090fcf882722d4dd056ccf61.tar.bz2 | |
DjangoModelPermisson
Diffstat (limited to 'djangorestframework/permissions.py')
| -rw-r--r-- | djangorestframework/permissions.py | 40 |
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. |
