From 9ee2a8502c3f3bc6fa5405797b9ab1db21a83c6d Mon Sep 17 00:00:00 2001
From: Jean-Baptiste <bleme@pm.me>
Date: Tue, 19 Feb 2019 17:35:38 +0100
Subject: [PATCH] update: manage slug on custom model

---
 djangoldp/models.py      | 13 ++++++++++---
 djangoldp/serializers.py |  2 +-
 djangoldp/tests/urls.py  |  3 ++-
 3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/djangoldp/models.py b/djangoldp/models.py
index 61d746a8..00c63943 100644
--- a/djangoldp/models.py
+++ b/djangoldp/models.py
@@ -1,10 +1,14 @@
 from django.conf import settings
 from django.db import models
+from django.urls import get_resolver
 
 
 class Model(models.Model):
     container_path = None
 
+    def get_container_path(self):
+        return self.container_path
+
     def get_absolute_url(self):
         return Model.resource_id(self)
 
@@ -13,16 +17,19 @@ class Model(models.Model):
 
     @classmethod
     def resource_id(cls, instance):
-        return "{}{}".format(Model.container_id(instance), instance.pk)
+        view_name = '{}-detail'.format(instance._meta.object_name.lower())
+        slug_field = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][1][0])
+        if slug_field.startswith('/'):
+            slug_field = slug_field[1:]
+        return "{}{}".format(Model.container_id(instance), getattr(instance, slug_field))
 
     @classmethod
     def container_id(cls, instance):
         if isinstance(instance, cls):
             path = instance.container_path
         else:
-            from django.urls import get_resolver
             view_name = '{}-list'.format(instance._meta.object_name.lower())
-            path = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][0], instance.pk)
+            path = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][0])
 
         if not path.startswith("/"):
             path = "/{}".format(path)
diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py
index 815be906..a2d0f6dc 100644
--- a/djangoldp/serializers.py
+++ b/djangoldp/serializers.py
@@ -41,7 +41,7 @@ class LDListMixin:
         try:
             object_list = dictionary["@graph"]
             view_name = '{}-list'.format(self.parent.Meta.model._meta.object_name.lower())
-            part_id = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][0], self.parent.instance.pk)
+            part_id = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][0])
             obj = next(filter(lambda o: part_id in o['@id'], object_list))
             list = super().get_value(obj)
             try:
diff --git a/djangoldp/tests/urls.py b/djangoldp/tests/urls.py
index 8e1cbc86..392b0e2b 100644
--- a/djangoldp/tests/urls.py
+++ b/djangoldp/tests/urls.py
@@ -1,6 +1,6 @@
 from django.conf import settings
 
-from djangoldp.tests.models import Skill, JobOffer, Message, Thread, Dummy
+from djangoldp.tests.models import Skill, JobOffer, Message, Thread, Dummy, LDPDummy
 from djangoldp.views import LDPViewSet
 from django.conf.urls import url
 
@@ -12,4 +12,5 @@ urlpatterns = [
     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=[])),
     url(r'^dummys/', LDPViewSet.urls(model=Dummy, permission_classes=[])),
+    url(r'^ldp-dummys/', LDPViewSet.urls(model=LDPDummy, permission_classes=[])),
 ]
\ No newline at end of file
-- 
GitLab