Skip to content
Snippets Groups Projects
Commit 1c76dfa2 authored by Jean-Baptiste's avatar Jean-Baptiste
Browse files

update: nested fields should use the nested model permissions

parent d2ef845a
No related branches found
No related tags found
No related merge requests found
Pipeline #833 passed
...@@ -86,6 +86,14 @@ class Model(models.Model): ...@@ -86,6 +86,14 @@ class Model(models.Model):
path = "{}/".format(path) path = "{}/".format(path)
return path return path
@classmethod
def get_permission_classes(cls, related_model, default_permissions_classes):
try:
return getattr(related_model._meta, 'permission_classes',
getattr(related_model.Meta, 'permission_classes', default_permissions_classes))
except AttributeError:
return default_permissions_classes
class LDPSource(models.Model): class LDPSource(models.Model):
container = models.URLField() container = models.URLField()
......
from rest_framework import permissions
from rest_framework import filters
from guardian.shortcuts import get_objects_for_user from guardian.shortcuts import get_objects_for_user
from rest_framework import filters
from rest_framework import permissions
""" """
Liste des actions passées dans views selon le protocole REST : Liste des actions passées dans views selon le protocole REST :
...@@ -16,6 +16,7 @@ Pour chacune de ces actions, on va définir si on accepte la requête (True) ou ...@@ -16,6 +16,7 @@ Pour chacune de ces actions, on va définir si on accepte la requête (True) ou
checks have already passed checks have already passed
""" """
class WACPermissions(permissions.DjangoObjectPermissions): class WACPermissions(permissions.DjangoObjectPermissions):
perms_map = { perms_map = {
'GET': ['%(app_label)s.view_%(model_name)s'], 'GET': ['%(app_label)s.view_%(model_name)s'],
...@@ -43,9 +44,11 @@ class ObjectFilter(filters.BaseFilterBackend): ...@@ -43,9 +44,11 @@ class ObjectFilter(filters.BaseFilterBackend):
objects = get_objects_for_user(request.user, perm, klass=queryset) objects = get_objects_for_user(request.user, perm, klass=queryset)
return objects return objects
class ObjectPermission(WACPermissions): class ObjectPermission(WACPermissions):
filter_class = ObjectFilter filter_class = ObjectFilter
class InboxPermissions(WACPermissions): class InboxPermissions(WACPermissions):
""" """
Anonymous users: can create notifications but can't read Anonymous users: can create notifications but can't read
...@@ -53,6 +56,7 @@ class InboxPermissions(WACPermissions): ...@@ -53,6 +56,7 @@ class InboxPermissions(WACPermissions):
Inbox owners: can read + update all notifications Inbox owners: can read + update all notifications
""" """
filter_class = ObjectFilter filter_class = ObjectFilter
def has_permission(self, request, view): def has_permission(self, request, view):
if view.action in ['create', 'retrieve', 'update', 'partial_update', 'destroy']: if view.action in ['create', 'retrieve', 'update', 'partial_update', 'destroy']:
return True return True
...@@ -67,6 +71,7 @@ class InboxPermissions(WACPermissions): ...@@ -67,6 +71,7 @@ class InboxPermissions(WACPermissions):
return True return True
return super().has_object_permission(request, view) return super().has_object_permission(request, view)
class AnonymousReadOnly(WACPermissions): class AnonymousReadOnly(WACPermissions):
""" """
Anonymous users: can read all posts Anonymous users: can read all posts
...@@ -97,4 +102,4 @@ class AnonymousReadOnly(WACPermissions): ...@@ -97,4 +102,4 @@ class AnonymousReadOnly(WACPermissions):
if author == request.user: if author == request.user:
return True return True
else: else:
return super().has_object_permission(request, view, obj) return super().has_object_permission(request, view, obj)
\ No newline at end of file
...@@ -6,7 +6,6 @@ from django.core.urlresolvers import get_resolver ...@@ -6,7 +6,6 @@ from django.core.urlresolvers import get_resolver
from django.db.utils import OperationalError from django.db.utils import OperationalError
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils.decorators import classonlymethod from django.utils.decorators import classonlymethod
from djangoldp.models import LDPSource
from guardian.shortcuts import get_objects_for_user from guardian.shortcuts import get_objects_for_user
from pyld import jsonld from pyld import jsonld
from rest_framework.authentication import SessionAuthentication from rest_framework.authentication import SessionAuthentication
...@@ -14,6 +13,7 @@ from rest_framework.parsers import JSONParser ...@@ -14,6 +13,7 @@ from rest_framework.parsers import JSONParser
from rest_framework.renderers import JSONRenderer from rest_framework.renderers import JSONRenderer
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from djangoldp.models import LDPSource, Model
from .serializers import LDPSerializer from .serializers import LDPSerializer
...@@ -194,7 +194,8 @@ class LDPNestedViewSet(LDPViewSet): ...@@ -194,7 +194,8 @@ class LDPNestedViewSet(LDPViewSet):
related_field=related_field, related_field=related_field,
parent_lookup_field=cls.get_lookup_arg(**kwargs), parent_lookup_field=cls.get_lookup_arg(**kwargs),
model_prefix=cls.get_model(**kwargs)._meta.object_name.lower(), model_prefix=cls.get_model(**kwargs)._meta.object_name.lower(),
permission_classes=kwargs.get('permission_classes', ()), permission_classes=Model.get_permission_classes(related_field.related_model,
kwargs.get('permission_classes', ())),
lookup_url_kwarg=related_field.related_model._meta.object_name.lower() + '_id') lookup_url_kwarg=related_field.related_model._meta.object_name.lower() + '_id')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment