src/notes/api/fields/category.py
author ymh <ymh.work@gmail.com>
Fri, 30 Nov 2018 10:53:15 +0100
changeset 183 f8f3af9e5c83
parent 142 56850f5c73f6
permissions -rw-r--r--
Change the settings to avoid using Session authentication for rest framework as it raise exceptions in case client and backend are on the same domain On the filter, adapt to take into account new version of django_filters
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
'''
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
field serializing and deserializing metacategorization protocols
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
'''
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
     4
import json
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
import logging
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from rest_framework import serializers
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
     9
from notes import constants, settings
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    10
from protocols.models import Protocol, ProtocolRevision
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    11
from protocols.serializers import ProtocolRevisionSerializer
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    12
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
logger = logging.getLogger(__name__)
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
class ProtocolField(serializers.Field):
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    17
    default_error_messages = {
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    18
        'incorrect_format_str': 'Incorrect format. Expected `'+constants.PROTOCOL_URN_PREFIX+'<ext_id>.<version>`.',
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    19
        'protocol_unknown': 'Incorrect protocol, protocol {ext_id}, version {version} does not exists.',
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    20
        'incorrect_format': 'Incorrect format. Expected `'+constants.PROTOCOL_URN_PREFIX+'<ext_id>.<version>` or dict.'
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    21
    }
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    22
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    23
    def __init__(self, *args, **kwargs):
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    24
        logger.debug("ProtocolField.__init__ %r || %r", args, kwargs)
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    25
        super().__init__(*args, **kwargs)
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    27
    # def get_attribute(self, *args, **kwargs):
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    28
    #     logger.debug("ProtocolField.get_attribute %r || %r", args, kwargs)
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    29
    #     logger.debug("ProtocolField.get_attribute source %r", self.source)
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    30
    #     # We pass the object instance onto `to_representation`,
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    31
    #     # not just the field attribute.
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    32
    #     return kwargs.get('obj')
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    33
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    34
    def to_representation(self, value):
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    35
        if isinstance(value, str) and value.startswith(constants.PROTOCOL_URN_PREFIX) :
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    36
            protocol_id, protocol_version = value[len(constants.PROTOCOL_URN_PREFIX):].split('.')
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    37
            # TODO: treat error case, i.e. protocol is not found
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    38
            protocol_revision = ProtocolRevision.objects.get(protocol__ext_id=protocol_id, version=protocol_version)
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    39
            serializer = ProtocolRevisionSerializer(protocol_revision)
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    40
            return serializer.data
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    41
        elif isinstance(value, str):
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    42
            logger.debug("ProtocolField.to_representation value %r" % value)
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    43
            return json.loads(value)
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    44
        else:
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    45
            return value
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    46
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    def to_internal_value(self, data):
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    50
        if isinstance(data, str) and data.startswith(constants.PROTOCOL_URN_PREFIX):
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    51
            try:
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    52
                ext_id, version = data[len(constants.PROTOCOL_URN_PREFIX):].split('.')
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    53
            except ValueError:
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    54
                self.fail('incorrect_format_str')
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    55
            if not ProtocolRevision.objects.filter(protocol__ext_id=ext_id, version=version).exists():
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    56
                self.fail('protocol_unknown', ext_id=ext_id, version=version)
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    57
            else:
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    58
                return data
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    59
        elif isinstance(data, dict):
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    60
            return data
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    61
        else:
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 139
diff changeset
    62
            self.fail('incorrect_format')