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,112 +0,0 @@
1
- """
2
- Django management command to initialize the default AI model with metadata.
3
- This command ensures that a default AI model exists with proper ModelMeta records.
4
- """
5
-
6
- from django.core.management.base import BaseCommand
7
- from django.core.management import call_command
8
- from pathlib import Path
9
- #FIXME
10
- from endoreg_db.data.ai_model_meta import (
11
- default_multilabel_classification
12
- )
13
-
14
- from endoreg_db.models import AiModel
15
- from endoreg_db.helpers.data_loader import (
16
- load_ai_model_label_data,
17
- load_ai_model_data,
18
- )
19
-
20
-
21
- class Command(BaseCommand):
22
- help = """
23
- Initialize the default AI model with metadata.
24
- This command ensures that the default segmentation model exists with proper ModelMeta records.
25
- """
26
-
27
- def add_arguments(self, parser):
28
- """
29
- Adds the --force command-line argument to control metadata recreation.
30
-
31
- The --force flag, when specified, forces the recreation of model metadata even if it already exists.
32
- """
33
- parser.add_argument(
34
- '--force',
35
- action='store_true',
36
- help='Force recreation of the model metadata even if it exists',
37
- )
38
-
39
- def handle(self, *args, **options):
40
- """
41
- Initializes the default AI model and its metadata, creating or updating as needed.
42
-
43
- Loads required AI model label and model data, ensures the presence of a default AI model, and creates associated model metadata if it does not already exist or if the `--force` flag is specified. Generates a dummy weights file if necessary and invokes the metadata creation command. Verifies successful creation and outputs status messages throughout the process.
44
- """
45
- force = options.get('force', False)
46
- default_multilabel_classification()
47
- # First ensure the basic AI model data is loaded
48
- self.stdout.write("Loading AI model label data...")
49
- load_ai_model_label_data()
50
-
51
- self.stdout.write("Loading AI model data...")
52
- load_ai_model_data()
53
-
54
- # Check if default model exists
55
- default_model_name = "image_multilabel_classification_colonoscopy_default"
56
-
57
- try:
58
- ai_model = AiModel.objects.get(name=default_model_name)
59
- self.stdout.write(f"Found AI model: {ai_model.name}")
60
- except AiModel.DoesNotExist:
61
- self.stdout.write(
62
- self.style.ERROR(f"AI model '{default_model_name}' not found. Make sure AI model data is loaded.")
63
- )
64
- return
65
-
66
- # Check if model metadata exists
67
- existing_meta = ai_model.metadata_versions.first()
68
- if existing_meta and not force:
69
- self.stdout.write(
70
- self.style.SUCCESS(f"Model metadata already exists for {ai_model.name}. Use --force to recreate.")
71
- )
72
- return
73
-
74
- # Create default model metadata
75
- self.stdout.write("Creating default model metadata...")
76
-
77
- # Use a dummy weights file path for now - in production this should point to actual model weights
78
- dummy_weights_path = Path(__file__).parent.parent.parent / "assets" / "dummy_model.ckpt"
79
-
80
- # Create the dummy weights file if it doesn't exist
81
- dummy_weights_path.parent.mkdir(parents=True, exist_ok=True)
82
- if not dummy_weights_path.exists():
83
- dummy_weights_path.write_bytes(b"dummy weights content")
84
- self.stdout.write(f"Created dummy weights file at {dummy_weights_path}")
85
-
86
- try:
87
- # Create ModelMeta using the create_multilabel_model_meta command
88
- call_command(
89
- "create_multilabel_model_meta",
90
- "--model_path", str(dummy_weights_path),
91
- "--model_name", default_model_name,
92
- "--image_classification_labelset_name", "multilabel_classification_colonoscopy",
93
- "--activation_function_name", "sigmoid",
94
- "--model_meta_version", "1",
95
- )
96
-
97
- self.stdout.write(
98
- self.style.SUCCESS(f"Successfully created model metadata for {default_model_name}")
99
- )
100
-
101
- # Verify the model can be retrieved
102
- from endoreg_db.helpers.default_objects import get_latest_segmentation_model
103
- model_meta = get_latest_segmentation_model()
104
- self.stdout.write(
105
- self.style.SUCCESS(f"Verified: Model metadata can be retrieved: {model_meta}")
106
- )
107
-
108
- except Exception as e:
109
- self.stdout.write(
110
- self.style.ERROR(f"Failed to create model metadata: {e}")
111
- )
112
- raise
@@ -1,9 +0,0 @@
1
- from django.core.management.base import BaseCommand
2
- from django_celery_beat.models import PeriodicTask
3
-
4
- class Command(BaseCommand):
5
- help = 'Deletes all periodic tasks from the database to reset the schedule'
6
-
7
- def handle(self, *args, **kwargs):
8
- PeriodicTask.objects.all().delete()
9
- self.stdout.write(self.style.SUCCESS('Successfully deleted all periodic tasks.'))
@@ -1,204 +0,0 @@
1
- from django.core.management.base import BaseCommand
2
- from endoreg_db.models import VideoFile
3
- from endoreg_db.helpers.default_objects import get_latest_segmentation_model
4
- from django.db.models import Q # Add this import
5
-
6
- # VideoFile instances have a related 'state' (a VideoState object).
7
- # VideoState uses boolean fields (e.g., state.anonymized, state.initial_prediction_completed)
8
- # to track the processing status, rather than a single status field with choices.
9
- # This command interprets combinations of these boolean fields to determine
10
- # if a video is considered "validated" or "anonymized".
11
- # The VideoState model itself is defined in endoreg_db/models/state/video.py (or similar)
12
- # and does not contain an enum like the previously assumed 'VideoFileStateChoices'.
13
-
14
- class Command(BaseCommand):
15
- help = "Data extraction and validation of video files in the database and updating their states accordingly."
16
-
17
- def add_arguments(self, parser):
18
- """
19
- Adds command-line arguments for verbose output, forced revalidation, and anonymization.
20
-
21
- This method configures the management command to accept optional flags:
22
- --verbose for detailed output, --force to revalidate all videos regardless of status,
23
- and --anonymize to anonymize video files during processing.
24
- """
25
- parser.add_argument(
26
- "--verbose",
27
- action="store_true",
28
- help="Display verbose output",
29
- )
30
- parser.add_argument(
31
- "--force",
32
- action="store_true",
33
- help="Force revalidation of all video files, even if they are already validated.",
34
- )
35
- parser.add_argument(
36
- "--anonymize",
37
- action="store_true",
38
- help="Anonymize video files.",
39
- )
40
-
41
- def handle(self, *args, **options):
42
- """
43
- Validates video files stored in the database and updates their validation states.
44
-
45
- This method processes video files according to the provided command-line options,
46
- such as verbose output, forced revalidation, or anonymization.
47
- It interprets the boolean flags in the related VideoState object to determine
48
- if a video is 'validated' (e.g., initial_prediction_completed and lvs_created are True)
49
- or 'anonymized' (e.g., anonymized is True).
50
- """
51
- #TODO @maxhild here is some ai generated code for now, not validated yet
52
- verbose = options["verbose"]
53
- force = options["force"]
54
- anonymize_option = options["anonymize"]
55
-
56
- if verbose:
57
- self.stdout.write(self.style.SUCCESS("Starting video validation and/or anonymization process..."))
58
-
59
- # Eager load related state if VideoFile.state is a ForeignKey or OneToOneField
60
- videos_query = VideoFile.objects.select_related('state').all()
61
-
62
- # Define conditions for "validated" and "anonymized" based on VideoState boolean fields
63
- # Validated: initial_prediction_completed = True AND lvs_created = True
64
- q_validated = Q(state__initial_prediction_completed=True, state__lvs_created=True)
65
- # Anonymized: anonymized = True
66
- q_anonymized = Q(state__anonymized=True)
67
-
68
- if not force:
69
- if anonymize_option:
70
- # If anonymization is the goal, process videos not yet anonymized.
71
- videos_query = videos_query.exclude(q_anonymized)
72
- else:
73
- # If only validation is the goal, process videos not yet validated or anonymized.
74
- videos_query = videos_query.exclude(q_validated | q_anonymized)
75
-
76
- videos_to_process = list(videos_query)
77
-
78
- if not videos_to_process:
79
- if verbose:
80
- self.stdout.write(self.style.SUCCESS("No videos found requiring processing with the current options."))
81
- return
82
-
83
- processed_count = 0
84
- failed_count = 0
85
- model_name_for_pipe1 = None
86
-
87
- try:
88
- # Attempt to get the model for pipe_1. This might be optional for pipe_1.
89
- ai_model_meta = get_latest_segmentation_model()
90
- model_name_for_pipe1 = ai_model_meta.model.name
91
- if verbose:
92
- self.stdout.write(self.style.SUCCESS(f"Using model '{model_name_for_pipe1}' for pipe_1 processing."))
93
- except Exception as e:
94
- self.stdout.write(self.style.WARNING(f"Could not retrieve segmentation model: {e}. pipe_1 might proceed without a specific model or use a default."))
95
- # model_name_for_pipe1 can remain None if pipe_1 handles it, or set a default if known.
96
-
97
- for video in videos_to_process:
98
- state_summary = "N/A"
99
- if hasattr(video, 'state') and video.state:
100
- s = video.state
101
- state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
102
-
103
- if verbose:
104
- self.stdout.write(f"Processing video: {video.uuid} (Current state: {state_summary})")
105
-
106
- try:
107
- # Determine if pipe_1 needs to run
108
- needs_pipe_1 = force
109
- if not force and hasattr(video, 'state') and video.state:
110
- s = video.state
111
- is_validated = s.initial_prediction_completed and s.lvs_created
112
- is_anonymized = s.anonymized
113
- if not (is_validated or is_anonymized):
114
- needs_pipe_1 = True
115
- elif not force: # No state object, assume it needs processing
116
- needs_pipe_1 = True
117
-
118
-
119
- if needs_pipe_1:
120
- if verbose:
121
- self.stdout.write(f"Running pipe_1 for video {video.uuid} (force={force})...")
122
- if not model_name_for_pipe1 and verbose:
123
- self.stdout.write(self.style.WARNING(f"Attempting pipe_1 for {video.uuid} without a specific model name."))
124
-
125
- success_pipe_1 = video.pipe_1(model_name=model_name_for_pipe1)
126
- video.refresh_from_db()
127
-
128
- new_state_summary = "N/A"
129
- if hasattr(video, 'state') and video.state:
130
- s = video.state
131
- new_state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
132
-
133
- if not success_pipe_1:
134
- raise Exception(f"pipe_1 validation failed for video {video.uuid}. State after attempt: {new_state_summary}")
135
-
136
- if verbose:
137
- self.stdout.write(self.style.SUCCESS(f"Video {video.uuid} successfully passed pipe_1. New state: {new_state_summary}"))
138
- elif verbose:
139
- self.stdout.write(f"Video {video.uuid} already meets validation criteria or is anonymized, skipping pipe_1 (force=False).")
140
-
141
- # Anonymization step
142
- if anonymize_option:
143
- should_anonymize = False
144
- current_state_summary_for_anonym = "N/A"
145
- if hasattr(video, 'state') and video.state:
146
- s = video.state
147
- current_state_summary_for_anonym = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
148
- is_validated_for_anonymization = s.initial_prediction_completed and s.lvs_created
149
- is_currently_anonymized = s.anonymized
150
- if force or (is_validated_for_anonymization and not is_currently_anonymized):
151
- should_anonymize = True
152
- elif force: # No state, but force anonymize
153
- should_anonymize = True
154
-
155
-
156
- if should_anonymize:
157
- if verbose:
158
- self.stdout.write(f"Attempting to anonymize video: {video.uuid} (force={force}, current_state_before_anonym={current_state_summary_for_anonym}).")
159
-
160
- if hasattr(video, 'anonymize_video_content'):
161
- video.anonymize_video_content()
162
- video.refresh_from_db()
163
- else:
164
- self.stdout.write(self.style.ERROR(f"Video model does not have 'anonymize_video_content' method. Skipping anonymization for {video.uuid}."))
165
- # Potentially raise an error or handle as a failure
166
-
167
- post_anonym_state_summary = "N/A"
168
- is_now_anonymized = False
169
- if hasattr(video, 'state') and video.state:
170
- s = video.state
171
- post_anonym_state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
172
- is_now_anonymized = s.anonymized
173
-
174
- if is_now_anonymized:
175
- if verbose:
176
- self.stdout.write(self.style.SUCCESS(f"Video {video.uuid} successfully anonymized. New state: {post_anonym_state_summary}"))
177
- else:
178
- if hasattr(video, 'anonymize_video_content'): # Only raise if we attempted
179
- raise Exception(f"Anonymization called but video is not marked as anonymized for video {video.uuid}. Current state: {post_anonym_state_summary}")
180
-
181
- elif hasattr(video, 'state') and video.state and video.state.anonymized and verbose: # Already anonymized
182
- self.stdout.write(f"Video {video.uuid} is already anonymized.")
183
- elif verbose:
184
- self.stdout.write(f"Skipping anonymization for video {video.uuid} (not validated for anonymization, or already anonymized and not forced).")
185
-
186
- processed_count += 1
187
- except Exception as e:
188
- failed_count += 1
189
- video.refresh_from_db()
190
- error_state_summary = "N/A"
191
- if hasattr(video, 'state') and video.state:
192
- s = video.state
193
- error_state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
194
- self.stdout.write(self.style.ERROR(f"Error processing video {video.uuid}: {e}. State after error: {error_state_summary}"))
195
- # Optionally, explicitly set an error state if the methods don't do it reliably:
196
- # if hasattr(video, 'state') and video.state: # Further checks would depend on how an error state is defined with booleans
197
- # # video.state.set_status(VideoFile.VideoFileStateChoices.ERROR, message=f"Validation command error: {str(e)[:250]}") # Old way
198
- # # video.state.save() # New way would involve setting specific boolean flags to indicate error
199
- pass
200
-
201
-
202
- if verbose:
203
- self.stdout.write(self.style.SUCCESS(f"Video processing finished. Succeeded: {processed_count}, Failed: {failed_count}."))
204
-
@@ -1,52 +0,0 @@
1
- # Generated by Django 5.2.5 on 2025-10-09 10:12
2
-
3
- import django.db.models.deletion
4
- from django.db import migrations, models
5
-
6
-
7
- class Migration(migrations.Migration):
8
-
9
- dependencies = [
10
- ('endoreg_db', '0001_initial'),
11
- ]
12
-
13
- operations = [
14
- migrations.CreateModel(
15
- name='VideoMetadata',
16
- fields=[
17
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18
- ('sensitive_frame_count', models.IntegerField(blank=True, help_text='Number of frames detected as containing sensitive information', null=True)),
19
- ('sensitive_ratio', models.FloatField(blank=True, help_text='Ratio of sensitive frames to total frames (0.0-1.0)', null=True)),
20
- ('sensitive_frame_ids', models.TextField(blank=True, help_text='JSON array of sensitive frame indices (0-based)', null=True)),
21
- ('analyzed_at', models.DateTimeField(auto_now=True, help_text='Timestamp of last analysis')),
22
- ('video', models.OneToOneField(help_text='Video file this metadata belongs to', on_delete=django.db.models.deletion.CASCADE, related_name='metadata', to='endoreg_db.videofile')),
23
- ],
24
- options={
25
- 'verbose_name': 'Video Metadata',
26
- 'verbose_name_plural': 'Video Metadata',
27
- 'db_table': 'video_metadata',
28
- },
29
- ),
30
- migrations.CreateModel(
31
- name='VideoProcessingHistory',
32
- fields=[
33
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
34
- ('operation', models.CharField(choices=[('mask_overlay', 'Mask Overlay'), ('frame_removal', 'Frame Removal'), ('analysis', 'Sensitivity Analysis'), ('reprocessing', 'Full Reprocessing')], help_text='Type of processing operation', max_length=50)),
35
- ('status', models.CharField(choices=[('pending', 'Pending'), ('running', 'Running'), ('success', 'Success'), ('failure', 'Failure'), ('cancelled', 'Cancelled')], default='pending', help_text='Current status of the operation', max_length=20)),
36
- ('config', models.JSONField(default=dict, help_text='Operation configuration (mask settings, frame list, etc.)')),
37
- ('output_file', models.CharField(blank=True, help_text='Path to output file (relative to MEDIA_ROOT)', max_length=500)),
38
- ('details', models.TextField(blank=True, help_text='Additional details or error messages')),
39
- ('task_id', models.CharField(blank=True, help_text='Celery task ID for progress tracking', max_length=100)),
40
- ('created_at', models.DateTimeField(auto_now_add=True, help_text='When the operation was started')),
41
- ('completed_at', models.DateTimeField(blank=True, help_text='When the operation completed (success or failure)', null=True)),
42
- ('video', models.ForeignKey(help_text='Video file this operation was performed on', on_delete=django.db.models.deletion.CASCADE, related_name='processing_history', to='endoreg_db.videofile')),
43
- ],
44
- options={
45
- 'verbose_name': 'Video Processing History',
46
- 'verbose_name_plural': 'Video Processing Histories',
47
- 'db_table': 'video_processing_history',
48
- 'ordering': ['-created_at'],
49
- 'indexes': [models.Index(fields=['video', '-created_at'], name='video_proce_video_i_98ffe0_idx'), models.Index(fields=['task_id'], name='video_proce_task_id_ec8b15_idx'), models.Index(fields=['status'], name='video_proce_status_6f71fd_idx')],
50
- },
51
- ),
52
- ]
@@ -1,30 +0,0 @@
1
- from django.db import migrations, models
2
-
3
-
4
- def populate_display_name(apps, schema_editor):
5
- Center = apps.get_model('endoreg_db', 'Center')
6
- for center in Center.objects.all():
7
- if not center.display_name:
8
- center.display_name = center.name
9
- center.save(update_fields=['display_name'])
10
-
11
-
12
- def reset_display_name(apps, schema_editor):
13
- Center = apps.get_model('endoreg_db', 'Center')
14
- Center.objects.update(display_name='')
15
-
16
-
17
- class Migration(migrations.Migration):
18
-
19
- dependencies = [
20
- ('endoreg_db', '0002_add_video_correction_models'),
21
- ]
22
-
23
- operations = [
24
- migrations.AddField(
25
- model_name='center',
26
- name='display_name',
27
- field=models.CharField(blank=True, default='', max_length=255),
28
- ),
29
- migrations.RunPython(populate_display_name, reset_display_name),
30
- ]
@@ -1,44 +0,0 @@
1
- # from django.contrib.contenttypes.models import ContentType
2
- # from django.contrib.auth.models import Permission
3
- # from endoreg_db.models import * # Import your models here
4
- # from django.db import transaction
5
-
6
- # # Step 1: Define model to category mappings
7
- # # Assuming every model class name is unique across your entire Django project
8
- # model_categories = {
9
- # 'SensitiveModel1': 'sensitive',
10
- # 'SensitiveModel2': 'sensitive',
11
- # 'DevelopmentModel1': 'development',
12
- # 'DevelopmentModel2': 'development',
13
- # # Add all models you have, mapping them to either 'sensitive', 'development', or 'all'
14
- # }
15
-
16
- # # Step 2: Define permissions for each category
17
- # category_permissions = {
18
- # 'sensitive': ['view', 'edit', 'delete'],
19
- # 'development': ['view', 'edit'],
20
- # 'all': ['view'],
21
- # }
22
-
23
- # @transaction.atomic
24
- # def create_permissions_for_all_models():
25
- # for model_class_name, category in model_categories.items():
26
- # model_class = globals().get(model_class_name)
27
- # if model_class is None:
28
- # print(f"Model {model_class_name} not found.")
29
- # continue
30
-
31
- # content_type = ContentType.objects.get_for_model(model_class)
32
- # permissions = category_permissions.get(category, [])
33
-
34
- # for permission_codename in permissions:
35
- # permission_name = f"Can {permission_codename} {model_class_name}"
36
- # permission, created = Permission.objects.get_or_create(
37
- # codename=f"{permission_codename}_{model_class_name.lower()}",
38
- # defaults={'name': permission_name, 'content_type': content_type},
39
- # )
40
- # if created:
41
- # print(f"Created permission: {permission_name}")
42
-
43
- # # Run the function to create and assign permissions based on categories
44
- # create_permissions_for_all_models()
@@ -1,13 +0,0 @@
1
- from .rule_type import RuleType
2
- from .rule import Rule
3
- from .ruleset import Ruleset
4
- from .rule_attribute_dtype import RuleAttributeDType
5
- from .rule_applicator import RuleApplicator
6
-
7
- __all__ = [
8
- "RuleType",
9
- "Rule",
10
- "Ruleset",
11
- "RuleAttributeDType",
12
- "RuleApplicator",
13
- ]
@@ -1,27 +0,0 @@
1
- from django.db import models
2
-
3
- class RuleManager(models.Manager):
4
- def get_by_natural_key(self, name):
5
- return self.get(name=name)
6
-
7
- class Rule(models.Model):
8
- name = models.CharField(max_length=255, unique=True)
9
- description = models.TextField(blank=True, null=True)
10
- attribute_key = models.CharField(max_length=255)
11
- rule_type = models.ForeignKey("RuleType", on_delete=models.CASCADE)
12
- attribute_dtype = models.ForeignKey("RuleAttributeDType", on_delete=models.CASCADE)
13
-
14
- objects = RuleManager()
15
-
16
- class Meta:
17
- verbose_name = 'Rule'
18
- verbose_name_plural = 'Rules'
19
-
20
- def natural_key(self):
21
- """
22
- Return a tuple representing the natural key for this Rule instance.
23
-
24
- Returns:
25
- tuple: A one-element tuple containing the Rule's unique name.
26
- """
27
- return (self.name,)