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
@@ -1,23 +1,23 @@
1
- # Path: endoreg_db/forms/questionnaires/tto_questionnaire.py
2
- from endoreg_db.models import TtoQuestionnaire
3
- from django import forms
1
+ # # Path: endoreg_db/forms/questionnaires/tto_questionnaire.py
2
+ # from endoreg_db.models import TtoQuestionnaire
3
+ # from django import forms
4
4
 
5
- class TtoQuestionnaireForm(forms.ModelForm):
6
- class Meta:
7
- model = TtoQuestionnaire
8
- fields = '__all__'
9
- widgets = {
10
- # Specify Bootstrap classes for other fields as needed
11
- 'patient_name': forms.TextInput(attrs={'class': 'form-control'}),
12
- 'birth_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
13
- # You can continue to specify widgets for other fields
14
- }
5
+ # class TtoQuestionnaireForm(forms.ModelForm):
6
+ # class Meta:
7
+ # model = TtoQuestionnaire
8
+ # fields = '__all__'
9
+ # widgets = {
10
+ # # Specify Bootstrap classes for other fields as needed
11
+ # 'patient_name': forms.TextInput(attrs={'class': 'form-control'}),
12
+ # 'birth_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
13
+ # # You can continue to specify widgets for other fields
14
+ # }
15
15
 
16
16
 
17
- from django.views.generic.edit import CreateView
18
- from django.urls import reverse_lazy
17
+ # from django.views.generic.edit import CreateView
18
+ # from django.urls import reverse_lazy
19
19
 
20
- class TtoQuestionnaireCreate(CreateView):
21
- model = TtoQuestionnaire
22
- form_class = TtoQuestionnaireForm
23
- success_url = reverse_lazy('questionnaire_success') # Redirect to a success page after submission
20
+ # class TtoQuestionnaireCreate(CreateView):
21
+ # model = TtoQuestionnaire
22
+ # form_class = TtoQuestionnaireForm
23
+ # success_url = reverse_lazy('questionnaire_success') # Redirect to a success page after submission
@@ -0,0 +1,45 @@
1
+ # endoreg_db/helpers/count_db.py
2
+ from endoreg_db.models.state.audit_ledger import AuditLedger
3
+
4
+ def _distinct(object_type: str, action: str):
5
+ """
6
+ Returns the count of distinct primary keys for records in AuditLedger filtered by object type and action.
7
+
8
+ Args:
9
+ object_type: The type of object to filter by.
10
+ action: The action to filter by.
11
+
12
+ Returns:
13
+ The number of unique object primary keys matching the specified type and action.
14
+ """
15
+ return (
16
+ AuditLedger.objects
17
+ .filter(object_type=object_type, action=action)
18
+ .values('object_pk')
19
+ .distinct()
20
+ .count()
21
+ )
22
+
23
+ def collect_counters():
24
+ """
25
+ Returns a dictionary with statistical counts for cases, videos, annotations, anonymizations, images, and video statuses.
26
+
27
+ The returned dictionary includes:
28
+ - "totalCases": Count of distinct created video files.
29
+ - "totalVideos": Count of distinct created video files.
30
+ - "totalAnnotations": Count of audit log entries where an annotation was added.
31
+ - "totalAnonymizations": Count of distinct video files that have been anonymized.
32
+ - "totalImages": Count of distinct created images.
33
+ - "videosCompleted": Count of distinct video files that have been validated.
34
+ - "videosAnonym": Count of distinct video files that have been anonymized.
35
+ """
36
+ return {
37
+ #TODO @maxhild can we remove the totalCases key?
38
+ # "totalCases": _distinct("VideoFile", "created"),
39
+ "totalVideos": _distinct("VideoFile", "created"),
40
+ "totalAnnotations": AuditLedger.objects.filter(action="annotation_added").count(),
41
+ "totalAnonymizations": _distinct("VideoFile", "anonymized"),
42
+ "totalImages": _distinct("Image", "created"),
43
+ "videosCompleted": _distinct("VideoFile", "validated"),
44
+ "videosAnonym": _distinct("VideoFile", "anonymized"),
45
+ }
@@ -0,0 +1,208 @@
1
+ """
2
+ Data Loader Helpers and others
3
+ """
4
+ from django.core.management import call_command
5
+ from pathlib import Path
6
+ ASSET_DIR = Path(__file__).resolve().parent.parent / "assets"
7
+
8
+ def load_default_ai_model():
9
+ """
10
+ Loads the default AI model into the database using a predefined checkpoint file.
11
+
12
+ This function constructs the path to the default AI model checkpoint and invokes the
13
+ Django management command `create_multilabel_model_meta` to register the model.
14
+ """
15
+ model_path = f"{ASSET_DIR.as_posix()}/colo_segmentation_RegNetX800MF_6.ckpt"
16
+ # Pass arguments individually to call_command
17
+ call_command(
18
+ "create_multilabel_model_meta",
19
+ "--model_path",
20
+ model_path
21
+ )
22
+
23
+ def load_qualification_data():
24
+ """
25
+ Loads qualification data into the database using the corresponding Django management command.
26
+ """
27
+ call_command("load_qualification_data", )
28
+
29
+ def load_shift_data():
30
+ """
31
+ Loads shift data into the database by invoking the corresponding Django management command.
32
+ """
33
+ call_command("load_shift_data", )
34
+
35
+ def load_base_db_data():
36
+ """
37
+ Loads the base database data by invoking the corresponding Django management command.
38
+ """
39
+ call_command("load_base_db_data", )
40
+
41
+ def load_information_source():
42
+ """
43
+ Loads information source data into the database by invoking the corresponding Django management command.
44
+ """
45
+ call_command("load_information_source", )
46
+
47
+ def load_risk_data():
48
+ """
49
+ Loads risk data into the database by invoking the corresponding Django management command.
50
+ """
51
+ call_command("load_risk_data", )
52
+
53
+ def load_center_data():
54
+ """
55
+ Loads center data into the database by invoking the corresponding Django management command.
56
+ """
57
+ call_command("load_center_data", )
58
+
59
+ def load_endoscope_data():
60
+ """
61
+ Loads endoscope data into the database by invoking the corresponding Django management command.
62
+ """
63
+ call_command("load_endoscope_data", )
64
+
65
+ def load_distribution_data():
66
+ """
67
+ Loads distribution data into the database by invoking the corresponding Django management command.
68
+ """
69
+ call_command("load_distribution_data", )
70
+
71
+ def load_gender_data():
72
+ """
73
+ Loads gender data into the database by invoking the corresponding Django management command.
74
+ """
75
+ call_command("load_gender_data", )
76
+
77
+ def load_report_reader_flag_data():
78
+ """
79
+ Loads the report reader flag data into the database using the corresponding management command.
80
+ """
81
+ call_command("load_report_reader_flag_data", )
82
+
83
+ def load_pdf_type_data():
84
+ """
85
+ Loads PDF type data into the database by invoking the corresponding Django management command.
86
+ """
87
+ call_command("load_pdf_type_data", )
88
+
89
+ def load_unit_data():
90
+ """
91
+ Loads unit data into the database by invoking the corresponding Django management command.
92
+ """
93
+ call_command("load_unit_data", )
94
+
95
+ def load_disease_data():
96
+ """
97
+ Loads disease data into the database using the corresponding Django management command.
98
+ """
99
+ call_command("load_disease_data", )
100
+
101
+ def load_event_data():
102
+ """
103
+ Loads event data into the database by invoking the corresponding Django management command.
104
+ """
105
+ call_command("load_event_data", )
106
+
107
+ def load_organ_data():
108
+ """
109
+ Loads organ data into the database by invoking the corresponding Django management command.
110
+ """
111
+ call_command("load_organ_data", )
112
+
113
+ def load_contraindication_data():
114
+ """
115
+ Loads contraindication data into the database using the corresponding management command.
116
+ """
117
+ call_command("load_contraindication_data", )
118
+
119
+ def load_examination_data():
120
+ """
121
+ Loads examination data into the database using the corresponding Django management command.
122
+ """
123
+ call_command("load_examination_data", )
124
+
125
+ def load_lab_value_data():
126
+ """
127
+ Loads laboratory value data into the database using the corresponding Django management command.
128
+ """
129
+ call_command("load_lab_value_data", )
130
+
131
+ def load_finding_data():
132
+ """
133
+ Loads finding data into the database by invoking the corresponding Django management command.
134
+ """
135
+ call_command("load_finding_data", )
136
+
137
+ def load_examination_indication_data():
138
+ """
139
+ Loads examination indication data into the database using the corresponding Django management command.
140
+ """
141
+ call_command("load_examination_indication_data", )
142
+
143
+ def load_medication_data():
144
+ """
145
+ Loads medication data into the database using the corresponding Django management command.
146
+ """
147
+ call_command("load_medication_data", )
148
+
149
+ def load_requirement_data():
150
+
151
+ """
152
+ Loads requirement data into the database by invoking the corresponding Django management command.
153
+ """
154
+ call_command("load_requirement_data", )
155
+
156
+ def load_ai_model_label_data():
157
+ """
158
+ Loads AI model label data into the database by invoking the corresponding Django management command.
159
+ """
160
+ call_command("load_ai_model_label_data", )
161
+
162
+ def load_ai_model_data():
163
+ """
164
+ Loads AI model data into the database by invoking the corresponding Django management command.
165
+ """
166
+ call_command("load_ai_model_data", )
167
+
168
+ def load_green_endoscopy_wuerzburg_data():
169
+ """
170
+ Loads the Green Endoscopy Wuerzburg dataset into the database using the corresponding Django management command.
171
+ """
172
+ call_command("load_green_endoscopy_wuerzburg_data", )
173
+
174
+ def load_data():
175
+ """
176
+ Loads all predefined data sets into the database in the required sequence.
177
+
178
+ Calls individual data loading functions in a specific order to ensure that dependencies between data sets are respected.
179
+ """
180
+
181
+ load_information_source()
182
+ load_risk_data()
183
+ load_center_data()
184
+ load_endoscope_data()
185
+ load_distribution_data()
186
+
187
+ load_gender_data()
188
+ load_report_reader_flag_data()
189
+ load_pdf_type_data()
190
+ load_unit_data()
191
+ load_disease_data()
192
+ load_event_data()
193
+ load_organ_data()
194
+ load_contraindication_data()
195
+ load_examination_data()
196
+ load_lab_value_data()
197
+ load_finding_data()
198
+ load_examination_indication_data()
199
+ load_medication_data()
200
+ load_requirement_data()
201
+
202
+ load_ai_model_label_data()
203
+ load_ai_model_data()
204
+
205
+ load_green_endoscopy_wuerzburg_data()
206
+
207
+
208
+
@@ -0,0 +1,359 @@
1
+ import random
2
+ from endoreg_db.models import (
3
+ Center,
4
+ Gender,
5
+ Patient,
6
+ Examination,
7
+ ExaminationIndication,
8
+ RawPdfFile,
9
+ EndoscopyProcessor,
10
+ ModelMeta,
11
+ InformationSource,
12
+ AiModel,
13
+ )
14
+ from logging import getLogger
15
+ from datetime import date
16
+ import shutil
17
+ from pathlib import Path
18
+ from django.conf import settings # Import settings
19
+ from django.core.files.storage import default_storage # Import default storage
20
+
21
+ from endoreg_db.utils import (
22
+ create_mock_patient_name,
23
+ )
24
+
25
+ logger = getLogger("default_objects")
26
+
27
+
28
+ DEFAULT_CENTER_NAME = "university_hospital_wuerzburg"
29
+ DEFAULT_ENDOSCOPE_NAME = "test_endoscope"
30
+ DEFAULT_ENDOSCOPY_PROCESSOR_NAME = "olympus_cv_1500"
31
+
32
+ DEFAULT_EGD_PATH = Path("tests/assets/lux-gastro-report.pdf")
33
+ DEFAULT_GENDERS = ["male","female","unknown"]
34
+ DEFAULT_EXAMINATIONS = ["colonoscopy"]
35
+ DEFAULT_INDICATIONS = [
36
+ "colonoscopy",
37
+ "colonoscopy_screening",
38
+ "colonoscopy_lesion_removal_small",
39
+ "colonoscopy_lesion_removal_emr",
40
+ "colonoscopy_lesion_removal_large",
41
+ "colonoscopy_diagnostic_acute_symptomatic",
42
+ ]
43
+
44
+ DEFAULT_SEGMENTATION_MODEL_NAME = "image_multilabel_classification_colonoscopy_default"
45
+
46
+ DEFAULT_GENDER = "unknown"
47
+
48
+ def get_information_source_prediction():
49
+ """
50
+ Retrieves the InformationSource object with the name "prediction".
51
+
52
+ Loads information source data if needed and returns the corresponding InformationSource instance. Raises a ValueError if the object is not found or is not an InformationSource.
53
+ """
54
+ from .data_loader import load_information_source
55
+ load_information_source()
56
+ source = InformationSource.objects.get(name="prediction")
57
+ if not isinstance(source, InformationSource):
58
+ raise ValueError("No InformationSource found in the database.")
59
+ return source
60
+
61
+ def get_latest_segmentation_model(model_name:str=DEFAULT_SEGMENTATION_MODEL_NAME) -> ModelMeta:
62
+
63
+ """
64
+ Retrieves the latest metadata for a segmentation model by name.
65
+
66
+ Loads necessary data and returns the most recent ModelMeta instance for the specified AI model. If no metadata exists, attempts to initialize it automatically; if initialization fails, raises a ValueError with instructions for manual setup.
67
+
68
+ Args:
69
+ model_name: The name of the segmentation model to retrieve.
70
+
71
+ Returns:
72
+ The latest ModelMeta instance for the specified model.
73
+
74
+ Raises:
75
+ ValueError: If the AI model does not exist, or if model metadata cannot be found or initialized.
76
+ """
77
+ from .data_loader import (
78
+ load_center_data,
79
+ load_ai_model_label_data,
80
+ load_ai_model_data,
81
+ )
82
+ load_center_data()
83
+ load_ai_model_label_data()
84
+ load_ai_model_data()
85
+
86
+ try:
87
+ ai_model = AiModel.objects.get(name=model_name)
88
+ except AiModel.DoesNotExist:
89
+ raise ValueError(f"AI model '{model_name}' not found. Run 'python manage.py load_ai_model_data' first.")
90
+
91
+ try:
92
+ latest_meta = ai_model.get_latest_version()
93
+ return latest_meta
94
+ except ValueError as e:
95
+ if "No model metadata found" in str(e):
96
+ logger.warning(f"No ModelMeta found for {model_name}. Attempting to initialize default model metadata...")
97
+
98
+ # Try to initialize the default model metadata
99
+ try:
100
+ from django.core.management import call_command
101
+ call_command('init_default_ai_model')
102
+ # Try again after initialization
103
+ latest_meta = ai_model.get_latest_version()
104
+ return latest_meta
105
+ except Exception as init_error:
106
+ raise ValueError(
107
+ f"No model metadata found for AI model '{model_name}' and failed to auto-initialize. "
108
+ f"Please run 'python manage.py init_default_ai_model' manually. "
109
+ f"Original error: {e}. Initialization error: {init_error}"
110
+ ) from e
111
+ else:
112
+ raise
113
+
114
+
115
+ def get_default_gender() -> Gender:
116
+ """
117
+ Retrieves the Gender object representing the default "unknown" gender.
118
+
119
+ Returns:
120
+ The Gender instance with the name "unknown".
121
+ """
122
+ return Gender.objects.get(name=DEFAULT_GENDER)
123
+
124
+ def get_gender_m_or_f() -> Gender:
125
+ """
126
+ Returns a randomly selected Gender object representing either male or female.
127
+ """
128
+ gender_name = random.choice(["male", "female"])
129
+ return Gender.objects.get(name=gender_name)
130
+
131
+ def get_random_gender() -> Gender:
132
+ """
133
+ Returns a randomly selected Gender object from the available default genders.
134
+ """
135
+ gender_name = random.choice(DEFAULT_GENDERS)
136
+ return Gender.objects.get(name=gender_name) # Fetch and return the Gender object
137
+
138
+ def get_default_processor() -> EndoscopyProcessor:
139
+ """
140
+ Retrieves the default EndoscopyProcessor object by its predefined name.
141
+
142
+ Raises:
143
+ ValueError: If no EndoscopyProcessor with the default name exists.
144
+
145
+ Returns:
146
+ The EndoscopyProcessor instance with the default name.
147
+ """
148
+ processor = EndoscopyProcessor.objects.get(name=DEFAULT_ENDOSCOPY_PROCESSOR_NAME)
149
+ if not isinstance(processor, EndoscopyProcessor):
150
+ raise ValueError(f"No EndoscopyProcessor found with name {DEFAULT_ENDOSCOPY_PROCESSOR_NAME}")
151
+ return processor
152
+
153
+
154
+ def get_default_center() -> Center:
155
+ """
156
+ Retrieves the default Center object with the predefined name.
157
+
158
+ Raises:
159
+ ValueError: If no Center with the default name exists.
160
+
161
+ Returns:
162
+ The Center instance with the default name.
163
+ """
164
+ center = Center.objects.get(
165
+ name=DEFAULT_CENTER_NAME,
166
+ )
167
+ if not isinstance(center, Center):
168
+ raise ValueError(f"No Center found with name {DEFAULT_CENTER_NAME}")
169
+
170
+ return center
171
+
172
+ def generate_patient(**kwargs) -> Patient:
173
+ """
174
+ Creates a Patient instance with randomized or specified attributes.
175
+
176
+ Randomly generates first name, last name, date of birth, gender, and center for the patient unless overridden by keyword arguments. Raises ValueError if the provided gender is invalid.
177
+
178
+ Args:
179
+ **kwargs: Optional overrides for patient attributes such as 'first_name', 'last_name', 'birth_date', 'gender', and 'center'.
180
+
181
+ Returns:
182
+ A Patient instance with the specified or randomly generated attributes.
183
+ """
184
+ # Set default values
185
+ gender = kwargs.get("gender", get_random_gender())
186
+ if not isinstance(gender, Gender):
187
+ gender = Gender.objects.get(name=gender)
188
+
189
+ if not isinstance(gender, Gender):
190
+ raise ValueError("No Gender Found")
191
+ first_name, last_name = create_mock_patient_name(gender = gender.name)
192
+ first_name = kwargs.get("first_name", first_name)
193
+ last_name = kwargs.get("last_name", last_name)
194
+ birth_date = kwargs.get("birth_date", "1970-01-01")
195
+ dob = date.fromisoformat(birth_date)
196
+ center = kwargs.get("center", None)
197
+ if center is None:
198
+ center = get_default_center()
199
+ else:
200
+ center = Center.objects.get(name=center)
201
+
202
+ patient = Patient(
203
+ first_name=first_name,
204
+ last_name=last_name,
205
+ dob=dob,
206
+ center = center,
207
+ gender = gender,
208
+ )
209
+
210
+ return patient
211
+
212
+ def get_random_default_examination():
213
+ """
214
+ Retrieves a random Examination object from the default examination names.
215
+
216
+ Returns:
217
+ Examination: A randomly selected Examination instance from the defaults.
218
+ """
219
+ examination_name = random.choice(DEFAULT_EXAMINATIONS)
220
+
221
+ examination = Examination.objects.get(name=examination_name)
222
+ return examination
223
+
224
+ def get_random_default_examination_indication():
225
+ """
226
+ Returns a random ExaminationIndication object from the default indications list.
227
+
228
+ Selects a random indication name from the predefined defaults and retrieves the corresponding ExaminationIndication instance from the database.
229
+ """
230
+ examination_indication = random.choice(DEFAULT_INDICATIONS)
231
+ all_examination_indications = ExaminationIndication.objects.all()
232
+ try:
233
+ examination_indication = ExaminationIndication.objects.get(name=examination_indication)
234
+
235
+ except Exception as e:
236
+ logger.info(f"examination_indication: {examination_indication}")
237
+ logger.info(f"all_examination_indications: {all_examination_indications}")
238
+ raise e
239
+ return examination_indication
240
+
241
+ def get_default_egd_pdf():
242
+ """
243
+ Creates and processes a default EGD PDF file for testing purposes.
244
+
245
+ This function copies a default EGD PDF to a temporary location, creates a RawPdfFile instance from it, processes the file to generate associated metadata, and ensures cleanup of the temporary file. The resulting RawPdfFile instance is returned for use in tests.
246
+
247
+ Returns:
248
+ RawPdfFile: The created and processed RawPdfFile instance.
249
+ """
250
+ egd_path = DEFAULT_EGD_PATH
251
+ center = get_default_center()
252
+ center_name = center.name
253
+
254
+ # Create a temporary file path within the test's media root if possible,
255
+ # otherwise use the source directory. Using MEDIA_ROOT is safer.
256
+ # Ensure MEDIA_ROOT is configured correctly in test settings.
257
+ temp_dir = Path(settings.MEDIA_ROOT) / "temp_test_files"
258
+ temp_dir.mkdir(parents=True, exist_ok=True)
259
+ temp_file_path = temp_dir / f"temp_{egd_path.name}"
260
+
261
+ shutil.copy(egd_path, temp_file_path)
262
+
263
+ pdf_file = None
264
+ try:
265
+ # Create the PDF record using the temporary file.
266
+ # delete_source=True will ensure temp_file_path is deleted by create_from_file
267
+ pdf_file = RawPdfFile.create_from_file(
268
+ file_path=temp_file_path,
269
+ center_name=center_name,
270
+ save=True, # save=True is default and handled internally now
271
+ delete_source=True,
272
+ )
273
+
274
+ if pdf_file is None:
275
+ raise RuntimeError("Failed to create PDF file object")
276
+
277
+ # Use storage API to check existence
278
+ if not default_storage.exists(pdf_file.file.path):
279
+ raise RuntimeError(f"PDF file does not exist in storage at {pdf_file.file.path}")
280
+
281
+ # Check that the source temp file was deleted
282
+ if temp_file_path.exists():
283
+ raise RuntimeError(f"Temporary source file {temp_file_path} still exists after creation")
284
+
285
+ # Prepare a minimal report_meta for SensitiveMeta creation
286
+ default_report_meta = {
287
+ "patient_first_name": "DefaultFirstName",
288
+ "patient_last_name": "DefaultLastName",
289
+ "patient_dob": date(1980, 1, 1), # Pass date object directly
290
+ "examination_date": date(2024, 1, 1), # Pass date object directly
291
+ # center_name will be added by process_file using pdf_file.center.name
292
+ }
293
+
294
+ # Call process_file to create SensitiveMeta and extract other info
295
+ pdf_file.process_file(
296
+ text="Default PDF text content.",
297
+ anonymized_text="Default anonymized PDF text content.",
298
+ report_meta=default_report_meta,
299
+ verbose=False
300
+ )
301
+ # process_file calls sensitive_meta.save() and self.save() (for RawPdfFile)
302
+
303
+ except Exception as e:
304
+ # Clean up temp file in case of error before deletion could occur
305
+ if temp_file_path.exists():
306
+ temp_file_path.unlink()
307
+ raise e # Re-raise the exception
308
+
309
+ # pdf_file.file.path might fail if storage doesn't support direct paths (like S3)
310
+ # Prefer using storage API for checks. Logging path if available.
311
+ try:
312
+ logger.info(f"PDF file created: {pdf_file.file.name}, Path: {pdf_file.file.path}")
313
+ except NotImplementedError:
314
+ logger.info(f"PDF file created: {pdf_file.file.name}, Path: (Not available from storage)")
315
+
316
+
317
+ return pdf_file
318
+
319
+ def get_default_video_file():
320
+ """
321
+ Creates and returns a VideoFile instance using a randomly selected EGD examination video.
322
+
323
+ Loads all necessary data dependencies, selects a random video file for the 'egd' examination, and initializes a VideoFile object with the default center and processor names. The original video file is retained after creation.
324
+
325
+ Returns:
326
+ VideoFile: The created and initialized VideoFile instance.
327
+ """
328
+ from .test_video_helper import get_random_video_path_by_examination_alias
329
+ from endoreg_db.models import VideoFile
330
+ from .data_loader import (
331
+ load_disease_data,
332
+ load_event_data,
333
+ load_information_source,
334
+ load_examination_data,
335
+ load_center_data,
336
+ load_endoscope_data,
337
+ load_ai_model_label_data,
338
+ load_ai_model_data,
339
+ )
340
+ load_disease_data()
341
+ load_event_data()
342
+ load_information_source()
343
+ load_examination_data()
344
+ load_center_data()
345
+ load_endoscope_data()
346
+ load_ai_model_label_data()
347
+ load_ai_model_data()
348
+ video_path = get_random_video_path_by_examination_alias(
349
+ examination_alias='egd', is_anonymous=False
350
+ )
351
+
352
+ video_file = VideoFile.create_from_file_initialized(
353
+ file_path=video_path,
354
+ center_name=DEFAULT_CENTER_NAME, # Pass center name as expected by _create_from_file
355
+ delete_source=False, # Keep the original asset for other tests
356
+ processor_name = DEFAULT_ENDOSCOPY_PROCESSOR_NAME,
357
+ )
358
+
359
+ return video_file
@@ -0,0 +1,6 @@
1
+ from endoreg_db.models import EndoscopyProcessor
2
+ from django.core.management.base import BaseCommand
3
+ from typing import TYPE_CHECKING
4
+ from django.db.models import QuerySet
5
+
6
+