Skip to content
Snippets Groups Projects
Commit 6ba5bb3b authored by Sylvain Le Bon's avatar Sylvain Le Bon
Browse files

feature: slug fields lookup

parent b82bdd5f
No related branches found
No related tags found
No related merge requests found
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()
......
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):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment