Skip to content
Snippets Groups Projects
Commit a408ab85 authored by Calum Mackervoy's avatar Calum Mackervoy Committed by Jean-Baptiste Pasquier
Browse files

update: viewset-serializer decoupling

parent 85f06ae6
No related branches found
No related tags found
No related merge requests found
...@@ -123,7 +123,7 @@ class LDPPermissions(DjangoObjectPermissions): ...@@ -123,7 +123,7 @@ class LDPPermissions(DjangoObjectPermissions):
# compare them with the permissions I have # compare them with the permissions I have
for perm in perms: for perm in perms:
if not perm.split('.')[1].split('_')[0] in user_perms: if not perm.split('.')[-1].split('_')[0] in user_perms:
return False return False
return True return True
...@@ -146,7 +146,7 @@ class LDPPermissions(DjangoObjectPermissions): ...@@ -146,7 +146,7 @@ class LDPPermissions(DjangoObjectPermissions):
# compare them with the permissions I have # compare them with the permissions I have
for perm in perms: for perm in perms:
if not perm.split('.')[1].split('_')[0] in user_perms: if not perm.split('.')[-1].split('_')[0] in user_perms:
return False return False
return True return True
...@@ -15,7 +15,7 @@ from rest_framework.exceptions import ValidationError ...@@ -15,7 +15,7 @@ from rest_framework.exceptions import ValidationError
from rest_framework.fields import SkipField, empty, ReadOnlyField from rest_framework.fields import SkipField, empty, ReadOnlyField
from rest_framework.fields import get_error_detail, set_value from rest_framework.fields import get_error_detail, set_value
from rest_framework.relations import HyperlinkedRelatedField, ManyRelatedField, MANY_RELATION_KWARGS, Hyperlink from rest_framework.relations import HyperlinkedRelatedField, ManyRelatedField, MANY_RELATION_KWARGS, Hyperlink
from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer, ModelSerializer from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer, ModelSerializer, LIST_SERIALIZER_KWARGS
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
from rest_framework.utils import model_meta from rest_framework.utils import model_meta
from rest_framework.utils.field_mapping import get_nested_relation_kwargs from rest_framework.utils.field_mapping import get_nested_relation_kwargs
...@@ -481,8 +481,21 @@ class LDPSerializer(HyperlinkedModelSerializer): ...@@ -481,8 +481,21 @@ class LDPSerializer(HyperlinkedModelSerializer):
@classmethod @classmethod
def many_init(cls, *args, **kwargs): def many_init(cls, *args, **kwargs):
kwargs['child'] = cls(**kwargs) allow_empty = kwargs.pop('allow_empty', None)
serializer = ContainerSerializer(*args, **kwargs) child_serializer = cls(*args, **kwargs)
list_kwargs = {
'child': child_serializer,
}
if allow_empty is not None:
list_kwargs['allow_empty'] = allow_empty
list_kwargs.update({
key: value for key, value in kwargs.items()
if key in LIST_SERIALIZER_KWARGS
})
meta = getattr(cls, 'Meta', None)
list_serializer_class = getattr(meta, 'list_serializer_class', ContainerSerializer)
serializer = list_serializer_class(*args, **list_kwargs)
if 'context' in kwargs and getattr(kwargs['context']['view'], 'nested_field', None) is not None: if 'context' in kwargs and getattr(kwargs['context']['view'], 'nested_field', None) is not None:
serializer.id = '{}{}/'.format(serializer.id, kwargs['context']['view'].nested_field) serializer.id = '{}{}/'.format(serializer.id, kwargs['context']['view'].nested_field)
elif 'context' in kwargs: elif 'context' in kwargs:
......
...@@ -305,6 +305,10 @@ class LDPViewSetGenerator(ModelViewSet): ...@@ -305,6 +305,10 @@ class LDPViewSetGenerator(ModelViewSet):
lookup_group = r'\d' if lookup_field == 'pk' else r'[\w\-\.]' lookup_group = r'\d' if lookup_field == 'pk' else r'[\w\-\.]'
return r'(?P<{}>{}+)/'.format(lookup_field, lookup_group) return r'(?P<{}>{}+)/'.format(lookup_field, lookup_group)
@classonlymethod
def nested_urls(cls, nested_field, **kwargs):
return LDPNestedViewSet.nested_urls(nested_field, **kwargs)
@classonlymethod @classonlymethod
def urls(cls, **kwargs): def urls(cls, **kwargs):
'''constructs urls list for model passed in kwargs''' '''constructs urls list for model passed in kwargs'''
...@@ -322,7 +326,7 @@ class LDPViewSetGenerator(ModelViewSet): ...@@ -322,7 +326,7 @@ class LDPViewSetGenerator(ModelViewSet):
# append nested fields to the urls list # append nested fields to the urls list
for field in kwargs.get('nested_fields') or cls.nested_fields: for field in kwargs.get('nested_fields') or cls.nested_fields:
urls.append(url('^' + detail_expr + field + '/', LDPNestedViewSet.nested_urls(field, **kwargs))) urls.append(url('^' + detail_expr + field + '/', cls.nested_urls(field, **kwargs)))
return include(urls) return include(urls)
...@@ -336,6 +340,7 @@ class LDPViewSet(LDPViewSetGenerator): ...@@ -336,6 +340,7 @@ class LDPViewSet(LDPViewSetGenerator):
parser_classes = (JSONLDParser,) parser_classes = (JSONLDParser,)
authentication_classes = (NoCSRFAuthentication,) authentication_classes = (NoCSRFAuthentication,)
filter_backends = [LocalObjectOnContainerPathBackend] filter_backends = [LocalObjectOnContainerPathBackend]
write_serializer_class = None
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)
...@@ -346,8 +351,10 @@ class LDPViewSet(LDPViewSetGenerator): ...@@ -346,8 +351,10 @@ class LDPViewSet(LDPViewSetGenerator):
if hasattr(p, 'filter_class') and p.filter_class: if hasattr(p, 'filter_class') and p.filter_class:
self.filter_backends.append(p.filter_class) self.filter_backends.append(p.filter_class)
self.serializer_class = self.build_read_serializer() if self.serializer_class is None:
self.write_serializer_class = self.build_write_serializer() self.serializer_class = self.build_read_serializer()
if self.write_serializer_class is None:
self.write_serializer_class = self.build_write_serializer()
def build_read_serializer(self): def build_read_serializer(self):
model_name = self.model._meta.object_name.lower() model_name = self.model._meta.object_name.lower()
...@@ -422,7 +429,7 @@ class LDPViewSet(LDPViewSetGenerator): ...@@ -422,7 +429,7 @@ class LDPViewSet(LDPViewSetGenerator):
deserializing input, and for serializing output. deserializing input, and for serializing output.
""" """
serializer_class = self.get_write_serializer_class() serializer_class = self.get_write_serializer_class()
kwargs['context'] = self.get_serializer_context() kwargs.setdefault('context', self.get_serializer_context())
return serializer_class(*args, **kwargs) return serializer_class(*args, **kwargs)
def get_write_serializer_class(self): def get_write_serializer_class(self):
......
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