From fb4d66e08380fc94fa538219a37c00eb0069f5b9 Mon Sep 17 00:00:00 2001 From: Thibaud Duquennoy <thibaud@duquennoy.fr> Date: Mon, 25 Feb 2019 17:07:41 +0100 Subject: [PATCH] Add PATCH to Access-Control-Allow-Methods and add a new field (LDPUrlField) feature: add field to represent ids of resources (#56) update: PATCH method include in Access-Control-Allow-Methods (#72) --- djangoldp/fields.py | 10 ++++++++++ djangoldp/models.py | 8 -------- djangoldp/serializers.py | 7 +++---- djangoldp/tests/tests_user_permissions.py | 13 ++++++++++--- djangoldp/views.py | 2 +- 5 files changed, 24 insertions(+), 16 deletions(-) create mode 100644 djangoldp/fields.py diff --git a/djangoldp/fields.py b/djangoldp/fields.py new file mode 100644 index 00000000..fb4ba855 --- /dev/null +++ b/djangoldp/fields.py @@ -0,0 +1,10 @@ +from django.db import models +from rest_framework import fields + +class IdURLField (fields.URLField): + def to_representation(self, value): + str = super(IdURLField, self).to_representation(value) + return {'@id': str} + +class LDPUrlField (models.URLField): + pass diff --git a/djangoldp/models.py b/djangoldp/models.py index 6e02705c..151cb7d8 100644 --- a/djangoldp/models.py +++ b/djangoldp/models.py @@ -1,7 +1,6 @@ from django.conf import settings from django.db import models from django.urls import get_resolver -from rest_framework import fields class Model(models.Model): @@ -70,13 +69,6 @@ class Model(models.Model): path = "{}/".format(path) return path - -class LDPUrlField (fields.URLField): - def to_representation(self, value): - str = super(LDPUrlField, self).to_representation(value) - return {'@id': str} - - class LDPSource(models.Model): container = models.URLField() federation = models.CharField(max_length=255) diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 8f68daec..b3f875f6 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -11,7 +11,7 @@ from rest_framework.exceptions import ValidationError from rest_framework.fields import SkipField, empty from rest_framework.fields import get_error_detail, set_value from rest_framework.relations import HyperlinkedRelatedField, ManyRelatedField, MANY_RELATION_KWARGS -from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer +from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer, ModelSerializer from rest_framework.settings import api_settings from rest_framework.utils.field_mapping import get_nested_relation_kwargs from rest_framework.utils.serializer_helpers import ReturnDict @@ -22,8 +22,7 @@ from rest_framework.serializers import HyperlinkedModelSerializer, ListSerialize from rest_framework.utils.field_mapping import get_nested_relation_kwargs from rest_framework.utils.serializer_helpers import ReturnDict -from django.db import models as django_models -from djangoldp import models +from djangoldp.fields import LDPUrlField, IdURLField class LDListMixin: def to_internal_value(self, data): @@ -169,7 +168,7 @@ class LDPSerializer(HyperlinkedModelSerializer): url_field_name = "@id" serializer_related_field = JsonLdRelatedField serializer_url_field = JsonLdIdentityField - ModelSerializer.serializer_field_mapping [django_models.URLField] = models.LDPUrlField + ModelSerializer.serializer_field_mapping [LDPUrlField] = IdURLField @property diff --git a/djangoldp/tests/tests_user_permissions.py b/djangoldp/tests/tests_user_permissions.py index 3ad30ddd..3336aa8f 100644 --- a/djangoldp/tests/tests_user_permissions.py +++ b/djangoldp/tests/tests_user_permissions.py @@ -32,9 +32,16 @@ class TestUserPermissions(TestCase): self.assertEqual(response.status_code, 201) def test_request_options_update_with_user(self): - request = self.factory.options('/job-offers/') + request = self.factory.options('/job-offers/' + str(self.job.pk) + "/") request.user = self.user my_view = LDPViewSet.as_view({'options': 'update'}, model=JobOffer, nested_fields=["skills"], permission_classes=[AnonymousReadOnly]) - response = my_view(request) - self.assertEqual(response.status_code, 201) + response = my_view(request, pk=self.job.pk) + self.assertEqual(response.status_code, 200) + + def test_request_patch_with_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, nested_fields=["skills"]) + response = my_view(request, pk=self.job.pk) + self.assertEqual(response.status_code, 200) \ No newline at end of file diff --git a/djangoldp/views.py b/djangoldp/views.py index f4b2fb59..3ccfdf73 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -134,7 +134,7 @@ class LDPViewSet(LDPViewSetGenerator): def dispatch(self, request, *args, **kwargs): response = super(LDPViewSet, self).dispatch(request, *args, **kwargs) response["Access-Control-Allow-Origin"] = request.META.get('HTTP_ORIGIN') - response["Access-Control-Allow-Methods"] = "POST,PUT" + response["Access-Control-Allow-Methods"] = "POST,PUT, PATCH" response["Access-Control-Allow-Headers"] = "Content-Type, if-match" response["Access-Control-Allow-Credentials"] = 'true' response["Accept-Post"] = "application/ld+json" -- GitLab