endoreg-db 0.8.6.1__py3-none-any.whl → 0.8.8.9__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 (503) hide show
  1. endoreg_db/authz/auth.py +74 -0
  2. endoreg_db/authz/backends.py +168 -0
  3. endoreg_db/authz/management/commands/list_routes.py +18 -0
  4. endoreg_db/authz/middleware.py +83 -0
  5. endoreg_db/authz/permissions.py +127 -0
  6. endoreg_db/authz/policy.py +218 -0
  7. endoreg_db/authz/views_auth.py +66 -0
  8. endoreg_db/config/env.py +13 -8
  9. endoreg_db/data/__init__.py +2 -11
  10. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +3 -3
  11. endoreg_db/data/event_classification/data.yaml +4 -0
  12. endoreg_db/data/event_classification_choice/data.yaml +9 -0
  13. endoreg_db/data/examination/examinations/data.yaml +114 -14
  14. endoreg_db/data/examination/time-type/data.yaml +0 -3
  15. endoreg_db/data/examination_indication/endoscopy.yaml +108 -173
  16. endoreg_db/data/examination_indication_classification/endoscopy.yaml +0 -70
  17. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +33 -37
  18. endoreg_db/data/finding/00_generic.yaml +35 -0
  19. endoreg_db/data/finding/00_generic_complication.yaml +9 -0
  20. endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
  21. endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
  22. endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
  23. endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
  24. endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
  25. endoreg_db/data/finding_classification/00_generic.yaml +44 -0
  26. endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
  27. endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
  28. endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
  29. endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
  30. endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
  31. endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
  32. endoreg_db/data/finding_classification_choice/{yes_no_na.yaml → 00_generic.yaml} +5 -1
  33. endoreg_db/data/finding_classification_choice/{examination_setting_generic_types.yaml → 00_generic_baseline.yaml} +10 -2
  34. endoreg_db/data/finding_classification_choice/{complication_generic_types.yaml → 00_generic_complication.yaml} +1 -1
  35. endoreg_db/data/finding_classification_choice/{histology.yaml → 00_generic_histology.yaml} +1 -4
  36. endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
  37. endoreg_db/data/finding_classification_choice/{bowel_preparation.yaml → 02_colonoscopy_bowel_preparation.yaml} +1 -30
  38. endoreg_db/data/finding_classification_choice/{colonoscopy_not_complete_reason.yaml → 02_colonoscopy_generic.yaml} +1 -1
  39. endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
  40. endoreg_db/data/finding_classification_choice/{colonoscopy_location.yaml → 02_colonoscopy_location.yaml} +23 -4
  41. endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
  42. endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
  43. endoreg_db/data/finding_classification_choice/{colon_lesion_paris.yaml → 02_colonoscopy_polyp_morphology.yaml} +26 -8
  44. endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
  45. endoreg_db/data/finding_classification_type/{colonoscopy_basic.yaml → 00_generic.yaml} +18 -13
  46. endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
  47. endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
  48. endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
  49. endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
  50. endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
  51. endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
  52. endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
  53. endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
  54. endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
  55. endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
  56. endoreg_db/data/finding_type/data.yaml +8 -12
  57. endoreg_db/data/requirement/01_patient_data.yaml +93 -0
  58. endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
  59. endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
  60. endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
  61. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +29 -12
  62. endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
  63. endoreg_db/data/requirement_set/{endoscopy_bleeding_risk.yaml → 02_endoscopy_bleeding_risk.yaml} +0 -6
  64. endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
  65. endoreg_db/data/requirement_set/_old_ +109 -0
  66. endoreg_db/data/requirement_set_type/data.yaml +21 -0
  67. endoreg_db/data/setup_config.yaml +4 -4
  68. endoreg_db/data/tag/requirement_set_tags.yaml +21 -0
  69. endoreg_db/exceptions.py +4 -2
  70. endoreg_db/forms/examination_form.py +1 -1
  71. endoreg_db/helpers/data_loader.py +125 -53
  72. endoreg_db/helpers/default_objects.py +116 -81
  73. endoreg_db/import_files/__init__.py +27 -0
  74. endoreg_db/import_files/context/__init__.py +7 -0
  75. endoreg_db/import_files/context/default_sensitive_meta.py +81 -0
  76. endoreg_db/import_files/context/ensure_center.py +17 -0
  77. endoreg_db/import_files/context/file_lock.py +66 -0
  78. endoreg_db/import_files/context/import_context.py +43 -0
  79. endoreg_db/import_files/context/validate_directories.py +56 -0
  80. endoreg_db/import_files/file_storage/__init__.py +15 -0
  81. endoreg_db/import_files/file_storage/create_report_file.py +76 -0
  82. endoreg_db/import_files/file_storage/create_video_file.py +75 -0
  83. endoreg_db/import_files/file_storage/sensitive_meta_storage.py +39 -0
  84. endoreg_db/import_files/file_storage/state_management.py +400 -0
  85. endoreg_db/import_files/file_storage/storage.py +36 -0
  86. endoreg_db/import_files/import_service.md +26 -0
  87. endoreg_db/import_files/processing/__init__.py +11 -0
  88. endoreg_db/import_files/processing/report_processing/report_anonymization.py +94 -0
  89. endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
  90. endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
  91. endoreg_db/import_files/processing/video_processing/video_cleanup_on_error.py +119 -0
  92. endoreg_db/import_files/pseudonymization/fake.py +52 -0
  93. endoreg_db/import_files/pseudonymization/k_anonymity.py +182 -0
  94. endoreg_db/import_files/pseudonymization/k_pseudonymity.py +128 -0
  95. endoreg_db/import_files/report_import_service.py +141 -0
  96. endoreg_db/import_files/video_import_service.py +150 -0
  97. endoreg_db/management/commands/create_model_meta_from_huggingface.py +21 -10
  98. endoreg_db/management/commands/create_multilabel_model_meta.py +299 -129
  99. endoreg_db/management/commands/import_report.py +130 -65
  100. endoreg_db/management/commands/import_video.py +9 -10
  101. endoreg_db/management/commands/import_video_with_classification.py +2 -2
  102. endoreg_db/management/commands/list_routes.py +18 -0
  103. endoreg_db/management/commands/load_ai_model_data.py +5 -5
  104. endoreg_db/management/commands/load_ai_model_label_data.py +9 -7
  105. endoreg_db/management/commands/load_base_db_data.py +5 -134
  106. endoreg_db/management/commands/load_center_data.py +12 -12
  107. endoreg_db/management/commands/load_contraindication_data.py +14 -16
  108. endoreg_db/management/commands/load_disease_classification_choices_data.py +15 -18
  109. endoreg_db/management/commands/load_disease_classification_data.py +15 -18
  110. endoreg_db/management/commands/load_disease_data.py +25 -28
  111. endoreg_db/management/commands/load_endoscope_data.py +20 -27
  112. endoreg_db/management/commands/load_event_data.py +14 -16
  113. endoreg_db/management/commands/load_examination_data.py +31 -44
  114. endoreg_db/management/commands/load_examination_indication_data.py +20 -21
  115. endoreg_db/management/commands/load_finding_data.py +52 -80
  116. endoreg_db/management/commands/load_information_source.py +21 -23
  117. endoreg_db/management/commands/load_lab_value_data.py +17 -26
  118. endoreg_db/management/commands/load_medication_data.py +13 -12
  119. endoreg_db/management/commands/load_organ_data.py +15 -19
  120. endoreg_db/management/commands/load_pdf_type_data.py +19 -18
  121. endoreg_db/management/commands/load_profession_data.py +14 -17
  122. endoreg_db/management/commands/load_qualification_data.py +20 -23
  123. endoreg_db/management/commands/load_report_reader_flag_data.py +17 -19
  124. endoreg_db/management/commands/load_requirement_data.py +62 -39
  125. endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
  126. endoreg_db/management/commands/load_risk_data.py +7 -6
  127. endoreg_db/management/commands/load_shift_data.py +20 -23
  128. endoreg_db/management/commands/load_tag_data.py +8 -11
  129. endoreg_db/management/commands/load_unit_data.py +17 -19
  130. endoreg_db/management/commands/setup_endoreg_db.py +3 -3
  131. endoreg_db/management/commands/start_filewatcher.py +46 -37
  132. endoreg_db/management/commands/storage_management.py +271 -203
  133. endoreg_db/management/commands/validate_video_files.py +1 -5
  134. endoreg_db/migrations/0001_initial.py +297 -250
  135. endoreg_db/models/__init__.py +78 -123
  136. endoreg_db/models/administration/__init__.py +21 -42
  137. endoreg_db/models/administration/ai/active_model.py +2 -2
  138. endoreg_db/models/administration/ai/ai_model.py +7 -6
  139. endoreg_db/models/administration/case/__init__.py +1 -15
  140. endoreg_db/models/administration/case/case.py +3 -3
  141. endoreg_db/models/administration/case/case_template/__init__.py +2 -14
  142. endoreg_db/models/administration/case/case_template/case_template.py +2 -124
  143. endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
  144. endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
  145. endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
  146. endoreg_db/models/administration/center/center.py +33 -19
  147. endoreg_db/models/administration/center/center_product.py +12 -9
  148. endoreg_db/models/administration/center/center_resource.py +25 -19
  149. endoreg_db/models/administration/center/center_shift.py +21 -17
  150. endoreg_db/models/administration/center/center_waste.py +16 -8
  151. endoreg_db/models/administration/person/__init__.py +2 -0
  152. endoreg_db/models/administration/person/employee/employee.py +10 -5
  153. endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
  154. endoreg_db/models/administration/person/employee/employee_type.py +12 -6
  155. endoreg_db/models/administration/person/examiner/examiner.py +13 -11
  156. endoreg_db/models/administration/person/patient/__init__.py +2 -0
  157. endoreg_db/models/administration/person/patient/patient.py +129 -100
  158. endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
  159. endoreg_db/models/administration/person/person.py +4 -0
  160. endoreg_db/models/administration/person/profession/__init__.py +8 -4
  161. endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
  162. endoreg_db/models/administration/product/product.py +20 -15
  163. endoreg_db/models/administration/product/product_material.py +17 -18
  164. endoreg_db/models/administration/product/product_weight.py +12 -8
  165. endoreg_db/models/administration/product/reference_product.py +23 -55
  166. endoreg_db/models/administration/qualification/qualification.py +7 -3
  167. endoreg_db/models/administration/qualification/qualification_type.py +7 -3
  168. endoreg_db/models/administration/shift/scheduled_days.py +8 -5
  169. endoreg_db/models/administration/shift/shift.py +16 -12
  170. endoreg_db/models/administration/shift/shift_type.py +23 -31
  171. endoreg_db/models/label/__init__.py +8 -9
  172. endoreg_db/models/label/annotation/image_classification.py +10 -9
  173. endoreg_db/models/label/annotation/video_segmentation_annotation.py +23 -28
  174. endoreg_db/models/label/label.py +15 -15
  175. endoreg_db/models/label/label_set.py +19 -6
  176. endoreg_db/models/label/label_type.py +1 -1
  177. endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
  178. endoreg_db/models/label/label_video_segment/label_video_segment.py +98 -102
  179. endoreg_db/models/label/video_segmentation_label.py +4 -0
  180. endoreg_db/models/label/video_segmentation_labelset.py +4 -3
  181. endoreg_db/models/media/frame/frame.py +22 -22
  182. endoreg_db/models/media/pdf/raw_pdf.py +194 -194
  183. endoreg_db/models/media/pdf/report_file.py +25 -29
  184. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +55 -47
  185. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
  186. endoreg_db/models/media/processing_history/__init__.py +5 -0
  187. endoreg_db/models/media/processing_history/processing_history.py +96 -0
  188. endoreg_db/models/media/video/__init__.py +1 -0
  189. endoreg_db/models/media/video/create_from_file.py +139 -77
  190. endoreg_db/models/media/video/pipe_2.py +8 -9
  191. endoreg_db/models/media/video/video_file.py +174 -112
  192. endoreg_db/models/media/video/video_file_ai.py +288 -74
  193. endoreg_db/models/media/video/video_file_anonymize.py +38 -38
  194. endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
  195. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
  196. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
  197. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
  198. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
  199. endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
  200. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
  201. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
  202. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
  203. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
  204. endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
  205. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
  206. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
  207. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
  208. endoreg_db/models/media/video/video_file_io.py +113 -61
  209. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
  210. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
  211. endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
  212. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
  213. endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
  214. endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
  215. endoreg_db/models/media/video/video_file_segments.py +24 -17
  216. endoreg_db/models/media/video/video_metadata.py +19 -35
  217. endoreg_db/models/media/video/video_processing.py +96 -95
  218. endoreg_db/models/medical/contraindication/README.md +1 -0
  219. endoreg_db/models/medical/contraindication/__init__.py +13 -3
  220. endoreg_db/models/medical/disease.py +22 -16
  221. endoreg_db/models/medical/event.py +31 -18
  222. endoreg_db/models/medical/examination/__init__.py +13 -6
  223. endoreg_db/models/medical/examination/examination.py +39 -20
  224. endoreg_db/models/medical/examination/examination_indication.py +30 -95
  225. endoreg_db/models/medical/examination/examination_time.py +23 -8
  226. endoreg_db/models/medical/examination/examination_time_type.py +9 -6
  227. endoreg_db/models/medical/examination/examination_type.py +3 -4
  228. endoreg_db/models/medical/finding/finding.py +32 -40
  229. endoreg_db/models/medical/finding/finding_classification.py +42 -72
  230. endoreg_db/models/medical/finding/finding_intervention.py +25 -22
  231. endoreg_db/models/medical/finding/finding_type.py +13 -12
  232. endoreg_db/models/medical/hardware/endoscope.py +26 -26
  233. endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
  234. endoreg_db/models/medical/laboratory/lab_value.py +62 -91
  235. endoreg_db/models/medical/medication/medication.py +22 -10
  236. endoreg_db/models/medical/medication/medication_indication.py +29 -3
  237. endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
  238. endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
  239. endoreg_db/models/medical/medication/medication_schedule.py +27 -16
  240. endoreg_db/models/medical/organ/__init__.py +15 -12
  241. endoreg_db/models/medical/patient/medication_examples.py +6 -6
  242. endoreg_db/models/medical/patient/patient_disease.py +20 -23
  243. endoreg_db/models/medical/patient/patient_event.py +19 -22
  244. endoreg_db/models/medical/patient/patient_examination.py +48 -54
  245. endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
  246. endoreg_db/models/medical/patient/patient_finding.py +122 -139
  247. endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
  248. endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
  249. endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
  250. endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
  251. endoreg_db/models/medical/patient/patient_medication.py +27 -38
  252. endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
  253. endoreg_db/models/medical/risk/risk.py +7 -6
  254. endoreg_db/models/medical/risk/risk_type.py +8 -5
  255. endoreg_db/models/metadata/model_meta.py +60 -29
  256. endoreg_db/models/metadata/model_meta_logic.py +125 -18
  257. endoreg_db/models/metadata/pdf_meta.py +31 -24
  258. endoreg_db/models/metadata/sensitive_meta.py +105 -85
  259. endoreg_db/models/metadata/sensitive_meta_logic.py +198 -103
  260. endoreg_db/models/metadata/video_meta.py +51 -31
  261. endoreg_db/models/metadata/video_prediction_logic.py +16 -23
  262. endoreg_db/models/metadata/video_prediction_meta.py +29 -33
  263. endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
  264. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
  265. endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
  266. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
  267. endoreg_db/models/other/emission/emission_factor.py +18 -8
  268. endoreg_db/models/other/gender.py +10 -5
  269. endoreg_db/models/other/information_source.py +50 -29
  270. endoreg_db/models/other/material.py +9 -5
  271. endoreg_db/models/other/resource.py +6 -4
  272. endoreg_db/models/other/tag.py +10 -5
  273. endoreg_db/models/other/transport_route.py +13 -8
  274. endoreg_db/models/other/unit.py +10 -6
  275. endoreg_db/models/other/waste.py +6 -5
  276. endoreg_db/models/report/report.py +6 -0
  277. endoreg_db/models/requirement/requirement.py +329 -361
  278. endoreg_db/models/requirement/requirement_error.py +85 -0
  279. endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
  280. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
  281. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
  282. endoreg_db/models/requirement/requirement_operator.py +103 -112
  283. endoreg_db/models/requirement/requirement_set.py +74 -57
  284. endoreg_db/models/state/__init__.py +4 -4
  285. endoreg_db/models/state/abstract.py +2 -2
  286. endoreg_db/models/state/anonymization.py +12 -0
  287. endoreg_db/models/state/audit_ledger.py +49 -51
  288. endoreg_db/models/state/label_video_segment.py +9 -0
  289. endoreg_db/models/state/raw_pdf.py +101 -68
  290. endoreg_db/models/state/sensitive_meta.py +6 -2
  291. endoreg_db/models/state/video.py +110 -90
  292. endoreg_db/models/upload_job.py +35 -34
  293. endoreg_db/models/utils.py +28 -25
  294. endoreg_db/queries/__init__.py +3 -1
  295. endoreg_db/root_urls.py +21 -2
  296. endoreg_db/schemas/examination_evaluation.py +1 -1
  297. endoreg_db/serializers/__init__.py +2 -10
  298. endoreg_db/serializers/anonymization.py +18 -10
  299. endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
  300. endoreg_db/serializers/meta/__init__.py +1 -6
  301. endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
  302. endoreg_db/serializers/misc/file_overview.py +11 -99
  303. endoreg_db/serializers/misc/sensitive_patient_data.py +50 -26
  304. endoreg_db/serializers/patient_examination/patient_examination.py +3 -3
  305. endoreg_db/serializers/pdf/anony_text_validation.py +39 -23
  306. endoreg_db/serializers/requirements/requirement_sets.py +92 -22
  307. endoreg_db/serializers/video/segmentation.py +2 -1
  308. endoreg_db/serializers/video/video_file_list.py +65 -34
  309. endoreg_db/serializers/video/video_processing_history.py +20 -5
  310. endoreg_db/services/__old/pdf_import.py +1487 -0
  311. endoreg_db/services/__old/video_import.py +1306 -0
  312. endoreg_db/services/anonymization.py +128 -89
  313. endoreg_db/services/lookup_service.py +65 -52
  314. endoreg_db/services/lookup_store.py +2 -2
  315. endoreg_db/services/pdf_import.py +0 -1382
  316. endoreg_db/services/report_import.py +10 -0
  317. endoreg_db/services/video_import.py +6 -1255
  318. endoreg_db/tasks/upload_tasks.py +79 -70
  319. endoreg_db/tasks/video_ingest.py +8 -4
  320. endoreg_db/urls/__init__.py +5 -32
  321. endoreg_db/urls/ai.py +32 -0
  322. endoreg_db/urls/media.py +121 -83
  323. endoreg_db/urls/root_urls.py +29 -0
  324. endoreg_db/utils/__init__.py +15 -5
  325. endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
  326. endoreg_db/utils/case_generator/__init__.py +3 -0
  327. endoreg_db/utils/dataloader.py +142 -40
  328. endoreg_db/utils/defaults/set_default_center.py +32 -0
  329. endoreg_db/utils/names.py +22 -16
  330. endoreg_db/utils/paths.py +110 -46
  331. endoreg_db/utils/permissions.py +2 -1
  332. endoreg_db/utils/pipelines/Readme.md +1 -1
  333. endoreg_db/utils/pipelines/process_video_dir.py +1 -1
  334. endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +655 -0
  335. endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
  336. endoreg_db/utils/setup_config.py +8 -5
  337. endoreg_db/utils/storage.py +115 -0
  338. endoreg_db/utils/validate_endo_roi.py +8 -2
  339. endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
  340. endoreg_db/views/__init__.py +85 -183
  341. endoreg_db/views/ai/__init__.py +8 -0
  342. endoreg_db/views/ai/label.py +155 -0
  343. endoreg_db/views/anonymization/media_management.py +202 -166
  344. endoreg_db/views/anonymization/overview.py +99 -67
  345. endoreg_db/views/anonymization/validate.py +182 -44
  346. endoreg_db/views/media/__init__.py +7 -20
  347. endoreg_db/views/media/pdf_media.py +197 -174
  348. endoreg_db/views/media/sensitive_metadata.py +193 -138
  349. endoreg_db/views/media/video_media.py +89 -82
  350. endoreg_db/views/meta/__init__.py +0 -8
  351. endoreg_db/views/misc/__init__.py +1 -7
  352. endoreg_db/views/misc/upload_views.py +94 -93
  353. endoreg_db/views/patient/patient.py +5 -4
  354. endoreg_db/views/report/__init__.py +5 -7
  355. endoreg_db/views/{pdf → report}/reimport.py +22 -22
  356. endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +46 -39
  357. endoreg_db/views/requirement/evaluate.py +188 -187
  358. endoreg_db/views/requirement/lookup.py +17 -3
  359. endoreg_db/views/requirement/lookup_store.py +22 -90
  360. endoreg_db/views/requirement/requirement_utils.py +89 -0
  361. endoreg_db/views/video/__init__.py +23 -24
  362. endoreg_db/views/video/correction.py +201 -172
  363. endoreg_db/views/video/reimport.py +1 -1
  364. endoreg_db/views/{media/video_segments.py → video/segments_crud.py} +77 -40
  365. endoreg_db/views/video/{video_meta.py → video_meta_stats.py} +2 -2
  366. endoreg_db/views/video/video_stream.py +7 -8
  367. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/METADATA +7 -3
  368. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/RECORD +391 -413
  369. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/WHEEL +1 -1
  370. endoreg_db/data/finding/anatomy_colon.yaml +0 -128
  371. endoreg_db/data/finding/colonoscopy.yaml +0 -40
  372. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +0 -56
  373. endoreg_db/data/finding/complication.yaml +0 -16
  374. endoreg_db/data/finding/data.yaml +0 -105
  375. endoreg_db/data/finding/examination_setting.yaml +0 -16
  376. endoreg_db/data/finding/medication_related.yaml +0 -18
  377. endoreg_db/data/finding/outcome.yaml +0 -12
  378. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +0 -95
  379. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +0 -22
  380. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +0 -25
  381. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
  382. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
  383. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +0 -68
  384. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
  385. endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -80
  386. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +0 -21
  387. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +0 -20
  388. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +0 -26
  389. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +0 -22
  390. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +0 -53
  391. endoreg_db/data/finding_classification/complication_generic.yaml +0 -25
  392. endoreg_db/data/finding_classification/examination_setting_generic.yaml +0 -40
  393. endoreg_db/data/finding_classification/histology_colo.yaml +0 -51
  394. endoreg_db/data/finding_classification/intervention_required.yaml +0 -26
  395. endoreg_db/data/finding_classification/medication_related.yaml +0 -23
  396. endoreg_db/data/finding_classification/visualized.yaml +0 -33
  397. endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
  398. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
  399. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
  400. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +0 -15
  401. endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +0 -17
  402. endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
  403. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +0 -14
  404. endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
  405. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +0 -82
  406. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
  407. endoreg_db/data/finding_classification_choice/outcome.yaml +0 -19
  408. endoreg_db/data/finding_intervention/endoscopy.yaml +0 -43
  409. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
  410. endoreg_db/data/finding_intervention/endoscopy_egd.yaml +0 -128
  411. endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +0 -32
  412. endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +0 -9
  413. endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +0 -36
  414. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +0 -79
  415. endoreg_db/data/requirement/age.yaml +0 -26
  416. endoreg_db/data/requirement/gender.yaml +0 -25
  417. endoreg_db/management/commands/init_default_ai_model.py +0 -112
  418. endoreg_db/management/commands/reset_celery_schedule.py +0 -9
  419. endoreg_db/management/commands/validate_video.py +0 -204
  420. endoreg_db/migrations/0002_add_video_correction_models.py +0 -52
  421. endoreg_db/migrations/0003_add_center_display_name.py +0 -30
  422. endoreg_db/models/administration/permissions/__init__.py +0 -44
  423. endoreg_db/models/rule/__init__.py +0 -13
  424. endoreg_db/models/rule/rule.py +0 -27
  425. endoreg_db/models/rule/rule_applicator.py +0 -224
  426. endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
  427. endoreg_db/models/rule/rule_type.py +0 -20
  428. endoreg_db/models/rule/ruleset.py +0 -17
  429. endoreg_db/renames.yml +0 -8
  430. endoreg_db/serializers/_old/raw_pdf_meta_validation.py +0 -223
  431. endoreg_db/serializers/_old/raw_video_meta_validation.py +0 -179
  432. endoreg_db/serializers/_old/video.py +0 -71
  433. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +0 -115
  434. endoreg_db/serializers/meta/report_meta.py +0 -53
  435. endoreg_db/serializers/report/__init__.py +0 -9
  436. endoreg_db/serializers/report/mixins.py +0 -45
  437. endoreg_db/serializers/report/report.py +0 -105
  438. endoreg_db/serializers/report/report_list.py +0 -22
  439. endoreg_db/serializers/report/secure_file_url.py +0 -26
  440. endoreg_db/serializers/video/video_metadata.py +0 -105
  441. endoreg_db/services/requirements_object.py +0 -147
  442. endoreg_db/services/storage_aware_video_processor.py +0 -344
  443. endoreg_db/urls/files.py +0 -6
  444. endoreg_db/urls/label_video_segment_validate.py +0 -33
  445. endoreg_db/urls/label_video_segments.py +0 -46
  446. endoreg_db/urls/report.py +0 -48
  447. endoreg_db/urls/video.py +0 -61
  448. endoreg_db/utils/case_generator/case_generator.py +0 -159
  449. endoreg_db/utils/case_generator/utils.py +0 -30
  450. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +0 -368
  451. endoreg_db/views/label/__init__.py +0 -5
  452. endoreg_db/views/label/label.py +0 -15
  453. endoreg_db/views/label_video_segment/__init__.py +0 -16
  454. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +0 -44
  455. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +0 -50
  456. endoreg_db/views/label_video_segment/label_video_segment.py +0 -77
  457. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +0 -174
  458. endoreg_db/views/label_video_segment/label_video_segment_detail.py +0 -73
  459. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +0 -46
  460. endoreg_db/views/label_video_segment/validate.py +0 -226
  461. endoreg_db/views/media/segments.py +0 -71
  462. endoreg_db/views/meta/available_files_list.py +0 -146
  463. endoreg_db/views/meta/report_meta.py +0 -53
  464. endoreg_db/views/meta/sensitive_meta_detail.py +0 -148
  465. endoreg_db/views/misc/secure_file_serving_view.py +0 -80
  466. endoreg_db/views/misc/secure_file_url_view.py +0 -84
  467. endoreg_db/views/misc/secure_url_validate.py +0 -79
  468. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +0 -164
  469. endoreg_db/views/patient_finding_location/__init__.py +0 -5
  470. endoreg_db/views/patient_finding_location/pfl_create.py +0 -70
  471. endoreg_db/views/patient_finding_morphology/__init__.py +0 -5
  472. endoreg_db/views/patient_finding_morphology/pfm_create.py +0 -70
  473. endoreg_db/views/pdf/__init__.py +0 -8
  474. endoreg_db/views/report/report_list.py +0 -112
  475. endoreg_db/views/report/report_with_secure_url.py +0 -28
  476. endoreg_db/views/report/start_examination.py +0 -7
  477. endoreg_db/views/video/segmentation.py +0 -274
  478. endoreg_db/views/video/task_status.py +0 -49
  479. endoreg_db/views/video/timeline.py +0 -46
  480. endoreg_db/views/video/video_analyze.py +0 -52
  481. endoreg_db/views.py +0 -0
  482. /endoreg_db/data/requirement/{colonoscopy_baseline_austria.yaml → old/colonoscopy_baseline_austria.yaml} +0 -0
  483. /endoreg_db/data/requirement/{disease_cardiovascular.yaml → old/disease_cardiovascular.yaml} +0 -0
  484. /endoreg_db/data/requirement/{disease_classification_choice_cardiovascular.yaml → old/disease_classification_choice_cardiovascular.yaml} +0 -0
  485. /endoreg_db/data/requirement/{disease_hepatology.yaml → old/disease_hepatology.yaml} +0 -0
  486. /endoreg_db/data/requirement/{disease_misc.yaml → old/disease_misc.yaml} +0 -0
  487. /endoreg_db/data/requirement/{disease_renal.yaml → old/disease_renal.yaml} +0 -0
  488. /endoreg_db/data/requirement/{endoscopy_bleeding_risk.yaml → old/endoscopy_bleeding_risk.yaml} +0 -0
  489. /endoreg_db/data/requirement/{event_cardiology.yaml → old/event_cardiology.yaml} +0 -0
  490. /endoreg_db/data/requirement/{event_requirements.yaml → old/event_requirements.yaml} +0 -0
  491. /endoreg_db/data/requirement/{finding_colon_polyp.yaml → old/finding_colon_polyp.yaml} +0 -0
  492. /endoreg_db/{migrations/__init__.py → data/requirement/old/gender.yaml} +0 -0
  493. /endoreg_db/data/requirement/{lab_value.yaml → old/lab_value.yaml} +0 -0
  494. /endoreg_db/data/requirement/{medication.yaml → old/medication.yaml} +0 -0
  495. /endoreg_db/data/requirement_operator/{age.yaml → _old/age.yaml} +0 -0
  496. /endoreg_db/data/requirement_operator/{lab_operators.yaml → _old/lab_operators.yaml} +0 -0
  497. /endoreg_db/data/requirement_operator/{model_operators.yaml → _old/model_operators.yaml} +0 -0
  498. /endoreg_db/{models/media/video/refactor_plan.md → import_files/pseudonymization/__init__.py} +0 -0
  499. /endoreg_db/{models/media/video/video_file_frames.py → import_files/pseudonymization/pseudonymize.py} +0 -0
  500. /endoreg_db/models/{metadata/frame_ocr_result.py → report/__init__.py} +0 -0
  501. /endoreg_db/{urls/sensitive_meta.py → models/report/images.py} +0 -0
  502. /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
  503. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/licenses/LICENSE +0 -0
@@ -1,27 +1,29 @@
1
- from django.conf import settings
2
1
  import os
3
- from django.core.management.base import BaseCommand
4
2
 
5
3
  import yaml
6
- from ...utils import load_model_data_from_yaml
4
+ from django.conf import settings
5
+ from django.core.management.base import BaseCommand
7
6
 
7
+ from ...data import REPORT_TYPE_DATA_DIR
8
8
 
9
9
  #### CUSTOMIZE
10
10
  from ...models import PdfType, ReportReaderFlag
11
- from ...data import PDF_TYPE_DATA_DIR
11
+ from ...utils import load_model_data_from_yaml
12
12
 
13
- SOURCE_DIR = PDF_TYPE_DATA_DIR # e.g. settings.DATA_DIR_INTERVENTION
13
+ SOURCE_DIR = REPORT_TYPE_DATA_DIR # e.g. settings.DATA_DIR_INTERVENTION
14
14
 
15
15
  MODEL_0 = PdfType
16
16
 
17
- IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
17
+ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
18
18
  MODEL_0.__name__,
19
19
  ]
20
20
 
21
21
  IMPORT_METADATA = {
22
22
  MODEL_0.__name__: {
23
- "dir": SOURCE_DIR, # e.g. "interventions"
24
- "model": MODEL_0, # e.g. Intervention
23
+ "dir": SOURCE_DIR, # e.g. "interventions"
24
+ "model": MODEL_0, # e.g. Intervention
25
+ "dir": SOURCE_DIR, # e.g. "interventions"
26
+ "model": MODEL_0,
25
27
  "foreign_keys": [
26
28
  "patient_info_line",
27
29
  "endoscope_info_line",
@@ -39,23 +41,22 @@ IMPORT_METADATA = {
39
41
  }
40
42
  }
41
43
 
44
+
42
45
  class Command(BaseCommand):
43
46
  help = f"""Load all .yaml files in the {SOURCE_DIR} directory"""
44
47
 
45
48
  def add_arguments(self, parser):
46
49
  parser.add_argument(
47
- '--verbose',
48
- action='store_true',
49
- help='Display verbose output',
50
+ "--verbose",
51
+ action="store_true",
52
+ help="Display verbose output",
50
53
  )
51
54
 
52
55
  def handle(self, *args, **options):
53
- verbose = options['verbose']
56
+ verbose = options["verbose"]
57
+ verbose = options["verbose"]
54
58
  for model_name in IMPORT_MODELS:
55
59
  _metadata = IMPORT_METADATA[model_name]
56
- load_model_data_from_yaml(
57
- self,
58
- model_name,
59
- _metadata,
60
- verbose
61
- )
60
+ load_model_data_from_yaml(self, model_name, _metadata, verbose)
61
+
62
+ load_model_data_from_yaml(self, model_name, _metadata, verbose)
@@ -1,44 +1,41 @@
1
1
  from django.conf import settings
2
2
  from django.core.management.base import BaseCommand
3
+
4
+ from ...data import PROFESSION_DATA_DIR
3
5
  from ...models import Profession
4
6
  from ...utils import load_model_data_from_yaml
5
- from ...data import PROFESSION_DATA_DIR
6
7
 
7
- SOURCE_DIR = PROFESSION_DATA_DIR # e.g. settings.DATA_DIR_INTERVENTION
8
+ SOURCE_DIR = PROFESSION_DATA_DIR # e.g. settings.DATA_DIR_INTERVENTION
8
9
 
9
10
  MODEL_0 = Profession
10
11
 
11
- IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
12
+ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
12
13
  MODEL_0.__name__,
13
14
  ]
14
15
 
15
16
  IMPORT_METADATA = {
16
17
  MODEL_0.__name__: {
17
- "dir": SOURCE_DIR, # e.g. "interventions"
18
- "model": MODEL_0, # e.g. Intervention
19
- "foreign_keys": [], # e.g. ["intervention_types"]
20
- "foreign_key_models": [] # e.g. [InterventionType]
18
+ "dir": SOURCE_DIR, # e.g. "interventions"
19
+ "model": MODEL_0,
20
+ "foreign_keys": [], # e.g. ["intervention_types"]
21
+ "foreign_key_models": [], # e.g. [InterventionType]
21
22
  }
22
23
  }
23
24
 
25
+
24
26
  class Command(BaseCommand):
25
27
  help = """Load all .yaml files in the data/intervention directory
26
28
  into the Intervention and InterventionType model"""
27
29
 
28
30
  def add_arguments(self, parser):
29
31
  parser.add_argument(
30
- '--verbose',
31
- action='store_true',
32
- help='Display verbose output',
32
+ "--verbose",
33
+ action="store_true",
34
+ help="Display verbose output",
33
35
  )
34
36
 
35
37
  def handle(self, *args, **options):
36
- verbose = options['verbose']
38
+ verbose = options["verbose"]
37
39
  for model_name in IMPORT_MODELS:
38
40
  _metadata = IMPORT_METADATA[model_name]
39
- load_model_data_from_yaml(
40
- self,
41
- model_name,
42
- _metadata,
43
- verbose
44
- )
41
+ load_model_data_from_yaml(self, model_name, _metadata, verbose)
@@ -1,33 +1,35 @@
1
1
  from django.core.management.base import BaseCommand
2
+
3
+ from ...data import QUALIFICATION_DATA_DIR
2
4
  from ...models import Qualification, QualificationType
3
5
  from ...utils import load_model_data_from_yaml
4
- from ...data import QUALIFICATION_DATA_DIR
5
6
 
6
- SOURCE_DIR = QUALIFICATION_DATA_DIR # qualification data directory
7
+ SOURCE_DIR = QUALIFICATION_DATA_DIR # qualification data directory
7
8
 
8
9
  model_0 = QualificationType
9
10
  model_1 = Qualification
10
11
 
11
- IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
12
+ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
12
13
  model_0.__name__,
13
14
  model_1.__name__,
14
15
  ]
15
16
 
16
17
  IMPORT_METADATA = {
17
18
  model_0.__name__: {
18
- "dir": SOURCE_DIR, # e.g. "interventions"
19
- "model": model_0, # e.g. Intervention
20
- "foreign_keys": [], # e.g. ["intervention_types"]
21
- "foreign_key_models": [] # e.g. [InterventionType]
19
+ "dir": SOURCE_DIR, # e.g. "interventions"
20
+ "model": model_0,
21
+ "foreign_keys": [], # e.g. ["intervention_types"]
22
+ "foreign_key_models": [], # e.g. [InterventionType]
22
23
  },
23
24
  model_1.__name__: {
24
- "dir": SOURCE_DIR, # e.g. "interventions"
25
- "model": model_1, # e.g. Intervention
26
- "foreign_keys": ["qualification_types"], # e.g. ["intervention_types"]
27
- "foreign_key_models": [model_0] # e.g. [InterventionType]
28
- }
25
+ "dir": SOURCE_DIR, # e.g. "interventions"
26
+ "model": model_1,
27
+ "foreign_keys": ["qualification_types"], # e.g. ["intervention_types"]
28
+ "foreign_key_models": [model_0], # e.g. [InterventionType]
29
+ },
29
30
  }
30
31
 
32
+
31
33
  class Command(BaseCommand):
32
34
  help = """Load all .yaml files in the data/qualification directory
33
35
  into the Qualification / Qualification Type model"""
@@ -37,23 +39,18 @@ class Command(BaseCommand):
37
39
  Adds the --verbose flag to the command-line parser to enable detailed output.
38
40
  """
39
41
  parser.add_argument(
40
- '--verbose',
41
- action='store_true',
42
- help='Display verbose output',
42
+ "--verbose",
43
+ action="store_true",
44
+ help="Display verbose output",
43
45
  )
44
46
 
45
47
  def handle(self, *args, **options):
46
48
  """
47
49
  Loads data from YAML files into the QualificationType and Qualification models.
48
-
50
+
49
51
  Iterates over predefined models and imports their data from YAML files using associated metadata. Supports verbose output if enabled via command-line options.
50
52
  """
51
- verbose = options['verbose']
53
+ verbose = options["verbose"]
52
54
  for model_name in IMPORT_MODELS:
53
55
  _metadata = IMPORT_METADATA[model_name]
54
- load_model_data_from_yaml(
55
- self,
56
- model_name,
57
- _metadata,
58
- verbose
59
- )
56
+ load_model_data_from_yaml(self, model_name, _metadata, verbose)
@@ -1,46 +1,44 @@
1
- from django.conf import settings
2
1
  import os
2
+
3
+ import yaml
4
+ from django.conf import settings
3
5
  from django.core.management.base import BaseCommand
6
+
7
+ from ...data import REPORT_READER_FLAG_DATA_DIR
4
8
  from ...models import ReportReaderFlag
5
- import yaml
6
9
  from ...utils import load_model_data_from_yaml
7
- from ...data import REPORT_READER_FLAG_DATA_DIR
8
10
 
9
- SOURCE_DIR = REPORT_READER_FLAG_DATA_DIR # e.g. settings.DATA_DIR_INTERVENTION
11
+ SOURCE_DIR = REPORT_READER_FLAG_DATA_DIR # e.g. settings.DATA_DIR_INTERVENTION
10
12
 
11
13
  MODEL_0 = ReportReaderFlag
12
14
 
13
- IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
15
+ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
14
16
  MODEL_0.__name__,
15
17
  ]
16
18
 
17
19
  IMPORT_METADATA = {
18
20
  MODEL_0.__name__: {
19
- "dir": SOURCE_DIR, # e.g. "interventions"
20
- "model": MODEL_0, # e.g. Intervention
21
- "foreign_keys": [], # e.g. ["intervention_types"]
22
- "foreign_key_models": [] # e.g. [InterventionType]
21
+ "dir": SOURCE_DIR, # e.g. "interventions"
22
+ "model": MODEL_0,
23
+ "foreign_keys": [], # e.g. ["intervention_types"]
24
+ "foreign_key_models": [], # e.g. [InterventionType]
23
25
  }
24
26
  }
25
27
 
28
+
26
29
  class Command(BaseCommand):
27
30
  help = """Load all .yaml files in the data/intervention directory
28
31
  into the Intervention and InterventionType model"""
29
32
 
30
33
  def add_arguments(self, parser):
31
34
  parser.add_argument(
32
- '--verbose',
33
- action='store_true',
34
- help='Display verbose output',
35
+ "--verbose",
36
+ action="store_true",
37
+ help="Display verbose output",
35
38
  )
36
39
 
37
40
  def handle(self, *args, **options):
38
- verbose = options['verbose']
41
+ verbose = options["verbose"]
39
42
  for model_name in IMPORT_MODELS:
40
43
  _metadata = IMPORT_METADATA[model_name]
41
- load_model_data_from_yaml(
42
- self,
43
- model_name,
44
- _metadata,
45
- verbose
46
- )
44
+ load_model_data_from_yaml(self, model_name, _metadata, verbose)
@@ -1,79 +1,99 @@
1
1
  from django.core.management.base import BaseCommand
2
+
2
3
  from endoreg_db.models import (
3
- RequirementType,
4
- RequirementOperator,
5
- Requirement,
6
- RequirementSetType,
7
- RequirementSet,
8
- Examination,
9
- ExaminationIndication,
10
4
  Disease,
11
5
  DiseaseClassificationChoice,
12
6
  Event,
13
- LabValue,
7
+ Examination,
8
+ ExaminationIndication,
9
+ ExaminationRequirementSet, # Added to avoid circular import issues
14
10
  Finding,
15
11
  FindingClassification,
16
12
  FindingClassificationChoice,
17
13
  FindingIntervention,
18
14
  InformationSource,
19
- Unit,
20
- Risk,
21
- RiskType,
15
+ LabValue,
16
+ Medication, # Added Medication model
22
17
  MedicationIndication,
23
18
  MedicationIndicationType,
24
- MedicationSchedule,
25
- Medication, # Added Medication model
26
19
  MedicationIntakeTime,
20
+ MedicationSchedule,
21
+ Requirement,
22
+ RequirementOperator,
23
+ RequirementSet,
24
+ RequirementSetType,
25
+ RequirementType,
26
+ Risk,
27
+ RiskType,
27
28
  Tag,
28
- ExaminationRequirementSet, # Added to avoid circular import issues
29
+ Unit,
29
30
  )
30
31
  from endoreg_db.models.other.gender import Gender
31
- from ...utils import load_model_data_from_yaml
32
+
32
33
  from ...data import (
33
- REQUIREMENT_TYPE_DATA_DIR,
34
- REQUIREMENT_OPERATOR_DATA_DIR,
34
+ EXAMINATION_REQUIREMENT_SET_DATA_DIR,
35
35
  REQUIREMENT_DATA_DIR,
36
- REQUIREMENT_SET_TYPE_DATA_DIR,
36
+ REQUIREMENT_OPERATOR_DATA_DIR,
37
37
  REQUIREMENT_SET_DATA_DIR,
38
- EXAMINATION_REQUIREMENT_SET_DATA_DIR
38
+ REQUIREMENT_SET_TYPE_DATA_DIR,
39
+ REQUIREMENT_TYPE_DATA_DIR,
39
40
  )
40
-
41
+ from ...utils import load_model_data_from_yaml
41
42
 
42
43
  IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
43
44
  RequirementType.__name__,
44
45
  RequirementOperator.__name__,
45
46
  Requirement.__name__,
46
47
  RequirementSetType.__name__,
47
- ExaminationRequirementSet.__name__,
48
+ # ExaminationRequirementSet.__name__,
48
49
  RequirementSet.__name__,
49
50
  ]
50
51
 
52
+
53
+ def _validate_requirement_configuration(fields: dict, *, entry: dict, model):
54
+ """Ensures requirement fixtures declare both requirement_types and operators."""
55
+ name = fields.get("name") or entry.get("pk") or "<unnamed>"
56
+
57
+ def _values_missing(key: str) -> bool:
58
+ value = fields.get(key)
59
+ if not isinstance(value, list):
60
+ return True
61
+ if not value:
62
+ return True
63
+ return any(not item for item in value)
64
+
65
+ missing = [key for key in ("requirement_types", "operators") if _values_missing(key)]
66
+ if missing:
67
+ missing_display = ", ".join(missing)
68
+ raise ValueError(f"{model.__name__} '{name}' is missing required configuration for: {missing_display}.")
69
+
70
+
51
71
  IMPORT_METADATA = {
52
72
  RequirementType.__name__: {
53
73
  "dir": REQUIREMENT_TYPE_DATA_DIR, # e.g. "interventions"
54
- "model": RequirementType, # e.g. Intervention
74
+ "model": RequirementType,
55
75
  "foreign_keys": [], # e.g. ["intervention_types"]
56
76
  "foreign_key_models": [], # e.g. [InterventionType]
57
77
  },
58
78
  RequirementOperator.__name__: {
59
79
  "dir": REQUIREMENT_OPERATOR_DATA_DIR, # e.g. "interventions"
60
- "model": RequirementOperator, # e.g. Intervention
80
+ "model": RequirementOperator,
61
81
  "foreign_keys": [], # e.g. ["intervention_types"]
62
82
  "foreign_key_models": [], # e.g. [InterventionType]
63
83
  },
64
84
  ExaminationRequirementSet.__name__: {
65
85
  "dir": EXAMINATION_REQUIREMENT_SET_DATA_DIR, # e.g. "interventions"
66
- "model": ExaminationRequirementSet, # e.g. Intervention
67
- "foreign_keys": ["examinations",], # Through model uses foreign keys of both models
68
- "foreign_key_models": [Examination,],
86
+ "model": ExaminationRequirementSet,
87
+ "foreign_keys": [], # Through model uses foreign keys of both models
88
+ "foreign_key_models": [],
69
89
  },
70
90
  # ExaminationRequirementSet.__name__,
71
91
  Requirement.__name__: {
72
92
  "dir": REQUIREMENT_DATA_DIR, # e.g. "interventions"
73
- "model": Requirement, # e.g. Intervention
93
+ "model": Requirement,
74
94
  "foreign_keys": [
75
95
  "requirement_types",
76
- "operators",
96
+ "operator",
77
97
  "unit",
78
98
  "examinations",
79
99
  "examination_indications",
@@ -92,7 +112,7 @@ IMPORT_METADATA = {
92
112
  "medication_schedules",
93
113
  "medications", # Added medications
94
114
  "medication_intake_times",
95
- "genders"
115
+ "genders",
96
116
  ],
97
117
  "foreign_key_models": [
98
118
  RequirementType,
@@ -115,25 +135,27 @@ IMPORT_METADATA = {
115
135
  MedicationSchedule,
116
136
  Medication, # Added Medication model
117
137
  MedicationIntakeTime,
118
- Gender
138
+ Gender,
119
139
  ],
140
+ # "validators": [_validate_requirement_configuration],
120
141
  },
121
142
  RequirementSetType.__name__: {
122
143
  "dir": REQUIREMENT_SET_TYPE_DATA_DIR, # e.g. "interventions"
123
- "model": RequirementSetType, # e.g. Intervention
144
+ "model": RequirementSetType,
124
145
  "foreign_keys": [], # e.g. ["intervention_types"]
125
146
  "foreign_key_models": [], # e.g. [InterventionType]
126
147
  },
127
148
  RequirementSet.__name__: {
128
149
  "dir": REQUIREMENT_SET_DATA_DIR, # e.g. "interventions"
129
- "model": RequirementSet, # e.g. Intervention
150
+ "model": RequirementSet,
130
151
  "foreign_keys": [
131
152
  "requirement_set_type",
132
153
  "requirements", # This is a many-to-many field
133
154
  "links_to_sets",
134
155
  "information_sources",
135
156
  "tags",
136
- "reqset_exam_links"
157
+ "reqset_exam_links",
158
+ "depends_on",
137
159
  ], # e.g. ["intervention_types"]
138
160
  "foreign_key_models": [
139
161
  RequirementSetType,
@@ -141,7 +163,8 @@ IMPORT_METADATA = {
141
163
  RequirementSet,
142
164
  InformationSource,
143
165
  Tag,
144
- ExaminationRequirementSet
166
+ ExaminationRequirementSet,
167
+ RequirementSet,
145
168
  ], # e.g. [InterventionType]
146
169
  },
147
170
  }
@@ -155,7 +178,7 @@ class Command(BaseCommand):
155
178
  def add_arguments(self, parser):
156
179
  """
157
180
  Add command-line arguments to enable verbose output.
158
-
181
+
159
182
  Adds an optional '--verbose' flag to the command parser. When specified,
160
183
  this flag causes the command to display detailed output during execution.
161
184
  """
@@ -168,10 +191,10 @@ class Command(BaseCommand):
168
191
  def handle(self, *args, **options):
169
192
  """
170
193
  Executes data import for requirement models from YAML files.
171
-
172
- Retrieves the verbosity setting from the command options and iterates over each model
173
- listed in IMPORT_MODELS. For each model, it obtains the corresponding metadata from
174
- IMPORT_METADATA and calls a helper to load the YAML data into the database. Verbose mode
194
+
195
+ Retrieves the verbosity setting from the command options and iterates over each model
196
+ listed in IMPORT_MODELS. For each model, it obtains the corresponding metadata from
197
+ IMPORT_METADATA and calls a helper to load the YAML data into the database. Verbose mode
175
198
  enables detailed output during the process.
176
199
  """
177
200
  verbose = options["verbose"]
@@ -0,0 +1,95 @@
1
+ """
2
+ Management command to load default requirement set tags for role-based filtering.
3
+
4
+ ⚠️ DEPRECATED: This command is deprecated. Please use 'load_tag_data' instead.
5
+
6
+ The new method loads tags from YAML configuration files, making it easier to
7
+ add, modify, or remove tags without changing Python code.
8
+
9
+ New Usage:
10
+ uv run python manage.py load_tag_data --verbose
11
+
12
+ Tags are now managed in: endoreg_db/data/tag/requirement_set_tags.yaml
13
+
14
+ This command is kept for backward compatibility but may be removed in future versions.
15
+ """
16
+
17
+ import logging
18
+
19
+ from django.core.management.base import BaseCommand
20
+
21
+ from endoreg_db.models import Tag
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class Command(BaseCommand):
27
+ """
28
+ ⚠️ DEPRECATED: Load default requirement set tags for role-based filtering.
29
+
30
+ Please use 'load_tag_data' instead:
31
+ uv run python manage.py load_tag_data --verbose
32
+
33
+ This command creates or verifies the existence of default tags used
34
+ for filtering requirement sets by user role/expertise level.
35
+ """
36
+
37
+ help = "Load default requirement set tags for role-based filtering"
38
+
39
+ def handle(self, *args, **options):
40
+ """
41
+ Create or verify default tags for requirement set filtering.
42
+
43
+ Tags created:
44
+ - Gastroenterologist: For specialist-level requirements
45
+ - Student: For educational/basic requirements
46
+ - Professor: For academic/research requirements
47
+ - Terminology Expert: For terminology standardization
48
+ - Default Prototype: For baseline/reference requirements
49
+ """
50
+ default_tags = [
51
+ ("Gastroenterologist", "Specialist-level endoscopy requirements"),
52
+ ("Student", "Educational and basic learning requirements"),
53
+ ("Professor", "Academic and research-focused requirements"),
54
+ ("Terminology Expert", "Terminology standardization requirements"),
55
+ ("Default Prototype", "Baseline reference requirements"),
56
+ ]
57
+
58
+ created_count = 0
59
+ updated_count = 0
60
+
61
+ for tag_name, description in default_tags:
62
+ tag, created = Tag.objects.get_or_create(
63
+ name=tag_name,
64
+ defaults={"description": description}
65
+ if hasattr(Tag, "description")
66
+ else {},
67
+ )
68
+
69
+ if created:
70
+ created_count += 1
71
+ self.stdout.write(self.style.SUCCESS(f"✓ Created tag: {tag_name}"))
72
+ logger.info(f"Created requirement set tag: {tag_name}")
73
+ else:
74
+ updated_count += 1
75
+ self.stdout.write(f" Tag already exists: {tag_name}")
76
+
77
+ # Summary
78
+ total_tags = len(default_tags)
79
+ self.stdout.write(
80
+ self.style.SUCCESS(
81
+ f"\n{'=' * 60}\n"
82
+ f"Tag Loading Complete\n"
83
+ f"{'=' * 60}\n"
84
+ f" New tags created: {created_count}\n"
85
+ f" Existing tags found: {updated_count}\n"
86
+ f" Total tags verified: {total_tags}\n"
87
+ f"{'=' * 60}"
88
+ )
89
+ )
90
+
91
+ logger.info(
92
+ f"Requirement set tag loading complete: "
93
+ f"{created_count} created, {updated_count} existing, "
94
+ f"{total_tags} total"
95
+ )
@@ -1,8 +1,9 @@
1
1
  from django.core.management.base import BaseCommand
2
+
2
3
  from endoreg_db.models import Risk, RiskType
3
- from ...utils import load_model_data_from_yaml
4
- from ...data import RISK_DATA_DIR, RISK_TYPE_DATA_DIR
5
4
 
5
+ from ...data import RISK_DATA_DIR, RISK_TYPE_DATA_DIR
6
+ from ...utils import load_model_data_from_yaml
6
7
 
7
8
  IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
8
9
  RiskType.__name__,
@@ -12,13 +13,13 @@ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
12
13
  IMPORT_METADATA = {
13
14
  RiskType.__name__: {
14
15
  "dir": RISK_TYPE_DATA_DIR, # e.g. "interventions"
15
- "model": RiskType, # e.g. Intervention
16
+ "model": RiskType,
16
17
  "foreign_keys": [], # e.g. ["intervention_types"]
17
18
  "foreign_key_models": [], # e.g. [InterventionType]
18
19
  },
19
20
  Risk.__name__: {
20
21
  "dir": RISK_DATA_DIR, # e.g. "interventions"
21
- "model": Risk, # e.g. Intervention
22
+ "model": Risk,
22
23
  "foreign_keys": ["risk_type"], # e.g. ["intervention_types"]
23
24
  "foreign_key_models": [RiskType], # e.g. [InterventionType]
24
25
  },
@@ -32,7 +33,7 @@ class Command(BaseCommand):
32
33
  def add_arguments(self, parser):
33
34
  """
34
35
  Adds the '--verbose' flag to the argument parser for detailed output.
35
-
36
+
36
37
  This method extends the given parser by adding an option that, when specified,
37
38
  enables verbose output during command execution.
38
39
  """
@@ -45,7 +46,7 @@ class Command(BaseCommand):
45
46
  def handle(self, *args, **options):
46
47
  """
47
48
  Execute the command to load YAML data into configured models.
48
-
49
+
49
50
  Retrieves the verbosity setting from the options and iterates over each model in IMPORT_MODELS.
50
51
  For each model, it obtains the corresponding metadata from IMPORT_METADATA and calls the utility
51
52
  function load_model_data_from_yaml to load data from the associated YAML files.