src/notes/api/fields/category.py
author ymh <ymh.work@gmail.com>
Tue, 29 Mar 2022 11:23:56 +0200
changeset 211 244a90638e80
parent 142 56850f5c73f6
permissions -rw-r--r--
Added tag 0.2.3 for changeset 3de92ddba2de
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')