From a41f7dccf4274af90eee537a0d5e88242f869422 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste <bleme@pm.me>
Date: Mon, 2 Sep 2019 15:50:14 +0200
Subject: [PATCH] update: Allow non-QuerySet on virtual field

---
 djangoldp/serializers.py      | 36 +++++++++++++++++++----------------
 djangoldp/tests/models.py     |  5 ++++-
 djangoldp/tests/tests_get.py  | 13 +++++++++++++
 djangoldp/tests/tests_temp.py |  4 ----
 4 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py
index 72b90a41..ba22a039 100644
--- a/djangoldp/serializers.py
+++ b/djangoldp/serializers.py
@@ -269,23 +269,27 @@ class LDPSerializer(HyperlinkedModelSerializer):
     def build_property_field(self, field_name, model_class):
         class JSonLDPropertyField(ReadOnlyField):
             def to_representation(self, instance):
+                from djangoldp.views import LDPViewSet
+                try:
+                    model_class = instance.model
+                except :
+                    model_class = instance.__class__
+                serializer_generator = LDPViewSet(model=model_class,
+                                                  lookup_field=Model.get_meta(model_class, 'lookup_field', 'pk'),
+                                                  permission_classes=Model.get_meta(model_class,
+                                                                                    'permission_classes',
+                                                                                    [LDPPermissions]),
+                                                  fields=Model.get_meta(model_class, 'serializer_fields', []),
+                                                  nested_fields=Model.get_meta(model_class, 'nested_fields', []))
+                parent_depth = max(getattr(self.parent.Meta, "depth", 0) - 1, 0)
+                serializer_generator.depth = parent_depth
+                serializer = serializer_generator.build_read_serializer()(context=self.parent.context)
+                if parent_depth is 0:
+                    serializer.Meta.fields = ["@id"]
+
                 if isinstance(instance, QuerySet):
                     data = list(instance)
-                    model_class = instance.model
-                    from djangoldp.views import LDPViewSet
-
-                    serializer_generator = LDPViewSet(model=model_class,
-                                                      lookup_field=Model.get_meta(model_class, 'lookup_field', 'pk'),
-                                                      permission_classes=Model.get_meta(model_class,
-                                                                                        'permission_classes',
-                                                                                        [LDPPermissions]),
-                                                      fields=Model.get_meta(model_class, 'serializer_fields', []),
-                                                      nested_fields=Model.get_meta(model_class, 'nested_fields', []))
-                    parent_depth = max(getattr(self.parent.Meta, "depth", 0) - 1, 0)
-                    serializer_generator.depth = parent_depth
-                    serializer = serializer_generator.build_read_serializer()(context=self.parent.context)
-                    if parent_depth is 0:
-                        serializer.Meta.fields = ["@id"]
+
                     return {'@id': '{}{}{}/'.format(settings.SITE_URL, '{}{}/', self.source),
                             '@type': 'ldp:Container',
                             'ldp:contains': [serializer.to_representation(item) if item is not None else None for item
@@ -294,7 +298,7 @@ class LDPSerializer(HyperlinkedModelSerializer):
                                                                  ['view', 'add'])
                             }
                 else:
-                    return instance
+                    return serializer.to_representation(instance)
 
         field_class = JSonLDPropertyField
         field_kwargs = {}
diff --git a/djangoldp/tests/models.py b/djangoldp/tests/models.py
index a024d1b5..332cc391 100644
--- a/djangoldp/tests/models.py
+++ b/djangoldp/tests/models.py
@@ -32,12 +32,15 @@ class JobOffer(Model):
     def recent_skills(self):
         return self.skills.filter(date__gte=date.today())
 
+    def some_skill(self):
+        return self.skills.all().first()
+
     class Meta:
         anonymous_perms = ['view']
         authenticated_perms = ['inherit', 'change', 'add']
         owner_perms = ['inherit', 'delete', 'control']
         nested_fields = ["skills"]
-        serializer_fields = ["@id", "title", "skills", "recent_skills", "resources"]
+        serializer_fields = ["@id", "title", "skills", "recent_skills", "resources", "slug", "some_skill"]
         container_path = "job-offers/"
         lookup_field = 'slug'
 
diff --git a/djangoldp/tests/tests_get.py b/djangoldp/tests/tests_get.py
index 6d25c1d4..485fcd37 100644
--- a/djangoldp/tests/tests_get.py
+++ b/djangoldp/tests/tests_get.py
@@ -62,3 +62,16 @@ class TestGET(APITestCase):
         self.assertIn('recent_jobs', response.data)
         self.assertEqual(response.data['recent_jobs']['@id'], "http://happy-dev.fr/skills/1/recent_jobs/")
 
+    def test_get_virtual_field(self):
+        skill = Skill.objects.create(title="Java", obligatoire="ok", slug="1")
+        skill2 = Skill.objects.create(title="Java", obligatoire="ok", slug="2")
+        job = JobOffer.objects.create(title="job", slug="1")
+        job.skills.add(skill)
+        job.skills.add(skill2)
+        job.save()
+        response = self.client.get('/job-offers/{}/'.format(job.slug), content_type='application/ld+json')
+        self.assertEqual(response.status_code, 200)
+        self.assertIn('some_skill', response.data)
+        self.assertEqual(response.data['some_skill']['@id'], "http://testserver/skills/1/")
+
+
diff --git a/djangoldp/tests/tests_temp.py b/djangoldp/tests/tests_temp.py
index 9c806dd3..6896080d 100644
--- a/djangoldp/tests/tests_temp.py
+++ b/djangoldp/tests/tests_temp.py
@@ -1,11 +1,7 @@
-import json
-
 from django.contrib.auth.models import User
 from django.test import TestCase
 from rest_framework.test import APIRequestFactory, APIClient
 
-from djangoldp.tests.models import Resource
-
 
 class TestTemp(TestCase):
 
-- 
GitLab