From 329e21853a14b76e7f718dfe66b00e96d9d3beb9 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Pasquier <contact@jbpasquier.eu> Date: Wed, 24 Jul 2019 20:28:12 +0200 Subject: [PATCH] update: Add tests & correct default permissions --- djangoldp/serializers.py | 3 +- djangoldp/tests/models.py | 43 ++++++++++++++++++- .../tests/tests_anonymous_permissions.py | 12 ++---- djangoldp/tests/tests_user_permissions.py | 9 ++-- djangoldp/urls.py | 3 +- djangoldp/views.py | 3 +- 6 files changed, 55 insertions(+), 18 deletions(-) diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 91972b0b..4412e880 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -21,6 +21,7 @@ from rest_framework.utils.serializer_helpers import ReturnDict from djangoldp.fields import LDPUrlField, IdURLField from djangoldp.models import Model +from djangoldp.permissions import LDPPermissions class LDListMixin: @@ -253,7 +254,7 @@ class LDPSerializer(HyperlinkedModelSerializer): serializer_generator = LDPViewSet(model=model_class, lookup_field=Model.get_meta(model_class, 'lookup_field', 'pk'), permission_classes=Model.get_meta(model_class, - 'permission_classes', []), + 'permission_classes', [LDPPermissions]), fields=Model.get_meta(model_class, 'serializer_fields', []), nested_fields=Model.get_meta(model_class, 'nested_fields', [])) parent_depth = max(getattr(self.parent.Meta, "depth", 0) - 1, 0) diff --git a/djangoldp/tests/models.py b/djangoldp/tests/models.py index 8bda453d..c7e65f87 100644 --- a/djangoldp/tests/models.py +++ b/djangoldp/tests/models.py @@ -4,7 +4,6 @@ from django.db import models from django.utils.datetime_safe import date from djangoldp.models import Model -from djangoldp.permissions import AnonymousReadOnly class Skill(Model): @@ -17,6 +16,9 @@ class Skill(Model): return self.joboffer_set.filter(date__gte=date.today()) class Meta: + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] serializer_fields = ["@id", "title", "recent_jobs"] lookup_field = 'slug' @@ -31,6 +33,9 @@ class JobOffer(Model): return self.skills.filter(date__gte=date.today()) class Meta: + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] nested_fields = ["skills"] serializer_fields = ["@id", "title", "skills", "recent_skills"] container_path = "job-offers/" @@ -42,12 +47,20 @@ class Conversation(models.Model): author_user = models.ForeignKey(settings.AUTH_USER_MODEL) peer_user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name="peers_conv") + class Meta: + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] + class UserProfile(Model): description = models.CharField(max_length=255, blank=True, null=True) user = models.OneToOneField(settings.AUTH_USER_MODEL) class Meta: + anonymous_perms = ['view'] + authenticated_perms = ['inherit'] + owner_perms = ['inherit', 'change', 'control'] depth = 1 @@ -56,15 +69,30 @@ class Message(models.Model): conversation = models.ForeignKey(Conversation, on_delete=models.DO_NOTHING) author_user = models.ForeignKey(settings.AUTH_USER_MODEL) + class Meta: + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] + class Dummy(models.Model): some = models.CharField(max_length=255, blank=True, null=True) slug = models.SlugField(blank=True, null=True, unique=True) + class Meta: + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] + class LDPDummy(Model): some = models.CharField(max_length=255, blank=True, null=True) + class Meta: + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] + class Invoice(Model): title = models.CharField(max_length=255, blank=True, null=True) @@ -72,7 +100,9 @@ class Invoice(Model): class Meta: depth = 2 - permission_classes = [AnonymousReadOnly] + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] nested_fields = ["batches"] @@ -82,6 +112,9 @@ class Batch(Model): class Meta: serializer_fields = ['@id', 'title', 'invoice', 'tasks'] + anonymous_perms = ['view', 'add'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] nested_fields = ["tasks", 'invoice'] @@ -91,6 +124,9 @@ class Task(models.Model): class Meta: serializer_fields = ['@id', 'title', 'batch'] + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] class Post(Model): @@ -100,6 +136,9 @@ class Post(Model): class Meta: auto_author = 'author' + anonymous_perms = ['view', 'add', 'delete', 'add', 'change', 'control'] + authenticated_perms = ['inherit'] + owner_perms = ['inherit'] get_user_model()._meta.serializer_fields = ['@id', 'username', 'first_name', 'last_name', 'email', 'userprofile', 'conversation_set',] diff --git a/djangoldp/tests/tests_anonymous_permissions.py b/djangoldp/tests/tests_anonymous_permissions.py index f1ace746..78b7f578 100644 --- a/djangoldp/tests/tests_anonymous_permissions.py +++ b/djangoldp/tests/tests_anonymous_permissions.py @@ -4,7 +4,6 @@ from rest_framework.test import APIRequestFactory from guardian.shortcuts import get_anonymous_user -from djangoldp.permissions import AnonymousReadOnly from djangoldp.tests.models import JobOffer from djangoldp.views import LDPViewSet @@ -22,15 +21,14 @@ class TestAnonymousUserPermissions(TestCase): request.user = self.user my_view = LDPViewSet.as_view({'get': 'list'}, model=JobOffer, - nested_fields=["skills"], - permission_classes=[AnonymousReadOnly]) + nested_fields=["skills"]) response = my_view(request) self.assertEqual(response.status_code, 200) def test_post_request_for_anonymousUser(self): data = {'title': 'new idea'} request = self.factory.post('/job-offers/', json.dumps(data), content_type='application/ld+json') - my_view = LDPViewSet.as_view({'post': 'create'}, model=JobOffer, nested_fields=["skills"], permission_classes=[AnonymousReadOnly]) + my_view = LDPViewSet.as_view({'post': 'create'}, model=JobOffer, nested_fields=["skills"]) response = my_view(request, pk=1) self.assertEqual(response.status_code, 403) @@ -38,8 +36,7 @@ class TestAnonymousUserPermissions(TestCase): request = self.factory.put("/job-offers/") my_view = LDPViewSet.as_view({'put': 'update'}, model=JobOffer, - nested_fields=["skills"], - permission_classes=[AnonymousReadOnly]) + nested_fields=["skills"]) response = my_view(request, pk=self.job.pk) self.assertEqual(response.status_code, 403) @@ -47,7 +44,6 @@ class TestAnonymousUserPermissions(TestCase): request = self.factory.patch("/job-offers/") my_view = LDPViewSet.as_view({'patch': 'partial_update'}, model=JobOffer, - nested_fields=["skills"], - permission_classes=[AnonymousReadOnly]) + nested_fields=["skills"]) response = my_view(request, pk=self.job.pk) self.assertEqual(response.status_code, 403) diff --git a/djangoldp/tests/tests_user_permissions.py b/djangoldp/tests/tests_user_permissions.py index 5bda0e58..1feef258 100644 --- a/djangoldp/tests/tests_user_permissions.py +++ b/djangoldp/tests/tests_user_permissions.py @@ -1,7 +1,6 @@ from django.contrib.auth.models import User from rest_framework.test import APIRequestFactory, APIClient, APITestCase -from djangoldp.permissions import AnonymousReadOnly from .models import JobOffer from djangoldp.views import LDPViewSet @@ -22,7 +21,7 @@ class TestUserPermissions(APITestCase): def test_get_for_authenticated_user(self): request = self.factory.get('/job-offers/') request.user = self.user - my_view = LDPViewSet.as_view({'get': 'list'}, model=JobOffer, permission_classes=[AnonymousReadOnly]) + my_view = LDPViewSet.as_view({'get': 'list'}, model=JobOffer) response = my_view(request) self.assertEqual(response.status_code, 200) @@ -30,7 +29,7 @@ class TestUserPermissions(APITestCase): data = {'title': 'new idea'} request = self.factory.post('/job-offers/', json.dumps(data), content_type='application/ld+json') request.user = self.user - my_view = LDPViewSet.as_view({'post': 'create'}, model=JobOffer, nested_fields=["skills"], permission_classes=[AnonymousReadOnly]) + my_view = LDPViewSet.as_view({'post': 'create'}, model=JobOffer, nested_fields=["skills"]) response = my_view(request, pk=1) self.assertEqual(response.status_code, 201) @@ -38,13 +37,13 @@ class TestUserPermissions(APITestCase): # data = {'title':"job_updated"} # request = self.factory.put('/job-offers/' + str(self.job.pk) + "/", data) # request.user = self.user - # my_view = LDPViewSet.as_view({'put': 'update'}, model=JobOffer, permission_classes=[AnonymousReadOnly]) + # my_view = LDPViewSet.as_view({'put': 'update'}, model=JobOffer) # response = my_view(request, pk=self.job.pk) # self.assertEqual(response.status_code, 200) # # def test_request_patch_for_authenticated_user(self): # request = self.factory.patch('/job-offers/' + str(self.job.pk) + "/") # request.user = self.user - # my_view = LDPViewSet.as_view({'patch': 'partial_update'}, model=JobOffer, permission_classes=[AnonymousReadOnly]) + # my_view = LDPViewSet.as_view({'patch': 'partial_update'}, model=JobOffer) # response = my_view(request, pk=self.job.pk) # self.assertEqual(response.status_code, 200) \ No newline at end of file diff --git a/djangoldp/urls.py b/djangoldp/urls.py index fb01b36f..31aa8312 100644 --- a/djangoldp/urls.py +++ b/djangoldp/urls.py @@ -5,6 +5,7 @@ from django.conf.urls import url, include from djangoldp.models import LDPSource, Model from djangoldp.views import LDPSourceViewSet +from djangoldp.permissions import LDPPermissions def __clean_path(path): @@ -34,7 +35,7 @@ for class_name in model_classes: urlpatterns.append(url(r'^' + path, include( urls_fct(model=model_class, lookup_field=Model.get_meta(model_class, 'lookup_field', 'pk'), - permission_classes=Model.get_meta(model_class, 'permission_classes', []), + permission_classes=Model.get_meta(model_class, 'permission_classes', [LDPPermissions]), fields=Model.get_meta(model_class, 'serializer_fields', []), nested_fields=Model.get_meta(model_class, 'nested_fields', []))))) diff --git a/djangoldp/views.py b/djangoldp/views.py index b20cd12c..6b2ecc5e 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -15,6 +15,7 @@ from rest_framework.renderers import JSONRenderer from rest_framework.viewsets import ModelViewSet from djangoldp.models import LDPSource, Model +from djangoldp.permissions import LDPPermissions class JSONLDRenderer(JSONRenderer): @@ -206,7 +207,7 @@ class LDPNestedViewSet(LDPViewSet): parent_lookup_field=cls.get_lookup_arg(**kwargs), model_prefix=cls.get_model(**kwargs)._meta.object_name.lower(), permission_classes=Model.get_permission_classes(related_field.related_model, - kwargs.get('permission_classes', ())), + kwargs.get('permission_classes', [LDPPermissions])), lookup_url_kwarg=related_field.related_model._meta.object_name.lower() + '_id') -- GitLab