-
Notifications
You must be signed in to change notification settings - Fork 0
/
UiDataModel.py
127 lines (99 loc) · 3.67 KB
/
UiDataModel.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import json
import re
import uuid
def del_none(dictionary):
"""
Delete keys with the value ``None`` in a dictionary, recursively.
This alters the input so you may wish to ``copy`` the dict first.
"""
for key, value in list(dictionary.items()):
if value is None:
del dictionary[key]
elif value is []:
del dictionary[key]
elif isinstance(value, dict):
del_none(value)
return dictionary
def del_keys(dictionary, keys):
for k in keys:
dictionary.pop(k, None)
return dictionary
class CategoryEntry:
DO_NOT_SERIALIZE = ["path", "DO_NOT_SERIALIZE"]
def __init__(self, entry_id, display, path):
self.entryId = entry_id # References TerminologyEntry
self.display = display
self.path = path # not shared in json
self.shortDisplay = display[0] #
def __str__(self):
output = ""
for _, var in vars(self).items():
output += " " + str(var)
return output
def to_json(self):
return json.dumps(self, default=lambda o: del_none(
del_keys(o.__dict__, self.DO_NOT_SERIALIZE)),
sort_keys=True, indent=4)
class TermCode:
def __init__(self, system, code, display, version=None):
self.system = system
self.code = code
self.version = version
self.display = display
def __eq__(self, other):
return self.system == other.system and self.code == other.code
def __hash__(self):
return hash(self.system + self.code)
def __lt__(self, other):
return self.display < other.display
def __repr__(self):
return self.display + " " + self.code + " " + self.system
class ValueDefinition:
def __init__(self, value_type):
self.type = value_type
self.selectableConcepts = []
self.allowedUnits = []
self.precision = 1
self.min = None
self.max = None
class Unit:
def __init__(self, display, code):
self.display = display
self.code = code
class TerminologyEntry(object):
DO_NOT_SERIALIZE = ["terminologyType", "path", "DO_NOT_SERIALIZE", "fhirMapperType", "termCodes"]
def __init__(self, term_codes, terminology_type, leaf=False, selectable=True):
self.id = str(uuid.uuid4())
self.termCodes = term_codes
self.termCode = term_codes[0]
for code in self.termCodes:
if code.system == "http://snomed.info/sct":
self.termCode = code
self.terminologyType = terminology_type
self.path = None
self.children = []
self.leaf = leaf
self.selectable = selectable
self.timeRestrictionAllowed = False
self.valueDefinitions = []
self.display = (self.termCode.display if self.termCode else None)
self.fhirMapperType = None
def __lt__(self, other):
if self.display and other.display:
return self.display < other.display
return self.termCode < other.termCode
def __repr__(self):
return self.termCode.display
def to_json(self):
return json.dumps(self, default=lambda o: del_none(
del_keys(o.__dict__, self.DO_NOT_SERIALIZE)), sort_keys=True, indent=4)
def prune_terminology_tree(tree_node, max_depth):
if max_depth != 0:# and not tree_node.fhirMapperType == "Procedure":
for child in tree_node.children:
if re.match("[A-Z][0-9][0-9]-[A-Z][0-9][0-9]$", child.termCode.code):
prune_terminology_tree(child, max_depth)
else:
prune_terminology_tree(child, max_depth-1)
else:
tree_node.children = []
tree_node.leaf = True