endoreg-db 0.8.9.2__py3-none-any.whl → 0.8.9.10__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 (450) hide show
  1. endoreg_db/admin.py +10 -5
  2. endoreg_db/apps.py +4 -7
  3. endoreg_db/authz/auth.py +1 -0
  4. endoreg_db/authz/backends.py +1 -1
  5. endoreg_db/authz/management/commands/list_routes.py +2 -0
  6. endoreg_db/authz/middleware.py +8 -7
  7. endoreg_db/authz/permissions.py +21 -10
  8. endoreg_db/authz/policy.py +14 -19
  9. endoreg_db/authz/views_auth.py +14 -10
  10. endoreg_db/codemods/rename_datetime_fields.py +8 -1
  11. endoreg_db/exceptions.py +5 -2
  12. endoreg_db/forms/__init__.py +0 -1
  13. endoreg_db/forms/examination_form.py +4 -3
  14. endoreg_db/forms/patient_finding_intervention_form.py +30 -8
  15. endoreg_db/forms/patient_form.py +9 -13
  16. endoreg_db/forms/questionnaires/__init__.py +1 -1
  17. endoreg_db/forms/settings/__init__.py +4 -1
  18. endoreg_db/forms/unit.py +2 -1
  19. endoreg_db/helpers/count_db.py +17 -14
  20. endoreg_db/helpers/default_objects.py +2 -1
  21. endoreg_db/helpers/download_segmentation_model.py +4 -3
  22. endoreg_db/helpers/interact.py +0 -5
  23. endoreg_db/helpers/test_video_helper.py +33 -25
  24. endoreg_db/import_files/__init__.py +1 -1
  25. endoreg_db/import_files/context/__init__.py +1 -1
  26. endoreg_db/import_files/context/default_sensitive_meta.py +11 -9
  27. endoreg_db/import_files/context/ensure_center.py +4 -4
  28. endoreg_db/import_files/context/file_lock.py +3 -3
  29. endoreg_db/import_files/context/import_context.py +11 -12
  30. endoreg_db/import_files/context/validate_directories.py +1 -0
  31. endoreg_db/import_files/file_storage/create_report_file.py +57 -34
  32. endoreg_db/import_files/file_storage/create_video_file.py +64 -35
  33. endoreg_db/import_files/file_storage/sensitive_meta_storage.py +5 -2
  34. endoreg_db/import_files/file_storage/state_management.py +89 -122
  35. endoreg_db/import_files/file_storage/storage.py +5 -1
  36. endoreg_db/import_files/processing/report_processing/report_anonymization.py +24 -19
  37. endoreg_db/import_files/processing/sensitive_meta_adapter.py +3 -3
  38. endoreg_db/import_files/processing/video_processing/video_anonymization.py +18 -18
  39. endoreg_db/import_files/pseudonymization/k_anonymity.py +8 -9
  40. endoreg_db/import_files/pseudonymization/k_pseudonymity.py +16 -5
  41. endoreg_db/import_files/report_import_service.py +36 -30
  42. endoreg_db/import_files/video_import_service.py +27 -23
  43. endoreg_db/logger_conf.py +56 -40
  44. endoreg_db/management/__init__.py +1 -1
  45. endoreg_db/management/commands/__init__.py +1 -1
  46. endoreg_db/management/commands/check_auth.py +45 -38
  47. endoreg_db/management/commands/create_model_meta_from_huggingface.py +53 -2
  48. endoreg_db/management/commands/create_multilabel_model_meta.py +54 -19
  49. endoreg_db/management/commands/fix_missing_patient_data.py +105 -71
  50. endoreg_db/management/commands/fix_video_paths.py +75 -54
  51. endoreg_db/management/commands/import_report.py +1 -3
  52. endoreg_db/management/commands/list_routes.py +2 -0
  53. endoreg_db/management/commands/load_ai_model_data.py +8 -2
  54. endoreg_db/management/commands/load_ai_model_label_data.py +0 -1
  55. endoreg_db/management/commands/load_center_data.py +3 -3
  56. endoreg_db/management/commands/load_distribution_data.py +35 -38
  57. endoreg_db/management/commands/load_endoscope_data.py +0 -3
  58. endoreg_db/management/commands/load_examination_data.py +20 -4
  59. endoreg_db/management/commands/load_finding_data.py +18 -3
  60. endoreg_db/management/commands/load_gender_data.py +17 -24
  61. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +95 -85
  62. endoreg_db/management/commands/load_information_source.py +0 -3
  63. endoreg_db/management/commands/load_lab_value_data.py +14 -3
  64. endoreg_db/management/commands/load_legacy_data.py +303 -0
  65. endoreg_db/management/commands/load_name_data.py +1 -2
  66. endoreg_db/management/commands/load_pdf_type_data.py +4 -8
  67. endoreg_db/management/commands/load_profession_data.py +0 -1
  68. endoreg_db/management/commands/load_report_reader_flag_data.py +0 -4
  69. endoreg_db/management/commands/load_requirement_data.py +6 -2
  70. endoreg_db/management/commands/load_unit_data.py +0 -4
  71. endoreg_db/management/commands/load_user_groups.py +5 -7
  72. endoreg_db/management/commands/model_input.py +169 -0
  73. endoreg_db/management/commands/register_ai_model.py +22 -16
  74. endoreg_db/management/commands/setup_endoreg_db.py +110 -32
  75. endoreg_db/management/commands/storage_management.py +14 -8
  76. endoreg_db/management/commands/summarize_db_content.py +154 -63
  77. endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
  78. endoreg_db/management/commands/validate_video_files.py +82 -50
  79. endoreg_db/management/commands/video_validation.py +4 -6
  80. endoreg_db/migrations/0001_initial.py +112 -63
  81. endoreg_db/models/__init__.py +8 -0
  82. endoreg_db/models/administration/ai/active_model.py +5 -5
  83. endoreg_db/models/administration/ai/ai_model.py +41 -18
  84. endoreg_db/models/administration/ai/model_type.py +1 -0
  85. endoreg_db/models/administration/case/case.py +22 -22
  86. endoreg_db/models/administration/center/__init__.py +5 -5
  87. endoreg_db/models/administration/center/center.py +6 -2
  88. endoreg_db/models/administration/center/center_resource.py +18 -4
  89. endoreg_db/models/administration/center/center_shift.py +3 -1
  90. endoreg_db/models/administration/center/center_waste.py +6 -2
  91. endoreg_db/models/administration/person/__init__.py +1 -1
  92. endoreg_db/models/administration/person/employee/__init__.py +1 -1
  93. endoreg_db/models/administration/person/employee/employee_type.py +3 -1
  94. endoreg_db/models/administration/person/examiner/__init__.py +1 -1
  95. endoreg_db/models/administration/person/examiner/examiner.py +10 -2
  96. endoreg_db/models/administration/person/names/first_name.py +6 -4
  97. endoreg_db/models/administration/person/names/last_name.py +4 -3
  98. endoreg_db/models/administration/person/patient/__init__.py +1 -1
  99. endoreg_db/models/administration/person/patient/patient.py +0 -1
  100. endoreg_db/models/administration/person/patient/patient_external_id.py +0 -1
  101. endoreg_db/models/administration/person/person.py +1 -1
  102. endoreg_db/models/administration/product/__init__.py +7 -6
  103. endoreg_db/models/administration/product/product.py +6 -2
  104. endoreg_db/models/administration/product/product_group.py +9 -7
  105. endoreg_db/models/administration/product/product_material.py +9 -2
  106. endoreg_db/models/administration/product/reference_product.py +64 -15
  107. endoreg_db/models/administration/qualification/qualification.py +3 -1
  108. endoreg_db/models/administration/shift/shift.py +3 -1
  109. endoreg_db/models/administration/shift/shift_type.py +12 -4
  110. endoreg_db/models/aidataset/__init__.py +5 -0
  111. endoreg_db/models/aidataset/aidataset.py +193 -0
  112. endoreg_db/models/label/__init__.py +1 -1
  113. endoreg_db/models/label/label.py +10 -2
  114. endoreg_db/models/label/label_set.py +3 -1
  115. endoreg_db/models/label/label_video_segment/_create_from_video.py +6 -2
  116. endoreg_db/models/label/label_video_segment/label_video_segment.py +148 -44
  117. endoreg_db/models/media/__init__.py +12 -5
  118. endoreg_db/models/media/frame/__init__.py +1 -1
  119. endoreg_db/models/media/frame/frame.py +34 -8
  120. endoreg_db/models/media/pdf/__init__.py +2 -1
  121. endoreg_db/models/media/pdf/raw_pdf.py +11 -4
  122. endoreg_db/models/media/pdf/report_file.py +6 -2
  123. endoreg_db/models/media/pdf/report_reader/__init__.py +3 -3
  124. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +15 -5
  125. endoreg_db/models/media/video/create_from_file.py +20 -41
  126. endoreg_db/models/media/video/pipe_1.py +75 -30
  127. endoreg_db/models/media/video/pipe_2.py +37 -12
  128. endoreg_db/models/media/video/video_file.py +36 -24
  129. endoreg_db/models/media/video/video_file_ai.py +235 -70
  130. endoreg_db/models/media/video/video_file_anonymize.py +240 -65
  131. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -1
  132. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +3 -1
  133. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +30 -9
  134. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +95 -29
  135. endoreg_db/models/media/video/video_file_frames/_get_frame.py +13 -3
  136. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -1
  137. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +15 -3
  138. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +15 -3
  139. endoreg_db/models/media/video/video_file_frames/_get_frames.py +7 -2
  140. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +109 -23
  141. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +111 -27
  142. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +46 -13
  143. endoreg_db/models/media/video/video_file_io.py +85 -33
  144. endoreg_db/models/media/video/video_file_meta/__init__.py +6 -6
  145. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +17 -4
  146. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +28 -7
  147. endoreg_db/models/media/video/video_file_meta/get_fps.py +46 -13
  148. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +81 -20
  149. endoreg_db/models/media/video/video_file_meta/text_meta.py +61 -20
  150. endoreg_db/models/media/video/video_file_meta/video_meta.py +40 -12
  151. endoreg_db/models/media/video/video_file_segments.py +118 -27
  152. endoreg_db/models/media/video/video_metadata.py +25 -6
  153. endoreg_db/models/media/video/video_processing.py +54 -15
  154. endoreg_db/models/medical/__init__.py +3 -13
  155. endoreg_db/models/medical/contraindication/__init__.py +3 -1
  156. endoreg_db/models/medical/disease.py +18 -6
  157. endoreg_db/models/medical/event.py +6 -2
  158. endoreg_db/models/medical/examination/__init__.py +5 -1
  159. endoreg_db/models/medical/examination/examination.py +22 -6
  160. endoreg_db/models/medical/examination/examination_indication.py +23 -7
  161. endoreg_db/models/medical/examination/examination_time.py +6 -2
  162. endoreg_db/models/medical/finding/__init__.py +3 -1
  163. endoreg_db/models/medical/finding/finding.py +37 -12
  164. endoreg_db/models/medical/finding/finding_classification.py +27 -8
  165. endoreg_db/models/medical/finding/finding_intervention.py +19 -6
  166. endoreg_db/models/medical/finding/finding_type.py +3 -1
  167. endoreg_db/models/medical/hardware/__init__.py +1 -1
  168. endoreg_db/models/medical/hardware/endoscope.py +14 -2
  169. endoreg_db/models/medical/laboratory/__init__.py +1 -1
  170. endoreg_db/models/medical/laboratory/lab_value.py +139 -39
  171. endoreg_db/models/medical/medication/__init__.py +7 -3
  172. endoreg_db/models/medical/medication/medication.py +3 -1
  173. endoreg_db/models/medical/medication/medication_indication.py +3 -1
  174. endoreg_db/models/medical/medication/medication_indication_type.py +11 -3
  175. endoreg_db/models/medical/medication/medication_intake_time.py +3 -1
  176. endoreg_db/models/medical/medication/medication_schedule.py +3 -1
  177. endoreg_db/models/medical/patient/__init__.py +2 -10
  178. endoreg_db/models/medical/patient/medication_examples.py +3 -14
  179. endoreg_db/models/medical/patient/patient_disease.py +17 -5
  180. endoreg_db/models/medical/patient/patient_event.py +12 -4
  181. endoreg_db/models/medical/patient/patient_examination.py +52 -15
  182. endoreg_db/models/medical/patient/patient_examination_indication.py +15 -4
  183. endoreg_db/models/medical/patient/patient_finding.py +105 -29
  184. endoreg_db/models/medical/patient/patient_finding_classification.py +41 -12
  185. endoreg_db/models/medical/patient/patient_finding_intervention.py +11 -3
  186. endoreg_db/models/medical/patient/patient_lab_sample.py +6 -2
  187. endoreg_db/models/medical/patient/patient_lab_value.py +42 -10
  188. endoreg_db/models/medical/patient/patient_medication.py +25 -7
  189. endoreg_db/models/medical/patient/patient_medication_schedule.py +34 -10
  190. endoreg_db/models/metadata/model_meta.py +40 -12
  191. endoreg_db/models/metadata/model_meta_logic.py +51 -16
  192. endoreg_db/models/metadata/sensitive_meta.py +65 -28
  193. endoreg_db/models/metadata/sensitive_meta_logic.py +28 -26
  194. endoreg_db/models/metadata/video_meta.py +146 -39
  195. endoreg_db/models/metadata/video_prediction_logic.py +70 -21
  196. endoreg_db/models/metadata/video_prediction_meta.py +80 -27
  197. endoreg_db/models/operation_log.py +63 -0
  198. endoreg_db/models/other/__init__.py +10 -10
  199. endoreg_db/models/other/distribution/__init__.py +9 -7
  200. endoreg_db/models/other/distribution/base_value_distribution.py +3 -1
  201. endoreg_db/models/other/distribution/date_value_distribution.py +19 -5
  202. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +3 -1
  203. endoreg_db/models/other/distribution/numeric_value_distribution.py +34 -9
  204. endoreg_db/models/other/emission/__init__.py +1 -1
  205. endoreg_db/models/other/emission/emission_factor.py +9 -3
  206. endoreg_db/models/other/information_source.py +15 -5
  207. endoreg_db/models/other/material.py +3 -1
  208. endoreg_db/models/other/transport_route.py +3 -1
  209. endoreg_db/models/other/unit.py +6 -2
  210. endoreg_db/models/report/report.py +0 -1
  211. endoreg_db/models/requirement/requirement.py +84 -27
  212. endoreg_db/models/requirement/requirement_error.py +5 -6
  213. endoreg_db/models/requirement/requirement_evaluation/__init__.py +1 -1
  214. endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +8 -8
  215. endoreg_db/models/requirement/requirement_evaluation/get_values.py +3 -3
  216. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +24 -8
  217. endoreg_db/models/requirement/requirement_operator.py +28 -8
  218. endoreg_db/models/requirement/requirement_set.py +34 -11
  219. endoreg_db/models/state/__init__.py +1 -0
  220. endoreg_db/models/state/audit_ledger.py +9 -2
  221. endoreg_db/models/{media → state}/processing_history/__init__.py +1 -3
  222. endoreg_db/models/state/processing_history/processing_history.py +136 -0
  223. endoreg_db/models/state/raw_pdf.py +0 -1
  224. endoreg_db/models/state/video.py +2 -4
  225. endoreg_db/models/utils.py +4 -2
  226. endoreg_db/queries/__init__.py +2 -6
  227. endoreg_db/queries/annotations/__init__.py +1 -3
  228. endoreg_db/queries/annotations/legacy.py +37 -26
  229. endoreg_db/root_urls.py +3 -4
  230. endoreg_db/schemas/examination_evaluation.py +3 -0
  231. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +249 -163
  232. endoreg_db/serializers/__init__.py +2 -8
  233. endoreg_db/serializers/administration/__init__.py +1 -2
  234. endoreg_db/serializers/administration/ai/__init__.py +0 -1
  235. endoreg_db/serializers/administration/ai/active_model.py +3 -1
  236. endoreg_db/serializers/administration/ai/ai_model.py +5 -3
  237. endoreg_db/serializers/administration/ai/model_type.py +3 -1
  238. endoreg_db/serializers/administration/center.py +7 -2
  239. endoreg_db/serializers/administration/gender.py +4 -2
  240. endoreg_db/serializers/anonymization.py +13 -13
  241. endoreg_db/serializers/evaluation/examination_evaluation.py +0 -1
  242. endoreg_db/serializers/examination/__init__.py +1 -1
  243. endoreg_db/serializers/examination/base.py +12 -13
  244. endoreg_db/serializers/examination/dropdown.py +6 -7
  245. endoreg_db/serializers/examination_serializer.py +3 -6
  246. endoreg_db/serializers/finding/__init__.py +1 -1
  247. endoreg_db/serializers/finding/finding.py +14 -7
  248. endoreg_db/serializers/finding_classification/__init__.py +3 -3
  249. endoreg_db/serializers/finding_classification/choice.py +3 -3
  250. endoreg_db/serializers/finding_classification/classification.py +2 -4
  251. endoreg_db/serializers/label_video_segment/__init__.py +5 -3
  252. endoreg_db/serializers/{label → label_video_segment}/image_classification_annotation.py +5 -5
  253. endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
  254. endoreg_db/serializers/{label → label_video_segment/label}/label.py +1 -1
  255. endoreg_db/serializers/label_video_segment/label_video_segment.py +338 -228
  256. endoreg_db/serializers/meta/__init__.py +1 -2
  257. endoreg_db/serializers/meta/sensitive_meta_detail.py +28 -13
  258. endoreg_db/serializers/meta/sensitive_meta_update.py +51 -46
  259. endoreg_db/serializers/meta/sensitive_meta_verification.py +19 -16
  260. endoreg_db/serializers/misc/__init__.py +2 -2
  261. endoreg_db/serializers/misc/file_overview.py +11 -7
  262. endoreg_db/serializers/misc/stats.py +10 -8
  263. endoreg_db/serializers/misc/translatable_field_mix_in.py +6 -6
  264. endoreg_db/serializers/misc/upload_job.py +32 -29
  265. endoreg_db/serializers/patient/__init__.py +2 -1
  266. endoreg_db/serializers/patient/patient.py +32 -15
  267. endoreg_db/serializers/patient/patient_dropdown.py +11 -3
  268. endoreg_db/serializers/patient_examination/__init__.py +1 -1
  269. endoreg_db/serializers/patient_examination/patient_examination.py +67 -40
  270. endoreg_db/serializers/patient_finding/__init__.py +1 -1
  271. endoreg_db/serializers/patient_finding/patient_finding.py +2 -1
  272. endoreg_db/serializers/patient_finding/patient_finding_classification.py +17 -9
  273. endoreg_db/serializers/patient_finding/patient_finding_detail.py +26 -17
  274. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +7 -5
  275. endoreg_db/serializers/patient_finding/patient_finding_list.py +10 -11
  276. endoreg_db/serializers/patient_finding/patient_finding_write.py +36 -27
  277. endoreg_db/serializers/pdf/__init__.py +1 -3
  278. endoreg_db/serializers/requirements/requirement_schema.py +1 -6
  279. endoreg_db/serializers/sensitive_meta_serializer.py +100 -81
  280. endoreg_db/serializers/video/__init__.py +2 -2
  281. endoreg_db/serializers/video/{segmentation.py → video_file.py} +66 -47
  282. endoreg_db/serializers/video/video_file_brief.py +6 -2
  283. endoreg_db/serializers/video/video_file_detail.py +36 -23
  284. endoreg_db/serializers/video/video_file_list.py +4 -2
  285. endoreg_db/serializers/video/video_processing_history.py +54 -50
  286. endoreg_db/services/__init__.py +1 -1
  287. endoreg_db/services/anonymization.py +2 -2
  288. endoreg_db/services/examination_evaluation.py +40 -17
  289. endoreg_db/services/model_meta_from_hf.py +76 -0
  290. endoreg_db/services/polling_coordinator.py +101 -70
  291. endoreg_db/services/pseudonym_service.py +27 -22
  292. endoreg_db/services/report_import.py +6 -3
  293. endoreg_db/services/segment_sync.py +75 -59
  294. endoreg_db/services/video_import.py +6 -7
  295. endoreg_db/urls/__init__.py +2 -2
  296. endoreg_db/urls/ai.py +7 -25
  297. endoreg_db/urls/anonymization.py +61 -15
  298. endoreg_db/urls/auth.py +4 -4
  299. endoreg_db/urls/classification.py +4 -9
  300. endoreg_db/urls/examination.py +27 -18
  301. endoreg_db/urls/media.py +27 -34
  302. endoreg_db/urls/patient.py +11 -7
  303. endoreg_db/urls/requirements.py +3 -1
  304. endoreg_db/urls/root_urls.py +2 -3
  305. endoreg_db/urls/stats.py +24 -16
  306. endoreg_db/urls/upload.py +3 -11
  307. endoreg_db/utils/__init__.py +14 -15
  308. endoreg_db/utils/ai/__init__.py +1 -1
  309. endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
  310. endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
  311. endoreg_db/utils/ai/get.py +2 -1
  312. endoreg_db/utils/ai/inference_dataset.py +14 -15
  313. endoreg_db/utils/ai/model_training/config.py +117 -0
  314. endoreg_db/utils/ai/model_training/dataset.py +74 -0
  315. endoreg_db/utils/ai/model_training/losses.py +68 -0
  316. endoreg_db/utils/ai/model_training/metrics.py +78 -0
  317. endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
  318. endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
  319. endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
  320. endoreg_db/utils/ai/multilabel_classification_net.py +21 -6
  321. endoreg_db/utils/ai/predict.py +4 -4
  322. endoreg_db/utils/ai/preprocess.py +19 -11
  323. endoreg_db/utils/calc_duration_seconds.py +4 -4
  324. endoreg_db/utils/case_generator/lab_sample_factory.py +3 -4
  325. endoreg_db/utils/check_video_files.py +74 -47
  326. endoreg_db/utils/cropping.py +10 -9
  327. endoreg_db/utils/dataloader.py +11 -3
  328. endoreg_db/utils/dates.py +3 -4
  329. endoreg_db/utils/defaults/set_default_center.py +7 -6
  330. endoreg_db/utils/env.py +6 -2
  331. endoreg_db/utils/extract_specific_frames.py +24 -9
  332. endoreg_db/utils/file_operations.py +30 -18
  333. endoreg_db/utils/fix_video_path_direct.py +57 -41
  334. endoreg_db/utils/frame_anonymization_utils.py +157 -157
  335. endoreg_db/utils/hashs.py +3 -18
  336. endoreg_db/utils/links/requirement_link.py +96 -52
  337. endoreg_db/utils/ocr.py +30 -25
  338. endoreg_db/utils/operation_log.py +61 -0
  339. endoreg_db/utils/parse_and_generate_yaml.py +12 -13
  340. endoreg_db/utils/paths.py +6 -6
  341. endoreg_db/utils/permissions.py +40 -24
  342. endoreg_db/utils/pipelines/process_video_dir.py +50 -26
  343. endoreg_db/utils/product/sum_emissions.py +5 -3
  344. endoreg_db/utils/product/sum_weights.py +4 -2
  345. endoreg_db/utils/pydantic_models/__init__.py +3 -4
  346. endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +207 -107
  347. endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +252 -65
  348. endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +27 -10
  349. endoreg_db/utils/setup_config.py +21 -5
  350. endoreg_db/utils/storage.py +3 -1
  351. endoreg_db/utils/translation.py +19 -15
  352. endoreg_db/utils/uuid.py +1 -0
  353. endoreg_db/utils/validate_endo_roi.py +12 -4
  354. endoreg_db/utils/validate_subcategory_dict.py +26 -24
  355. endoreg_db/utils/validate_video_detailed.py +207 -149
  356. endoreg_db/utils/video/__init__.py +7 -3
  357. endoreg_db/utils/video/extract_frames.py +30 -18
  358. endoreg_db/utils/video/names.py +11 -6
  359. endoreg_db/utils/video/streaming_processor.py +175 -101
  360. endoreg_db/utils/video/video_splitter.py +30 -19
  361. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +59 -50
  362. endoreg_db/views/__init__.py +0 -20
  363. endoreg_db/views/anonymization/__init__.py +6 -2
  364. endoreg_db/views/anonymization/media_management.py +2 -6
  365. endoreg_db/views/anonymization/overview.py +34 -1
  366. endoreg_db/views/anonymization/validate.py +79 -18
  367. endoreg_db/views/auth/__init__.py +1 -1
  368. endoreg_db/views/auth/keycloak.py +16 -14
  369. endoreg_db/views/examination/__init__.py +12 -15
  370. endoreg_db/views/examination/examination.py +5 -5
  371. endoreg_db/views/examination/examination_manifest_cache.py +5 -5
  372. endoreg_db/views/examination/get_finding_classification_choices.py +8 -5
  373. endoreg_db/views/examination/get_finding_classifications.py +9 -7
  374. endoreg_db/views/examination/get_findings.py +8 -10
  375. endoreg_db/views/examination/get_instruments.py +3 -2
  376. endoreg_db/views/examination/get_interventions.py +1 -1
  377. endoreg_db/views/finding/__init__.py +2 -2
  378. endoreg_db/views/finding/finding.py +58 -54
  379. endoreg_db/views/finding/get_classifications.py +1 -1
  380. endoreg_db/views/finding/get_interventions.py +1 -1
  381. endoreg_db/views/finding_classification/__init__.py +5 -5
  382. endoreg_db/views/finding_classification/finding_classification.py +5 -6
  383. endoreg_db/views/finding_classification/get_classification_choices.py +3 -4
  384. endoreg_db/views/media/__init__.py +13 -13
  385. endoreg_db/views/media/pdf_media.py +9 -9
  386. endoreg_db/views/media/sensitive_metadata.py +10 -7
  387. endoreg_db/views/media/video_media.py +4 -4
  388. endoreg_db/views/meta/__init__.py +1 -1
  389. endoreg_db/views/meta/sensitive_meta_list.py +20 -22
  390. endoreg_db/views/meta/sensitive_meta_verification.py +14 -11
  391. endoreg_db/views/misc/__init__.py +6 -34
  392. endoreg_db/views/misc/center.py +2 -1
  393. endoreg_db/views/misc/csrf.py +2 -1
  394. endoreg_db/views/misc/gender.py +2 -1
  395. endoreg_db/views/misc/stats.py +141 -106
  396. endoreg_db/views/patient/__init__.py +1 -3
  397. endoreg_db/views/patient/patient.py +141 -99
  398. endoreg_db/views/patient_examination/__init__.py +5 -5
  399. endoreg_db/views/patient_examination/patient_examination.py +43 -42
  400. endoreg_db/views/patient_examination/patient_examination_create.py +10 -15
  401. endoreg_db/views/patient_examination/patient_examination_detail.py +12 -15
  402. endoreg_db/views/patient_examination/patient_examination_list.py +21 -17
  403. endoreg_db/views/patient_examination/video.py +114 -80
  404. endoreg_db/views/patient_finding/__init__.py +1 -1
  405. endoreg_db/views/patient_finding/patient_finding.py +17 -10
  406. endoreg_db/views/patient_finding/patient_finding_optimized.py +127 -95
  407. endoreg_db/views/patient_finding_classification/__init__.py +1 -1
  408. endoreg_db/views/patient_finding_classification/pfc_create.py +35 -27
  409. endoreg_db/views/report/reimport.py +1 -1
  410. endoreg_db/views/report/report_stream.py +5 -8
  411. endoreg_db/views/requirement/__init__.py +2 -1
  412. endoreg_db/views/requirement/evaluate.py +7 -9
  413. endoreg_db/views/requirement/lookup.py +2 -3
  414. endoreg_db/views/requirement/lookup_store.py +0 -1
  415. endoreg_db/views/requirement/requirement_utils.py +2 -4
  416. endoreg_db/views/stats/__init__.py +4 -4
  417. endoreg_db/views/stats/stats_views.py +152 -115
  418. endoreg_db/views/video/__init__.py +18 -27
  419. endoreg_db/views/{ai → video/ai}/__init__.py +2 -2
  420. endoreg_db/views/{ai → video/ai}/label.py +20 -16
  421. endoreg_db/views/video/correction.py +5 -6
  422. endoreg_db/views/video/reimport.py +134 -99
  423. endoreg_db/views/video/segments_crud.py +134 -44
  424. endoreg_db/views/video/video_apply_mask.py +13 -12
  425. endoreg_db/views/video/video_correction.py +2 -1
  426. endoreg_db/views/video/video_download_processed.py +15 -15
  427. endoreg_db/views/video/video_meta_stats.py +7 -6
  428. endoreg_db/views/video/video_processing_history.py +3 -2
  429. endoreg_db/views/video/video_remove_frames.py +13 -12
  430. endoreg_db/views/video/video_stream.py +110 -82
  431. {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/METADATA +9 -3
  432. {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/RECORD +434 -431
  433. endoreg_db/management/commands/import_fallback_video.py +0 -203
  434. endoreg_db/management/commands/import_video.py +0 -422
  435. endoreg_db/management/commands/import_video_with_classification.py +0 -367
  436. endoreg_db/models/media/processing_history/processing_history.py +0 -96
  437. endoreg_db/serializers/label/__init__.py +0 -7
  438. endoreg_db/serializers/label_video_segment/_lvs_create.py +0 -149
  439. endoreg_db/serializers/label_video_segment/_lvs_update.py +0 -138
  440. endoreg_db/serializers/label_video_segment/_lvs_validate.py +0 -149
  441. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +0 -99
  442. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +0 -163
  443. endoreg_db/services/__old/pdf_import.py +0 -1487
  444. endoreg_db/services/__old/video_import.py +0 -1306
  445. endoreg_db/tasks/upload_tasks.py +0 -216
  446. endoreg_db/tasks/video_ingest.py +0 -161
  447. endoreg_db/tasks/video_processing_tasks.py +0 -327
  448. endoreg_db/views/misc/translation.py +0 -182
  449. {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/WHEEL +0 -0
  450. {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/licenses/LICENSE +0 -0
@@ -4,20 +4,21 @@ Statistics views for the endoreg_db API.
4
4
  Provides dashboard statistics for the frontend including examination stats,
5
5
  video segment stats, sensitive meta stats, and general overview stats.
6
6
  """
7
+
7
8
  from rest_framework.views import APIView
8
9
  from rest_framework.response import Response
9
10
  from rest_framework import status
10
- from django.db.models import Count, Q
11
+ from django.db.models import Count
11
12
  from django.utils import timezone
12
13
  from datetime import timedelta
13
14
 
14
15
  from ...models import (
15
- VideoFile,
16
- LabelVideoSegment,
17
- SensitiveMeta,
16
+ VideoFile,
17
+ LabelVideoSegment,
18
+ SensitiveMeta,
18
19
  Examination,
19
20
  PatientExamination,
20
- Label
21
+ Label,
21
22
  )
22
23
  from ...utils.permissions import EnvironmentAwarePermission
23
24
 
@@ -25,11 +26,12 @@ from ...utils.permissions import EnvironmentAwarePermission
25
26
  class ExaminationStatsView(APIView):
26
27
  """
27
28
  Statistics about examinations and patient examinations.
28
-
29
+
29
30
  GET /api/examinations/stats/
30
31
  """
32
+
31
33
  permission_classes = [EnvironmentAwarePermission]
32
-
34
+
33
35
  def get(self, request):
34
36
  """
35
37
  Returns statistics about examinations including total counts,
@@ -39,40 +41,51 @@ class ExaminationStatsView(APIView):
39
41
  # Total examination counts
40
42
  total_examinations = Examination.objects.count()
41
43
  total_patient_examinations = PatientExamination.objects.count()
42
-
44
+
43
45
  # Recent activity (last 30 days)
44
46
  thirty_days_ago = timezone.now() - timedelta(days=30)
45
- recent_examinations = Examination.objects.filter(
46
- created_at__gte=thirty_days_ago
47
- ).count() if hasattr(Examination, 'created_at') else 0
48
-
47
+ recent_examinations = (
48
+ Examination.objects.filter(created_at__gte=thirty_days_ago).count()
49
+ if hasattr(Examination, "created_at")
50
+ else 0
51
+ )
52
+
49
53
  # Status distribution for patient examinations
50
- status_distribution = PatientExamination.objects.values('status').annotate(
51
- count=Count('id')
52
- ).order_by('status') if hasattr(PatientExamination, 'status') else []
53
-
54
- return Response({
55
- 'total_examinations': total_examinations,
56
- 'total_patient_examinations': total_patient_examinations,
57
- 'recent_examinations': recent_examinations,
58
- 'status_distribution': list(status_distribution)
59
- }, status=status.HTTP_200_OK)
60
-
54
+ status_distribution = (
55
+ PatientExamination.objects.values("status")
56
+ .annotate(count=Count("id"))
57
+ .order_by("status")
58
+ if hasattr(PatientExamination, "status")
59
+ else []
60
+ )
61
+
62
+ return Response(
63
+ {
64
+ "total_examinations": total_examinations,
65
+ "total_patient_examinations": total_patient_examinations,
66
+ "recent_examinations": recent_examinations,
67
+ "status_distribution": list(status_distribution),
68
+ },
69
+ status=status.HTTP_200_OK,
70
+ )
71
+
61
72
  except Exception as e:
62
- return Response({
63
- 'error': f'Failed to retrieve examination stats: {str(e)}'
64
- }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
73
+ return Response(
74
+ {"error": f"Failed to retrieve examination stats: {str(e)}"},
75
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR,
76
+ )
65
77
 
66
78
 
67
79
  class VideoSegmentStatsView(APIView):
68
80
  """
69
81
  Statistics about video segments and label distribution.
70
-
82
+
71
83
  GET /api/video-segment/stats/
72
84
  GET /api/video-segments/stats/
73
85
  """
86
+
74
87
  permission_classes = [EnvironmentAwarePermission]
75
-
88
+
76
89
  def get(self, request):
77
90
  """
78
91
  Returns statistics about video segments including total counts,
@@ -81,49 +94,58 @@ class VideoSegmentStatsView(APIView):
81
94
  try:
82
95
  # Total segment counts
83
96
  total_segments = LabelVideoSegment.objects.count()
84
- total_videos_with_segments = VideoFile.objects.filter(
85
- labelvideosegment__isnull=False
86
- ).distinct().count()
87
-
97
+ total_videos_with_segments = (
98
+ VideoFile.objects.filter(labelvideosegment__isnull=False)
99
+ .distinct()
100
+ .count()
101
+ )
102
+
88
103
  # Label distribution
89
- label_distribution = LabelVideoSegment.objects.values(
90
- 'label__name'
91
- ).annotate(
92
- count=Count('id')
93
- ).order_by('-count')
94
-
104
+ label_distribution = (
105
+ LabelVideoSegment.objects.values("label__name")
106
+ .annotate(count=Count("id"))
107
+ .order_by("-count")
108
+ )
109
+
95
110
  # Videos without segments
96
111
  videos_without_segments = VideoFile.objects.filter(
97
112
  labelvideosegment__isnull=True
98
113
  ).count()
99
-
114
+
100
115
  # Average segments per video
101
116
  avg_segments_per_video = 0
102
117
  if total_videos_with_segments > 0:
103
- avg_segments_per_video = round(total_segments / total_videos_with_segments, 2)
104
-
105
- return Response({
106
- 'total_segments': total_segments,
107
- 'total_videos_with_segments': total_videos_with_segments,
108
- 'videos_without_segments': videos_without_segments,
109
- 'avg_segments_per_video': avg_segments_per_video,
110
- 'label_distribution': list(label_distribution)
111
- }, status=status.HTTP_200_OK)
112
-
118
+ avg_segments_per_video = round(
119
+ total_segments / total_videos_with_segments, 2
120
+ )
121
+
122
+ return Response(
123
+ {
124
+ "total_segments": total_segments,
125
+ "total_videos_with_segments": total_videos_with_segments,
126
+ "videos_without_segments": videos_without_segments,
127
+ "avg_segments_per_video": avg_segments_per_video,
128
+ "label_distribution": list(label_distribution),
129
+ },
130
+ status=status.HTTP_200_OK,
131
+ )
132
+
113
133
  except Exception as e:
114
- return Response({
115
- 'error': f'Failed to retrieve video segment stats: {str(e)}'
116
- }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
134
+ return Response(
135
+ {"error": f"Failed to retrieve video segment stats: {str(e)}"},
136
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR,
137
+ )
117
138
 
118
139
 
119
140
  class SensitiveMetaStatsView(APIView):
120
141
  """
121
142
  Statistics about sensitive metadata entries and verification status.
122
-
143
+
123
144
  GET /api/video/sensitivemeta/stats/
124
145
  """
146
+
125
147
  permission_classes = [EnvironmentAwarePermission]
126
-
148
+
127
149
  def get(self, request):
128
150
  """
129
151
  Returns statistics about sensitive metadata including verification status,
@@ -132,50 +154,57 @@ class SensitiveMetaStatsView(APIView):
132
154
  try:
133
155
  # Total sensitive meta entries
134
156
  total_sensitive_meta = SensitiveMeta.objects.count()
135
-
157
+
136
158
  # Verification status distribution
137
- verified_count = SensitiveMeta.objects.filter(
138
- verified=True
139
- ).count() if hasattr(SensitiveMeta, 'verified') else 0
140
-
159
+ verified_count = (
160
+ SensitiveMeta.objects.filter(verified=True).count()
161
+ if hasattr(SensitiveMeta, "verified")
162
+ else 0
163
+ )
164
+
141
165
  unverified_count = total_sensitive_meta - verified_count
142
-
166
+
143
167
  # Videos with sensitive data
144
- videos_with_sensitive_data = VideoFile.objects.filter(
145
- sensitivemeta__isnull=False
146
- ).distinct().count()
147
-
168
+ videos_with_sensitive_data = (
169
+ VideoFile.objects.filter(sensitivemeta__isnull=False).distinct().count()
170
+ )
171
+
148
172
  # Type distribution (if available)
149
173
  type_distribution = []
150
- if hasattr(SensitiveMeta, 'meta_type'):
151
- type_distribution = SensitiveMeta.objects.values(
152
- 'meta_type'
153
- ).annotate(
154
- count=Count('id')
155
- ).order_by('-count')
156
-
157
- return Response({
158
- 'total_sensitive_meta': total_sensitive_meta,
159
- 'verified_count': verified_count,
160
- 'unverified_count': unverified_count,
161
- 'videos_with_sensitive_data': videos_with_sensitive_data,
162
- 'type_distribution': list(type_distribution)
163
- }, status=status.HTTP_200_OK)
164
-
174
+ if hasattr(SensitiveMeta, "meta_type"):
175
+ type_distribution = (
176
+ SensitiveMeta.objects.values("meta_type")
177
+ .annotate(count=Count("id"))
178
+ .order_by("-count")
179
+ )
180
+
181
+ return Response(
182
+ {
183
+ "total_sensitive_meta": total_sensitive_meta,
184
+ "verified_count": verified_count,
185
+ "unverified_count": unverified_count,
186
+ "videos_with_sensitive_data": videos_with_sensitive_data,
187
+ "type_distribution": list(type_distribution),
188
+ },
189
+ status=status.HTTP_200_OK,
190
+ )
191
+
165
192
  except Exception as e:
166
- return Response({
167
- 'error': f'Failed to retrieve sensitive meta stats: {str(e)}'
168
- }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
193
+ return Response(
194
+ {"error": f"Failed to retrieve sensitive meta stats: {str(e)}"},
195
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR,
196
+ )
169
197
 
170
198
 
171
199
  class GeneralStatsView(APIView):
172
200
  """
173
201
  General dashboard statistics providing an overview of the system.
174
-
202
+
175
203
  GET /api/stats/
176
204
  """
205
+
177
206
  permission_classes = [EnvironmentAwarePermission]
178
-
207
+
179
208
  def get(self, request):
180
209
  """
181
210
  Returns general overview statistics for the dashboard including
@@ -188,42 +217,50 @@ class GeneralStatsView(APIView):
188
217
  total_segments = LabelVideoSegment.objects.count()
189
218
  total_examinations = Examination.objects.count()
190
219
  total_sensitive_meta = SensitiveMeta.objects.count()
191
-
220
+
192
221
  # Processing status
193
- videos_with_segments = VideoFile.objects.filter(
194
- labelvideosegment__isnull=False
195
- ).distinct().count()
196
-
197
- videos_with_sensitive_data = VideoFile.objects.filter(
198
- sensitivemeta__isnull=False
199
- ).distinct().count()
200
-
222
+ videos_with_segments = (
223
+ VideoFile.objects.filter(labelvideosegment__isnull=False)
224
+ .distinct()
225
+ .count()
226
+ )
227
+
228
+ videos_with_sensitive_data = (
229
+ VideoFile.objects.filter(sensitivemeta__isnull=False).distinct().count()
230
+ )
231
+
201
232
  # Calculate percentages
202
233
  segment_coverage = 0
203
234
  sensitive_data_coverage = 0
204
235
  if total_videos > 0:
205
236
  segment_coverage = round((videos_with_segments / total_videos) * 100, 1)
206
- sensitive_data_coverage = round((videos_with_sensitive_data / total_videos) * 100, 1)
207
-
208
- return Response({
209
- 'totals': {
210
- 'videos': total_videos,
211
- 'labels': total_labels,
212
- 'segments': total_segments,
213
- 'examinations': total_examinations,
214
- 'sensitive_meta': total_sensitive_meta
215
- },
216
- 'coverage': {
217
- 'segment_coverage_percent': segment_coverage,
218
- 'sensitive_data_coverage_percent': sensitive_data_coverage
237
+ sensitive_data_coverage = round(
238
+ (videos_with_sensitive_data / total_videos) * 100, 1
239
+ )
240
+
241
+ return Response(
242
+ {
243
+ "totals": {
244
+ "videos": total_videos,
245
+ "labels": total_labels,
246
+ "segments": total_segments,
247
+ "examinations": total_examinations,
248
+ "sensitive_meta": total_sensitive_meta,
249
+ },
250
+ "coverage": {
251
+ "segment_coverage_percent": segment_coverage,
252
+ "sensitive_data_coverage_percent": sensitive_data_coverage,
253
+ },
254
+ "processing_status": {
255
+ "videos_with_segments": videos_with_segments,
256
+ "videos_with_sensitive_data": videos_with_sensitive_data,
257
+ },
219
258
  },
220
- 'processing_status': {
221
- 'videos_with_segments': videos_with_segments,
222
- 'videos_with_sensitive_data': videos_with_sensitive_data
223
- }
224
- }, status=status.HTTP_200_OK)
225
-
259
+ status=status.HTTP_200_OK,
260
+ )
261
+
226
262
  except Exception as e:
227
- return Response({
228
- 'error': f'Failed to retrieve general stats: {str(e)}'
229
- }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
263
+ return Response(
264
+ {"error": f"Failed to retrieve general stats: {str(e)}"},
265
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR,
266
+ )
@@ -7,9 +7,7 @@ from .correction import (
7
7
 
8
8
  from ..media.video_media import VideoMediaView
9
9
 
10
- from .reimport import (
11
- VideoReimportView
12
- )
10
+ from .reimport import VideoReimportView
13
11
  from .video_stream import VideoStreamView
14
12
  from .video_examination_viewset import VideoExaminationViewSet
15
13
  from .video_meta_stats import VideoMetadataStatsView
@@ -24,35 +22,28 @@ from .segments_crud import (
24
22
  video_segments_validate_bulk,
25
23
  video_segments_validation_status,
26
24
  )
27
- from ..ai.label import label_list
25
+ from .ai.label import label_list
28
26
 
29
27
  __all__ = [
30
28
  # Video Correction (Phase 1.1) - Implemented
31
- 'VideoProcessingHistoryView',
32
- 'VideoApplyMaskView',
33
- 'VideoRemoveFramesView',
34
- 'VideoMetadataStatsView',
35
-
36
- 'VideoMediaView',
37
-
38
- 'VideoCorrectionView',
39
-
29
+ "VideoProcessingHistoryView",
30
+ "VideoApplyMaskView",
31
+ "VideoRemoveFramesView",
32
+ "VideoMetadataStatsView",
33
+ "VideoMediaView",
34
+ "VideoCorrectionView",
40
35
  # Reimport views
41
- 'VideoReimportView',
42
-
36
+ "VideoReimportView",
43
37
  # Segmentation views
44
- 'VideoStreamView',
45
-
38
+ "VideoStreamView",
46
39
  # Video Examination ViewSet
47
40
  "VideoExaminationViewSet",
48
-
49
- 'video_segments_collection',
50
- 'video_segments_by_video',
51
- 'video_segment_detail',
52
- 'video_segments_stats',
53
- 'video_segment_validate',
54
- 'video_segments_validate_bulk',
55
- 'video_segments_validation_status',
56
-
57
- 'label_list',
41
+ "video_segments_collection",
42
+ "video_segments_by_video",
43
+ "video_segment_detail",
44
+ "video_segments_stats",
45
+ "video_segment_validate",
46
+ "video_segments_validate_bulk",
47
+ "video_segments_validation_status",
48
+ "label_list",
58
49
  ]
@@ -1,8 +1,8 @@
1
- from .label import (label_list, add_label, delete_label, update_label)
1
+ from .label import label_list, add_label, delete_label, update_label
2
2
 
3
3
  __all__ = [
4
4
  "label_list",
5
5
  "add_label",
6
6
  "delete_label",
7
7
  "update_label",
8
- ]
8
+ ]
@@ -5,7 +5,7 @@ from rest_framework.response import Response
5
5
  from rest_framework import status
6
6
 
7
7
  from endoreg_db.models import Label
8
- from endoreg_db.serializers.label.label import LabelSerializer
8
+ from endoreg_db.serializers.label_video_segment.label import LabelSerializer
9
9
  from endoreg_db.utils.permissions import EnvironmentAwarePermission
10
10
  # from rest_framework.permissions import IsAuthenticated
11
11
  # from endoreg_db.authz.permissions import PolicyPermission
@@ -38,6 +38,7 @@ def label_list(request) -> Response:
38
38
  status=status.HTTP_500_INTERNAL_SERVER_ERROR,
39
39
  )
40
40
 
41
+
41
42
  @api_view(["POST"])
42
43
  @permission_classes([EnvironmentAwarePermission])
43
44
  def add_label(request) -> Response:
@@ -53,7 +54,9 @@ def add_label(request) -> Response:
53
54
 
54
55
  return Response(
55
56
  {
56
- "success": "label added to database" if created else "label already existed",
57
+ "success": "label added to database"
58
+ if created
59
+ else "label already existed",
57
60
  "id": label.id,
58
61
  "name": label.name,
59
62
  },
@@ -80,12 +83,11 @@ def delete_label(request) -> Response:
80
83
  if isinstance(Label.get_or_create_from_name(name), Label):
81
84
  return Response(
82
85
  {"error": "Field not deleted"},
83
- status=status.HTTP_500_INTERNAL_SERVER_ERROR
86
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR,
84
87
  )
85
88
  else:
86
89
  return Response(
87
- {"success": f"label {name} deleted"},
88
- status=status.HTTP_200_OK
90
+ {"success": f"label {name} deleted"}, status=status.HTTP_200_OK
89
91
  )
90
92
  except Exception as e:
91
93
  logger.error(f"Error creating label: {e}")
@@ -111,16 +113,16 @@ def update_label(request) -> Response:
111
113
  new_name = request.data.get("name")
112
114
 
113
115
  if not name_old:
114
- return Response(
115
- {"error": "Field 'name_old' is required"},
116
- status=status.HTTP_400_BAD_REQUEST,
117
- )
116
+ return Response(
117
+ {"error": "Field 'name_old' is required"},
118
+ status=status.HTTP_400_BAD_REQUEST,
119
+ )
118
120
 
119
121
  if not new_name:
120
- return Response(
121
- {"error": "Field 'name' is required"},
122
- status=status.HTTP_400_BAD_REQUEST,
123
- )
122
+ return Response(
123
+ {"error": "Field 'name' is required"},
124
+ status=status.HTTP_400_BAD_REQUEST,
125
+ )
124
126
 
125
127
  try:
126
128
  try:
@@ -142,9 +144,11 @@ def update_label(request) -> Response:
142
144
  label.save()
143
145
 
144
146
  return Response(
145
- {"success": f"Label '{name_old}' renamed to '{new_name}'",
146
- "id": label.id,
147
- "name": label.name},
147
+ {
148
+ "success": f"Label '{name_old}' renamed to '{new_name}'",
149
+ "id": label.id,
150
+ "name": label.name,
151
+ },
148
152
  status=status.HTTP_200_OK,
149
153
  )
150
154
  except Exception as e:
@@ -31,7 +31,7 @@ from endoreg_db.models import (
31
31
  )
32
32
  from endoreg_db.serializers import VideoMetaSerializer, VideoProcessingHistorySerializer
33
33
  from endoreg_db.serializers.video.video_file_detail import VideoDetailSerializer
34
- from endoreg_db.utils.paths import ANONYM_VIDEO_DIR, IMPORT_VIDEO_DIR
34
+ from endoreg_db.utils.paths import ANONYM_VIDEO_DIR
35
35
  from endoreg_db.utils.permissions import EnvironmentAwarePermission
36
36
 
37
37
  logger = logging.getLogger(__name__)
@@ -123,7 +123,7 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
123
123
  # Delete segment if all frames were removed
124
124
  if new_start >= new_end:
125
125
  logger.info(
126
- f"Deleting segment {segment.id} (original: {original_start}-{original_end}) "
126
+ f"Deleting segment {segment.pk} (original: {original_start}-{original_end}) "
127
127
  f"- all {frames_within} frames removed"
128
128
  )
129
129
  segment.delete()
@@ -131,7 +131,7 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
131
131
  elif new_start != original_start or new_end != original_end:
132
132
  # Update segment boundaries
133
133
  logger.info(
134
- f"Updating segment {segment.id}: "
134
+ f"Updating segment {segment.pk}: "
135
135
  f"{original_start}-{original_end} → {new_start}-{new_end} "
136
136
  f"(before: {frames_before}, within: {frames_within})"
137
137
  )
@@ -144,7 +144,7 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
144
144
  segments_unchanged += 1
145
145
 
146
146
  logger.info(
147
- f"Segment update complete for video {video.id}: "
147
+ f"Segment update complete for video {video.pk}: "
148
148
  f"{segments_updated} updated, {segments_deleted} deleted, {segments_unchanged} unchanged"
149
149
  )
150
150
 
@@ -336,7 +336,6 @@ class VideoApplyMaskView(APIView):
336
336
 
337
337
  if success:
338
338
  # Update video record with anonymized file
339
- from django.core.files import File
340
339
 
341
340
  processed_file_path = output_path
342
341
  update_processed_file(video, processed_file_path)
@@ -472,7 +471,7 @@ class VideoRemoveFramesView(APIView):
472
471
  output_path = (
473
472
  Path(settings.MEDIA_ROOT)
474
473
  / "anonym_videos"
475
- / f"{video.uuid}_cleaned.mp4"
474
+ / f"{video.video_hash}_cleaned.mp4"
476
475
  )
477
476
  output_path.parent.mkdir(parents=True, exist_ok=True)
478
477