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,195 @@
1
+ from celery.events import state
2
+ from rest_framework.views import APIView
3
+ from rest_framework.response import Response
4
+ from rest_framework import status
5
+ import logging
6
+ from pathlib import Path
7
+ from django.db import transaction
8
+ from ...models import VideoFile, SensitiveMeta
9
+ from ...services.video_import import VideoImportService
10
+ logger = logging.getLogger(__name__)
11
+
12
+ class VideoReimportView(APIView):
13
+ """
14
+ API endpoint to re-import a video file and regenerate metadata.
15
+ This is useful when OCR failed or metadata is incomplete.
16
+ """
17
+
18
+ def __init__(self, **kwargs):
19
+ super().__init__(**kwargs)
20
+ self.video_service = VideoImportService()
21
+
22
+ def post(self, request, pk):
23
+ """
24
+ Re-import a video file to regenerate SensitiveMeta and other metadata.
25
+ Instead of creating a new video, this updates the existing one.
26
+
27
+ Args:
28
+ pk (int): Primary key of the VideoFile to reimport
29
+ """
30
+ # Validate pk parameter
31
+ if not pk or not isinstance(pk, int):
32
+ return Response(
33
+ {"error": "Invalid video ID provided."},
34
+ status=status.HTTP_400_BAD_REQUEST
35
+ )
36
+
37
+ try:
38
+ video = VideoFile.objects.get(id=pk)
39
+ logger.info(f"Found video {video.uuid} (ID: {pk}) for re-import")
40
+ except VideoFile.DoesNotExist:
41
+ logger.warning(f"Video with ID {pk} not found")
42
+ return Response(
43
+ {"error": f"Video with ID {pk} not found."},
44
+ status=status.HTTP_404_NOT_FOUND
45
+ )
46
+
47
+ # Check if video has a raw file
48
+ if not video.raw_file:
49
+ logger.warning(f"Video {video.uuid} has no raw file")
50
+ return Response(
51
+ {"error": "Video has no raw file to re-import."},
52
+ status=status.HTTP_400_BAD_REQUEST
53
+ )
54
+
55
+ # Check if the raw file actually exists on disk
56
+ raw_file_path = Path(video.raw_file.path)
57
+ if not raw_file_path.exists():
58
+ logger.error(f"Raw file not found on disk: {raw_file_path}")
59
+ return Response(
60
+ {"error": f"Video file not found on server: {raw_file_path.name}"},
61
+ status=status.HTTP_400_BAD_REQUEST
62
+ )
63
+
64
+ # Check if video has required relationships
65
+ if not video.center:
66
+ logger.warning(f"Video {video.uuid} has no associated center")
67
+ return Response(
68
+ {"error": "Video has no associated center."},
69
+ status=status.HTTP_400_BAD_REQUEST
70
+ )
71
+
72
+ try:
73
+ logger.info(f"Starting in-place re-import for video {video.uuid} (ID: {pk})")
74
+
75
+ with transaction.atomic():
76
+ # Clear existing metadata to force regeneration
77
+ old_meta_id = None
78
+ if video.sensitive_meta:
79
+ old_meta_id = video.sensitive_meta.id
80
+ logger.info(f"Clearing existing SensitiveMeta {old_meta_id} for video {video.uuid}")
81
+ video.sensitive_meta = None
82
+ video.save(update_fields=['sensitive_meta'])
83
+
84
+ # Delete the old SensitiveMeta record
85
+ try:
86
+ SensitiveMeta.objects.filter(id=old_meta_id).delete()
87
+ logger.info(f"Deleted old SensitiveMeta {old_meta_id}")
88
+ except Exception as e:
89
+ logger.warning(f"Could not delete old SensitiveMeta {old_meta_id}: {e}")
90
+
91
+ # Re-initialize video specs and frames
92
+ logger.info(f"Re-initializing video specs for {video.uuid}")
93
+ video.initialize_video_specs()
94
+ video.initialize_frames()
95
+
96
+ # Run Pipe 1 for OCR and AI processing
97
+ logger.info(f"Starting Pipe 1 processing for {video.uuid}")
98
+
99
+ try:
100
+ success = video.pipe_1(
101
+ model_name="image_multilabel_classification_colonoscopy_default",
102
+ delete_frames_after=True,
103
+ ocr_frame_fraction=0.01,
104
+ ocr_cap=5
105
+ )
106
+ except Exception as e:
107
+ logger.error(f"Pipe 1 processing raised exception for {video.uuid}: {e}")
108
+ return Response(
109
+ {"error": f"OCR and AI processing failed: {str(e)}"},
110
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR
111
+ )
112
+
113
+ if not success:
114
+ logger.error(f"Pipe 1 processing failed for video {video.uuid}")
115
+ return Response(
116
+ {"error": "OCR and AI processing failed during re-import."},
117
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR
118
+ )
119
+
120
+ logger.info(f"Pipe 1 processing completed for {video.uuid}")
121
+
122
+ # Ensure minimum patient data is available
123
+ logger.info(f"Ensuring minimum patient data for {video.uuid}")
124
+ self.video_service._ensure_default_patient_data(video)
125
+
126
+ # Refresh from database to get updated data
127
+ video.refresh_from_db()
128
+
129
+ # Use VideoImportService for anonymization
130
+ try:
131
+ processor_name = video.video_meta.processor.name if video.video_meta and video.video_meta.processor else "Unknown"
132
+ logger.info(f"Starting anonymization using VideoImportService for {video.uuid}")
133
+ self.video_service.import_and_anonymize(
134
+ file_path=raw_file_path,
135
+ center_name=video.center.name,
136
+ processor_name=processor_name,
137
+ save_video=True,
138
+ delete_source=False
139
+ )
140
+
141
+ logger.info(f"VideoImportService anonymization completed for {video.uuid}")
142
+
143
+
144
+ return Response({
145
+ "message": "Video re-import with VideoImportService completed successfully.",
146
+ "video_id": pk,
147
+ "uuid": str(video.uuid),
148
+ "frame_cleaning_applied": True,
149
+ "sensitive_meta_created": video.sensitive_meta is not None,
150
+ "sensitive_meta_id": video.sensitive_meta.id if video.sensitive_meta else None,
151
+ "updated_in_place": True,
152
+ "status": "done"
153
+ }, status=status.HTTP_200_OK)
154
+
155
+ except Exception as e:
156
+ logger.exception(f"VideoImportService anonymization failed for video {video.uuid}: {e}")
157
+ logger.warning("Continuing without anonymization due to error")
158
+
159
+ state.mark_sensitive_meta_processed(save=True)
160
+
161
+ # If we reach here, everything was successful
162
+ logger.info(f"Video re-import completed successfully for {video.uuid}")
163
+ video.save(update_fields=['sensitive_meta', 'date_modified'])
164
+
165
+ return Response({
166
+ "message": "Video re-import completed successfully.",
167
+ "video_id": pk,
168
+ "uuid": str(video.uuid),
169
+ "sensitive_meta_created": video.sensitive_meta is not None,
170
+ "sensitive_meta_id": video.sensitive_meta.id if video.sensitive_meta else None,
171
+ "updated_in_place": True,
172
+ "status": "done" # ⭐ Add explicit done status
173
+ }, status=status.HTTP_200_OK)
174
+
175
+ except Exception as e:
176
+ logger.error(f"Failed to re-import video {video.uuid}: {str(e)}", exc_info=True)
177
+
178
+ # Handle specific error types
179
+ error_msg = str(e)
180
+ if any(phrase in error_msg.lower() for phrase in ["insufficient storage", "no space left", "disk full"]):
181
+ # Storage error - return specific error message
182
+ return Response({
183
+ "error": f"Storage error during re-import: {error_msg}",
184
+ "error_type": "storage_error",
185
+ "video_id": pk,
186
+ "uuid": str(video.uuid)
187
+ }, status=status.HTTP_507_INSUFFICIENT_STORAGE)
188
+ else:
189
+ # Other errors
190
+ return Response({
191
+ "error": f"Re-import failed: {error_msg}",
192
+ "error_type": "processing_error",
193
+ "video_id": pk,
194
+ "uuid": str(video.uuid)
195
+ }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@@ -0,0 +1,274 @@
1
+ from pathlib import Path
2
+ import os
3
+ import mimetypes
4
+ from django.http import FileResponse, Http404
5
+ from rest_framework import viewsets, decorators, status
6
+ from rest_framework.views import APIView
7
+ from rest_framework.response import Response
8
+ from rest_framework.decorators import api_view, permission_classes
9
+
10
+ from ...serializers.label_video_segment.label_video_segment_update import LabelSegmentUpdateSerializer
11
+
12
+ from ...serializers.label.label import LabelSerializer
13
+
14
+ from ...serializers.video.video_file_list import VideoFileListSerializer
15
+ from ...models import VideoFile, Label, LabelVideoSegment
16
+ from ...serializers.video.segmentation import VideoFileSerializer
17
+ from ...utils.permissions import DEBUG_PERMISSIONS
18
+
19
+ # Phase 3.2: Import video streaming functionality from dedicated module
20
+ # Phase 3.2: VideoStreamView and _stream_video_file moved to video_stream.py
21
+ from .video_stream import _stream_video_file
22
+
23
+
24
+ class VideoViewSet(viewsets.ReadOnlyModelViewSet):
25
+ """
26
+ /api/videos/ → list of metadata (JSON)
27
+ /api/videos/<id>/ → single metadata (JSON)
28
+ /videos/<id>/stream/ → raw file (FileResponse, range-aware)
29
+ """
30
+ queryset = VideoFile.objects.all()
31
+ serializer_class = VideoFileListSerializer # for the list view
32
+ permission_classes = DEBUG_PERMISSIONS
33
+
34
+ def list(self, request, *args, **kwargs):
35
+ """
36
+ Returns a JSON response with all video metadata and available labels.
37
+
38
+ The response includes serialized lists of all videos and labels in the database.
39
+ """
40
+ videos = VideoFile.objects.all()
41
+ labels = Label.objects.all()
42
+
43
+ video_serializer = VideoFileListSerializer(videos, many=True)
44
+ label_serializer = LabelSerializer(labels, many=True)
45
+
46
+ return Response({
47
+ "videos": video_serializer.data,
48
+ "labels": label_serializer.data
49
+ }, status=status.HTTP_200_OK)
50
+
51
+ # ---------- JSON ---------- #
52
+ def retrieve(self, request, *args, **kwargs):
53
+ """
54
+ Retrieves detailed metadata for a specific video as a JSON response.
55
+
56
+ Returns:
57
+ JSON representation of the requested video's metadata.
58
+ """
59
+ obj = self.get_object()
60
+ return Response(VideoFileSerializer(obj, context={'request': request}).data)
61
+
62
+ # ---------- BYTES ---------- #
63
+ @decorators.action(methods=['get'], detail=True,
64
+ url_path='stream', renderer_classes=[]) # <- disable HTML & JSON renderers
65
+ def stream(self, request, pk=None):
66
+ """
67
+ Streams the raw video file for the specified video with HTTP range and CORS support.
68
+ """
69
+ try:
70
+ vf: VideoFile = self.get_object()
71
+ frontend_origin = os.environ.get('FRONTEND_ORIGIN', 'http://localhost:8000')
72
+ return _stream_video_file(vf, frontend_origin)
73
+ except Http404:
74
+ # Re-raise Http404 exceptions as they should bubble up
75
+ raise
76
+ except Exception as e:
77
+ # Log unexpected errors and convert to Http404
78
+ import logging
79
+ logger = logging.getLogger(__name__)
80
+ logger.error(f"Unexpected error in video stream for pk={pk}: {str(e)}")
81
+ raise Http404("Video streaming failed")
82
+
83
+
84
+ # Phase 3.2: VideoStreamView moved to video_stream.py - imported at top
85
+ # Old implementation removed to avoid duplication
86
+
87
+
88
+ class VideoLabelView(APIView):
89
+ """
90
+ API to fetch time segments (start & end times in seconds) for a specific label.
91
+ """
92
+
93
+ def get(self, request, video_id, label_name):
94
+ """
95
+ Retrieves time segments and frame-level predictions for a specific label on a video.
96
+
97
+ Returns a JSON response containing the label name, a list of time segments (with frame ranges and timestamps), and frame-wise prediction data. Responds with HTTP 404 if the video or label does not exist, or HTTP 200 with empty data if no segments are found. Returns HTTP 500 with an error message for unexpected exceptions.
98
+ """
99
+ try:
100
+ # Verify video exists
101
+ video_entry = VideoFile.objects.get(id=video_id)
102
+
103
+ # Try to get label by name
104
+ try:
105
+ label = Label.objects.get(name=label_name)
106
+ except Label.DoesNotExist:
107
+ return Response({
108
+ "error": f"Label '{label_name}' not found in database"
109
+ }, status=status.HTTP_404_NOT_FOUND)
110
+
111
+ # Get label video segments directly from the database
112
+ label_segments = LabelVideoSegment.objects.filter(
113
+ video_file=video_entry,
114
+ label=label
115
+ ).order_by('start_frame_number')
116
+
117
+ if not label_segments.exists():
118
+ # No segments found for this label, return empty data
119
+ return Response({
120
+ "label": label_name,
121
+ "time_segments": [],
122
+ "frame_predictions": {}
123
+ }, status=status.HTTP_200_OK)
124
+
125
+ # Convert segments to time-based format
126
+ # Fix: Ensure fps is a number, not a string
127
+ fps_raw = getattr(video_entry, 'fps', None) or (video_entry.get_fps() if hasattr(video_entry, 'get_fps') else 25)
128
+
129
+ # Convert fps to float if it's a string
130
+ try:
131
+ if isinstance(fps_raw, str):
132
+ fps = float(fps_raw)
133
+ elif isinstance(fps_raw, (int, float)):
134
+ fps = float(fps_raw)
135
+ else:
136
+ fps = 25.0 # Default fallback
137
+ except (ValueError, TypeError):
138
+ fps = 25.0 # Default fallback if conversion fails
139
+
140
+ # Ensure fps is positive
141
+ if fps <= 0:
142
+ fps = 25.0
143
+
144
+ time_segments = []
145
+ frame_predictions = {}
146
+
147
+ for segment in label_segments:
148
+ # Now fps is guaranteed to be a float
149
+ start_time = segment.start_frame_number / fps
150
+ end_time = segment.end_frame_number / fps
151
+
152
+ segment_data = {
153
+ "segment_id": segment.id,
154
+ "segment_start": segment.start_frame_number,
155
+ "segment_end": segment.end_frame_number,
156
+ "start_time": round(start_time, 2),
157
+ "end_time": round(end_time, 2),
158
+ "frames": {}
159
+ }
160
+
161
+ # Add frame-wise data if available
162
+ for frame_num in range(segment.start_frame_number, segment.end_frame_number + 1):
163
+ frame_filename = f"frame_{str(frame_num).zfill(7)}.jpg"
164
+ frame_predictions[frame_num] = {
165
+ "frame_number": frame_num,
166
+ "label": label_name,
167
+ "confidence": 1.0 # Default confidence
168
+ }
169
+
170
+ # Fix: Safely construct frame_file_path to avoid string/string division errors
171
+ frame_file_path = ""
172
+ if hasattr(video_entry, 'frame_dir') and video_entry.frame_dir:
173
+ try:
174
+ # Ensure frame_dir is converted to Path properly
175
+ if isinstance(video_entry.frame_dir, str):
176
+ frame_dir = Path(video_entry.frame_dir)
177
+ elif isinstance(video_entry.frame_dir, Path):
178
+ frame_dir = video_entry.frame_dir
179
+ else:
180
+ # Try to convert to string first, then to Path
181
+ frame_dir = Path(str(video_entry.frame_dir))
182
+
183
+ frame_file_path = str(frame_dir / frame_filename)
184
+ except (TypeError, ValueError) as e:
185
+ # Log warning but don't fail the request
186
+ import logging
187
+ logger = logging.getLogger(__name__)
188
+ logger.warning(f"Could not construct frame path for frame {frame_num}: {e}")
189
+ frame_file_path = ""
190
+
191
+ segment_data["frames"][frame_num] = {
192
+ "frame_filename": frame_filename,
193
+ "frame_file_path": frame_file_path,
194
+ "predictions": frame_predictions[frame_num]
195
+ }
196
+
197
+ time_segments.append(segment_data)
198
+
199
+ return Response({
200
+ "label": label_name,
201
+ "time_segments": time_segments,
202
+ "frame_predictions": frame_predictions
203
+ }, status=status.HTTP_200_OK)
204
+
205
+ except VideoFile.DoesNotExist:
206
+ return Response({
207
+ "error": "Video not found"
208
+ }, status=status.HTTP_404_NOT_FOUND)
209
+
210
+ except Exception as e:
211
+ # Log the error for debugging
212
+ import logging
213
+ logger = logging.getLogger(__name__)
214
+ logger.error(f"Error in VideoLabelView for video {video_id}, label {label_name}: {str(e)}")
215
+
216
+ return Response({
217
+ "error": f"Internal error: {str(e)}"
218
+ }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
219
+
220
+ class UpdateLabelSegmentsView(APIView):
221
+ """
222
+ API to update or create label segments for a video.
223
+ """
224
+
225
+ def put(self, request, video_id, label_id):
226
+ """
227
+ Updates segments for a given video & label.
228
+ """
229
+
230
+ # Prepare data for serializer by combining URL params with request data
231
+ serializer_data = {
232
+ "video_id": video_id, # From URL parameter
233
+ "label_id": label_id, # From URL parameter
234
+ "segments": request.data.get("segments", []) # From request body
235
+ }
236
+
237
+ # Validate input data
238
+ serializer = LabelSegmentUpdateSerializer(data=serializer_data)
239
+
240
+ if not serializer.is_valid():
241
+ return Response({"error": "Invalid segment data", "details": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
242
+
243
+ # Process and save segment updates
244
+ try:
245
+ result = serializer.save()
246
+ return Response({
247
+ "message": "Segments updated successfully.",
248
+ "updated_segments": result["updated_segments"],
249
+ "new_segments": result["new_segments"],
250
+ "deleted_segments": result["deleted_segments"]
251
+ }, status=status.HTTP_200_OK)
252
+ except Exception as e:
253
+ return Response({
254
+ "error": f"Failed to update segments: {str(e)}"
255
+ }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
256
+
257
+ @api_view(['GET'])
258
+ @permission_classes(DEBUG_PERMISSIONS)
259
+ def rerun_segmentation(request, video_id):
260
+ """
261
+ Rerun segmentation for a specific video.
262
+ """
263
+ try:
264
+ video_file = VideoFile.objects.get(id=video_id)
265
+ video_file.pipe_1()
266
+ video_file.test_after_pipe_1()
267
+ return Response({'status': 'success', 'message': 'Segmentation rerun successfully'})
268
+ except VideoFile.DoesNotExist:
269
+ return Response({'status': 'error', 'message': 'Video file not found'}, status=status.HTTP_404_NOT_FOUND)
270
+ except Exception as e:
271
+ import logging
272
+ logger = logging.getLogger(__name__)
273
+ logger.error(f"Error in rerun_segmentation: {e}")
274
+ return Response({'status': 'error', 'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@@ -0,0 +1,49 @@
1
+ from endoreg_db.utils.permissions import EnvironmentAwarePermission
2
+
3
+
4
+ from rest_framework import status
5
+ from rest_framework.response import Response
6
+ from rest_framework.views import APIView
7
+ from celery import current_app
8
+
9
+ class TaskStatusView(APIView):
10
+ """
11
+ GET /api/task-status/{task_id}/ - Get status of async task
12
+ """
13
+ #TODO refactor, this should be specified as video task status or moved to a more appropriate module
14
+ permission_classes = [EnvironmentAwarePermission]
15
+
16
+ def get(self, request, task_id):
17
+ try:
18
+ task_result = current_app.AsyncResult(task_id)
19
+
20
+ response_data = {
21
+ 'task_id': task_id,
22
+ 'status': task_result.status,
23
+ 'progress': 0,
24
+ 'message': 'Task pending...'
25
+ }
26
+
27
+ if task_result.status == 'PENDING':
28
+ response_data['message'] = 'Task is waiting to be processed'
29
+ elif task_result.status == 'PROGRESS':
30
+ response_data.update(task_result.result or {})
31
+ elif task_result.status == 'SUCCESS':
32
+ response_data.update({
33
+ 'progress': 100,
34
+ 'message': 'Task completed successfully',
35
+ 'result': task_result.result
36
+ })
37
+ elif task_result.status == 'FAILURE':
38
+ response_data.update({
39
+ 'message': str(task_result.result),
40
+ 'error': True
41
+ })
42
+
43
+ return Response(response_data, status=status.HTTP_200_OK)
44
+
45
+ except Exception as e:
46
+ return Response(
47
+ {"error": f"Failed to get task status: {str(e)}"},
48
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR
49
+ )
@@ -0,0 +1,46 @@
1
+ from django.shortcuts import render, get_object_or_404
2
+ from ...models import VideoFile
3
+ import json
4
+ from ...serializers.video import VideoFileSerializer
5
+
6
+ def video_timeline_view(request, video_id):
7
+ """
8
+ Fetches 'outside' label segments and passes their timestamps to the template.
9
+ """
10
+ video_entry = get_object_or_404(VideoFile, id=video_id)
11
+
12
+ # Get metadata (Assumes serializer method exists)
13
+ video_serializer = VideoFileSerializer(video_entry, context={'request': request})
14
+ label_segments = video_serializer.get_label_time_segments(video_entry)
15
+
16
+ segments = []
17
+ frame_markers = [] # Store frame timestamps
18
+ fps = 50 # Fixed FPS
19
+
20
+ # Ensure "outside" label exists
21
+ if "outside" in label_segments:
22
+ for segment in label_segments["outside"]["time_ranges"]:
23
+ segments.append({
24
+ "start_time": segment["start_time"],
25
+ "end_time": segment["end_time"]
26
+ })
27
+
28
+ # Extract frame timestamps for markers
29
+ for frame_num, _ in segment["frames"].items():
30
+ time_in_seconds = frame_num / fps
31
+ frame_markers.append(time_in_seconds)
32
+
33
+ # Set video duration correctly
34
+ video_duration = video_entry.duration if hasattr(video_entry, "duration") and video_entry.duration else 226 # Default to 226 seconds
35
+
36
+ print("Video ID:", video_id)
37
+ print("Segments:", segments)
38
+ print("Video Duration:", video_duration)
39
+
40
+ return render(request, "timeline.html", {
41
+ "video_id": video_id,
42
+ "video_url": video_serializer.get_video_url(video_entry),
43
+ "segments": json.dumps(segments), # Send segment start/end times
44
+ "frame_markers": json.dumps(frame_markers), # Send frame timestamps
45
+ "video_duration": video_duration,
46
+ })
@@ -0,0 +1,52 @@
1
+ from endoreg_db.models import VideoFile
2
+ from endoreg_db.utils.permissions import EnvironmentAwarePermission
3
+
4
+ from django.shortcuts import get_object_or_404
5
+ from rest_framework import status
6
+ from rest_framework.response import Response
7
+ from rest_framework.views import APIView
8
+
9
+
10
+ class VideoAnalyzeView(APIView):
11
+ """
12
+ POST /api/video-analyze/{id}/ - Analyze video for sensitive content
13
+ """
14
+ permission_classes = [EnvironmentAwarePermission]
15
+
16
+ def post(self, request, pk):
17
+ video = get_object_or_404(VideoFile, pk=pk)
18
+ use_minicpm = request.data.get('use_minicpm', True)
19
+ _detailed_analysis = request.data.get('detailed_analysis', True)
20
+
21
+ try:
22
+ # Import FrameCleaner here to avoid circular imports
23
+ from lx_anonymizer.frame_cleaner import FrameCleaner
24
+
25
+ cleaner = FrameCleaner(
26
+ video_path=video.file.path,
27
+ use_minicpm=use_minicpm
28
+ )
29
+
30
+ # Perform analysis
31
+ analysis_result = cleaner.analyze_video_sensitivity()
32
+
33
+ # Update video metadata
34
+ if hasattr(video, 'sensitive_frame_count'):
35
+ video.sensitive_frame_count = analysis_result.get('sensitive_frames', 0)
36
+ if hasattr(video, 'total_frames'):
37
+ video.total_frames = analysis_result.get('total_frames', 0)
38
+ if hasattr(video, 'sensitive_ratio'):
39
+ video.sensitive_ratio = analysis_result.get('sensitivity_ratio', 0.0)
40
+
41
+ try:
42
+ video.save()
43
+ except Exception as e:
44
+ print(f"Warning: Could not save video metadata: {e}")
45
+
46
+ return Response(analysis_result, status=status.HTTP_200_OK)
47
+
48
+ except Exception as e:
49
+ return Response(
50
+ {"error": f"Analysis failed: {str(e)}"},
51
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR
52
+ )
@@ -0,0 +1,48 @@
1
+ from endoreg_db.models import VideoFile
2
+ from endoreg_db.utils.permissions import EnvironmentAwarePermission
3
+
4
+
5
+ from django.shortcuts import get_object_or_404
6
+ from rest_framework import status
7
+ from rest_framework.response import Response
8
+ from rest_framework.views import APIView
9
+
10
+
11
+ class VideoApplyMaskView(APIView):
12
+ """
13
+ POST /api/video-apply-mask/{id}/ - Apply mask to video using streaming processing
14
+ """
15
+ permission_classes = [EnvironmentAwarePermission]
16
+
17
+ def post(self, request, pk):
18
+ video = get_object_or_404(VideoFile, pk=pk)
19
+
20
+ mask_type = request.data.get('mask_type', 'device_default')
21
+ device_name = request.data.get('device_name', 'olympus_cv_1500')
22
+ use_streaming = request.data.get('use_streaming', True)
23
+ custom_mask = request.data.get('custom_mask')
24
+
25
+ try:
26
+ # Start async task for video masking
27
+ from endoreg_db.tasks.video_processing_tasks import apply_video_mask_task
28
+
29
+ task_data = {
30
+ 'video_id': pk,
31
+ 'mask_type': mask_type,
32
+ 'device_name': device_name,
33
+ 'use_streaming': use_streaming,
34
+ 'custom_mask': custom_mask
35
+ }
36
+
37
+ task = apply_video_mask_task.delay(**task_data)
38
+
39
+ return Response(
40
+ {"task_id": task.id, "status": "started"},
41
+ status=status.HTTP_202_ACCEPTED
42
+ )
43
+
44
+ except Exception as e:
45
+ return Response(
46
+ {"error": f"Failed to start masking task: {str(e)}"},
47
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR
48
+ )