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.
@@ -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
- node_name = node.name if not isinstance(node, TriccNodeEnd) else node.get_reference()
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
- # 0-100 for manually specified instance. 100-200 for auto instance
125
- node.version = last_version.version + 1
126
- last_version.last = False
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
- else:
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
- if isinstance(node.reference, list):
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 = node.reference[0]
550
+ operation = reference[0]
532
551
  else:
533
552
  operation = and_join(
534
- node.reference
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.get_name() == dep_list:
1153
- logger.critical("[{}] depends on itself".format(
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
- if d not in waited and d not in looped:
1212
- if isinstance(d, TriccReference):
1213
- if not any(n.name == d.value for n in processed_nodes):
1214
- if not any(n.name == d.value for n in stashed_nodes):
1215
- waited = add_to_tree(waited, n, d)
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
- waited = add_to_tree(waited, n, d)
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
- return get_all_dependant(waited, stashed_nodes, processed_nodes, depth+1, waited , looped)
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 = 1
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, TriccNodeActivityEnd)):
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
- elif isinstance(node, (TriccNodeActivityStart)):
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
- if isinstance(node, TriccNodeActivity):
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 = TriccNodeActivityStart(
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(" (\+)|(\-)|(or)|(and) ", expression):
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.15
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=Wo2-JLEhsUSva8EanX5aRTS-tddqQWmBH-hwapotw1M,6478
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=TrZLfNRtLpcpHM1L524IQvv-hnWaksmrxWie0iMvFKM,13609
8
- tricc_oo/converters/datadictionnary.py,sha256=WQCvMYgEcxoCL1nRqq2aCQszIaKrIPCe3CkkZ0reAyY,3824
9
- tricc_oo/converters/drawio_type_map.py,sha256=HQR9fzwy52BRL0pWhYftzrRBd3LLWP4Ot1_CIqA8mCM,7011
10
- tricc_oo/converters/tricc_to_xls_form.py,sha256=bIVP1J2eZyIiVTaGQ3oQ_yu18R0stb4abMxg4fWr9Zc,2137
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=SfOgqgy8lYO08Q7JfCPCTKWbzwr6hURGD7ULZgqMLtc,37147
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=kAQuZtOsFtwX3V84zePgW9Pc-RYiny4EsnBlLecr3Yw,24059
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=FG8rq7zy3vbZO1C6WofMq--FE0JErdysM9WfAj4YYns,16321
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=-4ktvS1Kjk_WDZb2nry_VMjpV7ju3LZHwfsCIFAd8Uw,25618
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=dag8NVIuNXFtpptXrL-fGpPbIMF7gwYMtrVt9kL_iu0,3962
32
- tricc_oo/strategies/input/drawio.py,sha256=lWj5DYFxe4WpcpyrmVjy9S8_ubNG4rHxYBIp1cWzZaU,13345
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=2sJhyy2BQXpekjxGptBywh-2kwILnLYEUFx2MoOIkx4,30531
36
- tricc_oo/strategies/output/xlsform_cdss.py,sha256=dAT4KkXpoV8-PH7ya7aSa_86__YG0hElHss9VJoyVR8,9707
37
- tricc_oo/strategies/output/xlsform_cht.py,sha256=tHayxmFFM1_7Xu-Huz-IjvteEQXQm2fhKwAMFtG-tjU,17472
38
- tricc_oo/strategies/output/xlsform_cht_hf.py,sha256=bRTga6vteU86YWJC3umWeaL6Lt9dDz6e4pnHu7ctOiI,12377
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=-nrFmTxN0cdBbENtk0VitIBp2SamrMAMby9xHfvVwXI,95312
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.15.dist-info/METADATA,sha256=JUvJmxvWBba3RxbzVJIp9PCe5rMpMFFgIJkF-Jitark,7853
44
- tricc_oo-1.4.15.dist-info/WHEEL,sha256=ooBFpIzZCPdw3uqIQsOo4qqbA4ZRPxHnOH7peeONza0,91
45
- tricc_oo-1.4.15.dist-info/top_level.txt,sha256=NvbfMNAiy9m4b1unBsqpeOQWh4IgA1Xa33BtKA4abxk,15
46
- tricc_oo-1.4.15.dist-info/RECORD,,
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,,