diff --git a/djangoldp/permissions.py b/djangoldp/permissions.py index dffd104ab0da8b8d8d0418b7514fc72e4fbc6b0b..5d888fe7f596eca1436b7ead3a1f8ddd6d315fa0 100644 --- a/djangoldp/permissions.py +++ b/djangoldp/permissions.py @@ -123,7 +123,7 @@ class LDPPermissions(DjangoObjectPermissions): # compare them with the permissions I have 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 True @@ -146,7 +146,7 @@ class LDPPermissions(DjangoObjectPermissions): # compare them with the permissions I have 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 True diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index cfbbe047a9e527da693899b634406169e9f0af73..b10fe10956156ba773c0c28ae2555be49e3afce8 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -15,7 +15,7 @@ from rest_framework.exceptions import ValidationError from rest_framework.fields import SkipField, empty, ReadOnlyField from rest_framework.fields import get_error_detail, set_value 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.utils import model_meta from rest_framework.utils.field_mapping import get_nested_relation_kwargs @@ -481,8 +481,21 @@ class LDPSerializer(HyperlinkedModelSerializer): @classmethod def many_init(cls, *args, **kwargs): - kwargs['child'] = cls(**kwargs) - serializer = ContainerSerializer(*args, **kwargs) + allow_empty = kwargs.pop('allow_empty', None) + 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: serializer.id = '{}{}/'.format(serializer.id, kwargs['context']['view'].nested_field) elif 'context' in kwargs: diff --git a/djangoldp/views.py b/djangoldp/views.py index 97da396990cf387d0f703bb136c937d8af17c765..bae30f1beb4760329ac3dcc609dc887d16fc047c 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -305,6 +305,10 @@ class LDPViewSetGenerator(ModelViewSet): lookup_group = r'\d' if lookup_field == 'pk' else r'[\w\-\.]' return r'(?P<{}>{}+)/'.format(lookup_field, lookup_group) + @classonlymethod + def nested_urls(cls, nested_field, **kwargs): + return LDPNestedViewSet.nested_urls(nested_field, **kwargs) + @classonlymethod def urls(cls, **kwargs): '''constructs urls list for model passed in kwargs''' @@ -322,7 +326,7 @@ class LDPViewSetGenerator(ModelViewSet): # append nested fields to the urls list 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) @@ -336,6 +340,7 @@ class LDPViewSet(LDPViewSetGenerator): parser_classes = (JSONLDParser,) authentication_classes = (NoCSRFAuthentication,) filter_backends = [LocalObjectOnContainerPathBackend] + write_serializer_class = None def __init__(self, **kwargs): super().__init__(**kwargs) @@ -346,8 +351,10 @@ class LDPViewSet(LDPViewSetGenerator): if hasattr(p, 'filter_class') and p.filter_class: self.filter_backends.append(p.filter_class) - self.serializer_class = self.build_read_serializer() - self.write_serializer_class = self.build_write_serializer() + if self.serializer_class is None: + 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): model_name = self.model._meta.object_name.lower() @@ -422,7 +429,7 @@ class LDPViewSet(LDPViewSetGenerator): deserializing input, and for serializing output. """ 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) def get_write_serializer_class(self):