-
Notifications
You must be signed in to change notification settings - Fork 31
/
serializers.py
105 lines (80 loc) · 3.8 KB
/
serializers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
from datetime import datetime
from pydash import get
from rest_framework import serializers
from rest_framework.fields import CharField, JSONField, IntegerField, DateTimeField, ChoiceField, URLField, \
BooleanField, SerializerMethodField
class CommonSerializer(serializers.Serializer):
def update(self, instance, validated_data):
pass
def create(self, validated_data):
pass
class BundleLinkSerializer(CommonSerializer):
relation = CharField(read_only=True)
url = URLField(read_only=True)
class BundleMetaSerializer(CommonSerializer):
lastUpdated = DateTimeField(read_only=True, default=datetime.now())
class BundleExtensionSerializer(CommonSerializer):
url = URLField()
valueBase65Binary = CharField(required=False)
valueBoolean = BooleanField(required=False)
# See https://www.hl7.org/fhir/extensibility.html for other possible fields
valueInteger = IntegerField(required=False)
class BundleEntrySerializer(CommonSerializer):
resource = JSONField()
class FHIRBundleSerializer(CommonSerializer):
# See https://www.hl7.org/fhir/bundle.html#tabs-json for all possible fields
resourceType = SerializerMethodField(method_name='get_resource_type')
meta = BundleMetaSerializer(read_only=True, required=False)
type = ChoiceField(
choices=['document', 'message', 'transaction', 'transaction-response', 'batch', 'batch-response', 'history',
'searchset', 'collection'])
total = IntegerField(required=False)
entry = BundleEntrySerializer(required=False, many=True)
link = SerializerMethodField()
extension = BundleExtensionSerializer(required=False)
@classmethod
def get_resource_type(cls, _obj):
return 'Bundle'
@classmethod
def convert_to_entry(cls, resources):
entry = []
for resource in resources:
entry.append({'resource': resource})
return entry
def get_link(self, _):
paginator = self.context.get('paginator')
links = [{'relation': 'self', 'url': paginator.get_current_page_url()}]
if paginator.has_previous():
links.append({'relation': 'prev', 'url': paginator.get_previous_page_url()})
if paginator.has_next():
links.append({'relation': 'next', 'url': paginator.get_next_page_url()})
return BundleLinkSerializer(links, many=True).data
# TODO: Adjust BundleSerializer to be FHIR compliant based on FhirBundleSerializer and remove FhirBundleSerializer
class BundleSerializer(serializers.Serializer): # pylint: disable=abstract-method
resourceType = CharField(read_only=True, source='resource_type')
type = ChoiceField(
choices=['document', 'message', 'transaction', 'transaction-response', 'batch', 'batch-response', 'history',
'searchset', 'collection'], source='bundle_type')
meta = BundleMetaSerializer(read_only=True, source='timestamp')
total = IntegerField(read_only=True)
entry = JSONField(read_only=True, source='entries')
requested_url = CharField(read_only=True)
repo_version_url = CharField(read_only=True)
class Meta:
fields = (
'resourceType', 'type', 'meta', 'total', 'concepts', 'mappings', 'entry',
'requested_url', 'repo_version_url'
)
def __init__(self, *args, **kwargs):
request = get(kwargs, 'context.request')
params = get(request, 'query_params')
self.query_params = params.dict() if params else {}
is_hierarchy_response = self.query_params.get('view', '').lower() == 'hierarchy'
try:
if is_hierarchy_response:
self.fields.pop('concepts')
self.fields.pop('mappings')
self.fields.pop('total')
except: # pylint: disable=bare-except
pass
super().__init__(*args, **kwargs)