Skip to content
Snippets Groups Projects
Commit b9028301 authored by Jean-Baptiste Pasquier's avatar Jean-Baptiste Pasquier
Browse files

Merge branch 'fix/Hubl-766' into 'master'

Sub object can't be updated

Closes applications/hubl#766

See merge request !165
parents 680855d8 42fce76a
No related branches found
Tags v1.1.3
1 merge request!165Sub object can't be updated
Pipeline #7762 passed with stage
in 34 seconds
......@@ -2,3 +2,4 @@ dist
*.egg-info
*.pyc
*~
djangoldp/tests/tests_temp.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):
......
......@@ -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:
......
......@@ -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 = {
......
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)
......@@ -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")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment