diff --git a/djangoldp/tests/models.py b/djangoldp/tests/models.py index eb4d11be75049641c0783a259c2ce5f2f4012e32..288a0b35643e5a50592b40c0626334057de6b5ed 100644 --- a/djangoldp/tests/models.py +++ b/djangoldp/tests/models.py @@ -137,40 +137,6 @@ class PermissionlessDummy(Model): ) -class Invoice(Model): - title = models.CharField(max_length=255, blank=True, null=True) - date = models.DateField(blank=True, null=True) - - class Meta(Model.Meta): - depth = 2 - anonymous_perms = ['view'] - authenticated_perms = ['inherit', 'add'] - owner_perms = ['inherit', 'change', 'delete', 'control'] - - -class Batch(Model): - invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE, related_name='batches') - title = models.CharField(max_length=255, blank=True, null=True) - - class Meta(Model.Meta): - serializer_fields = ['@id', 'title', 'invoice', 'tasks'] - anonymous_perms = ['view', 'add'] - authenticated_perms = ['inherit', 'add'] - owner_perms = ['inherit', 'change', 'delete', 'control'] - depth = 1 - - -class Task(models.Model): - batch = models.ForeignKey(Batch, on_delete=models.CASCADE, related_name='tasks') - title = models.CharField(max_length=255) - - class Meta(Model.Meta): - serializer_fields = ['@id', 'title', 'batch'] - anonymous_perms = ['view'] - authenticated_perms = ['inherit', 'add'] - owner_perms = ['inherit', 'change', 'delete', 'control'] - - class Post(Model): content = models.CharField(max_length=255) author = models.ForeignKey(UserProfile, blank=True, null=True, on_delete=models.SET_NULL) @@ -185,12 +151,22 @@ class Post(Model): owner_perms = ['inherit'] +class Invoice(Model): + title = models.CharField(max_length=255, blank=True, null=True) + date = models.DateField(blank=True, null=True) + + class Meta(Model.Meta): + depth = 2 + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] + + class Circle(Model): name = models.CharField(max_length=255, blank=True) description = models.CharField(max_length=255, blank=True) team = models.ManyToManyField(settings.AUTH_USER_MODEL, through="CircleMember", blank=True) - owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="owned_circles", on_delete=models.DO_NOTHING, - null=True, blank=True) + owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="owned_circles", on_delete=models.DO_NOTHING, null=True, blank=True) class Meta(Model.Meta): anonymous_perms = ['view', 'add', 'delete', 'add', 'change', 'control'] @@ -199,6 +175,18 @@ class Circle(Model): depth = 1 +class Batch(Model): + invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE, related_name='batches') + title = models.CharField(max_length=255, blank=True, null=True) + + class Meta(Model.Meta): + serializer_fields = ['@id', 'title', 'invoice', 'tasks'] + anonymous_perms = ['view', 'add'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] + depth = 1 + + class CircleMember(Model): circle = models.ForeignKey(Circle, on_delete=models.CASCADE, related_name='members') user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="circles") @@ -212,6 +200,17 @@ class CircleMember(Model): rdf_type = 'hd:circlemember' +class Task(models.Model): + batch = models.ForeignKey(Batch, on_delete=models.CASCADE, related_name='tasks') + title = models.CharField(max_length=255) + + class Meta(Model.Meta): + serializer_fields = ['@id', 'title', 'batch'] + anonymous_perms = ['view'] + authenticated_perms = ['inherit', 'add'] + owner_perms = ['inherit', 'change', 'delete', 'control'] + + class Project(Model): description = models.CharField(max_length=255, null=True, blank=False) team = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='projects') diff --git a/djangoldp/tests/runner.py b/djangoldp/tests/runner.py index af89c6b874dac8a703ed4fcb1ea802455b4c0e23..32f99f731b8b8e326382770e7508ca6fb85d5079 100644 --- a/djangoldp/tests/runner.py +++ b/djangoldp/tests/runner.py @@ -25,7 +25,7 @@ failures = test_runner.run_tests([ 'djangoldp.tests.tests_pagination', 'djangoldp.tests.tests_inbox', 'djangoldp.tests.tests_backlinks_service', - #'djangoldp.tests.tests_temp' + # 'djangoldp.tests.tests_temp' ]) if failures: sys.exit(failures) diff --git a/djangoldp/tests/tests_get.py b/djangoldp/tests/tests_get.py index a32a80bd9255ef94478b6a66911417822ccb6b5c..f2486a1a4612ba330060535012cd28ce66320c57 100644 --- a/djangoldp/tests/tests_get.py +++ b/djangoldp/tests/tests_get.py @@ -88,6 +88,7 @@ class TestGET(APITestCase): self.assertEqual(response.status_code, 200) self.assertEquals(response.data['@id'], 'http://happy-dev.fr/invoices/{}/batches/'.format(invoice.pk)) self.assertEquals(len(response.data['ldp:contains']), 2) + self.assertEquals(response.data['ldp:contains'][0]['invoice']['@id'], 'http://happy-dev.fr/invoices/{}/'.format(invoice.pk)) def test_serializer_excludes(self): date = DateModel.objects.create(excluded='test', value=datetime.now()) diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py index d1ab7b30e1f4a4a8b0454f023239ca1ada46d257..a785233b4a729cf748ec289aa3d7563304a39a0a 100644 --- a/djangoldp/tests/tests_save.py +++ b/djangoldp/tests/tests_save.py @@ -284,6 +284,41 @@ class Save(TestCase): "http://testserver/resources/{}/".format(resource.pk)) self.assertEqual(response.data['title'], "new job") + + def test_nested_container_bis(self): + invoice = Invoice.objects.create() + body = { + 'http://happy-dev.fr/owl/#title': "new batch", + } + + response = self.client.post('/invoices/{}/batches/'.format(invoice.pk), + data=json.dumps(body), + content_type='application/ld+json') + self.assertEqual(response.status_code, 201) + self.assertEqual(response.data['invoice']['@id'], + "http://happy-dev.fr/invoices/{}/".format(invoice.pk)) + self.assertEqual(response.data['title'], "new batch") + + def test_nested_container_ter(self): + circle = Circle.objects.create() + body = { + 'user' : { + "username" : "hubl-workaround-493" + }, + # 'circle' : {}, + '@context': { + "@vocab": "http://happy-dev.fr/owl/#", + } + } + + response = self.client.post('/circles/{}/members/'.format(circle.pk), + data=json.dumps(body), + content_type='application/ld+json') + self.assertEqual(response.status_code, 201) + 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 index db4dba0863fe0edbfde9f2a60c88eb5862017afb..12e99f804472d34eec34fac1e9fbca77dc827660 100644 --- a/djangoldp/tests/tests_temp.py +++ b/djangoldp/tests/tests_temp.py @@ -5,6 +5,7 @@ from django.test import TestCase from rest_framework.test import APIRequestFactory, APIClient from djangoldp.models import LDPSource +from djangoldp.tests.models import Invoice, Circle class TestTemp(TestCase): diff --git a/djangoldp/views.py b/djangoldp/views.py index 6e12304e21c2d655e5b9593b9b577302ee4eafe2..09d0a54352248550cec9291ef3e86ecf8feb985b 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -381,6 +381,10 @@ class LDPViewSet(LDPViewSetGenerator): '@id': {'lookup_field': lookup_field}}, 'depth': getattr(self, 'depth', Model.get_meta(self.model, 'depth', 0)), 'extra_fields': self.nested_fields} + if self.fields: + meta_args['fields'] = self.fields + else: + meta_args['exclude'] = Model.get_meta(self.model, 'serializer_fields_exclude') or () return self.build_serializer(meta_args, 'Read') def build_write_serializer(self): @@ -390,14 +394,15 @@ class LDPViewSet(LDPViewSetGenerator): '@id': {'lookup_field': lookup_field}}, 'depth': 10, 'extra_fields': self.nested_fields} - return self.build_serializer(meta_args, 'Write') - - def build_serializer(self, meta_args, name_prefix): - # create the Meta class to associate to LDPSerializer, using meta_args param if self.fields: meta_args['fields'] = self.fields else: meta_args['exclude'] = self.exclude or Model.get_meta(self.model, 'serializer_fields_exclude') or () + return self.build_serializer(meta_args, 'Write') + + def build_serializer(self, meta_args, name_prefix): + # create the Meta class to associate to LDPSerializer, using meta_args param + meta_class = type('Meta', (), meta_args) from djangoldp.serializers import LDPSerializer