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
@@ -42,16 +42,24 @@ class Command(BaseCommand):
42
42
  force_recreate = options.get("force_recreate", False)
43
43
  yaml_only = options.get("yaml_only", False)
44
44
 
45
- self.stdout.write(self.style.SUCCESS("🚀 Starting EndoReg DB embedded app setup..."))
45
+ self.stdout.write(
46
+ self.style.SUCCESS("🚀 Starting EndoReg DB embedded app setup...")
47
+ )
46
48
 
47
49
  if yaml_only:
48
- self.stdout.write(self.style.WARNING("📋 YAML-only mode: Will not auto-generate missing metadata"))
50
+ self.stdout.write(
51
+ self.style.WARNING(
52
+ "📋 YAML-only mode: Will not auto-generate missing metadata"
53
+ )
54
+ )
49
55
 
50
56
  # Step 1: Load base database data
51
57
  self.stdout.write("\n📊 Step 1: Loading base database data...")
52
58
  try:
53
59
  call_command("load_base_db_data")
54
- self.stdout.write(self.style.SUCCESS("✅ Base database data loaded successfully"))
60
+ self.stdout.write(
61
+ self.style.SUCCESS("✅ Base database data loaded successfully")
62
+ )
55
63
  except Exception as e:
56
64
  self.stdout.write(self.style.ERROR(f"❌ Failed to load base data: {e}"))
57
65
  return
@@ -65,9 +73,13 @@ class Command(BaseCommand):
65
73
  self.stdout.write("Using database caching - creating cache table...")
66
74
  try:
67
75
  call_command("createcachetable")
68
- self.stdout.write(self.style.SUCCESS("✅ Cache table created successfully"))
76
+ self.stdout.write(
77
+ self.style.SUCCESS("✅ Cache table created successfully")
78
+ )
69
79
  except Exception as e:
70
- self.stdout.write(self.style.ERROR(f"❌ Failed to create cache table: {e}"))
80
+ self.stdout.write(
81
+ self.style.ERROR(f"❌ Failed to create cache table: {e}")
82
+ )
71
83
  return
72
84
  else:
73
85
  self.stdout.write("Using in-memory caching - skipping cache table creation")
@@ -79,18 +91,26 @@ class Command(BaseCommand):
79
91
  self.stdout.write("\n🤖 Step 3: Loading AI model data...")
80
92
  try:
81
93
  call_command("load_ai_model_data")
82
- self.stdout.write(self.style.SUCCESS("✅ AI model data loaded successfully"))
94
+ self.stdout.write(
95
+ self.style.SUCCESS("✅ AI model data loaded successfully")
96
+ )
83
97
  except Exception as e:
84
- self.stdout.write(self.style.ERROR(f"❌ Failed to load AI model data: {e}"))
98
+ self.stdout.write(
99
+ self.style.ERROR(f"❌ Failed to load AI model data: {e}")
100
+ )
85
101
  return
86
102
 
87
103
  # Step 4: Load AI model label data
88
104
  self.stdout.write("\n🏷️ Step 4: Loading AI model label data...")
89
105
  try:
90
106
  call_command("load_ai_model_label_data")
91
- self.stdout.write(self.style.SUCCESS("✅ AI model label data loaded successfully"))
107
+ self.stdout.write(
108
+ self.style.SUCCESS("✅ AI model label data loaded successfully")
109
+ )
92
110
  except Exception as e:
93
- self.stdout.write(self.style.ERROR(f"❌ Failed to load AI model label data: {e}"))
111
+ self.stdout.write(
112
+ self.style.ERROR(f"❌ Failed to load AI model label data: {e}")
113
+ )
94
114
  return
95
115
 
96
116
  # Step 5: Create model metadata
@@ -109,12 +129,20 @@ class Command(BaseCommand):
109
129
  ai_model = AiModel.objects.filter(name=default_model_name).first()
110
130
 
111
131
  if not ai_model:
112
- self.stdout.write(self.style.ERROR(f"❌ AI model '{default_model_name}' not found"))
132
+ self.stdout.write(
133
+ self.style.ERROR(
134
+ f"❌ AI model '{default_model_name}' not found"
135
+ )
136
+ )
113
137
  return
114
138
 
115
139
  existing_meta = ai_model.metadata_versions.first()
116
140
  if existing_meta and not force_recreate:
117
- self.stdout.write(self.style.SUCCESS("✅ Model metadata already exists (use --force-recreate to recreate)"))
141
+ self.stdout.write(
142
+ self.style.SUCCESS(
143
+ "✅ Model metadata already exists (use --force-recreate to recreate)"
144
+ )
145
+ )
118
146
  else:
119
147
  # Try to create model metadata using configurable approach
120
148
  model_path = self._find_model_weights_file()
@@ -129,34 +157,56 @@ class Command(BaseCommand):
129
157
  if force_recreate:
130
158
  call_command_kwargs["bump_version"] = True
131
159
 
132
- call_command("create_multilabel_model_meta", **call_command_kwargs)
133
- self.stdout.write(self.style.SUCCESS(" AI model metadata created successfully"))
160
+ call_command(
161
+ "create_multilabel_model_meta", **call_command_kwargs
162
+ )
163
+ self.stdout.write(
164
+ self.style.SUCCESS(
165
+ "✅ AI model metadata created successfully"
166
+ )
167
+ )
134
168
  else:
135
- self.stdout.write(self.style.WARNING("⚠️ Model weights file not found. AI features may not work properly."))
169
+ self.stdout.write(
170
+ self.style.WARNING(
171
+ "⚠️ Model weights file not found. AI features may not work properly."
172
+ )
173
+ )
136
174
 
137
175
  except Exception as e:
138
- self.stdout.write(self.style.ERROR(f"❌ Failed to create AI model metadata: {e}"))
176
+ self.stdout.write(
177
+ self.style.ERROR(f"❌ Failed to create AI model metadata: {e}")
178
+ )
139
179
  return
140
180
 
141
181
  # Step 5.5: Validate and fix AI model active metadata
142
182
  self.stdout.write("\n🔧 Step 5.5: Validating AI model active metadata...")
143
183
  try:
144
184
  self._validate_and_fix_ai_model_metadata(yaml_only)
145
- self.stdout.write(self.style.SUCCESS("✅ AI model metadata validation completed"))
185
+ self.stdout.write(
186
+ self.style.SUCCESS("✅ AI model metadata validation completed")
187
+ )
146
188
  except Exception as e:
147
- self.stdout.write(self.style.ERROR(f"❌ Failed to validate AI model metadata: {e}"))
189
+ self.stdout.write(
190
+ self.style.ERROR(f"❌ Failed to validate AI model metadata: {e}")
191
+ )
148
192
  return
149
193
 
150
194
  # Step 6: Verification
151
195
  self.stdout.write("\n🔍 Step 6: Verifying setup...")
152
196
  try:
153
197
  self._verify_setup()
154
- self.stdout.write(self.style.SUCCESS("✅ Setup verification completed successfully"))
198
+ self.stdout.write(
199
+ self.style.SUCCESS("✅ Setup verification completed successfully")
200
+ )
155
201
  except Exception as e:
156
202
  self.stdout.write(self.style.ERROR(f"❌ Setup verification failed: {e}"))
157
203
  return
158
204
 
159
- self.stdout.write(self.style.SUCCESS("\n🎉 EndoReg DB embedded app setup completed successfully!"))
205
+ self.stdout.write(
206
+ self.style.SUCCESS(
207
+ "\n🎉 EndoReg DB embedded app setup completed successfully!"
208
+ )
209
+ )
160
210
  self.stdout.write("\nNext steps:")
161
211
  # self.stdout.write("1. Run migrations: python manage.py migrate")
162
212
  self.stdout.write("1. Create superuser: python manage.py createsuperuser")
@@ -176,12 +226,19 @@ class Command(BaseCommand):
176
226
  # If no local weights found and HuggingFace fallback is enabled
177
227
  hf_config = setup_config.get_huggingface_config()
178
228
  if hf_config.get("enabled", True):
179
- self.stdout.write("📦 No local model weights found — attempting HuggingFace download...")
229
+ self.stdout.write(
230
+ "📦 No local model weights found — attempting HuggingFace download..."
231
+ )
180
232
  try:
181
233
  if not ModelMeta.objects.exists():
182
234
  ModelMeta.setup_default_from_huggingface(
183
- hf_config.get("repo_id", "wg-lux/colo_segmentation_RegNetX800MF_base"),
184
- labelset_name=hf_config.get("labelset_name", "multilabel_classification_colonoscopy_default"),
235
+ hf_config.get(
236
+ "repo_id", "wg-lux/colo_segmentation_RegNetX800MF_base"
237
+ ),
238
+ labelset_name=hf_config.get(
239
+ "labelset_name",
240
+ "multilabel_classification_colonoscopy_default",
241
+ ),
185
242
  )
186
243
  self.stdout.write("✅ Default ModelMeta created from HuggingFace.")
187
244
 
@@ -216,7 +273,9 @@ class Command(BaseCommand):
216
273
  cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
217
274
  existing_tables = [row[0] for row in cursor.fetchall()]
218
275
 
219
- missing_tables = [table for table in required_tables if table not in existing_tables]
276
+ missing_tables = [
277
+ table for table in required_tables if table not in existing_tables
278
+ ]
220
279
  if missing_tables:
221
280
  raise Exception(f"Missing required tables: {missing_tables}")
222
281
 
@@ -262,7 +321,9 @@ class Command(BaseCommand):
262
321
 
263
322
  if metadata_count == 0:
264
323
  if yaml_only:
265
- self.stdout.write(f" ⚠️ YAML-only mode: Skipping auto-generation for {model.name}")
324
+ self.stdout.write(
325
+ f" ⚠️ YAML-only mode: Skipping auto-generation for {model.name}"
326
+ )
266
327
  continue
267
328
 
268
329
  # Create metadata for models that don't have any
@@ -275,7 +336,10 @@ class Command(BaseCommand):
275
336
  except LabelSet.DoesNotExist:
276
337
  labelset = LabelSet.objects.first()
277
338
  if not labelset:
278
- labelset = LabelSet.objects.create(name="default_colonoscopy_labels", description="Default colonoscopy classification labels")
339
+ labelset = LabelSet.objects.create(
340
+ name="default_colonoscopy_labels",
341
+ description="Default colonoscopy classification labels",
342
+ )
279
343
 
280
344
  # Create basic metadata WITH weights if available
281
345
  weights_file = self._find_model_weights_file()
@@ -330,7 +394,9 @@ class Command(BaseCommand):
330
394
 
331
395
  # Check if the metadata has weights - if not, try to assign them
332
396
  if not first_meta.weights:
333
- self.stdout.write(" Metadata exists but no weights assigned, attempting to add weights...")
397
+ self.stdout.write(
398
+ " Metadata exists but no weights assigned, attempting to add weights..."
399
+ )
334
400
  weights_file = self._find_model_weights_file()
335
401
  if weights_file:
336
402
  from pathlib import Path
@@ -338,7 +404,9 @@ class Command(BaseCommand):
338
404
  from endoreg_db.utils.paths import STORAGE_DIR
339
405
 
340
406
  try:
341
- weights_path = str(Path(weights_file).relative_to(STORAGE_DIR))
407
+ weights_path = str(
408
+ Path(weights_file).relative_to(STORAGE_DIR)
409
+ )
342
410
  except ValueError:
343
411
  # Copy weights to storage if not already there
344
412
  import shutil
@@ -348,22 +416,32 @@ class Command(BaseCommand):
348
416
  dest_path = weights_dir / Path(weights_file).name
349
417
  shutil.copy2(weights_file, dest_path)
350
418
  weights_path = str(dest_path.relative_to(STORAGE_DIR))
351
- self.stdout.write(f" Copied weights to: {dest_path}")
419
+ self.stdout.write(
420
+ f" Copied weights to: {dest_path}"
421
+ )
352
422
 
353
423
  # Assign the relative path to the FileField
354
424
  first_meta.weights.name = weights_path
355
425
  first_meta.save(update_fields=["weights"])
356
- self.stdout.write(f" Added weights to existing metadata: {weights_path}")
426
+ self.stdout.write(
427
+ f" Added weights to existing metadata: {weights_path}"
428
+ )
357
429
 
358
430
  model.active_meta = first_meta
359
431
  model.save()
360
432
  fixed_count += 1
361
- self.stdout.write(f" ✅ Set active metadata: {first_meta.name} v{first_meta.version}")
433
+ self.stdout.write(
434
+ f" ✅ Set active metadata: {first_meta.name} v{first_meta.version}"
435
+ )
362
436
  else:
363
- self.stdout.write(f" ⚠️ No metadata versions available for {model.name}")
437
+ self.stdout.write(
438
+ f" ⚠️ No metadata versions available for {model.name}"
439
+ )
364
440
 
365
441
  else:
366
- self.stdout.write(f" ✅ Model {model.name} has active metadata: {model.active_meta}")
442
+ self.stdout.write(
443
+ f" ✅ Model {model.name} has active metadata: {model.active_meta}"
444
+ )
367
445
 
368
446
  # Verify all models can get latest version
369
447
  self.stdout.write("\nTesting model metadata access...")
@@ -266,7 +266,7 @@ class Command(BaseCommand):
266
266
  for video in completed_videos:
267
267
  try:
268
268
  # Find frame directories for this video
269
- video_frame_dirs = list(frames_dir.glob(f"*{video.uuid}*"))
269
+ video_frame_dirs = list(frames_dir.glob(f"*{video.video_hash}*"))
270
270
 
271
271
  for frame_dir in video_frame_dirs:
272
272
  if frame_dir.is_dir():
@@ -277,11 +277,13 @@ class Command(BaseCommand):
277
277
 
278
278
  total_freed += dir_size
279
279
  self.stdout.write(
280
- f" Removed frames for {video.uuid}: {dir_size / (1024**2):.1f} MB"
280
+ f" Removed frames for {video.video_hash}: {dir_size / (1024**2):.1f} MB"
281
281
  )
282
282
 
283
283
  except Exception as e:
284
- logger.warning(f"Failed to clean frames for video {video.uuid}: {e}")
284
+ logger.warning(
285
+ f"Failed to clean frames for video {video.video_hash}: {e}"
286
+ )
285
287
  continue
286
288
 
287
289
  self.stdout.write(f"✅ Frames cleanup: {total_freed / (1024**3):.2f} GB freed")
@@ -410,7 +412,7 @@ class Command(BaseCommand):
410
412
  f"Found {old_videos.count()} processed videos older than {max_age_days} days"
411
413
  )
412
414
 
413
- except Exception as e:
415
+ except Exception:
414
416
  # Fallback: try different date field names
415
417
  try:
416
418
  old_videos = VideoFile.objects.filter(
@@ -443,11 +445,13 @@ class Command(BaseCommand):
443
445
 
444
446
  total_freed += file_size
445
447
  self.stdout.write(
446
- f" Removed processed video {video.uuid}: {file_size / (1024**2):.1f} MB"
448
+ f" Removed processed video {video.video_hash}: {file_size / (1024**2):.1f} MB"
447
449
  )
448
450
 
449
451
  except Exception as e:
450
- logger.warning(f"Failed to clean processed video {video.uuid}: {e}")
452
+ logger.warning(
453
+ f"Failed to clean processed video {video.video_hash}: {e}"
454
+ )
451
455
  continue
452
456
 
453
457
  self.stdout.write(
@@ -558,7 +562,9 @@ class Command(BaseCommand):
558
562
  freed = self._cleanup_processed_video_file(video)
559
563
  total_freed += freed
560
564
  except Exception as e:
561
- logger.warning(f"Failed to clean processed video {video.uuid}: {e}")
565
+ logger.warning(
566
+ f"Failed to clean processed video {video.video_hash}: {e}"
567
+ )
562
568
  continue
563
569
 
564
570
  except Exception as e:
@@ -582,7 +588,7 @@ class Command(BaseCommand):
582
588
  video.processed_file = None
583
589
  video.save(update_fields=["processed_file"])
584
590
  self.stdout.write(
585
- f" Removed processed video {video.uuid}: {file_size / (1024**2):.1f} MB"
591
+ f" Removed processed video {video.video_hash}: {file_size / (1024**2):.1f} MB"
586
592
  )
587
593
  return file_size
588
594
  return 0