endoreg-db 0.8.8.0__py3-none-any.whl → 0.8.9.2__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 (402) hide show
  1. endoreg_db/data/__init__.py +22 -8
  2. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +0 -1
  3. endoreg_db/data/examination/examinations/data.yaml +114 -14
  4. endoreg_db/data/examination/time-type/data.yaml +0 -3
  5. endoreg_db/data/examination_indication/endoscopy.yaml +108 -173
  6. endoreg_db/data/examination_indication_classification/endoscopy.yaml +0 -70
  7. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +33 -37
  8. endoreg_db/data/finding/00_generic.yaml +35 -0
  9. endoreg_db/data/finding/00_generic_complication.yaml +9 -0
  10. endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
  11. endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
  12. endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
  13. endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
  14. endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
  15. endoreg_db/data/finding_classification/00_generic.yaml +44 -0
  16. endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
  17. endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
  18. endoreg_db/data/finding_classification/{colonoscopy_bowel_preparation.yaml → 02_colonoscopy_baseline.yaml} +35 -20
  19. endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
  20. endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
  21. endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
  22. endoreg_db/data/finding_classification_choice/{yes_no_na.yaml → 00_generic.yaml} +5 -1
  23. endoreg_db/data/finding_classification_choice/{examination_setting_generic_types.yaml → 00_generic_baseline.yaml} +10 -2
  24. endoreg_db/data/finding_classification_choice/{complication_generic_types.yaml → 00_generic_complication.yaml} +1 -1
  25. endoreg_db/data/finding_classification_choice/{histology.yaml → 00_generic_histology.yaml} +1 -4
  26. endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
  27. endoreg_db/data/finding_classification_choice/{bowel_preparation.yaml → 02_colonoscopy_bowel_preparation.yaml} +1 -30
  28. endoreg_db/data/{_examples/finding_classification_choice/colonoscopy_not_complete_reason.yaml → finding_classification_choice/02_colonoscopy_generic.yaml} +1 -1
  29. endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
  30. endoreg_db/data/{_examples/finding_classification_choice/colonoscopy_location.yaml → finding_classification_choice/02_colonoscopy_location.yaml} +23 -4
  31. endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
  32. endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
  33. endoreg_db/data/{_examples/finding_classification_choice/colon_lesion_paris.yaml → finding_classification_choice/02_colonoscopy_polyp_morphology.yaml} +26 -8
  34. endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
  35. endoreg_db/data/finding_classification_type/{colonoscopy_basic.yaml → 00_generic.yaml} +18 -13
  36. endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
  37. endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
  38. endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
  39. endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
  40. endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
  41. endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
  42. endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
  43. endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
  44. endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
  45. endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
  46. endoreg_db/data/finding_type/data.yaml +8 -12
  47. endoreg_db/data/requirement/01_patient_data.yaml +93 -0
  48. endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
  49. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +0 -2
  50. endoreg_db/data/requirement_set/90_coloreg.yaml +20 -8
  51. endoreg_db/exceptions.py +0 -1
  52. endoreg_db/forms/examination_form.py +1 -1
  53. endoreg_db/helpers/data_loader.py +124 -52
  54. endoreg_db/helpers/default_objects.py +116 -81
  55. endoreg_db/import_files/__init__.py +27 -0
  56. endoreg_db/import_files/context/__init__.py +7 -0
  57. endoreg_db/import_files/context/default_sensitive_meta.py +81 -0
  58. endoreg_db/import_files/context/ensure_center.py +17 -0
  59. endoreg_db/import_files/context/file_lock.py +66 -0
  60. endoreg_db/import_files/context/import_context.py +43 -0
  61. endoreg_db/import_files/context/validate_directories.py +56 -0
  62. endoreg_db/import_files/file_storage/__init__.py +15 -0
  63. endoreg_db/import_files/file_storage/create_report_file.py +76 -0
  64. endoreg_db/import_files/file_storage/create_video_file.py +75 -0
  65. endoreg_db/import_files/file_storage/sensitive_meta_storage.py +39 -0
  66. endoreg_db/import_files/file_storage/state_management.py +496 -0
  67. endoreg_db/import_files/file_storage/storage.py +36 -0
  68. endoreg_db/import_files/import_service.md +26 -0
  69. endoreg_db/import_files/processing/__init__.py +11 -0
  70. endoreg_db/import_files/processing/report_processing/report_anonymization.py +94 -0
  71. endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
  72. endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
  73. endoreg_db/import_files/pseudonymization/fake.py +52 -0
  74. endoreg_db/import_files/pseudonymization/k_anonymity.py +182 -0
  75. endoreg_db/import_files/pseudonymization/k_pseudonymity.py +128 -0
  76. endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
  77. endoreg_db/import_files/report_import_service.py +141 -0
  78. endoreg_db/import_files/video_import_service.py +150 -0
  79. endoreg_db/management/commands/import_report.py +130 -65
  80. endoreg_db/management/commands/import_video_with_classification.py +1 -1
  81. endoreg_db/management/commands/load_ai_model_data.py +5 -5
  82. endoreg_db/management/commands/load_ai_model_label_data.py +9 -7
  83. endoreg_db/management/commands/load_base_db_data.py +5 -134
  84. endoreg_db/management/commands/load_contraindication_data.py +14 -16
  85. endoreg_db/management/commands/load_disease_classification_choices_data.py +15 -18
  86. endoreg_db/management/commands/load_disease_classification_data.py +15 -18
  87. endoreg_db/management/commands/load_disease_data.py +25 -28
  88. endoreg_db/management/commands/load_endoscope_data.py +20 -27
  89. endoreg_db/management/commands/load_event_data.py +14 -16
  90. endoreg_db/management/commands/load_examination_data.py +31 -44
  91. endoreg_db/management/commands/load_examination_indication_data.py +20 -21
  92. endoreg_db/management/commands/load_finding_data.py +52 -80
  93. endoreg_db/management/commands/load_information_source.py +21 -23
  94. endoreg_db/management/commands/load_lab_value_data.py +17 -26
  95. endoreg_db/management/commands/load_medication_data.py +13 -12
  96. endoreg_db/management/commands/load_organ_data.py +15 -19
  97. endoreg_db/management/commands/load_pdf_type_data.py +19 -18
  98. endoreg_db/management/commands/load_profession_data.py +14 -17
  99. endoreg_db/management/commands/load_qualification_data.py +20 -23
  100. endoreg_db/management/commands/load_report_reader_flag_data.py +17 -19
  101. endoreg_db/management/commands/load_requirement_data.py +14 -20
  102. endoreg_db/management/commands/load_risk_data.py +7 -6
  103. endoreg_db/management/commands/load_shift_data.py +20 -23
  104. endoreg_db/management/commands/load_tag_data.py +8 -11
  105. endoreg_db/management/commands/load_unit_data.py +17 -19
  106. endoreg_db/management/commands/start_filewatcher.py +46 -37
  107. endoreg_db/management/commands/validate_video_files.py +1 -5
  108. endoreg_db/migrations/0001_initial.py +1360 -1812
  109. endoreg_db/models/administration/person/patient/patient.py +72 -46
  110. endoreg_db/models/label/__init__.py +2 -2
  111. endoreg_db/models/label/annotation/video_segmentation_annotation.py +18 -26
  112. endoreg_db/models/label/label_video_segment/label_video_segment.py +23 -1
  113. endoreg_db/models/media/pdf/raw_pdf.py +136 -64
  114. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +34 -10
  115. endoreg_db/models/media/processing_history/__init__.py +5 -0
  116. endoreg_db/models/media/processing_history/processing_history.py +96 -0
  117. endoreg_db/models/media/video/create_from_file.py +101 -31
  118. endoreg_db/models/media/video/video_file.py +125 -105
  119. endoreg_db/models/media/video/video_file_io.py +31 -26
  120. endoreg_db/models/medical/contraindication/README.md +1 -0
  121. endoreg_db/models/medical/examination/examination.py +28 -8
  122. endoreg_db/models/medical/examination/examination_indication.py +13 -79
  123. endoreg_db/models/medical/examination/examination_time.py +8 -3
  124. endoreg_db/models/medical/finding/finding.py +5 -12
  125. endoreg_db/models/medical/finding/finding_classification.py +18 -37
  126. endoreg_db/models/medical/finding/finding_intervention.py +7 -9
  127. endoreg_db/models/medical/hardware/endoscope.py +6 -0
  128. endoreg_db/models/medical/patient/medication_examples.py +5 -1
  129. endoreg_db/models/medical/patient/patient_finding.py +1 -1
  130. endoreg_db/models/metadata/pdf_meta.py +22 -10
  131. endoreg_db/models/metadata/sensitive_meta.py +3 -0
  132. endoreg_db/models/metadata/sensitive_meta_logic.py +200 -124
  133. endoreg_db/models/other/information_source.py +27 -6
  134. endoreg_db/models/report/__init__.py +0 -0
  135. endoreg_db/models/report/images.py +0 -0
  136. endoreg_db/models/report/report.py +6 -0
  137. endoreg_db/models/requirement/requirement.py +59 -399
  138. endoreg_db/models/requirement/requirement_operator.py +86 -98
  139. endoreg_db/models/state/audit_ledger.py +4 -5
  140. endoreg_db/models/state/raw_pdf.py +69 -30
  141. endoreg_db/models/state/video.py +65 -49
  142. endoreg_db/models/upload_job.py +33 -9
  143. endoreg_db/models/utils.py +27 -23
  144. endoreg_db/queries/__init__.py +3 -1
  145. endoreg_db/schemas/examination_evaluation.py +1 -1
  146. endoreg_db/serializers/__init__.py +2 -8
  147. endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
  148. endoreg_db/serializers/meta/__init__.py +1 -6
  149. endoreg_db/serializers/misc/sensitive_patient_data.py +50 -26
  150. endoreg_db/serializers/patient_examination/patient_examination.py +3 -3
  151. endoreg_db/serializers/pdf/anony_text_validation.py +39 -23
  152. endoreg_db/serializers/video/video_file_list.py +65 -34
  153. endoreg_db/services/__old/pdf_import.py +1487 -0
  154. endoreg_db/services/__old/video_import.py +1306 -0
  155. endoreg_db/services/anonymization.py +63 -26
  156. endoreg_db/services/lookup_service.py +28 -28
  157. endoreg_db/services/lookup_store.py +2 -2
  158. endoreg_db/services/pdf_import.py +0 -1480
  159. endoreg_db/services/report_import.py +10 -0
  160. endoreg_db/services/video_import.py +6 -1165
  161. endoreg_db/tasks/upload_tasks.py +79 -70
  162. endoreg_db/tasks/video_ingest.py +8 -4
  163. endoreg_db/urls/__init__.py +0 -14
  164. endoreg_db/urls/ai.py +32 -0
  165. endoreg_db/urls/media.py +21 -24
  166. endoreg_db/utils/dataloader.py +87 -57
  167. endoreg_db/utils/paths.py +110 -46
  168. endoreg_db/utils/pipelines/Readme.md +1 -1
  169. endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
  170. endoreg_db/utils/video/ffmpeg_wrapper.py +217 -52
  171. endoreg_db/views/__init__.py +85 -173
  172. endoreg_db/views/ai/__init__.py +8 -0
  173. endoreg_db/views/ai/label.py +155 -0
  174. endoreg_db/views/anonymization/media_management.py +8 -7
  175. endoreg_db/views/anonymization/overview.py +97 -68
  176. endoreg_db/views/anonymization/validate.py +25 -21
  177. endoreg_db/views/media/__init__.py +5 -20
  178. endoreg_db/views/media/pdf_media.py +109 -65
  179. endoreg_db/views/media/sensitive_metadata.py +163 -148
  180. endoreg_db/views/meta/__init__.py +0 -8
  181. endoreg_db/views/misc/__init__.py +1 -7
  182. endoreg_db/views/misc/upload_views.py +94 -93
  183. endoreg_db/views/report/__init__.py +7 -0
  184. endoreg_db/views/{pdf → report}/reimport.py +45 -24
  185. endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +40 -32
  186. endoreg_db/views/requirement/lookup_store.py +22 -90
  187. endoreg_db/views/video/__init__.py +23 -22
  188. endoreg_db/views/video/correction.py +201 -172
  189. endoreg_db/views/video/reimport.py +1 -1
  190. endoreg_db/views/{media/video_segments.py → video/segments_crud.py} +75 -37
  191. endoreg_db/views/video/{video_meta.py → video_meta_stats.py} +2 -2
  192. endoreg_db/views/video/video_stream.py +7 -8
  193. {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/METADATA +2 -2
  194. {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/RECORD +217 -335
  195. {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/WHEEL +1 -1
  196. endoreg_db/data/_examples/disease.yaml +0 -55
  197. endoreg_db/data/_examples/disease_classification.yaml +0 -13
  198. endoreg_db/data/_examples/disease_classification_choice.yaml +0 -62
  199. endoreg_db/data/_examples/event.yaml +0 -64
  200. endoreg_db/data/_examples/examination.yaml +0 -72
  201. endoreg_db/data/_examples/finding/anatomy_colon.yaml +0 -128
  202. endoreg_db/data/_examples/finding/colonoscopy.yaml +0 -40
  203. endoreg_db/data/_examples/finding/colonoscopy_bowel_prep.yaml +0 -56
  204. endoreg_db/data/_examples/finding/complication.yaml +0 -16
  205. endoreg_db/data/_examples/finding/data.yaml +0 -105
  206. endoreg_db/data/_examples/finding/examination_setting.yaml +0 -16
  207. endoreg_db/data/_examples/finding/medication_related.yaml +0 -18
  208. endoreg_db/data/_examples/finding/outcome.yaml +0 -12
  209. endoreg_db/data/_examples/finding_classification/colonoscopy_bowel_preparation.yaml +0 -68
  210. endoreg_db/data/_examples/finding_classification/colonoscopy_jnet.yaml +0 -22
  211. endoreg_db/data/_examples/finding_classification/colonoscopy_kudo.yaml +0 -25
  212. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
  213. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
  214. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_size.yaml +0 -68
  215. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
  216. endoreg_db/data/_examples/finding_classification/colonoscopy_location.yaml +0 -80
  217. endoreg_db/data/_examples/finding_classification/colonoscopy_lst.yaml +0 -21
  218. endoreg_db/data/_examples/finding_classification/colonoscopy_nice.yaml +0 -20
  219. endoreg_db/data/_examples/finding_classification/colonoscopy_paris.yaml +0 -26
  220. endoreg_db/data/_examples/finding_classification/colonoscopy_sano.yaml +0 -22
  221. endoreg_db/data/_examples/finding_classification/colonoscopy_summary.yaml +0 -53
  222. endoreg_db/data/_examples/finding_classification/complication_generic.yaml +0 -25
  223. endoreg_db/data/_examples/finding_classification/examination_setting_generic.yaml +0 -40
  224. endoreg_db/data/_examples/finding_classification/histology_colo.yaml +0 -51
  225. endoreg_db/data/_examples/finding_classification/intervention_required.yaml +0 -26
  226. endoreg_db/data/_examples/finding_classification/medication_related.yaml +0 -23
  227. endoreg_db/data/_examples/finding_classification/visualized.yaml +0 -33
  228. endoreg_db/data/_examples/finding_classification_choice/bowel_preparation.yaml +0 -78
  229. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
  230. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
  231. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
  232. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_lst.yaml +0 -15
  233. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_nice.yaml +0 -17
  234. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
  235. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_sano.yaml +0 -14
  236. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
  237. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_size.yaml +0 -82
  238. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
  239. endoreg_db/data/_examples/finding_classification_choice/complication_generic_types.yaml +0 -15
  240. endoreg_db/data/_examples/finding_classification_choice/examination_setting_generic_types.yaml +0 -15
  241. endoreg_db/data/_examples/finding_classification_choice/histology.yaml +0 -24
  242. endoreg_db/data/_examples/finding_classification_choice/histology_polyp.yaml +0 -20
  243. endoreg_db/data/_examples/finding_classification_choice/outcome.yaml +0 -19
  244. endoreg_db/data/_examples/finding_classification_choice/yes_no_na.yaml +0 -11
  245. endoreg_db/data/_examples/finding_classification_type/colonoscopy_basic.yaml +0 -48
  246. endoreg_db/data/_examples/finding_intervention/endoscopy.yaml +0 -43
  247. endoreg_db/data/_examples/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
  248. endoreg_db/data/_examples/finding_intervention/endoscopy_egd.yaml +0 -128
  249. endoreg_db/data/_examples/finding_intervention/endoscopy_ercp.yaml +0 -32
  250. endoreg_db/data/_examples/finding_intervention/endoscopy_eus_lower.yaml +0 -9
  251. endoreg_db/data/_examples/finding_intervention/endoscopy_eus_upper.yaml +0 -36
  252. endoreg_db/data/_examples/finding_intervention_type/endoscopy.yaml +0 -15
  253. endoreg_db/data/_examples/finding_type/data.yaml +0 -43
  254. endoreg_db/data/_examples/requirement/age.yaml +0 -26
  255. endoreg_db/data/_examples/requirement/gender.yaml +0 -25
  256. endoreg_db/data/_examples/requirement_set/01_endoscopy_generic.yaml +0 -48
  257. endoreg_db/data/_examples/requirement_set/colonoscopy_austria_screening.yaml +0 -57
  258. endoreg_db/data/_examples/requirement_set/endoscopy_bleeding_risk.yaml +0 -52
  259. endoreg_db/data/_examples/yaml_examples.xlsx +0 -0
  260. endoreg_db/data/finding/anatomy_colon.yaml +0 -128
  261. endoreg_db/data/finding/colonoscopy.yaml +0 -40
  262. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +0 -56
  263. endoreg_db/data/finding/complication.yaml +0 -16
  264. endoreg_db/data/finding/data.yaml +0 -105
  265. endoreg_db/data/finding/examination_setting.yaml +0 -16
  266. endoreg_db/data/finding/medication_related.yaml +0 -18
  267. endoreg_db/data/finding/outcome.yaml +0 -12
  268. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +0 -22
  269. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +0 -25
  270. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
  271. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
  272. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +0 -38
  273. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
  274. endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -49
  275. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +0 -21
  276. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +0 -20
  277. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +0 -26
  278. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +0 -22
  279. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +0 -53
  280. endoreg_db/data/finding_classification/complication_generic.yaml +0 -25
  281. endoreg_db/data/finding_classification/examination_setting_generic.yaml +0 -40
  282. endoreg_db/data/finding_classification/histology_colo.yaml +0 -43
  283. endoreg_db/data/finding_classification/intervention_required.yaml +0 -26
  284. endoreg_db/data/finding_classification/medication_related.yaml +0 -23
  285. endoreg_db/data/finding_classification/visualized.yaml +0 -33
  286. endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
  287. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
  288. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
  289. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +0 -15
  290. endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +0 -17
  291. endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +0 -57
  292. endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
  293. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +0 -14
  294. endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
  295. endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +0 -229
  296. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +0 -19
  297. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +0 -82
  298. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
  299. endoreg_db/data/finding_classification_choice/outcome.yaml +0 -19
  300. endoreg_db/data/finding_intervention/endoscopy.yaml +0 -43
  301. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
  302. endoreg_db/data/finding_intervention/endoscopy_egd.yaml +0 -128
  303. endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +0 -32
  304. endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +0 -9
  305. endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +0 -36
  306. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +0 -79
  307. endoreg_db/data/requirement/age.yaml +0 -26
  308. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +0 -45
  309. endoreg_db/data/requirement/disease_cardiovascular.yaml +0 -79
  310. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +0 -41
  311. endoreg_db/data/requirement/disease_hepatology.yaml +0 -12
  312. endoreg_db/data/requirement/disease_misc.yaml +0 -12
  313. endoreg_db/data/requirement/disease_renal.yaml +0 -96
  314. endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +0 -59
  315. endoreg_db/data/requirement/event_cardiology.yaml +0 -251
  316. endoreg_db/data/requirement/event_requirements.yaml +0 -145
  317. endoreg_db/data/requirement/finding_colon_polyp.yaml +0 -50
  318. endoreg_db/data/requirement/gender.yaml +0 -25
  319. endoreg_db/data/requirement/lab_value.yaml +0 -441
  320. endoreg_db/data/requirement/medication.yaml +0 -93
  321. endoreg_db/data/requirement_operator/age.yaml +0 -13
  322. endoreg_db/data/requirement_operator/lab_operators.yaml +0 -129
  323. endoreg_db/data/requirement_operator/model_operators.yaml +0 -96
  324. endoreg_db/management/commands/init_default_ai_model.py +0 -112
  325. endoreg_db/management/commands/reset_celery_schedule.py +0 -9
  326. endoreg_db/management/commands/validate_video.py +0 -204
  327. endoreg_db/migrations/0002_requirementset_depends_on.py +0 -18
  328. endoreg_db/migrations/_old/0001_initial.py +0 -1857
  329. endoreg_db/migrations/_old/0002_add_video_correction_models.py +0 -52
  330. endoreg_db/migrations/_old/0003_add_center_display_name.py +0 -30
  331. endoreg_db/migrations/_old/0004_employee_city_employee_post_code_employee_street_and_more.py +0 -68
  332. endoreg_db/migrations/_old/0004_remove_casetemplate_rules_and_more.py +0 -77
  333. endoreg_db/migrations/_old/0005_merge_20251111_1003.py +0 -14
  334. endoreg_db/migrations/_old/0006_sensitivemeta_anonymized_text_and_more.py +0 -68
  335. endoreg_db/migrations/_old/0007_remove_rule_attribute_dtype_remove_rule_rule_type_and_more.py +0 -89
  336. endoreg_db/migrations/_old/0008_remove_event_event_classification_and_more.py +0 -27
  337. endoreg_db/migrations/_old/0009_alter_modelmeta_options_and_more.py +0 -21
  338. endoreg_db/renames.yml +0 -8
  339. endoreg_db/serializers/_old/raw_pdf_meta_validation.py +0 -223
  340. endoreg_db/serializers/_old/raw_video_meta_validation.py +0 -179
  341. endoreg_db/serializers/_old/video.py +0 -71
  342. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +0 -115
  343. endoreg_db/serializers/meta/report_meta.py +0 -53
  344. endoreg_db/serializers/report/__init__.py +0 -9
  345. endoreg_db/serializers/report/mixins.py +0 -45
  346. endoreg_db/serializers/report/report.py +0 -105
  347. endoreg_db/serializers/report/report_list.py +0 -22
  348. endoreg_db/serializers/report/secure_file_url.py +0 -26
  349. endoreg_db/services/requirements_object.py +0 -147
  350. endoreg_db/services/storage_aware_video_processor.py +0 -370
  351. endoreg_db/urls/files.py +0 -6
  352. endoreg_db/urls/label_video_segment_validate.py +0 -33
  353. endoreg_db/urls/label_video_segments.py +0 -46
  354. endoreg_db/views/label/__init__.py +0 -5
  355. endoreg_db/views/label/label.py +0 -15
  356. endoreg_db/views/label_video_segment/__init__.py +0 -16
  357. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +0 -44
  358. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +0 -50
  359. endoreg_db/views/label_video_segment/label_video_segment.py +0 -77
  360. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +0 -174
  361. endoreg_db/views/label_video_segment/label_video_segment_detail.py +0 -73
  362. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +0 -46
  363. endoreg_db/views/label_video_segment/validate.py +0 -226
  364. endoreg_db/views/media/segments.py +0 -71
  365. endoreg_db/views/meta/available_files_list.py +0 -146
  366. endoreg_db/views/meta/report_meta.py +0 -53
  367. endoreg_db/views/meta/sensitive_meta_detail.py +0 -85
  368. endoreg_db/views/misc/secure_file_serving_view.py +0 -80
  369. endoreg_db/views/misc/secure_file_url_view.py +0 -84
  370. endoreg_db/views/misc/secure_url_validate.py +0 -79
  371. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +0 -164
  372. endoreg_db/views/patient_finding_location/__init__.py +0 -5
  373. endoreg_db/views/patient_finding_location/pfl_create.py +0 -70
  374. endoreg_db/views/patient_finding_morphology/__init__.py +0 -5
  375. endoreg_db/views/patient_finding_morphology/pfm_create.py +0 -70
  376. endoreg_db/views/pdf/__init__.py +0 -8
  377. endoreg_db/views/video/segmentation.py +0 -274
  378. endoreg_db/views/video/task_status.py +0 -49
  379. endoreg_db/views/video/timeline.py +0 -46
  380. endoreg_db/views/video/video_analyze.py +0 -52
  381. /endoreg_db/data/requirement/{colon_polyp_intervention.yaml → old/colon_polyp_intervention.yaml} +0 -0
  382. /endoreg_db/data/{_examples/requirement → requirement/old}/colonoscopy_baseline_austria.yaml +0 -0
  383. /endoreg_db/data/requirement/{coloreg_colon_polyp.yaml → old/coloreg_colon_polyp.yaml} +0 -0
  384. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_cardiovascular.yaml +0 -0
  385. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_classification_choice_cardiovascular.yaml +0 -0
  386. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_hepatology.yaml +0 -0
  387. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_misc.yaml +0 -0
  388. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_renal.yaml +0 -0
  389. /endoreg_db/data/{_examples/requirement → requirement/old}/endoscopy_bleeding_risk.yaml +0 -0
  390. /endoreg_db/data/{_examples/requirement → requirement/old}/event_cardiology.yaml +0 -0
  391. /endoreg_db/data/{_examples/requirement → requirement/old}/event_requirements.yaml +0 -0
  392. /endoreg_db/data/{_examples/requirement → requirement/old}/finding_colon_polyp.yaml +0 -0
  393. /endoreg_db/{urls/sensitive_meta.py → data/requirement/old/gender.yaml} +0 -0
  394. /endoreg_db/data/{_examples/requirement → requirement/old}/lab_value.yaml +0 -0
  395. /endoreg_db/data/{_examples/requirement → requirement/old}/medication.yaml +0 -0
  396. /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/age.yaml +0 -0
  397. /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/lab_operators.yaml +0 -0
  398. /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/model_operators.yaml +0 -0
  399. /endoreg_db/{views/pdf/pdf_stream_views.py → import_files/pseudonymization/__init__.py} +0 -0
  400. /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
  401. /endoreg_db/utils/requirement_operator_logic/{model_evaluators.py → _old/model_evaluators.py} +0 -0
  402. {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/licenses/LICENSE +0 -0
@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, List, Optional, cast
3
3
  from django.db import models
4
4
 
5
5
  if TYPE_CHECKING:
6
- from endoreg_db.models import Examination, FindingIntervention, Requirement
6
+ from endoreg_db.models import Examination, FindingIntervention, InformationSource, Requirement
7
7
  from endoreg_db.utils.links.requirement_link import RequirementLinks
8
8
 
9
9
 
@@ -45,15 +45,15 @@ class ExaminationIndication(models.Model):
45
45
  blank=True,
46
46
  )
47
47
 
48
- examinations = models.ManyToManyField(
49
- "Examination",
48
+ expected_interventions = models.ManyToManyField(
49
+ "FindingIntervention",
50
50
  related_name="indications",
51
51
  blank=True,
52
52
  )
53
53
 
54
- expected_interventions = models.ManyToManyField(
55
- "FindingIntervention",
56
- related_name="indications",
54
+ information_sources = models.ManyToManyField(
55
+ "InformationSource",
56
+ related_name="examination_indications",
57
57
  blank=True,
58
58
  )
59
59
 
@@ -61,12 +61,15 @@ class ExaminationIndication(models.Model):
61
61
 
62
62
  if TYPE_CHECKING:
63
63
  classifications = cast(models.manager.RelatedManager["ExaminationIndicationClassification"], classifications)
64
- examinations = cast(models.manager.RelatedManager["Examination"], examinations)
65
64
  expected_interventions = cast(models.manager.RelatedManager["FindingIntervention"], expected_interventions)
65
+ information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
66
66
 
67
67
  @property
68
68
  def related_requirements(self) -> "models.manager.RelatedManager[Requirement]": ...
69
69
 
70
+ @property
71
+ def examinations(self) -> "models.manager.RelatedManager[Examination]": ...
72
+
70
73
  @property
71
74
  def links(self) -> "RequirementLinks":
72
75
  """
@@ -98,39 +101,6 @@ class ExaminationIndication(models.Model):
98
101
  """
99
102
  return str(self.name)
100
103
 
101
- def get_choices(self) -> List["ExaminationIndicationClassificationChoice"]:
102
- """
103
- Retrieves all classification choices for the indication.
104
-
105
- Aggregates and returns the choices from each classification associated with the indication.
106
-
107
- Returns:
108
- List[ExaminationIndicationClassificationChoice]: A list of classification choices.
109
- """
110
- classifications = self.classifications.all()
111
- choices = []
112
- for classification in classifications:
113
- choices.extend(classification.choices.all())
114
- return choices
115
-
116
- def get_examination(self) -> Optional["Examination"]:
117
- """
118
- Returns the first examination associated with this indication, or None if no examinations exist.
119
-
120
- Note: Since this is now a many-to-many relationship, this method returns the first examination.
121
- Consider using get_examinations() for accessing all related examinations.
122
- """
123
- return self.examinations.first()
124
-
125
- def get_examinations(self) -> List["Examination"]:
126
- """
127
- Returns all examinations associated with this indication.
128
-
129
- Returns:
130
- List[Examination]: A list of all examinations linked to this indication.
131
- """
132
- return list(self.examinations.all())
133
-
134
104
 
135
105
  class ExaminationIndicationClassificationManager(models.Manager):
136
106
  """
@@ -162,18 +132,14 @@ class ExaminationIndicationClassification(models.Model):
162
132
 
163
133
  name = models.CharField(max_length=255, unique=True)
164
134
  description = models.TextField(blank=True, null=True)
165
- examinations = models.ManyToManyField(
166
- "Examination",
167
- related_name="indication_classifications",
135
+ choices = models.ManyToManyField(
136
+ "ExaminationIndicationClassificationChoice",
137
+ related_name="classifications",
168
138
  blank=True,
169
139
  )
170
140
 
171
141
  objects = ExaminationIndicationClassificationManager()
172
142
 
173
- if TYPE_CHECKING:
174
- examinations: "models.ManyToManyField[Examination, Examination]"
175
- choices: "models.QuerySet[ExaminationIndicationClassificationChoice]"
176
-
177
143
  def natural_key(self) -> tuple:
178
144
  """
179
145
  Returns the natural key for the classification.
@@ -192,33 +158,6 @@ class ExaminationIndicationClassification(models.Model):
192
158
  """
193
159
  return str(self.name)
194
160
 
195
- def get_choices(self) -> List["ExaminationIndicationClassificationChoice"]:
196
- """
197
- Retrieves all classification choices associated with this classification.
198
-
199
- Returns:
200
- List[ExaminationIndicationClassificationChoice]: A list of classification choice instances.
201
- """
202
- return list(self.choices.all())
203
-
204
- def get_examination(self) -> Optional["Examination"]:
205
- """
206
- Returns the first examination associated with this classification, or None if no examinations exist.
207
-
208
- Note: Since this is now a many-to-many relationship, this method returns the first examination.
209
- Consider using get_examinations() for accessing all related examinations.
210
- """
211
- return self.examinations.first()
212
-
213
- def get_examinations(self) -> List["Examination"]:
214
- """
215
- Returns all examinations associated with this classification.
216
-
217
- Returns:
218
- List[Examination]: A list of all examinations linked to this classification.
219
- """
220
- return list(self.examinations.all())
221
-
222
161
 
223
162
  class ExaminationIndicationClassificationChoiceManager(models.Manager):
224
163
  """
@@ -252,11 +191,6 @@ class ExaminationIndicationClassificationChoice(models.Model):
252
191
  name = models.CharField(max_length=255, unique=True)
253
192
  subcategories = models.JSONField(default=dict)
254
193
  numerical_descriptors = models.JSONField(default=dict)
255
- classification = models.ForeignKey(
256
- ExaminationIndicationClassification,
257
- on_delete=models.CASCADE,
258
- related_name="choices",
259
- )
260
194
 
261
195
  objects = ExaminationIndicationClassificationChoiceManager()
262
196
 
@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, cast
3
3
  from django.db import models
4
4
 
5
5
  if TYPE_CHECKING:
6
- from endoreg_db.models import ExaminationTimeType
6
+ from endoreg_db.models import ExaminationTimeType, InformationSource
7
7
 
8
8
 
9
9
  class ExaminationTimeManager(models.Manager):
@@ -27,13 +27,18 @@ class ExaminationTime(models.Model):
27
27
  """
28
28
 
29
29
  name = models.CharField(max_length=100, unique=True)
30
- start_time = models.TimeField(blank=True, null=True)
31
30
  time_types = models.ManyToManyField("ExaminationTimeType", blank=True)
32
- end_time = models.TimeField(blank=True, null=True)
33
31
  objects = ExaminationTimeManager()
34
32
 
33
+ information_sources = models.ManyToManyField(
34
+ "InformationSource",
35
+ related_name="examination_times",
36
+ blank=True,
37
+ )
38
+
35
39
  if TYPE_CHECKING:
36
40
  time_types = cast(models.manager.RelatedManager["ExaminationTimeType"], time_types)
41
+ information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
37
42
 
38
43
  def __str__(self) -> str:
39
44
  """
@@ -12,11 +12,11 @@ class FindingManager(models.Manager):
12
12
  class Finding(models.Model):
13
13
  name = models.CharField(max_length=100, unique=True)
14
14
  description = models.TextField(blank=True, null=True)
15
- examinations = models.ManyToManyField("Examination", blank=True, related_name="findings")
16
15
  finding_types = models.ManyToManyField("FindingType", blank=True, related_name="findings")
17
-
18
16
  finding_interventions = models.ManyToManyField("FindingIntervention", blank=True, related_name="findings")
19
-
17
+ caused_by_interventions = models.ManyToManyField("FindingIntervention", blank=True, related_name="causes_findings")
18
+ finding_classifications = models.ManyToManyField("FindingClassification", blank=True, related_name="findings")
19
+ information_sources = models.ManyToManyField("InformationSource", blank=True, related_name="findings")
20
20
  objects = FindingManager()
21
21
 
22
22
  if TYPE_CHECKING:
@@ -26,20 +26,13 @@ class Finding(models.Model):
26
26
  FindingClassificationType,
27
27
  FindingIntervention,
28
28
  FindingType,
29
+ InformationSource,
29
30
  PatientFindingClassification,
30
31
  )
31
32
 
32
33
  finding_types = cast(models.manager.RelatedManager["FindingType"], finding_types)
33
- examinations = cast(models.manager.RelatedManager["Examination"], examinations)
34
34
  finding_interventions = cast(models.manager.RelatedManager["FindingIntervention"], finding_interventions)
35
-
36
- @property
37
- def finding_classifications(self) -> "models.manager.RelatedManager[FindingClassification]": ...
38
-
39
- # finding_classifications: models.QuerySet["FindingClassification"]
40
- # examinations: models.QuerySet[Examination]
41
- # finding_types: models.QuerySet[FindingType]
42
- # finding_interventions: models.QuerySet[FindingIntervention]
35
+ finding_classifications = cast(models.manager.RelatedManager["FindingClassification"], finding_classifications)
43
36
 
44
37
  def natural_key(self):
45
38
  """
@@ -11,7 +11,6 @@ class FindingClassificationTypeManager(models.Manager):
11
11
  class FindingClassificationType(models.Model):
12
12
  name = models.CharField(max_length=255, unique=True)
13
13
  description = models.TextField(blank=True)
14
-
15
14
  objects = FindingClassificationTypeManager()
16
15
 
17
16
  def natural_key(self):
@@ -20,14 +19,6 @@ class FindingClassificationType(models.Model):
20
19
  def __str__(self):
21
20
  return str(self.name)
22
21
 
23
- @classmethod
24
- def get_required_classifications_for_finding(cls, finding):
25
- """
26
- Returns all required finding classification types for a given finding.
27
- """
28
- required_classification_types = [_ for _ in finding.required_morphology_classification_types.all()]
29
- return required_classification_types
30
-
31
22
 
32
23
  class FindingClassificationManager(models.Manager):
33
24
  def get_by_natural_key(self, name):
@@ -37,26 +28,37 @@ class FindingClassificationManager(models.Manager):
37
28
  class FindingClassification(models.Model):
38
29
  name = models.CharField(max_length=255, unique=True)
39
30
  description = models.TextField(blank=True)
31
+ finding_types = models.ManyToManyField("FindingType", blank=True, related_name="finding_classifications")
32
+ choices = models.ManyToManyField("FindingClassificationChoice", related_name="classifications", blank=True)
33
+
40
34
  classification_types = models.ManyToManyField(
41
35
  to=FindingClassificationType,
42
36
  # on_delete=models.CASCADE
43
37
  )
44
- choices = models.ManyToManyField("FindingClassificationChoice", related_name="classifications", blank=True)
38
+ information_sources = models.ManyToManyField(
39
+ "InformationSource",
40
+ related_name="finding_classifications",
41
+ blank=True,
42
+ )
45
43
 
46
- findings = models.ManyToManyField("Finding", blank=True, related_name="finding_classifications")
47
- examinations = models.ManyToManyField("Examination", blank=True, related_name="finding_classifications")
48
- finding_types = models.ManyToManyField("FindingType", blank=True, related_name="finding_classifications")
44
+ @property
45
+ def examinations(self):
46
+ from endoreg_db.models import Examination
47
+
48
+ return Examination.objects.filter(findings__finding_classifications=self)
49
49
 
50
50
  objects = FindingClassificationManager()
51
51
 
52
52
  if TYPE_CHECKING:
53
- from endoreg_db.models import Examination, Finding, FindingType, PatientFindingClassification
53
+ from endoreg_db.models import Examination, Finding, FindingType, InformationSource, PatientFindingClassification
54
54
 
55
55
  classification_types = cast(models.manager.RelatedManager["FindingClassificationType"], classification_types)
56
56
  choices = cast(models.manager.RelatedManager["FindingClassificationChoice"], choices)
57
- examinations = cast(models.manager.RelatedManager["Examination"], examinations)
58
- findings = cast(models.manager.RelatedManager["Finding"], findings)
59
57
  finding_types = cast(models.manager.RelatedManager["FindingType"], finding_types)
58
+ information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
59
+
60
+ @property
61
+ def findings(self) -> "models.manager.RelatedManager[Finding]": ...
60
62
 
61
63
  def natural_key(self):
62
64
  return (self.name,)
@@ -73,20 +75,6 @@ class FindingClassification(models.Model):
73
75
  """
74
76
  return self.choices.all()
75
77
 
76
- @property
77
- def is_morphology(self):
78
- """
79
- Return True if any related classification type has the name "morphology" (case-insensitive).
80
- """
81
- return self.classification_types.filter(name__iexact="morphology").exists()
82
-
83
- @property
84
- def is_location(self):
85
- """
86
- Returns True if any related classification type has the name "location" (case-insensitive).
87
- """
88
- return self.classification_types.filter(name__iexact="location").exists()
89
-
90
78
 
91
79
  class FindingClassificationChoiceManager(models.Manager):
92
80
  def get_by_natural_key(self, name):
@@ -105,15 +93,8 @@ class FindingClassificationChoiceManager(models.Manager):
105
93
  class FindingClassificationChoice(models.Model):
106
94
  name = models.CharField(max_length=255, unique=True)
107
95
  description = models.TextField(blank=True)
108
- # classifications = models.ManyToManyField(
109
- # "FindingClassification",
110
- # related_name='choices'
111
- # )
112
-
113
96
  subcategories = models.JSONField(default=dict)
114
-
115
97
  numerical_descriptors = models.JSONField(default=dict)
116
-
117
98
  objects = FindingClassificationChoiceManager()
118
99
 
119
100
  if TYPE_CHECKING:
@@ -11,21 +11,19 @@ class FindingInterventionManager(models.Manager):
11
11
  class FindingIntervention(models.Model):
12
12
  name = models.CharField(max_length=100, unique=True)
13
13
  description = models.TextField(blank=True, null=True)
14
-
15
14
  intervention_types = models.ManyToManyField("FindingInterventionType", blank=True, related_name="interventions")
16
-
17
- required_lab_values = models.ManyToManyField("LabValue", blank=True, related_name="required_by_finding_interventions")
18
-
19
- contraindications = models.ManyToManyField("Contraindication", blank=True, related_name="contraindicating_finding_interventions")
20
-
15
+ information_sources = models.ManyToManyField(
16
+ "InformationSource",
17
+ related_name="finding_interventions",
18
+ blank=True,
19
+ )
21
20
  objects = FindingInterventionManager()
22
21
 
23
22
  if TYPE_CHECKING:
24
- from endoreg_db.models import Contraindication, FindingInterventionType, LabValue
23
+ from endoreg_db.models import Contraindication, FindingInterventionType, InformationSource, LabValue
25
24
 
26
25
  intervention_types = cast(models.manager.RelatedManager["FindingInterventionType"], intervention_types)
27
- required_lab_values = cast(models.manager.RelatedManager["LabValue"], required_lab_values)
28
- contraindications = cast(models.manager.RelatedManager["Contraindication"], contraindications)
26
+ information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
29
27
 
30
28
  def natural_key(self):
31
29
  return (self.name,)
@@ -33,6 +33,12 @@ class Endoscope(models.Model):
33
33
  verbose_name = "Endoscope"
34
34
  verbose_name_plural = "Endoscopes"
35
35
 
36
+ @property
37
+ def center_safe(self) -> "Center":
38
+ if self.center is None:
39
+ raise ValueError("Endoscope has no associated center.")
40
+ return self.center
41
+
36
42
 
37
43
  class EndoscopeTypeManager(models.Manager):
38
44
  def get_by_natural_key(self, name):
@@ -28,7 +28,11 @@ daily_night = MedicationIntakeTime.dn()
28
28
  mi = MedicationIndication.objects.order_by('?').first()
29
29
 
30
30
  # Alternatively, we can use a specific indication type
31
- medication_indication_type = MedicationIndicationType.objects.filter(indication_type='thromboembolism-prevention-non_valvular_af').order_by('?').first()
31
+
32
+ # FIXME MedicationIndicationType does not have a field named indication_type
33
+ # It does have: id, medication_indications, name
34
+
35
+ # medication_indication_type = MedicationIndicationType.objects.filter(indication_type='thromboembolism-prevention-non_valvular_af').order_by('?').first()
32
36
 
33
37
  patient = generate_patient()
34
38
 
@@ -54,7 +54,7 @@ class PatientFinding(models.Model):
54
54
  fields=["patient_examination", "finding"], condition=models.Q(is_active=True), name="unique_active_finding_per_examination"
55
55
  ),
56
56
  models.CheckConstraint(
57
- check=models.Q( # called .check in future?
57
+ condition=models.Q( # called .check in future?
58
58
  deactivated_at__isnull=True, deactivated_by__isnull=True
59
59
  )
60
60
  | models.Q(deactivated_at__isnull=False, deactivated_by__isnull=False, is_active=False),
@@ -9,20 +9,28 @@ if TYPE_CHECKING:
9
9
 
10
10
  class PdfType(models.Model):
11
11
  """
12
- Defines a specific type or format of PDF report, linking to flags used for parsing.
12
+ Defines a specific type or format of report report, linking to flags used for parsing.
13
13
 
14
- Used to configure how different PDF report layouts are processed.
14
+ Used to configure how different report report layouts are processed.
15
15
  """
16
16
 
17
17
  name = models.CharField(max_length=255)
18
18
 
19
- patient_info_line = models.ForeignKey("ReportReaderFlag", related_name="pdf_type_patient_info_line", on_delete=models.CASCADE)
19
+ patient_info_line = models.ForeignKey(
20
+ "ReportReaderFlag",
21
+ related_name="pdf_type_patient_info_line",
22
+ on_delete=models.CASCADE,
23
+ )
20
24
  endoscope_info_line = models.ForeignKey(
21
25
  "ReportReaderFlag",
22
26
  related_name="pdf_type_endoscopy_info_line",
23
27
  on_delete=models.CASCADE,
24
28
  )
25
- examiner_info_line = models.ForeignKey("ReportReaderFlag", related_name="pdf_type_examiner_info_line", on_delete=models.CASCADE)
29
+ examiner_info_line = models.ForeignKey(
30
+ "ReportReaderFlag",
31
+ related_name="pdf_type_examiner_info_line",
32
+ on_delete=models.CASCADE,
33
+ )
26
34
  cut_off_above_lines = models.ManyToManyField(
27
35
  "ReportReaderFlag",
28
36
  related_name="pdf_type_cut_off_above_lines",
@@ -37,11 +45,15 @@ class PdfType(models.Model):
37
45
  endoscope_info_line: models.ForeignKey["ReportReaderFlag"]
38
46
  examiner_info_line: models.ForeignKey["ReportReaderFlag"]
39
47
 
40
- cut_off_above_lines = cast(models.manager.RelatedManager["ReportReaderFlag"], cut_off_above_lines)
41
- cut_off_below_lines = cast(models.manager.RelatedManager["ReportReaderFlag"], cut_off_below_lines)
48
+ cut_off_above_lines = cast(
49
+ models.manager.RelatedManager["ReportReaderFlag"], cut_off_above_lines
50
+ )
51
+ cut_off_below_lines = cast(
52
+ models.manager.RelatedManager["ReportReaderFlag"], cut_off_below_lines
53
+ )
42
54
 
43
55
  def __str__(self):
44
- """Returns a string summary of the PDF type and its associated flags."""
56
+ """Returns a string summary of the report type and its associated flags."""
45
57
  summary = f"{self.name}"
46
58
  # add lines to summary
47
59
  summary += f"\nPatient Info Line: {self.patient_info_line.value}"
@@ -60,7 +72,7 @@ class PdfType(models.Model):
60
72
 
61
73
  class PdfMeta(models.Model):
62
74
  """
63
- Stores metadata associated with a specific PDF document file.
75
+ Stores metadata associated with a specific report document file.
64
76
  """
65
77
 
66
78
  pdf_type = models.ForeignKey(PdfType, on_delete=models.CASCADE)
@@ -69,13 +81,13 @@ class PdfMeta(models.Model):
69
81
  pdf_hash = models.CharField(max_length=255, unique=True)
70
82
 
71
83
  def __str__(self):
72
- """Returns the PDF hash as its string representation."""
84
+ """Returns the report hash as its string representation."""
73
85
  return str(self.pdf_hash)
74
86
 
75
87
  @classmethod
76
88
  def create_from_file(cls, pdf_file):
77
89
  """
78
- Creates a PdfMeta instance from a PDF file object.
90
+ Creates a PdfMeta instance from a report file object.
79
91
  Note: This implementation seems incomplete; it doesn't extract hash, date, time, or type.
80
92
  """
81
93
  pdf_file = File(pdf_file)
@@ -303,3 +303,6 @@ class SensitiveMeta(models.Model):
303
303
  This method delegates the update operation to the external logic module responsible for managing name data.
304
304
  """
305
305
  logic.update_name_db(first_name, last_name)
306
+
307
+
308
+