From 28d878916032a4fb487b5489bfd61997945adbe2 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste <bleme@pm.me> Date: Mon, 11 Feb 2019 23:37:09 +0100 Subject: [PATCH] fix: allow update on nested fields on POST or PUT --- djangoldp/serializers.py | 13 +++++++++++-- djangoldp/tests/tests_save.py | 5 ++++- djangoldp/tests/tests_update.py | 2 ++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 0f6d711a..02b96e28 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -14,7 +14,7 @@ class LDListMixin: # data = json.loads(data) try: data = data['ldp:contains'] - except TypeError: + except (TypeError, KeyError): pass if isinstance(data, dict): data = [data] @@ -187,9 +187,12 @@ class LDPSerializer(HyperlinkedModelSerializer): def to_internal_value(self, data): model = self.Meta.model - return self.serializer_related_field( + instance = self.serializer_related_field( view_name='{}-detail'.format(model._meta.object_name.lower()), queryset=model.objects.all()).to_internal_value(data) + for key in data: + setattr(instance, key, data[key]) + return instance def get_value(self, dictionary): return super().get_value(dictionary) @@ -221,6 +224,7 @@ class LDPSerializer(HyperlinkedModelSerializer): for (field_name, data) in nested_fields: for item in data: + item.save() getattr(obj, field_name).add(item) return obj @@ -236,7 +240,12 @@ class LDPSerializer(HyperlinkedModelSerializer): instance.save() for (field_name, data) in nested_fields: + try: + getattr(instance, field_name).clear() + except AttributeError: + pass for item in data: + item.save() getattr(instance, field_name).add(item) return instance diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py index 53f48e21..4375f943 100644 --- a/djangoldp/tests/tests_save.py +++ b/djangoldp/tests/tests_save.py @@ -9,11 +9,12 @@ class Serializer(TestCase): def test_save_m2m(self): skill1 = Skill.objects.create(title="skill1") skill2 = Skill.objects.create(title="skill2") + job = {"title": "job test", "skills": { "ldp:contains": [ {"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk)}, - {"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk)}, + {"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk), "title": "skill2 UP"}, ]} } @@ -27,6 +28,8 @@ class Serializer(TestCase): self.assertEquals(result.title, "job test") self.assertIs(result.skills.count(), 2) + self.assertEquals(result.skills.all()[0].title, "skill1") # no change + self.assertEquals(result.skills.all()[1].title, "skill2 UP") # title updated def test_save_without_nested_fields(self): skill1 = Skill.objects.create(title="skill1") diff --git a/djangoldp/tests/tests_update.py b/djangoldp/tests/tests_update.py index df79b949..1b84325c 100644 --- a/djangoldp/tests/tests_update.py +++ b/djangoldp/tests/tests_update.py @@ -7,9 +7,11 @@ from djangoldp.tests.models import Skill, JobOffer class Serializer(TestCase): def test_update(self): + skill = Skill.objects.create(title="to drop") skill1 = Skill.objects.create(title="skill1") skill2 = Skill.objects.create(title="skill2") job1 = JobOffer.objects.create(title="job test") + job1.skills.add(skill) job = {"@id": "https://happy-dev.fr/job-offers/{}/".format(job1.pk), "title": "job test updated", -- GitLab