From 0d046f5f2f6f189c5daf30a4d210a9733f4f46ee Mon Sep 17 00:00:00 2001 From: Jean-Baptiste <bleme@pm.me> Date: Tue, 4 Jun 2019 07:21:53 +0200 Subject: [PATCH] update: manage oneToOneField --- djangoldp/serializers.py | 15 +++++++++++---- djangoldp/tests/models.py | 7 ++++++- djangoldp/tests/tests_update.py | 4 ++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 291ae714..0539e862 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -364,7 +364,7 @@ class LDPSerializer(HyperlinkedModelSerializer): object_list)) else: container_id = Model.container_id(self.parent.instance) - obj = next(filter(lambda o: container_id in o[self.url_field_name], object_list)) + obj = next(filter(lambda o: container_id.lstrip('/') in o[self.url_field_name], object_list)) item = super().get_value(obj) full_item = None if item is empty: @@ -432,16 +432,23 @@ class LDPSerializer(HyperlinkedModelSerializer): for field_name in nested_fields_name: nested_fields.append((field_name, validated_data.pop(field_name))) + info = model_meta.get_field_info(instance) for attr, value in validated_data.items(): if isinstance(value, dict): slug_field = Model.slug_field(instance) - manager = getattr(instance, attr) + relation_info = info.relations.get(attr) if slug_field in value: kwargs = {slug_field: value[slug_field]} - oldObj = manager._meta.model.objects.get(**kwargs) + if relation_info.to_many: + manager = getattr(instance, attr) + oldObj = manager._meta.model.objects.get(**kwargs) + else: + oldObj = getattr(instance, attr) value = self.update(instance=oldObj, validated_data=value) else: - value = self.internal_create(validated_data=value, model=manager._meta.model) + if not relation_info.to_many: + value[instance._meta.fields_map[attr].remote_field.name] = instance + value = self.internal_create(validated_data=value, model=relation_info.related_model) setattr(instance, attr, value) instance.save() diff --git a/djangoldp/tests/models.py b/djangoldp/tests/models.py index 468377c8..95dcd8fd 100644 --- a/djangoldp/tests/models.py +++ b/djangoldp/tests/models.py @@ -32,6 +32,11 @@ class Conversation(models.Model): author_user = models.ForeignKey(settings.AUTH_USER_MODEL) +class UserProfile(Model): + description = models.CharField(max_length=255, blank=True, null=True) + user = models.OneToOneField(settings.AUTH_USER_MODEL) + + class Message(models.Model): text = models.CharField(max_length=255, blank=True, null=True) conversation = models.ForeignKey(Conversation, on_delete=models.DO_NOTHING) @@ -81,4 +86,4 @@ class Post(Model): auto_author = 'author' -get_user_model()._meta.serializer_fields = ['@id', 'username', 'first_name', 'last_name', 'email', 'conversation_set'] +get_user_model()._meta.serializer_fields = ['@id', 'username', 'first_name', 'last_name', 'email', 'userprofile'] diff --git a/djangoldp/tests/tests_update.py b/djangoldp/tests/tests_update.py index 41f10a90..1e3f22d2 100644 --- a/djangoldp/tests/tests_update.py +++ b/djangoldp/tests/tests_update.py @@ -284,10 +284,10 @@ class Update(TestCase): "http://happy-dev.fr/owl/#first_name": "Alexandre", "http://happy-dev.fr/owl/#last_name": "Bourlier", "http://happy-dev.fr/owl/#username": "alex", - 'http://happy-dev.fr/owl/#conversation_set': {'@id': "_:b975"} + 'http://happy-dev.fr/owl/#userprofile': {'@id': "_:b975"} } ] response = self.client.put('/users/{}/'.format(user.pk), data=json.dumps(body), content_type='application/ld+json') self.assertEqual(response.status_code, 200) - self.assertIn('conversation_set', response.data) + self.assertIn('userprofile', response.data) -- GitLab