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