def parse(self, stream, media_type=None, parser_context=None):
        """
        Parses the incoming bytestream as JSON and executes any available version transforms against the
        parsed representation to convert the requested version of this content type into the
        highest supported version of the content type.

        :returns: A dictionary of upconverted request data in the most recent supported version of the content type.
        """
        if not self.transform_base:
            raise TransformBaseNotDeclaredException(
                "VersioningParser cannot correctly promote incoming resources with no transform classes."
            )

        json_data_dict = super(BaseVersioningParser,
                               self).parse(stream, media_type, parser_context)
        request = parser_context['request']

        if hasattr(request, 'version'):
            for transform in get_transform_classes(
                    self.transform_base,
                    base_version=request.version,
                    reverse=False):
                json_data_dict = transform().forwards(data=json_data_dict,
                                                      request=request)

        return json_data_dict
Example #2
0
    def to_representation(self, instance):
        """
        Serializes the outgoing data as JSON and executes any available version transforms in backwards
        order against the serialized representation to convert the highest supported version into the
        requested version of the resource.
        """
        if not self.transform_base:
            raise TransformBaseNotDeclaredException(
                "VersioningParser cannot correctly promote incoming resources with no transform classes."
            )

        data = super(BaseVersioningSerializer,
                     self).to_representation(instance)
        if instance:
            request = self.context.get('request')

            if request and hasattr(request, 'version'):
                # demote data until we've run the transform just above the requested version

                for transform in get_transform_classes(
                        self.transform_base,
                        base_version=request.version,
                        reverse=True):
                    data = transform().backwards(data, request, instance)

        return data
 def test_adds_only_transforms_matching_base_to_list(self, import_module_mock, getmembers_mock):
     getmembers_mock.return_value = {
         "TestModelTransform0001": TestModelTransform0001,
         "AnotherModelTransform0001": TestModelTransform0002,
     }.items()
     returned_classes = get_transform_classes(transform_base="some_package.some_module.TestModelTransform")
     self.assertEqual(TestModelTransform0001, returned_classes[0])
     self.assertNotIn(TestModelTransform0002, returned_classes)
     self.assertEqual(1, len(returned_classes))
 def test_adds_transforms_to_list(self, import_module_mock, getmembers_mock):
     getmembers_mock.return_value = {
         'TestModelTransform0002': TestModelTransform0002,
         'TestModelTransform0003': TestModelTransform0003,
     }.items()
     returned_classes = get_transform_classes(
         transform_base='some_package.some_module.TestModelTransform',
     )
     self.assertEqual(TestModelTransform0002, returned_classes[0])
     self.assertEqual(TestModelTransform0003, returned_classes[1])
     self.assertEqual(2, len(returned_classes))
 def test_adds_transforms_to_list_in_reverse_order(self, import_module_mock, getmembers_mock):
     getmembers_mock.return_value = {
         "TestModelTransform0001": TestModelTransform0001,
         "TestModelTransform0002": TestModelTransform0002,
     }.items()
     returned_classes = get_transform_classes(
         transform_base="some_package.some_module.TestModelTransform", reverse=True
     )
     self.assertEqual(TestModelTransform0001, returned_classes[1])
     self.assertEqual(TestModelTransform0002, returned_classes[0])
     self.assertEqual(2, len(returned_classes))
 def test_adds_only_transforms_above_base_version_number_to_list(self, import_module_mock, getmembers_mock):
     getmembers_mock.return_value = {
         'TestModelTransform0002': TestModelTransform0002,
         'TestModelTransform0003': TestModelTransform0003,
     }.items()
     returned_classes = get_transform_classes(
         transform_base='some_package.some_module.TestModelTransform',
         base_version=2,
     )
     self.assertNotIn(TestModelTransform0002, returned_classes)
     self.assertEqual(TestModelTransform0003, returned_classes[0])
     self.assertEqual(1, len(returned_classes))
    def parse(self, stream, media_type=None, parser_context=None):
        """
        Parses the incoming bytestream as JSON and executes any available version transforms against the
        parsed representation to convert the requested version of this content type into the
        highest supported version of the content type.

        :returns: A dictionary of upconverted request data in the most recent supported version of the content type.
        """
        if not self.transform_base:
            raise TransformBaseNotDeclaredException("VersioningParser cannot correctly promote incoming resources with no transform classes.")

        json_data_dict = super(BaseVersioningParser, self).parse(stream, media_type, parser_context)
        request = parser_context['request']

        if hasattr(request, 'version'):
            for transform in get_transform_classes(self.transform_base, base_version=request.version, reverse=False):
                json_data_dict = transform().forwards(data=json_data_dict, request=request)

        return json_data_dict
    def to_representation(self, instance):
        """
        Serializes the outgoing data as JSON and executes any available version transforms in backwards
        order against the serialized representation to convert the highest supported version into the
        requested version of the resource.
        """
        if not self.transform_base:
            raise TransformBaseNotDeclaredException("VersioningParser cannot correctly promote incoming resources with no transform classes.")

        data = super(BaseVersioningSerializer, self).to_representation(instance)
        if instance:
            request = self.context.get('request')

            if request and hasattr(request, 'version'):
                # demote data until we've run the transform just above the requested version

                for transform in get_transform_classes(self.transform_base, base_version=request.version, reverse=True):
                    data = transform().backwards(data, request, instance)

        return data
 def test_calls_inspect_getmembers_with_module(self, import_module_mock, getmembers_mock):
     get_transform_classes(transform_base='some_package.some_module.SomeTransformBase')
     import_module_mock.assert_called_once_with('some_package.some_module')
     getmembers_mock.assert_called_once_with(import_module_mock.return_value)