endoreg-db 0.5.3__py3-none-any.whl → 0.6.1__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.

Potentially problematic release.


This version of endoreg-db might be problematic. Click here for more details.

Files changed (268) hide show
  1. endoreg_db/admin.py +90 -1
  2. endoreg_db/case_generator/case_generator.py +159 -0
  3. endoreg_db/case_generator/lab_sample_factory.py +33 -0
  4. endoreg_db/case_generator/utils.py +30 -0
  5. endoreg_db/data/__init__.py +50 -4
  6. endoreg_db/data/ai_model/data.yaml +7 -0
  7. endoreg_db/data/{label → ai_model_label}/label/data.yaml +27 -1
  8. endoreg_db/data/ai_model_label/label-set/data.yaml +21 -0
  9. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +5 -0
  10. endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
  11. endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
  12. endoreg_db/data/center/data.yaml +35 -5
  13. endoreg_db/data/contraindication/bleeding.yaml +11 -0
  14. endoreg_db/data/distribution/numeric/data.yaml +14 -0
  15. endoreg_db/data/endoscope/data.yaml +93 -0
  16. endoreg_db/data/examination_indication/endoscopy.yaml +8 -0
  17. endoreg_db/data/examination_indication_classification/endoscopy.yaml +8 -0
  18. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
  19. endoreg_db/data/finding/data.yaml +141 -0
  20. endoreg_db/data/finding_intervention/endoscopy.yaml +138 -0
  21. endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
  22. endoreg_db/data/finding_location_classification/colonoscopy.yaml +46 -0
  23. endoreg_db/data/finding_location_classification_choice/colonoscopy.yaml +240 -0
  24. endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +48 -0
  25. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_circularity_default.yaml +34 -0
  26. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_nice.yaml +20 -0
  27. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_paris.yaml +65 -0
  28. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_planarity_default.yaml +56 -0
  29. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_surface_intact_default.yaml +39 -0
  30. endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +57 -0
  31. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
  32. endoreg_db/data/finding_type/data.yaml +30 -0
  33. endoreg_db/data/gender/data.yaml +17 -0
  34. endoreg_db/data/lab_value/cardiac_enzymes.yaml +7 -1
  35. endoreg_db/data/lab_value/coagulation.yaml +6 -1
  36. endoreg_db/data/lab_value/electrolytes.yaml +39 -1
  37. endoreg_db/data/lab_value/gastrointestinal_function.yaml +12 -0
  38. endoreg_db/data/lab_value/hematology.yaml +17 -2
  39. endoreg_db/data/lab_value/hormones.yaml +6 -0
  40. endoreg_db/data/lab_value/lipids.yaml +12 -3
  41. endoreg_db/data/lab_value/misc.yaml +5 -2
  42. endoreg_db/data/lab_value/renal_function.yaml +2 -1
  43. endoreg_db/data/lx_client_tag/base.yaml +54 -0
  44. endoreg_db/data/lx_client_type/base.yaml +30 -0
  45. endoreg_db/data/lx_permission/base.yaml +24 -0
  46. endoreg_db/data/lx_permission/endoreg.yaml +52 -0
  47. endoreg_db/data/medication_indication/anticoagulation.yaml +44 -49
  48. endoreg_db/data/names_first/first_names.yaml +51 -0
  49. endoreg_db/data/names_last/last_names.yaml +51 -0
  50. endoreg_db/data/network_device/data.yaml +30 -0
  51. endoreg_db/data/organ/data.yaml +29 -0
  52. endoreg_db/data/pdf_type/data.yaml +2 -1
  53. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +4 -0
  54. endoreg_db/forms/__init__.py +3 -1
  55. endoreg_db/forms/examination_form.py +11 -0
  56. endoreg_db/forms/patient_finding_intervention_form.py +19 -0
  57. endoreg_db/forms/patient_form.py +26 -0
  58. endoreg_db/management/commands/__init__.py +0 -0
  59. endoreg_db/management/commands/load_ai_model_data.py +57 -23
  60. endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
  61. endoreg_db/management/commands/load_base_db_data.py +160 -118
  62. endoreg_db/management/commands/{load_endoscope_type_data.py → load_contraindication_data.py} +3 -7
  63. endoreg_db/management/commands/load_disease_data.py +29 -7
  64. endoreg_db/management/commands/load_endoscope_data.py +68 -0
  65. endoreg_db/management/commands/load_examination_indication_data.py +65 -0
  66. endoreg_db/management/commands/load_finding_data.py +171 -0
  67. endoreg_db/management/commands/load_lab_value_data.py +3 -3
  68. endoreg_db/management/commands/load_lx_data.py +64 -0
  69. endoreg_db/management/commands/load_medication_data.py +83 -21
  70. endoreg_db/management/commands/load_name_data.py +37 -0
  71. endoreg_db/management/commands/{load_endoscopy_processor_data.py → load_organ_data.py} +7 -9
  72. endoreg_db/migrations/0001_initial.py +1206 -728
  73. endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +23 -0
  74. endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +23 -0
  75. endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +25 -0
  76. endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +33 -0
  77. endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +23 -0
  78. endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +24 -0
  79. endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +48 -0
  80. endoreg_db/models/__init__.py +331 -28
  81. endoreg_db/models/ai_model/__init__.py +1 -0
  82. endoreg_db/models/ai_model/ai_model.py +103 -0
  83. endoreg_db/models/ai_model/lightning/__init__.py +3 -0
  84. endoreg_db/models/ai_model/lightning/inference_dataset.py +53 -0
  85. endoreg_db/models/ai_model/lightning/multilabel_classification_net.py +155 -0
  86. endoreg_db/models/ai_model/lightning/postprocess.py +53 -0
  87. endoreg_db/models/ai_model/lightning/predict.py +172 -0
  88. endoreg_db/models/ai_model/lightning/prediction_visualizer.py +55 -0
  89. endoreg_db/models/ai_model/lightning/preprocess.py +68 -0
  90. endoreg_db/models/ai_model/lightning/run_visualizer.py +21 -0
  91. endoreg_db/models/ai_model/model_meta.py +232 -6
  92. endoreg_db/models/ai_model/model_type.py +13 -3
  93. endoreg_db/models/annotation/__init__.py +31 -2
  94. endoreg_db/models/annotation/anonymized_image_annotation.py +73 -18
  95. endoreg_db/models/annotation/binary_classification_annotation_task.py +94 -57
  96. endoreg_db/models/annotation/image_classification.py +73 -14
  97. endoreg_db/models/annotation/video_segmentation_annotation.py +52 -0
  98. endoreg_db/models/annotation/video_segmentation_labelset.py +20 -0
  99. endoreg_db/models/case/__init__.py +1 -0
  100. endoreg_db/models/{persons/patient/case → case}/case.py +4 -0
  101. endoreg_db/models/case_template/__init__.py +10 -1
  102. endoreg_db/models/case_template/case_template.py +57 -13
  103. endoreg_db/models/case_template/case_template_rule.py +5 -5
  104. endoreg_db/models/case_template/case_template_rule_value.py +19 -4
  105. endoreg_db/models/center/__init__.py +7 -0
  106. endoreg_db/models/center/center.py +31 -5
  107. endoreg_db/models/center/center_product.py +0 -1
  108. endoreg_db/models/center/center_resource.py +16 -2
  109. endoreg_db/models/center/center_waste.py +6 -1
  110. endoreg_db/models/contraindication/__init__.py +21 -0
  111. endoreg_db/models/data_file/__init__.py +38 -5
  112. endoreg_db/models/data_file/base_classes/__init__.py +6 -1
  113. endoreg_db/models/data_file/base_classes/abstract_frame.py +64 -15
  114. endoreg_db/models/data_file/base_classes/abstract_pdf.py +136 -0
  115. endoreg_db/models/data_file/base_classes/abstract_video.py +744 -138
  116. endoreg_db/models/data_file/base_classes/frame_helpers.py +17 -0
  117. endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +19 -0
  118. endoreg_db/models/data_file/base_classes/utils.py +80 -0
  119. endoreg_db/models/data_file/frame.py +22 -38
  120. endoreg_db/models/data_file/import_classes/__init__.py +4 -18
  121. endoreg_db/models/data_file/import_classes/raw_pdf.py +162 -90
  122. endoreg_db/models/data_file/import_classes/raw_video.py +239 -294
  123. endoreg_db/models/data_file/metadata/__init__.py +10 -0
  124. endoreg_db/models/data_file/metadata/pdf_meta.py +4 -0
  125. endoreg_db/models/data_file/metadata/sensitive_meta.py +265 -6
  126. endoreg_db/models/data_file/metadata/video_meta.py +116 -50
  127. endoreg_db/models/data_file/report_file.py +30 -63
  128. endoreg_db/models/data_file/video/__init__.py +6 -2
  129. endoreg_db/models/data_file/video/video.py +187 -16
  130. endoreg_db/models/data_file/video_segment.py +162 -55
  131. endoreg_db/models/disease.py +25 -2
  132. endoreg_db/models/emission/__init__.py +5 -1
  133. endoreg_db/models/emission/emission_factor.py +71 -6
  134. endoreg_db/models/event.py +51 -0
  135. endoreg_db/models/examination/__init__.py +6 -1
  136. endoreg_db/models/examination/examination.py +53 -12
  137. endoreg_db/models/examination/examination_indication.py +170 -0
  138. endoreg_db/models/examination/examination_time.py +31 -5
  139. endoreg_db/models/examination/examination_time_type.py +28 -4
  140. endoreg_db/models/examination/examination_type.py +28 -6
  141. endoreg_db/models/finding/__init__.py +11 -0
  142. endoreg_db/models/finding/finding.py +75 -0
  143. endoreg_db/models/finding/finding_intervention.py +60 -0
  144. endoreg_db/models/finding/finding_location_classification.py +94 -0
  145. endoreg_db/models/finding/finding_morphology_classification.py +89 -0
  146. endoreg_db/models/finding/finding_type.py +22 -0
  147. endoreg_db/models/hardware/endoscope.py +16 -0
  148. endoreg_db/models/hardware/endoscopy_processor.py +31 -19
  149. endoreg_db/models/label/label.py +35 -7
  150. endoreg_db/models/laboratory/lab_value.py +12 -3
  151. endoreg_db/models/logging/__init__.py +8 -1
  152. endoreg_db/models/lx/__init__.py +4 -0
  153. endoreg_db/models/lx/client.py +57 -0
  154. endoreg_db/models/lx/identity.py +34 -0
  155. endoreg_db/models/lx/permission.py +18 -0
  156. endoreg_db/models/lx/user.py +16 -0
  157. endoreg_db/models/medication/__init__.py +19 -1
  158. endoreg_db/models/medication/medication.py +7 -122
  159. endoreg_db/models/medication/medication_indication.py +50 -0
  160. endoreg_db/models/medication/medication_indication_type.py +34 -0
  161. endoreg_db/models/medication/medication_intake_time.py +26 -0
  162. endoreg_db/models/medication/medication_schedule.py +37 -0
  163. endoreg_db/models/network/__init__.py +7 -1
  164. endoreg_db/models/network/network_device.py +13 -8
  165. endoreg_db/models/organ/__init__.py +38 -0
  166. endoreg_db/models/other/__init__.py +19 -1
  167. endoreg_db/models/other/distribution/__init__.py +44 -0
  168. endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
  169. endoreg_db/models/other/distribution/date_value_distribution.py +91 -0
  170. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
  171. endoreg_db/models/other/distribution/numeric_value_distribution.py +97 -0
  172. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
  173. endoreg_db/models/other/distribution.py +1 -211
  174. endoreg_db/models/other/material.py +4 -0
  175. endoreg_db/models/other/transport_route.py +2 -1
  176. endoreg_db/models/patient/__init__.py +24 -0
  177. endoreg_db/models/patient/patient_examination.py +182 -0
  178. endoreg_db/models/patient/patient_finding.py +143 -0
  179. endoreg_db/models/patient/patient_finding_intervention.py +26 -0
  180. endoreg_db/models/patient/patient_finding_location.py +120 -0
  181. endoreg_db/models/patient/patient_finding_morphology.py +166 -0
  182. endoreg_db/models/persons/__init__.py +29 -2
  183. endoreg_db/models/persons/examiner/examiner.py +48 -4
  184. endoreg_db/models/persons/patient/__init__.py +1 -1
  185. endoreg_db/models/persons/patient/patient.py +227 -54
  186. endoreg_db/models/persons/patient/patient_disease.py +6 -0
  187. endoreg_db/models/persons/patient/patient_event.py +31 -1
  188. endoreg_db/models/persons/patient/patient_examination_indication.py +32 -0
  189. endoreg_db/models/persons/patient/patient_lab_sample.py +4 -2
  190. endoreg_db/models/persons/patient/patient_lab_value.py +37 -16
  191. endoreg_db/models/persons/patient/patient_medication.py +27 -12
  192. endoreg_db/models/persons/patient/patient_medication_schedule.py +62 -2
  193. endoreg_db/models/prediction/__init__.py +7 -1
  194. endoreg_db/models/prediction/image_classification.py +20 -6
  195. endoreg_db/models/prediction/video_prediction_meta.py +151 -89
  196. endoreg_db/models/product/__init__.py +10 -1
  197. endoreg_db/models/product/product.py +15 -2
  198. endoreg_db/models/product/product_group.py +8 -0
  199. endoreg_db/models/product/product_material.py +4 -0
  200. endoreg_db/models/product/product_weight.py +12 -0
  201. endoreg_db/models/product/reference_product.py +19 -3
  202. endoreg_db/models/quiz/__init__.py +8 -1
  203. endoreg_db/models/report_reader/__init__.py +6 -1
  204. endoreg_db/serializers/__init__.py +1 -1
  205. endoreg_db/serializers/annotation.py +2 -5
  206. endoreg_db/serializers/frame.py +1 -5
  207. endoreg_db/serializers/patient.py +26 -3
  208. endoreg_db/serializers/prediction.py +2 -7
  209. endoreg_db/serializers/raw_video_meta_validation.py +13 -0
  210. endoreg_db/serializers/video.py +6 -13
  211. endoreg_db/serializers/video_segmentation.py +492 -0
  212. endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
  213. endoreg_db/templates/admin/start_examination.html +12 -0
  214. endoreg_db/templates/timeline.html +176 -0
  215. endoreg_db/urls.py +173 -0
  216. endoreg_db/utils/__init__.py +36 -1
  217. endoreg_db/utils/dataloader.py +45 -19
  218. endoreg_db/utils/dates.py +39 -0
  219. endoreg_db/utils/hashs.py +122 -4
  220. endoreg_db/utils/names.py +74 -0
  221. endoreg_db/utils/parse_and_generate_yaml.py +46 -0
  222. endoreg_db/utils/pydantic_models/__init__.py +6 -0
  223. endoreg_db/utils/pydantic_models/db_config.py +57 -0
  224. endoreg_db/utils/validate_endo_roi.py +19 -0
  225. endoreg_db/utils/validate_subcategory_dict.py +91 -0
  226. endoreg_db/utils/video/__init__.py +13 -0
  227. endoreg_db/utils/video/extract_frames.py +121 -0
  228. endoreg_db/utils/video/transcode_videofile.py +111 -0
  229. endoreg_db/views/__init__.py +2 -0
  230. endoreg_db/views/csrf.py +7 -0
  231. endoreg_db/views/patient_views.py +90 -0
  232. endoreg_db/views/raw_video_meta_validation_views.py +38 -0
  233. endoreg_db/views/report_views.py +96 -0
  234. endoreg_db/views/video_segmentation_views.py +149 -0
  235. endoreg_db/views/views_for_timeline.py +46 -0
  236. endoreg_db/views.py +0 -3
  237. endoreg_db-0.6.1.dist-info/METADATA +151 -0
  238. endoreg_db-0.6.1.dist-info/RECORD +420 -0
  239. {endoreg_db-0.5.3.dist-info → endoreg_db-0.6.1.dist-info}/WHEEL +1 -1
  240. endoreg_db/data/active_model/data.yaml +0 -3
  241. endoreg_db/data/label/label-set/data.yaml +0 -18
  242. endoreg_db/management/commands/delete_legacy_images.py +0 -19
  243. endoreg_db/management/commands/delete_legacy_videos.py +0 -17
  244. endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
  245. endoreg_db/management/commands/import_legacy_images.py +0 -94
  246. endoreg_db/management/commands/import_legacy_videos.py +0 -76
  247. endoreg_db/management/commands/load_label_data.py +0 -67
  248. endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
  249. endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
  250. endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
  251. endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
  252. endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
  253. endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
  254. endoreg_db/migrations/0008_networkdevicelogentry_aglnet_ip_and_more.py +0 -28
  255. endoreg_db/migrations/0009_alter_networkdevicelogentry_vpn_service_status.py +0 -18
  256. endoreg_db/migrations/0010_remove_networkdevicelogentry_hostname.py +0 -17
  257. endoreg_db/models/legacy_data/__init__.py +0 -3
  258. endoreg_db/models/legacy_data/image.py +0 -34
  259. endoreg_db/models/patient_examination/__init__.py +0 -35
  260. endoreg_db/utils/video_metadata.py +0 -87
  261. endoreg_db-0.5.3.dist-info/METADATA +0 -28
  262. endoreg_db-0.5.3.dist-info/RECORD +0 -319
  263. /endoreg_db/{models/persons/patient/case → case_generator}/__init__.py +0 -0
  264. /endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +0 -0
  265. /endoreg_db/data/{model_type → ai_model_type}/data.yaml +0 -0
  266. /endoreg_db/{data/distribution/numeric/.init → management/__init__.py} +0 -0
  267. /endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +0 -0
  268. {endoreg_db-0.5.3.dist-info → endoreg_db-0.6.1.dist-info}/licenses/LICENSE +0 -0
endoreg_db/admin.py CHANGED
@@ -1,3 +1,92 @@
1
+ from django.urls import path
1
2
  from django.contrib import admin
3
+ from django.http import JsonResponse
4
+ from endoreg_db.models import (
5
+ Patient,
6
+ Examination,
7
+ PatientExamination,
8
+ Finding,
9
+ FindingLocationClassification,
10
+ FindingMorphologyClassification,
11
+ FindingIntervention, # Import Finding Interventions
12
+ PatientFindingIntervention,
13
+ FindingLocationClassificationChoice,
14
+ FindingMorphologyClassificationChoice,
15
+ )
16
+ from endoreg_db.forms.patient_finding_intervention_form import (
17
+ PatientFindingInterventionForm,
18
+ )
19
+ from endoreg_db.forms.patient_form import PatientForm
2
20
 
3
- # Register your models here.
21
+
22
+ @admin.register(Patient)
23
+ class PatientAdmin(admin.ModelAdmin):
24
+ form = PatientForm
25
+ list_display = ("id", "first_name", "last_name", "dob", "center")
26
+ search_fields = ("first_name", "last_name", "email", "phone")
27
+ list_filter = ("dob", "center")
28
+ ordering = ("last_name",)
29
+
30
+
31
+ @admin.register(Examination)
32
+ class ExaminationAdmin(admin.ModelAdmin):
33
+ list_display = ("id", "name")
34
+ search_fields = ("name", "name_de", "name_en")
35
+ list_filter = ("name",)
36
+ ordering = ("name",)
37
+
38
+
39
+ class PatientFindingInterventionAdmin(admin.ModelAdmin):
40
+ change_list_template = "admin/patient_finding_intervention.html"
41
+
42
+ def changelist_view(self, request, extra_context=None):
43
+ """Pass Patients, Examinations, Findings, Locations, Location Choices, Morphologies, Morphology Choices, and Finding Interventions to the template"""
44
+ extra_context = {
45
+ "patients": Patient.objects.all(),
46
+ "examinations": Examination.objects.all(),
47
+ "findings": Finding.objects.all(),
48
+ "locations": FindingLocationClassification.objects.all(),
49
+ "location_choices": FindingLocationClassificationChoice.objects.none(),
50
+ "morphologies": FindingMorphologyClassification.objects.all(),
51
+ "morphology_choices": FindingMorphologyClassificationChoice.objects.all(),
52
+ "finding_interventions": FindingIntervention.objects.all(), # Pass Finding Interventions
53
+ }
54
+ return super().changelist_view(request, extra_context=extra_context)
55
+
56
+ def get_location_choices_json(self, request):
57
+ """Ensure Django Admin returns JSON response for Location Choices"""
58
+ location_id = request.GET.get("location")
59
+ if not location_id:
60
+ return JsonResponse({"error": "Location ID is required"}, status=400)
61
+
62
+ try:
63
+ choices = list(
64
+ FindingLocationClassificationChoice.objects.filter(
65
+ location_classifications__id=location_id
66
+ ).values("id", "name")
67
+ ) # Convert QuerySet to List
68
+
69
+ if not choices:
70
+ return JsonResponse(
71
+ [], safe=False
72
+ ) # Return an empty list if no data found
73
+
74
+ return JsonResponse(choices, safe=False) # Return valid JSON
75
+
76
+ except Exception as e:
77
+ return JsonResponse({"error": str(e)}, status=500)
78
+
79
+ def get_urls(self):
80
+ """Register JSON endpoint inside Django Admin"""
81
+ urls = super().get_urls()
82
+ custom_urls = [
83
+ path(
84
+ "ajax/get-location-choices/",
85
+ self.admin_site.admin_view(self.get_location_choices_json),
86
+ name="ajax_get_location_choices",
87
+ ),
88
+ ]
89
+ return custom_urls + urls
90
+
91
+
92
+ admin.site.register(PatientFindingIntervention, PatientFindingInterventionAdmin)
@@ -0,0 +1,159 @@
1
+ from endoreg_db.models import CaseTemplate, CaseTemplateRule, CaseTemplateRuleType
2
+ from endoreg_db.case_generator.lab_sample_factory import LabSampleFactory
3
+
4
+ DEFAULT_CASE_TEMPLATE_NAME = "pre_default_screening_colonoscopy"
5
+
6
+ class CaseGenerator:
7
+ """
8
+ Provides methods to generate cases based on a template.
9
+ """
10
+
11
+ def __init__(self, template: CaseTemplate = None):
12
+ """
13
+ Initializes the CaseGenerator with a template.
14
+
15
+ Args:
16
+ template (CaseTemplate, optional): The template to use for case generation. Defaults to the predefined template.
17
+ """
18
+ self.template = template or CaseTemplate.objects.get(name=DEFAULT_CASE_TEMPLATE_NAME)
19
+ self.lab_sample_factory = LabSampleFactory()
20
+
21
+ # Define available rule types
22
+ rule_type_names = [
23
+ "create-object",
24
+ "set-field-default",
25
+ "set-field-by-distribution",
26
+ "set-field-by-value",
27
+ "set-field-single-choice",
28
+ "set-field-multiple-choice",
29
+ ]
30
+ self.available_rule_types = CaseTemplateRuleType.objects.filter(name__in=rule_type_names)
31
+
32
+ def _validate_rule_type(self, rule_type: CaseTemplateRuleType):
33
+ """
34
+ Validates if the rule type is supported.
35
+
36
+ Args:
37
+ rule_type (CaseTemplateRuleType): The rule type to validate.
38
+
39
+ Raises:
40
+ ValueError: If the rule type is not supported.
41
+ """
42
+ if rule_type not in self.available_rule_types:
43
+ raise ValueError(f"Rule type {rule_type} is not supported.")
44
+
45
+ def _apply_create_object(self, rule: CaseTemplateRule, parent=None):
46
+ """
47
+ Applies a create-object rule to generate a model instance.
48
+
49
+ Args:
50
+ rule (CaseTemplateRule): The rule to apply.
51
+ parent (Optional[Model]): The parent object for the rule.
52
+
53
+ Returns:
54
+ Model: The created model instance.
55
+ """
56
+ target_model = rule.get_target_model()
57
+ extra_params = rule.extra_parameters or {}
58
+ create_method_info = extra_params.get("create_method", {})
59
+
60
+ assert create_method_info, "Create method must be set for a create-object rule."
61
+
62
+ create_method = getattr(target_model, create_method_info["name"])
63
+ kwargs = create_method_info.get("kwargs", {})
64
+
65
+ if parent:
66
+ kwargs[rule.parent_field] = parent
67
+
68
+ target_instance = create_method(**kwargs)
69
+ target_instance.save()
70
+
71
+ for action in extra_params.get("actions", []):
72
+ action_method = getattr(target_instance, action["name"])
73
+ action_kwargs = action.get("kwargs", {})
74
+ action_method(**action_kwargs)
75
+
76
+ for chained_rule in rule.chained_rules.all():
77
+ self.apply_rule(chained_rule, parent=target_instance)
78
+
79
+ return target_instance
80
+
81
+ def _apply_set_field_by_distribution(self, rule: CaseTemplateRule, parent):
82
+ """
83
+ Applies a set-field-by-distribution rule.
84
+
85
+ Args:
86
+ rule (CaseTemplateRule): The rule to apply.
87
+ parent (Model): The parent object for the rule.
88
+
89
+ Returns:
90
+ Model: The updated parent object.
91
+ """
92
+ assert parent, "Parent must be provided for set-field-by-distribution rules."
93
+ assert rule.target_field, "Target field must be specified for the rule."
94
+
95
+ distribution = rule.get_distribution()
96
+ value = distribution.generate_value()
97
+
98
+ setattr(parent, rule.target_field, value)
99
+ parent.save()
100
+ return parent
101
+
102
+ def apply_rule(self, rule: CaseTemplateRule, parent=None):
103
+ """
104
+ Applies a rule based on its type to generate a case.
105
+
106
+ Args:
107
+ rule (CaseTemplateRule): The rule to apply.
108
+ parent (Optional[Model]): The parent object for the rule.
109
+
110
+ Returns:
111
+ Model: The case by applying the rule.
112
+ """
113
+ self._validate_rule_type(rule.rule_type)
114
+
115
+ if rule.rule_type.name == "create-object":
116
+ return self._apply_create_object(rule, parent)
117
+
118
+ if rule.rule_type.name == "set-field-by-distribution":
119
+ return self._apply_set_field_by_distribution(rule, parent)
120
+
121
+ raise ValueError(f"Unsupported rule type: {rule.rule_type.name}")
122
+
123
+ def generate_case(self, case_template: CaseTemplate = None):
124
+ """
125
+ Generates a case based on the provided or default template.
126
+
127
+ Args:
128
+ case_template (CaseTemplate, optional): The template to use for case generation. Defaults to None.
129
+
130
+ Returns:
131
+ Tuple[Model, Model]: The generated patient and medication schedule.
132
+ """
133
+ case_template = case_template or CaseTemplate.objects.get(name=DEFAULT_CASE_TEMPLATE_NAME)
134
+
135
+ create_patient_rule = case_template.get_create_patient_rule()
136
+ patient = self.apply_rule(create_patient_rule)
137
+
138
+ medication_schedule_rule = case_template.get_create_patient_medication_schedule_rule()
139
+ medication_schedule = self.apply_rule(medication_schedule_rule, parent=patient)
140
+
141
+ return patient, medication_schedule
142
+
143
+ # if not create_new_patient:
144
+ # raise NotImplementedError("Only new patients are supported at the moment.")
145
+ # else:
146
+ # # TODO Implement patient rules
147
+ # patient_rules = None # all rules of type "create_patient"
148
+ # patient = self.generate_patient(patient_rules)
149
+
150
+ # # Generate case based on template
151
+ # rules = self.template.get_rules()
152
+ # chained_rules = set()
153
+
154
+ # for rule in rules:
155
+ # rule_chain = rule.get_all_downward_chained_rules()
156
+ # chained_rules.add(rule)
157
+ # chained_rules.update(rule_chain)
158
+
159
+ # return chained_rules
@@ -0,0 +1,33 @@
1
+ from datetime import datetime, timezone
2
+ from endoreg_db.models import Patient, PatientLabSample, PatientLabSampleType
3
+
4
+ class LabSampleFactory:
5
+ """
6
+ Provides methods to generate lab samples.
7
+ """
8
+
9
+ def __init__(self):
10
+ """
11
+ Initializes the LabSampleFactory.
12
+ """
13
+ pass
14
+
15
+ def create_generic_lab_sample(self, patient: Patient):
16
+ """
17
+ Generates a generic lab sample for a given patient.
18
+
19
+ Args:
20
+ patient (Patient): The patient for whom the lab sample is generated.
21
+
22
+ Returns:
23
+ PatientLabSample: The created lab sample instance.
24
+ """
25
+ sample_type = PatientLabSampleType.objects.get(name="generic")
26
+
27
+ lab_sample = PatientLabSample.objects.create(
28
+ patient=patient,
29
+ sample_type=sample_type,
30
+ date=datetime.now(tz=timezone.utc)
31
+ )
32
+
33
+ return lab_sample
@@ -0,0 +1,30 @@
1
+ from endoreg_db.models import CaseTemplate
2
+ from endoreg_db.case_generator.case_generator import CaseGenerator
3
+
4
+ # TEMPLATE_NAME = "pre_endo-anticoagulation-af-low_risk"
5
+ TEMPLATE_NAME = "pre_default_screening_colonoscopy"
6
+
7
+ def fetch_template(template_name: str = DEFAULT_TEMPLATE_NAME) -> CaseTemplate:
8
+ """
9
+ Fetches a CaseTemplate by name.
10
+
11
+ Args:
12
+ template_name (str): The name of the template to fetch. Defaults to DEFAULT_TEMPLATE_NAME.
13
+
14
+ Returns:
15
+ CaseTemplate: The fetched CaseTemplate instance.
16
+ """
17
+ return CaseTemplate.objects.get(name=template_name)
18
+
19
+ def initialize_case_generator(template_name: str = DEFAULT_TEMPLATE_NAME) -> CaseGenerator:
20
+ """
21
+ Initializes a CaseGenerator with the specified template.
22
+
23
+ Args:
24
+ template_name (str): The name of the template to use. Defaults to DEFAULT_TEMPLATE_NAME.
25
+
26
+ Returns:
27
+ CaseGenerator: An instance of CaseGenerator initialized with the template.
28
+ """
29
+ template = fetch_template(template_name)
30
+ return CaseGenerator(template)
@@ -6,16 +6,48 @@ INFORMATION_DATA_DIR = DATA_DIR / "information_source"
6
6
  UNIT_DATA_DIR = DATA_DIR / "unit"
7
7
  CENTER_DATA_DIR = DATA_DIR / "center"
8
8
  EXAMINATION_DATA_DIR = DATA_DIR / "examination"
9
- LABEL_DATA_DIR = DATA_DIR / "label"
10
- MODEL_TYPE_DATA_DIR = DATA_DIR / "model_type"
9
+ MODEL_TYPE_DATA_DIR = DATA_DIR / "ai_model_type"
11
10
  ENDOSCOPY_PROCESSOR_DATA_DIR = DATA_DIR / "endoscopy_processor"
12
11
  ENDOSCOPE_TYPE_DATA_DIR = DATA_DIR / "endoscope_type"
12
+ ENDOSCOPE_DATA_DIR = DATA_DIR / "endoscope"
13
13
  ACTIVE_MODEL_DATA_DIR = DATA_DIR / "active_model"
14
14
  PROFESSION_DATA_DIR = DATA_DIR / "profession"
15
15
  PDF_TYPE_DATA_DIR = DATA_DIR / "pdf_type"
16
16
  REPORT_READER_FLAG_DATA_DIR = DATA_DIR / "report_reader_flag"
17
17
  EVENT_DATA_DIR = DATA_DIR / "event"
18
18
  GENDER_DATA_DIR = DATA_DIR / "gender"
19
+ ORGAN_DATA_DIR = DATA_DIR / "organ"
20
+
21
+ # Contraindication
22
+ CONTRAINDICATION_DATA_DIR = DATA_DIR / "contraindication"
23
+
24
+ # Examination
25
+ EXAMINATION_INDICATION_DATA_DIR = DATA_DIR / "examination_indication"
26
+ EXAMINATION_INDICATION_CLASSIFICATION_DATA_DIR = (
27
+ DATA_DIR / "examination_indication_classification"
28
+ )
29
+ EXAMINATION_INDICATION_CLASSIFICATION_CHOICE_DATA_DIR = (
30
+ DATA_DIR / "examination_indication_classification_choice"
31
+ )
32
+
33
+ # Finding
34
+ FINDING_TYPE_DATA_DIR = DATA_DIR / "finding_type"
35
+ FINDING_DATA_DIR = DATA_DIR / "finding"
36
+ FINDING_LOCATION_CLASSIFICATION_DATA_DIR = DATA_DIR / "finding_location_classification"
37
+ FINDING_LOCATION_CLASSIFICATION_CHOICE_DATA_DIR = (
38
+ DATA_DIR / "finding_location_classification_choice"
39
+ )
40
+ FINDING_MORPHOLOGY_CLASSIFICATION_DATA_DIR = (
41
+ DATA_DIR / "finding_morphology_classification"
42
+ )
43
+ FINDING_MORPHOLOGY_CLASSIFICATION_CHOICE_DATA_DIR = (
44
+ DATA_DIR / "finding_morphology_classification_choice"
45
+ )
46
+ FINDING_MORPGOLOGY_CLASSIFICATION_TYPE_DATA_DIR = (
47
+ DATA_DIR / "finding_morphology_classification_type"
48
+ )
49
+ FINDING_INTERVETION_DATA_DIR = DATA_DIR / "finding_intervention"
50
+ FINIDNG_INTERVENTION_TYPE_DATA_DIR = DATA_DIR / "finding_intervention_type"
19
51
 
20
52
  # Green Endoscopy Dashboard Stuffs
21
53
  CENTER_RESOURCE_DATA_DIR = DATA_DIR / "center_resource"
@@ -40,7 +72,9 @@ MEDICATION_INDICATION_TYPE_DATA_DIR = DATA_DIR / "medication_indication_type"
40
72
  DISTRIBUTION_BASE_DIR = DATA_DIR / "distribution"
41
73
  DISTRIBUTION_SINGLE_CATEGORICAL_DATA_DIR = DISTRIBUTION_BASE_DIR / "single_categorical"
42
74
  DISTRIBUTION_NUMERIC_DATA_DIR = DISTRIBUTION_BASE_DIR / "numeric"
43
- DISTRIBUTION_MULTIPLE_CATEGORICAL_DATA_DIR = DISTRIBUTION_BASE_DIR / "multiple_categorical"
75
+ DISTRIBUTION_MULTIPLE_CATEGORICAL_DATA_DIR = (
76
+ DISTRIBUTION_BASE_DIR / "multiple_categorical"
77
+ )
44
78
  DISTRIBUTION_DATE_DATA_DIR = DISTRIBUTION_BASE_DIR / "date"
45
79
 
46
80
  # G-Play Stuffs
@@ -60,6 +94,14 @@ AGL_SERVICE_DATA_DIR = DATA_DIR / "agl_service"
60
94
  # LOGS
61
95
  LOG_TYPE_DATA_DIR = DATA_DIR / "log_type"
62
96
 
97
+ # AI STUFFS
98
+ AI_MODEL_DATA_DIR = DATA_DIR / "ai_model"
99
+ AI_MODEL_TYPE_DATA_DIR = DATA_DIR / "ai_model_type"
100
+ AI_MODEL_META_DATA_DIR = DATA_DIR / "ai_model_meta"
101
+ LABEL_DATA_DIR = DATA_DIR / "ai_model_label"
102
+ VIDEO_SEGMENTATION_LABEL_DATA_DIR = DATA_DIR / "ai_model_video_segmentation_label"
103
+ VIDEO_SEGMENTATION_LABELSET_DATA_DIR = DATA_DIR / "ai_model_video_segmentation_labelset"
104
+
63
105
  # To Do
64
106
  LAB_VALUE_DATA_DIR = DATA_DIR / "lab_value"
65
107
  PATIENT_LAB_SAMPLE_TYPE_DATA_DIR = DATA_DIR / "patient_lab_sample_type"
@@ -69,4 +111,8 @@ MEDICATION_INTAKE_TIME_DATA_DIR = DATA_DIR / "medication_intake_time"
69
111
 
70
112
  RULE_TYPE_DATA_DIR = DATA_DIR / "rule_type"
71
113
  RULE_ATTRIBUTE_DTYPE_DATA_DIR = DATA_DIR / "rule_attribute_dtype"
72
- RULESET_DATA_DIR = DATA_DIR / "ruleset"
114
+ RULESET_DATA_DIR = DATA_DIR / "ruleset"
115
+
116
+ LX_PERMISSION_DATA_DIR = DATA_DIR / "lx_permission"
117
+ LX_CLIENT_TAG_DATA_DIR = DATA_DIR / "lx_client_tag"
118
+ LX_CLIENT_TYPE_DATA_DIR = DATA_DIR / "lx_client_type"
@@ -0,0 +1,7 @@
1
+ - model: endoreg_db.ai_model
2
+ fields:
3
+ name: "image_multilabel_classification_colonoscopy_default"
4
+ description: "Image multilabel classification model"
5
+ model_type: "image"
6
+ model_subtype: "multilabel"
7
+ video_segmentation_labelset: "colonoscopy_video_segmentation_raw"
@@ -7,7 +7,7 @@
7
7
 
8
8
  - model: endoreg_db.Label
9
9
  fields:
10
- name: "ileocecal_valve"
10
+ name: "ileocaecalvalve"
11
11
  label_type: "classification"
12
12
 
13
13
  - model: endoreg_db.Label
@@ -60,3 +60,29 @@
60
60
  name: "outside"
61
61
  label_type: "classification"
62
62
 
63
+ - model: endoreg_db.Label
64
+ fields:
65
+ name: "diverticule"
66
+ label_type: "classification"
67
+
68
+ - model: endoreg_db.Label
69
+ fields:
70
+ name: "grasper"
71
+ label_type: "classification"
72
+
73
+ - model: endoreg_db.Label
74
+ fields:
75
+ name: "nbi"
76
+ label_type: "classification"
77
+
78
+ # needle
79
+ - model: endoreg_db.Label
80
+ fields:
81
+ name: "needle"
82
+ label_type: "classification"
83
+
84
+ # snare
85
+ - model: endoreg_db.Label
86
+ fields:
87
+ name: "snare"
88
+ label_type: "classification"
@@ -0,0 +1,21 @@
1
+ - model: endoreg_db.LabelSet
2
+ fields:
3
+ name: "multilabel_classification_colonoscopy_default"
4
+ version: 1
5
+ labels:
6
+ [
7
+ "appendix",
8
+ "blood",
9
+ "diverticule",
10
+ "grasper",
11
+ "ileocaecalvalve",
12
+ "ileum",
13
+ "low_quality",
14
+ "nbi",
15
+ "needle",
16
+ "outside",
17
+ "polyp",
18
+ "snare",
19
+ "water_jet",
20
+ "wound",
21
+ ]
@@ -0,0 +1,5 @@
1
+ - model: endoreg_db.model_meta
2
+ fields:
3
+ name: "image_multilabel_classification_colonoscopy_default"
4
+ version: 1
5
+ labelset: "multilabel_classification_colonoscopy_default"
@@ -0,0 +1,176 @@
1
+ - model: endoreg_db.video_segmentation_label
2
+ fields:
3
+ name: "upper_gi"
4
+ name_de: "Oberer GI-Trakt"
5
+ name_en: "Upper GI"
6
+ description: "Upper GI"
7
+ color: "#FF0000"
8
+
9
+ - model: endoreg_db.video_segmentation_label
10
+ fields:
11
+ name: "lower_gi"
12
+ name_de: "Unterer GI-Trakt"
13
+ name_en: "Lower GI"
14
+ description: "Lower GI"
15
+ color: "#00FF00"
16
+
17
+ - model: endoreg_db.video_segmentation_label
18
+ fields:
19
+ name: "esophagus"
20
+ name_de: "Ösophagus"
21
+ name_en: "Esophagus"
22
+ description: "Esophagus"
23
+ color: "#0000FF"
24
+
25
+ - model: endoreg_db.video_segmentation_label
26
+ fields:
27
+ name: "stomach"
28
+ name_de: "Magen"
29
+ name_en: "Stomach"
30
+ description: "Stomach"
31
+ color: "#FFFF00"
32
+
33
+ - model: endoreg_db.video_segmentation_label
34
+ fields:
35
+ name: "duodenum"
36
+ name_de: "Duodenum"
37
+ name_en: "Duodenum"
38
+ description: "Duodenum"
39
+ color: "#FF00FF"
40
+
41
+ - model: endoreg_db.video_segmentation_label
42
+ fields:
43
+ name: "colon"
44
+ name_de: "Kolon"
45
+ name_en: "Colon"
46
+ description: "Colon"
47
+ color: "#00FFFF"
48
+
49
+ - model: endoreg_db.video_segmentation_label
50
+ fields:
51
+ name: "ileum"
52
+ name_de: "Ileum"
53
+ name_en: "Ileum"
54
+ description: "Ileum"
55
+ color: "#800000"
56
+
57
+ - model: endoreg_db.video_segmentation_label
58
+ fields:
59
+ name: "outside"
60
+ name_de: "Außerhalb des Körpers"
61
+ name_en: "Out of Body"
62
+ description: "Out of Body"
63
+ color: "#008000"
64
+
65
+ - model: endoreg_db.video_segmentation_label
66
+ fields:
67
+ name: "bli"
68
+ name_de: "Blau-Licht-Imaging"
69
+ name_en: "Blue Light Imaging"
70
+ description: "Blue Light Imaging (high level for nbi and similar modes)"
71
+ color: "#000080"
72
+
73
+ - model: endoreg_db.video_segmentation_label
74
+ fields:
75
+ name: "low_quality"
76
+ name_de: "Niedrige Qualität"
77
+ name_en: "Low Quality"
78
+ description: "Low Quality"
79
+ color: "#800080"
80
+
81
+ - model: endoreg_db.video_segmentation_label
82
+ fields:
83
+ name: "instrument"
84
+ name_de: "Instrument"
85
+ name_en: "Instrument"
86
+ description: "Instrument"
87
+ color: "#808000"
88
+
89
+ # Appendix
90
+ - model: endoreg_db.video_segmentation_label
91
+ fields:
92
+ name: "appendix"
93
+ name_de: "Appendix"
94
+ name_en: "Appendix"
95
+ description: "Appendix"
96
+ color: "#FF0000"
97
+ # blood, diverticule, grasper, ileocaecalvalve, ileum, low_quality, nbi, needle, polyp, snare, water_jet, wound
98
+ - model: endoreg_db.video_segmentation_label
99
+ fields:
100
+ name: "blood"
101
+ name_de: "Blut"
102
+ name_en: "Blood"
103
+ description: "Blood"
104
+ color: "#00FF00"
105
+
106
+ - model: endoreg_db.video_segmentation_label
107
+ fields:
108
+ name: "diverticule"
109
+ name_de: "Divertikel"
110
+ name_en: "Diverticule"
111
+ description: "Diverticule"
112
+ color: "#0000FF"
113
+
114
+ - model: endoreg_db.video_segmentation_label
115
+ fields:
116
+ name: "grasper"
117
+ name_de: "Grasper"
118
+ name_en: "Grasper"
119
+ description: "Grasper"
120
+ color: "#FFFF00"
121
+
122
+ - model: endoreg_db.video_segmentation_label
123
+ fields:
124
+ name: "ileocaecalvalve"
125
+ name_de: "Ileocaecalvalve"
126
+ name_en: "Ileocaecalvalve"
127
+ description: "Ileocaecalvalve"
128
+ color: "#FF00FF"
129
+
130
+ - model: endoreg_db.video_segmentation_label
131
+ fields:
132
+ name: "nbi"
133
+ name_de: "Narrow Band Imaging"
134
+ name_en: "Narrow Band Imaging"
135
+ description: "Narrow Band Imaging"
136
+ color: "#00FFFF"
137
+
138
+ - model: endoreg_db.video_segmentation_label
139
+ fields:
140
+ name: "needle"
141
+ name_de: "Needle"
142
+ name_en: "Needle"
143
+ description: "Needle"
144
+ color: "#800000"
145
+
146
+ - model: endoreg_db.video_segmentation_label
147
+ fields:
148
+ name: "polyp"
149
+ name_de: "Polyp"
150
+ name_en: "Polyp"
151
+ description: "Polyp"
152
+ color: "#008000"
153
+
154
+ - model: endoreg_db.video_segmentation_label
155
+ fields:
156
+ name: "snare"
157
+ name_de: "Snare"
158
+ name_en: "Snare"
159
+ description: "Snare"
160
+ color: "#000080"
161
+
162
+ - model: endoreg_db.video_segmentation_label
163
+ fields:
164
+ name: "water_jet"
165
+ name_de: "Water Jet"
166
+ name_en: "Water Jet"
167
+ description: "Water Jet"
168
+ color: "#800080"
169
+
170
+ - model: endoreg_db.video_segmentation_label
171
+ fields:
172
+ name: "wound"
173
+ name_de: "Wound"
174
+ name_en: "Wound"
175
+ description: "Wound"
176
+ color: "#808000"
@@ -0,0 +1,20 @@
1
+ - model: endoreg_db.video_segmentation_label_set
2
+ fields:
3
+ name: "colonoscopy_video_segmentation_raw"
4
+ labels:
5
+ [
6
+ "appendix",
7
+ "blood",
8
+ "diverticule",
9
+ "grasper",
10
+ "ileocaecalvalve",
11
+ "ileum",
12
+ "low_quality",
13
+ "nbi",
14
+ "needle",
15
+ "outside",
16
+ "polyp",
17
+ "snare",
18
+ "water_jet",
19
+ "wound",
20
+ ]