diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index b04506469137e9dde6166639e56031557fea5b12..75940ba9d7501bd284db1a3497526dd85db2902d 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -471,13 +471,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))) - + validated_data = self.remove_empty_value(validated_data) instance = model.objects.create(**validated_data) self.save_or_update_nested_list(instance, nested_fields) return instance + def remove_empty_value(self, validated_data): + for attr, value in validated_data.items(): + if value is '': + validated_data[attr] = None + return validated_data + def update(self, instance, validated_data): nested_fields = [] nested_fields_name = list(filter(lambda key: isinstance(validated_data[key], list), validated_data)) diff --git a/djangoldp/tests/models.py b/djangoldp/tests/models.py index d0d16a23f5be4540254d9f7d5d2a67df5ddfac19..f3c6e88c11d33937f143c44ed2cd7bf078c8a7a4 100644 --- a/djangoldp/tests/models.py +++ b/djangoldp/tests/models.py @@ -96,6 +96,8 @@ class Task(models.Model): class Post(Model): content = models.CharField(max_length=255) author = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True) + peer_user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name="peers_post") + class Meta: auto_author = 'author' diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py index bb699bc68910b49605243f0f0d2c67f4ced2f169..d0acfadfa82e0171eee433e8e77798f37f3efb58 100644 --- a/djangoldp/tests/tests_save.py +++ b/djangoldp/tests/tests_save.py @@ -188,3 +188,29 @@ class Save(TestCase): self.assertNotIn('author', response.data) self.assertEquals(response.data['title'], "title") self.assertEquals(response.data['invoice']['title'], "title 3") + + def test_post_should_accept_missing_field_id_nullable(self): + body = [ + { + '@id': "./", + 'http://happy-dev.fr/owl/#content': "post update", + } + ] + response = self.client.post('/posts/', data=json.dumps(body), + content_type='application/ld+json') + self.assertEqual(response.status_code, 201) + self.assertIn('peer_user', response.data) + + def test_post_should_accept_empty_field_if_nullable(self): + body = [ + { + '@id': "./", + 'http://happy-dev.fr/owl/#content': "post update", + 'http://happy-dev.fr/owl/#peer_user': "" + } + ] + response = self.client.post('/posts/', data=json.dumps(body), + content_type='application/ld+json') + self.assertEqual(response.status_code, 201) + self.assertEqual(response.data['peer_user'], None) + diff --git a/djangoldp/tests/tests_temp.py b/djangoldp/tests/tests_temp.py index 578eb8a3bcb4c586bfb6b1a41e4795d9e6e3a370..03dfb977037b04c683aa9d60cd8397de5b01022c 100644 --- a/djangoldp/tests/tests_temp.py +++ b/djangoldp/tests/tests_temp.py @@ -1,3 +1,6 @@ +import json + +from django.contrib.auth.models import User from django.test import TestCase from rest_framework.test import APIRequestFactory, APIClient @@ -9,6 +12,33 @@ class TestTemp(TestCase): def setUp(self): self.factory = APIRequestFactory() self.client = APIClient() + self.user = User.objects.create_user(username='john', email='jlennon@beatles.com', password='glass onion') + def tearDown(self): pass + + def test_post_should_accept_missing_field_id_nullable(self): + body = [ + { + '@id': "./", + 'http://happy-dev.fr/owl/#content': "post update", + } + ] + response = self.client.post('/posts/', data=json.dumps(body), + content_type='application/ld+json') + self.assertEqual(response.status_code, 201) + self.assertIn('peer_user', response.data) + + def test_post_should_accept_empty_field_if_nullable(self): + body = [ + { + '@id': "./", + 'http://happy-dev.fr/owl/#content': "post update", + 'http://happy-dev.fr/owl/#peer_user': "" + } + ] + response = self.client.post('/posts/', data=json.dumps(body), + content_type='application/ld+json') + self.assertEqual(response.status_code, 201) + self.assertEqual(response.data['peer_user'], None)