From 4bb15727308bc66b404b415bc7c268ac7f0fbe48 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste <bleme@pm.me>
Date: Sun, 24 Feb 2019 19:16:58 +0100
Subject: [PATCH] update: fix issue #90

---
 djangoldp/serializers.py      | 19 ++++++++++++++++++-
 djangoldp/tests/tests_save.py | 22 ++++++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py
index 54c599c6..9bb033b6 100644
--- a/djangoldp/serializers.py
+++ b/djangoldp/serializers.py
@@ -13,6 +13,7 @@ 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.settings import api_settings
+from rest_framework.utils import model_meta
 from rest_framework.utils.field_mapping import get_nested_relation_kwargs
 from rest_framework.utils.serializer_helpers import ReturnDict
 
@@ -309,7 +310,23 @@ class LDPSerializer(HyperlinkedModelSerializer):
             return super().get_value(dictionary)
 
     def create(self, validated_data):
-        return self.internal_create(validated_data, model=self.Meta.model)
+        instance = self.internal_create(validated_data, model=self.Meta.model)
+
+        self.attach_related_object(instance, validated_data)
+
+        return instance
+
+    def attach_related_object(self, instance, validated_data):
+        ModelClass = self.Meta.model
+
+        info = model_meta.get_field_info(ModelClass)
+        many_to_many = {}
+        for field_name, relation_info in info.relations.items():
+            if relation_info.to_many and relation_info.reverse and not (field_name in validated_data):
+                rel = getattr(instance._meta.model, field_name).rel
+                if rel.name in validated_data:
+                    related = validated_data[rel.name]
+                    getattr(instance, field_name).add(related)
 
     def internal_create(self, validated_data, model):
         nested_fields = []
diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py
index 557e0070..4cf4f0d4 100644
--- a/djangoldp/tests/tests_save.py
+++ b/djangoldp/tests/tests_save.py
@@ -49,3 +49,25 @@ class Save(TestCase):
         self.assertEquals(result.title, "job test")
         self.assertIs(result.skills.count(), 0)
 
+    def test_save_on_sub_iri(self):
+        """
+            POST /job-offers/1/skills/
+        """
+        job = JobOffer.objects.create(title="job test")
+        skill = {"title": "new SKILL"}
+
+        meta_args = {'model': Skill, 'depth': 1, 'fields': ("@id", "title")}
+
+        meta_class = type('Meta', (), meta_args)
+        serializer_class = type(LDPSerializer)('SkillSerializer', (LDPSerializer,), {'Meta': meta_class})
+        serializer = serializer_class(data=skill)
+        serializer.is_valid()
+        kwargs = {}
+        kwargs['joboffer'] = job
+        result = serializer.save(**kwargs)
+
+        self.assertEquals(result.title, "new SKILL")
+        self.assertIs(result.joboffer_set.count(), 1)
+        self.assertEquals(result.joboffer_set.get(), job)
+        self.assertIs(result.joboffer_set.get().skills.count(), 1)
+
-- 
GitLab