From 7d91374b11bed8a329866236504a55f805808b35 Mon Sep 17 00:00:00 2001 From: Thibaud Duquennoy <thibaud@duquennoy.fr> Date: Fri, 15 Mar 2019 18:29:57 +0100 Subject: [PATCH] update: user_permissions method update: user_permissions method --- djangoldp/permissions.py | 38 ++++++++++++++++++++++++-------------- djangoldp/serializers.py | 12 +++++------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/djangoldp/permissions.py b/djangoldp/permissions.py index f070a7b3..7a9b4b20 100644 --- a/djangoldp/permissions.py +++ b/djangoldp/permissions.py @@ -34,7 +34,7 @@ class WACPermissions(permissions.DjangoObjectPermissions): return super().has_permission(request, view) # This method should be overriden by other permission classes - def user_permissions(self, request, view, obj): + def user_permissions(self, request, obj): return [] def filter_user_perms(self, request, obj, permissions): @@ -53,26 +53,36 @@ class ObjectFilter(filters.BaseFilterBackend): class ObjectPermission(WACPermissions): filter_class = ObjectFilter + class InboxPermissions(WACPermissions): """ - Anonymous users: can create notifications but can't read - Logged in users: can create notifications but can't read - Inbox owners: can read + update all notifications + Everybody can create + Author can edit """ - filter_class = ObjectFilter + anonymous_perms = ['view', 'create'] + authenticated_perms = ['view','create'] + author_perms = ['view'] + def has_permission(self, request, view): - if view.action in ['create', 'retrieve', 'update', 'partial_update', 'destroy']: + if view.action in ['create', 'list', 'retrieve']: return True else: return super().has_permission(request, view) def has_object_permission(self, request, view, obj): - if view.action == "create": - return True - if hasattr(obj._meta, 'auto_author'): - if request.user == getattr(obj, obj._meta.auto_author): - return True - return super().has_object_permission(request, view) + if view.action == ['update', 'partial_update', 'destroy']: + return False + else: + return super().has_object_permission(request, view) + + def user_permissions(self, request, obj): + if request.user.is_anonymous: + return self.anonymous_perms + else: + if hasattr(obj._meta, 'auto_author') and getattr(obj, obj._meta.auto_author) == request.user: + return self.author_perms + else: + return self.authenticated_perms class AnonymousReadOnly(WACPermissions): """ @@ -83,7 +93,7 @@ class AnonymousReadOnly(WACPermissions): anonymous_perms = ['view'] authenticated_perms = ['view','add'] - author_perms = ['view', 'add', 'change'] + author_perms = ['view', 'add', 'change', 'control', 'delete'] def has_permission(self, request, view): if view.action in ['list', 'retrieve']: @@ -106,7 +116,7 @@ class AnonymousReadOnly(WACPermissions): else: return super().has_object_permission(request, view, obj) - def user_permissions(self, request, view, obj): + def user_permissions(self, request, obj): if request.user.is_anonymous: return self.anonymous_perms else: diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 19b4fc3f..a7fea8d2 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -196,25 +196,23 @@ class LDPSerializer(HyperlinkedModelSerializer): return fields + list(getattr(self.Meta, 'extra_fields', [])) def get_permissions(self, obj): - permissions = [] + permissions = ['view', 'add', 'change', 'control', 'delete'] for permission_class in obj._meta.permission_classes: - perms = permission_class().filter_user_perms(self.context['request'], obj, permissions) - - permissions = get_perms(self.context['request'].user, obj) - + permissions = permission_class().filter_user_perms(self.context['request'], obj, permissions) + + permissions += get_perms(self.context['request'].user, obj) return [{'mode': {'@type': name.split('_')[0]}} for name in permissions] def to_representation(self, obj): data = super().to_representation(obj) - permissions = ['view', 'add', 'change', 'control', 'delete'] if hasattr(obj._meta, 'rdf_type'): data['@type'] = obj._meta.rdf_type if hasattr(obj._meta, 'rdf_context'): data['@context'] = obj._meta.rdf_context - data['permissions'] self.get_permissions(obj) + data['permissions'] = self.get_permissions(obj) return data -- GitLab