tricc-oo 1.6.16__tar.gz → 1.6.19__tar.gz

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.
Files changed (56) hide show
  1. {tricc_oo-1.6.16/tricc_oo.egg-info → tricc_oo-1.6.19}/PKG-INFO +1 -1
  2. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/pyproject.toml +1 -1
  3. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tests/test_cql.py +9 -0
  4. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/cql_to_operation.py +1 -0
  5. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/datadictionnary.py +1 -1
  6. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/models/base.py +5 -0
  7. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/xls_form.py +76 -41
  8. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/xlsform_cht.py +3 -3
  9. {tricc_oo-1.6.16 → tricc_oo-1.6.19/tricc_oo.egg-info}/PKG-INFO +1 -1
  10. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/LICENSE +0 -0
  11. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/README.md +0 -0
  12. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/setup.cfg +0 -0
  13. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tests/build.py +0 -0
  14. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tests/to_ocl.py +0 -0
  15. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/__init__.py +0 -0
  16. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/__init__.py +0 -0
  17. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/codesystem_to_ocl.py +0 -0
  18. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/cql/cqlLexer.py +0 -0
  19. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/cql/cqlListener.py +0 -0
  20. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/cql/cqlParser.py +0 -0
  21. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/cql/cqlVisitor.py +0 -0
  22. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/drawio_type_map.py +0 -0
  23. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/tricc_to_xls_form.py +0 -0
  24. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/utils.py +0 -0
  25. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/converters/xml_to_tricc.py +0 -0
  26. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/models/__init__.py +0 -0
  27. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/models/calculate.py +0 -0
  28. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/models/lang.py +0 -0
  29. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/models/ocl.py +0 -0
  30. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/models/ordered_set.py +0 -0
  31. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/models/tricc.py +0 -0
  32. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/parsers/__init__.py +0 -0
  33. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/parsers/xml.py +0 -0
  34. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/serializers/__init__.py +0 -0
  35. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/serializers/planuml.py +0 -0
  36. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/serializers/xls_form.py +0 -0
  37. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/__init__.py +0 -0
  38. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/input/__init__.py +0 -0
  39. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/input/base_input_strategy.py +0 -0
  40. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/input/drawio.py +0 -0
  41. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/base_output_strategy.py +0 -0
  42. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/dhis2_form.py +0 -0
  43. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/fhir_form.py +0 -0
  44. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/html_form.py +0 -0
  45. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/openmrs_form.py +0 -0
  46. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/spice.py +0 -0
  47. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/xlsform_cdss.py +0 -0
  48. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/strategies/output/xlsform_cht_hf.py +0 -0
  49. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/visitors/__init__.py +0 -0
  50. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/visitors/tricc.py +0 -0
  51. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/visitors/utils.py +0 -0
  52. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo/visitors/xform_pd.py +0 -0
  53. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo.egg-info/SOURCES.txt +0 -0
  54. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo.egg-info/dependency_links.txt +0 -0
  55. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo.egg-info/requires.txt +0 -0
  56. {tricc_oo-1.6.16 → tricc_oo-1.6.19}/tricc_oo.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tricc-oo
3
- Version: 1.6.16
3
+ Version: 1.6.19
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tricc-oo"
7
- version = "1.6.16"
7
+ version = "1.6.19"
8
8
  description = "Python library that converts CDSS L2 in L3"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -26,6 +26,15 @@ class TestCql(unittest.TestCase):
26
26
  )
27
27
  self.assertEqual(str(dg_operation), str(dg_expected))
28
28
 
29
+ def test_diagnosis_list(self):
30
+ if_cql = 'DiagnosisList("final.TRIAGE_YELLOW", "triage_RED")'
31
+ dg_operation = transform_cql_to_operation(if_cql)
32
+ dg_expected = TriccOperation(
33
+ operator=TriccOperator.DIAGNOSIS_LIST,
34
+ reference=[TriccReference(value="final.TRIAGE_YELLOW"), TriccReference(value="triage_RED")],
35
+ )
36
+ self.assertEqual(str(dg_operation), str(dg_expected))
37
+
29
38
  def test_implied_concat(self):
30
39
  if_cql = "'A' & \"B\" & 'C'"
31
40
  cc_operation = transform_cql_to_operation(if_cql)
@@ -37,6 +37,7 @@ FUNCTION_MAP = {
37
37
  "HasQualifier": TriccOperator.HAS_QUALIFIER,
38
38
  "DateTimeToDecimal": TriccOperator.DATETIME_TO_DECIMAL,
39
39
  "Count": TriccOperator.COUNT,
40
+ "DiagnosisList": TriccOperator.DIAGNOSIS_LIST,
40
41
  }
41
42
  # TODO
42
43
  # Min
@@ -101,7 +101,7 @@ def check_and_add_concept(code_system: CodeSystem, code: str, display: str, attr
101
101
  for p in new_concept.property:
102
102
  if p.code == k:
103
103
  # TODO support other type of Codesystem Concept Property Value
104
- existing_attributes
104
+ existing_attributes = True
105
105
  if p.valueString != v:
106
106
  logger.warning(f"conflicting value for concept `{concept.code}` property ` {k}`: {p.valueString} != {v}")
107
107
  if not existing_attributes:
@@ -377,6 +377,7 @@ class TriccOperator(StrEnum):
377
377
  PARENTHESIS = "parenthesis"
378
378
  CONCATENATE = "concatenate"
379
379
  DATETIME_TO_DECIMAL = "datetime_to_decimal"
380
+ DIAGNOSIS_LIST = "diagnosis_list"
380
381
 
381
382
 
382
383
  RETURNS_BOOLEAN = [
@@ -423,6 +424,8 @@ RETURNS_NUMBER = [
423
424
 
424
425
  RETURNS_DATE = [TriccOperator.CAST_DATE]
425
426
 
427
+ RETURNS_STRING = [TriccOperator.DIAGNOSIS_LIST]
428
+
426
429
  OPERATION_LIST = {
427
430
  ">=": TriccOperator.MORE_OR_EQUAL,
428
431
  "<=": TriccOperator.LESS_OR_EQUAL,
@@ -480,6 +483,8 @@ class TriccOperation(BaseModel):
480
483
  return "number"
481
484
  elif self.operator in RETURNS_DATE:
482
485
  return "date"
486
+ elif self.operator in RETURNS_STRING:
487
+ return "string"
483
488
  elif self.operator == TriccOperator.CONCATENATE:
484
489
  return "string"
485
490
  elif self.operator == TriccOperator.PARENTHESIS:
@@ -127,6 +127,7 @@ class XLSFormStrategy(BaseOutPutStrategy):
127
127
  "df_calculate": self.df_calculate,
128
128
  "calculates": self.calculates,
129
129
  }
130
+
130
131
 
131
132
  def generate_export(self, node, **kwargs):
132
133
  return generate_xls_form_export(self, node, **kwargs)
@@ -374,12 +375,14 @@ class XLSFormStrategy(BaseOutPutStrategy):
374
375
 
375
376
  def get_tricc_operation_expression(self, operation):
376
377
  ref_expressions = []
378
+ original_references = []
377
379
  if not hasattr(operation, "reference"):
378
380
  return self.get_tricc_operation_operand(operation)
379
381
 
380
382
  operator = getattr(operation, "operator", "")
381
383
  coalesce_fallback = OPERATOR_COALESCE_FALLBACK[operator] if operator in OPERATOR_COALESCE_FALLBACK else "''"
382
384
  for r in operation.reference:
385
+ original_references.append(r)
383
386
  if isinstance(r, list):
384
387
  r_expr = [
385
388
  (
@@ -400,43 +403,43 @@ class XLSFormStrategy(BaseOutPutStrategy):
400
403
  # build lower level
401
404
  if hasattr(self, f"tricc_operation_{operation.operator}"):
402
405
  callable = getattr(self, f"tricc_operation_{operation.operator}")
403
- return callable(ref_expressions)
406
+ return callable(ref_expressions, original_references)
404
407
  else:
405
408
  raise NotImplementedError(
406
409
  f"This type of opreation '{operation.operator}' is not supported in this strategy"
407
410
  )
408
411
 
409
- def tricc_operation_count(self, ref_expressions):
412
+ def tricc_operation_count(self, ref_expressions, original_references=None):
410
413
  return f"count-selected({self.clean_coalesce(ref_expressions[0])})"
411
414
 
412
- def tricc_operation_multiplied(self, ref_expressions):
415
+ def tricc_operation_multiplied(self, ref_expressions, original_references=None):
413
416
  return "*".join(map(str, ref_expressions))
414
417
 
415
- def tricc_operation_divided(self, ref_expressions):
418
+ def tricc_operation_divided(self, ref_expressions, original_references=None):
416
419
  return f"{ref_expressions[0]} div {ref_expressions[1]}"
417
420
 
418
- def tricc_operation_modulo(self, ref_expressions):
421
+ def tricc_operation_modulo(self, ref_expressions, original_references=None):
419
422
  return f"{ref_expressions[0]} mod {ref_expressions[1]}"
420
423
 
421
- def tricc_operation_coalesce(self, ref_expressions):
424
+ def tricc_operation_coalesce(self, ref_expressions, original_references=None):
422
425
  return f"coalesce({','.join(map(self.clean_coalesce, ref_expressions))})"
423
426
 
424
- def tricc_operation_module(self, ref_expressions):
427
+ def tricc_operation_module(self, ref_expressions, original_references=None):
425
428
  return f"{ref_expressions[0]} mod {ref_expressions[1]}"
426
429
 
427
- def tricc_operation_minus(self, ref_expressions):
430
+ def tricc_operation_minus(self, ref_expressions, original_references=None):
428
431
  if len(ref_expressions) > 1:
429
432
  return " - ".join(map(str, ref_expressions))
430
433
  elif len(ref_expressions) == 1:
431
434
  return f"-{ref_expressions[0]}"
432
435
 
433
- def tricc_operation_plus(self, ref_expressions):
436
+ def tricc_operation_plus(self, ref_expressions, original_references=None):
434
437
  return " + ".join(map(str, ref_expressions))
435
438
 
436
- def tricc_operation_not(self, ref_expressions):
439
+ def tricc_operation_not(self, ref_expressions, original_references=None):
437
440
  return f"not({ref_expressions[0]})"
438
441
 
439
- def tricc_operation_and(self, ref_expressions):
442
+ def tricc_operation_and(self, ref_expressions, original_references=None):
440
443
  if len(ref_expressions) == 1:
441
444
  return ref_expressions[0]
442
445
  if len(ref_expressions) > 1:
@@ -448,7 +451,7 @@ class XLSFormStrategy(BaseOutPutStrategy):
448
451
  else:
449
452
  return "1"
450
453
 
451
- def tricc_operation_or(self, ref_expressions):
454
+ def tricc_operation_or(self, ref_expressions, original_references=None):
452
455
  if len(ref_expressions) == 1:
453
456
  return ref_expressions[0]
454
457
  if len(ref_expressions) > 1:
@@ -460,7 +463,7 @@ class XLSFormStrategy(BaseOutPutStrategy):
460
463
  else:
461
464
  return "1"
462
465
 
463
- def tricc_operation_native(self, ref_expressions):
466
+ def tricc_operation_native(self, ref_expressions, original_references=None):
464
467
 
465
468
  if len(ref_expressions) > 0:
466
469
  if ref_expressions[0].startswith(("'", "`",)):
@@ -477,22 +480,22 @@ class XLSFormStrategy(BaseOutPutStrategy):
477
480
  else:
478
481
  return f"{ref_expressions[0]}({','.join(map(str, ref_expressions[1:]))})"
479
482
 
480
- def tricc_operation_istrue(self, ref_expressions):
483
+ def tricc_operation_istrue(self, ref_expressions, original_references=None):
481
484
  if str(BOOLEAN_MAP[str(TRICC_TRUE_VALUE)]).isnumeric():
482
485
  return f"{ref_expressions[0]}>={BOOLEAN_MAP[str(TRICC_TRUE_VALUE)]}"
483
486
  else:
484
487
  return f"{ref_expressions[0]}={BOOLEAN_MAP[str(TRICC_TRUE_VALUE)]}"
485
488
 
486
- def tricc_operation_isfalse(self, ref_expressions):
489
+ def tricc_operation_isfalse(self, ref_expressions, original_references=None):
487
490
  if str(BOOLEAN_MAP[str(TRICC_FALSE_VALUE)]).isnumeric():
488
491
  return f"{ref_expressions[0]}={BOOLEAN_MAP[str(TRICC_FALSE_VALUE)]}"
489
492
  else:
490
493
  return f"{ref_expressions[0]}={BOOLEAN_MAP[str(TRICC_FALSE_VALUE)]}"
491
494
 
492
- def tricc_operation_parenthesis(self, ref_expressions):
495
+ def tricc_operation_parenthesis(self, ref_expressions, original_references=None):
493
496
  return f"({ref_expressions[0]})"
494
497
 
495
- def tricc_operation_selected(self, ref_expressions):
498
+ def tricc_operation_selected(self, ref_expressions, original_references=None):
496
499
  parts = []
497
500
  for s in ref_expressions[1:]:
498
501
  # for option with numeric value
@@ -508,49 +511,49 @@ class XLSFormStrategy(BaseOutPutStrategy):
508
511
  else:
509
512
  return self.tricc_operation_or(parts)
510
513
 
511
- def tricc_operation_more_or_equal(self, ref_expressions):
514
+ def tricc_operation_more_or_equal(self, ref_expressions, original_references=None):
512
515
  return f"{ref_expressions[0]}>={ref_expressions[1]}"
513
516
 
514
- def tricc_operation_less_or_equal(self, ref_expressions):
517
+ def tricc_operation_less_or_equal(self, ref_expressions, original_references=None):
515
518
  return f"{ref_expressions[0]}<={ref_expressions[1]}"
516
519
 
517
- def tricc_operation_more(self, ref_expressions):
520
+ def tricc_operation_more(self, ref_expressions, original_references=None):
518
521
  return f"{ref_expressions[0]}>{ref_expressions[1]}"
519
522
 
520
- def tricc_operation_less(self, ref_expressions):
523
+ def tricc_operation_less(self, ref_expressions, original_references=None):
521
524
  return f"{ref_expressions[0]}<{ref_expressions[1]}"
522
525
 
523
- def tricc_operation_between(self, ref_expressions):
526
+ def tricc_operation_between(self, ref_expressions, original_references=None):
524
527
  return f"{ref_expressions[0]}>={ref_expressions[1]} and {ref_expressions[0]} < {ref_expressions[2]}"
525
528
 
526
- def tricc_operation_equal(self, ref_expressions):
529
+ def tricc_operation_equal(self, ref_expressions, original_references=None):
527
530
  return f"{ref_expressions[0]}={ref_expressions[1]}"
528
531
 
529
- def tricc_operation_not_equal(self, ref_expressions):
532
+ def tricc_operation_not_equal(self, ref_expressions, original_references=None):
530
533
  return f"{ref_expressions[0]}!={ref_expressions[1]}"
531
534
 
532
- def tricc_operation_isnull(self, ref_expressions):
535
+ def tricc_operation_isnull(self, ref_expressions, original_references=None):
533
536
  return f"{ref_expressions[0]}=''"
534
537
 
535
- def tricc_operation_isnotnull(self, ref_expressions):
538
+ def tricc_operation_isnotnull(self, ref_expressions, original_references=None):
536
539
  return f"{ref_expressions[0]}!=''"
537
540
 
538
- def tricc_operation_isnottrue(self, ref_expressions):
541
+ def tricc_operation_isnottrue(self, ref_expressions, original_references=None):
539
542
  if str(BOOLEAN_MAP[str(TRICC_TRUE_VALUE)]).isnumeric():
540
543
  return f"{ref_expressions[0]}<{BOOLEAN_MAP[str(TRICC_TRUE_VALUE)]}"
541
544
  else:
542
545
  return f"{ref_expressions[0]}!={BOOLEAN_MAP[str(TRICC_TRUE_VALUE)]}"
543
546
 
544
- def tricc_operation_isnotfalse(self, ref_expressions):
547
+ def tricc_operation_isnotfalse(self, ref_expressions, original_references=None):
545
548
  if str(BOOLEAN_MAP[str(TRICC_FALSE_VALUE)]).isnumeric():
546
549
  return f"{ref_expressions[0]}>{BOOLEAN_MAP[str(TRICC_FALSE_VALUE)]}"
547
550
  else:
548
551
  return f"{ref_expressions[0]}!={BOOLEAN_MAP[str(TRICC_FALSE_VALUE)]}"
549
552
 
550
- def tricc_operation_notexist(self, ref_expressions):
553
+ def tricc_operation_notexist(self, ref_expressions, original_references=None):
551
554
  return f"{ref_expressions[0]}=''"
552
555
 
553
- def tricc_operation_case(self, ref_expressions):
556
+ def tricc_operation_case(self, ref_expressions, original_references=None):
554
557
  ifs = 0
555
558
  parts = []
556
559
  else_found = False
@@ -573,7 +576,7 @@ class XLSFormStrategy(BaseOutPutStrategy):
573
576
  exp += ")"
574
577
  return exp
575
578
 
576
- def tricc_operation_ifs(self, ref_expressions):
579
+ def tricc_operation_ifs(self, ref_expressions, original_references=None):
577
580
  ifs = 0
578
581
  parts = []
579
582
  else_found = False
@@ -598,19 +601,19 @@ class XLSFormStrategy(BaseOutPutStrategy):
598
601
  def get_empty_label(self):
599
602
  return "."
600
603
 
601
- def tricc_operation_if(self, ref_expressions):
604
+ def tricc_operation_if(self, ref_expressions, original_references=None):
602
605
  return f"if({ref_expressions[0]},{ref_expressions[1]},{ref_expressions[2]})"
603
606
 
604
- def tricc_operation_contains(self, ref_expressions):
607
+ def tricc_operation_contains(self, ref_expressions, original_references=None):
605
608
  return f"contains({self.clean_coalesce(ref_expressions[0])}, {self.clean_coalesce(ref_expressions[1])})"
606
609
 
607
- def tricc_operation_exists(self, ref_expressions):
610
+ def tricc_operation_exists(self, ref_expressions, original_references=None):
608
611
  parts = []
609
612
  for ref in ref_expressions:
610
613
  parts.append(self.tricc_operation_not_equal([self.tricc_operation_coalesce([ref, "''"]), "''"]))
611
614
  return self.tricc_operation_and(parts)
612
615
 
613
- def tricc_operation_cast_number(self, ref_expressions):
616
+ def tricc_operation_cast_number(self, ref_expressions, original_references=None):
614
617
  if isinstance(
615
618
  ref_expressions[0],
616
619
  (
@@ -637,7 +640,7 @@ class XLSFormStrategy(BaseOutPutStrategy):
637
640
  else:
638
641
  return f"number({ref_expressions[0]})"
639
642
 
640
- def tricc_operation_cast_integer(self, ref_expressions):
643
+ def tricc_operation_cast_integer(self, ref_expressions, original_references=None):
641
644
  if isinstance(
642
645
  ref_expressions[0],
643
646
  (
@@ -664,18 +667,18 @@ class XLSFormStrategy(BaseOutPutStrategy):
664
667
  else:
665
668
  return f"int({ref_expressions[0]})"
666
669
 
667
- def tricc_operation_zscore(self, ref_expressions):
670
+ def tricc_operation_zscore(self, ref_expressions, original_references=None):
668
671
  y, ll, m, s = self.get_zscore_params(ref_expressions)
669
672
  # return ((Math.pow((y / m), l) - 1) / (s * l));
670
673
  return f"(pow({y} div ({m}), {ll}) -1) div (({s}) div ({ll}))"
671
674
 
672
- def tricc_operation_datetime_to_decimal(self, ref_expressions):
675
+ def tricc_operation_datetime_to_decimal(self, ref_expressions, original_references=None):
673
676
  return f"decimal-date-time({ref_expressions[0]})"
674
677
 
675
- def tricc_operation_round(self, ref_expressions):
678
+ def tricc_operation_round(self, ref_expressions, original_references=None):
676
679
  return f"round({ref_expressions[0]})"
677
680
 
678
- def tricc_operation_izscore(self, ref_expressions):
681
+ def tricc_operation_izscore(self, ref_expressions, original_references=None):
679
682
  z, ll, m, s = self.get_zscore_params(ref_expressions)
680
683
  # return (m * (z*s*l-1)^(1/l));
681
684
  return f"pow({m} * ({z} * {s} * {ll} -1), 1 div {ll})"
@@ -694,6 +697,7 @@ class XLSFormStrategy(BaseOutPutStrategy):
694
697
  # @param left part
695
698
  # @param right part
696
699
  def generate_xls_form_calculate(self, node, processed_nodes, stashed_nodes, calculates, **kwargs):
700
+ self.codesystems = kwargs.get("codesystems", {})
697
701
  if is_ready_to_process(node, processed_nodes, strict=False) and process_reference(
698
702
  node,
699
703
  processed_nodes,
@@ -746,9 +750,40 @@ class XLSFormStrategy(BaseOutPutStrategy):
746
750
  else:
747
751
  raise NotImplementedError(f"This type of node {r.__class__} is not supported within an operation")
748
752
 
749
- def tricc_operation_concatenate(self, ref_expressions):
753
+ def tricc_operation_concatenate(self, ref_expressions, original_references=None):
750
754
  return f"concat({','.join(map(str, ref_expressions))})"
751
755
 
756
+ def tricc_operation_diagnosis_list(self, ref_expressions, original_references=None):
757
+ from tricc_oo.converters.datadictionnary import lookup_codesystems_code
758
+
759
+ parts = []
760
+ for i, orig_ref in enumerate(original_references):
761
+ expr = ref_expressions[i] if ref_expressions and i < len(ref_expressions) else None
762
+
763
+ code = None
764
+ # Use only original references for code lookup
765
+ if isinstance(orig_ref, TriccReference):
766
+ code = orig_ref.value
767
+ elif issubclass(type(orig_ref), TriccNodeBaseModel):
768
+ code = orig_ref.name
769
+ else:
770
+ logger.critical(f"Unexpected reference type: {type(orig_ref)}, value: {orig_ref}")
771
+ exit(1)
772
+
773
+ concept = lookup_codesystems_code(self.project.code_systems, code)
774
+ if concept:
775
+ display = getattr(concept, 'display', code)
776
+ else:
777
+ logger.warning(f"Diagnosis code '{code}' not found in codesystems")
778
+ display = code
779
+
780
+ # Always include comma after diagnosis name
781
+ parts.append(f"if({expr} = 1, '{display},', '')")
782
+
783
+ if parts:
784
+ return f"concat({','.join(parts)})"
785
+ return "''"
786
+
752
787
  def validate(self):
753
788
  """Validate the generated XLS form using pyxform."""
754
789
  try:
@@ -840,7 +840,7 @@ class XLSFormCHTStrategy(XLSFormCDSSStrategy):
840
840
  logger.error(f"Failed to download ODK Validate JAR: {str(e)}")
841
841
  return None
842
842
 
843
- def tricc_operation_zscore(self, ref_expressions):
843
+ def tricc_operation_zscore(self, ref_expressions, original_references=None):
844
844
  y, ll, m, s = self.get_zscore_params(ref_expressions)
845
845
  # return ((Math.pow((y / m), l) - 1) / (s * l));
846
846
  return f"""cht:extension-lib('{
@@ -853,7 +853,7 @@ class XLSFormCHTStrategy(XLSFormCDSSStrategy):
853
853
  self.clean_coalesce(ref_expressions[3])
854
854
  })"""
855
855
 
856
- def tricc_operation_izscore(self, ref_expressions):
856
+ def tricc_operation_izscore(self, ref_expressions, original_references=None):
857
857
  z, ll, m, s = self.get_zscore_params(ref_expressions)
858
858
  # return (m * (z*s*l-1)^(1/l));
859
859
  return f"""cht:extension-lib('{
@@ -866,7 +866,7 @@ class XLSFormCHTStrategy(XLSFormCDSSStrategy):
866
866
  self.clean_coalesce(ref_expressions[3])
867
867
  }, true"""
868
868
 
869
- def tricc_operation_drug_dosage(self, ref_expressions):
869
+ def tricc_operation_drug_dosage(self, ref_expressions, original_references=None):
870
870
  # drug name
871
871
  # age
872
872
  # weight
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tricc-oo
3
- Version: 1.6.16
3
+ Version: 1.6.19
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
File without changes
File without changes
File without changes
File without changes
File without changes