tricc-oo 1.4.15__py3-none-any.whl → 1.4.21__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tests/build.py +2 -1
- tricc_oo/converters/cql_to_operation.py +24 -4
- tricc_oo/converters/datadictionnary.py +4 -0
- tricc_oo/converters/drawio_type_map.py +2 -2
- tricc_oo/converters/tricc_to_xls_form.py +4 -4
- tricc_oo/converters/xml_to_tricc.py +3 -1
- tricc_oo/models/base.py +25 -19
- tricc_oo/models/tricc.py +5 -2
- tricc_oo/serializers/xls_form.py +11 -119
- tricc_oo/strategies/input/base_input_strategy.py +24 -23
- tricc_oo/strategies/input/drawio.py +1 -1
- tricc_oo/strategies/output/xls_form.py +10 -7
- tricc_oo/strategies/output/xlsform_cdss.py +0 -4
- tricc_oo/strategies/output/xlsform_cht.py +309 -27
- tricc_oo/strategies/output/xlsform_cht_hf.py +3 -294
- tricc_oo/visitors/tricc.py +226 -173
- {tricc_oo-1.4.15.dist-info → tricc_oo-1.4.21.dist-info}/METADATA +2 -1
- {tricc_oo-1.4.15.dist-info → tricc_oo-1.4.21.dist-info}/RECORD +20 -20
- {tricc_oo-1.4.15.dist-info → tricc_oo-1.4.21.dist-info}/WHEEL +1 -1
- {tricc_oo-1.4.15.dist-info → tricc_oo-1.4.21.dist-info}/top_level.txt +0 -0
tricc_oo/visitors/tricc.py
CHANGED
|
@@ -93,6 +93,81 @@ def get_node_expressions(node, processed_nodes, process=None):
|
|
|
93
93
|
expression = TriccStatic(True)
|
|
94
94
|
return expression
|
|
95
95
|
|
|
96
|
+
def set_last_version_false(node, processed_nodes):
|
|
97
|
+
node_name = node.name if not isinstance(node, TriccNodeEnd) else node.get_reference()
|
|
98
|
+
last_version = get_last_version(node_name, processed_nodes) if issubclass(node.__class__, (TriccNodeDisplayModel, TriccNodeDisplayCalculateBase, TriccNodeEnd)) and not isinstance(node, TriccNodeSelectOption) else None
|
|
99
|
+
#last_version = processed_nodes.find_prev(node, lambda item: hasattr(item, 'name') and item.name == node.name)
|
|
100
|
+
if last_version and getattr(node, 'process', '') != 'pause':
|
|
101
|
+
# 0-100 for manually specified instance. 100-200 for auto instance
|
|
102
|
+
node.version = last_version.version + 1
|
|
103
|
+
last_version.last = False
|
|
104
|
+
node.path_len = max(node.path_len, last_version.path_len + 1)
|
|
105
|
+
return last_version
|
|
106
|
+
|
|
107
|
+
def get_version_inheritance(node, last_version, processed_nodes):
|
|
108
|
+
# FIXME this is for XLS form where only calculate are evaluated for a activity that is not triggered
|
|
109
|
+
if not issubclass(node.__class__, (TriccNodeInputModel)):
|
|
110
|
+
node.last = True
|
|
111
|
+
if (
|
|
112
|
+
issubclass(node.__class__, (TriccNodeDisplayCalculateBase, TriccNodeEnd)) and node.name is not None
|
|
113
|
+
):
|
|
114
|
+
#logger.debug("set last to false for node {} and add its link it to next one".format(last_used_calc.get_name()))
|
|
115
|
+
if node.prev_nodes:
|
|
116
|
+
set_prev_next_node(last_version, node)
|
|
117
|
+
else:
|
|
118
|
+
expression = node.expression or node.expression_reference or getattr(node, 'relevance', None)
|
|
119
|
+
datatype = expression.get_datatype()
|
|
120
|
+
if datatype == 'boolean':
|
|
121
|
+
expression_reference = TriccOperation(
|
|
122
|
+
TriccOperator.OR,
|
|
123
|
+
[TriccOperation(TriccOperator.ISTRUE, [last_version]), expression]
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
elif datatype == 'number':
|
|
127
|
+
expression = TriccOperation(
|
|
128
|
+
TriccOperator.PLUS,
|
|
129
|
+
[last_version, expression]
|
|
130
|
+
)
|
|
131
|
+
else:
|
|
132
|
+
expression = TriccOperation(
|
|
133
|
+
TriccOperator.COALESCE,
|
|
134
|
+
[last_version, expression]
|
|
135
|
+
)
|
|
136
|
+
if node.expression:
|
|
137
|
+
node.expression = expression
|
|
138
|
+
elif node.expression_reference:
|
|
139
|
+
node.expression_reference = expression
|
|
140
|
+
elif node.relevance:
|
|
141
|
+
node.relevance = expression
|
|
142
|
+
else:
|
|
143
|
+
node.last = False
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
calc = TriccNodeCalculate(
|
|
147
|
+
id=generate_id(f"save{node.id}"),
|
|
148
|
+
name=node.name,
|
|
149
|
+
path_len=node.path_len+1,
|
|
150
|
+
version=get_next_version(node.name, processed_nodes, node.version+2),
|
|
151
|
+
expression=TriccOperation(
|
|
152
|
+
TriccOperator.COALESCE,
|
|
153
|
+
[node, last_version, TriccStatic("''")]
|
|
154
|
+
),
|
|
155
|
+
last=True,
|
|
156
|
+
activity=node.activity,
|
|
157
|
+
group=node.group
|
|
158
|
+
)
|
|
159
|
+
node.activity.nodes[calc.id]=calc
|
|
160
|
+
node.activity.calculates.append(calc)
|
|
161
|
+
set_last_version_false(calc, processed_nodes)
|
|
162
|
+
processed_nodes.add(calc)
|
|
163
|
+
if issubclass(node.__class__, TriccNodeInputModel):
|
|
164
|
+
node.expression = TriccOperation(
|
|
165
|
+
TriccOperator.COALESCE,
|
|
166
|
+
[
|
|
167
|
+
'$this',
|
|
168
|
+
last_version
|
|
169
|
+
]
|
|
170
|
+
)
|
|
96
171
|
|
|
97
172
|
def process_calculate(node,processed_nodes, stashed_nodes, calculates, used_calculates,
|
|
98
173
|
warn = False, process=None, **kwargs ):
|
|
@@ -117,76 +192,11 @@ def process_calculate(node,processed_nodes, stashed_nodes, calculates, used_calc
|
|
|
117
192
|
):
|
|
118
193
|
if kwargs.get('warn', True):
|
|
119
194
|
logger.debug('Processing relevance for node {0}'.format(node.get_name()))
|
|
120
|
-
|
|
121
|
-
last_version = get_last_version(node_name, processed_nodes) if issubclass(node.__class__, (TriccNodeDisplayModel, TriccNodeDisplayCalculateBase, TriccNodeEnd)) and not isinstance(node, TriccNodeSelectOption) else None
|
|
122
|
-
#last_version = processed_nodes.find_prev(node, lambda item: hasattr(item, 'name') and item.name == node.name)
|
|
195
|
+
last_version = set_last_version_false(node, processed_nodes)
|
|
123
196
|
if last_version:
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
node.path_len = max(node.path_len, last_version.path_len + 1)
|
|
128
|
-
# FIXME this is for XLS form where only calculate are evaluated for a activity that is not triggered
|
|
129
|
-
if not issubclass(node.__class__, (TriccNodeInputModel)):
|
|
130
|
-
node.last = True
|
|
131
|
-
if (
|
|
132
|
-
issubclass(node.__class__, (TriccNodeDisplayCalculateBase, TriccNodeEnd)) and node.name is not None
|
|
133
|
-
):
|
|
134
|
-
#logger.debug("set last to false for node {} and add its link it to next one".format(last_used_calc.get_name()))
|
|
135
|
-
if node.prev_nodes:
|
|
136
|
-
set_prev_next_node(last_version, node)
|
|
137
|
-
else:
|
|
138
|
-
expression = node.expression or node.expression_reference or node.relevance
|
|
139
|
-
datatype = expression.get_datatype()
|
|
140
|
-
if datatype == 'boolean':
|
|
141
|
-
expression_reference = TriccOperation(
|
|
142
|
-
TriccOperator.OR,
|
|
143
|
-
[TriccOperation(TriccOperator.ISTRUE, [last_version]), expression]
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
elif datatype == 'number':
|
|
147
|
-
expression = TriccOperation(
|
|
148
|
-
TriccOperator.PLUS,
|
|
149
|
-
[last_version, expression]
|
|
150
|
-
)
|
|
151
|
-
else:
|
|
152
|
-
expression = TriccOperation(
|
|
153
|
-
TriccOperator.COALESCE,
|
|
154
|
-
[last_version, expression]
|
|
155
|
-
)
|
|
156
|
-
if node.expression:
|
|
157
|
-
node.expression = expression
|
|
158
|
-
elif node.expression_reference:
|
|
159
|
-
node.expression_reference = expression
|
|
160
|
-
elif node.relevance:
|
|
161
|
-
node.relevance = expression
|
|
162
|
-
else:
|
|
163
|
-
node.last = False
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
calc = TriccNodeCalculate(
|
|
167
|
-
id=generate_id(f"save{node.id}"),
|
|
168
|
-
name=node.name,
|
|
169
|
-
path_len=node.path_len+1,
|
|
170
|
-
version=last_version.version + 2,
|
|
171
|
-
expression=TriccOperation(
|
|
172
|
-
TriccOperator.COALESCE,
|
|
173
|
-
[node, last_version, TriccStatic("''")]
|
|
174
|
-
),
|
|
175
|
-
last=True,
|
|
176
|
-
activity=node.activity,
|
|
177
|
-
group=node.group
|
|
178
|
-
)
|
|
179
|
-
node.activity.nodes[calc.id]=calc
|
|
180
|
-
node.activity.calculates.append(calc)
|
|
181
|
-
if issubclass(node.__class__, TriccNodeInputModel):
|
|
182
|
-
node.expression = TriccOperation(
|
|
183
|
-
TriccOperator.COALESCE,
|
|
184
|
-
[
|
|
185
|
-
'$this',
|
|
186
|
-
last_version
|
|
187
|
-
]
|
|
188
|
-
)
|
|
189
|
-
|
|
197
|
+
last_version = get_version_inheritance(node, last_version, processed_nodes)
|
|
198
|
+
generate_calculates(node,calculates, used_calculates,processed_nodes=processed_nodes)
|
|
199
|
+
|
|
190
200
|
|
|
191
201
|
|
|
192
202
|
# if has prev, create condition
|
|
@@ -218,7 +228,6 @@ def process_calculate(node,processed_nodes, stashed_nodes, calculates, used_calc
|
|
|
218
228
|
if issubclass(r.__class__, (TriccNodeDisplayCalculateBase )):
|
|
219
229
|
add_used_calculate(node, r, calculates, used_calculates, processed_nodes)
|
|
220
230
|
|
|
221
|
-
generate_calculates(node,calculates, used_calculates,processed_nodes=processed_nodes)
|
|
222
231
|
if last_version and hasattr(node, 'relevance'):
|
|
223
232
|
if isinstance(node, TriccNodeInputModel):
|
|
224
233
|
version_relevance = TriccOperation(
|
|
@@ -468,16 +477,23 @@ def generate_calculates(node,calculates, used_calculates,processed_nodes):
|
|
|
468
477
|
calc_node.path_len += 1
|
|
469
478
|
calc_node.name=calculate_name
|
|
470
479
|
calc_node.label = "save select: " +node.get_name()
|
|
471
|
-
|
|
480
|
+
elif node.name != calculate_name:
|
|
472
481
|
calc_id = generate_id(f"autosave{node.id}")
|
|
482
|
+
|
|
473
483
|
calc_node = TriccNodeCalculate(
|
|
474
484
|
name=calculate_name,
|
|
475
485
|
id = calc_id,
|
|
476
486
|
group = node.group,
|
|
487
|
+
version=get_next_version(calculate_name, processed_nodes, node.version+2),
|
|
477
488
|
activity = node.activity,
|
|
478
489
|
label = "save: " +node.get_name(),
|
|
479
|
-
path_len=node.path_len+ 1
|
|
490
|
+
path_len=node.path_len+ 1,
|
|
491
|
+
last=True
|
|
480
492
|
)
|
|
493
|
+
node.activity.nodes[calc_node.id]=calc_node
|
|
494
|
+
node.activity.calculates.append(calc_node)
|
|
495
|
+
set_last_version_false(calc_node, processed_nodes)
|
|
496
|
+
processed_nodes.add(calc_node)
|
|
481
497
|
logger.debug("generate_save_calculate:{}:{} as {}".format(calc_node.tricc_type, node.name if hasattr(node,'name') else node.id, calculate_name))
|
|
482
498
|
if isinstance(node, TriccNodeSelectYesNo):
|
|
483
499
|
yesNode = node.options[0]
|
|
@@ -526,12 +542,15 @@ def process_reference(node, processed_nodes, calculates, used_calculates=None,
|
|
|
526
542
|
node.reference = list(modified_expression.get_references())
|
|
527
543
|
node.expression_reference = modified_expression
|
|
528
544
|
elif getattr(node, 'reference', None):
|
|
529
|
-
|
|
545
|
+
reference = node.reference
|
|
546
|
+
if isinstance(reference, list):
|
|
547
|
+
if isinstance(node, TriccNodeWait):
|
|
548
|
+
reference = [TriccOperation(TriccOperator.ISTRUE,[n]) for n in reference]
|
|
530
549
|
if len(node.reference) == 1 :
|
|
531
|
-
operation =
|
|
550
|
+
operation = reference[0]
|
|
532
551
|
else:
|
|
533
552
|
operation = and_join(
|
|
534
|
-
|
|
553
|
+
reference
|
|
535
554
|
)
|
|
536
555
|
modified_expression = process_operation_reference(
|
|
537
556
|
operation,
|
|
@@ -657,7 +676,7 @@ def process_operation_reference(operation, node, processed_nodes, calculates, us
|
|
|
657
676
|
if codesystems:
|
|
658
677
|
concept = lookup_codesystems_code(codesystems, ref)
|
|
659
678
|
if not concept:
|
|
660
|
-
logger.critical(f"reference {ref} not found in the project")
|
|
679
|
+
logger.critical(f"reference {ref} not found in the project for{str(node)} ")
|
|
661
680
|
exit(1)
|
|
662
681
|
else:
|
|
663
682
|
if warn:
|
|
@@ -768,7 +787,13 @@ def walktrhough_tricc_node_processed_stached(node, callback, processed_nodes, st
|
|
|
768
787
|
references = node.get_references()
|
|
769
788
|
if references:
|
|
770
789
|
path_len = max(path_len, *[0,*[getattr(n,'path_len',0) + 1 for n in references]])
|
|
771
|
-
node.path_len = max(node.path_len, path_len)
|
|
790
|
+
node.path_len = max(node.path_len, path_len)
|
|
791
|
+
prev_process = process[0] if process else None
|
|
792
|
+
if isinstance(node, TriccNodeActivity) and getattr(node.root, 'process', None):
|
|
793
|
+
if process is None:
|
|
794
|
+
process = [node.root.process]
|
|
795
|
+
else:
|
|
796
|
+
process[0] = node.root.process
|
|
772
797
|
if (
|
|
773
798
|
callback(
|
|
774
799
|
node,
|
|
@@ -802,11 +827,6 @@ def walktrhough_tricc_node_processed_stached(node, callback, processed_nodes, st
|
|
|
802
827
|
if not recursive:
|
|
803
828
|
reorder_node_list(stashed_nodes, node.group, processed_nodes)
|
|
804
829
|
if isinstance(node, (TriccNodeActivityStart, TriccNodeMainStart)):
|
|
805
|
-
if getattr(node, 'process', None):
|
|
806
|
-
if process is None:
|
|
807
|
-
process = [node.process]
|
|
808
|
-
else:
|
|
809
|
-
process[0] = node.process
|
|
810
830
|
if recursive:
|
|
811
831
|
for gp in node.activity.groups.values():
|
|
812
832
|
walktrhough_tricc_node_processed_stached(
|
|
@@ -851,11 +871,6 @@ def walktrhough_tricc_node_processed_stached(node, callback, processed_nodes, st
|
|
|
851
871
|
if node.root not in processed_nodes:
|
|
852
872
|
if node.root is not None:
|
|
853
873
|
node.root.path_len = max(path_len, node.root.path_len)
|
|
854
|
-
if getattr(node.root, 'process', None):
|
|
855
|
-
if process is None:
|
|
856
|
-
process = [node.root.process]
|
|
857
|
-
else:
|
|
858
|
-
process[0] = node.root.process
|
|
859
874
|
if recursive:
|
|
860
875
|
walktrhough_tricc_node_processed_stached(node.root, callback, processed_nodes, stashed_nodes, path_len,
|
|
861
876
|
recursive, warn = warn,node_path = node_path.copy(),**kwargs)
|
|
@@ -897,6 +912,8 @@ def walktrhough_tricc_node_processed_stached(node, callback, processed_nodes, st
|
|
|
897
912
|
|
|
898
913
|
|
|
899
914
|
else:
|
|
915
|
+
if prev_process and process and prev_process != process[0]:
|
|
916
|
+
process[0] = prev_process
|
|
900
917
|
if node not in processed_nodes and node not in stashed_nodes:
|
|
901
918
|
if node not in stashed_nodes:
|
|
902
919
|
stashed_nodes.insert_at_bottom(node)
|
|
@@ -947,6 +964,9 @@ def walkthrough_tricc_option(node, callback, processed_nodes, stashed_nodes, pat
|
|
|
947
964
|
warn = warn,
|
|
948
965
|
node_path = node_path.copy(), **kwargs)
|
|
949
966
|
|
|
967
|
+
def get_next_version(name, processed_nodes, version=0,):
|
|
968
|
+
return max(version, 100,*[(getattr(n,'version',0) or getattr(n,'instance',0) or 0) for n in get_versions(name, processed_nodes)])
|
|
969
|
+
|
|
950
970
|
|
|
951
971
|
def get_data_for_log(node):
|
|
952
972
|
return "{}:{}|{} {}:{}".format(
|
|
@@ -1146,23 +1166,34 @@ def check_stashed_loop(stashed_nodes, prev_stashed_nodes, processed_nodes, len_p
|
|
|
1146
1166
|
es_node.activity.instance if hasattr(es_node,'activity') else '',
|
|
1147
1167
|
es_node.__class__,
|
|
1148
1168
|
es_node.get_name()))
|
|
1169
|
+
for es_node in [node for node_list in looped.values() for node in node_list if isinstance(node, TriccReference)]:
|
|
1170
|
+
logger.info("looped node {}:{}|{} {}".format(
|
|
1171
|
+
es_node.activity.get_name() if hasattr(es_node,'activity') else '' ,
|
|
1172
|
+
es_node.activity.instance if hasattr(es_node,'activity') else '',
|
|
1173
|
+
es_node.__class__,
|
|
1174
|
+
es_node.get_name()))
|
|
1175
|
+
for es_node in [node for node_list in waited.values() for node in node_list if isinstance(node, TriccReference)]:
|
|
1176
|
+
logger.info("waited node {}:{}|{} {}".format(
|
|
1177
|
+
es_node.activity.get_name() if hasattr(es_node,'activity') else '' ,
|
|
1178
|
+
es_node.activity.instance if hasattr(es_node,'activity') else '',
|
|
1179
|
+
es_node.__class__,
|
|
1180
|
+
es_node.get_name()))
|
|
1149
1181
|
logger.info("looped nodes")
|
|
1150
1182
|
for dep_list in looped:
|
|
1151
1183
|
for d in looped[dep_list]:
|
|
1152
|
-
if d
|
|
1153
|
-
logger.critical("[{}] depends on
|
|
1154
|
-
dep_list,
|
|
1184
|
+
if str(d) in looped:
|
|
1185
|
+
logger.critical("[{}] depends on [{}]".format(
|
|
1186
|
+
dep_list, str(d)
|
|
1187
|
+
))
|
|
1188
|
+
else:
|
|
1189
|
+
logger.error("[{}] depends on [{}]".format(
|
|
1190
|
+
dep_list, str(d)
|
|
1155
1191
|
))
|
|
1156
|
-
logger.error("[{}] depends on [{}]".format(
|
|
1157
|
-
dep_list, str(d)
|
|
1158
|
-
))
|
|
1159
1192
|
if dep_list in waited:
|
|
1160
1193
|
for d in waited[dep_list]:
|
|
1161
1194
|
logger.warning("[{}] depends on [{}]".format(
|
|
1162
1195
|
dep_list, str(d)
|
|
1163
1196
|
))
|
|
1164
|
-
|
|
1165
|
-
#reverse_walkthrough(es_node, es_node, print_trace, processed_nodes, stashed_nodes)
|
|
1166
1197
|
logger.info("waited nodes")
|
|
1167
1198
|
for dep_list in waited:
|
|
1168
1199
|
if dep_list not in looped:
|
|
@@ -1179,7 +1210,6 @@ def check_stashed_loop(stashed_nodes, prev_stashed_nodes, processed_nodes, len_p
|
|
|
1179
1210
|
loop_count = 0
|
|
1180
1211
|
return loop_count
|
|
1181
1212
|
|
|
1182
|
-
|
|
1183
1213
|
def add_to_tree(tree, n, d):
|
|
1184
1214
|
n_str = str(n)
|
|
1185
1215
|
if n_str not in tree:
|
|
@@ -1189,12 +1219,17 @@ def add_to_tree(tree, n, d):
|
|
|
1189
1219
|
return tree
|
|
1190
1220
|
|
|
1191
1221
|
|
|
1192
|
-
def get_all_dependant(loop, stashed_nodes, processed_nodes, depth=0, waited=None , looped=None):
|
|
1222
|
+
def get_all_dependant(loop, stashed_nodes, processed_nodes, depth=0, waited=None , looped=None, path = None):
|
|
1223
|
+
if path is None:
|
|
1224
|
+
path =[]
|
|
1193
1225
|
if looped is None:
|
|
1194
1226
|
looped = {}
|
|
1195
1227
|
if waited is None:
|
|
1196
1228
|
waited = {}
|
|
1229
|
+
all_dependant = OrderedSet()
|
|
1197
1230
|
for n in loop:
|
|
1231
|
+
cur_path = path.copy()
|
|
1232
|
+
cur_path.append(n)
|
|
1198
1233
|
dependant = OrderedSet()
|
|
1199
1234
|
i=0
|
|
1200
1235
|
#logger.critical(f"{i}: {n.__class__}::{n.get_name()}::{getattr(n,'instance','')}::{process_reference(n, processed_nodes, [])}")
|
|
@@ -1206,28 +1241,31 @@ def get_all_dependant(loop, stashed_nodes, processed_nodes, depth=0, waited=None
|
|
|
1206
1241
|
if not isinstance(dependant, list):
|
|
1207
1242
|
pass
|
|
1208
1243
|
for d in dependant:
|
|
1244
|
+
if d in path:
|
|
1245
|
+
logger.warning(f"loop {str(d)} already in path {'::'.join(map(str, path))} ")
|
|
1209
1246
|
if isinstance(d, TriccNodeSelectOption):
|
|
1210
1247
|
d = d.select
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
else :
|
|
1217
|
-
looped = add_to_tree(looped, n, d)
|
|
1218
|
-
|
|
1219
|
-
elif d not in processed_nodes:
|
|
1220
|
-
if d in stashed_nodes:
|
|
1221
|
-
looped = add_to_tree(looped, n, d)
|
|
1248
|
+
|
|
1249
|
+
if isinstance(d, TriccReference):
|
|
1250
|
+
if not any(n.name == d.value for n in processed_nodes):
|
|
1251
|
+
if not any(n.name == d.value for n in stashed_nodes):
|
|
1252
|
+
waited = add_to_tree(waited, n, d)
|
|
1222
1253
|
else :
|
|
1223
|
-
|
|
1254
|
+
looped = add_to_tree(looped, n, d)
|
|
1255
|
+
|
|
1256
|
+
elif d not in processed_nodes:
|
|
1257
|
+
if d in stashed_nodes:
|
|
1258
|
+
looped = add_to_tree(looped, n, d)
|
|
1259
|
+
else :
|
|
1260
|
+
waited = add_to_tree(waited, n, d)
|
|
1261
|
+
all_dependant = all_dependant.union(dependant)
|
|
1224
1262
|
if depth < MAX_DRILL:
|
|
1225
|
-
|
|
1226
|
-
|
|
1263
|
+
waited, looped = get_all_dependant(all_dependant, stashed_nodes, processed_nodes, depth+1, waited , looped, path=cur_path)
|
|
1264
|
+
|
|
1227
1265
|
return waited, looped
|
|
1228
1266
|
|
|
1229
1267
|
|
|
1230
|
-
MAX_DRILL =
|
|
1268
|
+
MAX_DRILL = 3
|
|
1231
1269
|
|
|
1232
1270
|
def get_last_end_node(processed_nodes, process=None):
|
|
1233
1271
|
end_name = 'tricc_end_'
|
|
@@ -1454,7 +1492,7 @@ def get_node_expression( in_node, processed_nodes, is_calculate=False, is_prev=F
|
|
|
1454
1492
|
expression = None
|
|
1455
1493
|
negate_expression = None
|
|
1456
1494
|
node = in_node
|
|
1457
|
-
if isinstance(node, (TriccNodeActivityStart,TriccNodeMainStart
|
|
1495
|
+
if isinstance(node, (TriccNodeActivityStart,TriccNodeMainStart)):
|
|
1458
1496
|
if is_prev and is_calculate:
|
|
1459
1497
|
expression = get_node_expression(
|
|
1460
1498
|
node.activity,
|
|
@@ -1464,7 +1502,9 @@ def get_node_expression( in_node, processed_nodes, is_calculate=False, is_prev=F
|
|
|
1464
1502
|
negate=negate,
|
|
1465
1503
|
process=process
|
|
1466
1504
|
)
|
|
1467
|
-
|
|
1505
|
+
if isinstance(node, TriccNodeMainStart):
|
|
1506
|
+
expression = get_applicability_expression(node.activity, processed_nodes, process, expression )
|
|
1507
|
+
elif isinstance(node, (TriccNodeActivityStart)):
|
|
1468
1508
|
return None
|
|
1469
1509
|
|
|
1470
1510
|
elif isinstance(node, TriccNodeWait):
|
|
@@ -1524,7 +1564,7 @@ def get_node_expression( in_node, processed_nodes, is_calculate=False, is_prev=F
|
|
|
1524
1564
|
# else:
|
|
1525
1565
|
expression = node.expression_reference
|
|
1526
1566
|
elif not is_prev and hasattr(node, 'relevance') and isinstance(node.relevance, TriccOperation):
|
|
1527
|
-
expression = node.relevance
|
|
1567
|
+
expression = node.relevance
|
|
1528
1568
|
elif is_prev and isinstance(node, TriccNodeSelectOption):
|
|
1529
1569
|
if negate:
|
|
1530
1570
|
negate_expression = get_selected_option_expression(node, negate)
|
|
@@ -1550,61 +1590,10 @@ def get_node_expression( in_node, processed_nodes, is_calculate=False, is_prev=F
|
|
|
1550
1590
|
if expression is None:
|
|
1551
1591
|
expression = get_prev_node_expression(node, processed_nodes=processed_nodes, is_calculate=is_calculate, process=process)
|
|
1552
1592
|
# in_node not in processed_nodes is need for calculates that can but run after the end of the activity
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
if node.base_instance is not None and not is_prev:
|
|
1559
|
-
activity = node
|
|
1560
|
-
expression_inputs = []
|
|
1561
|
-
past_instances = [
|
|
1562
|
-
n for n in processed_nodes if getattr(n.base_instance, 'id', None) == node.base_instance.id
|
|
1563
|
-
]
|
|
1564
|
-
for past_instance in past_instances:
|
|
1565
|
-
add_sub_expression(
|
|
1566
|
-
expression_inputs,
|
|
1567
|
-
get_node_expression(
|
|
1568
|
-
past_instance,
|
|
1569
|
-
processed_nodes=processed_nodes,
|
|
1570
|
-
is_calculate=False,
|
|
1571
|
-
is_prev=True,
|
|
1572
|
-
process=process
|
|
1573
|
-
)
|
|
1574
|
-
)
|
|
1575
|
-
|
|
1576
|
-
if isinstance(node.applicability,(TriccStatic,TriccOperation, TriccReference)):
|
|
1577
|
-
if expression:
|
|
1578
|
-
expression = and_join([node.applicability, expression])
|
|
1579
|
-
else:
|
|
1580
|
-
expression = node.applicability
|
|
1581
|
-
if expression and expression_inputs:
|
|
1582
|
-
add_sub_expression(expression_inputs, expression)
|
|
1583
|
-
expression = nand_join(expression, or_join(expression_inputs))
|
|
1584
|
-
elif expression_inputs:
|
|
1585
|
-
expression = negate_term(or_join(expression_inputs))
|
|
1586
|
-
if not is_prev:
|
|
1587
|
-
end_expressions = []
|
|
1588
|
-
f_end_expression = get_end_expression(processed_nodes)
|
|
1589
|
-
if f_end_expression:
|
|
1590
|
-
end_expressions.append(f_end_expression)
|
|
1591
|
-
if process[0] in PROCESSES:
|
|
1592
|
-
for p in PROCESSES[PROCESSES.index(process[0])+1:]:
|
|
1593
|
-
p_end_expression = get_end_expression(processed_nodes, p)
|
|
1594
|
-
if p_end_expression:
|
|
1595
|
-
end_expressions.append(p_end_expression)
|
|
1596
|
-
if node.applicability:
|
|
1597
|
-
end_expressions.append(node.applicability)
|
|
1598
|
-
if end_expressions:
|
|
1599
|
-
if expression:
|
|
1600
|
-
end_expressions.append(expression)
|
|
1601
|
-
if len(end_expressions) == 1:
|
|
1602
|
-
expression = end_expressions[0]
|
|
1603
|
-
else:
|
|
1604
|
-
expression = and_join(end_expressions)
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1593
|
+
#if isinstance(node, TriccNodeActivitiy) and not prev:
|
|
1594
|
+
# expression = get_applicability_expression(node, processed_nodes, process, expression)
|
|
1595
|
+
# expression = get_prev_instance_skip_expression(node, processed_nodes, process, expression)
|
|
1596
|
+
# expression = get_process_skip_expression(node, processed_nodes, process, expression)
|
|
1608
1597
|
if negate:
|
|
1609
1598
|
if negate_expression is not None:
|
|
1610
1599
|
return negate_expression
|
|
@@ -1615,7 +1604,70 @@ def get_node_expression( in_node, processed_nodes, is_calculate=False, is_prev=F
|
|
|
1615
1604
|
# exit(1)
|
|
1616
1605
|
else:
|
|
1617
1606
|
return expression
|
|
1607
|
+
|
|
1608
|
+
def get_applicability_expression(node, processed_nodes, process, expression=None):
|
|
1609
|
+
if isinstance(node.applicability,(TriccStatic,TriccOperation, TriccReference)):
|
|
1610
|
+
if expression:
|
|
1611
|
+
expression = and_join([node.applicability, expression])
|
|
1612
|
+
else:
|
|
1613
|
+
expression = node.applicability
|
|
1614
|
+
|
|
1615
|
+
return expression
|
|
1616
|
+
|
|
1617
|
+
|
|
1618
|
+
|
|
1619
|
+
|
|
1620
|
+
|
|
1621
|
+
def get_prev_instance_skip_expression(node, processed_nodes, process, expression=None):
|
|
1622
|
+
if node.base_instance is not None:
|
|
1623
|
+
activity = node
|
|
1624
|
+
expression_inputs = []
|
|
1625
|
+
past_instances = [
|
|
1626
|
+
n for n in processed_nodes if getattr(n.base_instance, 'id', None) == node.base_instance.id
|
|
1627
|
+
]
|
|
1628
|
+
for past_instance in past_instances:
|
|
1629
|
+
add_sub_expression(
|
|
1630
|
+
expression_inputs,
|
|
1631
|
+
get_node_expression(
|
|
1632
|
+
past_instance,
|
|
1633
|
+
processed_nodes=processed_nodes,
|
|
1634
|
+
is_calculate=False,
|
|
1635
|
+
is_prev=True,
|
|
1636
|
+
process=process
|
|
1637
|
+
)
|
|
1638
|
+
)
|
|
1639
|
+
if expression and expression_inputs:
|
|
1640
|
+
add_sub_expression(expression_inputs, expression)
|
|
1641
|
+
expression = nand_join(expression, or_join(expression_inputs))
|
|
1642
|
+
elif expression_inputs:
|
|
1643
|
+
expression = negate_term(or_join(expression_inputs))
|
|
1644
|
+
return expression
|
|
1645
|
+
|
|
1618
1646
|
|
|
1647
|
+
# end def
|
|
1648
|
+
def get_process_skip_expression(node, processed_nodes, process, expression=None):
|
|
1649
|
+
|
|
1650
|
+
end_expressions = []
|
|
1651
|
+
f_end_expression = get_end_expression(processed_nodes)
|
|
1652
|
+
if f_end_expression:
|
|
1653
|
+
end_expressions.append(f_end_expression)
|
|
1654
|
+
b_end_expression = get_end_expression(processed_nodes, 'pause')
|
|
1655
|
+
if b_end_expression:
|
|
1656
|
+
end_expressions.append(b_end_expression)
|
|
1657
|
+
if process[0] in PROCESSES:
|
|
1658
|
+
for p in PROCESSES[PROCESSES.index(process[0])+1:]:
|
|
1659
|
+
p_end_expression = get_end_expression(processed_nodes, p)
|
|
1660
|
+
if p_end_expression:
|
|
1661
|
+
end_expressions.append(p_end_expression)
|
|
1662
|
+
if end_expressions:
|
|
1663
|
+
if expression:
|
|
1664
|
+
end_expressions.append(expression)
|
|
1665
|
+
if len(end_expressions) == 1:
|
|
1666
|
+
expression = end_expressions[0]
|
|
1667
|
+
else:
|
|
1668
|
+
expression = and_join(end_expressions)
|
|
1669
|
+
return expression
|
|
1670
|
+
|
|
1619
1671
|
def get_end_expression(processed_nodes, process=None):
|
|
1620
1672
|
end_node = get_last_end_node(processed_nodes, process)
|
|
1621
1673
|
if end_node:
|
|
@@ -1686,9 +1738,10 @@ def get_select_accept_reject_options(node, group):
|
|
|
1686
1738
|
return {0:yes, 1:no }
|
|
1687
1739
|
|
|
1688
1740
|
def create_determine_diagnosis_activity(diags):
|
|
1689
|
-
start =
|
|
1741
|
+
start = TriccNodeMainStart(
|
|
1690
1742
|
id=generate_id('start.determine-diagnosis'),
|
|
1691
|
-
name="start.determine-diagnosis"
|
|
1743
|
+
name="start.determine-diagnosis",
|
|
1744
|
+
process='determine-diagnosis'
|
|
1692
1745
|
)
|
|
1693
1746
|
|
|
1694
1747
|
|
|
@@ -2032,7 +2085,7 @@ def get_rhombus_terms( node, processed_nodes, is_calculate=False, negate=False,
|
|
|
2032
2085
|
]
|
|
2033
2086
|
)
|
|
2034
2087
|
else:
|
|
2035
|
-
if left_term is not None and re.search(" (
|
|
2088
|
+
if left_term is not None and re.search(" (+)|(-)|(or)|(and) ", expression):
|
|
2036
2089
|
expression = "({0}){1}".format(expression, left_term)
|
|
2037
2090
|
else:
|
|
2038
2091
|
expression = "{0}{1}".format(expression, left_term)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tricc-oo
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.21
|
|
4
4
|
Summary: Python library that converts CDSS L2 in L3
|
|
5
5
|
Project-URL: Homepage, https://github.com/SwissTPH/tricc
|
|
6
6
|
Project-URL: Issues, https://github.com/SwissTPH/tricc/issues
|
|
@@ -14,6 +14,7 @@ Requires-Dist: markdownify
|
|
|
14
14
|
Requires-Dist: pydantic
|
|
15
15
|
Requires-Dist: babel
|
|
16
16
|
Requires-Dist: xlsxwriter
|
|
17
|
+
Requires-Dist: html2text
|
|
17
18
|
Requires-Dist: pandas
|
|
18
19
|
Requires-Dist: polib
|
|
19
20
|
Requires-Dist: strenum
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
tests/build.py,sha256=
|
|
1
|
+
tests/build.py,sha256=aGpylfQU60xPq0AJX-UQQRIxXd7Nxb7SLulVEfZt3aA,6483
|
|
2
2
|
tests/test_cql.py,sha256=sxAYEtiiZ-naXVaKPDYHaQFVhbw0QnYy4_MCItgv1Do,6547
|
|
3
3
|
tests/to_ocl.py,sha256=f_KeKF7N1tri9ChbtH1OShgHskt_T9Wj1IfaT6qJNGY,2247
|
|
4
4
|
tricc_oo/__init__.py,sha256=Els6sDXpOJiGU1zp45rTXZgEKceq_XhRZDfrx1mIMGc,255
|
|
5
5
|
tricc_oo/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
tricc_oo/converters/codesystem_to_ocl.py,sha256=-ZKMBeIvzgqmhJfnn6ptuwpnHQtuE-fCDDfKpfGvUSU,6066
|
|
7
|
-
tricc_oo/converters/cql_to_operation.py,sha256=
|
|
8
|
-
tricc_oo/converters/datadictionnary.py,sha256=
|
|
9
|
-
tricc_oo/converters/drawio_type_map.py,sha256=
|
|
10
|
-
tricc_oo/converters/tricc_to_xls_form.py,sha256=
|
|
7
|
+
tricc_oo/converters/cql_to_operation.py,sha256=bsVD4HO5Zr2clHuIWz86gIUnI7aZ676IXDK5S7x32_o,14439
|
|
8
|
+
tricc_oo/converters/datadictionnary.py,sha256=WWKcTtKLfc4aduHcDBhr4JSfU2NqRMaslwX-wdZPIAw,3968
|
|
9
|
+
tricc_oo/converters/drawio_type_map.py,sha256=6ZcnQMtBU1dhf_NP_s0iX1DvRf0qS7-3UAe_WAPFVoQ,7027
|
|
10
|
+
tricc_oo/converters/tricc_to_xls_form.py,sha256=TKClvHSi07AxncjS8H_d17eXQIcLX4lNZr2fSj62p4Y,2129
|
|
11
11
|
tricc_oo/converters/utils.py,sha256=UyndDORsDbRV5-gYW-yInK5ztjtYdeCw6K-mrYr1Emk,1688
|
|
12
|
-
tricc_oo/converters/xml_to_tricc.py,sha256=
|
|
12
|
+
tricc_oo/converters/xml_to_tricc.py,sha256=9ujnPrCU0xyxrt06SmVT-2LGbS1XXeYyFkZX785BECg,37236
|
|
13
13
|
tricc_oo/converters/cql/cqlLexer.py,sha256=t0-QvDv5kxCiBZJ9SfDumFOgnRSry_HJpakBZV224Ig,49126
|
|
14
14
|
tricc_oo/converters/cql/cqlListener.py,sha256=ketvj7XvO7t047S6A3_gTPvp2MlYk1bojmkl10v5E6Y,57523
|
|
15
15
|
tricc_oo/converters/cql/cqlParser.py,sha256=hIUdR907WX24P2Jlrxk-H0IT94n51yh_ZsCmwQhnFas,414730
|
|
16
16
|
tricc_oo/converters/cql/cqlVisitor.py,sha256=SWSDIqVYBhucR4VgLn_EPNs7LV9yCqsOmzFZ0bmRSGc,33865
|
|
17
17
|
tricc_oo/models/__init__.py,sha256=Rdk1fsNXHrbmXTQD1O7i0NC_A6os648Ap6CtWRliOg8,92
|
|
18
|
-
tricc_oo/models/base.py,sha256=
|
|
18
|
+
tricc_oo/models/base.py,sha256=RE4J98-zzKcB5a0gm4EPjbMjcHEuM17lkIMRAxUPtyQ,24309
|
|
19
19
|
tricc_oo/models/calculate.py,sha256=Bw7OGa4OYxHP529wA23CZftMYDL_CA0SPQ0j1IFyTNA,7456
|
|
20
20
|
tricc_oo/models/lang.py,sha256=SwKaoxyRhE7gH_ZlYyFXzGuTQ5RE19y47LWAA35zYxg,2338
|
|
21
21
|
tricc_oo/models/ocl.py,sha256=ol35Gl1jCBp0Ven0yxOKzDIZkVL5Kx9uwaR_64pjxKI,8931
|
|
22
22
|
tricc_oo/models/ordered_set.py,sha256=cdvqlWgbwN0Jl7btssEoXbzQJ2rlMzxGILRblMqjRg0,4182
|
|
23
|
-
tricc_oo/models/tricc.py,sha256=
|
|
23
|
+
tricc_oo/models/tricc.py,sha256=kzOjlHXmXZ2syk-cvDDxi3HPG-ZL38Y--drip3RjjBM,16503
|
|
24
24
|
tricc_oo/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
25
|
tricc_oo/parsers/xml.py,sha256=vq9PA5Zt4G3QMtZ1zgyN8110O1w19Jqt6JClJYhHJlU,4410
|
|
26
26
|
tricc_oo/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
27
|
tricc_oo/serializers/planuml.py,sha256=a81YKsjgng-h2H_rmFE2J5FeBBUaH8kRGT8YrvzpEKE,455
|
|
28
|
-
tricc_oo/serializers/xls_form.py,sha256
|
|
28
|
+
tricc_oo/serializers/xls_form.py,sha256=oaBfHGJ_I_7qAPuxdG361PCaEKo1TD1LUvHJvo0kYlk,22707
|
|
29
29
|
tricc_oo/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
30
|
tricc_oo/strategies/input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
-
tricc_oo/strategies/input/base_input_strategy.py,sha256
|
|
32
|
-
tricc_oo/strategies/input/drawio.py,sha256=
|
|
31
|
+
tricc_oo/strategies/input/base_input_strategy.py,sha256=-GQ_xRvJXzn-q_eT8R-wtFOTWzPtdNj79zjmsH6x070,4065
|
|
32
|
+
tricc_oo/strategies/input/drawio.py,sha256=glLts9whixJM4HOV_GAWAK8az_H-eo9aeFAQbn99-4c,13362
|
|
33
33
|
tricc_oo/strategies/output/base_output_strategy.py,sha256=WiJwqm4g_x-rbksrjoE0ABhNMtM0_fAMoPH34RKZdc0,7173
|
|
34
34
|
tricc_oo/strategies/output/spice.py,sha256=s_COahyYCoc4Xv5TGh_AW9evDOW6GOex0Xwa_JWeLsI,11280
|
|
35
|
-
tricc_oo/strategies/output/xls_form.py,sha256=
|
|
36
|
-
tricc_oo/strategies/output/xlsform_cdss.py,sha256=
|
|
37
|
-
tricc_oo/strategies/output/xlsform_cht.py,sha256=
|
|
38
|
-
tricc_oo/strategies/output/xlsform_cht_hf.py,sha256=
|
|
35
|
+
tricc_oo/strategies/output/xls_form.py,sha256=dsKbAdzjqgJGXNWrMuqzNAsTNO9EXh3g-QJNegz-gpY,30681
|
|
36
|
+
tricc_oo/strategies/output/xlsform_cdss.py,sha256=8oLlgS1Hr6IVvI0O71kIk5oIKXbt2lPVc1SZIjzcSTc,9452
|
|
37
|
+
tricc_oo/strategies/output/xlsform_cht.py,sha256=QLMBjxrCl8USBtZ0YarhU7RgY8gWT_s1WtPgfzBpXwk,19465
|
|
38
|
+
tricc_oo/strategies/output/xlsform_cht_hf.py,sha256=DEc8T62L17FSC-HJaFQacciQdaDa2MPK7lZpSatQIHs,2200
|
|
39
39
|
tricc_oo/visitors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
|
-
tricc_oo/visitors/tricc.py,sha256
|
|
40
|
+
tricc_oo/visitors/tricc.py,sha256=R9XWBskDAfkA0NbEo0ammkHsDASFgkthPDWOiOaLgbQ,97643
|
|
41
41
|
tricc_oo/visitors/utils.py,sha256=Gol4JNozPEd30Q1l8IPIPhx5fqVyy9R81GofGVebgD8,484
|
|
42
42
|
tricc_oo/visitors/xform_pd.py,sha256=H8x-72EdyT_-QgHGQN-ZAe-wc7tLtJGCM9waA64mz3M,9424
|
|
43
|
-
tricc_oo-1.4.
|
|
44
|
-
tricc_oo-1.4.
|
|
45
|
-
tricc_oo-1.4.
|
|
46
|
-
tricc_oo-1.4.
|
|
43
|
+
tricc_oo-1.4.21.dist-info/METADATA,sha256=vOGzsW7gtsMKnNJx9vY7W5a55tSENg1Vz1vM1hjTZVg,7878
|
|
44
|
+
tricc_oo-1.4.21.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
|
45
|
+
tricc_oo-1.4.21.dist-info/top_level.txt,sha256=NvbfMNAiy9m4b1unBsqpeOQWh4IgA1Xa33BtKA4abxk,15
|
|
46
|
+
tricc_oo-1.4.21.dist-info/RECORD,,
|