endoreg-db 0.8.4.4__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 (372) 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_ai_model_data.py +2 -1
  117. endoreg_db/management/commands/load_center_data.py +12 -12
  118. endoreg_db/management/commands/load_requirement_data.py +60 -31
  119. endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
  120. endoreg_db/management/commands/setup_endoreg_db.py +14 -10
  121. endoreg_db/management/commands/storage_management.py +271 -203
  122. endoreg_db/migrations/0001_initial.py +1799 -1300
  123. endoreg_db/migrations/0002_requirementset_depends_on.py +18 -0
  124. endoreg_db/migrations/_old/0001_initial.py +1857 -0
  125. endoreg_db/migrations/_old/0004_employee_city_employee_post_code_employee_street_and_more.py +68 -0
  126. endoreg_db/migrations/_old/0004_remove_casetemplate_rules_and_more.py +77 -0
  127. endoreg_db/migrations/_old/0005_merge_20251111_1003.py +14 -0
  128. endoreg_db/migrations/_old/0006_sensitivemeta_anonymized_text_and_more.py +68 -0
  129. endoreg_db/migrations/_old/0007_remove_rule_attribute_dtype_remove_rule_rule_type_and_more.py +89 -0
  130. endoreg_db/migrations/_old/0008_remove_event_event_classification_and_more.py +27 -0
  131. endoreg_db/migrations/_old/0009_alter_modelmeta_options_and_more.py +21 -0
  132. endoreg_db/models/__init__.py +78 -123
  133. endoreg_db/models/administration/__init__.py +21 -42
  134. endoreg_db/models/administration/ai/active_model.py +2 -2
  135. endoreg_db/models/administration/ai/ai_model.py +7 -6
  136. endoreg_db/models/administration/case/__init__.py +1 -15
  137. endoreg_db/models/administration/case/case.py +3 -3
  138. endoreg_db/models/administration/case/case_template/__init__.py +2 -14
  139. endoreg_db/models/administration/case/case_template/case_template.py +2 -124
  140. endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
  141. endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
  142. endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
  143. endoreg_db/models/administration/center/center.py +33 -19
  144. endoreg_db/models/administration/center/center_product.py +12 -9
  145. endoreg_db/models/administration/center/center_resource.py +25 -19
  146. endoreg_db/models/administration/center/center_shift.py +21 -17
  147. endoreg_db/models/administration/center/center_waste.py +16 -8
  148. endoreg_db/models/administration/person/__init__.py +2 -0
  149. endoreg_db/models/administration/person/employee/employee.py +10 -5
  150. endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
  151. endoreg_db/models/administration/person/employee/employee_type.py +12 -6
  152. endoreg_db/models/administration/person/examiner/examiner.py +13 -11
  153. endoreg_db/models/administration/person/patient/__init__.py +2 -0
  154. endoreg_db/models/administration/person/patient/patient.py +103 -100
  155. endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
  156. endoreg_db/models/administration/person/person.py +4 -0
  157. endoreg_db/models/administration/person/profession/__init__.py +8 -4
  158. endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
  159. endoreg_db/models/administration/product/product.py +20 -15
  160. endoreg_db/models/administration/product/product_material.py +17 -18
  161. endoreg_db/models/administration/product/product_weight.py +12 -8
  162. endoreg_db/models/administration/product/reference_product.py +23 -55
  163. endoreg_db/models/administration/qualification/qualification.py +7 -3
  164. endoreg_db/models/administration/qualification/qualification_type.py +7 -3
  165. endoreg_db/models/administration/shift/scheduled_days.py +8 -5
  166. endoreg_db/models/administration/shift/shift.py +16 -12
  167. endoreg_db/models/administration/shift/shift_type.py +23 -31
  168. endoreg_db/models/label/__init__.py +7 -8
  169. endoreg_db/models/label/annotation/image_classification.py +10 -9
  170. endoreg_db/models/label/annotation/video_segmentation_annotation.py +8 -5
  171. endoreg_db/models/label/label.py +15 -15
  172. endoreg_db/models/label/label_set.py +19 -6
  173. endoreg_db/models/label/label_type.py +1 -1
  174. endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
  175. endoreg_db/models/label/label_video_segment/label_video_segment.py +76 -102
  176. endoreg_db/models/label/video_segmentation_label.py +4 -0
  177. endoreg_db/models/label/video_segmentation_labelset.py +4 -3
  178. endoreg_db/models/media/frame/frame.py +22 -22
  179. endoreg_db/models/media/pdf/raw_pdf.py +249 -177
  180. endoreg_db/models/media/pdf/report_file.py +25 -29
  181. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +30 -46
  182. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
  183. endoreg_db/models/media/video/__init__.py +1 -0
  184. endoreg_db/models/media/video/create_from_file.py +48 -56
  185. endoreg_db/models/media/video/pipe_1.py +30 -33
  186. endoreg_db/models/media/video/pipe_2.py +8 -9
  187. endoreg_db/models/media/video/video_file.py +359 -204
  188. endoreg_db/models/media/video/video_file_ai.py +288 -74
  189. endoreg_db/models/media/video/video_file_anonymize.py +38 -38
  190. endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
  191. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
  192. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
  193. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
  194. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
  195. endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
  196. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
  197. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
  198. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
  199. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
  200. endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
  201. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
  202. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
  203. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
  204. endoreg_db/models/media/video/video_file_io.py +109 -62
  205. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
  206. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
  207. endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
  208. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
  209. endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
  210. endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
  211. endoreg_db/models/media/video/video_file_segments.py +24 -17
  212. endoreg_db/models/media/video/video_metadata.py +19 -35
  213. endoreg_db/models/media/video/video_processing.py +96 -95
  214. endoreg_db/models/medical/contraindication/__init__.py +13 -3
  215. endoreg_db/models/medical/disease.py +22 -16
  216. endoreg_db/models/medical/event.py +31 -18
  217. endoreg_db/models/medical/examination/__init__.py +13 -6
  218. endoreg_db/models/medical/examination/examination.py +17 -18
  219. endoreg_db/models/medical/examination/examination_indication.py +26 -25
  220. endoreg_db/models/medical/examination/examination_time.py +16 -6
  221. endoreg_db/models/medical/examination/examination_time_type.py +9 -6
  222. endoreg_db/models/medical/examination/examination_type.py +3 -4
  223. endoreg_db/models/medical/finding/finding.py +38 -39
  224. endoreg_db/models/medical/finding/finding_classification.py +37 -48
  225. endoreg_db/models/medical/finding/finding_intervention.py +27 -22
  226. endoreg_db/models/medical/finding/finding_type.py +13 -12
  227. endoreg_db/models/medical/hardware/endoscope.py +20 -26
  228. endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
  229. endoreg_db/models/medical/laboratory/lab_value.py +62 -91
  230. endoreg_db/models/medical/medication/medication.py +22 -10
  231. endoreg_db/models/medical/medication/medication_indication.py +29 -3
  232. endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
  233. endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
  234. endoreg_db/models/medical/medication/medication_schedule.py +27 -16
  235. endoreg_db/models/medical/organ/__init__.py +15 -12
  236. endoreg_db/models/medical/patient/medication_examples.py +1 -5
  237. endoreg_db/models/medical/patient/patient_disease.py +20 -23
  238. endoreg_db/models/medical/patient/patient_event.py +19 -22
  239. endoreg_db/models/medical/patient/patient_examination.py +48 -54
  240. endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
  241. endoreg_db/models/medical/patient/patient_finding.py +122 -139
  242. endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
  243. endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
  244. endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
  245. endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
  246. endoreg_db/models/medical/patient/patient_medication.py +27 -38
  247. endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
  248. endoreg_db/models/medical/risk/risk.py +7 -6
  249. endoreg_db/models/medical/risk/risk_type.py +8 -5
  250. endoreg_db/models/metadata/model_meta.py +60 -29
  251. endoreg_db/models/metadata/model_meta_logic.py +139 -18
  252. endoreg_db/models/metadata/pdf_meta.py +19 -24
  253. endoreg_db/models/metadata/sensitive_meta.py +102 -85
  254. endoreg_db/models/metadata/sensitive_meta_logic.py +383 -43
  255. endoreg_db/models/metadata/video_meta.py +51 -31
  256. endoreg_db/models/metadata/video_prediction_logic.py +16 -23
  257. endoreg_db/models/metadata/video_prediction_meta.py +29 -33
  258. endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
  259. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
  260. endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
  261. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
  262. endoreg_db/models/other/emission/emission_factor.py +18 -8
  263. endoreg_db/models/other/gender.py +10 -5
  264. endoreg_db/models/other/information_source.py +25 -25
  265. endoreg_db/models/other/material.py +9 -5
  266. endoreg_db/models/other/resource.py +6 -4
  267. endoreg_db/models/other/tag.py +10 -5
  268. endoreg_db/models/other/transport_route.py +13 -8
  269. endoreg_db/models/other/unit.py +10 -6
  270. endoreg_db/models/other/waste.py +6 -5
  271. endoreg_db/models/requirement/requirement.py +580 -272
  272. endoreg_db/models/requirement/requirement_error.py +85 -0
  273. endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
  274. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
  275. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
  276. endoreg_db/models/requirement/requirement_operator.py +36 -33
  277. endoreg_db/models/requirement/requirement_set.py +74 -57
  278. endoreg_db/models/state/__init__.py +4 -4
  279. endoreg_db/models/state/abstract.py +2 -2
  280. endoreg_db/models/state/anonymization.py +12 -0
  281. endoreg_db/models/state/audit_ledger.py +46 -47
  282. endoreg_db/models/state/label_video_segment.py +9 -0
  283. endoreg_db/models/state/raw_pdf.py +40 -46
  284. endoreg_db/models/state/sensitive_meta.py +6 -2
  285. endoreg_db/models/state/video.py +58 -53
  286. endoreg_db/models/upload_job.py +32 -55
  287. endoreg_db/models/utils.py +1 -2
  288. endoreg_db/root_urls.py +21 -2
  289. endoreg_db/serializers/__init__.py +26 -57
  290. endoreg_db/serializers/anonymization.py +18 -10
  291. endoreg_db/serializers/meta/report_meta.py +1 -1
  292. endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
  293. endoreg_db/serializers/misc/__init__.py +1 -1
  294. endoreg_db/serializers/misc/file_overview.py +33 -91
  295. endoreg_db/serializers/misc/{vop_patient_data.py → sensitive_patient_data.py} +1 -1
  296. endoreg_db/serializers/requirements/requirement_sets.py +92 -22
  297. endoreg_db/serializers/video/segmentation.py +2 -1
  298. endoreg_db/serializers/video/video_processing_history.py +20 -5
  299. endoreg_db/serializers/video_examination.py +198 -0
  300. endoreg_db/services/anonymization.py +75 -73
  301. endoreg_db/services/lookup_service.py +256 -73
  302. endoreg_db/services/lookup_store.py +174 -30
  303. endoreg_db/services/pdf_import.py +711 -310
  304. endoreg_db/services/storage_aware_video_processor.py +140 -114
  305. endoreg_db/services/video_import.py +266 -117
  306. endoreg_db/urls/__init__.py +27 -27
  307. endoreg_db/urls/label_video_segments.py +2 -0
  308. endoreg_db/urls/media.py +108 -66
  309. endoreg_db/urls/root_urls.py +29 -0
  310. endoreg_db/utils/__init__.py +15 -5
  311. endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
  312. endoreg_db/utils/case_generator/__init__.py +3 -0
  313. endoreg_db/utils/dataloader.py +88 -16
  314. endoreg_db/utils/defaults/set_default_center.py +32 -0
  315. endoreg_db/utils/names.py +22 -16
  316. endoreg_db/utils/permissions.py +2 -1
  317. endoreg_db/utils/pipelines/process_video_dir.py +1 -1
  318. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +414 -127
  319. endoreg_db/utils/setup_config.py +8 -5
  320. endoreg_db/utils/storage.py +115 -0
  321. endoreg_db/utils/validate_endo_roi.py +8 -2
  322. endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
  323. endoreg_db/views/__init__.py +5 -12
  324. endoreg_db/views/anonymization/media_management.py +198 -163
  325. endoreg_db/views/anonymization/overview.py +4 -1
  326. endoreg_db/views/anonymization/validate.py +174 -40
  327. endoreg_db/views/media/__init__.py +2 -0
  328. endoreg_db/views/media/pdf_media.py +131 -150
  329. endoreg_db/views/media/sensitive_metadata.py +46 -6
  330. endoreg_db/views/media/video_media.py +89 -82
  331. endoreg_db/views/media/video_segments.py +187 -260
  332. endoreg_db/views/meta/sensitive_meta_detail.py +0 -63
  333. endoreg_db/views/patient/patient.py +5 -4
  334. endoreg_db/views/pdf/__init__.py +5 -8
  335. endoreg_db/views/pdf/pdf_stream.py +186 -0
  336. endoreg_db/views/pdf/pdf_stream_views.py +0 -127
  337. endoreg_db/views/pdf/reimport.py +86 -91
  338. endoreg_db/views/requirement/evaluate.py +188 -187
  339. endoreg_db/views/requirement/lookup.py +186 -288
  340. endoreg_db/views/requirement/requirement_utils.py +89 -0
  341. endoreg_db/views/video/__init__.py +0 -4
  342. endoreg_db/views/video/correction.py +2 -2
  343. endoreg_db/views/video/video_examination_viewset.py +202 -289
  344. {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/METADATA +7 -3
  345. {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/RECORD +350 -255
  346. endoreg_db/models/administration/permissions/__init__.py +0 -44
  347. endoreg_db/models/media/video/refactor_plan.md +0 -0
  348. endoreg_db/models/media/video/video_file_frames.py +0 -0
  349. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  350. endoreg_db/models/rule/__init__.py +0 -13
  351. endoreg_db/models/rule/rule.py +0 -27
  352. endoreg_db/models/rule/rule_applicator.py +0 -224
  353. endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
  354. endoreg_db/models/rule/rule_type.py +0 -20
  355. endoreg_db/models/rule/ruleset.py +0 -17
  356. endoreg_db/serializers/video/video_metadata.py +0 -105
  357. endoreg_db/urls/report.py +0 -48
  358. endoreg_db/urls/video.py +0 -61
  359. endoreg_db/utils/case_generator/case_generator.py +0 -159
  360. endoreg_db/utils/case_generator/utils.py +0 -30
  361. endoreg_db/views/pdf/pdf_media.py +0 -239
  362. endoreg_db/views/report/__init__.py +0 -9
  363. endoreg_db/views/report/report_list.py +0 -112
  364. endoreg_db/views/report/report_with_secure_url.py +0 -28
  365. endoreg_db/views/report/start_examination.py +0 -7
  366. endoreg_db/views/video/video_media.py +0 -158
  367. endoreg_db/views.py +0 -0
  368. /endoreg_db/data/{requirement_set → _examples/requirement_set}/endoscopy_bleeding_risk.yaml +0 -0
  369. /endoreg_db/migrations/{0002_add_video_correction_models.py → _old/0002_add_video_correction_models.py} +0 -0
  370. /endoreg_db/migrations/{0003_add_center_display_name.py → _old/0003_add_center_display_name.py} +0 -0
  371. {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/WHEEL +0 -0
  372. {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,24 +1,27 @@
1
+ from logging import getLogger # Added logger
2
+ from typing import TYPE_CHECKING
3
+
1
4
  from django.db import models
2
- from typing import TYPE_CHECKING, List
3
- from logging import getLogger # Added logger
4
5
 
5
6
  # see how operator evaluation function is fetched, add to docs #TODO
6
7
  # endoreg_db/utils/requirement_operator_logic/model_evaluators.py
7
8
 
8
9
  if TYPE_CHECKING:
9
10
  from endoreg_db.utils.links.requirement_link import RequirementLinks
10
- from .requirement import Requirement # Added Requirement import for type hint
11
11
 
12
- logger = getLogger(__name__) # Added logger instance
12
+ from .requirement import Requirement # Added Requirement import for type hint
13
+
14
+ logger = getLogger(__name__) # Added logger instance
15
+
13
16
 
14
17
  class RequirementOperatorManager(models.Manager):
15
18
  def get_by_natural_key(self, name):
16
19
  """
17
20
  Retrieves a RequirementOperator instance by its unique name.
18
-
21
+
19
22
  Args:
20
23
  name: The unique name of the RequirementOperator.
21
-
24
+
22
25
  Returns:
23
26
  The RequirementOperator instance with the specified name.
24
27
  """
@@ -36,7 +39,7 @@ class RequirementOperator(models.Model):
36
39
 
37
40
  name = models.CharField(max_length=100, unique=True)
38
41
  description = models.TextField(blank=True, null=True)
39
- evaluation_function_name = models.CharField(max_length=255, blank=True, null=True) # Added field
42
+ evaluation_function_name = models.CharField(max_length=255, blank=True, null=True) # Added field
40
43
 
41
44
  objects = RequirementOperatorManager()
42
45
 
@@ -49,26 +52,28 @@ class RequirementOperator(models.Model):
49
52
  def operator_evaluation_models(self):
50
53
  """
51
54
  Returns a dictionary of operator evaluation models for this requirement operator.
52
-
55
+
53
56
  This property dynamically imports and provides access to the available operator evaluation models.
54
57
  """
55
58
  from .requirement_evaluation.operator_evaluation_models import operator_evaluation_models
59
+
56
60
  return operator_evaluation_models
57
-
61
+
58
62
  @property
59
63
  def data_model_dict(self):
60
64
  """
61
65
  Returns the dictionary of data models used for requirement evaluation.
62
-
66
+
63
67
  This property dynamically imports and provides access to the data model dictionary relevant to requirement operators.
64
68
  """
65
69
  from .requirement_evaluation.requirement_type_parser import data_model_dict
70
+
66
71
  return data_model_dict
67
72
 
68
73
  def natural_key(self):
69
74
  """
70
75
  Returns a tuple containing the operator's name as its natural key.
71
-
76
+
72
77
  The natural key uniquely identifies the requirement operator for serialization and deserialization purposes.
73
78
  """
74
79
  return (self.name,)
@@ -78,12 +83,11 @@ class RequirementOperator(models.Model):
78
83
  Returns the name of the requirement operator as its string representation.
79
84
  """
80
85
  return str(self.name)
81
-
82
- def evaluate(self, requirement_links: "RequirementLinks", input_links: "RequirementLinks", **kwargs) -> bool: # Changed signature
83
-
86
+
87
+ def evaluate(self, requirement_links: "RequirementLinks", input_links: "RequirementLinks", **kwargs) -> bool: # Changed signature
84
88
  """
85
89
  Evaluates the requirement operator against the provided requirement links and input_links.
86
-
90
+
87
91
  Args:
88
92
  requirement_links: The RequirementLinks object from the Requirement model.
89
93
  input_links: The aggregated RequirementLinks object from the input arguments.
@@ -93,7 +97,7 @@ class RequirementOperator(models.Model):
93
97
 
94
98
  Returns:
95
99
  True if the condition defined by the operator is met, False otherwise.
96
-
100
+
97
101
  Raises:
98
102
  NotImplementedError: If the evaluation logic for the operator's name is not implemented.
99
103
  """
@@ -101,36 +105,36 @@ class RequirementOperator(models.Model):
101
105
  if self.evaluation_function_name:
102
106
  eval_func = getattr(self, self.evaluation_function_name, None)
103
107
  if eval_func and callable(eval_func):
104
- return eval_func(requirement_links=requirement_links, input_links=input_links, **kwargs)
108
+ result = eval_func(requirement_links=requirement_links, input_links=input_links, **kwargs)
109
+ assert isinstance(result, bool), (
110
+ f"Evaluation function '{self.evaluation_function_name}' for operator '{self.name}' must return a boolean value."
111
+ )
112
+ return result
105
113
  else:
106
114
  logger.error(
107
- f"Evaluation function '{self.evaluation_function_name}' "
108
- f"not found or not callable on {self.__class__.__name__} "
109
- f"for operator '{self.name}'."
110
- )
111
- raise NotImplementedError(
112
- f"Evaluation function '{self.evaluation_function_name}' "
113
- f"not implemented correctly for operator '{self.name}'."
115
+ f"Evaluation function '{self.evaluation_function_name}' not found or not callable on {self.__class__.__name__} for operator '{self.name}'."
114
116
  )
117
+ raise NotImplementedError(f"Evaluation function '{self.evaluation_function_name}' not implemented correctly for operator '{self.name}'.")
115
118
  else:
116
119
  # Fallback to the central dispatcher if no specific function name is provided
117
120
  from endoreg_db.utils.requirement_operator_logic.model_evaluators import dispatch_operator_evaluation
121
+
118
122
  return dispatch_operator_evaluation(
119
123
  operator_name=self.name,
120
124
  requirement_links=requirement_links,
121
125
  input_links=input_links,
122
126
  operator_instance=self, # Pass the operator instance
123
- **kwargs
127
+ **kwargs,
124
128
  )
125
-
126
- from ..medical.patient.patient_medication import PatientMedication # Added
127
- from ..medical.medication import MedicationSchedule as MedicationScheduleTemplate # Added with alias
129
+
130
+ from ..medical.medication import MedicationSchedule as MedicationScheduleTemplate # Added with alias
131
+ from ..medical.patient.patient_medication import PatientMedication # Added
128
132
 
129
133
  def _evaluate_patient_medication_schedule_matches_template(
130
134
  self,
131
135
  requirement_links: "RequirementLinks",
132
136
  input_links: "RequirementLinks",
133
- requirement: "Requirement", # Added requirement
137
+ requirement: "Requirement", # Added requirement
134
138
  **kwargs,
135
139
  ) -> bool:
136
140
  """
@@ -158,10 +162,10 @@ class RequirementOperator(models.Model):
158
162
 
159
163
  # Check for profile match
160
164
  medication_match = pm_instance.medication == schedule_template.medication
161
- dose_match = pm_instance.dosage == schedule_template.dose
165
+ dose_match = pm_instance.dosage == schedule_template.dose
162
166
  unit_match = pm_instance.unit == schedule_template.unit
163
167
  intake_times_match = pm_intake_times_set == template_intake_times_set
164
-
168
+
165
169
  # Debugging output (optional, can be removed)
166
170
  # print(f"Comparing PM ID {pm_instance.id} with Template {schedule_template.name}:")
167
171
  # print(f" Medication: {pm_instance.medication} vs {schedule_template.medication} -> {medication_match}")
@@ -169,8 +173,7 @@ class RequirementOperator(models.Model):
169
173
  # print(f" Unit: {pm_instance.unit} vs {schedule_template.unit} -> {unit_match}")
170
174
  # print(f" Intake Times: {pm_intake_times_set} vs {template_intake_times_set} -> {intake_times_match}")
171
175
 
172
-
173
176
  if medication_match and dose_match and unit_match and intake_times_match:
174
177
  return True # Found a match
175
178
 
176
- return False # No PatientMedication matched any template
179
+ return False # No PatientMedication matched any template
@@ -1,6 +1,6 @@
1
- from django.db import models
2
1
  from typing import TYPE_CHECKING, List
3
2
 
3
+ from django.db import models
4
4
 
5
5
  REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP = {
6
6
  "all": all,
@@ -11,6 +11,7 @@ REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP = {
11
11
  "at_most_1": lambda x: sum(1 for item in x if item) <= 1,
12
12
  }
13
13
 
14
+
14
15
  class RequirementSetTypeManager(models.Manager):
15
16
  """
16
17
  Manager for RequirementSetType with custom query methods.
@@ -19,10 +20,10 @@ class RequirementSetTypeManager(models.Manager):
19
20
  def get_by_natural_key(self, name: str) -> "RequirementSetType":
20
21
  """
21
22
  Retrieves a RequirementSetType instance using its natural key.
22
-
23
+
23
24
  Args:
24
25
  name (str): The unique name that serves as the natural key.
25
-
26
+
26
27
  Returns:
27
28
  RequirementSetType: The matching RequirementSetType instance.
28
29
  """
@@ -50,7 +51,7 @@ class RequirementSetType(models.Model):
50
51
  def natural_key(self):
51
52
  """
52
53
  Return the natural key tuple for the instance.
53
-
54
+
54
55
  Returns:
55
56
  tuple: A one-element tuple containing the instance's name, used as its natural key.
56
57
  """
@@ -61,10 +62,10 @@ class RequirementSetManager(models.Manager):
61
62
  def get_by_natural_key(self, name):
62
63
  """
63
64
  Retrieves a model instance by its natural key.
64
-
65
+
65
66
  Args:
66
67
  name: The natural key value, typically corresponding to the model's unique name.
67
-
68
+
68
69
  Returns:
69
70
  The model instance whose name matches the provided natural key.
70
71
  """
@@ -82,53 +83,69 @@ class RequirementSet(models.Model):
82
83
 
83
84
  name = models.CharField(max_length=100, unique=True)
84
85
  description = models.TextField(blank=True, null=True)
85
- requirements = models.ManyToManyField( # type: ignore[assignment]
86
+
87
+ depends_on = models.ManyToManyField(
88
+ "self",
89
+ symmetrical=False,
90
+ related_name="dependents",
91
+ blank=True,
92
+ help_text=(
93
+ "Andere RequirementSets, die zuerst erfüllt sein müssen, "
94
+ "bevor dieses Set geprüft wird ('after')."
95
+ ),
96
+ )
97
+
98
+ requirements = models.ManyToManyField(
86
99
  "Requirement",
87
100
  blank=True,
88
101
  related_name="requirement_sets",
89
102
  )
90
- links_to_sets = models.ManyToManyField( # type: ignore[assignment]
103
+ links_to_sets = models.ManyToManyField(
91
104
  "RequirementSet",
92
105
  blank=True,
93
106
  related_name="links_from_sets",
94
107
  )
95
- requirement_set_type = models.ForeignKey( # type: ignore[assignment]
108
+ requirement_set_type = models.ForeignKey(
96
109
  "RequirementSetType",
97
110
  on_delete=models.CASCADE,
98
111
  related_name="requirement_sets",
99
112
  blank=True,
100
113
  null=True,
101
114
  )
102
- information_sources = models.ManyToManyField( # type: ignore[assignment]
115
+ information_sources = models.ManyToManyField(
103
116
  "InformationSource",
104
117
  related_name="requirement_sets",
105
118
  blank=True,
106
119
  )
107
-
108
- reqset_exam_links = models.ManyToManyField( # type: ignore[assignment]
120
+
121
+ reqset_exam_links = models.ManyToManyField(
109
122
  "ExaminationRequirementSet",
110
123
  related_name="requirement_set",
111
124
  blank=True,
112
125
  )
113
-
114
- tags = models.ManyToManyField( # type: ignore[assignment]
126
+
127
+ tags = models.ManyToManyField(
115
128
  "Tag",
116
129
  related_name="requirement_sets",
117
130
  blank=True,
118
131
  )
119
-
132
+
120
133
  objects = RequirementSetManager()
121
134
 
122
135
  if TYPE_CHECKING:
123
- from endoreg_db.models import Tag, Requirement, InformationSource
124
- from typing import Optional
136
+ from typing import Optional, cast
137
+
138
+ from endoreg_db.models import ExaminationRequirementSet, InformationSource, Requirement, Tag
139
+
140
+ tags = cast(models.manager.RelatedManager["Tag"], tags)
141
+ requirements = cast(models.manager.RelatedManager["Requirement"], requirements)
142
+ links_to_sets = cast(models.manager.RelatedManager["RequirementSet"], links_to_sets)
143
+ reqset_exam_links = cast(models.manager.RelatedManager["ExaminationRequirementSet"], reqset_exam_links)
144
+ information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
145
+ requirement_set_type: models.ForeignKey["RequirementSetType | None"]
125
146
 
126
- tags: "models.ManyToManyField[Tag]"
127
- requirements: "models.Manager[Requirement]"
128
- information_sources: "models.Manager[InformationSource]"
129
- requirement_set_type: Optional[RequirementSetType]
130
- links_to_sets: "models.Manager[RequirementSet]"
131
- links_from_sets: "models.Manager[RequirementSet]"
147
+ @property
148
+ def links_from_sets(self) -> "models.manager.RelatedManager[RequirementSet]": ...
132
149
 
133
150
  def natural_key(self):
134
151
  """Return the natural key as a tuple containing the instance's name."""
@@ -139,19 +156,19 @@ class RequirementSet(models.Model):
139
156
  Returns the name of the requirement set as its string representation.
140
157
  """
141
158
  return str(self.name)
142
-
159
+
143
160
  def evaluate_requirements(self, input_object, mode="loose") -> List[bool]:
144
161
  """
145
162
  Evaluates all requirements in the set against the provided input object.
146
-
163
+
147
164
  Intelligently selects the appropriate input data for each requirement based on its expected model types.
148
- For example, if a requirement expects PatientFinding but receives a PatientExamination,
165
+ For example, if a requirement expects PatientFinding but receives a PatientExamination,
149
166
  it will use the examination's patient_findings instead.
150
-
167
+
151
168
  Args:
152
169
  input_object: The object to be evaluated by each requirement.
153
170
  mode: Optional evaluation mode passed to each requirement (default is "loose").
154
-
171
+
155
172
  Returns:
156
173
  A list of boolean values indicating whether each requirement is satisfied.
157
174
  """
@@ -162,36 +179,39 @@ class RequirementSet(models.Model):
162
179
  result = requirement.evaluate(evaluation_input, mode=mode)
163
180
  results.append(result)
164
181
  return results
165
-
182
+
166
183
  def _get_evaluation_input_for_requirement(self, requirement, input_object):
167
184
  """
168
185
  Determines the appropriate input object for evaluating a specific requirement.
169
-
186
+
170
187
  Args:
171
188
  requirement: The requirement to be evaluated
172
189
  input_object: The original input object
173
-
190
+
174
191
  Returns:
175
192
  The most appropriate input object for the requirement evaluation
176
193
  """
177
194
  expected_models = requirement.expected_models
178
-
195
+
179
196
  # If the input object is already one of the expected models, use it directly
180
197
  for expected_model in expected_models:
181
198
  if isinstance(input_object, expected_model):
182
199
  return input_object
183
-
200
+
184
201
  # Import here to avoid circular imports
185
202
  from endoreg_db.models.medical.patient.patient_examination import PatientExamination
186
203
  from endoreg_db.models.medical.patient.patient_finding import PatientFinding
187
-
204
+
188
205
  # Handle PatientExamination -> PatientFinding conversion
189
206
  if isinstance(input_object, PatientExamination):
190
- # If requirement expects PatientFinding, return the examination's findings
207
+ # If the requirement expects PatientFinding instances, scope queryset to relevant findings
191
208
  if PatientFinding in expected_models:
192
- return input_object.patient_findings.all()
209
+ findings_qs = input_object.patient_findings.all()
210
+ required_findings = list(requirement.findings.all())
211
+ if required_findings:
212
+ findings_qs = findings_qs.filter(finding__in=required_findings)
213
+ return findings_qs
193
214
 
194
-
195
215
  # Handle other model conversions as needed in the future
196
216
  # For now, return the original input object as fallback
197
217
  return input_object
@@ -199,7 +219,7 @@ class RequirementSet(models.Model):
199
219
  def evaluate_requirement_sets(self, input_object) -> List[bool]:
200
220
  """
201
221
  Evaluates all linked requirement sets against the provided input object.
202
-
222
+
203
223
  Returns:
204
224
  A list of boolean values indicating whether each linked requirement set is satisfied.
205
225
  """
@@ -211,12 +231,12 @@ class RequirementSet(models.Model):
211
231
  result = linked_set.evaluate(input_object)
212
232
  results.append(result)
213
233
  return results
214
-
234
+
215
235
  @property
216
236
  def eval_function(self):
217
237
  """
218
238
  Returns the evaluation function associated with this requirement set's type.
219
-
239
+
220
240
  If the requirement set type is defined and matches a known type, returns the corresponding function from REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP. Returns None if no matching function is found.
221
241
  """
222
242
  if self.requirement_set_type and self.requirement_set_type.name in REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP:
@@ -226,12 +246,12 @@ class RequirementSet(models.Model):
226
246
  def evaluate(self, input_object):
227
247
  """
228
248
  Evaluates whether the input object satisfies this requirement set.
229
-
249
+
230
250
  Combines the evaluation results of all direct requirements and linked requirement sets, then applies the set's evaluation function (such as all, any, none, etc.) to determine if the input object meets the overall criteria.
231
-
251
+
232
252
  Args:
233
253
  input_object: The object to be evaluated against the requirements and linked sets.
234
-
254
+
235
255
  Returns:
236
256
  True if the input object satisfies the requirement set according to its evaluation logic; otherwise, False.
237
257
  """
@@ -243,45 +263,42 @@ class RequirementSet(models.Model):
243
263
  eval_result = self.eval_function(results) if self.eval_function else all(results)
244
264
 
245
265
  return eval_result
246
-
266
+
247
267
  @property
248
268
  def all_linked_sets(self):
249
269
  """
250
270
  Returns all linked requirement sets, including those linked to the current set and those linked to any of its linked sets.
251
-
271
+
252
272
  Uses recursive traversal with cycle detection to safely handle circular relationships.
253
273
  Eliminates duplicates by tracking visited sets.
254
-
274
+
255
275
  Returns:
256
276
  List[RequirementSet]: A list of all linked requirement sets.
257
277
  """
258
278
  visited = set()
259
- result:List["RequirementSet"] = []
260
-
261
- def _collect_linked_sets(requirement_set:"RequirementSet"):
279
+ result: List["RequirementSet"] = []
280
+
281
+ def _collect_linked_sets(requirement_set: "RequirementSet"):
262
282
  """
263
283
  Recursively collect linked sets while avoiding cycles and duplicates.
264
-
284
+
265
285
  Args:
266
286
  requirement_set: The RequirementSet to process
267
287
  """
268
288
  # Use the primary key to track visited sets (avoids issues with object comparison)
269
289
  if requirement_set.pk in visited:
270
290
  return
271
-
291
+
272
292
  visited.add(requirement_set.pk)
273
-
293
+
274
294
  # Process all directly linked sets
275
295
  for linked_set in requirement_set.links_to_sets.all():
276
296
  if linked_set.pk not in visited:
277
297
  result.append(linked_set)
278
298
  # Recursively process the linked set's links
279
299
  _collect_linked_sets(linked_set)
280
-
300
+
281
301
  # Start the recursive collection from this instance
282
302
  _collect_linked_sets(self)
283
-
284
- return result
285
-
286
-
287
303
 
304
+ return result
@@ -1,12 +1,12 @@
1
- from .sensitive_meta import SensitiveMetaState
2
- from .video import VideoState, AnonymizationStatus
3
1
  from .label_video_segment import LabelVideoSegmentState
4
2
  from .raw_pdf import RawPdfState
5
-
3
+ from .sensitive_meta import SensitiveMetaState
4
+ from .video import VideoState
5
+ from .anonymization import AnonymizationState
6
6
  __all__ = [
7
7
  "SensitiveMetaState",
8
8
  "VideoState",
9
9
  "LabelVideoSegmentState",
10
- "AnonymizationStatus",
10
+ "AnonymizationState",
11
11
  "RawPdfState",
12
12
  ]
@@ -1,11 +1,11 @@
1
1
  from django.db import models
2
2
 
3
+
3
4
  class AbstractState(models.Model):
4
5
  """Abstract base class for all states."""
5
6
 
6
7
  created_at = models.DateTimeField(auto_now_add=True)
7
8
  updated_at = models.DateTimeField(auto_now=True)
8
9
 
9
-
10
10
  class Meta:
11
- abstract = True
11
+ abstract = True
@@ -0,0 +1,12 @@
1
+ from enum import Enum
2
+
3
+
4
+ class AnonymizationState(str, Enum):
5
+ NOT_STARTED = "not_started"
6
+ EXTRACTING_FRAMES = "extracting_frames"
7
+ PROCESSING_ANONYMIZING = "processing_anonymization"
8
+ DONE_PROCESSING_ANONYMIZATION = "done_processing_anonymization"
9
+ VALIDATED = "validated"
10
+ FAILED = "failed"
11
+ STARTED = "started"
12
+ ANONYMIZED = "anonymized"