endoreg-db 0.8.6.4__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 (793) hide show
  1. endoreg_db/__init__.py +0 -0
  2. endoreg_db/admin.py +92 -0
  3. endoreg_db/api/serializers/finding_descriptions.py +0 -0
  4. endoreg_db/api/views/finding_descriptions.py +0 -0
  5. endoreg_db/api_urls.py +4 -0
  6. endoreg_db/apps.py +18 -0
  7. endoreg_db/assets/dummy_model.ckpt +1 -0
  8. endoreg_db/codemods/readme.md +88 -0
  9. endoreg_db/codemods/rename_datetime_fields.py +92 -0
  10. endoreg_db/config/__init__.py +0 -0
  11. endoreg_db/config/env.py +101 -0
  12. endoreg_db/data/__init__.py +144 -0
  13. endoreg_db/data/ai_model/data.yaml +7 -0
  14. endoreg_db/data/ai_model_label/label/data.yaml +88 -0
  15. endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
  16. endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
  17. endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
  18. endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
  19. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
  20. endoreg_db/data/ai_model_type/data.yaml +7 -0
  21. endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
  22. endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
  23. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
  24. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
  25. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
  26. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
  27. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
  28. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
  29. endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
  30. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
  31. endoreg_db/data/case_template/rule_value/.init +0 -0
  32. endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
  33. endoreg_db/data/case_template/template/base.yaml +8 -0
  34. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
  35. endoreg_db/data/case_template/tmp/_rule_value +13 -0
  36. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
  37. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
  38. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
  39. endoreg_db/data/center/data.yaml +91 -0
  40. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
  41. endoreg_db/data/center_shift/ukw.yaml +9 -0
  42. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
  43. endoreg_db/data/contraindication/bleeding.yaml +11 -0
  44. endoreg_db/data/db_summary.csv +58 -0
  45. endoreg_db/data/db_summary.xlsx +0 -0
  46. endoreg_db/data/disease/cardiovascular.yaml +37 -0
  47. endoreg_db/data/disease/hepatology.yaml +5 -0
  48. endoreg_db/data/disease/misc.yaml +5 -0
  49. endoreg_db/data/disease/renal.yaml +5 -0
  50. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
  51. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
  52. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
  53. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
  54. endoreg_db/data/distribution/date/patient.yaml +7 -0
  55. endoreg_db/data/distribution/multiple_categorical/.init +0 -0
  56. endoreg_db/data/distribution/numeric/data.yaml +14 -0
  57. endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
  58. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
  59. endoreg_db/data/endoscope/data.yaml +93 -0
  60. endoreg_db/data/endoscope_type/data.yaml +11 -0
  61. endoreg_db/data/endoscopy_processor/data.yaml +50 -0
  62. endoreg_db/data/event/cardiology.yaml +15 -0
  63. endoreg_db/data/event/neurology.yaml +14 -0
  64. endoreg_db/data/event/surgery.yaml +13 -0
  65. endoreg_db/data/event/thrombembolism.yaml +20 -0
  66. endoreg_db/data/examination/examinations/data.yaml +72 -0
  67. endoreg_db/data/examination/time/data.yaml +48 -0
  68. endoreg_db/data/examination/time-type/data.yaml +8 -0
  69. endoreg_db/data/examination/type/data.yaml +17 -0
  70. endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
  71. endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
  72. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
  73. endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
  74. endoreg_db/data/finding/anatomy_colon.yaml +128 -0
  75. endoreg_db/data/finding/colonoscopy.yaml +40 -0
  76. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
  77. endoreg_db/data/finding/complication.yaml +16 -0
  78. endoreg_db/data/finding/data.yaml +105 -0
  79. endoreg_db/data/finding/examination_setting.yaml +16 -0
  80. endoreg_db/data/finding/medication_related.yaml +18 -0
  81. endoreg_db/data/finding/outcome.yaml +12 -0
  82. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
  83. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
  84. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
  85. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  86. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  87. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  88. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  89. endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
  90. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
  91. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
  92. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
  93. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
  94. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
  95. endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
  96. endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
  97. endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
  98. endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
  99. endoreg_db/data/finding_classification/medication_related.yaml +23 -0
  100. endoreg_db/data/finding_classification/visualized.yaml +33 -0
  101. endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
  102. endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
  103. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  104. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  105. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  106. endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
  107. endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
  108. endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
  109. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  110. endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
  111. endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
  112. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  113. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
  114. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  115. endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
  116. endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  117. endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
  118. endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
  119. endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
  120. endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
  121. endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
  122. endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
  123. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
  124. endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
  125. endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
  126. endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
  127. endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
  128. endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
  129. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
  130. endoreg_db/data/finding_type/data.yaml +43 -0
  131. endoreg_db/data/gender/data.yaml +42 -0
  132. endoreg_db/data/information_source/annotation.yaml +6 -0
  133. endoreg_db/data/information_source/data.yaml +30 -0
  134. endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
  135. endoreg_db/data/information_source/medication.yaml +6 -0
  136. endoreg_db/data/information_source/prediction.yaml +7 -0
  137. endoreg_db/data/information_source_type/data.yaml +8 -0
  138. endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
  139. endoreg_db/data/lab_value/coagulation.yaml +54 -0
  140. endoreg_db/data/lab_value/electrolytes.yaml +228 -0
  141. endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
  142. endoreg_db/data/lab_value/hematology.yaml +184 -0
  143. endoreg_db/data/lab_value/hormones.yaml +59 -0
  144. endoreg_db/data/lab_value/lipids.yaml +53 -0
  145. endoreg_db/data/lab_value/misc.yaml +76 -0
  146. endoreg_db/data/lab_value/renal_function.yaml +12 -0
  147. endoreg_db/data/log_type/data.yaml +57 -0
  148. endoreg_db/data/lx_client_tag/base.yaml +54 -0
  149. endoreg_db/data/lx_client_type/base.yaml +30 -0
  150. endoreg_db/data/lx_permission/base.yaml +24 -0
  151. endoreg_db/data/lx_permission/endoreg.yaml +52 -0
  152. endoreg_db/data/material/material.yaml +91 -0
  153. endoreg_db/data/medication/anticoagulation.yaml +65 -0
  154. endoreg_db/data/medication/tah.yaml +70 -0
  155. endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
  156. endoreg_db/data/medication_indication_type/data.yaml +11 -0
  157. endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
  158. endoreg_db/data/medication_intake_time/base.yaml +31 -0
  159. endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
  160. endoreg_db/data/medication_schedule/ass.yaml +12 -0
  161. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
  162. endoreg_db/data/names_first/first_names.yaml +54 -0
  163. endoreg_db/data/names_last/last_names.yaml +51 -0
  164. endoreg_db/data/network_device/data.yaml +59 -0
  165. endoreg_db/data/network_device_type/data.yaml +12 -0
  166. endoreg_db/data/organ/data.yaml +29 -0
  167. endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
  168. endoreg_db/data/pdf_type/data.yaml +46 -0
  169. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
  170. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
  171. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
  172. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
  173. endoreg_db/data/profession/data.yaml +70 -0
  174. endoreg_db/data/qualification/endoscopy.yaml +36 -0
  175. endoreg_db/data/qualification/m2.yaml +39 -0
  176. endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
  177. endoreg_db/data/qualification/sonography.yaml +36 -0
  178. endoreg_db/data/qualification_type/base.yaml +29 -0
  179. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
  180. endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
  181. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
  182. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
  183. endoreg_db/data/requirement/age.yaml +26 -0
  184. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
  185. endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
  186. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
  187. endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
  188. endoreg_db/data/requirement/disease_misc.yaml +12 -0
  189. endoreg_db/data/requirement/disease_renal.yaml +96 -0
  190. endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
  191. endoreg_db/data/requirement/event_cardiology.yaml +251 -0
  192. endoreg_db/data/requirement/event_requirements.yaml +145 -0
  193. endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
  194. endoreg_db/data/requirement/gender.yaml +25 -0
  195. endoreg_db/data/requirement/lab_value.yaml +441 -0
  196. endoreg_db/data/requirement/medication.yaml +93 -0
  197. endoreg_db/data/requirement_operator/age.yaml +13 -0
  198. endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
  199. endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
  200. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
  201. endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  202. endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
  203. endoreg_db/data/requirement_set_type/data.yaml +20 -0
  204. endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
  205. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
  206. endoreg_db/data/risk/bleeding.yaml +26 -0
  207. endoreg_db/data/risk/thrombosis.yaml +37 -0
  208. endoreg_db/data/risk_type/data.yaml +27 -0
  209. endoreg_db/data/setup_config.yaml +38 -0
  210. endoreg_db/data/shift/endoscopy.yaml +21 -0
  211. endoreg_db/data/shift/m2.yaml +0 -0
  212. endoreg_db/data/shift_type/base.yaml +35 -0
  213. endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
  214. endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
  215. endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
  216. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
  217. endoreg_db/data/unit/concentration.yaml +115 -0
  218. endoreg_db/data/unit/data.yaml +17 -0
  219. endoreg_db/data/unit/length.yaml +31 -0
  220. endoreg_db/data/unit/misc.yaml +20 -0
  221. endoreg_db/data/unit/rate.yaml +6 -0
  222. endoreg_db/data/unit/time.yaml +48 -0
  223. endoreg_db/data/unit/volume.yaml +35 -0
  224. endoreg_db/data/unit/weight.yaml +38 -0
  225. endoreg_db/data/waste/data.yaml +12 -0
  226. endoreg_db/exceptions.py +19 -0
  227. endoreg_db/factories/__init__.py +0 -0
  228. endoreg_db/forms/__init__.py +5 -0
  229. endoreg_db/forms/examination_form.py +11 -0
  230. endoreg_db/forms/patient_finding_intervention_form.py +18 -0
  231. endoreg_db/forms/patient_form.py +27 -0
  232. endoreg_db/forms/questionnaires/__init__.py +1 -0
  233. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
  234. endoreg_db/forms/settings/__init__.py +8 -0
  235. endoreg_db/forms/unit.py +6 -0
  236. endoreg_db/helpers/__init__.py +0 -0
  237. endoreg_db/helpers/count_db.py +45 -0
  238. endoreg_db/helpers/data_loader.py +208 -0
  239. endoreg_db/helpers/default_objects.py +378 -0
  240. endoreg_db/helpers/download_segmentation_model.py +31 -0
  241. endoreg_db/helpers/interact.py +6 -0
  242. endoreg_db/helpers/test_video_helper.py +119 -0
  243. endoreg_db/logger_conf.py +140 -0
  244. endoreg_db/management/__init__.py +1 -0
  245. endoreg_db/management/commands/__init__.py +1 -0
  246. endoreg_db/management/commands/anonymize_video.py +0 -0
  247. endoreg_db/management/commands/check_auth.py +125 -0
  248. endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
  249. endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
  250. endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
  251. endoreg_db/management/commands/fix_video_paths.py +165 -0
  252. endoreg_db/management/commands/import_fallback_video.py +203 -0
  253. endoreg_db/management/commands/import_report.py +298 -0
  254. endoreg_db/management/commands/import_video.py +423 -0
  255. endoreg_db/management/commands/import_video_with_classification.py +367 -0
  256. endoreg_db/management/commands/init_default_ai_model.py +112 -0
  257. endoreg_db/management/commands/load_ai_model_data.py +77 -0
  258. endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
  259. endoreg_db/management/commands/load_base_db_data.py +192 -0
  260. endoreg_db/management/commands/load_center_data.py +68 -0
  261. endoreg_db/management/commands/load_contraindication_data.py +41 -0
  262. endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
  263. endoreg_db/management/commands/load_disease_classification_data.py +41 -0
  264. endoreg_db/management/commands/load_disease_data.py +62 -0
  265. endoreg_db/management/commands/load_distribution_data.py +66 -0
  266. endoreg_db/management/commands/load_endoscope_data.py +68 -0
  267. endoreg_db/management/commands/load_event_data.py +41 -0
  268. endoreg_db/management/commands/load_examination_data.py +75 -0
  269. endoreg_db/management/commands/load_examination_indication_data.py +86 -0
  270. endoreg_db/management/commands/load_finding_data.py +128 -0
  271. endoreg_db/management/commands/load_gender_data.py +44 -0
  272. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
  273. endoreg_db/management/commands/load_information_source.py +51 -0
  274. endoreg_db/management/commands/load_lab_value_data.py +50 -0
  275. endoreg_db/management/commands/load_medication_data.py +103 -0
  276. endoreg_db/management/commands/load_name_data.py +37 -0
  277. endoreg_db/management/commands/load_organ_data.py +43 -0
  278. endoreg_db/management/commands/load_pdf_type_data.py +61 -0
  279. endoreg_db/management/commands/load_profession_data.py +44 -0
  280. endoreg_db/management/commands/load_qualification_data.py +59 -0
  281. endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
  282. endoreg_db/management/commands/load_requirement_data.py +180 -0
  283. endoreg_db/management/commands/load_risk_data.py +56 -0
  284. endoreg_db/management/commands/load_shift_data.py +60 -0
  285. endoreg_db/management/commands/load_tag_data.py +57 -0
  286. endoreg_db/management/commands/load_unit_data.py +46 -0
  287. endoreg_db/management/commands/load_user_groups.py +28 -0
  288. endoreg_db/management/commands/register_ai_model.py +64 -0
  289. endoreg_db/management/commands/reset_celery_schedule.py +9 -0
  290. endoreg_db/management/commands/setup_endoreg_db.py +381 -0
  291. endoreg_db/management/commands/start_filewatcher.py +106 -0
  292. endoreg_db/management/commands/storage_management.py +548 -0
  293. endoreg_db/management/commands/summarize_db_content.py +189 -0
  294. endoreg_db/management/commands/validate_video.py +204 -0
  295. endoreg_db/management/commands/validate_video_files.py +161 -0
  296. endoreg_db/management/commands/video_validation.py +22 -0
  297. endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
  298. endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
  299. endoreg_db/mermaid/binary_classification_annotation.md +50 -0
  300. endoreg_db/mermaid/classification.md +8 -0
  301. endoreg_db/mermaid/examination.md +8 -0
  302. endoreg_db/mermaid/findings.md +7 -0
  303. endoreg_db/mermaid/image_classification.md +28 -0
  304. endoreg_db/mermaid/interventions.md +8 -0
  305. endoreg_db/mermaid/morphology.md +8 -0
  306. endoreg_db/mermaid/patient_creation.md +14 -0
  307. endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
  308. endoreg_db/migrations/0001_initial.py +1857 -0
  309. endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
  310. endoreg_db/migrations/0003_add_center_display_name.py +30 -0
  311. endoreg_db/migrations/__init__.py +0 -0
  312. endoreg_db/models/__init__.py +359 -0
  313. endoreg_db/models/administration/__init__.py +116 -0
  314. endoreg_db/models/administration/ai/__init__.py +9 -0
  315. endoreg_db/models/administration/ai/active_model.py +35 -0
  316. endoreg_db/models/administration/ai/ai_model.py +156 -0
  317. endoreg_db/models/administration/ai/model_type.py +41 -0
  318. endoreg_db/models/administration/case/__init__.py +19 -0
  319. endoreg_db/models/administration/case/case.py +114 -0
  320. endoreg_db/models/administration/case/case_template/__init__.py +15 -0
  321. endoreg_db/models/administration/case/case_template/case_template.py +125 -0
  322. endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
  323. endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
  324. endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
  325. endoreg_db/models/administration/center/__init__.py +13 -0
  326. endoreg_db/models/administration/center/center.py +67 -0
  327. endoreg_db/models/administration/center/center_product.py +64 -0
  328. endoreg_db/models/administration/center/center_resource.py +49 -0
  329. endoreg_db/models/administration/center/center_shift.py +88 -0
  330. endoreg_db/models/administration/center/center_waste.py +30 -0
  331. endoreg_db/models/administration/permissions/__init__.py +44 -0
  332. endoreg_db/models/administration/person/__init__.py +24 -0
  333. endoreg_db/models/administration/person/employee/__init__.py +3 -0
  334. endoreg_db/models/administration/person/employee/employee.py +35 -0
  335. endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
  336. endoreg_db/models/administration/person/employee/employee_type.py +42 -0
  337. endoreg_db/models/administration/person/examiner/__init__.py +4 -0
  338. endoreg_db/models/administration/person/examiner/examiner.py +54 -0
  339. endoreg_db/models/administration/person/names/__init__.py +0 -0
  340. endoreg_db/models/administration/person/names/first_name.py +18 -0
  341. endoreg_db/models/administration/person/names/last_name.py +19 -0
  342. endoreg_db/models/administration/person/patient/__init__.py +5 -0
  343. endoreg_db/models/administration/person/patient/patient.py +460 -0
  344. endoreg_db/models/administration/person/person.py +31 -0
  345. endoreg_db/models/administration/person/profession/__init__.py +24 -0
  346. endoreg_db/models/administration/person/user/__init__.py +5 -0
  347. endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
  348. endoreg_db/models/administration/product/__init__.py +14 -0
  349. endoreg_db/models/administration/product/product.py +97 -0
  350. endoreg_db/models/administration/product/product_group.py +39 -0
  351. endoreg_db/models/administration/product/product_material.py +54 -0
  352. endoreg_db/models/administration/product/product_weight.py +47 -0
  353. endoreg_db/models/administration/product/reference_product.py +130 -0
  354. endoreg_db/models/administration/qualification/__init__.py +7 -0
  355. endoreg_db/models/administration/qualification/qualification.py +37 -0
  356. endoreg_db/models/administration/qualification/qualification_type.py +35 -0
  357. endoreg_db/models/administration/shift/__init__.py +9 -0
  358. endoreg_db/models/administration/shift/scheduled_days.py +69 -0
  359. endoreg_db/models/administration/shift/shift.py +51 -0
  360. endoreg_db/models/administration/shift/shift_type.py +108 -0
  361. endoreg_db/models/label/__init__.py +24 -0
  362. endoreg_db/models/label/annotation/__init__.py +12 -0
  363. endoreg_db/models/label/annotation/image_classification.py +84 -0
  364. endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
  365. endoreg_db/models/label/label.py +83 -0
  366. endoreg_db/models/label/label_set.py +53 -0
  367. endoreg_db/models/label/label_type.py +29 -0
  368. endoreg_db/models/label/label_video_segment/__init__.py +3 -0
  369. endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
  370. endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
  371. endoreg_db/models/label/video_segmentation_label.py +31 -0
  372. endoreg_db/models/label/video_segmentation_labelset.py +27 -0
  373. endoreg_db/models/media/__init__.py +16 -0
  374. endoreg_db/models/media/frame/__init__.py +3 -0
  375. endoreg_db/models/media/frame/frame.py +111 -0
  376. endoreg_db/models/media/pdf/__init__.py +11 -0
  377. endoreg_db/models/media/pdf/raw_pdf.py +757 -0
  378. endoreg_db/models/media/pdf/report_file.py +162 -0
  379. endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
  380. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
  381. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +20 -0
  382. endoreg_db/models/media/video/__init__.py +8 -0
  383. endoreg_db/models/media/video/create_from_file.py +358 -0
  384. endoreg_db/models/media/video/pipe_1.py +213 -0
  385. endoreg_db/models/media/video/pipe_2.py +105 -0
  386. endoreg_db/models/media/video/refactor_plan.md +0 -0
  387. endoreg_db/models/media/video/video_file.py +825 -0
  388. endoreg_db/models/media/video/video_file_ai.py +443 -0
  389. endoreg_db/models/media/video/video_file_anonymize.py +349 -0
  390. endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
  391. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
  392. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
  393. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
  394. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
  395. endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
  396. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
  397. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
  398. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
  399. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
  400. endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
  401. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
  402. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
  403. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
  404. endoreg_db/models/media/video/video_file_frames.py +0 -0
  405. endoreg_db/models/media/video/video_file_io.py +168 -0
  406. endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
  407. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
  408. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
  409. endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
  410. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
  411. endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
  412. endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
  413. endoreg_db/models/media/video/video_file_segments.py +209 -0
  414. endoreg_db/models/media/video/video_metadata.py +65 -0
  415. endoreg_db/models/media/video/video_processing.py +152 -0
  416. endoreg_db/models/medical/__init__.py +146 -0
  417. endoreg_db/models/medical/contraindication/__init__.py +17 -0
  418. endoreg_db/models/medical/disease.py +156 -0
  419. endoreg_db/models/medical/event.py +137 -0
  420. endoreg_db/models/medical/examination/__init__.py +9 -0
  421. endoreg_db/models/medical/examination/examination.py +148 -0
  422. endoreg_db/models/medical/examination/examination_indication.py +278 -0
  423. endoreg_db/models/medical/examination/examination_time.py +49 -0
  424. endoreg_db/models/medical/examination/examination_time_type.py +41 -0
  425. endoreg_db/models/medical/examination/examination_type.py +48 -0
  426. endoreg_db/models/medical/finding/__init__.py +18 -0
  427. endoreg_db/models/medical/finding/finding.py +96 -0
  428. endoreg_db/models/medical/finding/finding_classification.py +142 -0
  429. endoreg_db/models/medical/finding/finding_intervention.py +52 -0
  430. endoreg_db/models/medical/finding/finding_type.py +35 -0
  431. endoreg_db/models/medical/hardware/__init__.py +8 -0
  432. endoreg_db/models/medical/hardware/endoscope.py +65 -0
  433. endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
  434. endoreg_db/models/medical/laboratory/__init__.py +5 -0
  435. endoreg_db/models/medical/laboratory/lab_value.py +419 -0
  436. endoreg_db/models/medical/medication/__init__.py +19 -0
  437. endoreg_db/models/medical/medication/medication.py +31 -0
  438. endoreg_db/models/medical/medication/medication_indication.py +50 -0
  439. endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
  440. endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
  441. endoreg_db/models/medical/medication/medication_schedule.py +45 -0
  442. endoreg_db/models/medical/organ/__init__.py +35 -0
  443. endoreg_db/models/medical/patient/__init__.py +56 -0
  444. endoreg_db/models/medical/patient/medication_examples.py +38 -0
  445. endoreg_db/models/medical/patient/patient_disease.py +63 -0
  446. endoreg_db/models/medical/patient/patient_event.py +75 -0
  447. endoreg_db/models/medical/patient/patient_examination.py +249 -0
  448. endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
  449. endoreg_db/models/medical/patient/patient_finding.py +357 -0
  450. endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
  451. endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
  452. endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
  453. endoreg_db/models/medical/patient/patient_lab_value.py +222 -0
  454. endoreg_db/models/medical/patient/patient_medication.py +104 -0
  455. endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
  456. endoreg_db/models/medical/risk/__init__.py +7 -0
  457. endoreg_db/models/medical/risk/risk.py +72 -0
  458. endoreg_db/models/medical/risk/risk_type.py +51 -0
  459. endoreg_db/models/metadata/__init__.py +19 -0
  460. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  461. endoreg_db/models/metadata/model_meta.py +206 -0
  462. endoreg_db/models/metadata/model_meta_logic.py +343 -0
  463. endoreg_db/models/metadata/pdf_meta.py +89 -0
  464. endoreg_db/models/metadata/sensitive_meta.py +288 -0
  465. endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
  466. endoreg_db/models/metadata/video_meta.py +332 -0
  467. endoreg_db/models/metadata/video_prediction_logic.py +190 -0
  468. endoreg_db/models/metadata/video_prediction_meta.py +270 -0
  469. endoreg_db/models/other/__init__.py +40 -0
  470. endoreg_db/models/other/distribution/__init__.py +44 -0
  471. endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
  472. endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
  473. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
  474. endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
  475. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
  476. endoreg_db/models/other/emission/__init__.py +5 -0
  477. endoreg_db/models/other/emission/emission_factor.py +94 -0
  478. endoreg_db/models/other/gender.py +27 -0
  479. endoreg_db/models/other/information_source.py +159 -0
  480. endoreg_db/models/other/material.py +28 -0
  481. endoreg_db/models/other/resource.py +22 -0
  482. endoreg_db/models/other/tag.py +27 -0
  483. endoreg_db/models/other/transport_route.py +33 -0
  484. endoreg_db/models/other/unit.py +32 -0
  485. endoreg_db/models/other/waste.py +27 -0
  486. endoreg_db/models/requirement/__init__.py +11 -0
  487. endoreg_db/models/requirement/requirement.py +767 -0
  488. endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
  489. endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
  490. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
  491. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
  492. endoreg_db/models/requirement/requirement_operator.py +176 -0
  493. endoreg_db/models/requirement/requirement_set.py +287 -0
  494. endoreg_db/models/rule/__init__.py +13 -0
  495. endoreg_db/models/rule/rule.py +27 -0
  496. endoreg_db/models/rule/rule_applicator.py +224 -0
  497. endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
  498. endoreg_db/models/rule/rule_type.py +20 -0
  499. endoreg_db/models/rule/ruleset.py +17 -0
  500. endoreg_db/models/state/__init__.py +12 -0
  501. endoreg_db/models/state/abstract.py +11 -0
  502. endoreg_db/models/state/audit_ledger.py +150 -0
  503. endoreg_db/models/state/label_video_segment.py +22 -0
  504. endoreg_db/models/state/raw_pdf.py +187 -0
  505. endoreg_db/models/state/sensitive_meta.py +46 -0
  506. endoreg_db/models/state/video.py +232 -0
  507. endoreg_db/models/upload_job.py +99 -0
  508. endoreg_db/models/utils.py +135 -0
  509. endoreg_db/queries/__init__.py +5 -0
  510. endoreg_db/queries/annotations/__init__.py +3 -0
  511. endoreg_db/queries/annotations/legacy.py +158 -0
  512. endoreg_db/queries/sanity/__init_.py +0 -0
  513. endoreg_db/renames.yml +8 -0
  514. endoreg_db/root_urls.py +9 -0
  515. endoreg_db/schemas/__init__.py +0 -0
  516. endoreg_db/schemas/examination_evaluation.py +27 -0
  517. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
  518. endoreg_db/serializers/__init__.py +118 -0
  519. endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
  520. endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
  521. endoreg_db/serializers/_old/video.py +71 -0
  522. endoreg_db/serializers/administration/__init__.py +14 -0
  523. endoreg_db/serializers/administration/ai/__init__.py +10 -0
  524. endoreg_db/serializers/administration/ai/active_model.py +10 -0
  525. endoreg_db/serializers/administration/ai/ai_model.py +18 -0
  526. endoreg_db/serializers/administration/ai/model_type.py +10 -0
  527. endoreg_db/serializers/administration/center.py +9 -0
  528. endoreg_db/serializers/administration/gender.py +9 -0
  529. endoreg_db/serializers/anonymization.py +69 -0
  530. endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
  531. endoreg_db/serializers/examination/__init__.py +10 -0
  532. endoreg_db/serializers/examination/base.py +46 -0
  533. endoreg_db/serializers/examination/dropdown.py +21 -0
  534. endoreg_db/serializers/examination_serializer.py +12 -0
  535. endoreg_db/serializers/finding/__init__.py +5 -0
  536. endoreg_db/serializers/finding/finding.py +54 -0
  537. endoreg_db/serializers/finding_classification/__init__.py +7 -0
  538. endoreg_db/serializers/finding_classification/choice.py +19 -0
  539. endoreg_db/serializers/finding_classification/classification.py +13 -0
  540. endoreg_db/serializers/label/__init__.py +7 -0
  541. endoreg_db/serializers/label/image_classification_annotation.py +62 -0
  542. endoreg_db/serializers/label/label.py +15 -0
  543. endoreg_db/serializers/label_video_segment/__init__.py +7 -0
  544. endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
  545. endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
  546. endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
  547. endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
  548. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
  549. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
  550. endoreg_db/serializers/meta/__init__.py +19 -0
  551. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
  552. endoreg_db/serializers/meta/report_meta.py +53 -0
  553. endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
  554. endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
  555. endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
  556. endoreg_db/serializers/meta/video_meta.py +39 -0
  557. endoreg_db/serializers/misc/__init__.py +14 -0
  558. endoreg_db/serializers/misc/file_overview.py +182 -0
  559. endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
  560. endoreg_db/serializers/misc/stats.py +33 -0
  561. endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
  562. endoreg_db/serializers/misc/upload_job.py +71 -0
  563. endoreg_db/serializers/patient/__init__.py +11 -0
  564. endoreg_db/serializers/patient/patient.py +86 -0
  565. endoreg_db/serializers/patient/patient_dropdown.py +27 -0
  566. endoreg_db/serializers/patient_examination/__init__.py +7 -0
  567. endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
  568. endoreg_db/serializers/patient_finding/__init__.py +15 -0
  569. endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
  570. endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
  571. endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
  572. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
  573. endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
  574. endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
  575. endoreg_db/serializers/pdf/__init__.py +5 -0
  576. endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
  577. endoreg_db/serializers/report/__init__.py +9 -0
  578. endoreg_db/serializers/report/mixins.py +45 -0
  579. endoreg_db/serializers/report/report.py +105 -0
  580. endoreg_db/serializers/report/report_list.py +22 -0
  581. endoreg_db/serializers/report/secure_file_url.py +26 -0
  582. endoreg_db/serializers/requirements/requirement_schema.py +25 -0
  583. endoreg_db/serializers/requirements/requirement_sets.py +29 -0
  584. endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
  585. endoreg_db/serializers/video/__init__.py +7 -0
  586. endoreg_db/serializers/video/segmentation.py +263 -0
  587. endoreg_db/serializers/video/video_file_brief.py +10 -0
  588. endoreg_db/serializers/video/video_file_detail.py +83 -0
  589. endoreg_db/serializers/video/video_file_list.py +67 -0
  590. endoreg_db/serializers/video/video_metadata.py +105 -0
  591. endoreg_db/serializers/video/video_processing_history.py +153 -0
  592. endoreg_db/serializers/video_examination.py +198 -0
  593. endoreg_db/services/__init__.py +5 -0
  594. endoreg_db/services/anonymization.py +223 -0
  595. endoreg_db/services/examination_evaluation.py +149 -0
  596. endoreg_db/services/finding_description_service.py +0 -0
  597. endoreg_db/services/lookup_service.py +411 -0
  598. endoreg_db/services/lookup_store.py +266 -0
  599. endoreg_db/services/pdf_import.py +1382 -0
  600. endoreg_db/services/polling_coordinator.py +288 -0
  601. endoreg_db/services/pseudonym_service.py +89 -0
  602. endoreg_db/services/requirements_object.py +147 -0
  603. endoreg_db/services/segment_sync.py +155 -0
  604. endoreg_db/services/storage_aware_video_processor.py +344 -0
  605. endoreg_db/services/video_import.py +1259 -0
  606. endoreg_db/tasks/upload_tasks.py +207 -0
  607. endoreg_db/tasks/video_ingest.py +157 -0
  608. endoreg_db/tasks/video_processing_tasks.py +327 -0
  609. endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
  610. endoreg_db/templates/admin/start_examination.html +12 -0
  611. endoreg_db/templates/timeline.html +176 -0
  612. endoreg_db/urls/__init__.py +83 -0
  613. endoreg_db/urls/anonymization.py +32 -0
  614. endoreg_db/urls/auth.py +16 -0
  615. endoreg_db/urls/classification.py +39 -0
  616. endoreg_db/urls/examination.py +54 -0
  617. endoreg_db/urls/files.py +6 -0
  618. endoreg_db/urls/label_video_segment_validate.py +33 -0
  619. endoreg_db/urls/label_video_segments.py +46 -0
  620. endoreg_db/urls/media.py +227 -0
  621. endoreg_db/urls/patient.py +19 -0
  622. endoreg_db/urls/report.py +48 -0
  623. endoreg_db/urls/requirements.py +13 -0
  624. endoreg_db/urls/sensitive_meta.py +0 -0
  625. endoreg_db/urls/stats.py +46 -0
  626. endoreg_db/urls/upload.py +20 -0
  627. endoreg_db/urls/video.py +61 -0
  628. endoreg_db/urls.py +9 -0
  629. endoreg_db/utils/__init__.py +88 -0
  630. endoreg_db/utils/ai/__init__.py +9 -0
  631. endoreg_db/utils/ai/get.py +5 -0
  632. endoreg_db/utils/ai/inference_dataset.py +52 -0
  633. endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
  634. endoreg_db/utils/ai/postprocess.py +63 -0
  635. endoreg_db/utils/ai/predict.py +291 -0
  636. endoreg_db/utils/ai/preprocess.py +68 -0
  637. endoreg_db/utils/calc_duration_seconds.py +24 -0
  638. endoreg_db/utils/case_generator/__init__.py +0 -0
  639. endoreg_db/utils/case_generator/case_generator.py +159 -0
  640. endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
  641. endoreg_db/utils/case_generator/utils.py +30 -0
  642. endoreg_db/utils/check_video_files.py +148 -0
  643. endoreg_db/utils/cropping.py +29 -0
  644. endoreg_db/utils/dataloader.py +175 -0
  645. endoreg_db/utils/dates.py +60 -0
  646. endoreg_db/utils/env.py +33 -0
  647. endoreg_db/utils/extract_specific_frames.py +72 -0
  648. endoreg_db/utils/file_operations.py +58 -0
  649. endoreg_db/utils/fix_video_path_direct.py +141 -0
  650. endoreg_db/utils/frame_anonymization_utils.py +463 -0
  651. endoreg_db/utils/hashs.py +153 -0
  652. endoreg_db/utils/links/__init__.py +0 -0
  653. endoreg_db/utils/links/requirement_link.py +193 -0
  654. endoreg_db/utils/mime_types.py +0 -0
  655. endoreg_db/utils/names.py +76 -0
  656. endoreg_db/utils/ocr.py +190 -0
  657. endoreg_db/utils/parse_and_generate_yaml.py +46 -0
  658. endoreg_db/utils/paths.py +95 -0
  659. endoreg_db/utils/permissions.py +143 -0
  660. endoreg_db/utils/pipelines/Readme.md +235 -0
  661. endoreg_db/utils/pipelines/__init__.py +0 -0
  662. endoreg_db/utils/pipelines/process_video_dir.py +120 -0
  663. endoreg_db/utils/product/__init__.py +0 -0
  664. endoreg_db/utils/product/sum_emissions.py +20 -0
  665. endoreg_db/utils/product/sum_weights.py +18 -0
  666. endoreg_db/utils/pydantic_models/__init__.py +6 -0
  667. endoreg_db/utils/pydantic_models/db_config.py +57 -0
  668. endoreg_db/utils/requirement_helpers.py +0 -0
  669. endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
  670. endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
  671. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
  672. endoreg_db/utils/setup_config.py +177 -0
  673. endoreg_db/utils/translation.py +27 -0
  674. endoreg_db/utils/uuid.py +4 -0
  675. endoreg_db/utils/validate_endo_roi.py +19 -0
  676. endoreg_db/utils/validate_subcategory_dict.py +91 -0
  677. endoreg_db/utils/validate_video_detailed.py +357 -0
  678. endoreg_db/utils/video/__init__.py +26 -0
  679. endoreg_db/utils/video/extract_frames.py +88 -0
  680. endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
  681. endoreg_db/utils/video/names.py +42 -0
  682. endoreg_db/utils/video/streaming_processor.py +312 -0
  683. endoreg_db/utils/video/video_splitter.py +94 -0
  684. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
  685. endoreg_db/views/__init__.py +274 -0
  686. endoreg_db/views/anonymization/__init__.py +27 -0
  687. endoreg_db/views/anonymization/media_management.py +454 -0
  688. endoreg_db/views/anonymization/overview.py +216 -0
  689. endoreg_db/views/anonymization/validate.py +107 -0
  690. endoreg_db/views/auth/__init__.py +13 -0
  691. endoreg_db/views/auth/keycloak.py +113 -0
  692. endoreg_db/views/examination/__init__.py +33 -0
  693. endoreg_db/views/examination/examination.py +37 -0
  694. endoreg_db/views/examination/examination_manifest_cache.py +26 -0
  695. endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
  696. endoreg_db/views/examination/get_finding_classifications.py +36 -0
  697. endoreg_db/views/examination/get_findings.py +41 -0
  698. endoreg_db/views/examination/get_instruments.py +18 -0
  699. endoreg_db/views/examination/get_interventions.py +14 -0
  700. endoreg_db/views/finding/__init__.py +9 -0
  701. endoreg_db/views/finding/finding.py +112 -0
  702. endoreg_db/views/finding/get_classifications.py +14 -0
  703. endoreg_db/views/finding/get_interventions.py +17 -0
  704. endoreg_db/views/finding_classification/__init__.py +13 -0
  705. endoreg_db/views/finding_classification/base.py +0 -0
  706. endoreg_db/views/finding_classification/finding_classification.py +42 -0
  707. endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
  708. endoreg_db/views/label/__init__.py +5 -0
  709. endoreg_db/views/label/label.py +15 -0
  710. endoreg_db/views/label_video_segment/__init__.py +16 -0
  711. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
  712. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
  713. endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
  714. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
  715. endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
  716. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
  717. endoreg_db/views/label_video_segment/validate.py +226 -0
  718. endoreg_db/views/media/__init__.py +45 -0
  719. endoreg_db/views/media/pdf_media.py +388 -0
  720. endoreg_db/views/media/segments.py +71 -0
  721. endoreg_db/views/media/sensitive_metadata.py +314 -0
  722. endoreg_db/views/media/video_media.py +272 -0
  723. endoreg_db/views/media/video_segments.py +524 -0
  724. endoreg_db/views/meta/__init__.py +15 -0
  725. endoreg_db/views/meta/available_files_list.py +146 -0
  726. endoreg_db/views/meta/report_meta.py +53 -0
  727. endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
  728. endoreg_db/views/meta/sensitive_meta_list.py +104 -0
  729. endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
  730. endoreg_db/views/misc/__init__.py +63 -0
  731. endoreg_db/views/misc/center.py +13 -0
  732. endoreg_db/views/misc/csrf.py +7 -0
  733. endoreg_db/views/misc/gender.py +14 -0
  734. endoreg_db/views/misc/secure_file_serving_view.py +80 -0
  735. endoreg_db/views/misc/secure_file_url_view.py +84 -0
  736. endoreg_db/views/misc/secure_url_validate.py +79 -0
  737. endoreg_db/views/misc/stats.py +220 -0
  738. endoreg_db/views/misc/translation.py +182 -0
  739. endoreg_db/views/misc/upload_views.py +240 -0
  740. endoreg_db/views/patient/__init__.py +5 -0
  741. endoreg_db/views/patient/patient.py +210 -0
  742. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
  743. endoreg_db/views/patient_examination/__init__.py +11 -0
  744. endoreg_db/views/patient_examination/patient_examination.py +140 -0
  745. endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
  746. endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
  747. endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
  748. endoreg_db/views/patient_examination/video.py +194 -0
  749. endoreg_db/views/patient_finding/__init__.py +7 -0
  750. endoreg_db/views/patient_finding/base.py +0 -0
  751. endoreg_db/views/patient_finding/patient_finding.py +64 -0
  752. endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
  753. endoreg_db/views/patient_finding_classification/__init__.py +5 -0
  754. endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
  755. endoreg_db/views/patient_finding_location/__init__.py +5 -0
  756. endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
  757. endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
  758. endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
  759. endoreg_db/views/pdf/__init__.py +8 -0
  760. endoreg_db/views/pdf/pdf_stream.py +186 -0
  761. endoreg_db/views/pdf/reimport.py +177 -0
  762. endoreg_db/views/report/__init__.py +9 -0
  763. endoreg_db/views/report/report_list.py +112 -0
  764. endoreg_db/views/report/report_with_secure_url.py +28 -0
  765. endoreg_db/views/report/start_examination.py +7 -0
  766. endoreg_db/views/requirement/__init__.py +10 -0
  767. endoreg_db/views/requirement/evaluate.py +279 -0
  768. endoreg_db/views/requirement/lookup.py +367 -0
  769. endoreg_db/views/requirement/lookup_store.py +252 -0
  770. endoreg_db/views/requirement_lookup/lookup.py +0 -0
  771. endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
  772. endoreg_db/views/stats/__init__.py +13 -0
  773. endoreg_db/views/stats/stats_views.py +229 -0
  774. endoreg_db/views/video/__init__.py +59 -0
  775. endoreg_db/views/video/correction.py +530 -0
  776. endoreg_db/views/video/reimport.py +195 -0
  777. endoreg_db/views/video/segmentation.py +274 -0
  778. endoreg_db/views/video/task_status.py +49 -0
  779. endoreg_db/views/video/timeline.py +46 -0
  780. endoreg_db/views/video/video_analyze.py +52 -0
  781. endoreg_db/views/video/video_apply_mask.py +48 -0
  782. endoreg_db/views/video/video_correction.py +21 -0
  783. endoreg_db/views/video/video_download_processed.py +58 -0
  784. endoreg_db/views/video/video_examination_viewset.py +242 -0
  785. endoreg_db/views/video/video_meta.py +29 -0
  786. endoreg_db/views/video/video_processing_history.py +24 -0
  787. endoreg_db/views/video/video_remove_frames.py +48 -0
  788. endoreg_db/views/video/video_stream.py +306 -0
  789. endoreg_db/views.py +0 -0
  790. endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
  791. endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
  792. endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
  793. endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
@@ -0,0 +1,69 @@
1
+ """
2
+ Serializers für Anonymisierungs-Validierung mit deutschem Datumsformat.
3
+
4
+ Unterstützt DD.MM.YYYY als Primärformat und YYYY-MM-DD als Fallback.
5
+ """
6
+
7
+ from rest_framework import serializers
8
+ from endoreg_db.models.metadata.sensitive_meta_logic import parse_any_date
9
+
10
+
11
+ class SensitiveMetaValidateSerializer(serializers.Serializer):
12
+ """
13
+ Serializer für SensitiveMeta-Validierung mit deutscher Datums-Priorität.
14
+
15
+ Akzeptiert Datumsfelder in folgenden Formaten:
16
+ 1. DD.MM.YYYY (bevorzugt) - deutsches Format
17
+ 2. YYYY-MM-DD (Fallback) - ISO-Format
18
+
19
+ Alle Datumsfelder werden in date-Objekte konvertiert.
20
+ """
21
+
22
+ patient_first_name = serializers.CharField(required=False, allow_blank=True)
23
+ patient_last_name = serializers.CharField(required=False, allow_blank=True)
24
+ patient_dob = serializers.CharField(required=False, allow_blank=True)
25
+ examination_date = serializers.CharField(required=False, allow_blank=True)
26
+ casenumber = serializers.CharField(required=False, allow_blank=True)
27
+ anonymized_text = serializers.CharField(required=False, allow_blank=True)
28
+ patient_gender = serializers.CharField(required=False, allow_blank=True)
29
+ center_name = serializers.CharField(required=False, allow_blank=True)
30
+ is_verified = serializers.BooleanField(required=False, default=True)
31
+ file_type = serializers.ChoiceField(
32
+ choices=['video', 'pdf'], required=False
33
+ ) # Optional: "video" oder "pdf"
34
+
35
+ def validate_patient_dob(self, value):
36
+ """
37
+ Validiert patient_dob mit deutscher Format-Priorität.
38
+
39
+ Akzeptierte Formate:
40
+ - DD.MM.YYYY (z.B. "21.03.1994")
41
+ - YYYY-MM-DD (z.B. "1994-03-21")
42
+ """
43
+ if not value:
44
+ return None
45
+
46
+ parsed_date = parse_any_date(value)
47
+ if not parsed_date:
48
+ raise serializers.ValidationError(
49
+ "Ungültiges Datum. Erlaubte Formate: DD.MM.YYYY oder YYYY-MM-DD."
50
+ )
51
+ return parsed_date
52
+
53
+ def validate_examination_date(self, value):
54
+ """
55
+ Validiert examination_date mit deutscher Format-Priorität.
56
+
57
+ Akzeptierte Formate:
58
+ - DD.MM.YYYY (z.B. "15.02.2024")
59
+ - YYYY-MM-DD (z.B. "2024-02-15")
60
+ """
61
+ if not value:
62
+ return None
63
+
64
+ parsed_date = parse_any_date(value)
65
+ if not parsed_date:
66
+ raise serializers.ValidationError(
67
+ "Ungültiges Datum. Erlaubte Formate: DD.MM.YYYY oder YYYY-MM-DD."
68
+ )
69
+ return parsed_date
@@ -0,0 +1 @@
1
+ from endoreg_db.models import ExaminationEvaluation
@@ -0,0 +1,10 @@
1
+ from .base import ExaminationSerializer, ExaminationTypeSerializer
2
+ from .dropdown import (
3
+ ExaminationDropdownSerializer,
4
+ )
5
+
6
+ __all__ = [
7
+ "ExaminationSerializer",
8
+ "ExaminationTypeSerializer",
9
+ "ExaminationDropdownSerializer",
10
+ ]
@@ -0,0 +1,46 @@
1
+ # eendoreg_db/serializers/examination/base.py
2
+ from rest_framework import serializers
3
+ from ...models import Examination, ExaminationType
4
+
5
+
6
+ class ExaminationTypeSerializer(serializers.ModelSerializer):
7
+ class Meta:
8
+ model = ExaminationType
9
+ fields = ['id', 'name']
10
+ class ExaminationSerializer(serializers.ModelSerializer):
11
+
12
+
13
+ findings = serializers.SerializerMethodField()
14
+ examination_types = serializers.SerializerMethodField()
15
+ class Meta:
16
+ model = Examination
17
+ fields = [
18
+ 'id', 'name','findings', 'examination_types'
19
+ ]
20
+
21
+
22
+ def get_findings(self, obj:Examination):
23
+ """
24
+ Return a list of serialized findings associated with the given examination.
25
+
26
+ Parameters:
27
+ obj (Examination): The examination instance for which to retrieve findings.
28
+
29
+ Returns:
30
+ list: Serialized data for all findings available to the examination.
31
+ """
32
+ from ..finding import FindingSerializer
33
+ findings = obj.get_available_findings()
34
+ return FindingSerializer(findings, many=True).data
35
+
36
+ def get_examination_types(self, obj:Examination):
37
+ """
38
+ Return a list of serialized examination types associated with the given examination.
39
+
40
+ Parameters:
41
+ obj (Examination): The examination instance for which to retrieve examination types.
42
+
43
+ Returns:
44
+ list: Serialized data for each related examination type.
45
+ """
46
+ return ExaminationTypeSerializer(obj.examination_types.all(), many=True).data
@@ -0,0 +1,21 @@
1
+ from endoreg_db.models import Examination
2
+
3
+
4
+ from rest_framework import serializers
5
+
6
+
7
+ class ExaminationDropdownSerializer(serializers.ModelSerializer):
8
+ """Serializer für Examination-Dropdown"""
9
+ display_name = serializers.SerializerMethodField()
10
+
11
+ class Meta:
12
+ model = Examination
13
+ fields = ['id', 'name', 'display_name']
14
+
15
+ def get_display_name(self, obj):
16
+
17
+ """
18
+ Return a user-friendly (localized) display name for the examination.
19
+ Prefers a German translation (`name_de`) when available; otherwise falls back to `name`. """
20
+ return getattr(obj, "name_de", None) or obj.name
21
+
@@ -0,0 +1,12 @@
1
+ # endoreg_db/serializers.py
2
+ from rest_framework import serializers
3
+ from ..models import Examination
4
+
5
+
6
+
7
+ class ExaminationSerializer(serializers.ModelSerializer):
8
+ class Meta:
9
+ model = Examination
10
+ fields = ['id', 'name'] # Add other fields as needed
11
+
12
+
@@ -0,0 +1,5 @@
1
+ from .finding import FindingSerializer
2
+
3
+ __all__ = [
4
+ 'FindingSerializer',
5
+ ]
@@ -0,0 +1,54 @@
1
+ from rest_framework import serializers
2
+ from ..finding_classification import (
3
+ FindingClassificationSerializer,
4
+ # FindingClassificationChoiceSerializer,
5
+ )
6
+ from endoreg_db.models import Finding
7
+
8
+ class FindingSerializer(serializers.ModelSerializer):
9
+
10
+ location_classifications = serializers.SerializerMethodField()
11
+ morphology_classifications = serializers.SerializerMethodField()
12
+ classifications = serializers.SerializerMethodField()
13
+
14
+ class Meta:
15
+ model = Finding
16
+ fields = [
17
+ 'id', 'name', 'description', "classifications", 'location_classifications', 'morphology_classifications',
18
+ ]
19
+
20
+ def get_location_classifications(self, obj):
21
+ """
22
+ Retrieve and serialize all 'location' classifications associated with the given Finding instance.
23
+
24
+ Returns:
25
+ list: Serialized data for each related classification of type 'location'.
26
+ """
27
+ classifications = obj.finding_classifications.filter(
28
+ classification_types__name__iexact="location"
29
+ )
30
+ return FindingClassificationSerializer(classifications, many=True).data
31
+
32
+ def get_morphology_classifications(self, obj):
33
+ """
34
+ Return serialized morphology classifications associated with the given finding.
35
+
36
+ Parameters:
37
+ obj: The Finding instance whose morphology classifications are retrieved.
38
+
39
+ Returns:
40
+ list: Serialized data for all related morphology classifications.
41
+ """
42
+ classifications = obj.finding_classifications.filter(
43
+ classification_types__name__iexact="morphology"
44
+ )
45
+ return FindingClassificationSerializer(classifications, many=True).data
46
+
47
+ def get_classifications(self, obj):
48
+ """
49
+ Retrieve all classifications related to the given finding.
50
+
51
+ Returns:
52
+ list: Serialized representations of all classifications associated with the finding.
53
+ """
54
+ return FindingClassificationSerializer(obj.finding_classifications.all(), many=True).data
@@ -0,0 +1,7 @@
1
+ from .choice import FindingClassificationChoiceSerializer
2
+ from .classification import FindingClassificationSerializer
3
+
4
+ __all__ = [
5
+ 'FindingClassificationChoiceSerializer',
6
+ 'FindingClassificationSerializer',
7
+ ]
@@ -0,0 +1,19 @@
1
+ from endoreg_db.models import FindingClassificationChoice
2
+ from rest_framework import serializers
3
+
4
+ class FindingClassificationChoiceSerializer(serializers.ModelSerializer):
5
+ """
6
+ Serializer for the FindingClassificationChoice model.
7
+
8
+ Serializes the following fields:
9
+ - id: Unique identifier of the classification choice.
10
+ - name: Name of the classification choice.
11
+ - description: Description of the classification choice.
12
+ - subcategories: Related subcategories for further classification.
13
+ - numerical_descriptors: Associated numerical descriptors for the classification choice.
14
+ """
15
+ class Meta:
16
+ model = FindingClassificationChoice
17
+ fields = [
18
+ 'id', 'name', 'description', 'subcategories', 'numerical_descriptors'
19
+ ]
@@ -0,0 +1,13 @@
1
+ from .choice import FindingClassificationChoiceSerializer
2
+ from endoreg_db.models import FindingClassification
3
+ from rest_framework import serializers
4
+
5
+ class FindingClassificationSerializer(serializers.ModelSerializer):
6
+ choices = FindingClassificationChoiceSerializer(many=True, read_only=True)
7
+
8
+ class Meta:
9
+ model = FindingClassification
10
+ fields = [
11
+ 'id', 'name', 'description', 'choices', 'classification_types'
12
+ ]
13
+
@@ -0,0 +1,7 @@
1
+ from .label import LabelSerializer
2
+ from .image_classification_annotation import ImageClassificationAnnotationSerializer
3
+
4
+ __all__ = [
5
+ 'LabelSerializer',
6
+ 'ImageClassificationAnnotationSerializer',
7
+ ]
@@ -0,0 +1,62 @@
1
+ from typing import Optional
2
+ from rest_framework import serializers
3
+
4
+
5
+ from endoreg_db.models import ImageClassificationAnnotation
6
+
7
+
8
+ class ImageClassificationAnnotationSerializer(serializers.ModelSerializer):
9
+ """
10
+ Serializer for ImageClassificationAnnotation model.
11
+ This serializer is used to represent image classification annotations in the API.
12
+ """
13
+
14
+ label_name = serializers.SerializerMethodField()
15
+ confidence = serializers.SerializerMethodField()
16
+ frame_number = serializers.IntegerField(source='frame.frame_number', read_only=True)
17
+
18
+ class Meta:
19
+ model = ImageClassificationAnnotation
20
+ fields = [
21
+ "id",
22
+ "label",
23
+ "confidence",
24
+ "frame_number",
25
+ "information_source",
26
+ "date_created",
27
+ "date_modified",
28
+ "label_name",
29
+ ]
30
+
31
+ def get_confidence(self, obj: ImageClassificationAnnotation) -> Optional[float]:
32
+ """
33
+ Retrieve the confidence score associated with the annotation.
34
+
35
+ Returns:
36
+ The float value representing the annotation's confidence, or None if not set.
37
+ """
38
+ if obj.float_value is not None:
39
+ return obj.float_value
40
+ return None
41
+
42
+ def get_label_name(self, obj: ImageClassificationAnnotation) -> str:
43
+ """
44
+ Returns the name of the label associated with the annotation, or "No Label" if no label is set.
45
+ """
46
+ return obj.label.name if obj.label else "No Label"
47
+
48
+ def to_representation(self, instance: ImageClassificationAnnotation) -> dict:
49
+ """
50
+ Return the serialized representation of an ImageClassificationAnnotation instance.
51
+
52
+ Overrides the default method to allow for future customization of the serialized output, but currently returns the standard representation unchanged.
53
+
54
+ Parameters:
55
+ instance (ImageClassificationAnnotation): The annotation instance to serialize.
56
+
57
+ Returns:
58
+ dict: The serialized data for the annotation.
59
+ """
60
+ representation = super().to_representation(instance)
61
+ # Add any additional fields or transformations here if needed
62
+ return representation
@@ -0,0 +1,15 @@
1
+ from endoreg_db.models import Label
2
+
3
+
4
+ from rest_framework import serializers
5
+
6
+
7
+ class LabelSerializer(serializers.ModelSerializer):
8
+ """
9
+ Serializer for fetching labels from the `endoreg_db_label` table.
10
+ Includes `id` (for backend processing) and `name` (for dropdown display in Vue.js).
11
+ """
12
+
13
+ class Meta:
14
+ model = Label
15
+ fields = ["id", "name"]
@@ -0,0 +1,7 @@
1
+ from .label_video_segment import LabelVideoSegmentSerializer
2
+ from .label_video_segment_annotation import LabelVideoSegmentAnnotationSerializer
3
+
4
+ __all__ = [
5
+ "LabelVideoSegmentSerializer",
6
+ "LabelVideoSegmentAnnotationSerializer"
7
+ ]
@@ -0,0 +1,149 @@
1
+ from typing import TYPE_CHECKING
2
+ from django.core.exceptions import ObjectDoesNotExist
3
+ from rest_framework import serializers
4
+ from endoreg_db.models import (
5
+ Label,
6
+ VideoFile,
7
+ LabelVideoSegment,
8
+ InformationSource
9
+ )
10
+
11
+ import logging
12
+ logger = logging.getLogger(__name__)
13
+
14
+ if TYPE_CHECKING:
15
+ from endoreg_db.serializers import LabelVideoSegmentSerializer
16
+
17
+ def _get_video_file(self, video_id):
18
+ """
19
+ Retrieve a VideoFile instance by its ID.
20
+
21
+ Raises a serializers.ValidationError if the VideoFile does not exist.
22
+ """
23
+ try:
24
+ return VideoFile.objects.get(id=video_id)
25
+ except ObjectDoesNotExist as exc:
26
+ raise serializers.ValidationError(f"VideoFile with id {video_id} does not exist") from exc
27
+
28
+ def _get_label(self, label_id, label_name):
29
+ """
30
+ Retrieve a Label instance by ID or name, creating it if necessary.
31
+
32
+ Raises a ValidationError if the label cannot be found, created, or if neither identifier is provided.
33
+ """
34
+ if label_id:
35
+ try:
36
+ return Label.objects.get(id=label_id)
37
+ except ObjectDoesNotExist as exc:
38
+ raise serializers.ValidationError(f"Label with id {label_id} does not exist") from exc
39
+ elif label_name:
40
+ label, _ = Label.get_or_create_from_name(label_name)
41
+ if not label:
42
+ raise serializers.ValidationError(f"Failed to create or retrieve label with name {label_name}")
43
+ return label
44
+ else:
45
+ raise serializers.ValidationError("Either label_id or label_name must be provided")
46
+
47
+ def _validate_fps(self, video_file):
48
+ """
49
+ Validate and return the frames per second (FPS) value from a video file.
50
+
51
+ Raises a validation error if the FPS is missing, not a positive number, or cannot be converted to a float.
52
+
53
+ Returns:
54
+ float: The validated FPS value.
55
+ """
56
+ fps_raw = video_file.get_fps()
57
+ if fps_raw is None:
58
+ raise serializers.ValidationError("Video file must have a defined FPS")
59
+ try:
60
+ fps = float(fps_raw)
61
+ if fps <= 0:
62
+ raise ValueError("FPS must be a positive number")
63
+ except (ValueError, TypeError):
64
+ raise serializers.ValidationError("Invalid FPS format in video file")
65
+ return fps
66
+
67
+ def _calculate_frame_numbers(self, validated_data, fps):
68
+ """
69
+ Convert start and end times in the input data to corresponding frame numbers using the provided FPS value.
70
+
71
+ Parameters:
72
+ validated_data (dict): Input data containing 'start_time' and 'end_time' keys.
73
+ fps (float): Frames per second of the video.
74
+
75
+ Returns:
76
+ dict: The input data dictionary updated with 'start_frame_number' and 'end_frame_number' keys.
77
+
78
+ Raises:
79
+ serializers.ValidationError: If frame numbers cannot be determined from the provided data.
80
+ """
81
+ if validated_data.get('start_time') is not None:
82
+ validated_data['start_frame_number'] = int(float(validated_data['start_time']) * fps)
83
+ if validated_data.get('end_time') is not None:
84
+ validated_data['end_frame_number'] = int(float(validated_data['end_time']) * fps)
85
+ if 'start_frame_number' not in validated_data or 'end_frame_number' not in validated_data:
86
+ raise serializers.ValidationError("Could not determine frame numbers from provided data")
87
+ return validated_data
88
+
89
+ def _get_information_source(self):
90
+ """
91
+ Retrieve or create the information source for manual annotation.
92
+
93
+ Returns:
94
+ InformationSource: The source object representing manual annotation.
95
+ """
96
+ source, _ = InformationSource.objects.get_or_create(
97
+ name='Manual Annotation',
98
+ defaults={
99
+ 'description': 'Manually created label segments via web interface',
100
+ }
101
+ )
102
+ return source
103
+
104
+ def _create(self:"LabelVideoSegmentSerializer", validated_data):
105
+ """
106
+ Create and persist a new LabelVideoSegment instance from validated input data.
107
+
108
+ This method extracts relevant fields from the input, retrieves or creates related objects (video file, label, information source), validates video FPS, calculates frame numbers from time values, and creates a new LabelVideoSegment. Raises a validation error if required data is missing or invalid, or if creation fails.
109
+
110
+ Returns:
111
+ LabelVideoSegment: The newly created and saved segment instance.
112
+ """
113
+ try:
114
+ # Extract convenience fields
115
+ video_id = validated_data.pop('video_id')
116
+ label_id = validated_data.pop('label_id', None)
117
+ label_name = validated_data.pop('label_name', None)
118
+ start_time = validated_data.pop('start_time', None)
119
+ end_time = validated_data.pop('end_time', None)
120
+
121
+ video_file = self.get_video_file(video_id)
122
+ label = self.get_label(label_id, label_name)
123
+ fps = self.validate_fps(video_file)
124
+ validated_data['start_time'] = start_time
125
+ validated_data['end_time'] = end_time
126
+ validated_data = self.calculate_frame_numbers(validated_data, fps)
127
+ source = self.get_information_source()
128
+
129
+ # Create the segment directly
130
+ segment = LabelVideoSegment.safe_create(
131
+ video_file=video_file,
132
+ label=label,
133
+ source=source,
134
+ start_frame_number=validated_data['start_frame_number'],
135
+ end_frame_number=validated_data['end_frame_number'],
136
+ prediction_meta=None # No prediction meta for manual annotations
137
+ )
138
+ segment.save()
139
+
140
+ logger.info("Created new video segment: %s for video %s with label %s",
141
+ segment.pk, video_id, label.name if label else 'None')
142
+ return segment
143
+
144
+ except serializers.ValidationError as e:
145
+ logger.error("Validation error while creating video segment: %s", str(e))
146
+ raise
147
+ except Exception as e:
148
+ logger.error("Unexpected error while creating video segment: %s", str(e))
149
+ raise serializers.ValidationError(f"Failed to create segment: {str(e)}")
@@ -0,0 +1,138 @@
1
+ from typing import TYPE_CHECKING, Dict, Any, Optional
2
+ from django.core.exceptions import ObjectDoesNotExist
3
+ from rest_framework import serializers
4
+ from endoreg_db.models import (
5
+ Label,
6
+ VideoFile,
7
+ LabelVideoSegment
8
+ )
9
+
10
+ import logging
11
+ logger = logging.getLogger(__name__)
12
+
13
+ if TYPE_CHECKING:
14
+ from endoreg_db.serializers import LabelVideoSegmentSerializer
15
+
16
+
17
+ def _validate_fps(video: "VideoFile"):
18
+ """Raises a ValidationError if the video's FPS is invalid."""
19
+ fps = video.get_fps()
20
+ if not fps or fps <= 0:
21
+ raise serializers.ValidationError("The video must have a valid FPS to convert times to frames.")
22
+ return fps
23
+
24
+ def _convert_time_to_frame(time_value: float, fps: float) -> int:
25
+ """Converts a time value in seconds to a frame number."""
26
+ return int(time_value * fps)
27
+
28
+ def _update_frames_from_data(instance: "LabelVideoSegment", validated_data: Dict[str, Any], fps: Optional[float]):
29
+ """Updates start and end frames from either time or frame data."""
30
+ if 'start_time' in validated_data:
31
+ if fps is None:
32
+ fps = _validate_fps(instance.video)
33
+ instance.start_frame_number = _convert_time_to_frame(validated_data['start_time'], fps)
34
+ elif 'start_frame' in validated_data:
35
+ instance.start_frame_number = validated_data['start_frame']
36
+
37
+ if 'end_time' in validated_data:
38
+ if fps is None:
39
+ fps = _validate_fps(instance.video)
40
+ instance.end_frame_number = _convert_time_to_frame(validated_data['end_time'], fps)
41
+ elif 'end_frame' in validated_data:
42
+ instance.end_frame_number = validated_data['end_frame']
43
+
44
+ def _update(instance: "LabelVideoSegment", validated_data: Dict[str, Any]) -> "LabelVideoSegment":
45
+ """
46
+ Handles the update logic for a LabelVideoSegment instance.
47
+ This function is designed to be used within a serializer's update method.
48
+ """
49
+ video: Optional["VideoFile"] = validated_data.get('video')
50
+ fps = None
51
+
52
+ if video and video != instance.video:
53
+ instance.video = video
54
+ fps = _validate_fps(video) # Validate FPS for the new video
55
+
56
+ if 'label' in validated_data:
57
+ instance.label = validated_data['label']
58
+
59
+ _update_frames_from_data(instance, validated_data, fps)
60
+
61
+ # Final validation of frame numbers
62
+ if instance.start_frame_number >= instance.end_frame_number:
63
+ raise serializers.ValidationError("start_frame must be less than end_frame.")
64
+
65
+ if instance.video and instance.end_frame_number > instance.video.frame_count:
66
+ raise serializers.ValidationError("end_frame cannot exceed the total frames of the video.")
67
+
68
+ instance.save()
69
+ return instance
70
+
71
+ def _update(self:"LabelVideoSegmentSerializer", instance, validated_data):
72
+ """
73
+ Update a LabelVideoSegment instance with new validated data.
74
+
75
+ This method updates the associated video file, label (by ID or name), and segment boundaries (start and end times converted to frame numbers based on the video's FPS). If the referenced video or label does not exist, or if any error occurs during the update, a validation error is raised.
76
+
77
+ Returns:
78
+ The updated LabelVideoSegment instance.
79
+ """
80
+ try:
81
+ # Handle time-based updates
82
+ start_time = validated_data.pop('start_time', None)
83
+ end_time = validated_data.pop('end_time', None)
84
+ video_id = validated_data.pop('video_id', None)
85
+ label_id = validated_data.pop('label_id', None)
86
+ label_name = validated_data.pop('label_name', None)
87
+
88
+ # Update video if provided
89
+ if video_id and (not instance.video_file or video_id != instance.video_file.id):
90
+ try:
91
+ instance.video_file = VideoFile.objects.get(id=video_id)
92
+ except ObjectDoesNotExist as exc:
93
+ raise serializers.ValidationError(f"VideoFile with id {video_id} does not exist") from exc
94
+
95
+ # Update label if provided
96
+ if label_id is not None:
97
+ if label_id:
98
+ try:
99
+ instance.label = Label.objects.get(id=label_id)
100
+ except ObjectDoesNotExist as exc:
101
+ raise serializers.ValidationError(f"Label with id {label_id} does not exist") from exc
102
+ else:
103
+ instance.label = None
104
+ elif label_name is not None:
105
+ if label_name:
106
+ instance.label = self.get_or_create_label_from_name(label_name)
107
+ else:
108
+ instance.label = None
109
+
110
+ def _get_valid_fps(video_file):
111
+ """
112
+ Extract and validate the frames-per-second (FPS) value from a video file object.
113
+
114
+ Returns:
115
+ float: The FPS value as a positive float. Defaults to 30.0 if missing, invalid, or non-positive.
116
+ """
117
+
118
+ # Convert time to frame numbers if provided
119
+ if start_time is not None:
120
+ fps = _validate_fps(instance.video_file)
121
+ instance.start_frame_number = _convert_time_to_frame(start_time, fps)
122
+
123
+ if end_time is not None:
124
+ fps = _validate_fps(instance.video_file)
125
+ instance.end_frame_number = _convert_time_to_frame(end_time, fps)
126
+
127
+ # Update other fields
128
+ for attr, value in validated_data.items():
129
+ setattr(instance, attr, value)
130
+
131
+ instance.save()
132
+ logger.info("Updated video segment: %s", instance.pk)
133
+ return instance
134
+
135
+ except Exception as e:
136
+ logger.error("Error updating video segment %s: %s", instance.pk, str(e))
137
+ raise serializers.ValidationError(f"Failed to update segment: {str(e)}")
138
+