endoreg-db 0.6.4__py3-none-any.whl → 0.8.1__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 (778) hide show
  1. endoreg_db/admin.py +26 -26
  2. endoreg_db/api_urls.py +4 -0
  3. endoreg_db/apps.py +12 -0
  4. endoreg_db/assets/dummy_model.ckpt +1 -0
  5. endoreg_db/codemods/readme.md +88 -0
  6. endoreg_db/codemods/rename_datetime_fields.py +92 -0
  7. endoreg_db/config/env.py +101 -0
  8. endoreg_db/data/__init__.py +12 -0
  9. endoreg_db/data/ai_model/data.yaml +1 -1
  10. endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
  11. endoreg_db/data/ai_model_label/label-set/data.yaml +20 -1
  12. endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
  13. endoreg_db/data/center/data.yaml +13 -12
  14. endoreg_db/data/center_shift/ukw.yaml +9 -0
  15. endoreg_db/data/db_summary.csv +58 -0
  16. endoreg_db/data/db_summary.xlsx +0 -0
  17. endoreg_db/data/disease/misc.yaml +1 -2
  18. endoreg_db/data/endoscopy_processor/data.yaml +3 -0
  19. endoreg_db/data/event/cardiology.yaml +0 -13
  20. endoreg_db/data/examination/examinations/data.yaml +14 -9
  21. endoreg_db/data/examination_indication/endoscopy.yaml +30 -30
  22. endoreg_db/data/examination_indication_classification/endoscopy.yaml +11 -11
  23. endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
  24. endoreg_db/data/finding/anatomy_colon.yaml +128 -0
  25. endoreg_db/data/finding/colonoscopy.yaml +40 -0
  26. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
  27. endoreg_db/data/finding/complication.yaml +16 -0
  28. endoreg_db/data/finding/data.yaml +3 -46
  29. endoreg_db/data/finding/examination_setting.yaml +16 -0
  30. endoreg_db/data/finding/medication_related.yaml +18 -0
  31. endoreg_db/data/finding/outcome.yaml +12 -0
  32. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
  33. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
  34. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
  35. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  36. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  37. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  38. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  39. endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
  40. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
  41. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
  42. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
  43. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
  44. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
  45. endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
  46. endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
  47. endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
  48. endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
  49. endoreg_db/data/finding_classification/medication_related.yaml +23 -0
  50. endoreg_db/data/finding_classification/visualized.yaml +33 -0
  51. endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
  52. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_circularity_default.yaml +0 -2
  53. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  54. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  55. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  56. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_nice.yaml +4 -7
  57. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_paris.yaml +0 -8
  58. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_planarity_default.yaml +6 -13
  59. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  60. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_surface_intact_default.yaml +3 -6
  61. endoreg_db/data/{finding_location_classification_choice/colonoscopy.yaml → finding_classification_choice/colonoscopy_location.yaml} +11 -22
  62. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  63. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
  64. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  65. endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
  66. endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  67. endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
  68. endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
  69. endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
  70. endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
  71. endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
  72. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +8 -3
  73. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +6 -6
  74. endoreg_db/data/finding_type/data.yaml +23 -10
  75. endoreg_db/data/gender/data.yaml +8 -1
  76. endoreg_db/data/information_source/annotation.yaml +6 -0
  77. endoreg_db/data/information_source/prediction.yaml +7 -0
  78. endoreg_db/data/information_source_type/data.yaml +8 -0
  79. endoreg_db/data/lab_value/misc.yaml +43 -0
  80. endoreg_db/data/medication/anticoagulation.yaml +5 -5
  81. endoreg_db/data/medication/tah.yaml +5 -5
  82. endoreg_db/data/medication_intake_time/base.yaml +4 -4
  83. endoreg_db/data/names_first/first_names.yaml +3 -0
  84. endoreg_db/data/pdf_type/data.yaml +26 -2
  85. endoreg_db/data/qualification/endoscopy.yaml +36 -0
  86. endoreg_db/data/qualification/m2.yaml +39 -0
  87. endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
  88. endoreg_db/data/qualification/sonography.yaml +36 -0
  89. endoreg_db/data/qualification_type/base.yaml +29 -0
  90. endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
  91. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
  92. endoreg_db/data/requirement/age.yaml +26 -0
  93. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
  94. endoreg_db/data/requirement/disease_cardiovascular.yaml +6 -6
  95. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +9 -6
  96. endoreg_db/data/requirement/disease_hepatology.yaml +1 -1
  97. endoreg_db/data/requirement/disease_misc.yaml +3 -3
  98. endoreg_db/data/requirement/disease_renal.yaml +18 -2
  99. endoreg_db/data/requirement/{colonoscopy_indications.yaml → endoscopy_bleeding_risk.yaml} +6 -3
  100. endoreg_db/data/requirement/event_cardiology.yaml +17 -17
  101. endoreg_db/data/requirement/event_requirements.yaml +145 -0
  102. endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
  103. endoreg_db/data/requirement/gender.yaml +25 -0
  104. endoreg_db/data/requirement/lab_value.yaml +352 -31
  105. endoreg_db/data/requirement/medication.yaml +93 -0
  106. endoreg_db/data/requirement_operator/age.yaml +13 -0
  107. endoreg_db/data/requirement_operator/lab_operators.yaml +36 -35
  108. endoreg_db/data/requirement_operator/model_operators.yaml +13 -7
  109. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
  110. endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  111. endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +42 -2
  112. endoreg_db/data/requirement_type/requirement_types.yaml +82 -0
  113. endoreg_db/data/shift/endoscopy.yaml +21 -0
  114. endoreg_db/data/shift_type/base.yaml +35 -0
  115. endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
  116. endoreg_db/data/unit/concentration.yaml +23 -0
  117. endoreg_db/exceptions.py +19 -0
  118. endoreg_db/forms/patient_finding_intervention_form.py +4 -5
  119. endoreg_db/forms/patient_form.py +7 -6
  120. endoreg_db/forms/questionnaires/__init__.py +1 -1
  121. endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
  122. endoreg_db/helpers/count_db.py +45 -0
  123. endoreg_db/helpers/data_loader.py +208 -0
  124. endoreg_db/helpers/default_objects.py +359 -0
  125. endoreg_db/helpers/interact.py +6 -0
  126. endoreg_db/helpers/test_video_helper.py +119 -0
  127. endoreg_db/logger_conf.py +140 -0
  128. endoreg_db/management/__init__.py +1 -0
  129. endoreg_db/management/commands/__init__.py +1 -0
  130. endoreg_db/management/commands/anonymize_video.py +0 -0
  131. endoreg_db/management/commands/check_auth.py +125 -0
  132. endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
  133. endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
  134. endoreg_db/management/commands/fix_video_paths.py +165 -0
  135. endoreg_db/management/commands/import_fallback_video.py +203 -0
  136. endoreg_db/management/commands/import_report.py +298 -0
  137. endoreg_db/management/commands/import_video.py +422 -0
  138. endoreg_db/management/commands/import_video_with_classification.py +367 -0
  139. endoreg_db/management/commands/init_default_ai_model.py +112 -0
  140. endoreg_db/management/commands/load_ai_model_data.py +2 -7
  141. endoreg_db/management/commands/load_base_db_data.py +1 -0
  142. endoreg_db/management/commands/load_endoscope_data.py +2 -2
  143. endoreg_db/management/commands/load_examination_indication_data.py +2 -3
  144. endoreg_db/management/commands/load_finding_data.py +49 -92
  145. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
  146. endoreg_db/management/commands/load_information_source.py +13 -7
  147. endoreg_db/management/commands/load_name_data.py +37 -0
  148. endoreg_db/management/commands/load_qualification_data.py +59 -0
  149. endoreg_db/management/commands/load_requirement_data.py +30 -6
  150. endoreg_db/management/commands/load_shift_data.py +60 -0
  151. endoreg_db/management/commands/load_tag_data.py +57 -0
  152. endoreg_db/management/commands/register_ai_model.py +1 -1
  153. endoreg_db/management/commands/start_filewatcher.py +106 -0
  154. endoreg_db/management/commands/storage_management.py +548 -0
  155. endoreg_db/management/commands/summarize_db_content.py +189 -0
  156. endoreg_db/management/commands/validate_video.py +204 -0
  157. endoreg_db/management/commands/validate_video_files.py +161 -0
  158. endoreg_db/management/commands/video_validation.py +22 -0
  159. endoreg_db/migrations/0001_initial.py +625 -813
  160. endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
  161. endoreg_db/models/__init__.py +270 -307
  162. endoreg_db/models/administration/__init__.py +116 -0
  163. endoreg_db/models/{ai_model → administration/ai}/__init__.py +6 -1
  164. endoreg_db/models/administration/ai/active_model.py +35 -0
  165. endoreg_db/models/administration/ai/ai_model.py +156 -0
  166. endoreg_db/models/{ai_model → administration/ai}/model_type.py +6 -1
  167. endoreg_db/models/administration/case/__init__.py +19 -0
  168. endoreg_db/models/administration/case/case.py +114 -0
  169. endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +3 -3
  170. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +3 -10
  171. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +2 -4
  172. endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
  173. endoreg_db/models/{center → administration/center}/__init__.py +3 -1
  174. endoreg_db/models/administration/center/center.py +61 -0
  175. endoreg_db/models/administration/center/center_product.py +64 -0
  176. endoreg_db/models/{center → administration/center}/center_resource.py +19 -3
  177. endoreg_db/models/administration/center/center_shift.py +88 -0
  178. endoreg_db/models/administration/center/center_waste.py +30 -0
  179. endoreg_db/models/administration/permissions/__init__.py +44 -0
  180. endoreg_db/models/administration/person/__init__.py +24 -0
  181. endoreg_db/models/administration/person/employee/__init__.py +3 -0
  182. endoreg_db/models/administration/person/employee/employee.py +35 -0
  183. endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
  184. endoreg_db/models/administration/person/employee/employee_type.py +42 -0
  185. endoreg_db/models/administration/person/examiner/__init__.py +4 -0
  186. endoreg_db/models/administration/person/examiner/examiner.py +54 -0
  187. endoreg_db/models/administration/person/names/__init__.py +0 -0
  188. endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
  189. endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
  190. endoreg_db/models/administration/person/patient/__init__.py +5 -0
  191. endoreg_db/models/administration/person/patient/patient.py +460 -0
  192. endoreg_db/models/administration/person/profession/__init__.py +24 -0
  193. endoreg_db/models/administration/person/user/__init__.py +5 -0
  194. endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
  195. endoreg_db/models/administration/product/product.py +97 -0
  196. endoreg_db/models/administration/product/product_group.py +39 -0
  197. endoreg_db/models/administration/product/product_material.py +54 -0
  198. endoreg_db/models/{product → administration/product}/product_weight.py +9 -0
  199. endoreg_db/models/{product → administration/product}/reference_product.py +26 -11
  200. endoreg_db/models/administration/qualification/__init__.py +7 -0
  201. endoreg_db/models/administration/qualification/qualification.py +37 -0
  202. endoreg_db/models/administration/qualification/qualification_type.py +35 -0
  203. endoreg_db/models/administration/shift/__init__.py +9 -0
  204. endoreg_db/models/administration/shift/scheduled_days.py +69 -0
  205. endoreg_db/models/administration/shift/shift.py +51 -0
  206. endoreg_db/models/administration/shift/shift_type.py +108 -0
  207. endoreg_db/models/label/__init__.py +24 -1
  208. endoreg_db/models/label/annotation/__init__.py +12 -0
  209. endoreg_db/models/label/annotation/image_classification.py +84 -0
  210. endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
  211. endoreg_db/models/label/label.py +45 -74
  212. endoreg_db/models/label/label_set.py +53 -0
  213. endoreg_db/models/label/label_type.py +29 -0
  214. endoreg_db/models/label/label_video_segment/__init__.py +3 -0
  215. endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
  216. endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
  217. endoreg_db/models/label/video_segmentation_label.py +31 -0
  218. endoreg_db/models/{annotation → label}/video_segmentation_labelset.py +7 -0
  219. endoreg_db/models/media/__init__.py +14 -0
  220. endoreg_db/models/media/frame/__init__.py +3 -0
  221. endoreg_db/models/media/frame/frame.py +111 -0
  222. endoreg_db/models/media/pdf/__init__.py +11 -0
  223. endoreg_db/models/media/pdf/raw_pdf.py +608 -0
  224. endoreg_db/models/media/pdf/report_file.py +162 -0
  225. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
  226. endoreg_db/models/media/video/__init__.py +4 -0
  227. endoreg_db/models/media/video/create_from_file.py +336 -0
  228. endoreg_db/models/media/video/pipe_1.py +195 -0
  229. endoreg_db/models/media/video/pipe_2.py +105 -0
  230. endoreg_db/models/media/video/refactor_plan.md +0 -0
  231. endoreg_db/models/media/video/video_file.py +680 -0
  232. endoreg_db/models/media/video/video_file_ai.py +443 -0
  233. endoreg_db/models/media/video/video_file_anonymize.py +348 -0
  234. endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
  235. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
  236. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
  237. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
  238. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
  239. endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
  240. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
  241. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
  242. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
  243. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
  244. endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
  245. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
  246. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +129 -0
  247. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
  248. endoreg_db/models/media/video/video_file_frames.py +0 -0
  249. endoreg_db/models/media/video/video_file_io.py +166 -0
  250. endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
  251. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
  252. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
  253. endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
  254. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
  255. endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
  256. endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
  257. endoreg_db/models/media/video/video_file_meta.py +11 -0
  258. endoreg_db/models/media/video/video_file_segments.py +209 -0
  259. endoreg_db/models/medical/__init__.py +146 -0
  260. endoreg_db/models/{contraindication → medical/contraindication}/__init__.py +1 -5
  261. endoreg_db/models/{disease.py → medical/disease.py} +60 -52
  262. endoreg_db/models/{event.py → medical/event.py} +31 -54
  263. endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
  264. endoreg_db/models/medical/examination/examination.py +148 -0
  265. endoreg_db/models/{examination → medical/examination}/examination_indication.py +64 -35
  266. endoreg_db/models/{examination → medical/examination}/examination_time.py +0 -4
  267. endoreg_db/models/{examination → medical/examination}/examination_time_type.py +1 -8
  268. endoreg_db/models/{examination → medical/examination}/examination_type.py +1 -7
  269. endoreg_db/models/medical/finding/__init__.py +18 -0
  270. endoreg_db/models/medical/finding/finding.py +96 -0
  271. endoreg_db/models/medical/finding/finding_classification.py +142 -0
  272. endoreg_db/models/{finding → medical/finding}/finding_intervention.py +2 -10
  273. endoreg_db/models/medical/finding/finding_type.py +35 -0
  274. endoreg_db/models/medical/hardware/__init__.py +8 -0
  275. endoreg_db/models/{hardware → medical/hardware}/endoscope.py +28 -23
  276. endoreg_db/models/medical/laboratory/__init__.py +5 -0
  277. endoreg_db/models/medical/laboratory/lab_value.py +419 -0
  278. endoreg_db/models/{medication → medical/medication}/medication.py +1 -3
  279. endoreg_db/models/{medication → medical/medication}/medication_indication_type.py +8 -3
  280. endoreg_db/models/{medication → medical/medication}/medication_intake_time.py +21 -3
  281. endoreg_db/models/{medication → medical/medication}/medication_schedule.py +13 -5
  282. endoreg_db/models/{organ → medical/organ}/__init__.py +3 -6
  283. endoreg_db/models/medical/patient/__init__.py +56 -0
  284. endoreg_db/models/medical/patient/medication_examples.py +38 -0
  285. endoreg_db/models/medical/patient/patient_disease.py +63 -0
  286. endoreg_db/models/medical/patient/patient_event.py +75 -0
  287. endoreg_db/models/medical/patient/patient_examination.py +249 -0
  288. endoreg_db/models/{persons → medical}/patient/patient_examination_indication.py +21 -9
  289. endoreg_db/models/medical/patient/patient_finding.py +357 -0
  290. endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
  291. endoreg_db/models/{patient → medical/patient}/patient_finding_intervention.py +15 -1
  292. endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
  293. endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +40 -15
  294. endoreg_db/models/medical/patient/patient_medication.py +104 -0
  295. endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
  296. endoreg_db/models/{risk → medical/risk}/risk_type.py +0 -4
  297. endoreg_db/models/{data_file/metadata → metadata}/__init__.py +6 -0
  298. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  299. endoreg_db/models/metadata/model_meta.py +193 -0
  300. endoreg_db/models/metadata/model_meta_logic.py +236 -0
  301. endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +28 -13
  302. endoreg_db/models/metadata/sensitive_meta.py +288 -0
  303. endoreg_db/models/metadata/sensitive_meta_logic.py +643 -0
  304. endoreg_db/models/metadata/video_meta.py +332 -0
  305. endoreg_db/models/metadata/video_prediction_logic.py +190 -0
  306. endoreg_db/models/metadata/video_prediction_meta.py +270 -0
  307. endoreg_db/models/other/__init__.py +17 -0
  308. endoreg_db/models/other/distribution/date_value_distribution.py +0 -2
  309. endoreg_db/models/other/distribution/numeric_value_distribution.py +30 -2
  310. endoreg_db/models/{emission → other/emission}/emission_factor.py +15 -6
  311. endoreg_db/models/{persons → other}/gender.py +8 -3
  312. endoreg_db/models/other/information_source.py +159 -0
  313. endoreg_db/models/other/material.py +10 -2
  314. endoreg_db/models/other/resource.py +6 -2
  315. endoreg_db/models/other/tag.py +27 -0
  316. endoreg_db/models/other/transport_route.py +13 -2
  317. endoreg_db/models/{unit.py → other/unit.py} +16 -6
  318. endoreg_db/models/other/waste.py +10 -3
  319. endoreg_db/models/requirement/requirement.py +556 -114
  320. endoreg_db/models/requirement/requirement_evaluation/__init__.py +4 -132
  321. endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
  322. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
  323. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +80 -87
  324. endoreg_db/models/requirement/requirement_operator.py +132 -14
  325. endoreg_db/models/requirement/requirement_set.py +181 -21
  326. endoreg_db/models/rule/__init__.py +13 -0
  327. endoreg_db/models/{rules → rule}/rule.py +6 -3
  328. endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
  329. endoreg_db/models/{rules → rule}/rule_type.py +0 -2
  330. endoreg_db/models/{rules → rule}/ruleset.py +0 -2
  331. endoreg_db/models/state/__init__.py +12 -0
  332. endoreg_db/models/state/abstract.py +11 -0
  333. endoreg_db/models/state/audit_ledger.py +150 -0
  334. endoreg_db/models/state/label_video_segment.py +22 -0
  335. endoreg_db/models/state/raw_pdf.py +187 -0
  336. endoreg_db/models/state/sensitive_meta.py +46 -0
  337. endoreg_db/models/state/video.py +232 -0
  338. endoreg_db/models/upload_job.py +99 -0
  339. endoreg_db/models/utils.py +135 -0
  340. endoreg_db/models/video_metadata.py +66 -0
  341. endoreg_db/models/video_processing.py +153 -0
  342. endoreg_db/renames.yml +8 -0
  343. endoreg_db/root_urls.py +9 -0
  344. endoreg_db/schemas/__init__.py +0 -0
  345. endoreg_db/schemas/examination_evaluation.py +27 -0
  346. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
  347. endoreg_db/serializers/__init__.py +147 -10
  348. endoreg_db/serializers/{raw_pdf_meta_validation.py → _old/raw_pdf_meta_validation.py} +3 -3
  349. endoreg_db/serializers/{raw_video_meta_validation.py → _old/raw_video_meta_validation.py} +18 -14
  350. endoreg_db/serializers/_old/video.py +71 -0
  351. endoreg_db/serializers/administration/__init__.py +14 -0
  352. endoreg_db/serializers/administration/ai/__init__.py +10 -0
  353. endoreg_db/serializers/administration/ai/active_model.py +10 -0
  354. endoreg_db/serializers/administration/ai/ai_model.py +18 -0
  355. endoreg_db/serializers/administration/ai/model_type.py +10 -0
  356. endoreg_db/serializers/administration/center.py +9 -0
  357. endoreg_db/serializers/administration/gender.py +9 -0
  358. endoreg_db/serializers/anonymization.py +66 -0
  359. endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
  360. endoreg_db/serializers/examination/__init__.py +10 -0
  361. endoreg_db/serializers/examination/base.py +46 -0
  362. endoreg_db/serializers/examination/dropdown.py +21 -0
  363. endoreg_db/serializers/examination_serializer.py +12 -0
  364. endoreg_db/serializers/finding/__init__.py +5 -0
  365. endoreg_db/serializers/finding/finding.py +54 -0
  366. endoreg_db/serializers/finding_classification/__init__.py +7 -0
  367. endoreg_db/serializers/finding_classification/choice.py +19 -0
  368. endoreg_db/serializers/finding_classification/classification.py +13 -0
  369. endoreg_db/serializers/label/__init__.py +7 -0
  370. endoreg_db/serializers/label/image_classification_annotation.py +62 -0
  371. endoreg_db/serializers/label/label.py +15 -0
  372. endoreg_db/serializers/label_video_segment/__init__.py +7 -0
  373. endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
  374. endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
  375. endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
  376. endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
  377. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
  378. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
  379. endoreg_db/serializers/meta/__init__.py +19 -0
  380. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
  381. endoreg_db/serializers/meta/report_meta.py +53 -0
  382. endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
  383. endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
  384. endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
  385. endoreg_db/serializers/meta/video_meta.py +39 -0
  386. endoreg_db/serializers/misc/__init__.py +14 -0
  387. endoreg_db/serializers/misc/file_overview.py +152 -0
  388. endoreg_db/serializers/misc/stats.py +33 -0
  389. endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
  390. endoreg_db/serializers/misc/upload_job.py +71 -0
  391. endoreg_db/serializers/misc/vop_patient_data.py +120 -0
  392. endoreg_db/serializers/patient/__init__.py +11 -0
  393. endoreg_db/serializers/patient/patient.py +86 -0
  394. endoreg_db/serializers/patient/patient_dropdown.py +27 -0
  395. endoreg_db/serializers/patient_examination/__init__.py +7 -0
  396. endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
  397. endoreg_db/serializers/patient_finding/__init__.py +15 -0
  398. endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
  399. endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
  400. endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
  401. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
  402. endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
  403. endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
  404. endoreg_db/serializers/pdf/__init__.py +5 -0
  405. endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
  406. endoreg_db/serializers/report/__init__.py +9 -0
  407. endoreg_db/serializers/report/mixins.py +45 -0
  408. endoreg_db/serializers/report/report.py +105 -0
  409. endoreg_db/serializers/report/report_list.py +22 -0
  410. endoreg_db/serializers/report/secure_file_url.py +26 -0
  411. endoreg_db/serializers/requirements/requirement_schema.py +25 -0
  412. endoreg_db/serializers/requirements/requirement_sets.py +29 -0
  413. endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
  414. endoreg_db/serializers/video/__init__.py +7 -0
  415. endoreg_db/serializers/video/segmentation.py +263 -0
  416. endoreg_db/serializers/video/video_file_brief.py +10 -0
  417. endoreg_db/serializers/video/video_file_detail.py +83 -0
  418. endoreg_db/serializers/video/video_file_list.py +67 -0
  419. endoreg_db/serializers/video/video_metadata.py +105 -0
  420. endoreg_db/serializers/video/video_processing_history.py +153 -0
  421. endoreg_db/services/__init__.py +5 -0
  422. endoreg_db/services/anonymization.py +223 -0
  423. endoreg_db/services/examination_evaluation.py +149 -0
  424. endoreg_db/services/finding_description_service.py +0 -0
  425. endoreg_db/services/lookup_service.py +241 -0
  426. endoreg_db/services/lookup_store.py +122 -0
  427. endoreg_db/services/ollama_api_docs.py +1528 -0
  428. endoreg_db/services/pdf_import.py +993 -0
  429. endoreg_db/services/polling_coordinator.py +288 -0
  430. endoreg_db/services/pseudonym_service.py +89 -0
  431. endoreg_db/services/requirements_object.py +147 -0
  432. endoreg_db/services/segment_sync.py +155 -0
  433. endoreg_db/services/storage_aware_video_processor.py +344 -0
  434. endoreg_db/services/video_import.py +915 -0
  435. endoreg_db/tasks/upload_tasks.py +207 -0
  436. endoreg_db/tasks/video_ingest.py +157 -0
  437. endoreg_db/tasks/video_processing_tasks.py +327 -0
  438. endoreg_db/urls/__init__.py +72 -0
  439. endoreg_db/urls/anonymization.py +32 -0
  440. endoreg_db/urls/auth.py +16 -0
  441. endoreg_db/urls/classification.py +39 -0
  442. endoreg_db/urls/examination.py +54 -0
  443. endoreg_db/urls/files.py +6 -0
  444. endoreg_db/urls/label_video_segment_validate.py +33 -0
  445. endoreg_db/urls/label_video_segments.py +44 -0
  446. endoreg_db/urls/media.py +32 -0
  447. endoreg_db/urls/patient.py +19 -0
  448. endoreg_db/urls/pdf.py +0 -0
  449. endoreg_db/urls/report.py +78 -0
  450. endoreg_db/urls/requirements.py +13 -0
  451. endoreg_db/urls/sensitive_meta.py +36 -0
  452. endoreg_db/urls/stats.py +46 -0
  453. endoreg_db/urls/upload.py +20 -0
  454. endoreg_db/urls/video.py +119 -0
  455. endoreg_db/urls.py +6 -283
  456. endoreg_db/utils/__init__.py +66 -57
  457. endoreg_db/utils/ai/__init__.py +9 -0
  458. endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
  459. endoreg_db/{models/ai_model/lightning → utils/ai}/inference_dataset.py +0 -1
  460. endoreg_db/{models/ai_model/lightning → utils/ai}/multilabel_classification_net.py +14 -10
  461. endoreg_db/{models/ai_model/lightning → utils/ai}/postprocess.py +15 -5
  462. endoreg_db/utils/ai/predict.py +291 -0
  463. endoreg_db/{models/ai_model/lightning → utils/ai}/preprocess.py +1 -1
  464. endoreg_db/utils/calc_duration_seconds.py +24 -0
  465. endoreg_db/utils/case_generator/__init__.py +0 -0
  466. endoreg_db/utils/check_video_files.py +148 -0
  467. endoreg_db/utils/dataloader.py +50 -12
  468. endoreg_db/utils/dates.py +21 -0
  469. endoreg_db/utils/env.py +33 -0
  470. endoreg_db/utils/extract_specific_frames.py +72 -0
  471. endoreg_db/utils/file_operations.py +29 -1
  472. endoreg_db/utils/fix_video_path_direct.py +141 -0
  473. endoreg_db/utils/frame_anonymization_utils.py +463 -0
  474. endoreg_db/utils/links/__init__.py +0 -0
  475. endoreg_db/utils/links/requirement_link.py +193 -0
  476. endoreg_db/utils/mime_types.py +0 -0
  477. endoreg_db/utils/names.py +2 -0
  478. endoreg_db/utils/paths.py +100 -82
  479. endoreg_db/utils/permissions.py +143 -0
  480. endoreg_db/utils/pipelines/Readme.md +235 -0
  481. endoreg_db/utils/pipelines/__init__.py +0 -0
  482. endoreg_db/utils/pipelines/process_video_dir.py +120 -0
  483. endoreg_db/utils/product/__init__.py +0 -0
  484. endoreg_db/utils/product/sum_emissions.py +20 -0
  485. endoreg_db/utils/product/sum_weights.py +18 -0
  486. endoreg_db/utils/pydantic_models/db_config.py +1 -1
  487. endoreg_db/utils/requirement_helpers.py +0 -0
  488. endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
  489. endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
  490. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
  491. endoreg_db/utils/translation.py +27 -0
  492. endoreg_db/utils/validate_video_detailed.py +357 -0
  493. endoreg_db/utils/video/__init__.py +19 -6
  494. endoreg_db/utils/video/extract_frames.py +37 -70
  495. endoreg_db/utils/video/ffmpeg_wrapper.py +772 -0
  496. endoreg_db/utils/video/names.py +42 -0
  497. endoreg_db/utils/video/streaming_processor.py +312 -0
  498. endoreg_db/utils/video/video_splitter.py +94 -0
  499. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
  500. endoreg_db/views/__init__.py +282 -2
  501. endoreg_db/views/anonymization/__init__.py +27 -0
  502. endoreg_db/views/anonymization/media_management.py +454 -0
  503. endoreg_db/views/anonymization/overview.py +216 -0
  504. endoreg_db/views/anonymization/validate.py +63 -0
  505. endoreg_db/views/auth/__init__.py +13 -0
  506. endoreg_db/views/{views.py → auth/keycloak.py} +19 -13
  507. endoreg_db/views/examination/__init__.py +33 -0
  508. endoreg_db/views/examination/examination.py +37 -0
  509. endoreg_db/views/examination/examination_manifest_cache.py +26 -0
  510. endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
  511. endoreg_db/views/examination/get_finding_classifications.py +36 -0
  512. endoreg_db/views/examination/get_findings.py +41 -0
  513. endoreg_db/views/examination/get_instruments.py +18 -0
  514. endoreg_db/views/examination/get_interventions.py +14 -0
  515. endoreg_db/views/finding/__init__.py +9 -0
  516. endoreg_db/views/finding/finding.py +112 -0
  517. endoreg_db/views/finding/get_classifications.py +14 -0
  518. endoreg_db/views/finding/get_interventions.py +17 -0
  519. endoreg_db/views/finding_classification/__init__.py +13 -0
  520. endoreg_db/views/finding_classification/base.py +0 -0
  521. endoreg_db/views/finding_classification/finding_classification.py +42 -0
  522. endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
  523. endoreg_db/views/label/__init__.py +5 -0
  524. endoreg_db/views/label/label.py +15 -0
  525. endoreg_db/views/label_video_segment/__init__.py +16 -0
  526. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
  527. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
  528. endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
  529. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
  530. endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
  531. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
  532. endoreg_db/views/label_video_segment/validate.py +226 -0
  533. endoreg_db/views/media/__init__.py +9 -0
  534. endoreg_db/views/media/pdf_media.py +386 -0
  535. endoreg_db/views/media/video_media.py +272 -0
  536. endoreg_db/views/meta/__init__.py +15 -0
  537. endoreg_db/views/meta/available_files_list.py +146 -0
  538. endoreg_db/views/meta/report_meta.py +53 -0
  539. endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
  540. endoreg_db/views/meta/sensitive_meta_list.py +104 -0
  541. endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
  542. endoreg_db/views/misc/__init__.py +63 -0
  543. endoreg_db/views/misc/center.py +13 -0
  544. endoreg_db/views/misc/gender.py +14 -0
  545. endoreg_db/views/misc/secure_file_serving_view.py +80 -0
  546. endoreg_db/views/misc/secure_file_url_view.py +84 -0
  547. endoreg_db/views/misc/secure_url_validate.py +79 -0
  548. endoreg_db/views/misc/stats.py +220 -0
  549. endoreg_db/views/misc/translation.py +182 -0
  550. endoreg_db/views/misc/upload_views.py +240 -0
  551. endoreg_db/views/patient/__init__.py +5 -0
  552. endoreg_db/views/patient/patient.py +210 -0
  553. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
  554. endoreg_db/views/patient_examination/__init__.py +11 -0
  555. endoreg_db/views/patient_examination/patient_examination.py +140 -0
  556. endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
  557. endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
  558. endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
  559. endoreg_db/views/patient_examination/video.py +194 -0
  560. endoreg_db/views/patient_finding/__init__.py +7 -0
  561. endoreg_db/views/patient_finding/base.py +0 -0
  562. endoreg_db/views/patient_finding/patient_finding.py +64 -0
  563. endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
  564. endoreg_db/views/patient_finding_classification/__init__.py +5 -0
  565. endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
  566. endoreg_db/views/patient_finding_location/__init__.py +5 -0
  567. endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
  568. endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
  569. endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
  570. endoreg_db/views/pdf/__init__.py +11 -0
  571. endoreg_db/views/pdf/pdf_media.py +239 -0
  572. endoreg_db/views/pdf/pdf_stream_views.py +127 -0
  573. endoreg_db/views/pdf/reimport.py +151 -0
  574. endoreg_db/views/report/__init__.py +9 -0
  575. endoreg_db/views/report/report_list.py +112 -0
  576. endoreg_db/views/report/report_with_secure_url.py +28 -0
  577. endoreg_db/views/report/start_examination.py +7 -0
  578. endoreg_db/views/requirement/__init__.py +10 -0
  579. endoreg_db/views/requirement/evaluate.py +279 -0
  580. endoreg_db/views/requirement/lookup.py +483 -0
  581. endoreg_db/views/requirement/lookup_store.py +252 -0
  582. endoreg_db/views/requirement_lookup/lookup.py +0 -0
  583. endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
  584. endoreg_db/views/stats/__init__.py +13 -0
  585. endoreg_db/views/stats/stats_views.py +229 -0
  586. endoreg_db/views/video/__init__.py +72 -0
  587. endoreg_db/views/video/correction.py +672 -0
  588. endoreg_db/views/video/media/__init__.py +23 -0
  589. endoreg_db/views/video/media/task_status.py +49 -0
  590. endoreg_db/views/video/media/video_analyze.py +52 -0
  591. endoreg_db/views/video/media/video_apply_mask.py +48 -0
  592. endoreg_db/views/video/media/video_correction.py +21 -0
  593. endoreg_db/views/video/media/video_download_processed.py +58 -0
  594. endoreg_db/views/video/media/video_media.py +158 -0
  595. endoreg_db/views/video/media/video_meta.py +29 -0
  596. endoreg_db/views/video/media/video_processing_history.py +24 -0
  597. endoreg_db/views/video/media/video_remove_frames.py +48 -0
  598. endoreg_db/views/video/media/video_reprocess.py +40 -0
  599. endoreg_db/views/video/reimport.py +192 -0
  600. endoreg_db/views/video/segmentation.py +274 -0
  601. endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
  602. endoreg_db/views/video/video_examination_viewset.py +329 -0
  603. endoreg_db/views/video/video_stream.py +188 -0
  604. endoreg_db-0.8.1.dist-info/METADATA +384 -0
  605. endoreg_db-0.8.1.dist-info/RECORD +789 -0
  606. endoreg_db/data/agl_service/data.yaml +0 -19
  607. endoreg_db/data/finding_location_classification/colonoscopy.yaml +0 -46
  608. endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +0 -48
  609. endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +0 -57
  610. endoreg_db/management/commands/_load_model_template.py +0 -41
  611. endoreg_db/management/commands/delete_all.py +0 -18
  612. endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
  613. endoreg_db/management/commands/fix_auth_permission.py +0 -20
  614. endoreg_db/management/commands/load_active_model_data.py +0 -45
  615. endoreg_db/management/commands/load_g_play_data.py +0 -113
  616. endoreg_db/management/commands/load_logging_data.py +0 -39
  617. endoreg_db/management/commands/load_lx_data.py +0 -64
  618. endoreg_db/management/commands/load_medication_indication_data.py +0 -63
  619. endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
  620. endoreg_db/management/commands/load_medication_intake_time_data.py +0 -41
  621. endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
  622. endoreg_db/management/commands/load_network_data.py +0 -57
  623. endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +0 -23
  624. endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +0 -23
  625. endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +0 -25
  626. endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +0 -33
  627. endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +0 -23
  628. endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +0 -24
  629. endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +0 -48
  630. endoreg_db/migrations/0009_requirementoperator_requirementsettype_and_more.py +0 -154
  631. endoreg_db/models/ai_model/active_model.py +0 -9
  632. endoreg_db/models/ai_model/ai_model.py +0 -90
  633. endoreg_db/models/ai_model/lightning/__init__.py +0 -3
  634. endoreg_db/models/ai_model/lightning/predict.py +0 -172
  635. endoreg_db/models/ai_model/lightning/prediction_visualizer.py +0 -55
  636. endoreg_db/models/ai_model/lightning/run_visualizer.py +0 -21
  637. endoreg_db/models/ai_model/model_meta.py +0 -240
  638. endoreg_db/models/annotation/__init__.py +0 -32
  639. endoreg_db/models/annotation/anonymized_image_annotation.py +0 -115
  640. endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -117
  641. endoreg_db/models/annotation/image_classification.py +0 -86
  642. endoreg_db/models/annotation/video_segmentation_annotation.py +0 -52
  643. endoreg_db/models/case/__init__.py +0 -1
  644. endoreg_db/models/case/case.py +0 -34
  645. endoreg_db/models/center/center.py +0 -51
  646. endoreg_db/models/center/center_product.py +0 -33
  647. endoreg_db/models/center/center_waste.py +0 -16
  648. endoreg_db/models/data_file/__init__.py +0 -39
  649. endoreg_db/models/data_file/base_classes/__init__.py +0 -7
  650. endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -98
  651. endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -127
  652. endoreg_db/models/data_file/base_classes/abstract_video.py +0 -806
  653. endoreg_db/models/data_file/base_classes/frame_helpers.py +0 -17
  654. endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +0 -19
  655. endoreg_db/models/data_file/base_classes/utils.py +0 -58
  656. endoreg_db/models/data_file/frame.py +0 -29
  657. endoreg_db/models/data_file/import_classes/__init__.py +0 -18
  658. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
  659. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
  660. endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
  661. endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -254
  662. endoreg_db/models/data_file/import_classes/raw_video.py +0 -290
  663. endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -290
  664. endoreg_db/models/data_file/metadata/video_meta.py +0 -199
  665. endoreg_db/models/data_file/report_file.py +0 -56
  666. endoreg_db/models/data_file/video/__init__.py +0 -11
  667. endoreg_db/models/data_file/video/import_meta.py +0 -25
  668. endoreg_db/models/data_file/video/video.py +0 -196
  669. endoreg_db/models/data_file/video_segment.py +0 -214
  670. endoreg_db/models/examination/examination.py +0 -67
  671. endoreg_db/models/finding/__init__.py +0 -11
  672. endoreg_db/models/finding/finding.py +0 -75
  673. endoreg_db/models/finding/finding_location_classification.py +0 -94
  674. endoreg_db/models/finding/finding_morphology_classification.py +0 -89
  675. endoreg_db/models/finding/finding_type.py +0 -22
  676. endoreg_db/models/hardware/__init__.py +0 -2
  677. endoreg_db/models/information_source.py +0 -65
  678. endoreg_db/models/laboratory/__init__.py +0 -1
  679. endoreg_db/models/laboratory/lab_value.py +0 -162
  680. endoreg_db/models/logging/__init__.py +0 -11
  681. endoreg_db/models/logging/agl_service.py +0 -19
  682. endoreg_db/models/logging/base.py +0 -22
  683. endoreg_db/models/logging/log_type.py +0 -23
  684. endoreg_db/models/logging/network_device.py +0 -27
  685. endoreg_db/models/lx/__init__.py +0 -4
  686. endoreg_db/models/lx/client.py +0 -57
  687. endoreg_db/models/lx/identity.py +0 -34
  688. endoreg_db/models/lx/permission.py +0 -18
  689. endoreg_db/models/lx/user.py +0 -16
  690. endoreg_db/models/network/__init__.py +0 -9
  691. endoreg_db/models/network/agl_service.py +0 -38
  692. endoreg_db/models/network/network_device.py +0 -58
  693. endoreg_db/models/network/network_device_type.py +0 -23
  694. endoreg_db/models/other/distribution.py +0 -5
  695. endoreg_db/models/patient/__init__.py +0 -24
  696. endoreg_db/models/patient/patient_examination.py +0 -182
  697. endoreg_db/models/patient/patient_finding.py +0 -143
  698. endoreg_db/models/patient/patient_finding_location.py +0 -120
  699. endoreg_db/models/patient/patient_finding_morphology.py +0 -166
  700. endoreg_db/models/permissions/__init__.py +0 -44
  701. endoreg_db/models/persons/__init__.py +0 -34
  702. endoreg_db/models/persons/examiner/__init__.py +0 -2
  703. endoreg_db/models/persons/examiner/examiner.py +0 -60
  704. endoreg_db/models/persons/examiner/examiner_type.py +0 -2
  705. endoreg_db/models/persons/patient/__init__.py +0 -8
  706. endoreg_db/models/persons/patient/patient.py +0 -389
  707. endoreg_db/models/persons/patient/patient_disease.py +0 -22
  708. endoreg_db/models/persons/patient/patient_event.py +0 -52
  709. endoreg_db/models/persons/patient/patient_lab_sample.py +0 -108
  710. endoreg_db/models/persons/patient/patient_medication.py +0 -59
  711. endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -88
  712. endoreg_db/models/persons/portal_user_information.py +0 -27
  713. endoreg_db/models/prediction/__init__.py +0 -8
  714. endoreg_db/models/prediction/image_classification.py +0 -51
  715. endoreg_db/models/prediction/video_prediction_meta.py +0 -306
  716. endoreg_db/models/product/product.py +0 -110
  717. endoreg_db/models/product/product_group.py +0 -27
  718. endoreg_db/models/product/product_material.py +0 -28
  719. endoreg_db/models/questionnaires/__init__.py +0 -114
  720. endoreg_db/models/quiz/__init__.py +0 -9
  721. endoreg_db/models/quiz/quiz_answer.py +0 -41
  722. endoreg_db/models/quiz/quiz_question.py +0 -54
  723. endoreg_db/models/report_reader/report_reader_config.py +0 -53
  724. endoreg_db/models/rules/__init__.py +0 -5
  725. endoreg_db/queries/get/__init__.py +0 -6
  726. endoreg_db/queries/get/center.py +0 -42
  727. endoreg_db/queries/get/model.py +0 -13
  728. endoreg_db/queries/get/patient.py +0 -14
  729. endoreg_db/queries/get/patient_examination.py +0 -20
  730. endoreg_db/queries/get/report_file.py +0 -33
  731. endoreg_db/queries/get/video.py +0 -31
  732. endoreg_db/serializers/ai_model.py +0 -19
  733. endoreg_db/serializers/annotation.py +0 -14
  734. endoreg_db/serializers/center.py +0 -11
  735. endoreg_db/serializers/examination.py +0 -33
  736. endoreg_db/serializers/frame.py +0 -9
  737. endoreg_db/serializers/hardware.py +0 -21
  738. endoreg_db/serializers/label.py +0 -22
  739. endoreg_db/serializers/patient.py +0 -33
  740. endoreg_db/serializers/prediction.py +0 -10
  741. endoreg_db/serializers/raw_pdf_anony_text_validation.py +0 -137
  742. endoreg_db/serializers/report_file.py +0 -7
  743. endoreg_db/serializers/video.py +0 -20
  744. endoreg_db/serializers/video_segmentation.py +0 -574
  745. endoreg_db/tests.py +0 -3
  746. endoreg_db/utils/legacy_ocr.py +0 -201
  747. endoreg_db/utils/video/transcode_videofile.py +0 -111
  748. endoreg_db/views/patient_views.py +0 -90
  749. endoreg_db/views/raw_pdf_anony_text_validation_views.py +0 -95
  750. endoreg_db/views/raw_pdf_meta_validation_views.py +0 -111
  751. endoreg_db/views/raw_video_meta_validation_views.py +0 -148
  752. endoreg_db/views/report_views.py +0 -96
  753. endoreg_db/views/video_segmentation_views.py +0 -166
  754. endoreg_db-0.6.4.dist-info/METADATA +0 -161
  755. endoreg_db-0.6.4.dist-info/RECORD +0 -470
  756. /endoreg_db/{case_generator/__init__.py → api/serializers/finding_descriptions.py} +0 -0
  757. /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
  758. /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
  759. /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
  760. /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
  761. /endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +0 -0
  762. /endoreg_db/models/{persons → administration/person}/person.py +0 -0
  763. /endoreg_db/models/{product → administration/product}/__init__.py +0 -0
  764. /endoreg_db/models/{report_reader → media/pdf/report_reader}/__init__.py +0 -0
  765. /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
  766. /endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +0 -0
  767. /endoreg_db/models/{medication → medical/medication}/__init__.py +0 -0
  768. /endoreg_db/models/{medication → medical/medication}/medication_indication.py +0 -0
  769. /endoreg_db/models/{risk → medical/risk}/__init__.py +0 -0
  770. /endoreg_db/models/{risk → medical/risk}/risk.py +0 -0
  771. /endoreg_db/models/{emission → other/emission}/__init__.py +0 -0
  772. /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
  773. /endoreg_db/{case_generator → utils/case_generator}/case_generator.py +0 -0
  774. /endoreg_db/{case_generator → utils/case_generator}/lab_sample_factory.py +0 -0
  775. /endoreg_db/{case_generator → utils/case_generator}/utils.py +0 -0
  776. /endoreg_db/views/{csrf.py → misc/csrf.py} +0 -0
  777. {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
  778. {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/licenses/LICENSE +0 -0
endoreg_db/utils/paths.py CHANGED
@@ -1,86 +1,104 @@
1
+ """
2
+ Centralizes path management for the application.
3
+
4
+ This module sets up all necessary directories for storage and import operations.
5
+ It provides a unified dictionary 'data_paths' for accessing all path objects.
6
+ """
7
+
8
+ from logging import getLogger
9
+ logger = getLogger(__name__)
10
+
1
11
  import os
2
12
  from pathlib import Path
13
+ from typing import Dict
14
+ import dotenv
15
+
16
+ # Only load .env in non-pytest contexts to avoid leaking dev settings into tests
17
+ if not os.environ.get("PYTEST_CURRENT_TEST"):
18
+ dotenv.load_dotenv()
19
+ else:
20
+ logger.debug("Skipping .env load under pytest")
21
+
22
+ # Define BASE_DIR as the project root (endoreg_db/utils -> endoreg_db -> repo root)
23
+ STORAGE_DIR = Path(os.getenv("STORAGE_DIR"))
24
+
25
+ # Resolve STORAGE_DIR from env or default under BASE_DIR
26
+ #def _resolve_storage_dir() -> Path:
27
+ # env_val = os.getenv("STORAGE_DIR")
28
+ # if env_val:
29
+ # p = Path(env_val)
30
+ # return p if p.is_absolute() else (BASE_DIR / p).resolve()
31
+ # # Do not import django.conf.settings here to avoid early settings configuration.
32
+ # # Fall back to a local storage directory under the repo.
33
+ # return (BASE_DIR / "storage").resolve()
34
+
35
+ # STORAGE_DIR = _resolve_storage_dir()
36
+ STORAGE_DIR.mkdir(parents=True, exist_ok=True)
37
+
38
+ PREFIX_RAW = "raw_"
39
+ STORAGE_DIR_NAME = "data"
40
+ IMPORT_DIR_NAME = "import"
41
+ EXPORT_DIR_NAME = "export"
42
+
43
+ VIDEO_DIR_NAME = "videos"
44
+ ANONYM_VIDEO_DIR_NAME = "anonym_videos" # Added for processed videos
45
+ FRAME_DIR_NAME = "frames"
46
+ PDF_DIR_NAME = "pdfs" # Changed from reports
47
+ WEIGHTS_DIR_NAME = "model_weights"
48
+ EXAMINATION_DIR_NAME = "examinations"
49
+
50
+ RAW_VIDEO_DIR_NAME = f"{PREFIX_RAW}videos"
51
+ RAW_FRAME_DIR_NAME = f"{PREFIX_RAW}frames"
52
+ RAW_PDF_DIR_NAME = f"{PREFIX_RAW}pdfs" # Changed from reports
53
+
54
+ # Define data subdirectories under STORAGE_DIR
55
+ VIDEO_DIR = STORAGE_DIR / VIDEO_DIR_NAME
56
+ ANONYM_VIDEO_DIR = STORAGE_DIR / ANONYM_VIDEO_DIR_NAME # Added
57
+ FRAME_DIR = STORAGE_DIR / FRAME_DIR_NAME
58
+ PDF_DIR = STORAGE_DIR / PDF_DIR_NAME # Changed
59
+ WEIGHTS_DIR = STORAGE_DIR / WEIGHTS_DIR_NAME
60
+ RAW_VIDEO_DIR = STORAGE_DIR / RAW_VIDEO_DIR_NAME
61
+ RAW_FRAME_DIR = STORAGE_DIR / RAW_FRAME_DIR_NAME
62
+ RAW_PDF_DIR = STORAGE_DIR / RAW_PDF_DIR_NAME # Changed
63
+
64
+ IMPORT_DIR = STORAGE_DIR / IMPORT_DIR_NAME
65
+ VIDEO_IMPORT_DIR = IMPORT_DIR / VIDEO_DIR_NAME
66
+ FRAME_IMPORT_DIR = IMPORT_DIR / FRAME_DIR_NAME
67
+ PDF_IMPORT_DIR = IMPORT_DIR / PDF_DIR_NAME # Changed
68
+ WEIGHTS_IMPORT_DIR = IMPORT_DIR / WEIGHTS_DIR_NAME
69
+
70
+ EXPORT_DIR = STORAGE_DIR / EXPORT_DIR_NAME
71
+
72
+ data_paths:Dict[str,Path] = {
73
+ "storage": STORAGE_DIR,
74
+ "video": VIDEO_DIR,
75
+ "anonym_video": ANONYM_VIDEO_DIR, # Added
76
+ "frame": FRAME_DIR,
77
+ "pdf": PDF_DIR, # Changed
78
+ "import": IMPORT_DIR,
79
+ "video_import": VIDEO_IMPORT_DIR,
80
+ "frame_import": FRAME_IMPORT_DIR,
81
+ "pdf_import": PDF_IMPORT_DIR, # Changed
82
+ "raw_video": RAW_VIDEO_DIR,
83
+ "raw_frame": RAW_FRAME_DIR,
84
+ "raw_pdf": RAW_PDF_DIR, # Changed
85
+ "weights": WEIGHTS_DIR,
86
+ "weights_import": WEIGHTS_IMPORT_DIR,
87
+ "export": EXPORT_DIR,
88
+ "video_export": EXPORT_DIR / VIDEO_DIR_NAME,
89
+ "anonym_video_export": EXPORT_DIR / ANONYM_VIDEO_DIR_NAME, # Added
90
+ "frame_export": EXPORT_DIR / FRAME_DIR_NAME,
91
+ "pdf_export": EXPORT_DIR / PDF_DIR_NAME, # Changed
92
+ "weights_export": EXPORT_DIR / WEIGHTS_DIR_NAME,
93
+ "examination_export": EXPORT_DIR / EXAMINATION_DIR_NAME,
94
+ "raw_video_export": EXPORT_DIR / RAW_VIDEO_DIR_NAME,
95
+ "raw_frame_export": EXPORT_DIR / RAW_FRAME_DIR_NAME,
96
+ "raw_pdf_export": EXPORT_DIR / RAW_PDF_DIR_NAME, # Changed
97
+ }
3
98
 
4
- STORAGE_DIR_NAME = os.environ.get("DJANGO_STORAGE_DIR_NAME", "data")
5
- FRAME_DIR_NAME = os.environ.get("DJANGO_FRAME_DIR_NAME", "db_frames")
6
- VIDEO_DIR_NAME = os.environ.get("DJANGO_VIDEO_DIR_NAME", "db_videos")
7
- WEIGHTS_DIR_NAME = os.environ.get("DJANGO_WEIGHTS_DIR_NAME", "db_model_weights")
8
- PDF_DIR_NAME = os.environ.get("DJANGO_PDF_DIR_NAME", "pdfs")
9
-
10
- def get_storage_dir(raw: bool = False):
11
- """
12
- Get the storage directory from the environment variable or settings.
13
- """
14
- storage_dir = os.environ.get("DJANGO_STORAGE_DIR", "data")
15
- storage_dir = Path(storage_dir).expanduser()
16
-
17
- if raw:
18
- name = storage_dir.name
19
- storage_dir = storage_dir.parent / f"raw_{name}"
20
-
21
-
22
- if not storage_dir.exists():
23
- storage_dir.mkdir(parents=True, exist_ok=True)
24
- return storage_dir
25
-
26
- def get_frame_dir(raw: bool = False):
27
- """
28
- Get the frame directory from the environment variable or settings.
29
- """
30
- frame_dir_name = os.environ.get("DJANGO_FRAME_DIR_NAME", FRAME_DIR_NAME)
31
- storage_dir = get_storage_dir(raw)
32
- frame_dir = storage_dir / frame_dir_name
33
- if not frame_dir.exists():
34
- frame_dir.mkdir(parents=True, exist_ok=True)
35
- return frame_dir
36
-
37
- def get_video_dir(raw: bool = False):
38
- """
39
- Get the video directory from the environment variable or settings.
40
- """
41
- video_dir_name = os.environ.get("DJANGO_VIDEO_DIR_NAME", VIDEO_DIR_NAME)
42
- storage_dir = get_storage_dir(raw)
43
- video_dir = storage_dir / video_dir_name
44
- if not video_dir.exists():
45
- video_dir.mkdir(parents=True, exist_ok=True)
46
- return video_dir
47
-
48
- def get_weights_dir():
49
- """
50
- Get the weights directory from the environment variable or settings.
51
- """
52
- weights_dir_name = os.environ.get("DJANGO_WEIGHTS_DIR_NAME", WEIGHTS_DIR_NAME)
53
- storage_dir = get_storage_dir()
54
- weights_dir = storage_dir / weights_dir_name
55
- if not weights_dir.exists():
56
- weights_dir.mkdir(parents=True, exist_ok=True)
57
- return weights_dir
58
-
59
- def get_pdf_dir(raw: bool = False):
60
- """
61
- Get the pdf directory from the environment variable or settings.
62
- """
63
- pdf_dir_name = os.environ.get("DJANGO_PDF_DIR_NAME", PDF_DIR_NAME)
64
- storage_dir = get_storage_dir(raw)
65
- pdf_dir = storage_dir / pdf_dir_name
66
- if not pdf_dir.exists():
67
- pdf_dir.mkdir(parents=True, exist_ok=True)
68
- return pdf_dir
69
-
70
- STORAGE_DIR = get_storage_dir()
71
- FRAME_DIR = get_frame_dir()
72
- VIDEO_DIR = get_video_dir()
73
- PDF_DIR = get_pdf_dir()
74
- PDF_DIR_NAME = PDF_DIR.name
75
- RAW_VIDEO_DIR = get_video_dir(raw=True)
76
- RAW_VIDEO_DIR_NAME = RAW_VIDEO_DIR.name
77
- RAW_FRAME_DIR = get_frame_dir(raw=True)
78
- RAW_FRAME_DIR_NAME = RAW_FRAME_DIR.name
79
- RAW_PDF_DIR = get_pdf_dir(raw=True)
80
- RAW_PDF_DIR_NAME = RAW_PDF_DIR.name
81
- WEIGHTS_DIR = get_weights_dir()
82
- TEST_RUN = os.environ.get("TEST_RUN", False)
83
- TEST_RUN_FRAME_NUMBER = os.environ.get("TEST_RUN_FRAME_NUMBER", 1000)
84
- # AI Stuff
85
- FRAME_PROCESSING_BATCH_SIZE = os.environ.get("DJANGO_FRAME_PROCESSING_BATCH_SIZE", 10)
99
+ logger.info(f"Storage directory: {STORAGE_DIR.resolve()}")
100
+ logger.info(f"Export directory: {EXPORT_DIR.resolve()}")
86
101
 
102
+ for key, path in data_paths.items():
103
+ path.mkdir(parents=True, exist_ok=True)
104
+ logger.info(f"{key.capitalize()} directory: {path.resolve()}")
@@ -0,0 +1,143 @@
1
+ """
2
+ Dynamic permission utilities that adapt to environment settings.
3
+
4
+ This module provides permission classes that automatically adjust based on
5
+ the DEBUG setting and other environment configurations.
6
+ """
7
+
8
+ from django.conf import settings
9
+ from rest_framework.permissions import IsAuthenticated, AllowAny, BasePermission
10
+ from rest_framework.decorators import permission_classes as drf_permission_classes
11
+ from functools import wraps
12
+ import logging
13
+ import os
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class DynamicAuthPermission:
19
+ """
20
+ Permission class that adapts based on environment settings.
21
+
22
+ - In DEBUG mode: Allows access without authentication
23
+ - In production (DEBUG=False): Requires authentication
24
+ """
25
+
26
+ @staticmethod
27
+ def get_permission_classes():
28
+ """
29
+ Returns appropriate permission classes based on current settings.
30
+
31
+ Returns:
32
+ list: Permission classes to use
33
+ """
34
+ if getattr(settings, 'DEBUG', False):
35
+ logger.info("DEBUG mode detected - allowing unauthenticated access")
36
+ return [AllowAny]
37
+ else:
38
+ logger.info("Production mode detected - requiring authentication")
39
+ return [IsAuthenticated]
40
+
41
+
42
+ def dynamic_permission_classes(force_auth=None):
43
+ """
44
+ Decorator that applies permission classes based on environment settings.
45
+
46
+ Args:
47
+ force_auth (bool, optional):
48
+ - True: Always require authentication regardless of DEBUG
49
+ - False: Always allow access regardless of DEBUG
50
+ - None: Use environment-based logic (default)
51
+ """
52
+ def decorator(view_func):
53
+ @wraps(view_func)
54
+ def wrapper(*args, **kwargs):
55
+ return view_func(*args, **kwargs)
56
+
57
+ # Determine permission classes
58
+ if force_auth is True:
59
+ permission_cls = [IsAuthenticated]
60
+ logger.info(f"View {view_func.__name__} - forced authentication required")
61
+ elif force_auth is False:
62
+ permission_cls = [AllowAny]
63
+ logger.info(f"View {view_func.__name__} - forced public access")
64
+ else:
65
+ permission_cls = DynamicAuthPermission.get_permission_classes()
66
+ logger.info(f"View {view_func.__name__} - dynamic permissions: {permission_cls}")
67
+
68
+ # Apply the permission classes decorator
69
+ return drf_permission_classes(permission_cls)(wrapper)
70
+
71
+ return decorator
72
+
73
+
74
+ def get_auth_required():
75
+ """
76
+ Simple function to check if authentication is required in current environment.
77
+
78
+ Returns:
79
+ bool: True if authentication is required, False otherwise
80
+ """
81
+ return not getattr(settings, 'DEBUG', False)
82
+
83
+
84
+ def is_debug_mode():
85
+ """
86
+ Robustly determine if debug mode is enabled, checking both Django settings and environment variable.
87
+ Also treats active pytest sessions as debug to simplify API tests.
88
+ """
89
+ truthy = {"1", "true", "yes", "on"}
90
+ env_debug = str(os.environ.get("DJANGO_DEBUG", "false")).lower() in truthy
91
+ settings_debug = bool(getattr(settings, 'DEBUG', False))
92
+ pytest_active = "PYTEST_CURRENT_TEST" in os.environ
93
+ result = settings_debug or env_debug or pytest_active
94
+ logger.info(f"is_debug_mode: env={env_debug}, settings={settings_debug}, pytest={pytest_active}, result={result}")
95
+ return result
96
+
97
+ # Compute default permission classes each call to avoid stale values during tests
98
+
99
+ def get_debug_permissions():
100
+ return [AllowAny] if is_debug_mode() else [IsAuthenticated]
101
+
102
+ # Export a name for convenience, but prefer calling get_debug_permissions() in views
103
+ DEBUG_PERMISSIONS = get_debug_permissions()
104
+ ALWAYS_AUTH_PERMISSIONS = [IsAuthenticated]
105
+ ALWAYS_PUBLIC_PERMISSIONS = [AllowAny]
106
+
107
+ # Log the current permission mode
108
+ if is_debug_mode():
109
+ logger.info("🔓 Authentication disabled for DEBUG mode (robust check)")
110
+ else:
111
+ logger.info("🔒 Authentication required for production mode (robust check)")
112
+
113
+
114
+ class EnvironmentAwarePermission(BasePermission):
115
+ """
116
+ Custom permission class that can be used directly in DRF views.
117
+ Honors both Django settings.DEBUG and DJANGO_DEBUG env var.
118
+ """
119
+
120
+ def has_permission(self, request, view):
121
+ """
122
+ Check if the request has permission.
123
+
124
+ Args:
125
+ request: The Django request object
126
+ view: The DRF view
127
+
128
+ Returns:
129
+ bool: True if permission granted, False otherwise
130
+ """
131
+ if is_debug_mode():
132
+ logger.debug(f"DEBUG mode - granting access to {view.__class__.__name__}")
133
+ return True
134
+ # In production, require authentication
135
+ is_authenticated = bool(getattr(request, 'user', None) and request.user.is_authenticated)
136
+ logger.debug(f"Production mode - authentication check for {view.__class__.__name__}: {is_authenticated}")
137
+ return is_authenticated
138
+
139
+ def has_object_permission(self, request, view, obj):
140
+ """
141
+ Object-level permission check.
142
+ """
143
+ return self.has_permission(request, view)
@@ -0,0 +1,235 @@
1
+ # Pipeline Documentation for `process_video_dir.py`
2
+
3
+ **File Path:** `endoreg_db/utils/pipelines/process_video_dir.py`
4
+
5
+ ---
6
+
7
+ > This document outlines the multi-stage video processing pipeline implemented in the `process_video_dir.py` module, covering registration, validation, anonymization, and final state outcomes.
8
+
9
+
10
+
11
+ ## 0. Start: Registering a New Video (before any pipeline)
12
+
13
+ - A new `VideoFile` record is created to register the video file.
14
+ - Linked to a `Center` and an `EndoscopyProcessor`.
15
+ - A `VideoMeta` object is created (or updated) by reading the technical information from the raw video (e.g., **fps**, **resolution**, **frame count**, **duration**).
16
+ - `Frame` objects are initialized in the database — one for each expected frame, but they are not yet extracted.
17
+ - A `VideoState` object is created to track the processing progress for this video.
18
+ - **No frames are extracted yet. No sensitive information or AI predictions exist yet.**
19
+ ### Tables Involved
20
+
21
+ | Table Name |
22
+ |--------------|
23
+ | VideoFile |
24
+ | VideoMeta |
25
+ | Frame |
26
+ | VideoState |
27
+
28
+ ## Pipeline 1 Steps
29
+
30
+ ---
31
+
32
+ ### Step 1: Ensure VideoState Exists (`_pipe_1_step_ensure_state`)
33
+ - Ensures a tracking object (`VideoState`) exists for this video.
34
+
35
+ ---
36
+
37
+ ### Step 2: Update or Create VideoMeta (`_pipe_1_step_update_meta`)
38
+ - Extract technical metadata from the raw file.
39
+ - Update or create the `VideoMeta` object.
40
+
41
+ ---
42
+
43
+ ### Step 3: Extract Frames (`_pipe_1_step_extract_frames`)
44
+ - Using `ffmpeg`, the raw video is split into frames.
45
+ - Frames are saved to disk.
46
+ - `Frame` database entries are updated: `is_extracted=True`.
47
+ - `VideoState.frames_extracted` is set to `True`.
48
+
49
+ ---
50
+
51
+ ### Step 4: Extract Text (OCR) (`_pipe_1_step_extract_text`)
52
+ - A random sample of frames is passed through OCR.
53
+ - Text such as **Patient Name**, **Date of Birth (DOB)**, **IDs** is extracted.
54
+ - A `SensitiveMeta` object is created and filled with this information.
55
+ - `VideoState.text_meta_extracted` is set to `True`.
56
+
57
+ ---
58
+
59
+ ### Step 5: Predict Labels (AI Prediction) (`_pipe_1_step_predict`)
60
+ - An AI model is run on frames to predict medical labels (e.g., **polyp**, **normal**, **outside**).
61
+ - Smoothed predictions are generated over frames.
62
+ - A `VideoPredictionMeta` is created to store AI model info and predictions.
63
+ - `VideoState.initial_prediction_completed` is set to `True`.
64
+
65
+ ---
66
+
67
+ ### Step 6: Create Label Segments (`_pipe_1_step_create_segments`)
68
+ - Predictions are converted into labeled segments (`LabelVideoSegment`).
69
+ - Each segment is linked to frame ranges and specific labels.
70
+ - A `LabelVideoSegmentState` is created for each segment to track validation.
71
+ - `VideoState.lvs_created` is set to `True`.
72
+
73
+ ---
74
+ ## End of PIPE 1
75
+
76
+ At this point in the pipeline:
77
+
78
+ - Frames are **extracted** and **saved**.
79
+ - OCR **text is extracted** and **stored**.
80
+ - AI **predictions are made**.
81
+ - **Label segments are created** based on predictions.
82
+ - **Sensitive information** (e.g. patient identifiers) is stored.
83
+ - `VideoState` is updated to reflect all completed steps.
84
+
85
+ ---
86
+
87
+ ### Tables Involved
88
+
89
+ | Table Name |
90
+ |--------------------------|
91
+ | `VideoFile` |
92
+ | `VideoMeta` |
93
+ | `Frame` |
94
+ | `VideoState` |
95
+ | `SensitiveMeta` |
96
+ | `VideoPredictionMeta` |
97
+ | `LabelVideoSegment` |
98
+ | `LabelVideoSegmentState` |
99
+
100
+ ---
101
+ ## 2. VALIDATION Phase: Review and Approval
102
+
103
+ **Goal:** Confirm that automated results are correct before anonymization.
104
+
105
+ ### Steps
106
+
107
+ - A human reviewer (or automated test) opens each `LabelVideoSegment` and reviews it.
108
+ - Each segment’s state is updated:
109
+ `LabelVideoSegmentState.is_validated = True`
110
+ - The extracted sensitive metadata (e.g., names, DOB) in `SensitiveMeta` is reviewed.
111
+ - Sensitive metadata state fields are set:
112
+ `dob_verified = True`
113
+ `names_verified = True`
114
+ - If **any** of these validations fail, processing **must stop** and be corrected.
115
+ - **Only** when **all** validations are successfully marked, the video is allowed to proceed to **PIPE 2**.
116
+
117
+ ---
118
+
119
+ ### Tables Involved
120
+
121
+ | Table Name |
122
+ |--------------------------|
123
+ | `LabelVideoSegmentState` |
124
+ | `SensitiveMeta` |
125
+
126
+ ---
127
+ ## 3. PIPELINE 2: Anonymization and Cleanup
128
+
129
+ **Goal:** Prepare a safe, anonymized version of the video.
130
+
131
+ ---
132
+
133
+ ### Pipeline 2 Major Steps
134
+
135
+ ---
136
+
137
+ #### Step 1: Ensure VideoState Exists Again (`_pipe_2_step_ensure_state`)
138
+ - Confirm that the `VideoState` tracking object is still present.
139
+
140
+ ---
141
+
142
+ #### Step 2: Ensure Frames Available (`_pipe_2_step_extract_frames`)
143
+ - Check if extracted frames are available.
144
+ - If frames were deleted or are missing, **re-extract** them from the raw video file.
145
+
146
+ ---
147
+
148
+ #### Step 3: Anonymize Video (`_pipe_2_step_anonymize`)
149
+ - Frames labeled as `"outside"` are blacked out.
150
+ - Remaining frames are masked using **endoscopy ROI** (Region of Interest).
151
+ - New anonymized frames are created and saved temporarily.
152
+ - A new anonymized video is assembled from these frames.
153
+ - New video file path is saved in:
154
+ `VideoFile.processed_file`
155
+ - Video hash is calculated and saved in:
156
+ `VideoFile.processed_video_hash`
157
+ - `VideoState.anonymized = True`
158
+
159
+ ---
160
+
161
+ #### Step 4: Delete Raw Files and Frames
162
+ - Raw video file and extracted frames are **permanently deleted**.
163
+ - `VideoState.frames_extracted = False`
164
+
165
+ ---
166
+
167
+ #### Step 5: Delete SensitiveMeta (`_pipe_2_step_delete_sensitive_meta`)
168
+ - The `SensitiveMeta` object is deleted from the database.
169
+ - `VideoFile.sensitive_meta = None`
170
+
171
+ ---
172
+
173
+ ### At the End of PIPE 2:
174
+
175
+ - Only the **anonymized processed video** remains.
176
+ - **All sensitive data** and **raw video/frames** are permanently deleted.
177
+ - **Technical metadata** and **AI prediction audit data** are retained.
178
+
179
+ ---
180
+
181
+ ### Tables Involved
182
+
183
+ | Table Name | Notes |
184
+ |------------------|----------------------------------|
185
+ | `VideoFile` | Updated with processed file info |
186
+ | `Frame` | Frames used, then deleted |
187
+ | `VideoState` | Tracks anonymization status |
188
+ | `SensitiveMeta` | **Deleted after anonymization** |
189
+
190
+ ---
191
+ ## 4. FINAL STATE
192
+
193
+ ### Database Contains:
194
+
195
+ - The **processed, safe, anonymized video**:
196
+ `VideoFile.processed_file`
197
+ - **Technical information** about the video:
198
+ `VideoMeta`
199
+ - **Medical label segments** for audit:
200
+ `LabelVideoSegment` and `LabelVideoSegmentState`
201
+ - **AI prediction information** for audit:
202
+ `VideoPredictionMeta`
203
+ - **Sensitive patient information** has been **permanently deleted**
204
+ - **Raw extracted frames** and the **original raw video file** have been **permanently deleted**
205
+
206
+ ---
207
+
208
+ ### `VideoState` Summary:
209
+
210
+ - `frames_extracted = False` *(raw frames are gone)*
211
+ - `anonymized = True` *(anonymized video is ready)*
212
+
213
+ ---
214
+
215
+ ### Tables Overview
216
+
217
+ | Table Name | Purpose |
218
+ |--------------------------|-------------------------------------------------------------------------|
219
+ | `VideoFile` | Main entry linking video paths, processed file, and metadata references |
220
+ | `VideoMeta` | Technical information (fps, duration, frame count, etc.) |
221
+ | `Frame` | Individual frame images from the video *(deleted in PIPE 2)* |
222
+ | `VideoState` | Tracks pipeline processing steps and their completion |
223
+ | `SensitiveMeta` | Patient-sensitive data from OCR *(deleted in PIPE 2)* |
224
+ | `VideoPredictionMeta` | Information about the AI model and predictions |
225
+ | `LabelVideoSegment` | Video segments created from AI predictions |
226
+ | `LabelVideoSegmentState` | Tracks human validation status for each segment |
227
+
228
+ ---
229
+ ### Note: on Frame Deletion and Data Integrity
230
+
231
+ Although the frames are permanently deleted after the entire execution of Pipeline 1 and Pipeline 2, the necessary data and information about these frames are still populated in the database. Therefore, a script is required to utilize the correct imported data and **re-extract potential frames** from the original video.
232
+
233
+ This process ensures that the required frame data can be retrieved and used even after deletion.
234
+
235
+
File without changes
@@ -0,0 +1,120 @@
1
+ from endoreg_db.models import (
2
+ VideoFile, Center, EndoscopyProcessor, AiModel, ModelMeta,
3
+ LabelVideoSegment, SensitiveMeta
4
+ )
5
+ from pathlib import Path
6
+ from icecream import ic
7
+ from tqdm import tqdm
8
+ import os
9
+ from django.core.management import call_command
10
+ import logging
11
+ from django.core.exceptions import ObjectDoesNotExist
12
+
13
+ logger = logging.getLogger(__name__)
14
+ # Usage
15
+ # from endoreg_db.utils.pipelines.process_video_dir import process_video_dir
16
+ # (video_dir=Path("/path/to/your/videos"))
17
+
18
+ # DEFAULT_DIR = Path(__file__).resolve().parent.parent.parent.parent / "data/raw_videos"
19
+ DEFAULT_DIR = Path(__file__).resolve().parent.parent.parent.parent / "data/study_data"
20
+ CENTER_NAME = os.environ.get("CENTER_NAME", "university_hospital_wuerzburg")
21
+ ENDOSCOPY_PROCESSOR_NAME = os.environ.get("ENDOSCOPY_PROCESSOR_NAME", "olympus_cv_1500")
22
+ MODEL_NAME = "image_multilabel_classification_colonoscopy_default"
23
+ MODEL_WEIGHTS_PATH = "./tests/assets/colo_segmentation_RegNetX800MF_6.ckpt"
24
+ ic(DEFAULT_DIR)
25
+
26
+
27
+
28
+ def process_video_dir(video_dir: Path=DEFAULT_DIR, center_name: str = CENTER_NAME, endoscopy_processor_name: str = ENDOSCOPY_PROCESSOR_NAME):
29
+ """
30
+ Process a directory of video files and create VideoFile objects in the database.
31
+
32
+ Args:
33
+ video_dir (Path): Path to the directory containing video files.
34
+ center_name (str): Name of the center to associate with the video files.
35
+ endoscopy_processor_name (str): Name of the endoscopy processor to associate with the video files.
36
+ """
37
+ # Make sure the ai model exists:
38
+ ai_model = AiModel.objects.filter(name=MODEL_NAME)
39
+ if ai_model:
40
+ ai_model = ai_model.first()
41
+ try:
42
+ model_meta = ai_model.get_latest_version()
43
+ assert isinstance(model_meta, ModelMeta), "No ModelMeta found in the database."
44
+ except Exception:
45
+ logger.warning(f"ModelMeta not found for {MODEL_NAME}. Creating a new one.")
46
+ # Create a new ModelMeta instance
47
+ call_command(
48
+ "create_multilabel_model_meta",
49
+ "--model_path",
50
+ MODEL_WEIGHTS_PATH,
51
+ )
52
+
53
+
54
+
55
+ # Get the center and endoscopy processor objects
56
+
57
+ # Iterate through all files in the directory
58
+ for file_path in tqdm(video_dir.iterdir()):
59
+ logger.info(f"Processing file: {file_path}")
60
+ if file_path.is_file() and file_path.suffix in ['.mp4', '.avi', '.mov']:
61
+ # Create a VideoFile object
62
+ video_file = VideoFile.create_from_file_initialized(
63
+ file_path=file_path,
64
+ center_name=center_name,
65
+ processor_name=endoscopy_processor_name,
66
+ )
67
+ logger.warning(f"Processing video file: {video_file}")
68
+ try:
69
+ success_pipe_1 = video_file.pipe_1(
70
+ model_name = MODEL_NAME,
71
+ )
72
+ assert success_pipe_1, f"Pipe 1 failed for video {video_file.uuid}"
73
+ except Exception as e:
74
+ logger.error(f"Pipe 1 failed for video {video_file.uuid}: {e}", exc_info=True)
75
+ raise e
76
+
77
+ video_file.refresh_from_db()
78
+
79
+ ####### SIMULATION OF VALIDATION #######
80
+ # Simulate the validation process for video segments
81
+ outside_segments = video_file.get_outside_segments()
82
+ logger.warning(f"Outside segments found for simulation: {outside_segments}")
83
+ if outside_segments:
84
+ for segment in outside_segments:
85
+ try:
86
+ seg_state = segment.state
87
+ seg_state.is_validated = True
88
+ seg_state.save()
89
+ logger.info(f"Simulated validation for segment {segment.id}")
90
+ except LabelVideoSegment.state.RelatedObjectDoesNotExist:
91
+ logger.warning(f"Cannot simulate validation for segment {segment.id}: Related state object does not exist.")
92
+ except Exception as e:
93
+ logger.error(f"Error during segment state simulation for segment {segment.id}: {e}", exc_info=True)
94
+
95
+
96
+ # Simulate the validation process for the video files sensitive meta obj
97
+ if video_file.sensitive_meta:
98
+ try:
99
+ sm_state = video_file.sensitive_meta.state
100
+ sm_state.dob_verified = True
101
+ sm_state.names_verified = True
102
+ sm_state.save()
103
+ logger.info(f"Simulated validation for sensitive meta of video {video_file.uuid}")
104
+ except Exception as e:
105
+ logger.error(f"Error during sensitive meta state simulation for video {video_file.uuid}: {e}", exc_info=True)
106
+
107
+ else:
108
+ logger.warning(f"Cannot simulate validation for sensitive meta of video {video_file.uuid}: SensitiveMeta object does not exist (likely due to pipe_1 failure or incomplete text extraction).")
109
+
110
+ ######## SIMULATION OF VALIDATION ########
111
+
112
+ video_file.refresh_from_db()
113
+ if success_pipe_1:
114
+ try:
115
+ video_file.pipe_2()
116
+ except Exception as e:
117
+ logger.error(f"Pipe 2 failed for video {video_file.uuid}: {e}", exc_info=True)
118
+ else:
119
+ logger.warning(f"Skipping Pipe 2 for video {video_file.uuid} because Pipe 1 did not complete successfully.")
120
+
File without changes