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
@@ -1,12 +1,14 @@
1
- from django.db import models
2
1
  from typing import TYPE_CHECKING
3
2
 
3
+ from django.db import models
4
+
4
5
  if TYPE_CHECKING:
5
- from .center import Center
6
+ from ...other.emission import EmissionFactor
6
7
  from ...other.resource import Resource
7
8
  from ...other.unit import Unit
8
- from ...other.emission import EmissionFactor
9
-
9
+ from .center import Center
10
+
11
+
10
12
  class CenterResource(models.Model):
11
13
  name = models.CharField(max_length=255, null=True)
12
14
  center = models.ForeignKey(
@@ -16,34 +18,38 @@ class CenterResource(models.Model):
16
18
  )
17
19
  quantity = models.FloatField()
18
20
  resource = models.ForeignKey("Resource", on_delete=models.CASCADE)
19
- transport_emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True,
20
- related_name="center_resource_transport_emission_factor")
21
- use_emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True,
22
- related_name="center_resource_use_emission_factor")
21
+ transport_emission_factor = models.ForeignKey(
22
+ "EmissionFactor", on_delete=models.SET_NULL, null=True, related_name="center_resource_transport_emission_factor"
23
+ )
24
+ use_emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True, related_name="center_resource_use_emission_factor")
23
25
  year = models.IntegerField()
24
26
  unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
25
-
27
+
26
28
  if TYPE_CHECKING:
27
- center: "Center"
28
- resource: "Resource"
29
- transport_emission_factor: "EmissionFactor"
30
- use_emission_factor: "EmissionFactor"
31
- unit: "Unit"
29
+ center: models.ForeignKey["Center"]
30
+ resource: models.ForeignKey["Resource"]
31
+ transport_emission_factor: models.ForeignKey["EmissionFactor|None"]
32
+ use_emission_factor: models.ForeignKey["EmissionFactor|None"]
33
+ unit: models.ForeignKey["Unit|None"]
32
34
 
33
35
  def __str__(self):
34
- result_string = ""
36
+ return f"CenterResource {self.pk} - {self.name if self.name else 'No Name'}"
35
37
 
36
- if self.name is not None:
37
- result_string += self.name + ":\n"
38
+ def display_str(self) -> str:
39
+ """Return a verbose description of the center resource."""
40
+ result_string = f"{self.name}:\n"
38
41
 
39
42
  result_string += "\tCenter\t-\t" + str(self.center) + "\n"
40
43
  result_string += "\tResource\t-\t" + str(self.resource) + "\n"
41
44
  result_string += "\tQuantity\t-\t" + str(self.quantity) + "\n"
42
45
  result_string += "\tYear\t-\t" + str(self.year) + "\n"
43
46
  result_string += "\tUnit\t-\t" + str(self.unit) + "\n"
44
- result_string += "\tTransport Emission Factor\t-\t" + str(self.transport_emission_factor) + "\n"
47
+
48
+ if self.transport_emission_factor is not None:
49
+ result_string += "\tTransport Emission Factor\t-\t" + str(self.transport_emission_factor) + "\n"
50
+
45
51
  result_string += "\tUse Emission Factor\t-\t" + str(self.use_emission_factor) + "\n"
46
52
 
47
53
  result_string += "\n"
48
54
 
49
- return result_string
55
+ return result_string
@@ -1,30 +1,35 @@
1
+ from decimal import Decimal
2
+ from typing import TYPE_CHECKING, cast
3
+
1
4
  from django.db import models
2
- from typing import TYPE_CHECKING
3
5
 
4
6
  if TYPE_CHECKING:
5
7
  from endoreg_db.models import (
6
8
  Center,
7
- Shift,
8
9
  ScheduledDays,
10
+ Shift,
9
11
  )
10
12
 
13
+
11
14
  class CenterShiftManager(models.Manager):
12
15
  def get_by_natural_key(self, name):
13
16
  """
14
17
  Retrieves a CenterShift instance by its unique name.
15
-
18
+
16
19
  Args:
17
20
  name: The unique identifier of the CenterShift.
18
-
21
+
19
22
  Returns:
20
23
  The CenterShift instance with the specified name.
21
24
  """
22
25
  return self.get(name=name)
23
26
 
27
+
24
28
  class CenterShift(models.Model):
25
29
  """
26
30
  Model representing a center shift.
27
31
  """
32
+
28
33
  name = models.CharField(max_length=255, unique=True)
29
34
  description = models.TextField(blank=True, null=True)
30
35
 
@@ -46,43 +51,42 @@ class CenterShift(models.Model):
46
51
  related_name="center_shifts",
47
52
  )
48
53
 
49
- #TODO add validator; the value should be between 0 and 1
54
+ # TODO add validator; the value should be between 0 and 1
50
55
  estimated_presence_fraction = models.DecimalField(
51
56
  max_digits=5,
52
57
  decimal_places=4,
53
- default=0.0,
58
+ default=Decimal("0"),
54
59
  )
55
60
 
56
61
  if TYPE_CHECKING:
57
- center: "Center"
58
- shift: "Shift"
59
- scheduled_days: models.QuerySet["ScheduledDays"]
62
+ center: models.ForeignKey["Center"]
63
+ shift: models.ForeignKey["Shift"]
64
+ scheduled_days = cast(models.manager.RelatedManager["ScheduledDays"], scheduled_days)
60
65
 
61
66
  def __str__(self):
62
67
  """
63
68
  Returns a string representation of the center shift, combining the center and shift.
64
69
  """
65
70
  return f"{self.center} - {self.shift}"
66
-
71
+
67
72
  def initialize_scheduled_days(self):
68
73
  # shift_types
69
74
  """
70
75
  Initializes scheduled days for the center shift.
71
-
76
+
72
77
  This method is a placeholder and does not perform any actions.
73
78
  """
74
79
  pass
75
-
76
- def get_scheduled_days(self, infer = True):
80
+
81
+ def get_scheduled_days(self, infer=True):
77
82
  """
78
83
  Retrieves the scheduled days associated with this center shift.
79
-
84
+
80
85
  If no scheduled days are found and `infer` is False, raises a ValueError. Otherwise, returns the queryset of scheduled days, which may be empty.
81
86
  """
82
87
  sd = self.scheduled_days.all()
83
88
  if not sd.exists():
84
89
  if not infer:
85
90
  raise ValueError("No scheduled days found for this center shift.")
86
-
87
-
88
- return sd
91
+
92
+ return sd
@@ -1,12 +1,14 @@
1
- from django.db import models
2
1
  from typing import TYPE_CHECKING
3
2
 
3
+ from django.db import models
4
+
4
5
  if TYPE_CHECKING:
5
- from .center import Center
6
- from ...other.waste import Waste
7
- from ...other.unit import Unit
8
6
  from ...other.emission import EmissionFactor
9
-
7
+ from ...other.unit import Unit
8
+ from ...other.waste import Waste
9
+ from .center import Center
10
+
11
+
10
12
  class CenterWaste(models.Model):
11
13
  center: models.ForeignKey["Center"] = models.ForeignKey(
12
14
  "Center",
@@ -16,9 +18,15 @@ class CenterWaste(models.Model):
16
18
  year = models.IntegerField()
17
19
  waste: models.ForeignKey["Waste"] = models.ForeignKey("Waste", on_delete=models.CASCADE)
18
20
  quantity = models.FloatField()
19
- unit: models.ForeignKey["Unit"] = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
20
- emission_factor: models.ForeignKey["EmissionFactor"] = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
21
-
21
+ unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
22
+ emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
23
+
24
+ if TYPE_CHECKING:
25
+ center: models.ForeignKey["Center"]
26
+ waste: models.ForeignKey["Waste"]
27
+ unit: models.ForeignKey["Unit|None"]
28
+ emission_factor: models.ForeignKey["EmissionFactor|None"]
29
+
22
30
  def __str__(self) -> str:
23
31
  """
24
32
  Returns a formatted string summarizing the waste record, including quantity, unit,
@@ -1,6 +1,7 @@
1
1
  from .person import Person
2
2
  from .patient import (
3
3
  Patient,
4
+ PatientExternalID,
4
5
  )
5
6
  from .examiner import Examiner
6
7
  from .user.portal_user_information import PortalUserInfo
@@ -13,6 +14,7 @@ from .employee import Employee, EmployeeType, EmployeeQualification
13
14
  __all__ = [
14
15
  "Person",
15
16
  "Patient",
17
+ "PatientExternalID",
16
18
  "Examiner",
17
19
  "PortalUserInfo",
18
20
  "FirstName",
@@ -1,16 +1,21 @@
1
- from django.db import models
2
1
  from typing import TYPE_CHECKING
2
+
3
+ from django.db import models
4
+
3
5
  from ..person import Person
6
+
4
7
  if TYPE_CHECKING:
5
8
  from endoreg_db.models import (
6
- EmployeeType,
7
9
  EmployeeQualification,
10
+ EmployeeType,
8
11
  )
9
12
 
13
+
10
14
  class Employee(Person):
11
15
  """
12
16
  Model representing an employee.
13
17
  """
18
+
14
19
  employee_type = models.ForeignKey(
15
20
  "EmployeeType",
16
21
  on_delete=models.CASCADE,
@@ -18,9 +23,9 @@ class Employee(Person):
18
23
  )
19
24
 
20
25
  if TYPE_CHECKING:
21
- employee_type: "EmployeeType"
22
- qualification: "EmployeeQualification"
23
-
26
+ employee_type: models.ForeignKey["EmployeeType"]
27
+ # qualification is a OneToOneField defined in the EmployeeQualification model
28
+ qualification: models.OneToOneField["EmployeeQualification"]
24
29
 
25
30
  def __str__(self):
26
31
  """
@@ -1,16 +1,21 @@
1
+ from typing import TYPE_CHECKING, cast
2
+
1
3
  from django.db import models
2
4
 
3
- from typing import TYPE_CHECKING
4
5
  if TYPE_CHECKING:
6
+ from django.db.models.manager import RelatedManager
7
+
5
8
  from endoreg_db.models import (
6
9
  Employee,
7
10
  Qualification,
8
11
  )
9
12
 
13
+
10
14
  class EmployeeQualification(models.Model):
11
15
  """
12
16
  Model representing an employee's qualification.
13
17
  """
18
+
14
19
  employee = models.OneToOneField(
15
20
  "Employee",
16
21
  on_delete=models.CASCADE,
@@ -23,12 +28,12 @@ class EmployeeQualification(models.Model):
23
28
 
24
29
  if TYPE_CHECKING:
25
30
  employee: models.ForeignKey["Employee"]
26
- qualifications: models.QuerySet["Qualification"]
31
+ qualifications = cast(RelatedManager[Qualification], qualifications)
27
32
 
28
33
  def __str__(self):
29
34
  """
30
35
  Returns a human-readable string summarizing the employee and their qualifications.
31
-
36
+
32
37
  If the employee has qualifications, lists them separated by commas; otherwise, indicates that no qualifications are assigned.
33
38
  """
34
39
  qualification_list = self.qualifications.all()
@@ -36,4 +41,4 @@ class EmployeeQualification(models.Model):
36
41
  # Assuming Qualification model has a decent __str__ representation
37
42
  qual_names = ", ".join(str(q) for q in qualification_list)
38
43
  return f"{self.employee} - Qualifications: {qual_names}"
39
- return f"{self.employee} - No qualifications assigned"
44
+ return f"{self.employee} - No qualifications assigned"
@@ -1,25 +1,29 @@
1
+ from typing import TYPE_CHECKING, cast
2
+
1
3
  from django.db import models
2
- from typing import TYPE_CHECKING
3
4
 
4
5
  if TYPE_CHECKING:
5
6
  from endoreg_db.models import (
6
- Qualification,
7
7
  Employee,
8
+ Qualification,
8
9
  )
9
10
 
11
+
10
12
  class EmployeeTypeManager(models.Manager):
11
13
  def get_queryset(self):
12
14
  """
13
15
  Returns a queryset of active employee types.
14
-
16
+
15
17
  Only employee types with is_active set to True are included in the queryset.
16
18
  """
17
19
  return super().get_queryset().filter(is_active=True)
18
-
20
+
21
+
19
22
  class EmployeeType(models.Model):
20
23
  """
21
24
  Model representing an employee type.
22
25
  """
26
+
23
27
  name = models.CharField(max_length=255, unique=True)
24
28
  description = models.TextField(blank=True, null=True)
25
29
  is_active = models.BooleanField(default=True)
@@ -30,8 +34,10 @@ class EmployeeType(models.Model):
30
34
  )
31
35
 
32
36
  if TYPE_CHECKING:
33
- qualifications: models.QuerySet["Qualification"]
34
- employees: models.QuerySet["Employee"]
37
+ qualifications = cast(models.manager.RelatedManager["Qualification"], qualifications)
38
+
39
+ @property
40
+ def employees(self) -> models.QuerySet["Employee"]: ...
35
41
 
36
42
  objects = EmployeeTypeManager()
37
43
 
@@ -1,20 +1,23 @@
1
- from django.db import models
2
- from ..person import Person
3
- from endoreg_db.utils import get_examiner_hash, create_mock_examiner_name
4
1
  from typing import TYPE_CHECKING
5
2
 
3
+ from django.db import models
4
+
5
+ from endoreg_db.utils import create_mock_examiner_name, get_examiner_hash
6
+
6
7
  from ....utils import DJANGO_NAME_SALT
8
+ from ..person import Person
9
+
7
10
  if TYPE_CHECKING:
8
11
  from endoreg_db.models import administration
12
+
13
+
9
14
  class Examiner(Person):
10
- center = models.ForeignKey(
11
- "Center", on_delete=models.CASCADE, blank=True, null=True
12
- )
15
+ center = models.ForeignKey("Center", on_delete=models.CASCADE, blank=True, null=True)
13
16
  hash = models.CharField(max_length=255, unique=True)
14
17
 
15
18
  if TYPE_CHECKING:
16
- center: "administration.Center"
17
- portal_user_info: "administration.PortalUserInfo"
19
+ center: models.ForeignKey["administration.Center|None"]
20
+ portal_user_info: models.OneToOneField["administration.PortalUserInfo"]
18
21
 
19
22
  def __str__(self):
20
23
  return self.first_name + " " + self.last_name
@@ -28,11 +31,10 @@ class Examiner(Person):
28
31
 
29
32
  if isinstance(first_name, FirstName):
30
33
  first_name = str(first_name.name)
31
-
34
+
32
35
  if isinstance(last_name, LastName):
33
36
  last_name = str(last_name.name)
34
37
 
35
-
36
38
  real_hash = get_examiner_hash(
37
39
  first_name=first_name,
38
40
  last_name=last_name,
@@ -42,7 +44,7 @@ class Examiner(Person):
42
44
 
43
45
  if substitute_names:
44
46
  name_tuple = create_mock_examiner_name()
45
-
47
+
46
48
  else:
47
49
  name_tuple = (first_name, last_name)
48
50
  defaults = dict(
@@ -1,5 +1,7 @@
1
1
  from .patient import Patient
2
+ from .patient_external_id import PatientExternalID
2
3
 
3
4
  __all__ = [
4
5
  "Patient",
6
+ "PatientExternalID",
5
7
  ]