From 412767f01128107ae9ab1de3e279fc4c6655d9a2 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste <bleme@pm.me>
Date: Mon, 4 Feb 2019 15:12:53 +0100
Subject: [PATCH] fix: POST should works with nested fields

---
 djangoldp/serializers.py | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py
index 639e408c..fc457dd8 100644
--- a/djangoldp/serializers.py
+++ b/djangoldp/serializers.py
@@ -1,5 +1,3 @@
-import json
-
 from django.core.exceptions import ImproperlyConfigured
 from django.core.urlresolvers import get_resolver
 from django.utils.datastructures import MultiValueDictKeyError
@@ -9,15 +7,13 @@ 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 djangoldp.tests.models import Skill
-
 
 class LDListMixin:
     def to_internal_value(self, data):
         # data = json.loads(data)
         data = data['ldp:contains']
         if isinstance(data, dict):
-           data = [data]
+            data = [data]
         return [self.child.to_internal_value(item) for item in data]
 
     def to_representation(self, value):
@@ -49,7 +45,6 @@ class ContainerSerializer(LDListMixin, ListSerializer):
             return super().to_internal_value(data)
 
 
-
 class ManyJsonLdRelatedField(LDListMixin, ManyRelatedField):
     pass
 
@@ -99,6 +94,12 @@ class JsonLdIdentityField(JsonLdField):
     def use_pk_only_optimization(self):
         return False
 
+    def to_internal_value(self, data):
+        try:
+            return super().to_internal_value(data['@id'])
+        except:
+            return super().to_internal_value(data)
+
 
 class LDPSerializer(HyperlinkedModelSerializer):
     url_field_name = "@id"
@@ -122,6 +123,7 @@ class LDPSerializer(HyperlinkedModelSerializer):
 
     def build_nested_field(self, field_name, relation_info, nested_depth):
         class NestedLDPSerializer(self.__class__):
+
             class Meta:
                 model = relation_info.related_model
                 depth = nested_depth - 1
@@ -131,13 +133,14 @@ class LDPSerializer(HyperlinkedModelSerializer):
                     fields = '__all__'
 
             def to_internal_value(self, data):
-                return JsonLdRelatedField(view_name="skill-detail", queryset=Skill.objects.all()).to_internal_value(data)
-                # super().to_internal_value(data)]
+                model = self.Meta.model
+                return self.serializer_related_field(
+                    view_name='{}-detail'.format(model._meta.object_name.lower()),
+                    queryset=model.objects.all()).to_internal_value(data)
 
         kwargs = get_nested_relation_kwargs(relation_info)
         kwargs['read_only'] = False
         return NestedLDPSerializer, kwargs
-        # return NestedLDPSerializer, {"many": True}
 
     @classmethod
     def many_init(cls, *args, **kwargs):
@@ -145,11 +148,15 @@ class LDPSerializer(HyperlinkedModelSerializer):
         return ContainerSerializer(*args, **kwargs)
 
     def create(self, validated_data):
-        skills = validated_data.pop('skills')
-        job_offer = self.Meta.model.objects.create(**validated_data)
+        nested_fields = []
+        nested_fields_name = list(filter(lambda key: isinstance(validated_data[key], list), validated_data))
+        for field_name in nested_fields_name:
+            nested_fields.append((field_name, validated_data.pop(field_name)))
+
+        obj = self.Meta.model.objects.create(**validated_data)
 
-        for skill in skills:
-            skill.save()
-            job_offer.skills.add(skill)
-        return job_offer
+        for (field_name, data) in nested_fields:
+            for item in data:
+                getattr(obj, field_name).add(item)
 
+        return obj
-- 
GitLab