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

Merge branch '85-nested-fixes' into 'master'

Resolve "create data nested in a main data with new id"

Closes #85 and #86

See merge request startinblox/djangoldp-packages/djangoldp!20
parents 0a9217a1 3a9334f3
No related branches found
No related tags found
1 merge request!20Resolve "create data nested in a main data with new id"
Pipeline #720 passed
......@@ -358,7 +358,7 @@ class LDPSerializer(HyperlinkedModelSerializer):
else:
rel = getattr(instance._meta.model, field_name).rel
try:
if rel.related_name == field_name:
if rel.related_model == manager.model:
reverse_id = rel.remote_field.attname
item[reverse_id] = instance.pk
except AttributeError:
......
......@@ -14,10 +14,12 @@ class JobOffer(models.Model):
class Thread(models.Model):
description = models.CharField(max_length=255, blank=True, null=True)
author_user = models.ForeignKey(settings.AUTH_USER_MODEL)
class Message(models.Model):
text = models.CharField(max_length=255, blank=True, null=True)
thread = models.ForeignKey(Thread, on_delete=models.DO_NOTHING)
author_user = models.ForeignKey(settings.AUTH_USER_MODEL)
from django.contrib.auth.models import User
from django.test import TestCase
from djangoldp.serializers import LDPSerializer
......@@ -45,28 +46,32 @@ class Serializer(TestCase):
job1 = JobOffer.objects.create(title="job test")
job1.skills.add(skill)
job = {"@graph": [{"@id": "https://happy-dev.fr/job-offers/{}/".format(job1.pk),
"title": "job test updated",
"skills": {
"ldp:contains": [
{"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk)},
{"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk)},
{"@id": "_.123"},
]}
},
{
"@id": "_.123",
"title": "new skill",
"obligatoire": "okay"
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk),
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk),
"title": "skill2 UP"
}]
}
job = {"@graph":
[
{
"@id": "https://happy-dev.fr/job-offers/{}/".format(job1.pk),
"title": "job test updated",
"skills": {
"ldp:contains": [
{"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk)},
{"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk)},
{"@id": "_.123"},
]}
},
{
"@id": "_.123",
"title": "new skill",
"obligatoire": "okay"
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk),
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk),
"title": "skill2 UP"
}
]
}
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")}
......@@ -91,33 +96,37 @@ class Serializer(TestCase):
job1 = JobOffer.objects.create(title="job test")
job1.skills.add(skill)
job = {"@graph":[{"@id": "https://happy-dev.fr/job-offers/{}/".format(job1.pk),
"title": "job test updated",
"skills": {
"@id": "https://happy-dev.fr/job-offers/{}/skills/".format(job1.pk)
}
},
{
"@id": "_.123",
"title": "new skill",
"obligatoire": "okay"
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk),
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk),
"title": "skill2 UP"
},
{
'@id': "https://happy-dev.fr/job-offers/{}/skills/".format(job1.pk),
"ldp:contains": [
{"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk)},
{"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk)},
{"@id": "_.123"},
]
}]
}
job = {"@graph":
[
{
"@id": "https://happy-dev.fr/job-offers/{}/".format(job1.pk),
"title": "job test updated",
"skills": {
"@id": "https://happy-dev.fr/job-offers/{}/skills/".format(job1.pk)
}
},
{
"@id": "_.123",
"title": "new skill",
"obligatoire": "okay"
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk),
},
{
"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk),
"title": "skill2 UP"
},
{
'@id': "https://happy-dev.fr/job-offers/{}/skills/".format(job1.pk),
"ldp:contains": [
{"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk)},
{"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk)},
{"@id": "_.123"},
]
}
]
}
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")}
......@@ -136,30 +145,96 @@ class Serializer(TestCase):
self.assertEquals(skills[2].title, "skill2 UP") # title updated
def test_update_list_with_reverse_relation(self):
thread = Thread.objects.create(description="Thread 1")
message1 = Message.objects.create(text="Message 1", thread=thread)
message2 = Message.objects.create(text="Message 2", thread=thread)
user1 = User.objects.create()
thread = Thread.objects.create(description="Thread 1", author_user=user1)
message1 = Message.objects.create(text="Message 1", thread=thread, author_user=user1)
message2 = Message.objects.create(text="Message 2", thread=thread, author_user=user1)
json = {"@graph": [
{
"@id": "https://happy-dev.fr/messages/{}/".format(message1.pk),
"text": "Message 1 UP"
},
{
"@id": "https://happy-dev.fr/messages/{}/".format(message2.pk),
"text": "Message 2 UP"
},
{
'@id': "https://happy-dev.fr/threads/{}/".format(thread.pk),
'description': "Thread 1 UP",
"message_set": [
{"@id": "https://happy-dev.fr/messages/{}/".format(message1.pk)},
{"@id": "https://happy-dev.fr/messages/{}/".format(message2.pk)},
]
}
]
}
meta_args = {'model': Thread, 'depth': 1, 'fields': ("@id", "description", "message_set")}
meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('ThreadSerializer', (LDPSerializer,), {'Meta': meta_class})
serializer = serializer_class(data=json, instance=thread)
serializer.is_valid()
result = serializer.save()
messages = result.message_set.all().order_by('text')
self.assertEquals(result.description, "Thread 1 UP")
self.assertIs(result.message_set.count(), 2)
self.assertEquals(messages[0].text, "Message 1 UP")
self.assertEquals(messages[1].text, "Message 2 UP")
def test_add_new_element_with_foreign_key_id(self):
user1 = User.objects.create()
thread = Thread.objects.create(description="Thread 1", author_user=user1)
message1 = Message.objects.create(text="Message 1", thread=thread, author_user=user1)
message2 = Message.objects.create(text="Message 2", thread=thread, author_user=user1)
json = {"@graph": [
{"@id": "https://happy-dev.fr/messages/{}/".format(message1.pk),
"text": "Message 1 UP"
{
"@id": "https://happy-dev.fr/messages/{}/".format(message1.pk),
"text": "Message 1 UP",
"author_user": {
'@id': "https://happy-dev.fr/users/{}/".format(user1.pk)
}
},
{
"@id": "https://happy-dev.fr/messages/{}/".format(message2.pk),
"text": "Message 2 UP",
"author_user": {
'@id': "https://happy-dev.fr/users/{}/".format(user1.pk)
}
},
{
"@id": "_:b1",
"text": "Message 3 NEW",
"author_user": {
'@id': "https://happy-dev.fr/users/{}/".format(user1.pk)
}
},
{
'@id': "https://happy-dev.fr/threads/{}".format(thread.pk),
"author_user": {
'@id': "https://happy-dev.fr/users/{}/".format(user1.pk)
},
{"@id": "https://happy-dev.fr/messages/{}/".format(message2.pk),
"text": "Message 2 UP"
},
{
'@id': "https://happy-dev.fr/threads/{}/".format(thread.pk),
'description': "Thread 1 UP",
"message_set": [
{"@id": "https://happy-dev.fr/messages/{}/".format(message1.pk)},
{"@id": "https://happy-dev.fr/messages/{}/".format(message2.pk)},
]
}
'description': "Thread 1 UP",
'message_set': {
"@id": "https://happy-dev.fr/threads/{}/message_set".format(thread.pk)
}
},
{
'@id': "https://happy-dev.fr/threads/{}/message_set".format(thread.pk),
"ldp:contains": [
{"@id": "https://happy-dev.fr/messages/{}/".format(message1.pk)},
{"@id": "https://happy-dev.fr/messages/{}/".format(message2.pk)},
{"@id": "_:b1"}
]
}
}
]
}
meta_args = {'model': Thread, 'depth': 1, 'fields': ("@id", "description", "message_set" )}
meta_args = {'model': Thread, 'depth': 1, 'fields': ("@id", "description", "message_set")}
meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('ThreadSerializer', (LDPSerializer,), {'Meta': meta_class})
......@@ -170,6 +245,7 @@ class Serializer(TestCase):
messages = result.message_set.all().order_by('text')
self.assertEquals(result.description, "Thread 1 UP")
self.assertIs(result.message_set.count(), 2)
self.assertIs(result.message_set.count(), 3)
self.assertEquals(messages[0].text, "Message 1 UP")
self.assertEquals(messages[1].text, "Message 2 UP")
self.assertEquals(messages[2].text, "Message 3 NEW")
from django.conf import settings
from djangoldp.tests.models import Skill, JobOffer, Message, Thread
from djangoldp.views import LDPViewSet
from django.conf.urls import url
......@@ -8,4 +10,5 @@ urlpatterns = [
url(r'^job-offers/', LDPViewSet.urls(model=JobOffer, nested_fields=["skills"], permission_classes=())),
url(r'^messages/', LDPViewSet.urls(model=Message, permission_classes=[], fields=["@id", "text"], nested_fields=[])),
url(r'^threads/', LDPViewSet.urls(model=Thread, nested_fields=["message_set"], permission_classes=())),
url(r'^users/', LDPViewSet.urls(model=settings.AUTH_USER_MODEL, permission_classes=[])),
]
\ No newline at end of file
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