diff --git a/.gitignore b/.gitignore index e8d72a0a452ed32314551a62ab07bd3b47b326d3..1ff4b346513763a68ed8d2a1c14cce95bf835e62 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ dist *.egg-info *.pyc *~ +djangoldp/tests/tests_temp.py diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index e8e49514f86f0a5432312033deaad405a5c268bc..710d1bff4f1ea49cef00bf7ba1dd54a5353c70e9 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -584,7 +584,6 @@ class LDPSerializer(HyperlinkedModelSerializer): def update(self, instance, validated_data): model = self.Meta.model - validated_data = self.resolve_fk_instances(model, validated_data) nested_fields = [] nested_fields_name = list(filter(lambda key: isinstance(validated_data[key], list), validated_data)) @@ -620,16 +619,7 @@ class LDPSerializer(HyperlinkedModelSerializer): sub_inst = None if 'urlid' in field_dict: # has urlid and is a local resource - if parse.urlparse(settings.BASE_URL).netloc == parse.urlparse(field_dict['urlid']).netloc: - # try slug field if it exists - if slug_field in field_dict: - kwargs = {slug_field: field_dict[slug_field]} - sub_inst = field_model.objects.get(**kwargs) - else: - model, sub_inst = Model.resolve(field_dict['urlid']) - # remote resource - get backlinked copy - elif hasattr(field_model, 'urlid'): - sub_inst = Model.get_or_create_external(field_model, field_dict['urlid']) + model, sub_inst = self.get_inst_by_urlid(field_dict, field_model, model, slug_field, sub_inst) # try slug field, assuming that this is a local resource elif slug_field in field_dict: kwargs = {slug_field: field_dict[slug_field]} @@ -643,14 +633,33 @@ class LDPSerializer(HyperlinkedModelSerializer): validated_data[field_name] = sub_inst return validated_data + def get_inst_by_urlid(self, field_dict, field_model, model, slug_field, sub_inst): + if parse.urlparse(settings.BASE_URL).netloc == parse.urlparse(field_dict['urlid']).netloc: + # try slug field if it exists + if slug_field in field_dict: + kwargs = {slug_field: field_dict[slug_field]} + sub_inst = field_model.objects.get(**kwargs) + else: + model, sub_inst = Model.resolve(field_dict['urlid']) + # remote resource - get backlinked copy + elif hasattr(field_model, 'urlid'): + sub_inst = Model.get_or_create_external(field_model, field_dict['urlid']) + return model, sub_inst + def update_dict_value(self, attr, instance, value): info = model_meta.get_field_info(instance) slug_field = Model.slug_field(instance) relation_info = info.relations.get(attr) - if slug_field in value: + if slug_field in value : value = self.update_dict_value_when_id_is_provided(attr, instance, relation_info, slug_field, value) else: - value = self.update_dict_value_without_slug_field(attr, instance, relation_info, value) + if 'urlid' in value: + if parse.urlparse(settings.BASE_URL).netloc == parse.urlparse(value['urlid']).netloc: + model, value = Model.resolve(value['urlid']) + elif hasattr(relation_info.related_model, 'urlid'): + value = Model.get_or_create_external(relation_info.related_model, value['urlid']) + else: + value = self.update_dict_value_without_slug_field(attr, instance, relation_info, value) return value def update_dict_value_without_slug_field(self, attr, instance, relation_info, value): diff --git a/djangoldp/tests/runner.py b/djangoldp/tests/runner.py index 9ef164ecd6dceb6079edbb58e5f52e2836cfb619..3966fd5190de0a9f37e7c3838f15e24b2c234e62 100644 --- a/djangoldp/tests/runner.py +++ b/djangoldp/tests/runner.py @@ -24,8 +24,7 @@ failures = test_runner.run_tests([ 'djangoldp.tests.tests_sources', 'djangoldp.tests.tests_pagination', 'djangoldp.tests.tests_inbox', - 'djangoldp.tests.tests_backlinks_service', - # 'djangoldp.tests.tests_temp' + 'djangoldp.tests.tests_backlinks_service' ]) if failures: diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py index a785233b4a729cf748ec289aa3d7563304a39a0a..48fe32f3d91be959db82c26cb8223cdd05d65e21 100644 --- a/djangoldp/tests/tests_save.py +++ b/djangoldp/tests/tests_save.py @@ -318,7 +318,6 @@ class Save(TestCase): self.assertEqual(response.data['circle']['@id'], "http://testserver/circles/{}/".format(circle.pk)) - def test_nested_container_federated(self): resource = Resource.objects.create() body = { diff --git a/djangoldp/tests/tests_temp.py b/djangoldp/tests/tests_temp.py deleted file mode 100644 index a7e6d763bfd3cc08962a5ad393691e3f3a8174e5..0000000000000000000000000000000000000000 --- a/djangoldp/tests/tests_temp.py +++ /dev/null @@ -1,47 +0,0 @@ -import json - -from guardian.shortcuts import assign_perm - -from .models import PermissionlessDummy, Dummy -from django.contrib.auth import get_user_model -from django.test import TestCase -from rest_framework.test import APIRequestFactory, APIClient - -from djangoldp.models import LDPSource -from djangoldp.tests.models import Invoice, Circle, Conversation -from ..permissions import LDPPermissions - - -class TestTemp(TestCase): - - def setUp(self): - self.client = APIClient() - - def setUpLoggedInUser(self): - self.user = get_user_model().objects.create_user(username='john', email='jlennon@beatles.com', - password='glass onion') - self.client.force_authenticate(user=self.user) - - # optional setup for testing PermissionlessDummy model with parameterised perms - def setUpGuardianDummyWithPerms(self, perms=[]): - self.dummy = PermissionlessDummy.objects.create(some='test', slug='test') - model_name = PermissionlessDummy._meta.model_name - - for perm in perms: - assign_perm(perm + '_' + model_name, self.user, self.dummy) - - def tearDown(self): - pass - - - # test with anonymous user - def test_invalidate_cache_permissions(self): - self.setUpLoggedInUser() - self.setUpGuardianDummyWithPerms() - response = self.client.get('/permissionless-dummys/{}/'.format(self.dummy.slug)) - self.assertEqual(response.status_code, 403) - assign_perm('view' + '_' + PermissionlessDummy._meta.model_name, self.user, self.dummy) - LDPPermissions.invalidate_cache() - response = self.client.get('/permissionless-dummys/{}/'.format(self.dummy.slug)) - self.assertEqual(response.status_code, 200) - diff --git a/djangoldp/tests/tests_update.py b/djangoldp/tests/tests_update.py index 17d5702ceece7558d75adc4325ba363c105eaf43..134172011e71e4871daaf800c70d86aafcc71d89 100644 --- a/djangoldp/tests/tests_update.py +++ b/djangoldp/tests/tests_update.py @@ -595,3 +595,31 @@ class Update(TestCase): user = get_user_model().objects.get(pk=ext_user.pk) self.assertEqual(user.projects.count(), 0) + + def test_update_sub_object_with_urlid(self): + user = get_user_model().objects.create(username="alex", password="test") + profile = UserProfile.objects.create(user=user, description="user description") + body = { + '@id': '/users/{}/'.format(user.pk), + "first_name": "Alexandre", + "last_name": "Bourlier", + "username": "alex", + 'userprofile': { + '@id': "http://happy-dev.fr/userprofiles/{}/".format(profile.pk), + 'description': "user update" + }, + '@context': { + "@vocab": "http://happy-dev.fr/owl/#", + } + } + + 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('userprofile', response.data) + + response = self.client.get('/userprofiles/{}/'.format(profile.pk), + content_type='application/ld+json') + self.assertEqual(response.data['description'], "user update") + +