diff options
| author | bwreilly | 2013-09-09 08:39:09 -0700 | 
|---|---|---|
| committer | bwreilly | 2013-09-09 08:39:09 -0700 | 
| commit | 0183c69538de7b6dc4e9b0602fc364e789e0cab6 (patch) | |
| tree | 936e82fa8ed493eabbcbd0e82f8a2df98680009a /rest_framework/permissions.py | |
| parent | 9ff0f6d3bff3c1d02d2ccaf4f1500e25cb97620d (diff) | |
| download | django-rest-framework-0183c69538de7b6dc4e9b0602fc364e789e0cab6.tar.bz2 | |
removed unnecessary guardian req and view.action parsing
Diffstat (limited to 'rest_framework/permissions.py')
| -rw-r--r-- | rest_framework/permissions.py | 52 | 
1 files changed, 23 insertions, 29 deletions
| diff --git a/rest_framework/permissions.py b/rest_framework/permissions.py index 0d5e0e78..61a33bdd 100644 --- a/rest_framework/permissions.py +++ b/rest_framework/permissions.py @@ -8,8 +8,7 @@ import warnings  SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS']  from django.http import Http404 -from rest_framework.compat import oauth2_provider_scope, oauth2_constants, guardian -from rest_framework.filters import ObjectPermissionReaderFilter +from rest_framework.compat import oauth2_provider_scope, oauth2_constants  class BasePermission(object): @@ -158,47 +157,42 @@ class DjangoObjectLevelModelPermissions(DjangoModelPermissions):      Basic object level permissions utilizing django-guardian.      """ -    def __init__(self): -        assert guardian, 'Using DjangoObjectLevelModelPermissions, but django-guardian is not installed' - -    action_perm_map = { -        'list': 'read', -        'retrieve': 'read', -        'create': 'add', -        'partial_update': 'change', -        'update': 'change', -        'destroy': 'delete', +    actions_map = { +        'GET': ['read_%(model_name)s'], +        'OPTIONS': ['read_%(model_name)s'], +        'HEAD': ['read_%(model_name)s'], +        'POST': ['add_%(model_name)s'], +        'PUT': ['change_%(model_name)s'], +        'PATCH': ['change_%(model_name)s'], +        'DELETE': ['delete_%(model_name)s'],      } -    def _get_model_name(self, view): -        model_cls = getattr(view, 'model', None) -        queryset = getattr(view, 'queryset', None) - -        if model_cls is None and queryset is not None: -            model_cls = queryset.model -        if not model_cls:  # no model, no model based permissions -            return None -        model_name = model_cls._meta.module_name -        return model_name +    def get_required_object_permissions(self, method, model_cls): +        kwargs = { +            'model_name': model_cls._meta.module_name +        } +        return [perm % kwargs for perm in self.actions_map[method]]      def has_permission(self, request, view): -        if view.action == 'list': +        if getattr(view, 'action', None) == 'list':              queryset = view.get_queryset()              view.queryset = ObjectPermissionReaderFilter().filter_queryset(request, queryset, view)          return super(DjangoObjectLevelModelPermissions, self).has_permission(request, view)      def has_object_permission(self, request, view, obj): -        action = self.action_perm_map.get(view.action) -        assert action, "Tried to determine object permissions but no action specified in view" +        model_cls = getattr(view, 'model', None) +        queryset = getattr(view, 'queryset', None) + +        if model_cls is None and queryset is not None: +            model_cls = queryset.model +        perms = self.get_required_object_permissions(request.method, model_cls)          user = request.user -        model_name = self._get_model_name(view) -        perm = "{action}_{model_name}".format(action=action, model_name=model_name) -        check = user.has_perm(perm, obj) +        check = user.has_perms(perms, obj)          if not check:              raise Http404 -        return user.has_perm(perm, obj) +        return user.has_perms(perms, obj)  class TokenHasReadWriteScope(BasePermission): | 
