endoreg-db 0.6.0__py3-none-any.whl → 0.6.2__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 (416) hide show
  1. endoreg_db/case_generator/__init__.py +0 -0
  2. endoreg_db/case_generator/case_generator.py +159 -0
  3. endoreg_db/case_generator/lab_sample_factory.py +33 -0
  4. endoreg_db/case_generator/utils.py +30 -0
  5. endoreg_db/data/__init__.py +118 -0
  6. endoreg_db/data/agl_service/data.yaml +19 -0
  7. endoreg_db/data/ai_model/data.yaml +7 -0
  8. endoreg_db/data/ai_model_label/label/data.yaml +88 -0
  9. endoreg_db/data/ai_model_label/label-set/data.yaml +21 -0
  10. endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
  11. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +5 -0
  12. endoreg_db/data/ai_model_type/data.yaml +7 -0
  13. endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
  14. endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
  15. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
  16. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
  17. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
  18. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
  19. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
  20. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
  21. endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
  22. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
  23. endoreg_db/data/case_template/rule_value/.init +0 -0
  24. endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
  25. endoreg_db/data/case_template/template/base.yaml +8 -0
  26. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
  27. endoreg_db/data/case_template/tmp/_rule_value +13 -0
  28. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
  29. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
  30. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
  31. endoreg_db/data/center/data.yaml +90 -0
  32. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
  33. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
  34. endoreg_db/data/contraindication/bleeding.yaml +11 -0
  35. endoreg_db/data/disease/cardiovascular.yaml +37 -0
  36. endoreg_db/data/disease/hepatology.yaml +5 -0
  37. endoreg_db/data/disease/misc.yaml +6 -0
  38. endoreg_db/data/disease/renal.yaml +5 -0
  39. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
  40. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
  41. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
  42. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
  43. endoreg_db/data/distribution/date/patient.yaml +7 -0
  44. endoreg_db/data/distribution/multiple_categorical/.init +0 -0
  45. endoreg_db/data/distribution/numeric/data.yaml +14 -0
  46. endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
  47. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
  48. endoreg_db/data/endoscope/data.yaml +93 -0
  49. endoreg_db/data/endoscope_type/data.yaml +11 -0
  50. endoreg_db/data/endoscopy_processor/data.yaml +47 -0
  51. endoreg_db/data/event/cardiology.yaml +28 -0
  52. endoreg_db/data/event/neurology.yaml +14 -0
  53. endoreg_db/data/event/surgery.yaml +13 -0
  54. endoreg_db/data/event/thrombembolism.yaml +20 -0
  55. endoreg_db/data/examination/examinations/data.yaml +66 -0
  56. endoreg_db/data/examination/time/data.yaml +48 -0
  57. endoreg_db/data/examination/time-type/data.yaml +8 -0
  58. endoreg_db/data/examination/type/data.yaml +5 -0
  59. endoreg_db/data/examination_indication/endoscopy.yaml +8 -0
  60. endoreg_db/data/examination_indication_classification/endoscopy.yaml +8 -0
  61. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
  62. endoreg_db/data/finding/data.yaml +141 -0
  63. endoreg_db/data/finding_intervention/endoscopy.yaml +138 -0
  64. endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
  65. endoreg_db/data/finding_location_classification/colonoscopy.yaml +46 -0
  66. endoreg_db/data/finding_location_classification_choice/colonoscopy.yaml +240 -0
  67. endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +48 -0
  68. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_circularity_default.yaml +34 -0
  69. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_nice.yaml +20 -0
  70. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_paris.yaml +65 -0
  71. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_planarity_default.yaml +56 -0
  72. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_surface_intact_default.yaml +39 -0
  73. endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +57 -0
  74. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
  75. endoreg_db/data/finding_type/data.yaml +30 -0
  76. endoreg_db/data/gender/data.yaml +35 -0
  77. endoreg_db/data/information_source/data.yaml +30 -0
  78. endoreg_db/data/information_source/medication.yaml +6 -0
  79. endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
  80. endoreg_db/data/lab_value/coagulation.yaml +54 -0
  81. endoreg_db/data/lab_value/electrolytes.yaml +228 -0
  82. endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
  83. endoreg_db/data/lab_value/hematology.yaml +184 -0
  84. endoreg_db/data/lab_value/hormones.yaml +59 -0
  85. endoreg_db/data/lab_value/lipids.yaml +53 -0
  86. endoreg_db/data/lab_value/misc.yaml +33 -0
  87. endoreg_db/data/lab_value/renal_function.yaml +12 -0
  88. endoreg_db/data/log_type/data.yaml +57 -0
  89. endoreg_db/data/lx_client_tag/base.yaml +54 -0
  90. endoreg_db/data/lx_client_type/base.yaml +30 -0
  91. endoreg_db/data/lx_permission/base.yaml +24 -0
  92. endoreg_db/data/lx_permission/endoreg.yaml +52 -0
  93. endoreg_db/data/material/material.yaml +91 -0
  94. endoreg_db/data/medication/anticoagulation.yaml +65 -0
  95. endoreg_db/data/medication/tah.yaml +70 -0
  96. endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
  97. endoreg_db/data/medication_indication_type/data.yaml +11 -0
  98. endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
  99. endoreg_db/data/medication_intake_time/base.yaml +31 -0
  100. endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
  101. endoreg_db/data/medication_schedule/ass.yaml +12 -0
  102. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
  103. endoreg_db/data/names_first/first_names.yaml +51 -0
  104. endoreg_db/data/names_last/last_names.yaml +51 -0
  105. endoreg_db/data/network_device/data.yaml +59 -0
  106. endoreg_db/data/network_device_type/data.yaml +12 -0
  107. endoreg_db/data/organ/data.yaml +29 -0
  108. endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
  109. endoreg_db/data/pdf_type/data.yaml +29 -0
  110. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
  111. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
  112. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
  113. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
  114. endoreg_db/data/profession/data.yaml +70 -0
  115. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
  116. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
  117. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -0
  118. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
  119. endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
  120. endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
  121. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
  122. endoreg_db/data/unit/concentration.yaml +92 -0
  123. endoreg_db/data/unit/data.yaml +17 -0
  124. endoreg_db/data/unit/length.yaml +31 -0
  125. endoreg_db/data/unit/misc.yaml +20 -0
  126. endoreg_db/data/unit/rate.yaml +6 -0
  127. endoreg_db/data/unit/time.yaml +13 -0
  128. endoreg_db/data/unit/volume.yaml +35 -0
  129. endoreg_db/data/unit/weight.yaml +38 -0
  130. endoreg_db/data/waste/data.yaml +12 -0
  131. endoreg_db/forms/__init__.py +5 -0
  132. endoreg_db/forms/examination_form.py +11 -0
  133. endoreg_db/forms/patient_finding_intervention_form.py +19 -0
  134. endoreg_db/forms/patient_form.py +26 -0
  135. endoreg_db/forms/questionnaires/__init__.py +1 -0
  136. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
  137. endoreg_db/forms/settings/__init__.py +8 -0
  138. endoreg_db/forms/unit.py +6 -0
  139. endoreg_db/management/__init__.py +0 -0
  140. endoreg_db/management/commands/__init__.py +0 -0
  141. endoreg_db/management/commands/_load_model_template.py +41 -0
  142. endoreg_db/management/commands/delete_all.py +18 -0
  143. endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -0
  144. endoreg_db/management/commands/fix_auth_permission.py +20 -0
  145. endoreg_db/management/commands/load_active_model_data.py +45 -0
  146. endoreg_db/management/commands/load_ai_model_data.py +79 -0
  147. endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
  148. endoreg_db/management/commands/load_base_db_data.py +178 -0
  149. endoreg_db/management/commands/load_center_data.py +43 -0
  150. endoreg_db/management/commands/load_contraindication_data.py +41 -0
  151. endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
  152. endoreg_db/management/commands/load_disease_classification_data.py +41 -0
  153. endoreg_db/management/commands/load_disease_data.py +62 -0
  154. endoreg_db/management/commands/load_distribution_data.py +66 -0
  155. endoreg_db/management/commands/load_endoscope_data.py +68 -0
  156. endoreg_db/management/commands/load_event_data.py +41 -0
  157. endoreg_db/management/commands/load_examination_data.py +75 -0
  158. endoreg_db/management/commands/load_examination_indication_data.py +65 -0
  159. endoreg_db/management/commands/load_finding_data.py +171 -0
  160. endoreg_db/management/commands/load_g_play_data.py +113 -0
  161. endoreg_db/management/commands/load_gender_data.py +44 -0
  162. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +133 -0
  163. endoreg_db/management/commands/load_information_source.py +45 -0
  164. endoreg_db/management/commands/load_lab_value_data.py +50 -0
  165. endoreg_db/management/commands/load_logging_data.py +39 -0
  166. endoreg_db/management/commands/load_lx_data.py +64 -0
  167. endoreg_db/management/commands/load_medication_data.py +103 -0
  168. endoreg_db/management/commands/load_medication_indication_data.py +63 -0
  169. endoreg_db/management/commands/load_medication_indication_type_data.py +41 -0
  170. endoreg_db/management/commands/load_medication_intake_time_data.py +41 -0
  171. endoreg_db/management/commands/load_medication_schedule_data.py +55 -0
  172. endoreg_db/management/commands/load_name_data.py +37 -0
  173. endoreg_db/management/commands/load_network_data.py +57 -0
  174. endoreg_db/management/commands/load_organ_data.py +43 -0
  175. endoreg_db/management/commands/load_pdf_type_data.py +61 -0
  176. endoreg_db/management/commands/load_profession_data.py +44 -0
  177. endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
  178. endoreg_db/management/commands/load_unit_data.py +46 -0
  179. endoreg_db/management/commands/load_user_groups.py +28 -0
  180. endoreg_db/management/commands/register_ai_model.py +64 -0
  181. endoreg_db/management/commands/reset_celery_schedule.py +9 -0
  182. endoreg_db/migrations/0001_initial.py +2045 -0
  183. endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +23 -0
  184. endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +23 -0
  185. endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +25 -0
  186. endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +33 -0
  187. endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +23 -0
  188. endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +24 -0
  189. endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +48 -0
  190. endoreg_db/migrations/__init__.py +0 -0
  191. endoreg_db/models/__init__.py +376 -0
  192. endoreg_db/models/ai_model/__init__.py +4 -0
  193. endoreg_db/models/ai_model/active_model.py +9 -0
  194. endoreg_db/models/ai_model/ai_model.py +103 -0
  195. endoreg_db/models/ai_model/lightning/__init__.py +3 -0
  196. endoreg_db/models/ai_model/lightning/inference_dataset.py +53 -0
  197. endoreg_db/models/ai_model/lightning/multilabel_classification_net.py +155 -0
  198. endoreg_db/models/ai_model/lightning/postprocess.py +53 -0
  199. endoreg_db/models/ai_model/lightning/predict.py +172 -0
  200. endoreg_db/models/ai_model/lightning/prediction_visualizer.py +55 -0
  201. endoreg_db/models/ai_model/lightning/preprocess.py +68 -0
  202. endoreg_db/models/ai_model/lightning/run_visualizer.py +21 -0
  203. endoreg_db/models/ai_model/model_meta.py +250 -0
  204. endoreg_db/models/ai_model/model_type.py +36 -0
  205. endoreg_db/models/ai_model/utils.py +8 -0
  206. endoreg_db/models/annotation/__init__.py +32 -0
  207. endoreg_db/models/annotation/anonymized_image_annotation.py +115 -0
  208. endoreg_db/models/annotation/binary_classification_annotation_task.py +117 -0
  209. endoreg_db/models/annotation/image_classification.py +86 -0
  210. endoreg_db/models/annotation/video_segmentation_annotation.py +52 -0
  211. endoreg_db/models/annotation/video_segmentation_labelset.py +20 -0
  212. endoreg_db/models/case/__init__.py +1 -0
  213. endoreg_db/models/case/case.py +34 -0
  214. endoreg_db/models/case_template/__init__.py +15 -0
  215. endoreg_db/models/case_template/case_template.py +125 -0
  216. endoreg_db/models/case_template/case_template_rule.py +276 -0
  217. endoreg_db/models/case_template/case_template_rule_value.py +88 -0
  218. endoreg_db/models/case_template/case_template_type.py +28 -0
  219. endoreg_db/models/center/__init__.py +11 -0
  220. endoreg_db/models/center/center.py +51 -0
  221. endoreg_db/models/center/center_product.py +33 -0
  222. endoreg_db/models/center/center_resource.py +33 -0
  223. endoreg_db/models/center/center_waste.py +16 -0
  224. endoreg_db/models/contraindication/__init__.py +21 -0
  225. endoreg_db/models/data_file/__init__.py +39 -0
  226. endoreg_db/models/data_file/base_classes/__init__.py +7 -0
  227. endoreg_db/models/data_file/base_classes/abstract_frame.py +100 -0
  228. endoreg_db/models/data_file/base_classes/abstract_pdf.py +136 -0
  229. endoreg_db/models/data_file/base_classes/abstract_video.py +807 -0
  230. endoreg_db/models/data_file/base_classes/frame_helpers.py +17 -0
  231. endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +19 -0
  232. endoreg_db/models/data_file/base_classes/utils.py +80 -0
  233. endoreg_db/models/data_file/frame.py +29 -0
  234. endoreg_db/models/data_file/import_classes/__init__.py +18 -0
  235. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +35 -0
  236. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -0
  237. endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -0
  238. endoreg_db/models/data_file/import_classes/raw_pdf.py +260 -0
  239. endoreg_db/models/data_file/import_classes/raw_video.py +288 -0
  240. endoreg_db/models/data_file/metadata/__init__.py +13 -0
  241. endoreg_db/models/data_file/metadata/pdf_meta.py +74 -0
  242. endoreg_db/models/data_file/metadata/sensitive_meta.py +290 -0
  243. endoreg_db/models/data_file/metadata/video_meta.py +199 -0
  244. endoreg_db/models/data_file/report_file.py +56 -0
  245. endoreg_db/models/data_file/video/__init__.py +11 -0
  246. endoreg_db/models/data_file/video/import_meta.py +25 -0
  247. endoreg_db/models/data_file/video/video.py +196 -0
  248. endoreg_db/models/data_file/video_segment.py +214 -0
  249. endoreg_db/models/disease.py +79 -0
  250. endoreg_db/models/emission/__init__.py +5 -0
  251. endoreg_db/models/emission/emission_factor.py +85 -0
  252. endoreg_db/models/event.py +73 -0
  253. endoreg_db/models/examination/__init__.py +9 -0
  254. endoreg_db/models/examination/examination.py +67 -0
  255. endoreg_db/models/examination/examination_indication.py +170 -0
  256. endoreg_db/models/examination/examination_time.py +53 -0
  257. endoreg_db/models/examination/examination_time_type.py +48 -0
  258. endoreg_db/models/examination/examination_type.py +40 -0
  259. endoreg_db/models/finding/__init__.py +11 -0
  260. endoreg_db/models/finding/finding.py +75 -0
  261. endoreg_db/models/finding/finding_intervention.py +60 -0
  262. endoreg_db/models/finding/finding_location_classification.py +94 -0
  263. endoreg_db/models/finding/finding_morphology_classification.py +89 -0
  264. endoreg_db/models/finding/finding_type.py +22 -0
  265. endoreg_db/models/hardware/__init__.py +2 -0
  266. endoreg_db/models/hardware/endoscope.py +60 -0
  267. endoreg_db/models/hardware/endoscopy_processor.py +155 -0
  268. endoreg_db/models/information_source.py +29 -0
  269. endoreg_db/models/label/__init__.py +1 -0
  270. endoreg_db/models/label/label.py +112 -0
  271. endoreg_db/models/laboratory/__init__.py +1 -0
  272. endoreg_db/models/laboratory/lab_value.py +111 -0
  273. endoreg_db/models/logging/__init__.py +11 -0
  274. endoreg_db/models/logging/agl_service.py +19 -0
  275. endoreg_db/models/logging/base.py +22 -0
  276. endoreg_db/models/logging/log_type.py +23 -0
  277. endoreg_db/models/logging/network_device.py +27 -0
  278. endoreg_db/models/lx/__init__.py +4 -0
  279. endoreg_db/models/lx/client.py +57 -0
  280. endoreg_db/models/lx/identity.py +34 -0
  281. endoreg_db/models/lx/permission.py +18 -0
  282. endoreg_db/models/lx/user.py +16 -0
  283. endoreg_db/models/medication/__init__.py +19 -0
  284. endoreg_db/models/medication/medication.py +33 -0
  285. endoreg_db/models/medication/medication_indication.py +50 -0
  286. endoreg_db/models/medication/medication_indication_type.py +34 -0
  287. endoreg_db/models/medication/medication_intake_time.py +26 -0
  288. endoreg_db/models/medication/medication_schedule.py +37 -0
  289. endoreg_db/models/network/__init__.py +9 -0
  290. endoreg_db/models/network/agl_service.py +38 -0
  291. endoreg_db/models/network/network_device.py +58 -0
  292. endoreg_db/models/network/network_device_type.py +23 -0
  293. endoreg_db/models/organ/__init__.py +38 -0
  294. endoreg_db/models/other/__init__.py +23 -0
  295. endoreg_db/models/other/distribution/__init__.py +44 -0
  296. endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
  297. endoreg_db/models/other/distribution/date_value_distribution.py +91 -0
  298. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
  299. endoreg_db/models/other/distribution/numeric_value_distribution.py +97 -0
  300. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
  301. endoreg_db/models/other/distribution.py +5 -0
  302. endoreg_db/models/other/material.py +20 -0
  303. endoreg_db/models/other/resource.py +18 -0
  304. endoreg_db/models/other/transport_route.py +22 -0
  305. endoreg_db/models/other/waste.py +20 -0
  306. endoreg_db/models/patient/__init__.py +24 -0
  307. endoreg_db/models/patient/patient_examination.py +182 -0
  308. endoreg_db/models/patient/patient_finding.py +143 -0
  309. endoreg_db/models/patient/patient_finding_intervention.py +26 -0
  310. endoreg_db/models/patient/patient_finding_location.py +120 -0
  311. endoreg_db/models/patient/patient_finding_morphology.py +166 -0
  312. endoreg_db/models/permissions/__init__.py +44 -0
  313. endoreg_db/models/persons/__init__.py +34 -0
  314. endoreg_db/models/persons/examiner/__init__.py +2 -0
  315. endoreg_db/models/persons/examiner/examiner.py +60 -0
  316. endoreg_db/models/persons/examiner/examiner_type.py +2 -0
  317. endoreg_db/models/persons/first_name.py +18 -0
  318. endoreg_db/models/persons/gender.py +22 -0
  319. endoreg_db/models/persons/last_name.py +20 -0
  320. endoreg_db/models/persons/patient/__init__.py +8 -0
  321. endoreg_db/models/persons/patient/patient.py +389 -0
  322. endoreg_db/models/persons/patient/patient_disease.py +22 -0
  323. endoreg_db/models/persons/patient/patient_event.py +52 -0
  324. endoreg_db/models/persons/patient/patient_examination_indication.py +32 -0
  325. endoreg_db/models/persons/patient/patient_lab_sample.py +108 -0
  326. endoreg_db/models/persons/patient/patient_lab_value.py +197 -0
  327. endoreg_db/models/persons/patient/patient_medication.py +59 -0
  328. endoreg_db/models/persons/patient/patient_medication_schedule.py +88 -0
  329. endoreg_db/models/persons/person.py +31 -0
  330. endoreg_db/models/persons/portal_user_information.py +27 -0
  331. endoreg_db/models/prediction/__init__.py +8 -0
  332. endoreg_db/models/prediction/image_classification.py +51 -0
  333. endoreg_db/models/prediction/video_prediction_meta.py +306 -0
  334. endoreg_db/models/product/__init__.py +14 -0
  335. endoreg_db/models/product/product.py +110 -0
  336. endoreg_db/models/product/product_group.py +27 -0
  337. endoreg_db/models/product/product_material.py +28 -0
  338. endoreg_db/models/product/product_weight.py +38 -0
  339. endoreg_db/models/product/reference_product.py +115 -0
  340. endoreg_db/models/questionnaires/__init__.py +114 -0
  341. endoreg_db/models/quiz/__init__.py +9 -0
  342. endoreg_db/models/quiz/quiz_answer.py +41 -0
  343. endoreg_db/models/quiz/quiz_question.py +54 -0
  344. endoreg_db/models/report_reader/__init__.py +7 -0
  345. endoreg_db/models/report_reader/report_reader_config.py +53 -0
  346. endoreg_db/models/report_reader/report_reader_flag.py +20 -0
  347. endoreg_db/models/rules/__init__.py +5 -0
  348. endoreg_db/models/rules/rule.py +24 -0
  349. endoreg_db/models/rules/rule_applicator.py +224 -0
  350. endoreg_db/models/rules/rule_attribute_dtype.py +19 -0
  351. endoreg_db/models/rules/rule_type.py +22 -0
  352. endoreg_db/models/rules/ruleset.py +19 -0
  353. endoreg_db/models/unit.py +22 -0
  354. endoreg_db/queries/__init__.py +5 -0
  355. endoreg_db/queries/annotations/__init__.py +3 -0
  356. endoreg_db/queries/annotations/legacy.py +158 -0
  357. endoreg_db/queries/get/__init__.py +6 -0
  358. endoreg_db/queries/get/annotation.py +0 -0
  359. endoreg_db/queries/get/center.py +42 -0
  360. endoreg_db/queries/get/model.py +13 -0
  361. endoreg_db/queries/get/patient.py +14 -0
  362. endoreg_db/queries/get/patient_examination.py +20 -0
  363. endoreg_db/queries/get/prediction.py +0 -0
  364. endoreg_db/queries/get/report_file.py +33 -0
  365. endoreg_db/queries/get/video.py +31 -0
  366. endoreg_db/queries/get/video_import_meta.py +0 -0
  367. endoreg_db/queries/get/video_prediction_meta.py +0 -0
  368. endoreg_db/queries/sanity/__init_.py +0 -0
  369. endoreg_db/serializers/__init__.py +10 -0
  370. endoreg_db/serializers/ai_model.py +19 -0
  371. endoreg_db/serializers/annotation.py +14 -0
  372. endoreg_db/serializers/center.py +11 -0
  373. endoreg_db/serializers/examination.py +33 -0
  374. endoreg_db/serializers/frame.py +9 -0
  375. endoreg_db/serializers/hardware.py +21 -0
  376. endoreg_db/serializers/label.py +22 -0
  377. endoreg_db/serializers/patient.py +33 -0
  378. endoreg_db/serializers/prediction.py +10 -0
  379. endoreg_db/serializers/raw_video_meta_validation.py +13 -0
  380. endoreg_db/serializers/report_file.py +7 -0
  381. endoreg_db/serializers/video.py +20 -0
  382. endoreg_db/serializers/video_segmentation.py +492 -0
  383. endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
  384. endoreg_db/templates/admin/start_examination.html +12 -0
  385. endoreg_db/templates/timeline.html +176 -0
  386. endoreg_db/utils/__init__.py +36 -0
  387. endoreg_db/utils/cropping.py +29 -0
  388. endoreg_db/utils/dataloader.py +118 -0
  389. endoreg_db/utils/dates.py +39 -0
  390. endoreg_db/utils/file_operations.py +30 -0
  391. endoreg_db/utils/hashs.py +152 -0
  392. endoreg_db/utils/legacy_ocr.py +201 -0
  393. endoreg_db/utils/names.py +74 -0
  394. endoreg_db/utils/ocr.py +190 -0
  395. endoreg_db/utils/parse_and_generate_yaml.py +46 -0
  396. endoreg_db/utils/pydantic_models/__init__.py +6 -0
  397. endoreg_db/utils/pydantic_models/db_config.py +57 -0
  398. endoreg_db/utils/uuid.py +4 -0
  399. endoreg_db/utils/validate_endo_roi.py +19 -0
  400. endoreg_db/utils/validate_subcategory_dict.py +91 -0
  401. endoreg_db/utils/video/__init__.py +13 -0
  402. endoreg_db/utils/video/extract_frames.py +121 -0
  403. endoreg_db/utils/video/transcode_videofile.py +111 -0
  404. endoreg_db/views/__init__.py +2 -0
  405. endoreg_db/views/csrf.py +7 -0
  406. endoreg_db/views/patient_views.py +90 -0
  407. endoreg_db/views/raw_video_meta_validation_views.py +38 -0
  408. endoreg_db/views/report_views.py +96 -0
  409. endoreg_db/views/video_segmentation_views.py +149 -0
  410. endoreg_db/views/views_for_timeline.py +46 -0
  411. {endoreg_db-0.6.0.dist-info → endoreg_db-0.6.2.dist-info}/METADATA +14 -4
  412. endoreg_db-0.6.2.dist-info/RECORD +420 -0
  413. {endoreg_db-0.6.0.dist-info → endoreg_db-0.6.2.dist-info}/WHEEL +1 -2
  414. endoreg_db-0.6.0.dist-info/RECORD +0 -11
  415. endoreg_db-0.6.0.dist-info/top_level.txt +0 -1
  416. {endoreg_db-0.6.0.dist-info → endoreg_db-0.6.2.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,492 @@
1
+ from pathlib import Path
2
+ from rest_framework import serializers
3
+ from django.http import FileResponse, Http404,StreamingHttpResponse
4
+ from ..models import RawVideoFile,Label
5
+ import subprocess, cv2
6
+ from django.conf import settings
7
+
8
+
9
+
10
+ class VideoFileSerializer(serializers.ModelSerializer):
11
+
12
+
13
+ """
14
+ Serializer that dynamically handles video retrieval and streaming.
15
+ Ensures file returns the relative file path (not MEDIA_URL)
16
+ Computes full_video_path using the correct storage path (/home/admin/test-data)-need to change make it dynamic
17
+ Returns video_url for frontend integration
18
+ Serves the video file when needed
19
+
20
+ """
21
+
22
+ video_url = serializers.SerializerMethodField()
23
+ full_video_path = serializers.SerializerMethodField()
24
+ file = serializers.SerializerMethodField() # Override file to remove incorrect MEDIA_URL behavior,otherwise:Django's FileField automatically generates a URL based on MEDIA_URL
25
+ # Video dropdown field for frontend selection (currently shows video ID, but can be changed later)
26
+ video_selection_field = serializers.SerializerMethodField()
27
+ #classification_data = serializers.SerializerMethodField() #data from database (smooth prediction values but currently hardcoded one)
28
+ #The Meta class tells Django what data to include when serializing a RawVideoFile object.
29
+ sequences = serializers.SerializerMethodField()
30
+ label_names = serializers.SerializerMethodField()
31
+ # Convert selected label frames into time segments (seconds)
32
+ label_time_segments = serializers.SerializerMethodField()
33
+ #label_predictions = serializers.SerializerMethodField()
34
+ original_file_name = serializers.CharField()
35
+ duration = serializers.SerializerMethodField()
36
+
37
+
38
+
39
+
40
+
41
+ class Meta:
42
+ model = RawVideoFile
43
+ #he fields list defines which data should be included in the API response.
44
+ fields = ['id','original_file_name', 'file','duration', 'video_url', 'full_video_path','video_selection_field','label_names','sequences','label_time_segments'] # Ensure computed fields are included
45
+ #@staticmethod #using @staticmethod makes it reusable without needing to create a serializer instance.
46
+ # Without @staticmethod, you would need to instantiate the serializer before calling the method, which is unnecessary her
47
+ def get_video_selection_field(self,obj):
48
+ """
49
+ Returns the field used for video selection in the frontend dropdown.
50
+ Currently, it shows the video ID, but this can be changed easily later.
51
+ """
52
+ return obj.id
53
+
54
+ def get_video_url(self, obj): # when we serialize a RawVideoFile object (video metadata), the get_video_url method is automatically invoked by DRF
55
+ """
56
+ Returns the API endpoint where the frontend can fetch the video.
57
+ """
58
+ if not obj.id:
59
+ return {"error": "Invalid video ID"}
60
+
61
+ request= self.context.get('request') #Gets the request object (provided by DRF).
62
+ if request:
63
+ return request.build_absolute_uri(f"/api/video/{obj.id}/")
64
+
65
+ return {"error": "Video URL not avalaible"}
66
+
67
+ def get_duration(self, obj):
68
+ """
69
+ Returns the total duration of the video in seconds.
70
+ If duration is not stored in the database, it extracts it dynamically using OpenCV.
71
+ """
72
+ if hasattr(obj, "duration") and obj.duration:
73
+ return obj.duration # If duration is stored in the database, return it directly.
74
+
75
+ # Dynamically extract duration if not stored
76
+ video_path = obj.file.path
77
+ cap = cv2.VideoCapture(video_path)
78
+
79
+ if not cap.isOpened():
80
+ return None # Error handling if video can't be opened
81
+
82
+ fps = cap.get(cv2.CAP_PROP_FPS)
83
+ total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
84
+ cap.release()
85
+
86
+ return round(total_frames / fps, 2) if fps > 0 else None # Return duration in seconds
87
+
88
+
89
+ def get_file(self, obj):
90
+ """
91
+ Ensures the file field returns only the relative path, adn also validates it
92
+ """
93
+ if not obj.file:
94
+ return {"error": "No file associated with this entry"}
95
+ #obj.file.name is an attribute of FieldFile that returns the file path as a string and name is not the database attribute, it is an attribute of Django’s FieldFile object that holds the file path as a string.
96
+ if not hasattr(obj.file,'name') or not obj.file.name.strip():
97
+ return {"error": "Invalid file name"}
98
+
99
+ return str(obj.file.name).strip() # Only return the file path, no URL,#obj.file returning a FieldFile object instead of a string
100
+
101
+
102
+ '''The error "muxer does not support non-seekable output"
103
+ happens because MP4 format requires seeking, but FFmpeg does not support writing MP4 directly to a non-seekable stream (like STDOUT).'''
104
+
105
+ def get_full_video_path(self, obj):
106
+ """
107
+ Constructs the absolute file path dynamically.
108
+ - Uses the actual storage directory (`/home/admin/test-data/`)
109
+ """
110
+ if not obj.file:
111
+ return {"error": "No video file associated with this entry"}
112
+
113
+ video_relative_path = str(obj.file.name).strip() # Convert FieldFile to string
114
+ if not video_relative_path:
115
+ return {"error":"Video file path is empty or invalid"} # none might cause, 500 error, Handle edge case where the file name is empty
116
+
117
+ print("-----------------------------------------")
118
+ # pseudo_dir = settings.PSEUDO_DIR
119
+ #print(f"Using pseudo directory: {pseudo_dir}")
120
+
121
+ # full path using the actual storage directory~
122
+ #actual_storage_dir = Path("~/test-data") # need to change
123
+ actual_storage_dir = Path("/home/admin/test-data") # need to change
124
+ #actual_storage_dir = pseudo_dir
125
+ full_path = actual_storage_dir / video_relative_path
126
+ #full_path = Path("/home/admin/test-data/video/lux-gastro-video.mp4")
127
+
128
+
129
+ return str(full_path) if full_path.exists() else {"error":f"file not found at: {full_path}"}
130
+
131
+ '''
132
+ ffmpeg_command = [
133
+ "ffmpeg", "-i", str(full_path), # Input video
134
+ "-vf", "drawtext=text='OUTSIDE':fontcolor=white:fontsize=24:x=(w-text_w)/2:y=30:enable='lt(t,10)'",
135
+ "-c:v", "libx264", "-preset", "ultrafast", # Encode quickly for streaming
136
+ "-f", "mp4", "-" # Output to STDOUT (no file saving)
137
+ ]'''
138
+ '''ffmpeg_command = [
139
+ "ffmpeg", "-i", str(full_path), # Input video
140
+ "-vf", "drawtext=text='OUTSIDE':fontcolor=white:fontsize=24:x=(w-text_w)/2:y=30:enable='lt(t,10)'",
141
+ "-c:v", "libx264", "-preset", "ultrafast",
142
+ "-f", "mpegts", "pipe:1" # Output as MPEG-TS to STDOUT
143
+ ]'''
144
+
145
+ def get_sequences(self, obj):
146
+ """
147
+ Extracts the sequences field from the RawVideoFile model.
148
+ Example Output:
149
+ {
150
+ "outside": [[1, 32], [123, 200]],
151
+ "needle": [[36, 141]],
152
+ "kolonpolyp": [[91, 126]]
153
+ }
154
+ """
155
+ return obj.sequences or {"error":"no sequence found, check database first"} # Get from sequences, return {} if missing
156
+
157
+ def get_label_names(self, obj):
158
+ """
159
+ Extracts only label names from the sequences data.
160
+ Example Output:
161
+ ["outside", "needle", "kolonpolyp"]
162
+ """
163
+ sequences = self.get_sequences(obj)
164
+ return list(sequences.keys()) if sequences else []
165
+
166
+
167
+ def get_label_time_segments(self, obj):
168
+ """
169
+ Converts frame sequences of a selected label into time segments in seconds.
170
+ Also retrieves frame-wise predictions for the given label.
171
+
172
+ Includes:
173
+ - Frame index
174
+ - Corresponding frame filename (frame_0000001.jpg)
175
+ - Full frame file path for frontend access
176
+ - segment_start and segment_end (in frame index format, not divided by FPS)
177
+ """
178
+
179
+ fps = obj.fps if hasattr(obj, "fps") and obj.fps is not None else obj.get_fps() if hasattr(obj, "get_fps") and obj.get_fps() is not None else 50
180
+
181
+ print("here is fps::::::::::::::::::.-----------::::::",fps)
182
+ sequences = self.get_sequences(obj) # Fetch sequence data
183
+ readable_predictions = obj.readable_predictions # Predictions from DB
184
+
185
+ if not isinstance(readable_predictions, list):
186
+ return {"error": "Invalid prediction data format. Expected a list."}
187
+
188
+ frame_dir = Path(obj.frame_dir) # Get the correct directory from the model
189
+
190
+ time_segments = {} # Dictionary to store converted times and frame predictions
191
+
192
+ for label, frame_ranges in sequences.items():
193
+ label_times = [] # Stores time segments
194
+ frame_predictions = {} # Ensure frame_predictions is properly initialized for each label
195
+
196
+ for frame_range in frame_ranges:
197
+ if len(frame_range) != 2:
198
+ continue # Skip invalid frame ranges
199
+
200
+ start_frame, end_frame = frame_range # Raw frame indices from DB
201
+ start_time = start_frame / fps # Convert frame index to seconds
202
+ end_time = end_frame / fps # Convert frame index to seconds
203
+
204
+ frame_data = {} # Store frame-wise info
205
+
206
+ # Fetch predictions for frames within this range
207
+ for frame_num in range(start_frame, end_frame + 1):
208
+ if 0 <= frame_num < len(readable_predictions): # Ensure index is valid
209
+ frame_filename = f"frame_{str(frame_num).zfill(7)}.jpg" # Frame filename format
210
+ frame_path = frame_dir / frame_filename # Full path to the frame
211
+
212
+ frame_data[frame_num] = {
213
+ "frame_filename": frame_filename,
214
+ "frame_file_path": str(frame_path),
215
+ "predictions": readable_predictions[frame_num]
216
+ }
217
+
218
+ # Store frame-wise predictions in frame_predictions
219
+ frame_predictions[frame_num] = readable_predictions[frame_num]
220
+
221
+ # Append the converted time segment
222
+ label_times.append({
223
+ "segment_start": start_frame, # Raw start frame (not divided by FPS)
224
+ "segment_end": end_frame, # Raw end frame (not divided by FPS)
225
+ "start_time": round(start_time, 2), # Converted start time in seconds
226
+ "end_time": round(end_time, 2), # Converted end time in seconds
227
+ "frames": frame_data # Attach frame details
228
+ })
229
+
230
+ # Store time segments and frame_predictions under the label
231
+ time_segments[label] = {
232
+ "time_ranges": label_times,
233
+ "frame_predictions": frame_predictions # Ensure frame_predictions is correctly assigned
234
+ }
235
+
236
+ return time_segments
237
+
238
+ class VideoListSerializer(serializers.ModelSerializer):
239
+ """
240
+ Minimal serializer to return only `id` and `original_file_name`
241
+ for the video selection dropdown in Vue.js.
242
+ """
243
+ class Meta:
244
+ model = RawVideoFile
245
+ fields = ['id', 'original_file_name'] # Only fetch required fields
246
+
247
+
248
+
249
+ from pathlib import Path
250
+ from rest_framework import serializers
251
+ from django.http import FileResponse, Http404, StreamingHttpResponse
252
+ from ..models import RawVideoFile, Label, LabelRawVideoSegment # Importing necessary models
253
+ import subprocess
254
+ from django.conf import settings
255
+ from django.db.models import Q # Import Q for better querying
256
+
257
+
258
+ class LabelSerializer(serializers.ModelSerializer):
259
+ """
260
+ Serializer for fetching labels from the `endoreg_db_label` table.
261
+ Includes `id` (for backend processing) and `name` (for dropdown display in Vue.js).
262
+ """
263
+ class Meta:
264
+ model = Label
265
+ fields = ['id', 'name']
266
+
267
+
268
+ class LabelSegmentSerializer(serializers.ModelSerializer):
269
+ """
270
+ Serializer for retrieving label segments from `endoreg_db_labelrawvideosegment`.
271
+ """
272
+ class Meta:
273
+ model = LabelRawVideoSegment
274
+ fields = ['id', 'video_id', 'label_id', 'start_frame_number', 'end_frame_number']
275
+
276
+
277
+ from django.db import transaction
278
+
279
+ from django.db import transaction
280
+
281
+ class LabelSegmentUpdateSerializer(serializers.Serializer):
282
+ """
283
+ Serializer for updating label segments.
284
+
285
+ - Ensures that the segments stored in the database match exactly with what is sent from the frontend.
286
+ - Updates existing segments if their `start_frame_number` matches but `end_frame_number` has changed.
287
+ - Inserts new segments if they are not already present in the database.
288
+ - Deletes extra segments from the database if they are no longer in the frontend data.
289
+ """
290
+
291
+ video_id = serializers.IntegerField()
292
+ label_id = serializers.IntegerField()
293
+ segments = serializers.ListField(
294
+ child=serializers.DictField(
295
+ child=serializers.FloatField() # Ensure we handle float values
296
+ )
297
+ )
298
+
299
+ def validate(self, data):
300
+ """
301
+ Validates that all required segment fields are provided correctly.
302
+
303
+ - Ensures that each segment contains `start_frame_number` and `end_frame_number`.
304
+ - Validates that `start_frame_number` is always less than or equal to `end_frame_number`.
305
+ """
306
+ if not data.get("segments"):
307
+ raise serializers.ValidationError("No segments provided.")
308
+
309
+ for segment in data["segments"]:
310
+ if "start_frame_number" not in segment or "end_frame_number" not in segment:
311
+ raise serializers.ValidationError("Each segment must have `start_frame_number` and `end_frame_number`.")
312
+
313
+ if segment["start_frame_number"] > segment["end_frame_number"]:
314
+ raise serializers.ValidationError("Start frame must be less than or equal to end frame.")
315
+
316
+ return data
317
+
318
+ def save(self):
319
+ """
320
+ Updates, inserts, and deletes label segments to ensure database consistency.
321
+
322
+ Steps:
323
+ 1. Fetch all existing segments for the given `video_id` and `label_id`.
324
+ 2. Compare existing segments with the new ones from the frontend.
325
+ 3. Update segments where `start_frame_number` exists but `end_frame_number` has changed.
326
+ 4. Insert new segments that are not already in the database.
327
+ 5. Delete segments that exist in the database but are missing from the frontend data.
328
+ """
329
+
330
+ video_id = self.validated_data["video_id"]
331
+ label_id = self.validated_data["label_id"]
332
+ new_segments = self.validated_data["segments"]
333
+
334
+ # Fetch all existing segments for this video and label from the database
335
+ existing_segments = LabelRawVideoSegment.objects.filter(video_id=video_id, label_id=label_id)
336
+
337
+ # Convert existing segments into a dictionary for quick lookup
338
+ # Key format: (start_frame_number, end_frame_number)
339
+ existing_segments_dict = {(float(seg.start_frame_number), float(seg.end_frame_number)): seg for seg in existing_segments}
340
+
341
+ # Prepare lists for batch processing
342
+ updated_segments = [] # Stores segments that need to be updated
343
+ new_entries = [] # Stores segments that need to be created
344
+ existing_keys = set(existing_segments_dict.keys()) # Existing database segment keys
345
+ new_keys = set((float(seg["start_frame_number"]), float(seg["end_frame_number"])) for seg in new_segments) # New frontend segment keys
346
+
347
+ # Start a transaction to ensure database consistency
348
+ with transaction.atomic():
349
+ for segment in new_segments:
350
+ start_frame = float(segment["start_frame_number"])
351
+ end_frame = float(segment["end_frame_number"])
352
+
353
+ if (start_frame, end_frame) in existing_keys:
354
+ # If segment with exact start_frame and end_frame already exists, no change is needed
355
+ continue
356
+ else:
357
+ # Check if a segment exists with the same start_frame but different end_frame
358
+ existing_segment = LabelRawVideoSegment.objects.filter(
359
+ video_id=video_id,
360
+ label_id=label_id,
361
+ start_frame_number=start_frame
362
+ ).first()
363
+
364
+ if existing_segment:
365
+ # If a segment with the same start_frame exists but the end_frame is different, update it
366
+ if float(existing_segment.end_frame_number) != end_frame:
367
+ existing_segment.end_frame_number = end_frame
368
+ existing_segment.save()
369
+ updated_segments.append(existing_segment)
370
+ else:
371
+ # If no existing segment matches, create a new one
372
+ new_entries.append(LabelRawVideoSegment(
373
+ video_id=video_id,
374
+ label_id=label_id,
375
+ start_frame_number=start_frame,
376
+ end_frame_number=end_frame
377
+ ))
378
+
379
+ # Delete segments that are no longer present in the frontend data
380
+ segments_to_delete = existing_segments.exclude(
381
+ start_frame_number__in=[float(seg["start_frame_number"]) for seg in new_segments]
382
+ )
383
+ deleted_count = segments_to_delete.count()
384
+ segments_to_delete.delete()
385
+
386
+ # Insert new segments in bulk for efficiency
387
+ if new_entries:
388
+ LabelRawVideoSegment.objects.bulk_create(new_entries)
389
+
390
+ # Return the updated, new, and deleted segment information
391
+ print("------------------------------,",updated_segments,"-----------------------",new_segments,"_-------",deleted_count)
392
+ return {
393
+ "updated_segments": LabelSegmentSerializer(updated_segments, many=True).data,
394
+ "new_segments": LabelSegmentSerializer(new_entries, many=True).data,
395
+ "deleted_segments": deleted_count
396
+ }
397
+
398
+
399
+
400
+
401
+
402
+
403
+
404
+ # Use StreamingHttpResponse to stream FFmpeg output to browser
405
+ #return StreamingHttpResponse(subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE).stdout, content_type="video/mp4")
406
+
407
+ # Ensure the path exists before returning
408
+ # return str(full_path) if full_path.exists() else None
409
+
410
+ ''' def get_classification_data(self, obj):
411
+ """
412
+ Returns binary classification data in a **scalable** way.
413
+ Currently hardcoded for testing, but can later integrate a model.
414
+ """
415
+ classifications = [
416
+ {
417
+ "label": "OUTSIDE",
418
+ "start_time": 0.1,
419
+ "end_time": 19,
420
+ "confidence": 0.85, # Hardcoded but has to - dynamically computed
421
+ },
422
+
423
+ {
424
+ "label": "Needle",
425
+ "start_time": 36,
426
+ "end_time": 141,
427
+ "confidence": 0.95, # Hardcoded but has to - dynamically computed
428
+ },
429
+ {
430
+ "label": "Kolonpolyp",
431
+ "start_time": 91,
432
+ "end_time": 126,
433
+ "confidence": 0.89, # Hardcoded but has to - dynamically computed
434
+ }
435
+ ]
436
+
437
+ return classifications'''
438
+
439
+
440
+
441
+
442
+
443
+
444
+ """
445
+ await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
446
+ const videoId = 1;
447
+ axios.get(`http://localhost:8000/api/video/${videoId}/`, {
448
+ headers: {
449
+ 'Accept': 'application/json' }
450
+ })
451
+ .then(response => {
452
+ console.log("Video Metadata:", response.data);
453
+
454
+ const videoUrl = response.data.video_url;
455
+
456
+ const videoElement = document.createElement("video");
457
+ videoElement.src = videoUrl;
458
+ videoElement.controls = true;
459
+ videoElement.width = 600;
460
+ document.body.appendChild(videoElement);
461
+ })
462
+ .catch(error => {
463
+ console.error("Error Fetching Video:", error.response ? error.response.data : error);
464
+ });
465
+
466
+ await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
467
+
468
+ const videoIdUpdate = 1; // Change to actual video ID
469
+ const labelIdUpdate = 15; // Change to actual label ID
470
+
471
+ const updatedSegments = {
472
+ video_id: videoIdUpdate,
473
+ label_id: labelIdUpdate,
474
+ segments: [
475
+ { start_frame_number: 1, end_frame_number: 15 } // Updated end_frame (was 10)
476
+ // New segment
477
+ ]
478
+ };
479
+
480
+ axios.put(`http://localhost:8000/api/video/${videoIdUpdate}/label/${labelIdUpdate}/update_segments/`, updatedSegments, {
481
+ headers: {
482
+ 'Accept': 'application/json',
483
+ 'Content-Type': 'application/json'
484
+ }
485
+ })
486
+ .then(response => {
487
+ console.log(" Segments Updated Successfully:", response.data);
488
+ })
489
+ .catch(error => {
490
+ console.error(" Error Updating Segments:", error.response ? error.response.data : error);
491
+ });
492
+ """''