endoreg-db 0.8.6.1__py3-none-any.whl → 0.8.8.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of endoreg-db might be problematic. Click here for more details.

Files changed (503) hide show
  1. endoreg_db/authz/auth.py +74 -0
  2. endoreg_db/authz/backends.py +168 -0
  3. endoreg_db/authz/management/commands/list_routes.py +18 -0
  4. endoreg_db/authz/middleware.py +83 -0
  5. endoreg_db/authz/permissions.py +127 -0
  6. endoreg_db/authz/policy.py +218 -0
  7. endoreg_db/authz/views_auth.py +66 -0
  8. endoreg_db/config/env.py +13 -8
  9. endoreg_db/data/__init__.py +2 -11
  10. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +3 -3
  11. endoreg_db/data/event_classification/data.yaml +4 -0
  12. endoreg_db/data/event_classification_choice/data.yaml +9 -0
  13. endoreg_db/data/examination/examinations/data.yaml +114 -14
  14. endoreg_db/data/examination/time-type/data.yaml +0 -3
  15. endoreg_db/data/examination_indication/endoscopy.yaml +108 -173
  16. endoreg_db/data/examination_indication_classification/endoscopy.yaml +0 -70
  17. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +33 -37
  18. endoreg_db/data/finding/00_generic.yaml +35 -0
  19. endoreg_db/data/finding/00_generic_complication.yaml +9 -0
  20. endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
  21. endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
  22. endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
  23. endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
  24. endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
  25. endoreg_db/data/finding_classification/00_generic.yaml +44 -0
  26. endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
  27. endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
  28. endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
  29. endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
  30. endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
  31. endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
  32. endoreg_db/data/finding_classification_choice/{yes_no_na.yaml → 00_generic.yaml} +5 -1
  33. endoreg_db/data/finding_classification_choice/{examination_setting_generic_types.yaml → 00_generic_baseline.yaml} +10 -2
  34. endoreg_db/data/finding_classification_choice/{complication_generic_types.yaml → 00_generic_complication.yaml} +1 -1
  35. endoreg_db/data/finding_classification_choice/{histology.yaml → 00_generic_histology.yaml} +1 -4
  36. endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
  37. endoreg_db/data/finding_classification_choice/{bowel_preparation.yaml → 02_colonoscopy_bowel_preparation.yaml} +1 -30
  38. endoreg_db/data/finding_classification_choice/{colonoscopy_not_complete_reason.yaml → 02_colonoscopy_generic.yaml} +1 -1
  39. endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
  40. endoreg_db/data/finding_classification_choice/{colonoscopy_location.yaml → 02_colonoscopy_location.yaml} +23 -4
  41. endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
  42. endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
  43. endoreg_db/data/finding_classification_choice/{colon_lesion_paris.yaml → 02_colonoscopy_polyp_morphology.yaml} +26 -8
  44. endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
  45. endoreg_db/data/finding_classification_type/{colonoscopy_basic.yaml → 00_generic.yaml} +18 -13
  46. endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
  47. endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
  48. endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
  49. endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
  50. endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
  51. endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
  52. endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
  53. endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
  54. endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
  55. endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
  56. endoreg_db/data/finding_type/data.yaml +8 -12
  57. endoreg_db/data/requirement/01_patient_data.yaml +93 -0
  58. endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
  59. endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
  60. endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
  61. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +29 -12
  62. endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
  63. endoreg_db/data/requirement_set/{endoscopy_bleeding_risk.yaml → 02_endoscopy_bleeding_risk.yaml} +0 -6
  64. endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
  65. endoreg_db/data/requirement_set/_old_ +109 -0
  66. endoreg_db/data/requirement_set_type/data.yaml +21 -0
  67. endoreg_db/data/setup_config.yaml +4 -4
  68. endoreg_db/data/tag/requirement_set_tags.yaml +21 -0
  69. endoreg_db/exceptions.py +4 -2
  70. endoreg_db/forms/examination_form.py +1 -1
  71. endoreg_db/helpers/data_loader.py +125 -53
  72. endoreg_db/helpers/default_objects.py +116 -81
  73. endoreg_db/import_files/__init__.py +27 -0
  74. endoreg_db/import_files/context/__init__.py +7 -0
  75. endoreg_db/import_files/context/default_sensitive_meta.py +81 -0
  76. endoreg_db/import_files/context/ensure_center.py +17 -0
  77. endoreg_db/import_files/context/file_lock.py +66 -0
  78. endoreg_db/import_files/context/import_context.py +43 -0
  79. endoreg_db/import_files/context/validate_directories.py +56 -0
  80. endoreg_db/import_files/file_storage/__init__.py +15 -0
  81. endoreg_db/import_files/file_storage/create_report_file.py +76 -0
  82. endoreg_db/import_files/file_storage/create_video_file.py +75 -0
  83. endoreg_db/import_files/file_storage/sensitive_meta_storage.py +39 -0
  84. endoreg_db/import_files/file_storage/state_management.py +400 -0
  85. endoreg_db/import_files/file_storage/storage.py +36 -0
  86. endoreg_db/import_files/import_service.md +26 -0
  87. endoreg_db/import_files/processing/__init__.py +11 -0
  88. endoreg_db/import_files/processing/report_processing/report_anonymization.py +94 -0
  89. endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
  90. endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
  91. endoreg_db/import_files/processing/video_processing/video_cleanup_on_error.py +119 -0
  92. endoreg_db/import_files/pseudonymization/fake.py +52 -0
  93. endoreg_db/import_files/pseudonymization/k_anonymity.py +182 -0
  94. endoreg_db/import_files/pseudonymization/k_pseudonymity.py +128 -0
  95. endoreg_db/import_files/report_import_service.py +141 -0
  96. endoreg_db/import_files/video_import_service.py +150 -0
  97. endoreg_db/management/commands/create_model_meta_from_huggingface.py +21 -10
  98. endoreg_db/management/commands/create_multilabel_model_meta.py +299 -129
  99. endoreg_db/management/commands/import_report.py +130 -65
  100. endoreg_db/management/commands/import_video.py +9 -10
  101. endoreg_db/management/commands/import_video_with_classification.py +2 -2
  102. endoreg_db/management/commands/list_routes.py +18 -0
  103. endoreg_db/management/commands/load_ai_model_data.py +5 -5
  104. endoreg_db/management/commands/load_ai_model_label_data.py +9 -7
  105. endoreg_db/management/commands/load_base_db_data.py +5 -134
  106. endoreg_db/management/commands/load_center_data.py +12 -12
  107. endoreg_db/management/commands/load_contraindication_data.py +14 -16
  108. endoreg_db/management/commands/load_disease_classification_choices_data.py +15 -18
  109. endoreg_db/management/commands/load_disease_classification_data.py +15 -18
  110. endoreg_db/management/commands/load_disease_data.py +25 -28
  111. endoreg_db/management/commands/load_endoscope_data.py +20 -27
  112. endoreg_db/management/commands/load_event_data.py +14 -16
  113. endoreg_db/management/commands/load_examination_data.py +31 -44
  114. endoreg_db/management/commands/load_examination_indication_data.py +20 -21
  115. endoreg_db/management/commands/load_finding_data.py +52 -80
  116. endoreg_db/management/commands/load_information_source.py +21 -23
  117. endoreg_db/management/commands/load_lab_value_data.py +17 -26
  118. endoreg_db/management/commands/load_medication_data.py +13 -12
  119. endoreg_db/management/commands/load_organ_data.py +15 -19
  120. endoreg_db/management/commands/load_pdf_type_data.py +19 -18
  121. endoreg_db/management/commands/load_profession_data.py +14 -17
  122. endoreg_db/management/commands/load_qualification_data.py +20 -23
  123. endoreg_db/management/commands/load_report_reader_flag_data.py +17 -19
  124. endoreg_db/management/commands/load_requirement_data.py +62 -39
  125. endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
  126. endoreg_db/management/commands/load_risk_data.py +7 -6
  127. endoreg_db/management/commands/load_shift_data.py +20 -23
  128. endoreg_db/management/commands/load_tag_data.py +8 -11
  129. endoreg_db/management/commands/load_unit_data.py +17 -19
  130. endoreg_db/management/commands/setup_endoreg_db.py +3 -3
  131. endoreg_db/management/commands/start_filewatcher.py +46 -37
  132. endoreg_db/management/commands/storage_management.py +271 -203
  133. endoreg_db/management/commands/validate_video_files.py +1 -5
  134. endoreg_db/migrations/0001_initial.py +297 -250
  135. endoreg_db/models/__init__.py +78 -123
  136. endoreg_db/models/administration/__init__.py +21 -42
  137. endoreg_db/models/administration/ai/active_model.py +2 -2
  138. endoreg_db/models/administration/ai/ai_model.py +7 -6
  139. endoreg_db/models/administration/case/__init__.py +1 -15
  140. endoreg_db/models/administration/case/case.py +3 -3
  141. endoreg_db/models/administration/case/case_template/__init__.py +2 -14
  142. endoreg_db/models/administration/case/case_template/case_template.py +2 -124
  143. endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
  144. endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
  145. endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
  146. endoreg_db/models/administration/center/center.py +33 -19
  147. endoreg_db/models/administration/center/center_product.py +12 -9
  148. endoreg_db/models/administration/center/center_resource.py +25 -19
  149. endoreg_db/models/administration/center/center_shift.py +21 -17
  150. endoreg_db/models/administration/center/center_waste.py +16 -8
  151. endoreg_db/models/administration/person/__init__.py +2 -0
  152. endoreg_db/models/administration/person/employee/employee.py +10 -5
  153. endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
  154. endoreg_db/models/administration/person/employee/employee_type.py +12 -6
  155. endoreg_db/models/administration/person/examiner/examiner.py +13 -11
  156. endoreg_db/models/administration/person/patient/__init__.py +2 -0
  157. endoreg_db/models/administration/person/patient/patient.py +129 -100
  158. endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
  159. endoreg_db/models/administration/person/person.py +4 -0
  160. endoreg_db/models/administration/person/profession/__init__.py +8 -4
  161. endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
  162. endoreg_db/models/administration/product/product.py +20 -15
  163. endoreg_db/models/administration/product/product_material.py +17 -18
  164. endoreg_db/models/administration/product/product_weight.py +12 -8
  165. endoreg_db/models/administration/product/reference_product.py +23 -55
  166. endoreg_db/models/administration/qualification/qualification.py +7 -3
  167. endoreg_db/models/administration/qualification/qualification_type.py +7 -3
  168. endoreg_db/models/administration/shift/scheduled_days.py +8 -5
  169. endoreg_db/models/administration/shift/shift.py +16 -12
  170. endoreg_db/models/administration/shift/shift_type.py +23 -31
  171. endoreg_db/models/label/__init__.py +8 -9
  172. endoreg_db/models/label/annotation/image_classification.py +10 -9
  173. endoreg_db/models/label/annotation/video_segmentation_annotation.py +23 -28
  174. endoreg_db/models/label/label.py +15 -15
  175. endoreg_db/models/label/label_set.py +19 -6
  176. endoreg_db/models/label/label_type.py +1 -1
  177. endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
  178. endoreg_db/models/label/label_video_segment/label_video_segment.py +98 -102
  179. endoreg_db/models/label/video_segmentation_label.py +4 -0
  180. endoreg_db/models/label/video_segmentation_labelset.py +4 -3
  181. endoreg_db/models/media/frame/frame.py +22 -22
  182. endoreg_db/models/media/pdf/raw_pdf.py +194 -194
  183. endoreg_db/models/media/pdf/report_file.py +25 -29
  184. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +55 -47
  185. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
  186. endoreg_db/models/media/processing_history/__init__.py +5 -0
  187. endoreg_db/models/media/processing_history/processing_history.py +96 -0
  188. endoreg_db/models/media/video/__init__.py +1 -0
  189. endoreg_db/models/media/video/create_from_file.py +139 -77
  190. endoreg_db/models/media/video/pipe_2.py +8 -9
  191. endoreg_db/models/media/video/video_file.py +174 -112
  192. endoreg_db/models/media/video/video_file_ai.py +288 -74
  193. endoreg_db/models/media/video/video_file_anonymize.py +38 -38
  194. endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
  195. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
  196. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
  197. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
  198. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
  199. endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
  200. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
  201. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
  202. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
  203. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
  204. endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
  205. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
  206. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
  207. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
  208. endoreg_db/models/media/video/video_file_io.py +113 -61
  209. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
  210. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
  211. endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
  212. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
  213. endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
  214. endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
  215. endoreg_db/models/media/video/video_file_segments.py +24 -17
  216. endoreg_db/models/media/video/video_metadata.py +19 -35
  217. endoreg_db/models/media/video/video_processing.py +96 -95
  218. endoreg_db/models/medical/contraindication/README.md +1 -0
  219. endoreg_db/models/medical/contraindication/__init__.py +13 -3
  220. endoreg_db/models/medical/disease.py +22 -16
  221. endoreg_db/models/medical/event.py +31 -18
  222. endoreg_db/models/medical/examination/__init__.py +13 -6
  223. endoreg_db/models/medical/examination/examination.py +39 -20
  224. endoreg_db/models/medical/examination/examination_indication.py +30 -95
  225. endoreg_db/models/medical/examination/examination_time.py +23 -8
  226. endoreg_db/models/medical/examination/examination_time_type.py +9 -6
  227. endoreg_db/models/medical/examination/examination_type.py +3 -4
  228. endoreg_db/models/medical/finding/finding.py +32 -40
  229. endoreg_db/models/medical/finding/finding_classification.py +42 -72
  230. endoreg_db/models/medical/finding/finding_intervention.py +25 -22
  231. endoreg_db/models/medical/finding/finding_type.py +13 -12
  232. endoreg_db/models/medical/hardware/endoscope.py +26 -26
  233. endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
  234. endoreg_db/models/medical/laboratory/lab_value.py +62 -91
  235. endoreg_db/models/medical/medication/medication.py +22 -10
  236. endoreg_db/models/medical/medication/medication_indication.py +29 -3
  237. endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
  238. endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
  239. endoreg_db/models/medical/medication/medication_schedule.py +27 -16
  240. endoreg_db/models/medical/organ/__init__.py +15 -12
  241. endoreg_db/models/medical/patient/medication_examples.py +6 -6
  242. endoreg_db/models/medical/patient/patient_disease.py +20 -23
  243. endoreg_db/models/medical/patient/patient_event.py +19 -22
  244. endoreg_db/models/medical/patient/patient_examination.py +48 -54
  245. endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
  246. endoreg_db/models/medical/patient/patient_finding.py +122 -139
  247. endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
  248. endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
  249. endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
  250. endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
  251. endoreg_db/models/medical/patient/patient_medication.py +27 -38
  252. endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
  253. endoreg_db/models/medical/risk/risk.py +7 -6
  254. endoreg_db/models/medical/risk/risk_type.py +8 -5
  255. endoreg_db/models/metadata/model_meta.py +60 -29
  256. endoreg_db/models/metadata/model_meta_logic.py +125 -18
  257. endoreg_db/models/metadata/pdf_meta.py +31 -24
  258. endoreg_db/models/metadata/sensitive_meta.py +105 -85
  259. endoreg_db/models/metadata/sensitive_meta_logic.py +198 -103
  260. endoreg_db/models/metadata/video_meta.py +51 -31
  261. endoreg_db/models/metadata/video_prediction_logic.py +16 -23
  262. endoreg_db/models/metadata/video_prediction_meta.py +29 -33
  263. endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
  264. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
  265. endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
  266. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
  267. endoreg_db/models/other/emission/emission_factor.py +18 -8
  268. endoreg_db/models/other/gender.py +10 -5
  269. endoreg_db/models/other/information_source.py +50 -29
  270. endoreg_db/models/other/material.py +9 -5
  271. endoreg_db/models/other/resource.py +6 -4
  272. endoreg_db/models/other/tag.py +10 -5
  273. endoreg_db/models/other/transport_route.py +13 -8
  274. endoreg_db/models/other/unit.py +10 -6
  275. endoreg_db/models/other/waste.py +6 -5
  276. endoreg_db/models/report/report.py +6 -0
  277. endoreg_db/models/requirement/requirement.py +329 -361
  278. endoreg_db/models/requirement/requirement_error.py +85 -0
  279. endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
  280. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
  281. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
  282. endoreg_db/models/requirement/requirement_operator.py +103 -112
  283. endoreg_db/models/requirement/requirement_set.py +74 -57
  284. endoreg_db/models/state/__init__.py +4 -4
  285. endoreg_db/models/state/abstract.py +2 -2
  286. endoreg_db/models/state/anonymization.py +12 -0
  287. endoreg_db/models/state/audit_ledger.py +49 -51
  288. endoreg_db/models/state/label_video_segment.py +9 -0
  289. endoreg_db/models/state/raw_pdf.py +101 -68
  290. endoreg_db/models/state/sensitive_meta.py +6 -2
  291. endoreg_db/models/state/video.py +110 -90
  292. endoreg_db/models/upload_job.py +35 -34
  293. endoreg_db/models/utils.py +28 -25
  294. endoreg_db/queries/__init__.py +3 -1
  295. endoreg_db/root_urls.py +21 -2
  296. endoreg_db/schemas/examination_evaluation.py +1 -1
  297. endoreg_db/serializers/__init__.py +2 -10
  298. endoreg_db/serializers/anonymization.py +18 -10
  299. endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
  300. endoreg_db/serializers/meta/__init__.py +1 -6
  301. endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
  302. endoreg_db/serializers/misc/file_overview.py +11 -99
  303. endoreg_db/serializers/misc/sensitive_patient_data.py +50 -26
  304. endoreg_db/serializers/patient_examination/patient_examination.py +3 -3
  305. endoreg_db/serializers/pdf/anony_text_validation.py +39 -23
  306. endoreg_db/serializers/requirements/requirement_sets.py +92 -22
  307. endoreg_db/serializers/video/segmentation.py +2 -1
  308. endoreg_db/serializers/video/video_file_list.py +65 -34
  309. endoreg_db/serializers/video/video_processing_history.py +20 -5
  310. endoreg_db/services/__old/pdf_import.py +1487 -0
  311. endoreg_db/services/__old/video_import.py +1306 -0
  312. endoreg_db/services/anonymization.py +128 -89
  313. endoreg_db/services/lookup_service.py +65 -52
  314. endoreg_db/services/lookup_store.py +2 -2
  315. endoreg_db/services/pdf_import.py +0 -1382
  316. endoreg_db/services/report_import.py +10 -0
  317. endoreg_db/services/video_import.py +6 -1255
  318. endoreg_db/tasks/upload_tasks.py +79 -70
  319. endoreg_db/tasks/video_ingest.py +8 -4
  320. endoreg_db/urls/__init__.py +5 -32
  321. endoreg_db/urls/ai.py +32 -0
  322. endoreg_db/urls/media.py +121 -83
  323. endoreg_db/urls/root_urls.py +29 -0
  324. endoreg_db/utils/__init__.py +15 -5
  325. endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
  326. endoreg_db/utils/case_generator/__init__.py +3 -0
  327. endoreg_db/utils/dataloader.py +142 -40
  328. endoreg_db/utils/defaults/set_default_center.py +32 -0
  329. endoreg_db/utils/names.py +22 -16
  330. endoreg_db/utils/paths.py +110 -46
  331. endoreg_db/utils/permissions.py +2 -1
  332. endoreg_db/utils/pipelines/Readme.md +1 -1
  333. endoreg_db/utils/pipelines/process_video_dir.py +1 -1
  334. endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +655 -0
  335. endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
  336. endoreg_db/utils/setup_config.py +8 -5
  337. endoreg_db/utils/storage.py +115 -0
  338. endoreg_db/utils/validate_endo_roi.py +8 -2
  339. endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
  340. endoreg_db/views/__init__.py +85 -183
  341. endoreg_db/views/ai/__init__.py +8 -0
  342. endoreg_db/views/ai/label.py +155 -0
  343. endoreg_db/views/anonymization/media_management.py +202 -166
  344. endoreg_db/views/anonymization/overview.py +99 -67
  345. endoreg_db/views/anonymization/validate.py +182 -44
  346. endoreg_db/views/media/__init__.py +7 -20
  347. endoreg_db/views/media/pdf_media.py +197 -174
  348. endoreg_db/views/media/sensitive_metadata.py +193 -138
  349. endoreg_db/views/media/video_media.py +89 -82
  350. endoreg_db/views/meta/__init__.py +0 -8
  351. endoreg_db/views/misc/__init__.py +1 -7
  352. endoreg_db/views/misc/upload_views.py +94 -93
  353. endoreg_db/views/patient/patient.py +5 -4
  354. endoreg_db/views/report/__init__.py +5 -7
  355. endoreg_db/views/{pdf → report}/reimport.py +22 -22
  356. endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +46 -39
  357. endoreg_db/views/requirement/evaluate.py +188 -187
  358. endoreg_db/views/requirement/lookup.py +17 -3
  359. endoreg_db/views/requirement/lookup_store.py +22 -90
  360. endoreg_db/views/requirement/requirement_utils.py +89 -0
  361. endoreg_db/views/video/__init__.py +23 -24
  362. endoreg_db/views/video/correction.py +201 -172
  363. endoreg_db/views/video/reimport.py +1 -1
  364. endoreg_db/views/{media/video_segments.py → video/segments_crud.py} +77 -40
  365. endoreg_db/views/video/{video_meta.py → video_meta_stats.py} +2 -2
  366. endoreg_db/views/video/video_stream.py +7 -8
  367. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/METADATA +7 -3
  368. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/RECORD +391 -413
  369. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/WHEEL +1 -1
  370. endoreg_db/data/finding/anatomy_colon.yaml +0 -128
  371. endoreg_db/data/finding/colonoscopy.yaml +0 -40
  372. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +0 -56
  373. endoreg_db/data/finding/complication.yaml +0 -16
  374. endoreg_db/data/finding/data.yaml +0 -105
  375. endoreg_db/data/finding/examination_setting.yaml +0 -16
  376. endoreg_db/data/finding/medication_related.yaml +0 -18
  377. endoreg_db/data/finding/outcome.yaml +0 -12
  378. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +0 -95
  379. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +0 -22
  380. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +0 -25
  381. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
  382. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
  383. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +0 -68
  384. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
  385. endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -80
  386. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +0 -21
  387. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +0 -20
  388. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +0 -26
  389. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +0 -22
  390. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +0 -53
  391. endoreg_db/data/finding_classification/complication_generic.yaml +0 -25
  392. endoreg_db/data/finding_classification/examination_setting_generic.yaml +0 -40
  393. endoreg_db/data/finding_classification/histology_colo.yaml +0 -51
  394. endoreg_db/data/finding_classification/intervention_required.yaml +0 -26
  395. endoreg_db/data/finding_classification/medication_related.yaml +0 -23
  396. endoreg_db/data/finding_classification/visualized.yaml +0 -33
  397. endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
  398. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
  399. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
  400. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +0 -15
  401. endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +0 -17
  402. endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
  403. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +0 -14
  404. endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
  405. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +0 -82
  406. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
  407. endoreg_db/data/finding_classification_choice/outcome.yaml +0 -19
  408. endoreg_db/data/finding_intervention/endoscopy.yaml +0 -43
  409. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
  410. endoreg_db/data/finding_intervention/endoscopy_egd.yaml +0 -128
  411. endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +0 -32
  412. endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +0 -9
  413. endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +0 -36
  414. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +0 -79
  415. endoreg_db/data/requirement/age.yaml +0 -26
  416. endoreg_db/data/requirement/gender.yaml +0 -25
  417. endoreg_db/management/commands/init_default_ai_model.py +0 -112
  418. endoreg_db/management/commands/reset_celery_schedule.py +0 -9
  419. endoreg_db/management/commands/validate_video.py +0 -204
  420. endoreg_db/migrations/0002_add_video_correction_models.py +0 -52
  421. endoreg_db/migrations/0003_add_center_display_name.py +0 -30
  422. endoreg_db/models/administration/permissions/__init__.py +0 -44
  423. endoreg_db/models/rule/__init__.py +0 -13
  424. endoreg_db/models/rule/rule.py +0 -27
  425. endoreg_db/models/rule/rule_applicator.py +0 -224
  426. endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
  427. endoreg_db/models/rule/rule_type.py +0 -20
  428. endoreg_db/models/rule/ruleset.py +0 -17
  429. endoreg_db/renames.yml +0 -8
  430. endoreg_db/serializers/_old/raw_pdf_meta_validation.py +0 -223
  431. endoreg_db/serializers/_old/raw_video_meta_validation.py +0 -179
  432. endoreg_db/serializers/_old/video.py +0 -71
  433. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +0 -115
  434. endoreg_db/serializers/meta/report_meta.py +0 -53
  435. endoreg_db/serializers/report/__init__.py +0 -9
  436. endoreg_db/serializers/report/mixins.py +0 -45
  437. endoreg_db/serializers/report/report.py +0 -105
  438. endoreg_db/serializers/report/report_list.py +0 -22
  439. endoreg_db/serializers/report/secure_file_url.py +0 -26
  440. endoreg_db/serializers/video/video_metadata.py +0 -105
  441. endoreg_db/services/requirements_object.py +0 -147
  442. endoreg_db/services/storage_aware_video_processor.py +0 -344
  443. endoreg_db/urls/files.py +0 -6
  444. endoreg_db/urls/label_video_segment_validate.py +0 -33
  445. endoreg_db/urls/label_video_segments.py +0 -46
  446. endoreg_db/urls/report.py +0 -48
  447. endoreg_db/urls/video.py +0 -61
  448. endoreg_db/utils/case_generator/case_generator.py +0 -159
  449. endoreg_db/utils/case_generator/utils.py +0 -30
  450. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +0 -368
  451. endoreg_db/views/label/__init__.py +0 -5
  452. endoreg_db/views/label/label.py +0 -15
  453. endoreg_db/views/label_video_segment/__init__.py +0 -16
  454. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +0 -44
  455. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +0 -50
  456. endoreg_db/views/label_video_segment/label_video_segment.py +0 -77
  457. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +0 -174
  458. endoreg_db/views/label_video_segment/label_video_segment_detail.py +0 -73
  459. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +0 -46
  460. endoreg_db/views/label_video_segment/validate.py +0 -226
  461. endoreg_db/views/media/segments.py +0 -71
  462. endoreg_db/views/meta/available_files_list.py +0 -146
  463. endoreg_db/views/meta/report_meta.py +0 -53
  464. endoreg_db/views/meta/sensitive_meta_detail.py +0 -148
  465. endoreg_db/views/misc/secure_file_serving_view.py +0 -80
  466. endoreg_db/views/misc/secure_file_url_view.py +0 -84
  467. endoreg_db/views/misc/secure_url_validate.py +0 -79
  468. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +0 -164
  469. endoreg_db/views/patient_finding_location/__init__.py +0 -5
  470. endoreg_db/views/patient_finding_location/pfl_create.py +0 -70
  471. endoreg_db/views/patient_finding_morphology/__init__.py +0 -5
  472. endoreg_db/views/patient_finding_morphology/pfm_create.py +0 -70
  473. endoreg_db/views/pdf/__init__.py +0 -8
  474. endoreg_db/views/report/report_list.py +0 -112
  475. endoreg_db/views/report/report_with_secure_url.py +0 -28
  476. endoreg_db/views/report/start_examination.py +0 -7
  477. endoreg_db/views/video/segmentation.py +0 -274
  478. endoreg_db/views/video/task_status.py +0 -49
  479. endoreg_db/views/video/timeline.py +0 -46
  480. endoreg_db/views/video/video_analyze.py +0 -52
  481. endoreg_db/views.py +0 -0
  482. /endoreg_db/data/requirement/{colonoscopy_baseline_austria.yaml → old/colonoscopy_baseline_austria.yaml} +0 -0
  483. /endoreg_db/data/requirement/{disease_cardiovascular.yaml → old/disease_cardiovascular.yaml} +0 -0
  484. /endoreg_db/data/requirement/{disease_classification_choice_cardiovascular.yaml → old/disease_classification_choice_cardiovascular.yaml} +0 -0
  485. /endoreg_db/data/requirement/{disease_hepatology.yaml → old/disease_hepatology.yaml} +0 -0
  486. /endoreg_db/data/requirement/{disease_misc.yaml → old/disease_misc.yaml} +0 -0
  487. /endoreg_db/data/requirement/{disease_renal.yaml → old/disease_renal.yaml} +0 -0
  488. /endoreg_db/data/requirement/{endoscopy_bleeding_risk.yaml → old/endoscopy_bleeding_risk.yaml} +0 -0
  489. /endoreg_db/data/requirement/{event_cardiology.yaml → old/event_cardiology.yaml} +0 -0
  490. /endoreg_db/data/requirement/{event_requirements.yaml → old/event_requirements.yaml} +0 -0
  491. /endoreg_db/data/requirement/{finding_colon_polyp.yaml → old/finding_colon_polyp.yaml} +0 -0
  492. /endoreg_db/{migrations/__init__.py → data/requirement/old/gender.yaml} +0 -0
  493. /endoreg_db/data/requirement/{lab_value.yaml → old/lab_value.yaml} +0 -0
  494. /endoreg_db/data/requirement/{medication.yaml → old/medication.yaml} +0 -0
  495. /endoreg_db/data/requirement_operator/{age.yaml → _old/age.yaml} +0 -0
  496. /endoreg_db/data/requirement_operator/{lab_operators.yaml → _old/lab_operators.yaml} +0 -0
  497. /endoreg_db/data/requirement_operator/{model_operators.yaml → _old/model_operators.yaml} +0 -0
  498. /endoreg_db/{models/media/video/refactor_plan.md → import_files/pseudonymization/__init__.py} +0 -0
  499. /endoreg_db/{models/media/video/video_file_frames.py → import_files/pseudonymization/pseudonymize.py} +0 -0
  500. /endoreg_db/models/{metadata/frame_ocr_result.py → report/__init__.py} +0 -0
  501. /endoreg_db/{urls/sensitive_meta.py → models/report/images.py} +0 -0
  502. /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
  503. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/licenses/LICENSE +0 -0
@@ -1,8 +1,11 @@
1
1
  # stats/models.py
2
- import hashlib, json, uuid
2
+ import hashlib
3
+ import json
4
+ import uuid
5
+
6
+ from django.conf import settings
3
7
  from django.db import models
4
8
  from django.utils import timezone
5
- from django.conf import settings
6
9
 
7
10
  """
8
11
 
@@ -31,33 +34,35 @@ Returns:
31
34
  _type_: _description_
32
35
  """
33
36
 
37
+ # TODO implement later on
38
+
34
39
 
35
40
  class AuditLedger(models.Model):
36
- id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
37
- ts = models.DateTimeField(default=timezone.now, editable=False)
38
- user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
39
- object_type = models.CharField(max_length=80) # e.g. 'VideoFile'
40
- object_pk = models.CharField(max_length=40) # UUID or int
41
- action = models.CharField(max_length=40) # 'created' | 'validated' | …
42
- data = models.JSONField() # snapshot / diff / metadata
43
- prev_hash = models.CharField(max_length=64, editable=False)
44
- hash = models.CharField(max_length=64, editable=False)
41
+ id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
42
+ ts = models.DateTimeField(default=timezone.now, editable=False)
43
+ user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
44
+ object_type = models.CharField(max_length=80) # e.g. 'VideoFile'
45
+ object_pk = models.CharField(max_length=40) # UUID or int
46
+ action = models.CharField(max_length=40) # 'created' | 'validated' | …
47
+ data = models.JSONField() # snapshot / diff / metadata
48
+ prev_hash = models.CharField(max_length=64, editable=False)
49
+ hash = models.CharField(max_length=64, editable=False)
45
50
 
46
51
  class Meta:
47
- ordering = ['ts']
48
- indexes = [models.Index(fields=['object_type', 'object_pk'])]
52
+ ordering = ["ts"]
53
+ indexes = [models.Index(fields=["object_type", "object_pk"])]
49
54
 
50
55
  # ------------------------------------------------------
51
56
  def save(self, *args, **kw):
52
57
  """
53
58
  Saves a new immutable audit record, computing and linking cryptographic hashes.
54
-
59
+
55
60
  Raises:
56
61
  RuntimeError: If an attempt is made to modify an existing audit record.
57
62
  """
58
- if self._state.adding: # only on INSERT
63
+ if self._state.adding: # only on INSERT
59
64
  self.prev_hash = self._last_hash()
60
- self.hash = self._compute_hash()
65
+ self.hash = self._compute_hash()
61
66
  else:
62
67
  raise RuntimeError("AuditLedger rows are immutable")
63
68
  super().save(*args, **kw)
@@ -66,36 +71,36 @@ class AuditLedger(models.Model):
66
71
  def _last_hash(self) -> str:
67
72
  """
68
73
  Retrieves the hash of the most recent audit record.
69
-
74
+
70
75
  Returns:
71
76
  The SHA-256 hash of the latest `AuditLedger` entry by timestamp, or a string of 64 zeros if no records exist.
72
77
  """
73
- last = AuditLedger.objects.order_by('-ts').first()
74
- return last.hash if last else '0' * 64
78
+ last = AuditLedger.objects.order_by("-ts").first()
79
+ return last.hash if last else "0" * 64
75
80
 
76
81
  def _compute_hash(self) -> str:
77
82
  """
78
83
  Computes the SHA-256 hash of the current audit record's data.
79
-
84
+
80
85
  The hash is generated from a JSON-serialized payload containing the timestamp, user ID, object type and primary key, action, associated data, and the previous record's hash. This ensures the integrity and immutability of the audit trail.
81
-
86
+
82
87
  Returns:
83
88
  The hexadecimal SHA-256 hash string representing the current audit record.
84
89
  """
85
90
  payload = {
86
- 'ts': self.ts.isoformat(),
87
- 'uid': str(self.user_id),
88
- 'obj': f'{self.object_type}:{self.object_pk}',
89
- 'act': self.action,
90
- 'data': self.data,
91
- 'prev': self.prev_hash,
91
+ "ts": self.ts.isoformat(),
92
+ "uid": str(self.id),
93
+ "obj": f"{self.object_type}:{self.object_pk}",
94
+ "act": self.action,
95
+ "data": self.data,
96
+ "prev": self.prev_hash,
92
97
  }
93
98
  return hashlib.sha256(json.dumps(payload, sort_keys=True).encode()).hexdigest()
94
-
95
- def log_validation(user, instance, action: str, extra=None):
99
+
100
+ def log_validation(self, user, instance, action: str, extra=None):
96
101
  """
97
102
  Creates an audit record for a validation action performed by a user on a specific model instance.
98
-
103
+
99
104
  Args:
100
105
  user: The user performing the action.
101
106
  instance: The model instance being validated.
@@ -110,41 +115,34 @@ class AuditLedger(models.Model):
110
115
  data=extra or {},
111
116
  )
112
117
 
113
- def _distinct(object_type: str, action: str):
118
+ @classmethod
119
+ def _distinct(self, object_type: str, action: str):
114
120
  """
115
121
  Returns the number of distinct objects of a given type that have a specific audit action recorded.
116
-
122
+
117
123
  Args:
118
124
  object_type: The type of object to filter by (e.g., 'VideoFile').
119
125
  action: The audit action to filter by (e.g., 'validated').
120
-
126
+
121
127
  Returns:
122
128
  The count of unique object primary keys matching the specified type and action.
123
129
  """
124
- return (
125
- AuditLedger.objects
126
- .filter(object_type=object_type, action=action)
127
- .values('object_pk')
128
- .distinct()
129
- .count()
130
- )
130
+ return AuditLedger.objects.filter(object_type=object_type, action=action).values("object_pk").distinct().count()
131
131
 
132
- def collect_counters():
132
+ def collect_counters(self):
133
133
  """
134
134
  Aggregates and returns summary statistics for audit actions and object types.
135
-
135
+
136
136
  Returns:
137
137
  dict: A dictionary containing counts of distinct cases, videos, annotations,
138
138
  anonymizations, images, and breakdowns of video statuses based on audit records.
139
139
  """
140
140
  return {
141
- "totalCases": AuditLedger._distinct("VideoFile", "created"),
142
- "totalVideos": AuditLedger._distinct("VideoFile", "created"),
143
- "totalAnnotations": AuditLedger.objects.filter(action="annotation_added").count(),
144
- "totalAnonymizations": AuditLedger._distinct("VideoFile", "anonymized"),
145
- "totalImages": AuditLedger._distinct("Image", "created"),
146
- # video breakdown
147
- "videosCompleted": AuditLedger._distinct("VideoFile", "validated"),
148
- "videosAnonym": AuditLedger._distinct("VideoFile", "anonymized"),
149
- # add more as needed …
141
+ "totalCases": AuditLedger._distinct("VideoFile", "created"),
142
+ "totalVideos": AuditLedger._distinct("VideoFile", "created"),
143
+ "totalAnnotations": AuditLedger.objects.filter(action="annotation_added").count(),
144
+ "totalAnonymizations": AuditLedger._distinct("VideoFile", "anonymized"),
145
+ "totalImages": AuditLedger._distinct("Image", "created"),
146
+ "videosCompleted": AuditLedger._distinct("VideoFile", "validated"),
147
+ "videosAnonym": AuditLedger._distinct("VideoFile", "anonymized"),
150
148
  }
@@ -1,6 +1,10 @@
1
+ from typing import TYPE_CHECKING
2
+
1
3
  from django.db import models
4
+
2
5
  from .abstract import AbstractState
3
6
 
7
+
4
8
  class LabelVideoSegmentState(AbstractState):
5
9
  """State for label video segment data."""
6
10
 
@@ -20,3 +24,8 @@ class LabelVideoSegmentState(AbstractState):
20
24
  class Meta:
21
25
  verbose_name = "Label Video Segment State"
22
26
  verbose_name_plural = "Label Video Segment States"
27
+
28
+ if TYPE_CHECKING:
29
+ from endoreg_db.models import LabelVideoSegment
30
+
31
+ origin: models.OneToOneField["LabelVideoSegment|None"]
@@ -1,24 +1,19 @@
1
1
  """
2
- Defines state tracking models related to PDF processing, including extraction of text and metadata, AI predictions, and anonymization status for RawPdfFile instances.
2
+ Defines state tracking models related to report processing, including extraction of text and metadata, AI predictions, and anonymization status for RawPdfFile instances.
3
3
  """
4
- from django.db import models
5
- from typing import TYPE_CHECKING
4
+
6
5
  import logging
7
6
  from enum import Enum
7
+ from typing import TYPE_CHECKING
8
+
9
+ from django.db import models, transaction
10
+
11
+ from endoreg_db.models.state.anonymization import AnonymizationState
8
12
 
9
13
  logger = logging.getLogger(__name__)
10
14
 
11
15
  if TYPE_CHECKING:
12
16
  from ..media import RawPdfFile
13
-
14
-
15
- class AnonymizationStatus(str, Enum):
16
- NOT_STARTED = "not_started"
17
- PROCESSING_ANONYMIZING = "processing_anonymization"
18
- DONE = "done"
19
- VALIDATED = "validated"
20
- FAILED = "failed"
21
- STARTED = "started"
22
17
 
23
18
 
24
19
  class RawPdfState(models.Model):
@@ -26,40 +21,62 @@ class RawPdfState(models.Model):
26
21
  Tracks the processing state of a RawPdfFile instance.
27
22
  Uses BooleanFields for clear, distinct states.
28
23
  """
29
- text_meta_extracted = models.BooleanField(default=False, help_text="True if text metadata (OCR) has been extracted.")
24
+
25
+ text_meta_extracted = models.BooleanField(
26
+ default=False, help_text="True if text metadata (OCR) has been extracted."
27
+ )
30
28
 
31
29
  # AI / Annotation related states
32
- initial_prediction_completed = models.BooleanField(default=False, help_text="True if initial AI prediction has run.")
30
+ initial_prediction_completed = models.BooleanField(
31
+ default=False, help_text="True if initial AI prediction has run."
32
+ )
33
33
 
34
34
  # Processing state
35
- sensitive_meta_processed = models.BooleanField(default=False, help_text="True if the video has been fully processed, meaning a anonymized person was created.")
35
+ sensitive_meta_processed = models.BooleanField(
36
+ default=False,
37
+ help_text="True if the video has been fully processed, meaning a anonymized person was created.",
38
+ )
36
39
 
37
40
  # Anonymization state
38
- anonymized = models.BooleanField(default=False, help_text="True if the anonymized video file has been created.")
39
- anonymization_validated = models.BooleanField(default=False, help_text="True if the anonymization process has been validated and confirmed.")
40
-
41
+ anonymized = models.BooleanField(
42
+ default=False, help_text="True if the anonymized video file has been created."
43
+ )
44
+ anonymization_validated = models.BooleanField(
45
+ default=False,
46
+ help_text="True if the anonymization process has been validated and confirmed.",
47
+ )
48
+
41
49
  # Processing state
42
- processing_started = models.BooleanField(default=False, help_text="True if the processing has started, but not yet completed.")
43
- processing_error = models.BooleanField(default=False, help_text="True if an error occurred during processing.")
44
-
50
+ processing_started = models.BooleanField(
51
+ default=False,
52
+ help_text="True if the processing has started, but not yet completed.",
53
+ )
54
+ processing_error = models.BooleanField(
55
+ default=False, help_text="True if an error occurred during processing."
56
+ )
57
+
45
58
  # Timestamps
46
59
  date_created = models.DateTimeField(auto_now_add=True)
47
60
  date_modified = models.DateTimeField(auto_now=True)
48
-
49
- was_created = models.BooleanField(default=True, help_text="True if this state was created for the first time.")
50
61
 
51
- # PDF metadata extraction state
52
- pdf_meta_extracted = models.BooleanField(default=False, help_text="True if PDF metadata has been extracted.")
62
+ was_created = models.BooleanField(
63
+ default=True, help_text="True if this state was created for the first time."
64
+ )
65
+
66
+ # report metadata extraction state
67
+ pdf_meta_extracted = models.BooleanField(
68
+ default=False, help_text="True if report metadata has been extracted."
69
+ )
53
70
 
54
71
  if TYPE_CHECKING:
55
72
  raw_pdf_file: "RawPdfFile"
56
73
 
57
74
  def __str__(self):
58
75
  """
59
- Return a string summarizing the RawPdfState instance, including the related PDF file UUID and key processing state flags with timestamps.
76
+ Return a string summarizing the RawPdfState instance, including the related report file UUID and key processing state flags with timestamps.
60
77
  """
61
78
  try:
62
- uuid = self.raw_pdf_file.id
79
+ uuid = self.raw_pdf_file.pk
63
80
  except Exception:
64
81
  uuid = None
65
82
 
@@ -70,52 +87,72 @@ class RawPdfState(models.Model):
70
87
  f"AnonymizationValidated={self.anonymization_validated}",
71
88
  f"SensitiveMetaProcessed={self.sensitive_meta_processed}",
72
89
  f"DateCreated={self.date_created.isoformat()}",
73
- f"DateModified={self.date_modified.isoformat()}"
90
+ f"DateModified={self.date_modified.isoformat()}",
74
91
  ]
75
92
  return f"RawPdfState(Pdf:{uuid}): {', '.join(states)}"
76
93
 
77
94
  @property
78
- def anonymization_status(self) -> AnonymizationStatus:
95
+ def anonymization_status(self) -> AnonymizationState:
79
96
  """
80
- Determines the current anonymization workflow status for the PDF processing state.
81
-
97
+ Determines the current anonymization workflow status for the report processing state.
98
+
82
99
  Returns:
83
100
  AnonymizationStatus: The current status, reflecting progress or failure in the anonymization process.
84
101
  """
85
- if getattr(self, "processing_error", False):
86
- return AnonymizationStatus.FAILED
87
102
  if self.anonymization_validated:
88
- return AnonymizationStatus.VALIDATED
103
+ return AnonymizationState.VALIDATED # Validation in Frontend completed -> Views related to this /home/admin/endoreg-db/endoreg_db/views/anonymization/validate.py
89
104
  if self.sensitive_meta_processed:
90
- return AnonymizationStatus.DONE
91
- if self.anonymized:
92
- return AnonymizationStatus.DONE
93
- if self.initial_prediction_completed:
94
- return AnonymizationStatus.PROCESSING_ANONYMIZING
95
- if self.pdf_meta_extracted:
96
- return AnonymizationStatus.NOT_STARTED
105
+ return (
106
+ AnonymizationState.DONE_PROCESSING_ANONYMIZATION
107
+ ) # /home/admin/endoreg-db/endoreg_db/services/pdf_import.py
108
+ if (
109
+ self.processing_started
110
+ and not self.processing_error
111
+ and not self.anonymized
112
+ ):
113
+ return AnonymizationState.PROCESSING_ANONYMIZING
114
+ if getattr(self, "processing_error", False):
115
+ return (
116
+ AnonymizationState.FAILED
117
+ ) # /home/admin/endoreg-db/endoreg_db/services/pdf_import.py
97
118
  if self.processing_started:
98
- return AnonymizationStatus.STARTED
99
- return AnonymizationStatus.NOT_STARTED
100
-
119
+ return (
120
+ AnonymizationState.STARTED
121
+ ) # /home/admin/endoreg-db/endoreg_db/services/pdf_import.py
122
+ if self.anonymized:
123
+ return AnonymizationState.ANONYMIZED
124
+ return AnonymizationState.NOT_STARTED
125
+
126
+ def mark_processing_not_started(self) -> None:
127
+ """
128
+ Mark the processing as not started and optionally save the updated state.
129
+
130
+ Parameters:
131
+ save (bool): If True, persist the change to the database immediately. Defaults to True.
132
+ """
133
+ with transaction.atomic():
134
+ self.processing_started = False
135
+ self.anonymized = False
136
+ self.was_created = False
137
+ self.sensitive_meta_processed = False
138
+ self.anonymization_validated = False
139
+ self.save()
101
140
 
102
-
103
141
  def mark_processing_started(self, *, save: bool = True) -> None:
104
142
  """
105
143
  Mark the processing as started and optionally save the updated state.
106
-
144
+
107
145
  Parameters:
108
146
  save (bool): If True, persist the change to the database immediately. Defaults to True.
109
147
  """
110
148
  self.processing_started = True
111
- if save:
112
- self.save(update_fields=["processing_started", "date_modified"])
149
+ self.save(update_fields=["processing_started", "date_modified"])
113
150
 
114
151
  # ---- Single‑responsibility mutators ---------------------------------
115
152
  def mark_sensitive_meta_processed(self, *, save: bool = True) -> None:
116
153
  """
117
- Mark the sensitive metadata processing step as completed for this PDF state.
118
-
154
+ Mark the sensitive metadata processing step as completed for this report state.
155
+
119
156
  Parameters:
120
157
  save (bool): If True, immediately saves the updated state to the database.
121
158
  """
@@ -125,8 +162,8 @@ class RawPdfState(models.Model):
125
162
 
126
163
  def mark_anonymization_validated(self, *, save: bool = True) -> None:
127
164
  """
128
- Mark the anonymization as validated for this PDF processing state.
129
-
165
+ Mark the anonymization as validated for this report processing state.
166
+
130
167
  Parameters:
131
168
  save (bool): If True, immediately saves the updated state to the database.
132
169
  """
@@ -136,19 +173,19 @@ class RawPdfState(models.Model):
136
173
 
137
174
  def mark_anonymized(self, *, save: bool = True) -> None:
138
175
  """
139
- Mark the PDF as anonymized and optionally save the updated state.
140
-
176
+ Mark the report as anonymized and optionally save the updated state.
177
+
141
178
  Parameters:
142
179
  save (bool): If True, persist the change to the database immediately. Defaults to True.
143
180
  """
144
- self.anonymized = True
145
- if save:
181
+ with transaction.atomic():
182
+ self.anonymized = True
146
183
  self.save(update_fields=["anonymized", "date_modified"])
147
184
 
148
185
  def mark_initial_prediction_completed(self, *, save: bool = True) -> None:
149
186
  """
150
- Mark the initial AI prediction step as completed for this PDF processing state.
151
-
187
+ Mark the initial AI prediction step as completed for this report processing state.
188
+
152
189
  Parameters:
153
190
  save (bool): If True, immediately saves the updated state to the database.
154
191
  """
@@ -158,8 +195,8 @@ class RawPdfState(models.Model):
158
195
 
159
196
  def mark_pdf_meta_extracted(self, *, save: bool = True) -> None:
160
197
  """
161
- Mark the PDF metadata extraction step as completed for this state.
162
-
198
+ Mark the report metadata extraction step as completed for this state.
199
+
163
200
  Parameters:
164
201
  save (bool): If True, immediately saves the updated state to the database.
165
202
  """
@@ -169,19 +206,15 @@ class RawPdfState(models.Model):
169
206
 
170
207
  def mark_text_meta_extracted(self, *, save: bool = True) -> None:
171
208
  """
172
- Mark the text metadata extraction step as completed for this PDF processing state.
173
-
209
+ Mark the text metadata extraction step as completed for this report processing state.
210
+
174
211
  Parameters:
175
212
  save (bool): If True, immediately saves the updated state to the database.
176
213
  """
177
214
  self.text_meta_extracted = True
178
215
  if save:
179
216
  self.save(update_fields=["text_meta_extracted", "date_modified"])
180
-
181
-
182
217
 
183
218
  class Meta:
184
- verbose_name = "Raw PDF Processing State"
185
- verbose_name_plural = "Raw PDF Processing States"
186
-
187
-
219
+ verbose_name = "Raw report Processing State"
220
+ verbose_name_plural = "Raw report Processing States"
@@ -1,6 +1,9 @@
1
+ from typing import TYPE_CHECKING
2
+
1
3
  from django.db import models
4
+
2
5
  from .abstract import AbstractState
3
- from typing import TYPE_CHECKING
6
+
4
7
 
5
8
  class SensitiveMetaState(AbstractState):
6
9
  """State for sensitive meta data."""
@@ -19,7 +22,7 @@ class SensitiveMetaState(AbstractState):
19
22
  if TYPE_CHECKING:
20
23
  from endoreg_db.models import SensitiveMeta
21
24
 
22
- origin: "SensitiveMeta"
25
+ origin: models.OneToOneField["SensitiveMeta|None"]
23
26
 
24
27
  @property
25
28
  def is_verified(self) -> bool:
@@ -41,6 +44,7 @@ class SensitiveMetaState(AbstractState):
41
44
  """
42
45
  self.names_verified = True
43
46
  self.save(update_fields=["names_verified"])
47
+
44
48
  class Meta:
45
49
  verbose_name = "Sensitive Meta State"
46
50
  verbose_name_plural = "Sensitive Meta States"