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