From 6ba5bb3b256388e2be4e98bb6f66cb35c73e3fd8 Mon Sep 17 00:00:00 2001
From: Sylvain Le Bon <sylvain@happy-dev.fr>
Date: Sun, 17 Dec 2017 17:18:50 +0100
Subject: [PATCH] feature: slug fields lookup

---
 serializers.py | 10 ++++++++++
 views.py       | 13 ++++++++-----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/serializers.py b/serializers.py
index de3f357c..ef08ff70 100644
--- a/serializers.py
+++ b/serializers.py
@@ -1,3 +1,5 @@
+from django.core.urlresolvers import get_resolver
+from rest_framework.relations import HyperlinkedRelatedField
 from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer, CharField
 from rest_framework.utils.serializer_helpers import ReturnDict
 
@@ -11,6 +13,14 @@ class ContainerSerializer(ListSerializer):
 class LDPSerializer(HyperlinkedModelSerializer):
     url_field_name = "@id"
     
+    def __init__(self, *args, **kwargs):
+        super(LDPSerializer, self).__init__(*args, **kwargs)
+        for name, field in self.fields.items():
+            if isinstance(field, HyperlinkedRelatedField):
+                lookup_field = get_resolver().reverse_dict[field.view_name][0][0][1][0]
+                field.lookup_field = lookup_field
+                field.lookup_url_kwarg = lookup_field
+    
     @classmethod
     def many_init(cls, *args, **kwargs):
         kwargs['child'] = cls()
diff --git a/views.py b/views.py
index 711f6db6..939af65e 100644
--- a/views.py
+++ b/views.py
@@ -1,4 +1,5 @@
 from pyld import jsonld
+from django.apps import apps
 from django.conf import settings
 from django.conf.urls import url
 from django.utils.decorators import classonlymethod
@@ -27,7 +28,7 @@ class LDPViewSet(ModelViewSet):
     
     def __init__(self, model, **kwargs):
         class_attrs = {'Meta': type('Meta', (), {'model': model, 'exclude': ()})}
-        self.serializer_class = type(LDPSerializer)(model.__name__+'Serializer', (LDPSerializer,), class_attrs)
+        self.serializer_class = type(LDPSerializer)(model._meta.object_name.lower()+'Serializer', (LDPSerializer,), class_attrs)
         super().__init__(model=model, **kwargs)
     
     def get_queryset(self, *args, **kwargs):
@@ -39,12 +40,14 @@ class LDPViewSet(ModelViewSet):
     @classonlymethod
     def urls(cls, **kwargs):
         if isinstance(kwargs['model'], str):
-            model = kwargs['model'].split('.')[-1].lower()
-        else:
-            model = kwargs['model']._meta.object_name.lower()
+            kwargs['model'] = apps.get_model(kwargs['model'])
+        model = kwargs['model']._meta.object_name.lower()
+        detail_url = r'^(?P<pk>\d+)$'
+        if kwargs.get('lookup_field'):
+            detail_url = r'^(?P<{}>[\w-]+)$'.format(kwargs['lookup_field'])
         return [
             url(r'^$', cls.as_view({'get': 'list', 'post': 'create'}, **kwargs), name='{}-list'.format(model)),
-            url(r'^(?P<pk>\d+)$', cls.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}, **kwargs), name='{}-detail'.format(model)),
+            url(detail_url, cls.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}, **kwargs), name='{}-detail'.format(model)),
         ]
     
     def dispatch(self, request, *args, **kwargs):
-- 
GitLab