diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 0df95085ca62d9e73b61a0f9f8517b21ef721e16..72b90a4133e91ed318f820211bed681fbd3064f0 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -460,8 +460,7 @@ class LDPSerializer(HyperlinkedModelSerializer): info = model_meta.get_field_info(model_class) 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) and not field_name is None: + if relation_info.to_many and relation_info.reverse and not field_name is None: rel = getattr(instance._meta.model, field_name).rel if rel.name in validated_data: related = validated_data[rel.name] @@ -485,9 +484,19 @@ class LDPSerializer(HyperlinkedModelSerializer): nested_list_fields_name = list(filter(lambda key: isinstance(validated_data[key], list), validated_data)) for field_name in nested_list_fields_name: nested_fields.append((field_name, validated_data.pop(field_name))) + + info = model_meta.get_field_info(model) + many_to_many = [] + for field_name, relation_info in info.relations.items(): + if relation_info.to_many and relation_info.reverse and ( + field_name in validated_data) and not field_name is None: + many_to_many.append((field_name, validated_data.pop(field_name))) validated_data = self.remove_empty_value(validated_data) instance = model.objects.create(**validated_data) + for field_name, value in many_to_many: + validated_data[field_name] = value + self.save_or_update_nested_list(instance, nested_fields) return instance diff --git a/djangoldp/tests/models.py b/djangoldp/tests/models.py index 31f0d49795da8926b50113df9dbcc382d8e4f937..a024d1b557988523e8bfbfa42b77ab541d7454b6 100644 --- a/djangoldp/tests/models.py +++ b/djangoldp/tests/models.py @@ -37,7 +37,7 @@ class JobOffer(Model): authenticated_perms = ['inherit', 'change', 'add'] owner_perms = ['inherit', 'delete', 'control'] nested_fields = ["skills"] - serializer_fields = ["@id", "title", "skills", "recent_skills"] + serializer_fields = ["@id", "title", "skills", "recent_skills", "resources"] container_path = "job-offers/" lookup_field = 'slug' @@ -53,6 +53,17 @@ class Conversation(models.Model): owner_perms = ['inherit', 'change', 'delete', 'control'] +class Resource(Model): + joboffers = models.ManyToManyField(JobOffer, blank=True, related_name='resources') + + class Meta: + anonymous_perms = ['view', 'add', 'delete', 'add', 'change', 'control'] + authenticated_perms = ['inherit'] + owner_perms = ['inherit'] + serializer_fields = ["@id", "joboffers"] + nested_fields = ["joboffers"] + + class UserProfile(Model): description = models.CharField(max_length=255, blank=True, null=True) user = models.OneToOneField(settings.AUTH_USER_MODEL) diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py index 9ee478fc06c8f7ee1f6bc419571a5964c5e7237e..15d2cfe996e24afce1ac51f6085dc3e5933eb84a 100644 --- a/djangoldp/tests/tests_save.py +++ b/djangoldp/tests/tests_save.py @@ -3,7 +3,7 @@ from rest_framework.utils import json from djangoldp.models import Model from djangoldp.serializers import LDPSerializer -from djangoldp.tests.models import Skill, JobOffer, Invoice, LDPDummy +from djangoldp.tests.models import Skill, JobOffer, Invoice, LDPDummy, Resource class Save(TestCase): @@ -255,6 +255,18 @@ class Save(TestCase): content_type='application/ld+json') self.assertEqual(response.status_code, 201) + def test_nested_container(self): + resource = Resource.objects.create() + body = { + 'title': "new job", + } + + response = self.client.post('/resources/{}/joboffers/'.format(resource.pk), + data=json.dumps(body), + content_type='application/ld+json') + self.assertEqual(response.status_code, 201) + self.assertEqual(response.data['resources']['ldp:contains'][0]['@id'], "http://testserver/resources/{}/".format(resource.pk)) + def test_embedded_context_2(self): body = { '@id': "./", diff --git a/djangoldp/tests/tests_temp.py b/djangoldp/tests/tests_temp.py index 25e52460d869377451b6b300202b35e62d8bc0a4..9c806dd3efc06bfe0df6f3f34adbbdf1780bf64a 100644 --- a/djangoldp/tests/tests_temp.py +++ b/djangoldp/tests/tests_temp.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import User from django.test import TestCase from rest_framework.test import APIRequestFactory, APIClient -from djangoldp.tests.models import Skill, JobOffer, Post +from djangoldp.tests.models import Resource class TestTemp(TestCase): @@ -16,6 +16,3 @@ class TestTemp(TestCase): def tearDown(self): pass - - -