diff --git a/djangoldp/models.py b/djangoldp/models.py index dcebce7af3edd38ece5ad89fac9872b9f1f1912d..3dce34ef3348e1373dd90905fdf09217ba72fa0e 100644 --- a/djangoldp/models.py +++ b/djangoldp/models.py @@ -1,3 +1,4 @@ +from django.conf import settings from django.contrib.auth.models import User from django.db import models from django.db.models.base import ModelBase @@ -138,7 +139,7 @@ class Model(models.Model): @classmethod def is_external(cls, value): try: - return value.urlid is not None + return value.urlid is not None and not value.urlid.startswith(settings.SITE_URL) except: return False diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 2d2e96e59c389793cde1cf827ec6cf311aac3793..304933b9c260b642630f4bad29a24e21ebe10165 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -339,6 +339,8 @@ class LDPSerializer(HyperlinkedModelSerializer): super().__init__(**kwargs) def get_value(self, dictionary): + if self.field_name == 'urlid': + self.field_name = '@id' try: object_list = dictionary["@graph"] if self.parent.instance is None: @@ -354,6 +356,9 @@ class LDPSerializer(HyperlinkedModelSerializer): except KeyError: value = super().get_value(dictionary) + if self.field_name == '@id' and value == './': + self.field_name = 'urlid' + return None return self.manage_empty(value) def manage_empty(self, value): @@ -384,6 +389,8 @@ class LDPSerializer(HyperlinkedModelSerializer): fields = '__all__' def to_internal_value(self, data): + if self.url_field_name in data and not 'urlid' in data and data[self.url_field_name].startswith('http'): + data['urlid'] = data[self.url_field_name] if data is '': return '' if self.url_field_name in data: @@ -397,6 +404,7 @@ class LDPSerializer(HyperlinkedModelSerializer): ret = OrderedDict() errors = OrderedDict() + fields = list(filter(lambda x: x.field_name in data, self._writable_fields)) for field in fields: diff --git a/djangoldp/tests/models.py b/djangoldp/tests/models.py index fe6de31f645f445108295ef3f325f6ea05ea8768..c3bf10a6c537097ab4bd6106577277962f36366b 100644 --- a/djangoldp/tests/models.py +++ b/djangoldp/tests/models.py @@ -40,7 +40,7 @@ class JobOffer(Model): authenticated_perms = ['inherit', 'change', 'add'] owner_perms = ['inherit', 'delete', 'control'] nested_fields = ["skills"] - serializer_fields = ["@id", "title", "skills", "recent_skills", "resources", "slug", "some_skill"] + serializer_fields = ["@id", "title", "skills", "recent_skills", "resources", "slug", "some_skill", "urlid"] container_path = "job-offers/" lookup_field = 'slug' diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py index 0674d12a6e7fe5bc85f5f332f7d7dddaffe8e30d..089cb551050e55d9341e7afa801388fcaf5bff76 100644 --- a/djangoldp/tests/tests_save.py +++ b/djangoldp/tests/tests_save.py @@ -268,6 +268,19 @@ class Save(TestCase): self.assertEqual(response.data['resources']['ldp:contains'][0]['@id'], "http://testserver/resources/{}/".format(resource.pk)) self.assertEqual(response.data['title'], "new job") + def test_nested_container_federated(self): + resource = Resource.objects.create() + body = { + 'http://happy-dev.fr/owl/#@id': "http://external.job/job/1", + } + + 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)) + self.assertEqual(response.data['@id'], "http://external.job/job/1") + def test_embedded_context_2(self): body = { '@id': "./", diff --git a/djangoldp/tests/tests_temp.py b/djangoldp/tests/tests_temp.py index 6896080d1d3f2712c0adf3ac687131f0cd8a561d..b3ef7100cea8141b870c33296df8616979c57f10 100644 --- a/djangoldp/tests/tests_temp.py +++ b/djangoldp/tests/tests_temp.py @@ -12,3 +12,4 @@ class TestTemp(TestCase): def tearDown(self): pass + diff --git a/djangoldp/tests/tests_update.py b/djangoldp/tests/tests_update.py index 431db723282d3467746d77162ca92c2764ac843b..bbd9846ac2767bd8484a5a19e3dd83a1c8fe83a6 100644 --- a/djangoldp/tests/tests_update.py +++ b/djangoldp/tests/tests_update.py @@ -264,7 +264,7 @@ class Update(TestCase): def test_put_resource(self): post = Post.objects.create(content="content") body = [{ - '@id': '/posts/{}/'.format(post.pk), + '@id': 'http://testserver.com/posts/{}/'.format(post.pk), 'http://happy-dev.fr/owl/#content': "post content"}] response = self.client.put('/posts/{}/'.format(post.pk), data=json.dumps(body), content_type='application/ld+json') @@ -401,7 +401,7 @@ class Update(TestCase): job = JobOffer.objects.create(title="first title", slug="job") body = { 'http://happy-dev.fr/owl/#joboffers': { - '@id': 'http://testserver/job-offers/{}/'.format(job.slug), + '@id': 'http://testserver.com/job-offers/{}/'.format(job.slug), } } @@ -410,7 +410,7 @@ class Update(TestCase): content_type='application/ld+json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['joboffers']['ldp:contains'][0]['@id'], - "http://testserver/job-offers/{}/".format(job.slug)) + "http://testserver.com/job-offers/{}/".format(job.slug)) self.assertEqual(response.data['joboffers']['ldp:contains'][0]['title'], "first title") def test_m2m_new_link_bis(self): @@ -419,9 +419,9 @@ class Update(TestCase): body = { 'http://happy-dev.fr/owl/#joboffers': { - '@id': "http://testserver/resources/{}/joboffers/".format(resource.pk), + '@id': "http://testserver.com/resources/{}/joboffers/".format(resource.pk), 'ldp:contains': [ - {'@id': 'http://testserver/job-offers/{}/'.format(job.slug), + {'@id': 'http://testserver.com/job-offers/{}/'.format(job.slug), 'http://happy-dev.fr/owl/#title': "new job", }, ] @@ -433,7 +433,7 @@ class Update(TestCase): content_type='application/ld+json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['joboffers']['ldp:contains'][0]['@id'], - "http://testserver/job-offers/{}/".format(job.slug)) + "http://testserver.com/job-offers/{}/".format(job.slug)) self.assertEqual(response.data['joboffers']['ldp:contains'][0]['title'], "new job") def test_m2m_new_link_embedded(self): @@ -463,7 +463,7 @@ class Update(TestCase): # '@id': "http://testserver/resources/{}/joboffers/".format(resource.pk), 'ldp:contains': [ { - '@id': 'http://testserver/job-offers/{}/'.format(job.slug), + '@id': 'http://testserver.com/job-offers/{}/'.format(job.slug), 'http://happy-dev.fr/owl/#title': "new job", } ] @@ -475,5 +475,20 @@ class Update(TestCase): content_type='application/ld+json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['joboffers']['ldp:contains'][0]['@id'], - "http://testserver/job-offers/{}/".format(job.slug)) + "http://testserver.com/job-offers/{}/".format(job.slug)) self.assertEqual(response.data['joboffers']['ldp:contains'][0]['title'], "new job") + + def test_m2m_new_link_federated(self): + resource = Resource.objects.create() + body = { + 'http://happy-dev.fr/owl/#joboffers': { + 'http://happy-dev.fr/owl/#@id': 'http://external.job/job/1', + } + } + + response = self.client.put('/resources/{}/'.format(resource.pk), + data=json.dumps(body), + content_type='application/ld+json') + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data['joboffers']['ldp:contains'][0]['@id'], + "http://external.job/job/1")