endoreg-db 0.8.6.1__py3-none-any.whl → 0.8.8.0__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 (360) 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 +8 -31
  10. endoreg_db/data/_examples/disease.yaml +55 -0
  11. endoreg_db/data/_examples/disease_classification.yaml +13 -0
  12. endoreg_db/data/_examples/disease_classification_choice.yaml +62 -0
  13. endoreg_db/data/_examples/event.yaml +64 -0
  14. endoreg_db/data/_examples/examination.yaml +72 -0
  15. endoreg_db/data/_examples/finding/anatomy_colon.yaml +128 -0
  16. endoreg_db/data/_examples/finding/colonoscopy.yaml +40 -0
  17. endoreg_db/data/_examples/finding/colonoscopy_bowel_prep.yaml +56 -0
  18. endoreg_db/data/_examples/finding/complication.yaml +16 -0
  19. endoreg_db/data/_examples/finding/data.yaml +105 -0
  20. endoreg_db/data/_examples/finding/examination_setting.yaml +16 -0
  21. endoreg_db/data/_examples/finding/medication_related.yaml +18 -0
  22. endoreg_db/data/_examples/finding/outcome.yaml +12 -0
  23. endoreg_db/data/_examples/finding_classification/colonoscopy_bowel_preparation.yaml +68 -0
  24. endoreg_db/data/_examples/finding_classification/colonoscopy_jnet.yaml +22 -0
  25. endoreg_db/data/_examples/finding_classification/colonoscopy_kudo.yaml +25 -0
  26. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  27. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  28. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  29. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  30. endoreg_db/data/_examples/finding_classification/colonoscopy_location.yaml +80 -0
  31. endoreg_db/data/_examples/finding_classification/colonoscopy_lst.yaml +21 -0
  32. endoreg_db/data/_examples/finding_classification/colonoscopy_nice.yaml +20 -0
  33. endoreg_db/data/_examples/finding_classification/colonoscopy_paris.yaml +26 -0
  34. endoreg_db/data/_examples/finding_classification/colonoscopy_sano.yaml +22 -0
  35. endoreg_db/data/_examples/finding_classification/colonoscopy_summary.yaml +53 -0
  36. endoreg_db/data/_examples/finding_classification/complication_generic.yaml +25 -0
  37. endoreg_db/data/_examples/finding_classification/examination_setting_generic.yaml +40 -0
  38. endoreg_db/data/_examples/finding_classification/histology_colo.yaml +51 -0
  39. endoreg_db/data/_examples/finding_classification/intervention_required.yaml +26 -0
  40. endoreg_db/data/_examples/finding_classification/medication_related.yaml +23 -0
  41. endoreg_db/data/_examples/finding_classification/visualized.yaml +33 -0
  42. endoreg_db/data/_examples/finding_classification_choice/bowel_preparation.yaml +78 -0
  43. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
  44. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  45. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  46. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  47. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_nice.yaml +17 -0
  48. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_paris.yaml +57 -0
  49. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
  50. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  51. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
  52. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_location.yaml +229 -0
  53. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  54. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_size.yaml +82 -0
  55. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  56. endoreg_db/data/_examples/finding_classification_choice/complication_generic_types.yaml +15 -0
  57. endoreg_db/data/_examples/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  58. endoreg_db/data/_examples/finding_classification_choice/histology.yaml +24 -0
  59. endoreg_db/data/_examples/finding_classification_choice/histology_polyp.yaml +20 -0
  60. endoreg_db/data/_examples/finding_classification_choice/outcome.yaml +19 -0
  61. endoreg_db/data/_examples/finding_classification_choice/yes_no_na.yaml +11 -0
  62. endoreg_db/data/_examples/finding_classification_type/colonoscopy_basic.yaml +48 -0
  63. endoreg_db/data/_examples/finding_intervention/endoscopy.yaml +43 -0
  64. endoreg_db/data/_examples/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
  65. endoreg_db/data/_examples/finding_intervention/endoscopy_egd.yaml +128 -0
  66. endoreg_db/data/_examples/finding_intervention/endoscopy_ercp.yaml +32 -0
  67. endoreg_db/data/_examples/finding_intervention/endoscopy_eus_lower.yaml +9 -0
  68. endoreg_db/data/_examples/finding_intervention/endoscopy_eus_upper.yaml +36 -0
  69. endoreg_db/data/_examples/finding_intervention_type/endoscopy.yaml +15 -0
  70. endoreg_db/data/_examples/finding_type/data.yaml +43 -0
  71. endoreg_db/data/_examples/requirement/age.yaml +26 -0
  72. endoreg_db/data/_examples/requirement/colonoscopy_baseline_austria.yaml +45 -0
  73. endoreg_db/data/_examples/requirement/disease_cardiovascular.yaml +79 -0
  74. endoreg_db/data/_examples/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
  75. endoreg_db/data/_examples/requirement/disease_hepatology.yaml +12 -0
  76. endoreg_db/data/_examples/requirement/disease_misc.yaml +12 -0
  77. endoreg_db/data/_examples/requirement/disease_renal.yaml +96 -0
  78. endoreg_db/data/_examples/requirement/endoscopy_bleeding_risk.yaml +59 -0
  79. endoreg_db/data/_examples/requirement/event_cardiology.yaml +251 -0
  80. endoreg_db/data/_examples/requirement/event_requirements.yaml +145 -0
  81. endoreg_db/data/_examples/requirement/finding_colon_polyp.yaml +50 -0
  82. endoreg_db/data/_examples/requirement/gender.yaml +25 -0
  83. endoreg_db/data/_examples/requirement/lab_value.yaml +441 -0
  84. endoreg_db/data/_examples/requirement/medication.yaml +93 -0
  85. endoreg_db/data/_examples/requirement_operator/age.yaml +13 -0
  86. endoreg_db/data/_examples/requirement_operator/lab_operators.yaml +129 -0
  87. endoreg_db/data/_examples/requirement_operator/model_operators.yaml +96 -0
  88. endoreg_db/data/_examples/requirement_set/01_endoscopy_generic.yaml +48 -0
  89. endoreg_db/data/_examples/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  90. endoreg_db/data/_examples/yaml_examples.xlsx +0 -0
  91. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +4 -3
  92. endoreg_db/data/event_classification/data.yaml +4 -0
  93. endoreg_db/data/event_classification_choice/data.yaml +9 -0
  94. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +43 -70
  95. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +22 -52
  96. endoreg_db/data/finding_classification/colonoscopy_location.yaml +31 -62
  97. endoreg_db/data/finding_classification/histology_colo.yaml +28 -36
  98. endoreg_db/data/requirement/colon_polyp_intervention.yaml +49 -0
  99. endoreg_db/data/requirement/coloreg_colon_polyp.yaml +49 -0
  100. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +31 -12
  101. endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
  102. endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
  103. endoreg_db/data/requirement_set/90_coloreg.yaml +178 -0
  104. endoreg_db/data/requirement_set/_old_ +109 -0
  105. endoreg_db/data/requirement_set_type/data.yaml +21 -0
  106. endoreg_db/data/setup_config.yaml +4 -4
  107. endoreg_db/data/tag/requirement_set_tags.yaml +21 -0
  108. endoreg_db/exceptions.py +5 -2
  109. endoreg_db/helpers/data_loader.py +1 -1
  110. endoreg_db/management/commands/create_model_meta_from_huggingface.py +21 -10
  111. endoreg_db/management/commands/create_multilabel_model_meta.py +299 -129
  112. endoreg_db/management/commands/import_video.py +9 -10
  113. endoreg_db/management/commands/import_video_with_classification.py +1 -1
  114. endoreg_db/management/commands/init_default_ai_model.py +1 -1
  115. endoreg_db/management/commands/list_routes.py +18 -0
  116. endoreg_db/management/commands/load_center_data.py +12 -12
  117. endoreg_db/management/commands/load_requirement_data.py +60 -31
  118. endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
  119. endoreg_db/management/commands/setup_endoreg_db.py +3 -3
  120. endoreg_db/management/commands/storage_management.py +271 -203
  121. endoreg_db/migrations/0001_initial.py +1799 -1300
  122. endoreg_db/migrations/0002_requirementset_depends_on.py +18 -0
  123. endoreg_db/migrations/_old/0001_initial.py +1857 -0
  124. endoreg_db/migrations/_old/0004_employee_city_employee_post_code_employee_street_and_more.py +68 -0
  125. endoreg_db/migrations/_old/0004_remove_casetemplate_rules_and_more.py +77 -0
  126. endoreg_db/migrations/_old/0005_merge_20251111_1003.py +14 -0
  127. endoreg_db/migrations/_old/0006_sensitivemeta_anonymized_text_and_more.py +68 -0
  128. endoreg_db/migrations/_old/0007_remove_rule_attribute_dtype_remove_rule_rule_type_and_more.py +89 -0
  129. endoreg_db/migrations/_old/0008_remove_event_event_classification_and_more.py +27 -0
  130. endoreg_db/migrations/_old/0009_alter_modelmeta_options_and_more.py +21 -0
  131. endoreg_db/models/__init__.py +78 -123
  132. endoreg_db/models/administration/__init__.py +21 -42
  133. endoreg_db/models/administration/ai/active_model.py +2 -2
  134. endoreg_db/models/administration/ai/ai_model.py +7 -6
  135. endoreg_db/models/administration/case/__init__.py +1 -15
  136. endoreg_db/models/administration/case/case.py +3 -3
  137. endoreg_db/models/administration/case/case_template/__init__.py +2 -14
  138. endoreg_db/models/administration/case/case_template/case_template.py +2 -124
  139. endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
  140. endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
  141. endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
  142. endoreg_db/models/administration/center/center.py +33 -19
  143. endoreg_db/models/administration/center/center_product.py +12 -9
  144. endoreg_db/models/administration/center/center_resource.py +25 -19
  145. endoreg_db/models/administration/center/center_shift.py +21 -17
  146. endoreg_db/models/administration/center/center_waste.py +16 -8
  147. endoreg_db/models/administration/person/__init__.py +2 -0
  148. endoreg_db/models/administration/person/employee/employee.py +10 -5
  149. endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
  150. endoreg_db/models/administration/person/employee/employee_type.py +12 -6
  151. endoreg_db/models/administration/person/examiner/examiner.py +13 -11
  152. endoreg_db/models/administration/person/patient/__init__.py +2 -0
  153. endoreg_db/models/administration/person/patient/patient.py +103 -100
  154. endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
  155. endoreg_db/models/administration/person/person.py +4 -0
  156. endoreg_db/models/administration/person/profession/__init__.py +8 -4
  157. endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
  158. endoreg_db/models/administration/product/product.py +20 -15
  159. endoreg_db/models/administration/product/product_material.py +17 -18
  160. endoreg_db/models/administration/product/product_weight.py +12 -8
  161. endoreg_db/models/administration/product/reference_product.py +23 -55
  162. endoreg_db/models/administration/qualification/qualification.py +7 -3
  163. endoreg_db/models/administration/qualification/qualification_type.py +7 -3
  164. endoreg_db/models/administration/shift/scheduled_days.py +8 -5
  165. endoreg_db/models/administration/shift/shift.py +16 -12
  166. endoreg_db/models/administration/shift/shift_type.py +23 -31
  167. endoreg_db/models/label/__init__.py +7 -8
  168. endoreg_db/models/label/annotation/image_classification.py +10 -9
  169. endoreg_db/models/label/annotation/video_segmentation_annotation.py +8 -5
  170. endoreg_db/models/label/label.py +15 -15
  171. endoreg_db/models/label/label_set.py +19 -6
  172. endoreg_db/models/label/label_type.py +1 -1
  173. endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
  174. endoreg_db/models/label/label_video_segment/label_video_segment.py +76 -102
  175. endoreg_db/models/label/video_segmentation_label.py +4 -0
  176. endoreg_db/models/label/video_segmentation_labelset.py +4 -3
  177. endoreg_db/models/media/frame/frame.py +22 -22
  178. endoreg_db/models/media/pdf/raw_pdf.py +110 -182
  179. endoreg_db/models/media/pdf/report_file.py +25 -29
  180. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +30 -46
  181. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
  182. endoreg_db/models/media/video/__init__.py +1 -0
  183. endoreg_db/models/media/video/create_from_file.py +48 -56
  184. endoreg_db/models/media/video/pipe_2.py +8 -9
  185. endoreg_db/models/media/video/video_file.py +150 -108
  186. endoreg_db/models/media/video/video_file_ai.py +288 -74
  187. endoreg_db/models/media/video/video_file_anonymize.py +38 -38
  188. endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
  189. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
  190. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
  191. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
  192. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
  193. endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
  194. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
  195. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
  196. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
  197. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
  198. endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
  199. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
  200. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
  201. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
  202. endoreg_db/models/media/video/video_file_io.py +109 -62
  203. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
  204. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
  205. endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
  206. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
  207. endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
  208. endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
  209. endoreg_db/models/media/video/video_file_segments.py +24 -17
  210. endoreg_db/models/media/video/video_metadata.py +19 -35
  211. endoreg_db/models/media/video/video_processing.py +96 -95
  212. endoreg_db/models/medical/contraindication/__init__.py +13 -3
  213. endoreg_db/models/medical/disease.py +22 -16
  214. endoreg_db/models/medical/event.py +31 -18
  215. endoreg_db/models/medical/examination/__init__.py +13 -6
  216. endoreg_db/models/medical/examination/examination.py +17 -18
  217. endoreg_db/models/medical/examination/examination_indication.py +26 -25
  218. endoreg_db/models/medical/examination/examination_time.py +16 -6
  219. endoreg_db/models/medical/examination/examination_time_type.py +9 -6
  220. endoreg_db/models/medical/examination/examination_type.py +3 -4
  221. endoreg_db/models/medical/finding/finding.py +38 -39
  222. endoreg_db/models/medical/finding/finding_classification.py +37 -48
  223. endoreg_db/models/medical/finding/finding_intervention.py +27 -22
  224. endoreg_db/models/medical/finding/finding_type.py +13 -12
  225. endoreg_db/models/medical/hardware/endoscope.py +20 -26
  226. endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
  227. endoreg_db/models/medical/laboratory/lab_value.py +62 -91
  228. endoreg_db/models/medical/medication/medication.py +22 -10
  229. endoreg_db/models/medical/medication/medication_indication.py +29 -3
  230. endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
  231. endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
  232. endoreg_db/models/medical/medication/medication_schedule.py +27 -16
  233. endoreg_db/models/medical/organ/__init__.py +15 -12
  234. endoreg_db/models/medical/patient/medication_examples.py +1 -5
  235. endoreg_db/models/medical/patient/patient_disease.py +20 -23
  236. endoreg_db/models/medical/patient/patient_event.py +19 -22
  237. endoreg_db/models/medical/patient/patient_examination.py +48 -54
  238. endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
  239. endoreg_db/models/medical/patient/patient_finding.py +122 -139
  240. endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
  241. endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
  242. endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
  243. endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
  244. endoreg_db/models/medical/patient/patient_medication.py +27 -38
  245. endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
  246. endoreg_db/models/medical/risk/risk.py +7 -6
  247. endoreg_db/models/medical/risk/risk_type.py +8 -5
  248. endoreg_db/models/metadata/model_meta.py +60 -29
  249. endoreg_db/models/metadata/model_meta_logic.py +125 -18
  250. endoreg_db/models/metadata/pdf_meta.py +19 -24
  251. endoreg_db/models/metadata/sensitive_meta.py +102 -85
  252. endoreg_db/models/metadata/sensitive_meta_logic.py +192 -173
  253. endoreg_db/models/metadata/video_meta.py +51 -31
  254. endoreg_db/models/metadata/video_prediction_logic.py +16 -23
  255. endoreg_db/models/metadata/video_prediction_meta.py +29 -33
  256. endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
  257. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
  258. endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
  259. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
  260. endoreg_db/models/other/emission/emission_factor.py +18 -8
  261. endoreg_db/models/other/gender.py +10 -5
  262. endoreg_db/models/other/information_source.py +25 -25
  263. endoreg_db/models/other/material.py +9 -5
  264. endoreg_db/models/other/resource.py +6 -4
  265. endoreg_db/models/other/tag.py +10 -5
  266. endoreg_db/models/other/transport_route.py +13 -8
  267. endoreg_db/models/other/unit.py +10 -6
  268. endoreg_db/models/other/waste.py +6 -5
  269. endoreg_db/models/requirement/requirement.py +580 -272
  270. endoreg_db/models/requirement/requirement_error.py +85 -0
  271. endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
  272. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
  273. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
  274. endoreg_db/models/requirement/requirement_operator.py +36 -33
  275. endoreg_db/models/requirement/requirement_set.py +74 -57
  276. endoreg_db/models/state/__init__.py +4 -4
  277. endoreg_db/models/state/abstract.py +2 -2
  278. endoreg_db/models/state/anonymization.py +12 -0
  279. endoreg_db/models/state/audit_ledger.py +46 -47
  280. endoreg_db/models/state/label_video_segment.py +9 -0
  281. endoreg_db/models/state/raw_pdf.py +40 -46
  282. endoreg_db/models/state/sensitive_meta.py +6 -2
  283. endoreg_db/models/state/video.py +58 -53
  284. endoreg_db/models/upload_job.py +32 -55
  285. endoreg_db/models/utils.py +1 -2
  286. endoreg_db/root_urls.py +21 -2
  287. endoreg_db/serializers/__init__.py +0 -2
  288. endoreg_db/serializers/anonymization.py +18 -10
  289. endoreg_db/serializers/meta/report_meta.py +1 -1
  290. endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
  291. endoreg_db/serializers/misc/file_overview.py +11 -99
  292. endoreg_db/serializers/requirements/requirement_sets.py +92 -22
  293. endoreg_db/serializers/video/segmentation.py +2 -1
  294. endoreg_db/serializers/video/video_processing_history.py +20 -5
  295. endoreg_db/services/anonymization.py +75 -73
  296. endoreg_db/services/lookup_service.py +37 -24
  297. endoreg_db/services/pdf_import.py +166 -68
  298. endoreg_db/services/storage_aware_video_processor.py +140 -114
  299. endoreg_db/services/video_import.py +193 -283
  300. endoreg_db/urls/__init__.py +7 -20
  301. endoreg_db/urls/media.py +108 -67
  302. endoreg_db/urls/root_urls.py +29 -0
  303. endoreg_db/utils/__init__.py +15 -5
  304. endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
  305. endoreg_db/utils/case_generator/__init__.py +3 -0
  306. endoreg_db/utils/dataloader.py +88 -16
  307. endoreg_db/utils/defaults/set_default_center.py +32 -0
  308. endoreg_db/utils/names.py +22 -16
  309. endoreg_db/utils/permissions.py +2 -1
  310. endoreg_db/utils/pipelines/process_video_dir.py +1 -1
  311. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +414 -127
  312. endoreg_db/utils/setup_config.py +8 -5
  313. endoreg_db/utils/storage.py +115 -0
  314. endoreg_db/utils/validate_endo_roi.py +8 -2
  315. endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
  316. endoreg_db/views/__init__.py +0 -10
  317. endoreg_db/views/anonymization/media_management.py +198 -163
  318. endoreg_db/views/anonymization/overview.py +4 -1
  319. endoreg_db/views/anonymization/validate.py +174 -40
  320. endoreg_db/views/media/__init__.py +2 -0
  321. endoreg_db/views/media/pdf_media.py +131 -152
  322. endoreg_db/views/media/sensitive_metadata.py +46 -6
  323. endoreg_db/views/media/video_media.py +89 -82
  324. endoreg_db/views/media/video_segments.py +2 -3
  325. endoreg_db/views/meta/sensitive_meta_detail.py +0 -63
  326. endoreg_db/views/patient/patient.py +5 -4
  327. endoreg_db/views/pdf/pdf_stream.py +20 -21
  328. endoreg_db/views/pdf/reimport.py +11 -32
  329. endoreg_db/views/requirement/evaluate.py +188 -187
  330. endoreg_db/views/requirement/lookup.py +17 -3
  331. endoreg_db/views/requirement/requirement_utils.py +89 -0
  332. endoreg_db/views/video/__init__.py +0 -2
  333. endoreg_db/views/video/correction.py +2 -2
  334. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/METADATA +7 -3
  335. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/RECORD +341 -245
  336. endoreg_db/models/administration/permissions/__init__.py +0 -44
  337. endoreg_db/models/media/video/video_file_frames.py +0 -0
  338. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  339. endoreg_db/models/rule/__init__.py +0 -13
  340. endoreg_db/models/rule/rule.py +0 -27
  341. endoreg_db/models/rule/rule_applicator.py +0 -224
  342. endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
  343. endoreg_db/models/rule/rule_type.py +0 -20
  344. endoreg_db/models/rule/ruleset.py +0 -17
  345. endoreg_db/serializers/video/video_metadata.py +0 -105
  346. endoreg_db/urls/report.py +0 -48
  347. endoreg_db/urls/video.py +0 -61
  348. endoreg_db/utils/case_generator/case_generator.py +0 -159
  349. endoreg_db/utils/case_generator/utils.py +0 -30
  350. endoreg_db/views/report/__init__.py +0 -9
  351. endoreg_db/views/report/report_list.py +0 -112
  352. endoreg_db/views/report/report_with_secure_url.py +0 -28
  353. endoreg_db/views/report/start_examination.py +0 -7
  354. endoreg_db/views.py +0 -0
  355. /endoreg_db/data/{requirement_set → _examples/requirement_set}/endoscopy_bleeding_risk.yaml +0 -0
  356. /endoreg_db/migrations/{0002_add_video_correction_models.py → _old/0002_add_video_correction_models.py} +0 -0
  357. /endoreg_db/migrations/{0003_add_center_display_name.py → _old/0003_add_center_display_name.py} +0 -0
  358. /endoreg_db/{models/media/video/refactor_plan.md → views/pdf/pdf_stream_views.py} +0 -0
  359. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/WHEEL +0 -0
  360. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -75,7 +75,7 @@ class Command(BaseCommand):
75
75
  self.stdout.write("Creating default model metadata...")
76
76
 
77
77
  # Use a dummy weights file path for now - in production this should point to actual model weights
78
- dummy_weights_path = Path(__file__).parent.parent.parent / "assets" / "dummy_model.ckpt"
78
+ dummy_weights_path = Path(__file__).parent.parent.parent / "assets" / "dummy_model.safetensors"
79
79
 
80
80
  # Create the dummy weights file if it doesn't exist
81
81
  dummy_weights_path.parent.mkdir(parents=True, exist_ok=True)
@@ -0,0 +1,18 @@
1
+ from django.core.management.base import BaseCommand
2
+ from django.urls import get_resolver, URLPattern, URLResolver
3
+
4
+ def iter_patterns(prefix, patterns):
5
+ for p in patterns:
6
+ if isinstance(p, URLPattern):
7
+ yield p
8
+ elif isinstance(p, URLResolver):
9
+ yield from iter_patterns(prefix, p.url_patterns)
10
+
11
+ class Command(BaseCommand):
12
+ help = "List all URL names (useful to fill policy.py)"
13
+
14
+ def handle(self, *args, **options):
15
+ resolver = get_resolver()
16
+ for p in iter_patterns("", resolver.url_patterns):
17
+ if p.name:
18
+ self.stdout.write(p.name)
@@ -14,22 +14,22 @@ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
14
14
 
15
15
  IMPORT_METADATA = {
16
16
  FirstName.__name__: {
17
- "dir": NAMES_FIRST_DATA_DIR, # e.g. "interventions"
18
- "model": FirstName, # e.g. Intervention
19
- "foreign_keys": [], # e.g. ["intervention_types"]
20
- "foreign_key_models": [], # e.g. [InterventionType]
17
+ "dir": NAMES_FIRST_DATA_DIR, # e.g. "first names"
18
+ "model": FirstName, # e.g. first name
19
+ "foreign_keys": [],
20
+ "foreign_key_models": [],
21
21
  },
22
22
  LastName.__name__: {
23
- "dir": NAMES_LAST_DATA_DIR, # e.g. "interventions"
24
- "model": LastName, # e.g. Intervention
25
- "foreign_keys": [], # e.g. ["intervention_types"]
26
- "foreign_key_models": [], # e.g. [InterventionType]
23
+ "dir": NAMES_LAST_DATA_DIR, # e.g. "last names"
24
+ "model": LastName, # e.g. last name
25
+ "foreign_keys": [], # e.g. ["last name_types"]
26
+ "foreign_key_models": [], # e.g. [last nameType]
27
27
  },
28
28
  Center.__name__: {
29
- "dir": SOURCE_DIR, # e.g. "interventions"
30
- "model": Center, # e.g. Intervention
31
- "foreign_keys": ["first_names", "last_names"], # e.g. ["intervention_types"]
32
- "foreign_key_models": [FirstName, LastName], # e.g. [InterventionType]
29
+ "dir": SOURCE_DIR, # e.g. "centers"
30
+ "model": Center, # e.g. center
31
+ "foreign_keys": ["first_names", "last_names"],
32
+ "foreign_key_models": [FirstName, LastName],
33
33
  },
34
34
  }
35
35
 
@@ -1,43 +1,44 @@
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__,
@@ -48,6 +49,29 @@ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
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 = [
66
+ key for key in ("requirement_types", "operators") if _values_missing(key)
67
+ ]
68
+ if missing:
69
+ missing_display = ", ".join(missing)
70
+ raise ValueError(
71
+ f"{model.__name__} '{name}' is missing required configuration for: {missing_display}."
72
+ )
73
+
74
+
51
75
  IMPORT_METADATA = {
52
76
  RequirementType.__name__: {
53
77
  "dir": REQUIREMENT_TYPE_DATA_DIR, # e.g. "interventions"
@@ -64,8 +88,12 @@ IMPORT_METADATA = {
64
88
  ExaminationRequirementSet.__name__: {
65
89
  "dir": EXAMINATION_REQUIREMENT_SET_DATA_DIR, # e.g. "interventions"
66
90
  "model": ExaminationRequirementSet, # e.g. Intervention
67
- "foreign_keys": ["examinations",], # Through model uses foreign keys of both models
68
- "foreign_key_models": [Examination,],
91
+ "foreign_keys": [
92
+ "examinations",
93
+ ], # Through model uses foreign keys of both models
94
+ "foreign_key_models": [
95
+ Examination,
96
+ ],
69
97
  },
70
98
  # ExaminationRequirementSet.__name__,
71
99
  Requirement.__name__: {
@@ -92,7 +120,7 @@ IMPORT_METADATA = {
92
120
  "medication_schedules",
93
121
  "medications", # Added medications
94
122
  "medication_intake_times",
95
- "genders"
123
+ "genders",
96
124
  ],
97
125
  "foreign_key_models": [
98
126
  RequirementType,
@@ -115,8 +143,9 @@ IMPORT_METADATA = {
115
143
  MedicationSchedule,
116
144
  Medication, # Added Medication model
117
145
  MedicationIntakeTime,
118
- Gender
146
+ Gender,
119
147
  ],
148
+ # "validators": [_validate_requirement_configuration],
120
149
  },
121
150
  RequirementSetType.__name__: {
122
151
  "dir": REQUIREMENT_SET_TYPE_DATA_DIR, # e.g. "interventions"
@@ -133,7 +162,7 @@ IMPORT_METADATA = {
133
162
  "links_to_sets",
134
163
  "information_sources",
135
164
  "tags",
136
- "reqset_exam_links"
165
+ "reqset_exam_links",
137
166
  ], # e.g. ["intervention_types"]
138
167
  "foreign_key_models": [
139
168
  RequirementSetType,
@@ -141,7 +170,7 @@ IMPORT_METADATA = {
141
170
  RequirementSet,
142
171
  InformationSource,
143
172
  Tag,
144
- ExaminationRequirementSet
173
+ ExaminationRequirementSet,
145
174
  ], # e.g. [InterventionType]
146
175
  },
147
176
  }
@@ -155,7 +184,7 @@ class Command(BaseCommand):
155
184
  def add_arguments(self, parser):
156
185
  """
157
186
  Add command-line arguments to enable verbose output.
158
-
187
+
159
188
  Adds an optional '--verbose' flag to the command parser. When specified,
160
189
  this flag causes the command to display detailed output during execution.
161
190
  """
@@ -168,10 +197,10 @@ class Command(BaseCommand):
168
197
  def handle(self, *args, **options):
169
198
  """
170
199
  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
200
+
201
+ Retrieves the verbosity setting from the command options and iterates over each model
202
+ listed in IMPORT_MODELS. For each model, it obtains the corresponding metadata from
203
+ IMPORT_METADATA and calls a helper to load the YAML data into the database. Verbose mode
175
204
  enables detailed output during the process.
176
205
  """
177
206
  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
+ )
@@ -158,9 +158,9 @@ class Command(BaseCommand):
158
158
 
159
159
  self.stdout.write(self.style.SUCCESS("\n🎉 EndoReg DB embedded app setup completed successfully!"))
160
160
  self.stdout.write("\nNext steps:")
161
- self.stdout.write("1. Run migrations: python manage.py migrate")
162
- self.stdout.write("2. Create superuser: python manage.py createsuperuser")
163
- self.stdout.write("3. Start development server: python manage.py runserver")
161
+ # self.stdout.write("1. Run migrations: python manage.py migrate")
162
+ self.stdout.write("1. Create superuser: python manage.py createsuperuser")
163
+ self.stdout.write("2. Start development server: python manage.py runserver")
164
164
 
165
165
  def _find_model_weights_file(self):
166
166
  """Find the model weights file using configurable search patterns and directories."""