endoreg-db 0.3.6__py3-none-any.whl → 0.8.6.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 (970) hide show
  1. endoreg_db/admin.py +92 -3
  2. endoreg_db/api_urls.py +4 -0
  3. endoreg_db/apps.py +18 -6
  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 +144 -65
  9. endoreg_db/data/ai_model/data.yaml +7 -0
  10. endoreg_db/data/{label → ai_model_label}/label/data.yaml +88 -62
  11. endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
  12. endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
  13. endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
  14. endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +6 -6
  15. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
  16. endoreg_db/data/{model_type → ai_model_type}/data.yaml +6 -6
  17. endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
  18. endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
  19. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -167
  20. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +7 -7
  21. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +8 -8
  22. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +22 -22
  23. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +18 -18
  24. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +18 -18
  25. endoreg_db/data/case_template/rule/19_create_patient.yaml +16 -16
  26. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -35
  27. endoreg_db/data/case_template/rule_value_type/base_types.yaml +58 -58
  28. endoreg_db/data/case_template/template/base.yaml +7 -7
  29. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +2 -2
  30. endoreg_db/data/case_template/tmp/_rule_value +13 -13
  31. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -21
  32. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +9 -9
  33. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +6 -6
  34. endoreg_db/data/center/data.yaml +90 -59
  35. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
  36. endoreg_db/data/center_shift/ukw.yaml +9 -0
  37. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
  38. endoreg_db/data/contraindication/bleeding.yaml +11 -0
  39. endoreg_db/data/db_summary.csv +58 -0
  40. endoreg_db/data/db_summary.xlsx +0 -0
  41. endoreg_db/data/disease/cardiovascular.yaml +37 -37
  42. endoreg_db/data/disease/hepatology.yaml +4 -4
  43. endoreg_db/data/disease/misc.yaml +5 -6
  44. endoreg_db/data/disease/renal.yaml +4 -4
  45. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -6
  46. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
  47. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -41
  48. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +19 -19
  49. endoreg_db/data/distribution/date/patient.yaml +6 -6
  50. endoreg_db/data/distribution/numeric/data.yaml +14 -0
  51. endoreg_db/data/distribution/single_categorical/patient.yaml +6 -6
  52. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -132
  53. endoreg_db/data/endoscope/data.yaml +93 -0
  54. endoreg_db/data/endoscope_type/data.yaml +10 -10
  55. endoreg_db/data/endoscopy_processor/data.yaml +50 -45
  56. endoreg_db/data/event/cardiology.yaml +15 -28
  57. endoreg_db/data/event/neurology.yaml +13 -13
  58. endoreg_db/data/event/surgery.yaml +12 -12
  59. endoreg_db/data/event/thrombembolism.yaml +19 -19
  60. endoreg_db/data/examination/examinations/data.yaml +72 -66
  61. endoreg_db/data/examination/time/data.yaml +47 -47
  62. endoreg_db/data/examination/time-type/data.yaml +7 -7
  63. endoreg_db/data/examination/type/data.yaml +17 -5
  64. endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
  65. endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
  66. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
  67. endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
  68. endoreg_db/data/finding/anatomy_colon.yaml +128 -0
  69. endoreg_db/data/finding/colonoscopy.yaml +40 -0
  70. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
  71. endoreg_db/data/finding/complication.yaml +16 -0
  72. endoreg_db/data/finding/data.yaml +105 -0
  73. endoreg_db/data/finding/examination_setting.yaml +16 -0
  74. endoreg_db/data/finding/medication_related.yaml +18 -0
  75. endoreg_db/data/finding/outcome.yaml +12 -0
  76. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
  77. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
  78. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
  79. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  80. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  81. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  82. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  83. endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
  84. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
  85. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
  86. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
  87. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
  88. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
  89. endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
  90. endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
  91. endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
  92. endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
  93. endoreg_db/data/finding_classification/medication_related.yaml +23 -0
  94. endoreg_db/data/finding_classification/visualized.yaml +33 -0
  95. endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
  96. endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
  97. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  98. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  99. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  100. endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
  101. endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
  102. endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
  103. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  104. endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
  105. endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
  106. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  107. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
  108. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  109. endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
  110. endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  111. endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
  112. endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
  113. endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
  114. endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
  115. endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
  116. endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
  117. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
  118. endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
  119. endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
  120. endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
  121. endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
  122. endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
  123. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
  124. endoreg_db/data/finding_type/data.yaml +43 -0
  125. endoreg_db/data/gender/data.yaml +42 -18
  126. endoreg_db/data/information_source/annotation.yaml +6 -0
  127. endoreg_db/data/information_source/data.yaml +30 -30
  128. endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
  129. endoreg_db/data/information_source/medication.yaml +5 -5
  130. endoreg_db/data/information_source/prediction.yaml +7 -0
  131. endoreg_db/data/information_source_type/data.yaml +8 -0
  132. endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -31
  133. endoreg_db/data/lab_value/coagulation.yaml +54 -49
  134. endoreg_db/data/lab_value/electrolytes.yaml +228 -190
  135. endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -121
  136. endoreg_db/data/lab_value/hematology.yaml +184 -169
  137. endoreg_db/data/lab_value/hormones.yaml +59 -53
  138. endoreg_db/data/lab_value/lipids.yaml +53 -44
  139. endoreg_db/data/lab_value/misc.yaml +76 -30
  140. endoreg_db/data/lab_value/renal_function.yaml +12 -11
  141. endoreg_db/data/log_type/data.yaml +57 -0
  142. endoreg_db/data/lx_client_tag/base.yaml +54 -0
  143. endoreg_db/data/lx_client_type/base.yaml +30 -0
  144. endoreg_db/data/lx_permission/base.yaml +24 -0
  145. endoreg_db/data/lx_permission/endoreg.yaml +52 -0
  146. endoreg_db/data/medication/anticoagulation.yaml +64 -64
  147. endoreg_db/data/medication/tah.yaml +69 -69
  148. endoreg_db/data/medication_indication/anticoagulation.yaml +115 -120
  149. endoreg_db/data/medication_indication_type/data.yaml +10 -10
  150. endoreg_db/data/medication_indication_type/thrombembolism.yaml +40 -40
  151. endoreg_db/data/medication_intake_time/base.yaml +30 -30
  152. endoreg_db/data/medication_schedule/apixaban.yaml +94 -94
  153. endoreg_db/data/medication_schedule/ass.yaml +12 -12
  154. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -26
  155. endoreg_db/data/names_first/first_names.yaml +54 -0
  156. endoreg_db/data/names_last/last_names.yaml +51 -0
  157. endoreg_db/data/network_device/data.yaml +59 -0
  158. endoreg_db/data/network_device_type/data.yaml +12 -0
  159. endoreg_db/data/organ/data.yaml +29 -0
  160. endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
  161. endoreg_db/data/pdf_type/data.yaml +46 -28
  162. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -66
  163. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -33
  164. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -308
  165. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -88
  166. endoreg_db/data/profession/data.yaml +70 -70
  167. endoreg_db/data/qualification/endoscopy.yaml +36 -0
  168. endoreg_db/data/qualification/m2.yaml +39 -0
  169. endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
  170. endoreg_db/data/qualification/sonography.yaml +36 -0
  171. endoreg_db/data/qualification_type/base.yaml +29 -0
  172. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
  173. endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
  174. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -26
  175. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -19
  176. endoreg_db/data/requirement/age.yaml +26 -0
  177. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
  178. endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
  179. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
  180. endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
  181. endoreg_db/data/requirement/disease_misc.yaml +12 -0
  182. endoreg_db/data/requirement/disease_renal.yaml +96 -0
  183. endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
  184. endoreg_db/data/requirement/event_cardiology.yaml +251 -0
  185. endoreg_db/data/requirement/event_requirements.yaml +145 -0
  186. endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
  187. endoreg_db/data/requirement/gender.yaml +25 -0
  188. endoreg_db/data/requirement/lab_value.yaml +441 -0
  189. endoreg_db/data/requirement/medication.yaml +93 -0
  190. endoreg_db/data/requirement_operator/age.yaml +13 -0
  191. endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
  192. endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
  193. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
  194. endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  195. endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
  196. endoreg_db/data/requirement_set_type/data.yaml +20 -0
  197. endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
  198. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
  199. endoreg_db/data/risk/bleeding.yaml +26 -0
  200. endoreg_db/data/risk/thrombosis.yaml +37 -0
  201. endoreg_db/data/risk_type/data.yaml +27 -0
  202. endoreg_db/data/setup_config.yaml +38 -0
  203. endoreg_db/data/shift/endoscopy.yaml +21 -0
  204. endoreg_db/data/shift/m2.yaml +0 -0
  205. endoreg_db/data/shift_type/base.yaml +35 -0
  206. endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
  207. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
  208. endoreg_db/data/unit/concentration.yaml +115 -92
  209. endoreg_db/data/unit/data.yaml +17 -17
  210. endoreg_db/data/unit/length.yaml +30 -30
  211. endoreg_db/data/unit/misc.yaml +19 -19
  212. endoreg_db/data/unit/rate.yaml +5 -5
  213. endoreg_db/data/unit/time.yaml +48 -13
  214. endoreg_db/data/unit/volume.yaml +35 -35
  215. endoreg_db/data/unit/weight.yaml +37 -37
  216. endoreg_db/data/waste/data.yaml +11 -11
  217. endoreg_db/exceptions.py +19 -0
  218. endoreg_db/factories/__init__.py +0 -0
  219. endoreg_db/forms/__init__.py +5 -3
  220. endoreg_db/forms/examination_form.py +11 -0
  221. endoreg_db/forms/patient_finding_intervention_form.py +18 -0
  222. endoreg_db/forms/patient_form.py +27 -0
  223. endoreg_db/forms/questionnaires/__init__.py +1 -1
  224. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
  225. endoreg_db/forms/settings/__init__.py +8 -8
  226. endoreg_db/forms/unit.py +5 -5
  227. endoreg_db/helpers/__init__.py +0 -0
  228. endoreg_db/helpers/count_db.py +45 -0
  229. endoreg_db/helpers/data_loader.py +208 -0
  230. endoreg_db/helpers/default_objects.py +378 -0
  231. endoreg_db/helpers/download_segmentation_model.py +31 -0
  232. endoreg_db/helpers/interact.py +6 -0
  233. endoreg_db/helpers/test_video_helper.py +119 -0
  234. endoreg_db/logger_conf.py +140 -0
  235. endoreg_db/management/__init__.py +1 -0
  236. endoreg_db/management/commands/__init__.py +1 -0
  237. endoreg_db/management/commands/anonymize_video.py +0 -0
  238. endoreg_db/management/commands/check_auth.py +125 -0
  239. endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
  240. endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
  241. endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
  242. endoreg_db/management/commands/fix_video_paths.py +165 -0
  243. endoreg_db/management/commands/import_fallback_video.py +203 -0
  244. endoreg_db/management/commands/import_report.py +298 -0
  245. endoreg_db/management/commands/import_video.py +423 -0
  246. endoreg_db/management/commands/import_video_with_classification.py +367 -0
  247. endoreg_db/management/commands/init_default_ai_model.py +112 -0
  248. endoreg_db/management/commands/load_ai_model_data.py +77 -45
  249. endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
  250. endoreg_db/management/commands/load_base_db_data.py +192 -128
  251. endoreg_db/management/commands/load_center_data.py +68 -43
  252. endoreg_db/management/commands/{load_medication_intake_time_data.py → load_contraindication_data.py} +40 -40
  253. endoreg_db/management/commands/load_disease_classification_choices_data.py +40 -40
  254. endoreg_db/management/commands/load_disease_classification_data.py +40 -40
  255. endoreg_db/management/commands/load_disease_data.py +61 -39
  256. endoreg_db/management/commands/load_distribution_data.py +65 -65
  257. endoreg_db/management/commands/{load_endoscope_type_data.py → load_endoscope_data.py} +67 -44
  258. endoreg_db/management/commands/load_event_data.py +40 -40
  259. endoreg_db/management/commands/load_examination_data.py +74 -74
  260. endoreg_db/management/commands/load_examination_indication_data.py +86 -0
  261. endoreg_db/management/commands/load_finding_data.py +128 -0
  262. endoreg_db/management/commands/load_gender_data.py +43 -43
  263. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +131 -132
  264. endoreg_db/management/commands/load_information_source.py +50 -44
  265. endoreg_db/management/commands/load_lab_value_data.py +49 -49
  266. endoreg_db/management/commands/load_medication_data.py +103 -41
  267. endoreg_db/management/commands/load_name_data.py +37 -0
  268. endoreg_db/management/commands/{load_medication_indication_type_data.py → load_organ_data.py} +42 -40
  269. endoreg_db/management/commands/load_pdf_type_data.py +60 -60
  270. endoreg_db/management/commands/load_profession_data.py +43 -43
  271. endoreg_db/management/commands/load_qualification_data.py +59 -0
  272. endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +45 -45
  273. endoreg_db/management/commands/load_requirement_data.py +180 -0
  274. endoreg_db/management/commands/load_risk_data.py +56 -0
  275. endoreg_db/management/commands/load_shift_data.py +60 -0
  276. endoreg_db/management/commands/load_tag_data.py +57 -0
  277. endoreg_db/management/commands/load_unit_data.py +45 -45
  278. endoreg_db/management/commands/load_user_groups.py +28 -28
  279. endoreg_db/management/commands/register_ai_model.py +64 -65
  280. endoreg_db/management/commands/reset_celery_schedule.py +9 -9
  281. endoreg_db/management/commands/setup_endoreg_db.py +381 -0
  282. endoreg_db/management/commands/start_filewatcher.py +106 -0
  283. endoreg_db/management/commands/storage_management.py +548 -0
  284. endoreg_db/management/commands/summarize_db_content.py +189 -0
  285. endoreg_db/management/commands/validate_video.py +204 -0
  286. endoreg_db/management/commands/validate_video_files.py +161 -0
  287. endoreg_db/management/commands/video_validation.py +22 -0
  288. endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
  289. endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
  290. endoreg_db/mermaid/binary_classification_annotation.md +50 -0
  291. endoreg_db/mermaid/classification.md +8 -0
  292. endoreg_db/mermaid/examination.md +8 -0
  293. endoreg_db/mermaid/findings.md +7 -0
  294. endoreg_db/mermaid/image_classification.md +28 -0
  295. endoreg_db/mermaid/interventions.md +8 -0
  296. endoreg_db/mermaid/morphology.md +8 -0
  297. endoreg_db/mermaid/patient_creation.md +14 -0
  298. endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
  299. endoreg_db/migrations/0001_initial.py +1857 -582
  300. endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
  301. endoreg_db/migrations/0003_add_center_display_name.py +30 -0
  302. endoreg_db/models/__init__.py +359 -74
  303. endoreg_db/models/administration/__init__.py +116 -0
  304. endoreg_db/models/administration/ai/__init__.py +9 -0
  305. endoreg_db/models/administration/ai/active_model.py +35 -0
  306. endoreg_db/models/administration/ai/ai_model.py +156 -0
  307. endoreg_db/models/{ai_model → administration/ai}/model_type.py +41 -26
  308. endoreg_db/models/administration/case/__init__.py +19 -0
  309. endoreg_db/models/administration/case/case.py +114 -0
  310. endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +15 -6
  311. endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +125 -81
  312. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +269 -276
  313. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +86 -73
  314. endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +26 -28
  315. endoreg_db/models/{center → administration/center}/__init__.py +13 -4
  316. endoreg_db/models/administration/center/center.py +67 -0
  317. endoreg_db/models/administration/center/center_product.py +64 -0
  318. endoreg_db/models/administration/center/center_resource.py +49 -0
  319. endoreg_db/models/administration/center/center_shift.py +88 -0
  320. endoreg_db/models/administration/center/center_waste.py +30 -0
  321. endoreg_db/models/administration/permissions/__init__.py +44 -0
  322. endoreg_db/models/administration/person/__init__.py +24 -0
  323. endoreg_db/models/administration/person/employee/__init__.py +3 -0
  324. endoreg_db/models/administration/person/employee/employee.py +35 -0
  325. endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
  326. endoreg_db/models/administration/person/employee/employee_type.py +42 -0
  327. endoreg_db/models/administration/person/examiner/__init__.py +4 -0
  328. endoreg_db/models/administration/person/examiner/examiner.py +54 -0
  329. endoreg_db/models/administration/person/names/__init__.py +0 -0
  330. endoreg_db/models/{persons → administration/person/names}/first_name.py +18 -18
  331. endoreg_db/models/{persons → administration/person/names}/last_name.py +18 -19
  332. endoreg_db/models/administration/person/patient/__init__.py +5 -0
  333. endoreg_db/models/administration/person/patient/patient.py +460 -0
  334. endoreg_db/models/{persons → administration/person}/person.py +31 -31
  335. endoreg_db/models/administration/person/profession/__init__.py +24 -0
  336. endoreg_db/models/administration/person/user/__init__.py +5 -0
  337. endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
  338. endoreg_db/models/administration/product/__init__.py +14 -0
  339. endoreg_db/models/administration/product/product.py +97 -0
  340. endoreg_db/models/administration/product/product_group.py +39 -0
  341. endoreg_db/models/administration/product/product_material.py +54 -0
  342. endoreg_db/models/{product → administration/product}/product_weight.py +47 -26
  343. endoreg_db/models/{product → administration/product}/reference_product.py +130 -99
  344. endoreg_db/models/administration/qualification/__init__.py +7 -0
  345. endoreg_db/models/administration/qualification/qualification.py +37 -0
  346. endoreg_db/models/administration/qualification/qualification_type.py +35 -0
  347. endoreg_db/models/administration/shift/__init__.py +9 -0
  348. endoreg_db/models/administration/shift/scheduled_days.py +69 -0
  349. endoreg_db/models/administration/shift/shift.py +51 -0
  350. endoreg_db/models/administration/shift/shift_type.py +108 -0
  351. endoreg_db/models/label/__init__.py +24 -1
  352. endoreg_db/models/label/annotation/__init__.py +12 -0
  353. endoreg_db/models/label/annotation/image_classification.py +84 -0
  354. endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
  355. endoreg_db/models/label/label.py +83 -84
  356. endoreg_db/models/label/label_set.py +53 -0
  357. endoreg_db/models/label/label_type.py +29 -0
  358. endoreg_db/models/label/label_video_segment/__init__.py +3 -0
  359. endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
  360. endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
  361. endoreg_db/models/label/video_segmentation_label.py +31 -0
  362. endoreg_db/models/label/video_segmentation_labelset.py +27 -0
  363. endoreg_db/models/media/__init__.py +16 -0
  364. endoreg_db/models/media/frame/__init__.py +3 -0
  365. endoreg_db/models/media/frame/frame.py +111 -0
  366. endoreg_db/models/media/pdf/__init__.py +11 -0
  367. endoreg_db/models/media/pdf/raw_pdf.py +757 -0
  368. endoreg_db/models/media/pdf/report_file.py +162 -0
  369. endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
  370. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
  371. endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +19 -19
  372. endoreg_db/models/media/video/__init__.py +8 -0
  373. endoreg_db/models/media/video/create_from_file.py +358 -0
  374. endoreg_db/models/media/video/pipe_1.py +213 -0
  375. endoreg_db/models/media/video/pipe_2.py +105 -0
  376. endoreg_db/models/media/video/refactor_plan.md +0 -0
  377. endoreg_db/models/media/video/video_file.py +825 -0
  378. endoreg_db/models/media/video/video_file_ai.py +443 -0
  379. endoreg_db/models/media/video/video_file_anonymize.py +349 -0
  380. endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
  381. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
  382. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
  383. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
  384. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
  385. endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
  386. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
  387. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
  388. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
  389. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
  390. endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
  391. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
  392. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
  393. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
  394. endoreg_db/models/media/video/video_file_frames.py +0 -0
  395. endoreg_db/models/media/video/video_file_io.py +168 -0
  396. endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
  397. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
  398. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
  399. endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
  400. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
  401. endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
  402. endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
  403. endoreg_db/models/media/video/video_file_segments.py +209 -0
  404. endoreg_db/models/media/video/video_metadata.py +65 -0
  405. endoreg_db/models/media/video/video_processing.py +152 -0
  406. endoreg_db/models/medical/__init__.py +146 -0
  407. endoreg_db/models/medical/contraindication/__init__.py +17 -0
  408. endoreg_db/models/medical/disease.py +156 -0
  409. endoreg_db/models/medical/event.py +137 -0
  410. endoreg_db/models/medical/examination/__init__.py +9 -0
  411. endoreg_db/models/medical/examination/examination.py +148 -0
  412. endoreg_db/models/medical/examination/examination_indication.py +278 -0
  413. endoreg_db/models/medical/examination/examination_time.py +49 -0
  414. endoreg_db/models/medical/examination/examination_time_type.py +41 -0
  415. endoreg_db/models/medical/examination/examination_type.py +48 -0
  416. endoreg_db/models/medical/finding/__init__.py +18 -0
  417. endoreg_db/models/medical/finding/finding.py +96 -0
  418. endoreg_db/models/medical/finding/finding_classification.py +142 -0
  419. endoreg_db/models/medical/finding/finding_intervention.py +52 -0
  420. endoreg_db/models/medical/finding/finding_type.py +35 -0
  421. endoreg_db/models/medical/hardware/__init__.py +8 -0
  422. endoreg_db/models/medical/hardware/endoscope.py +65 -0
  423. endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +182 -143
  424. endoreg_db/models/medical/laboratory/__init__.py +5 -0
  425. endoreg_db/models/medical/laboratory/lab_value.py +419 -0
  426. endoreg_db/models/medical/medication/__init__.py +19 -0
  427. endoreg_db/models/medical/medication/medication.py +31 -0
  428. endoreg_db/models/medical/medication/medication_indication.py +50 -0
  429. endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
  430. endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
  431. endoreg_db/models/medical/medication/medication_schedule.py +45 -0
  432. endoreg_db/models/medical/organ/__init__.py +35 -0
  433. endoreg_db/models/medical/patient/__init__.py +56 -0
  434. endoreg_db/models/medical/patient/medication_examples.py +38 -0
  435. endoreg_db/models/medical/patient/patient_disease.py +63 -0
  436. endoreg_db/models/medical/patient/patient_event.py +75 -0
  437. endoreg_db/models/medical/patient/patient_examination.py +249 -0
  438. endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
  439. endoreg_db/models/medical/patient/patient_finding.py +357 -0
  440. endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
  441. endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
  442. endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
  443. endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +222 -176
  444. endoreg_db/models/medical/patient/patient_medication.py +104 -0
  445. endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
  446. endoreg_db/models/medical/risk/__init__.py +7 -0
  447. endoreg_db/models/medical/risk/risk.py +72 -0
  448. endoreg_db/models/medical/risk/risk_type.py +51 -0
  449. endoreg_db/models/metadata/__init__.py +19 -0
  450. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  451. endoreg_db/models/metadata/model_meta.py +206 -0
  452. endoreg_db/models/metadata/model_meta_logic.py +343 -0
  453. endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +89 -70
  454. endoreg_db/models/metadata/sensitive_meta.py +288 -0
  455. endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
  456. endoreg_db/models/metadata/video_meta.py +332 -0
  457. endoreg_db/models/metadata/video_prediction_logic.py +190 -0
  458. endoreg_db/models/metadata/video_prediction_meta.py +270 -0
  459. endoreg_db/models/other/__init__.py +40 -5
  460. endoreg_db/models/other/distribution/__init__.py +44 -0
  461. endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
  462. endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
  463. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
  464. endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
  465. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
  466. endoreg_db/models/other/emission/__init__.py +5 -0
  467. endoreg_db/models/other/emission/emission_factor.py +94 -0
  468. endoreg_db/models/{persons → other}/gender.py +27 -22
  469. endoreg_db/models/other/information_source.py +159 -0
  470. endoreg_db/models/other/material.py +28 -16
  471. endoreg_db/models/other/resource.py +21 -17
  472. endoreg_db/models/other/tag.py +27 -0
  473. endoreg_db/models/other/transport_route.py +33 -21
  474. endoreg_db/models/{unit.py → other/unit.py} +32 -22
  475. endoreg_db/models/other/waste.py +27 -20
  476. endoreg_db/models/requirement/__init__.py +11 -0
  477. endoreg_db/models/requirement/requirement.py +767 -0
  478. endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
  479. endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
  480. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
  481. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
  482. endoreg_db/models/requirement/requirement_operator.py +176 -0
  483. endoreg_db/models/requirement/requirement_set.py +287 -0
  484. endoreg_db/models/rule/__init__.py +13 -0
  485. endoreg_db/models/{rules → rule}/rule.py +27 -24
  486. endoreg_db/models/{rules → rule}/rule_applicator.py +224 -224
  487. endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +16 -18
  488. endoreg_db/models/{rules → rule}/rule_type.py +19 -21
  489. endoreg_db/models/{rules → rule}/ruleset.py +17 -19
  490. endoreg_db/models/state/__init__.py +12 -0
  491. endoreg_db/models/state/abstract.py +11 -0
  492. endoreg_db/models/state/audit_ledger.py +150 -0
  493. endoreg_db/models/state/label_video_segment.py +22 -0
  494. endoreg_db/models/state/raw_pdf.py +187 -0
  495. endoreg_db/models/state/sensitive_meta.py +46 -0
  496. endoreg_db/models/state/video.py +232 -0
  497. endoreg_db/models/upload_job.py +99 -0
  498. endoreg_db/models/utils.py +135 -0
  499. endoreg_db/queries/__init__.py +4 -4
  500. endoreg_db/queries/annotations/__init__.py +2 -2
  501. endoreg_db/queries/annotations/legacy.py +158 -159
  502. endoreg_db/renames.yml +8 -0
  503. endoreg_db/root_urls.py +9 -0
  504. endoreg_db/schemas/__init__.py +0 -0
  505. endoreg_db/schemas/examination_evaluation.py +27 -0
  506. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
  507. endoreg_db/serializers/__init__.py +118 -10
  508. endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
  509. endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
  510. endoreg_db/serializers/_old/video.py +71 -0
  511. endoreg_db/serializers/administration/__init__.py +14 -0
  512. endoreg_db/serializers/administration/ai/__init__.py +10 -0
  513. endoreg_db/serializers/administration/ai/active_model.py +10 -0
  514. endoreg_db/serializers/administration/ai/ai_model.py +18 -0
  515. endoreg_db/serializers/administration/ai/model_type.py +10 -0
  516. endoreg_db/serializers/administration/center.py +9 -0
  517. endoreg_db/serializers/administration/gender.py +9 -0
  518. endoreg_db/serializers/anonymization.py +69 -0
  519. endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
  520. endoreg_db/serializers/examination/__init__.py +10 -0
  521. endoreg_db/serializers/examination/base.py +46 -0
  522. endoreg_db/serializers/examination/dropdown.py +21 -0
  523. endoreg_db/serializers/examination_serializer.py +12 -0
  524. endoreg_db/serializers/finding/__init__.py +5 -0
  525. endoreg_db/serializers/finding/finding.py +54 -0
  526. endoreg_db/serializers/finding_classification/__init__.py +7 -0
  527. endoreg_db/serializers/finding_classification/choice.py +19 -0
  528. endoreg_db/serializers/finding_classification/classification.py +13 -0
  529. endoreg_db/serializers/label/__init__.py +7 -0
  530. endoreg_db/serializers/label/image_classification_annotation.py +62 -0
  531. endoreg_db/serializers/label/label.py +15 -0
  532. endoreg_db/serializers/label_video_segment/__init__.py +7 -0
  533. endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
  534. endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
  535. endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
  536. endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
  537. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
  538. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
  539. endoreg_db/serializers/meta/__init__.py +19 -0
  540. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
  541. endoreg_db/serializers/meta/report_meta.py +53 -0
  542. endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
  543. endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
  544. endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
  545. endoreg_db/serializers/meta/video_meta.py +39 -0
  546. endoreg_db/serializers/misc/__init__.py +14 -0
  547. endoreg_db/serializers/misc/file_overview.py +182 -0
  548. endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
  549. endoreg_db/serializers/misc/stats.py +33 -0
  550. endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
  551. endoreg_db/serializers/misc/upload_job.py +71 -0
  552. endoreg_db/serializers/patient/__init__.py +11 -0
  553. endoreg_db/serializers/patient/patient.py +86 -0
  554. endoreg_db/serializers/patient/patient_dropdown.py +27 -0
  555. endoreg_db/serializers/patient_examination/__init__.py +7 -0
  556. endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
  557. endoreg_db/serializers/patient_finding/__init__.py +15 -0
  558. endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
  559. endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
  560. endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
  561. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
  562. endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
  563. endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
  564. endoreg_db/serializers/pdf/__init__.py +5 -0
  565. endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
  566. endoreg_db/serializers/report/__init__.py +9 -0
  567. endoreg_db/serializers/report/mixins.py +45 -0
  568. endoreg_db/serializers/report/report.py +105 -0
  569. endoreg_db/serializers/report/report_list.py +22 -0
  570. endoreg_db/serializers/report/secure_file_url.py +26 -0
  571. endoreg_db/serializers/requirements/requirement_schema.py +25 -0
  572. endoreg_db/serializers/requirements/requirement_sets.py +29 -0
  573. endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
  574. endoreg_db/serializers/video/__init__.py +7 -0
  575. endoreg_db/serializers/video/segmentation.py +263 -0
  576. endoreg_db/serializers/video/video_file_brief.py +10 -0
  577. endoreg_db/serializers/video/video_file_detail.py +83 -0
  578. endoreg_db/serializers/video/video_file_list.py +67 -0
  579. endoreg_db/serializers/video/video_metadata.py +105 -0
  580. endoreg_db/serializers/video/video_processing_history.py +153 -0
  581. endoreg_db/serializers/video_examination.py +198 -0
  582. endoreg_db/services/__init__.py +5 -0
  583. endoreg_db/services/anonymization.py +223 -0
  584. endoreg_db/services/examination_evaluation.py +149 -0
  585. endoreg_db/services/finding_description_service.py +0 -0
  586. endoreg_db/services/lookup_service.py +411 -0
  587. endoreg_db/services/lookup_store.py +266 -0
  588. endoreg_db/services/pdf_import.py +1382 -0
  589. endoreg_db/services/polling_coordinator.py +288 -0
  590. endoreg_db/services/pseudonym_service.py +89 -0
  591. endoreg_db/services/requirements_object.py +147 -0
  592. endoreg_db/services/segment_sync.py +155 -0
  593. endoreg_db/services/storage_aware_video_processor.py +344 -0
  594. endoreg_db/services/video_import.py +1259 -0
  595. endoreg_db/tasks/upload_tasks.py +207 -0
  596. endoreg_db/tasks/video_ingest.py +157 -0
  597. endoreg_db/tasks/video_processing_tasks.py +327 -0
  598. endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
  599. endoreg_db/templates/admin/start_examination.html +12 -0
  600. endoreg_db/templates/timeline.html +176 -0
  601. endoreg_db/urls/__init__.py +83 -0
  602. endoreg_db/urls/anonymization.py +32 -0
  603. endoreg_db/urls/auth.py +16 -0
  604. endoreg_db/urls/classification.py +39 -0
  605. endoreg_db/urls/examination.py +54 -0
  606. endoreg_db/urls/files.py +6 -0
  607. endoreg_db/urls/label_video_segment_validate.py +33 -0
  608. endoreg_db/urls/label_video_segments.py +46 -0
  609. endoreg_db/urls/media.py +227 -0
  610. endoreg_db/urls/patient.py +19 -0
  611. endoreg_db/urls/report.py +48 -0
  612. endoreg_db/urls/requirements.py +13 -0
  613. endoreg_db/urls/sensitive_meta.py +0 -0
  614. endoreg_db/urls/stats.py +46 -0
  615. endoreg_db/urls/upload.py +20 -0
  616. endoreg_db/urls/video.py +61 -0
  617. endoreg_db/urls.py +9 -0
  618. endoreg_db/utils/__init__.py +88 -1
  619. endoreg_db/utils/ai/__init__.py +9 -0
  620. endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +5 -8
  621. endoreg_db/utils/ai/inference_dataset.py +52 -0
  622. endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
  623. endoreg_db/utils/ai/postprocess.py +63 -0
  624. endoreg_db/utils/ai/predict.py +291 -0
  625. endoreg_db/utils/ai/preprocess.py +68 -0
  626. endoreg_db/utils/calc_duration_seconds.py +24 -0
  627. endoreg_db/utils/case_generator/__init__.py +0 -0
  628. endoreg_db/utils/case_generator/case_generator.py +159 -0
  629. endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
  630. endoreg_db/utils/case_generator/utils.py +30 -0
  631. endoreg_db/utils/check_video_files.py +148 -0
  632. endoreg_db/utils/cropping.py +28 -28
  633. endoreg_db/utils/dataloader.py +175 -92
  634. endoreg_db/utils/dates.py +60 -0
  635. endoreg_db/utils/env.py +33 -0
  636. endoreg_db/utils/extract_specific_frames.py +72 -0
  637. endoreg_db/utils/file_operations.py +58 -30
  638. endoreg_db/utils/fix_video_path_direct.py +141 -0
  639. endoreg_db/utils/frame_anonymization_utils.py +463 -0
  640. endoreg_db/utils/hashs.py +153 -34
  641. endoreg_db/utils/links/__init__.py +0 -0
  642. endoreg_db/utils/links/requirement_link.py +193 -0
  643. endoreg_db/utils/mime_types.py +0 -0
  644. endoreg_db/utils/names.py +76 -0
  645. endoreg_db/utils/ocr.py +190 -197
  646. endoreg_db/utils/parse_and_generate_yaml.py +46 -0
  647. endoreg_db/utils/paths.py +95 -0
  648. endoreg_db/utils/permissions.py +143 -0
  649. endoreg_db/utils/pipelines/Readme.md +235 -0
  650. endoreg_db/utils/pipelines/__init__.py +0 -0
  651. endoreg_db/utils/pipelines/process_video_dir.py +120 -0
  652. endoreg_db/utils/product/__init__.py +0 -0
  653. endoreg_db/utils/product/sum_emissions.py +20 -0
  654. endoreg_db/utils/product/sum_weights.py +18 -0
  655. endoreg_db/utils/pydantic_models/__init__.py +6 -0
  656. endoreg_db/utils/pydantic_models/db_config.py +57 -0
  657. endoreg_db/utils/requirement_helpers.py +0 -0
  658. endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
  659. endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
  660. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
  661. endoreg_db/utils/setup_config.py +177 -0
  662. endoreg_db/utils/translation.py +27 -0
  663. endoreg_db/utils/uuid.py +4 -4
  664. endoreg_db/utils/validate_endo_roi.py +19 -0
  665. endoreg_db/utils/validate_subcategory_dict.py +91 -0
  666. endoreg_db/utils/validate_video_detailed.py +357 -0
  667. endoreg_db/utils/video/__init__.py +26 -0
  668. endoreg_db/utils/video/extract_frames.py +88 -0
  669. endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
  670. endoreg_db/utils/video/names.py +42 -0
  671. endoreg_db/utils/video/streaming_processor.py +312 -0
  672. endoreg_db/utils/video/video_splitter.py +94 -0
  673. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
  674. endoreg_db/views/__init__.py +275 -0
  675. endoreg_db/views/anonymization/__init__.py +27 -0
  676. endoreg_db/views/anonymization/media_management.py +454 -0
  677. endoreg_db/views/anonymization/overview.py +216 -0
  678. endoreg_db/views/anonymization/validate.py +107 -0
  679. endoreg_db/views/auth/__init__.py +13 -0
  680. endoreg_db/views/auth/keycloak.py +113 -0
  681. endoreg_db/views/examination/__init__.py +33 -0
  682. endoreg_db/views/examination/examination.py +37 -0
  683. endoreg_db/views/examination/examination_manifest_cache.py +26 -0
  684. endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
  685. endoreg_db/views/examination/get_finding_classifications.py +36 -0
  686. endoreg_db/views/examination/get_findings.py +41 -0
  687. endoreg_db/views/examination/get_instruments.py +18 -0
  688. endoreg_db/views/examination/get_interventions.py +14 -0
  689. endoreg_db/views/finding/__init__.py +9 -0
  690. endoreg_db/views/finding/finding.py +112 -0
  691. endoreg_db/views/finding/get_classifications.py +14 -0
  692. endoreg_db/views/finding/get_interventions.py +17 -0
  693. endoreg_db/views/finding_classification/__init__.py +13 -0
  694. endoreg_db/views/finding_classification/base.py +0 -0
  695. endoreg_db/views/finding_classification/finding_classification.py +42 -0
  696. endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
  697. endoreg_db/views/label/__init__.py +5 -0
  698. endoreg_db/views/label/label.py +15 -0
  699. endoreg_db/views/label_video_segment/__init__.py +16 -0
  700. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
  701. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
  702. endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
  703. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
  704. endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
  705. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
  706. endoreg_db/views/label_video_segment/validate.py +226 -0
  707. endoreg_db/views/media/__init__.py +45 -0
  708. endoreg_db/views/media/pdf_media.py +388 -0
  709. endoreg_db/views/media/segments.py +71 -0
  710. endoreg_db/views/media/sensitive_metadata.py +314 -0
  711. endoreg_db/views/media/video_media.py +272 -0
  712. endoreg_db/views/media/video_segments.py +524 -0
  713. endoreg_db/views/meta/__init__.py +15 -0
  714. endoreg_db/views/meta/available_files_list.py +146 -0
  715. endoreg_db/views/meta/report_meta.py +53 -0
  716. endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
  717. endoreg_db/views/meta/sensitive_meta_list.py +104 -0
  718. endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
  719. endoreg_db/views/misc/__init__.py +63 -0
  720. endoreg_db/views/misc/center.py +13 -0
  721. endoreg_db/views/misc/csrf.py +7 -0
  722. endoreg_db/views/misc/gender.py +14 -0
  723. endoreg_db/views/misc/secure_file_serving_view.py +80 -0
  724. endoreg_db/views/misc/secure_file_url_view.py +84 -0
  725. endoreg_db/views/misc/secure_url_validate.py +79 -0
  726. endoreg_db/views/misc/stats.py +220 -0
  727. endoreg_db/views/misc/translation.py +182 -0
  728. endoreg_db/views/misc/upload_views.py +240 -0
  729. endoreg_db/views/patient/__init__.py +5 -0
  730. endoreg_db/views/patient/patient.py +210 -0
  731. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
  732. endoreg_db/views/patient_examination/__init__.py +11 -0
  733. endoreg_db/views/patient_examination/patient_examination.py +140 -0
  734. endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
  735. endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
  736. endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
  737. endoreg_db/views/patient_examination/video.py +194 -0
  738. endoreg_db/views/patient_finding/__init__.py +7 -0
  739. endoreg_db/views/patient_finding/base.py +0 -0
  740. endoreg_db/views/patient_finding/patient_finding.py +64 -0
  741. endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
  742. endoreg_db/views/patient_finding_classification/__init__.py +5 -0
  743. endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
  744. endoreg_db/views/patient_finding_location/__init__.py +5 -0
  745. endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
  746. endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
  747. endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
  748. endoreg_db/views/pdf/__init__.py +8 -0
  749. endoreg_db/views/pdf/pdf_stream.py +187 -0
  750. endoreg_db/views/pdf/reimport.py +177 -0
  751. endoreg_db/views/report/__init__.py +9 -0
  752. endoreg_db/views/report/report_list.py +112 -0
  753. endoreg_db/views/report/report_with_secure_url.py +28 -0
  754. endoreg_db/views/report/start_examination.py +7 -0
  755. endoreg_db/views/requirement/__init__.py +10 -0
  756. endoreg_db/views/requirement/evaluate.py +279 -0
  757. endoreg_db/views/requirement/lookup.py +367 -0
  758. endoreg_db/views/requirement/lookup_store.py +252 -0
  759. endoreg_db/views/requirement_lookup/lookup.py +0 -0
  760. endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
  761. endoreg_db/views/stats/__init__.py +13 -0
  762. endoreg_db/views/stats/stats_views.py +229 -0
  763. endoreg_db/views/video/__init__.py +59 -0
  764. endoreg_db/views/video/correction.py +530 -0
  765. endoreg_db/views/video/reimport.py +195 -0
  766. endoreg_db/views/video/segmentation.py +274 -0
  767. endoreg_db/views/video/task_status.py +49 -0
  768. endoreg_db/views/video/timeline.py +46 -0
  769. endoreg_db/views/video/video_analyze.py +52 -0
  770. endoreg_db/views/video/video_apply_mask.py +48 -0
  771. endoreg_db/views/video/video_correction.py +21 -0
  772. endoreg_db/views/video/video_download_processed.py +58 -0
  773. endoreg_db/views/video/video_examination_viewset.py +242 -0
  774. endoreg_db/views/video/video_meta.py +29 -0
  775. endoreg_db/views/video/video_processing_history.py +24 -0
  776. endoreg_db/views/video/video_remove_frames.py +48 -0
  777. endoreg_db/views/video/video_stream.py +306 -0
  778. endoreg_db/views.py +0 -3
  779. endoreg_db-0.8.6.1.dist-info/METADATA +383 -0
  780. endoreg_db-0.8.6.1.dist-info/RECORD +793 -0
  781. {endoreg_db-0.3.6.dist-info → endoreg_db-0.8.6.1.dist-info}/WHEEL +1 -1
  782. {endoreg_db-0.3.6.dist-info → endoreg_db-0.8.6.1.dist-info/licenses}/LICENSE +674 -674
  783. endoreg_db/data/active_model/data.yaml +0 -3
  784. endoreg_db/data/label/label-set/data.yaml +0 -18
  785. endoreg_db/management/commands/_load_model_template.py +0 -41
  786. endoreg_db/management/commands/delete_all.py +0 -18
  787. endoreg_db/management/commands/delete_legacy_images.py +0 -19
  788. endoreg_db/management/commands/delete_legacy_videos.py +0 -17
  789. endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
  790. endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
  791. endoreg_db/management/commands/fix_auth_permission.py +0 -20
  792. endoreg_db/management/commands/import_legacy_images.py +0 -94
  793. endoreg_db/management/commands/import_legacy_videos.py +0 -76
  794. endoreg_db/management/commands/load_active_model_data.py +0 -45
  795. endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
  796. endoreg_db/management/commands/load_g_play_data.py +0 -113
  797. endoreg_db/management/commands/load_label_data.py +0 -67
  798. endoreg_db/management/commands/load_medication_indication_data.py +0 -63
  799. endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
  800. endoreg_db/migrations/0002_rawvideofile.py +0 -26
  801. endoreg_db/migrations/0003_rawvideofile_frames_required.py +0 -18
  802. endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +0 -18
  803. endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +0 -56
  804. endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +0 -25
  805. endoreg_db/migrations/0007_rawvideofile_processor.py +0 -19
  806. endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +0 -18
  807. endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +0 -31
  808. endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +0 -18
  809. endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +0 -18
  810. endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +0 -109
  811. endoreg_db/migrations/0013_rawpdffile.py +0 -31
  812. endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +0 -38
  813. endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +0 -31
  814. endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +0 -18
  815. endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +0 -37
  816. endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +0 -37
  817. endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +0 -42
  818. endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +0 -18
  819. endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +0 -19
  820. endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +0 -19
  821. endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +0 -59
  822. endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +0 -27
  823. endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +0 -42
  824. endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +0 -166
  825. endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +0 -38
  826. endoreg_db/migrations/0028_alter_unit_abbreviation.py +0 -18
  827. endoreg_db/migrations/0029_medicationintaketime_and_more.py +0 -75
  828. endoreg_db/migrations/0030_medicationindicationtype_and_more.py +0 -101
  829. endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +0 -38
  830. endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +0 -18
  831. endoreg_db/migrations/0033_medicationindication_sources.py +0 -18
  832. endoreg_db/migrations/0034_alter_rawpdffile_file.py +0 -20
  833. endoreg_db/migrations/0035_alter_medicationindication_sources.py +0 -18
  834. endoreg_db/migrations/0036_alter_rawpdffile_file.py +0 -20
  835. endoreg_db/migrations/0037_alter_medicationindication_sources.py +0 -18
  836. endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +0 -164
  837. endoreg_db/migrations/0039_referenceproduct_name.py +0 -19
  838. endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +0 -50
  839. endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +0 -40
  840. endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +0 -74
  841. endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +0 -23
  842. endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +0 -23
  843. endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +0 -19
  844. endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +0 -18
  845. endoreg_db/migrations/0047_casetemplaterule_target_model.py +0 -18
  846. endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +0 -22
  847. endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +0 -17
  848. endoreg_db/migrations/0050_casetemplaterule_rule_values.py +0 -18
  849. endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +0 -27
  850. endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +0 -18
  851. endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +0 -38
  852. endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +0 -69
  853. endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +0 -59
  854. endoreg_db/migrations/0056_datevaluedistribution_and_more.py +0 -32
  855. endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +0 -72
  856. endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +0 -28
  857. endoreg_db/migrations/0059_casetemplaterule_rule_values.py +0 -18
  858. endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +0 -44
  859. endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +0 -24
  860. endoreg_db/migrations/0062_labvalue_numeric_precision.py +0 -18
  861. endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +0 -18
  862. endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +0 -23
  863. endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +0 -58
  864. endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +0 -29
  865. endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +0 -19
  866. endoreg_db/models/ai_model/__init__.py +0 -3
  867. endoreg_db/models/ai_model/active_model.py +0 -9
  868. endoreg_db/models/ai_model/model_meta.py +0 -24
  869. endoreg_db/models/annotation/__init__.py +0 -2
  870. endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
  871. endoreg_db/models/annotation/image_classification.py +0 -27
  872. endoreg_db/models/center/center.py +0 -25
  873. endoreg_db/models/center/center_product.py +0 -34
  874. endoreg_db/models/center/center_resource.py +0 -19
  875. endoreg_db/models/center/center_waste.py +0 -11
  876. endoreg_db/models/data_file/__init__.py +0 -6
  877. endoreg_db/models/data_file/base_classes/__init__.py +0 -2
  878. endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
  879. endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
  880. endoreg_db/models/data_file/frame.py +0 -45
  881. endoreg_db/models/data_file/import_classes/__init__.py +0 -32
  882. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
  883. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
  884. endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
  885. endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -188
  886. endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
  887. endoreg_db/models/data_file/metadata/__init__.py +0 -3
  888. endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
  889. endoreg_db/models/data_file/metadata/video_meta.py +0 -133
  890. endoreg_db/models/data_file/report_file.py +0 -89
  891. endoreg_db/models/data_file/video/__init__.py +0 -7
  892. endoreg_db/models/data_file/video/import_meta.py +0 -25
  893. endoreg_db/models/data_file/video/video.py +0 -25
  894. endoreg_db/models/data_file/video_segment.py +0 -107
  895. endoreg_db/models/disease.py +0 -56
  896. endoreg_db/models/emission/__init__.py +0 -1
  897. endoreg_db/models/emission/emission_factor.py +0 -20
  898. endoreg_db/models/event.py +0 -22
  899. endoreg_db/models/examination/__init__.py +0 -4
  900. endoreg_db/models/examination/examination.py +0 -26
  901. endoreg_db/models/examination/examination_time.py +0 -27
  902. endoreg_db/models/examination/examination_time_type.py +0 -24
  903. endoreg_db/models/examination/examination_type.py +0 -18
  904. endoreg_db/models/hardware/__init__.py +0 -2
  905. endoreg_db/models/hardware/endoscope.py +0 -44
  906. endoreg_db/models/information_source.py +0 -29
  907. endoreg_db/models/laboratory/__init__.py +0 -1
  908. endoreg_db/models/laboratory/lab_value.py +0 -102
  909. endoreg_db/models/legacy_data/__init__.py +0 -3
  910. endoreg_db/models/legacy_data/image.py +0 -34
  911. endoreg_db/models/medication/__init__.py +0 -1
  912. endoreg_db/models/medication/medication.py +0 -148
  913. endoreg_db/models/other/distribution.py +0 -215
  914. endoreg_db/models/patient_examination/__init__.py +0 -35
  915. endoreg_db/models/permissions/__init__.py +0 -44
  916. endoreg_db/models/persons/__init__.py +0 -7
  917. endoreg_db/models/persons/examiner/__init__.py +0 -2
  918. endoreg_db/models/persons/examiner/examiner.py +0 -16
  919. endoreg_db/models/persons/examiner/examiner_type.py +0 -2
  920. endoreg_db/models/persons/patient/__init__.py +0 -8
  921. endoreg_db/models/persons/patient/case/case.py +0 -30
  922. endoreg_db/models/persons/patient/patient.py +0 -216
  923. endoreg_db/models/persons/patient/patient_disease.py +0 -16
  924. endoreg_db/models/persons/patient/patient_event.py +0 -22
  925. endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
  926. endoreg_db/models/persons/patient/patient_medication.py +0 -44
  927. endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
  928. endoreg_db/models/persons/portal_user_information.py +0 -27
  929. endoreg_db/models/prediction/__init__.py +0 -2
  930. endoreg_db/models/prediction/image_classification.py +0 -37
  931. endoreg_db/models/prediction/video_prediction_meta.py +0 -244
  932. endoreg_db/models/product/__init__.py +0 -5
  933. endoreg_db/models/product/product.py +0 -97
  934. endoreg_db/models/product/product_group.py +0 -19
  935. endoreg_db/models/product/product_material.py +0 -24
  936. endoreg_db/models/questionnaires/__init__.py +0 -114
  937. endoreg_db/models/quiz/__init__.py +0 -2
  938. endoreg_db/models/quiz/quiz_answer.py +0 -41
  939. endoreg_db/models/quiz/quiz_question.py +0 -54
  940. endoreg_db/models/report_reader/__init__.py +0 -2
  941. endoreg_db/models/report_reader/report_reader_config.py +0 -53
  942. endoreg_db/models/rules/__init__.py +0 -5
  943. endoreg_db/queries/get/__init__.py +0 -6
  944. endoreg_db/queries/get/center.py +0 -42
  945. endoreg_db/queries/get/model.py +0 -13
  946. endoreg_db/queries/get/patient.py +0 -14
  947. endoreg_db/queries/get/patient_examination.py +0 -20
  948. endoreg_db/queries/get/report_file.py +0 -33
  949. endoreg_db/queries/get/video.py +0 -31
  950. endoreg_db/serializers/ai_model.py +0 -19
  951. endoreg_db/serializers/annotation.py +0 -17
  952. endoreg_db/serializers/center.py +0 -11
  953. endoreg_db/serializers/examination.py +0 -33
  954. endoreg_db/serializers/frame.py +0 -13
  955. endoreg_db/serializers/hardware.py +0 -21
  956. endoreg_db/serializers/label.py +0 -22
  957. endoreg_db/serializers/patient.py +0 -10
  958. endoreg_db/serializers/prediction.py +0 -15
  959. endoreg_db/serializers/report_file.py +0 -7
  960. endoreg_db/serializers/video.py +0 -27
  961. endoreg_db/tests.py +0 -3
  962. endoreg_db/utils/legacy_ocr.py +0 -201
  963. endoreg_db/utils/video_metadata.py +0 -87
  964. endoreg_db-0.3.6.dist-info/METADATA +0 -33
  965. endoreg_db-0.3.6.dist-info/RECORD +0 -357
  966. /endoreg_db/{models/persons/patient/case/__init__.py → api/serializers/finding_descriptions.py} +0 -0
  967. /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
  968. /endoreg_db/{queries/get/prediction.py → config/__init__.py} +0 -0
  969. /endoreg_db/{queries/get/video_import_meta.py → data/case_template/rule_value/.init} +0 -0
  970. /endoreg_db/{queries/get/video_prediction_meta.py → data/distribution/multiple_categorical/.init} +0 -0
@@ -0,0 +1,149 @@
1
+ import logging
2
+ from rest_framework import serializers
3
+ from typing import TYPE_CHECKING
4
+ if TYPE_CHECKING:
5
+ from endoreg_db.serializers import LabelVideoSegmentSerializer
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ def _validate(self:"LabelVideoSegmentSerializer", attrs):
10
+ """
11
+ Validate video segment data, ensuring the presence and logical consistency of either time-based or frame-based segment information.
12
+
13
+ Raises:
14
+ ValidationError: If neither valid time nor frame data is provided, or if time/frame constraints are violated.
15
+
16
+ Returns:
17
+ dict: The validated attributes for the video segment.
18
+ """
19
+ logger.debug("Validation started")
20
+ video_id, label_id = self.extract_and_validate_basic_attrs(attrs)
21
+ instance = getattr(self, 'instance', None)
22
+ start_time, end_time = self.process_time_data(attrs, instance)
23
+ start_frame_number, end_frame_number = self.process_frame_data(attrs, instance)
24
+ has_time_data, has_frame_data = self.validate_time_and_frame_presence(start_time, end_time, start_frame_number, end_frame_number)
25
+ label_id = attrs.get('label_id')
26
+ label_name = attrs.get('label_name')
27
+ if not label_id and not label_name:
28
+ logger.info("Creating segment without label")
29
+ if has_time_data:
30
+ self.validate_time_constraints(start_time, end_time)
31
+ if has_frame_data:
32
+ self.validate_frame_constraints(start_frame_number, end_frame_number)
33
+ logger.debug(f"Attributes after validation: {attrs}")
34
+ return attrs
35
+
36
+ def _extract_and_validate_basic_attrs(self:"LabelVideoSegmentSerializer", attrs):
37
+ """
38
+ Extract and return the video and label identifiers from the provided attributes or initial data.
39
+
40
+ Returns:
41
+ Tuple containing the resolved video ID and label ID.
42
+ """
43
+ video_id = attrs.get('video_id') or self.initial_data.get('video_id') or self.initial_data.get('video_file')
44
+ label_id = attrs.get('label_id') or self.initial_data.get('label_id') or self.initial_data.get('label')
45
+ logger.debug(f"Validating video segment: video_id={video_id}, label_id={label_id}, attrs={{k: v for k, v in attrs.items() if k not in ['video_file', 'label']}}")
46
+ return video_id, label_id
47
+
48
+ def _process_time_data(self:"LabelVideoSegmentSerializer", attrs, instance):
49
+ """
50
+ Extract and convert start and end time values from input data, ensuring they are floats or None.
51
+
52
+ Parameters:
53
+ attrs (dict): Input attributes containing potential time values.
54
+ instance: Existing object instance to use as a fallback for time values.
55
+
56
+ Returns:
57
+ tuple: A pair (start_time, end_time), each as a float or None if missing or invalid.
58
+ """
59
+ start_time = attrs.get('start_time', None)
60
+ end_time = attrs.get('end_time', None)
61
+ if instance is not None:
62
+ if start_time is None:
63
+ start_time = getattr(instance, 'start_time', None)
64
+ if end_time is None:
65
+ end_time = getattr(instance, 'end_time', None)
66
+ # Always convert start_time/end_time to float if present
67
+ if 'start_time' in self.initial_data:
68
+ try:
69
+ attrs['start_time'] = float(self.initial_data['start_time'])
70
+ except (TypeError, ValueError):
71
+ attrs['start_time'] = None
72
+ start_time = attrs['start_time']
73
+ elif start_time is not None:
74
+ try:
75
+ start_time = float(start_time)
76
+ attrs['start_time'] = start_time
77
+ except (TypeError, ValueError):
78
+ start_time = None
79
+ attrs['start_time'] = None
80
+ if 'end_time' in self.initial_data:
81
+ try:
82
+ attrs['end_time'] = float(self.initial_data['end_time'])
83
+ except (TypeError, ValueError):
84
+ attrs['end_time'] = None
85
+ end_time = attrs['end_time']
86
+ elif end_time is not None:
87
+ try:
88
+ end_time = float(end_time)
89
+ attrs['end_time'] = end_time
90
+ except (TypeError, ValueError):
91
+ end_time = None
92
+ attrs['end_time'] = None
93
+ return start_time, end_time
94
+
95
+ def _process_frame_data(self:"LabelVideoSegmentSerializer", attrs, instance):
96
+ """
97
+ Retrieve start and end frame numbers from input attributes or an existing instance.
98
+
99
+ Returns:
100
+ tuple: A pair containing the start and end frame numbers, or None if not available.
101
+ """
102
+ start_frame_number = attrs.get('start_frame_number')
103
+ end_frame_number = attrs.get('end_frame_number')
104
+ if instance is not None:
105
+ if start_frame_number is None:
106
+ start_frame_number = getattr(instance, 'start_frame_number', None)
107
+ if end_frame_number is None:
108
+ end_frame_number = getattr(instance, 'end_frame_number', None)
109
+ return start_frame_number, end_frame_number
110
+
111
+ def _validate_time_and_frame_presence(self:"LabelVideoSegmentSerializer", start_time, end_time, start_frame_number, end_frame_number):
112
+ """
113
+ Check that either both time values or both frame number values are provided for a video segment.
114
+
115
+ Raises a ValidationError if neither a complete time range nor a complete frame range is present.
116
+
117
+ Returns:
118
+ has_time_data (bool): True if both start_time and end_time are provided.
119
+ has_frame_data (bool): True if both start_frame_number and end_frame_number are provided.
120
+ """
121
+ has_time_data = start_time is not None and end_time is not None
122
+ has_frame_data = start_frame_number is not None and end_frame_number is not None
123
+ if not has_time_data and not has_frame_data:
124
+ raise serializers.ValidationError(
125
+ "Either start_time/end_time or start_frame_number/end_frame_number must be provided"
126
+ )
127
+ return has_time_data, has_frame_data
128
+
129
+ def _validate_time_constraints(self:"LabelVideoSegmentSerializer", start_time, end_time):
130
+ """
131
+ Validate that the start and end times for a video segment are logically consistent.
132
+
133
+ Raises a ValidationError if start_time is negative or if end_time is not strictly greater than start_time.
134
+ """
135
+ if start_time < 0:
136
+ raise serializers.ValidationError("start_time must be non-negative")
137
+ if end_time <= start_time:
138
+ raise serializers.ValidationError("end_time must be greater than start_time")
139
+
140
+ def _validate_frame_constraints(self:"LabelVideoSegmentSerializer", start_frame_number, end_frame_number):
141
+ """
142
+ Validate that frame number constraints are satisfied for a video segment.
143
+
144
+ Raises a ValidationError if `start_frame_number` is negative or if `end_frame_number` is not greater than `start_frame_number`.
145
+ """
146
+ if start_frame_number < 0:
147
+ raise serializers.ValidationError("start_frame_number must be non-negative")
148
+ if end_frame_number <= start_frame_number:
149
+ raise serializers.ValidationError("end_frame_number must be greater than start_frame_number")
@@ -0,0 +1,344 @@
1
+ from rest_framework import serializers
2
+ from typing import List
3
+ from django.core.exceptions import ObjectDoesNotExist
4
+ from django.conf import settings
5
+ from urllib.parse import urljoin
6
+ from pathlib import Path
7
+
8
+ from ...models import LabelVideoSegment, VideoFile
9
+ import logging
10
+ from ._lvs_create import (
11
+ _create,
12
+ _get_video_file,
13
+ _get_label,
14
+ _validate_fps,
15
+ _calculate_frame_numbers,
16
+ _get_information_source
17
+ )
18
+ from ._lvs_update import (
19
+ _update,
20
+ )
21
+ from ._lvs_validate import (
22
+ _validate,
23
+ _extract_and_validate_basic_attrs,
24
+ _process_time_data,
25
+ _process_frame_data,
26
+ _validate_time_and_frame_presence,
27
+ _validate_time_constraints,
28
+ _validate_frame_constraints
29
+ )
30
+ from endoreg_db.serializers import ImageClassificationAnnotationSerializer
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+ # add these small helpers (could be private functions in this module)
35
+ def _media_relpath_from_file_path(file_path) -> str:
36
+ """
37
+ Return a media-relative path (never an absolute server path).
38
+ If MEDIA_ROOT is a prefix, strip it; otherwise return the basename.
39
+ Accepts str or Path-like.
40
+ """
41
+ p = Path(str(file_path))
42
+ media_root = getattr(settings, "MEDIA_ROOT", None)
43
+ if media_root:
44
+ try:
45
+ rel = p.resolve().relative_to(Path(media_root).resolve())
46
+ return rel.as_posix()
47
+ except Exception:
48
+ pass
49
+ return p.name # safe fallback
50
+
51
+ def _media_url_from_file_path(file_path, request=None) -> str:
52
+ """
53
+ Build a public URL for the file using MEDIA_URL + relpath.
54
+ If `request` is provided, return an absolute URL.
55
+ """
56
+ base = getattr(settings, "MEDIA_URL", "/media/")
57
+ if not base.endswith("/"):
58
+ base += "/"
59
+ rel = _media_relpath_from_file_path(file_path)
60
+ url = urljoin(base, rel)
61
+ if request is not None:
62
+ try:
63
+ return request.build_absolute_uri(url)
64
+ except Exception:
65
+ pass
66
+ return url
67
+
68
+
69
+ class LabelVideoSegmentSerializer(serializers.ModelSerializer):
70
+ """Serializer for creating and retrieving LabelVideoSegment instances."""
71
+
72
+ # Additional fields for convenience - matching frontend expectations
73
+ start_time = serializers.SerializerMethodField()
74
+ end_time = serializers.SerializerMethodField()
75
+
76
+ # Input fields (write_only for creation)
77
+ video_id = serializers.IntegerField(required=False, help_text="Video file ID")
78
+ label_id = serializers.IntegerField(required=False, allow_null=True, help_text="Label ID")
79
+
80
+ # Add support for label names (both Label and VideoSegmentationLabel)
81
+ label_name = serializers.CharField(write_only=True, required=False, allow_null=True, help_text="Label name")
82
+ label_display = serializers.SerializerMethodField()
83
+
84
+ # Read-only fields for response
85
+ video_name = serializers.SerializerMethodField(read_only=True)
86
+ frame_predictions = serializers.SerializerMethodField(read_only=True, help_text="Frame predictions for the video segment")
87
+ manual_frame_annotations = serializers.SerializerMethodField(read_only=True, help_text="Manual frame annotations for the video segment")
88
+
89
+ time_segments = serializers.SerializerMethodField(read_only=True, help_text="Time segments for the video segment")
90
+
91
+ create = _create
92
+ get_video_file = _get_video_file
93
+ get_label = _get_label
94
+ validate_fps = _validate_fps
95
+ calculate_frame_numbers = _calculate_frame_numbers
96
+ get_information_source = _get_information_source
97
+
98
+ update = _update
99
+
100
+ validate = _validate
101
+ extract_and_validate_basic_attrs = _extract_and_validate_basic_attrs
102
+ process_time_data = _process_time_data
103
+ process_frame_data = _process_frame_data
104
+ validate_time_and_frame_presence = _validate_time_and_frame_presence
105
+ validate_time_constraints = _validate_time_constraints
106
+ validate_frame_constraints = _validate_frame_constraints
107
+
108
+ class Meta:
109
+ model = LabelVideoSegment
110
+ fields = [
111
+ 'id',
112
+ "video_file",
113
+ 'video_name',
114
+ "video_id",
115
+ "label",
116
+ 'label_name',
117
+ "label_id",
118
+ 'start_frame_number',
119
+ 'end_frame_number',
120
+ 'start_time',
121
+ 'end_time',
122
+ "label_display",
123
+ "frame_predictions",
124
+ "manual_frame_annotations",
125
+ "time_segments"
126
+ ]
127
+ read_only_fields = ['id', 'video_name']
128
+ extra_kwargs = {
129
+ 'start_frame_number': {'required': False},
130
+ 'end_frame_number': {'required': False},
131
+ 'video_file': {'required': False},
132
+ 'label': {'required': False},
133
+ }
134
+
135
+
136
+ def __init__(self, *args, **kwargs):
137
+ """
138
+ Initialize the serializer and log the initial input data if available.
139
+ """
140
+ super().__init__(*args, **kwargs)
141
+ if hasattr(self, 'initial_data'):
142
+ logger.debug(f"Serializer initialized with data: {self.initial_data}")
143
+
144
+
145
+ def get_time_segments(self, obj: LabelVideoSegment) -> List[dict]:
146
+ frames = obj.frames
147
+ time_segments = {
148
+ "segment_id": obj.id,
149
+ "segment_start": obj.start_frame_number,
150
+ "segment_end": obj.end_frame_number,
151
+ "start_time": obj.start_time,
152
+ "end_time": obj.end_time,
153
+ "frames": []
154
+ }
155
+
156
+ request = self.context.get("request") if hasattr(self, "context") else None
157
+
158
+ for frame in frames:
159
+ all_classifications = ImageClassificationAnnotationSerializer(
160
+ frame.image_classification_annotations.all(), many=True
161
+ ).data
162
+ predictions = ImageClassificationAnnotationSerializer(frame.predictions, many=True).data
163
+ manual_annotations = ImageClassificationAnnotationSerializer(
164
+ frame.manual_annotations, many=True
165
+ ).data if frame.has_manual_annotations else []
166
+
167
+ # 👇 changed here: no absolute server path; give a media-relative path + a URL
168
+ rel = _media_relpath_from_file_path(frame.file_path)
169
+ url = _media_url_from_file_path(frame.file_path, request=request)
170
+
171
+ frame_data = {
172
+ "frame_filename": Path(str(frame.file_path)).name,
173
+ "frame_file_path": rel, # backwards-compatible, now relative
174
+ "frame_url": url, # new: what the frontend should use
175
+ "all_classifications": all_classifications,
176
+ "predictions": predictions,
177
+ "frame_id": frame.id,
178
+ "manual_annotations": manual_annotations
179
+ }
180
+ time_segments["frames"].append(frame_data)
181
+
182
+ return time_segments
183
+
184
+ def get_label_name(self, obj):# -> Any | Literal['unknown']:
185
+ """
186
+ Return the name of the label associated with the segment, or "unknown" if no label is set.
187
+ """
188
+ if obj.label:
189
+ return obj.label.name
190
+ return "unknown"
191
+
192
+ def get_manual_frame_annotations(self, obj:LabelVideoSegment):
193
+ """
194
+ Return serialized manual frame annotations for the given video segment.
195
+
196
+ Parameters:
197
+ obj (LabelVideoSegment): The video segment instance whose manual frame annotations are to be serialized.
198
+
199
+ Returns:
200
+ list: A list of serialized manual frame annotation data.
201
+ """
202
+ return ImageClassificationAnnotationSerializer(obj.manual_frame_annotations, many=True).data
203
+
204
+ def get_frame_predictions(self, obj:LabelVideoSegment) -> List[dict]:
205
+ """
206
+ Return serialized frame prediction annotations for the given video segment.
207
+
208
+ Parameters:
209
+ obj (LabelVideoSegment): The video segment instance whose frame predictions are to be serialized.
210
+
211
+ Returns:
212
+ List[dict]: A list of serialized frame prediction annotation data.
213
+ """
214
+ return ImageClassificationAnnotationSerializer(obj.frame_predictions, many=True).data
215
+
216
+ def get_all_annotations(self, obj:LabelVideoSegment):
217
+ """
218
+ Retrieve all image classification annotations for every frame in the given video segment.
219
+
220
+ Parameters:
221
+ obj (LabelVideoSegment): The video segment instance whose frame annotations are to be retrieved.
222
+
223
+ Returns:
224
+ list: A list of serialized image classification annotations for all frames in the segment.
225
+ """
226
+ return ImageClassificationAnnotationSerializer(obj.all_frame_annotations, many=True).data
227
+
228
+ def get_label_display(self, obj:LabelVideoSegment):
229
+ """
230
+ Return the German translation of the label name for display purposes.
231
+
232
+ If the segment has no label, returns "Unbekannt". If a translation is not available, returns the original label name.
233
+ """
234
+ if not obj.label:
235
+ return "Unbekannt"
236
+
237
+ label_name = obj.label.name
238
+ #TODO Refactor
239
+ translations = {
240
+ 'appendix': 'Appendix',
241
+ 'blood': 'Blut',
242
+ 'diverticule': 'Divertikel',
243
+ 'grasper': 'Greifer',
244
+ 'ileocaecalvalve': 'Ileozäkalklappe',
245
+ 'ileum': 'Ileum',
246
+ 'low_quality': 'Niedrige Bildqualität',
247
+ 'nbi': 'Narrow Band Imaging',
248
+ 'needle': 'Nadel',
249
+ 'outside': 'Außerhalb',
250
+ 'polyp': 'Polyp',
251
+ 'snare': 'Snare',
252
+ 'water_jet': 'Wasserstrahl',
253
+ 'wound': 'Wunde'
254
+ }
255
+ return translations.get(label_name, label_name)
256
+
257
+ def get_video_name(self, obj):
258
+ """
259
+ Return the display name of the video file associated with the segment.
260
+
261
+ If the video file has an `original_file_name`, it is returned; otherwise, a fallback name using the video ID is provided. Returns "Unknown Video" if the video file is inaccessible.
262
+ """
263
+ try:
264
+ video = obj.video_file
265
+ return getattr(video, 'original_file_name', f'Video {video.id}')
266
+ except (AttributeError, ObjectDoesNotExist):
267
+ return 'Unknown Video'
268
+
269
+ def get_start_time(self, obj:LabelVideoSegment):
270
+ """
271
+ Return the start time of the video segment in seconds.
272
+ """
273
+ return obj.start_time
274
+
275
+ def get_end_time(self, obj):
276
+ """
277
+ Return the end time of the video segment in seconds.
278
+ """
279
+ return obj.end_time
280
+
281
+ def is_valid(self, raise_exception=False):
282
+ """
283
+ Validates the serializer input data and logs the validation process.
284
+
285
+ Parameters:
286
+ raise_exception (bool): If True, raises a ValidationError on failure.
287
+
288
+ Returns:
289
+ bool: True if the data is valid, False otherwise.
290
+ """
291
+ logger.debug("Starting validation")
292
+ result = super().is_valid(raise_exception=raise_exception)
293
+ if not result:
294
+ logger.debug(f"Validation errors: {self.errors}")
295
+ return result
296
+
297
+ def to_internal_value(self, data):
298
+ """
299
+ Normalizes input data by mapping between `video_id`/`label_id` and `video_file`/`label` keys to ensure consistent internal representation for model creation and validation.
300
+
301
+ This allows the serializer to accept either set of keys and internally synchronize them before further processing.
302
+ """
303
+ #TODO @coderabbitai create an issue for @Hamzaukw
304
+ # we need to ensure consistent naming across serializers
305
+ # Currently we use it in various places, but it should be consistent
306
+ # Either make the usage consistent or create another serializer that handles this
307
+ # Map video_file → video_id and label → label_id
308
+ if 'video_file' in data:
309
+ data['video_id'] = data['video_file']
310
+ if 'label' in data:
311
+ data['label_id'] = data['label']
312
+ # Map video_id → video_file and label_id → label
313
+ if 'video_id' in data:
314
+ data['video_file'] = data['video_id']
315
+ if 'label_id' in data:
316
+ data['label'] = data['label_id']
317
+ return super().to_internal_value(data)
318
+
319
+ def to_representation(self, instance):
320
+ """
321
+ Return a JSON-compatible representation of a label video segment with calculated start and end times in seconds, label name, and explicit video and label IDs.
322
+
323
+ Raises:
324
+ ValueError: If the segment is not associated with a video file.
325
+ TypeError: If the associated video file is not a VideoFile instance.
326
+ """
327
+ data = super().to_representation(instance)
328
+ video_file = instance.video_file
329
+ if video_file is None:
330
+ raise ValueError("Video file must be associated with the segment")
331
+ if not isinstance(video_file, VideoFile):
332
+ raise TypeError("Expected video_file to be an instance of VideoFile")
333
+ # Add calculated time fields for frontend compatibility
334
+ data['start_time'] = video_file.frame_number_to_s(instance.start_frame_number)
335
+ data['end_time'] = video_file.frame_number_to_s(instance.end_frame_number)
336
+ # Ensure label_name is always present in response
337
+ if instance.label:
338
+ data['label_name'] = instance.label.name
339
+ else:
340
+ data['label_name'] = None
341
+ # Explicitly add video_id and label_id to the output for frontend convenience
342
+ data['video_id'] = instance.video_file.id if instance.video_file else None
343
+ data['label_id'] = instance.label.id if instance.label else None
344
+ return data
@@ -0,0 +1,99 @@
1
+ from rest_framework import serializers
2
+ import logging
3
+
4
+ logger = logging.getLogger(__name__)
5
+
6
+
7
+ class LabelVideoSegmentAnnotationSerializer(serializers.Serializer):
8
+ """
9
+ Serializer for annotation data.
10
+ Handles segment annotations with metadata including segmentId.
11
+ """
12
+ id = serializers.IntegerField(read_only=True)
13
+ videoId = serializers.IntegerField(required=True)
14
+ startTime = serializers.FloatField(required=False)
15
+ endTime = serializers.FloatField(required=False)
16
+ type = serializers.CharField(max_length=50, required=True)
17
+ text = serializers.CharField(max_length=1000, required=False, allow_blank=True)
18
+ tags = serializers.ListField(
19
+ child=serializers.CharField(max_length=100),
20
+ required=False,
21
+ default=list
22
+ )
23
+ userId = serializers.CharField(max_length=100, required=False)
24
+ isPublic = serializers.BooleanField(default=False)
25
+ confidence = serializers.FloatField(required=False, min_value=0.0, max_value=1.0)
26
+ metadata = serializers.DictField(required=False, default=dict)
27
+
28
+ def validate(self, data):
29
+ """
30
+ Validates annotation data, enforcing required fields and value constraints for segment annotations.
31
+
32
+ For annotations of type 'segment', ensures both `startTime` and `endTime` are present and that `startTime` is less than `endTime`. If `metadata.segmentId` is provided, verifies it is a valid integer.
33
+
34
+ Raises:
35
+ serializers.ValidationError: If validation fails.
36
+
37
+ Returns:
38
+ dict: The validated annotation data.
39
+ """
40
+ annotation_type = data.get('type')
41
+
42
+ if annotation_type == 'segment':
43
+ if 'startTime' not in data or 'endTime' not in data:
44
+ raise serializers.ValidationError(
45
+ "Segment annotations must include startTime and endTime"
46
+ )
47
+
48
+ start_time = data.get('startTime')
49
+ end_time = data.get('endTime')
50
+
51
+ if start_time >= end_time:
52
+ raise serializers.ValidationError(
53
+ "startTime must be less than endTime"
54
+ )
55
+
56
+ # Validate metadata contains segmentId if provided
57
+ metadata = data.get('metadata', {})
58
+ segment_id = metadata.get('segmentId')
59
+ if segment_id is not None:
60
+ try:
61
+ int(segment_id)
62
+ except (ValueError, TypeError):
63
+ raise serializers.ValidationError(
64
+ "metadata.segmentId must be a valid integer"
65
+ )
66
+
67
+ return data
68
+
69
+ #@maxhild we need to verify if this is the right place for these methods, if so we should implement them here
70
+ def create(self, validated_data):
71
+ """
72
+ Assigns a unique ID to the annotation data and returns the updated data dictionary.
73
+
74
+ In this simulated implementation, the method mimics creating a new annotation by incrementing an internal counter for the ID. No data is persisted to a database or external storage.
75
+
76
+ Returns:
77
+ dict: The annotation data with an assigned unique ID.
78
+ """
79
+ # Simulate creating an annotation with an ID
80
+ validated_data['id'] = getattr(self, '_next_id', 1)
81
+ self._next_id = validated_data['id'] + 1
82
+ return validated_data
83
+
84
+ def update(self, instance, validated_data):
85
+ """
86
+ Update annotation data structure.
87
+ """
88
+ for attr, value in validated_data.items():
89
+ instance[attr] = value
90
+ return instance
91
+
92
+ def save(self, **kwargs):
93
+ """
94
+ Save the annotation.
95
+ """
96
+ if self.instance:
97
+ return self.update(self.instance, self.validated_data)
98
+ else:
99
+ return self.create(self.validated_data)