Skip to content
Snippets Groups Projects
Commit 6ff20225 authored by Jean-Baptiste's avatar Jean-Baptiste
Browse files

bugfix: remove list element must not delete data on db

parent 775a4f36
No related branches found
No related tags found
No related merge requests found
Pipeline #755 passed
...@@ -27,6 +27,8 @@ class LDListMixin: ...@@ -27,6 +27,8 @@ class LDListMixin:
pass pass
if isinstance(data, dict): if isinstance(data, dict):
data = [data] data = [data]
if isinstance(data, str) and str.startswith("http"):
data = [{'@id': data}]
return [self.child.to_internal_value(item) for item in data] return [self.child.to_internal_value(item) for item in data]
def to_representation(self, value): def to_representation(self, value):
...@@ -336,6 +338,7 @@ class LDPSerializer(HyperlinkedModelSerializer): ...@@ -336,6 +338,7 @@ class LDPSerializer(HyperlinkedModelSerializer):
else: else:
value = self.internal_create(validated_data=value, model=manager._meta.model) value = self.internal_create(validated_data=value, model=manager._meta.model)
setattr(instance, attr, value) setattr(instance, attr, value)
instance.save() instance.save()
self.save_or_update_nested_list(instance, nested_fields) self.save_or_update_nested_list(instance, nested_fields)
...@@ -344,12 +347,17 @@ class LDPSerializer(HyperlinkedModelSerializer): ...@@ -344,12 +347,17 @@ class LDPSerializer(HyperlinkedModelSerializer):
def save_or_update_nested_list(self, instance, nested_fields): def save_or_update_nested_list(self, instance, nested_fields):
for (field_name, data) in nested_fields: for (field_name, data) in nested_fields:
try: manager = getattr(instance, field_name)
getattr(instance, field_name).clear()
except AttributeError: item_pk_to_keep = list(map(lambda e: int(e['pk']), filter(lambda x: 'pk' in x, data)))
pass for item in list(manager.all()):
if not item.pk in item_pk_to_keep:
if getattr(manager, 'through', None) is None:
item.delete()
else:
manager.remove(item)
for item in data: for item in data:
manager = getattr(instance, field_name)
if 'pk' in item: if 'pk' in item:
oldObj = manager.model.objects.get(pk=item['pk']) oldObj = manager.model.objects.get(pk=item['pk'])
savedItem = self.update(instance=oldObj, validated_data=item) savedItem = self.update(instance=oldObj, validated_data=item)
...@@ -363,4 +371,5 @@ class LDPSerializer(HyperlinkedModelSerializer): ...@@ -363,4 +371,5 @@ class LDPSerializer(HyperlinkedModelSerializer):
pass pass
savedItem = self.internal_create(validated_data=item, model=manager.model) savedItem = self.internal_create(validated_data=item, model=manager.model)
getattr(instance, field_name).add(savedItem) if getattr(manager, 'through', None) is not None and manager.through._meta.auto_created:
manager.add(savedItem)
...@@ -89,60 +89,61 @@ class Update(TestCase): ...@@ -89,60 +89,61 @@ class Update(TestCase):
self.assertEquals(skills[1].title, "skill1") # no change self.assertEquals(skills[1].title, "skill1") # no change
self.assertEquals(skills[2].title, "skill2 UP") # title updated self.assertEquals(skills[2].title, "skill2 UP") # title updated
def test_update_graph_2(self): def test_update_graph_2(self):
skill = Skill.objects.create(title="to drop", obligatoire="obligatoire") skill = Skill.objects.create(title="to drop", obligatoire="obligatoire")
skill1 = Skill.objects.create(title="skill1", obligatoire="obligatoire") skill1 = Skill.objects.create(title="skill1", obligatoire="obligatoire")
skill2 = Skill.objects.create(title="skill2", obligatoire="obligatoire") skill2 = Skill.objects.create(title="skill2", obligatoire="obligatoire")
job1 = JobOffer.objects.create(title="job test") job1 = JobOffer.objects.create(title="job test")
job1.skills.add(skill) job1.skills.add(skill)
job = {"@graph": job = {"@graph":
[ [
{ {
"@id": "https://happy-dev.fr/job-offers/{}/".format(job1.pk), "@id": "https://happy-dev.fr/job-offers/{}/".format(job1.pk),
"title": "job test updated", "title": "job test updated",
"skills": { "skills": {
"@id": "https://happy-dev.fr/job-offers/{}/skills/".format(job1.pk) "@id": "https://happy-dev.fr/job-offers/{}/skills/".format(job1.pk)
}
},
{
"@id": "_.123",
"title": "new skill",
"obligatoire": "okay"
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk),
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk),
"title": "skill2 UP"
},
{
'@id': "https://happy-dev.fr/job-offers/{}/skills/".format(job1.pk),
"ldp:contains": [
{"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk)},
{"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk)},
{"@id": "_.123"},
]
} }
] },
} {
"@id": "_.123",
"title": "new skill",
"obligatoire": "okay"
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk),
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk),
"title": "skill2 UP"
},
{
'@id': "https://happy-dev.fr/job-offers/{}/skills/".format(job1.pk),
"ldp:contains": [
{"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk)},
{"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk)},
{"@id": "_.123"},
]
}
]
}
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")} meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class})
serializer = serializer_class(data=job, instance=job1) serializer = serializer_class(data=job, instance=job1)
serializer.is_valid() serializer.is_valid()
result = serializer.save() result = serializer.save()
skills = result.skills.all().order_by('title') skills = result.skills.all().order_by('title')
self.assertEquals(result.title, "job test updated") self.assertEquals(result.title, "job test updated")
self.assertIs(result.skills.count(), 3) self.assertIs(result.skills.count(), 3)
self.assertEquals(skills[0].title, "new skill") # new skill self.assertEquals(skills[0].title, "new skill") # new skill
self.assertEquals(skills[1].title, "skill1") # no change self.assertEquals(skills[1].title, "skill1") # no change
self.assertEquals(skills[2].title, "skill2 UP") # title updated self.assertEquals(skills[2].title, "skill2 UP") # title updated
self.assertEquals(skill, skill._meta.model.objects.get(pk=skill.pk)) # title updated
def test_update_list_with_reverse_relation(self): def test_update_list_with_reverse_relation(self):
user1 = User.objects.create() user1 = User.objects.create()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment