From decce680168af8ebf9582891082c103d1e865129 Mon Sep 17 00:00:00 2001 From: James Neyer Date: Mon, 26 Oct 2020 14:59:11 -0400 Subject: [PATCH 1/2] Ensure that context is passed through when calling get serializer --- pyproject.toml | 2 +- src/shipchain_common/viewsets.py | 4 +++- tests/test_viewsets.py | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6460427..24aa643 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "shipchain-common" -version = "1.0.29" +version = "1.0.30" description = "A PyPI package containing shared code for ShipChain's Python/Django projects." license = "Apache-2.0" diff --git a/src/shipchain_common/viewsets.py b/src/shipchain_common/viewsets.py index 4447e9e..9d08737 100644 --- a/src/shipchain_common/viewsets.py +++ b/src/shipchain_common/viewsets.py @@ -232,7 +232,9 @@ def get_serializer(self, *args, **kwargs): """ serialization_type = kwargs.pop('serialization_type', mixins.SerializationType.REQUEST) serializer_class = self.get_serializer_class(serialization_type) - kwargs['context'] = self.get_serializer_context() + if 'context' not in kwargs: + kwargs['context'] = {} + kwargs['context'].update(self.get_serializer_context()) return serializer_class(*args, **kwargs) # pylint: disable=arguments-differ diff --git a/tests/test_viewsets.py b/tests/test_viewsets.py index 33b852f..f294df5 100644 --- a/tests/test_viewsets.py +++ b/tests/test_viewsets.py @@ -10,6 +10,8 @@ from shipchain_common.mixins import SerializationType, MultiSerializerViewSetMixin, MultiPermissionViewSetMixin from shipchain_common.viewsets import ActionConfiguration, ConfigurableGenericViewSet +from rest_framework_json_api import serializers +from tests.django_mocking.models import EnumObject class FakePermission: @@ -55,6 +57,12 @@ class CustomActionCSVSerializer(DefaultSerializer): pass +class ModelSerializer(serializers.ModelSerializer): + class Meta: + model = EnumObject + fields = '__all__' + + class TestActionConfiguration: def test_validation_list(self): @@ -469,6 +477,18 @@ def test_configurable_generic_view_set(self, viewset): assert 'update' not in viewset.configuration assert 'update' not in viewset.action_user_permissions + def test_custom_context(self, viewset): + viewset.default_required_user_permissions = ['feature.default_permission'] + viewset.configuration = { + 'create': ActionConfiguration( + request_serializer=ModelSerializer + ), + } + + viewset.action = 'create' + serializer = viewset.get_serializer(context={'custom key': 'custom value'}) + assert serializer.context['custom key'] == 'custom value' + def test_configurable_generic_view_set_default_user_perms(self, viewset): viewset.default_required_user_permissions = ['feature.default_permission'] viewset.configuration = { From 3a44e6673defbd570218c7901fd71315fcaf17a7 Mon Sep 17 00:00:00 2001 From: James Neyer Date: Mon, 26 Oct 2020 15:40:36 -0400 Subject: [PATCH 2/2] Use same functionality as in upstream --- src/shipchain_common/viewsets.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/shipchain_common/viewsets.py b/src/shipchain_common/viewsets.py index 9d08737..dc684f7 100644 --- a/src/shipchain_common/viewsets.py +++ b/src/shipchain_common/viewsets.py @@ -232,9 +232,7 @@ def get_serializer(self, *args, **kwargs): """ serialization_type = kwargs.pop('serialization_type', mixins.SerializationType.REQUEST) serializer_class = self.get_serializer_class(serialization_type) - if 'context' not in kwargs: - kwargs['context'] = {} - kwargs['context'].update(self.get_serializer_context()) + kwargs.setdefault('context', self.get_serializer_context()) return serializer_class(*args, **kwargs) # pylint: disable=arguments-differ