endoreg-db 0.8.8.9__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 (453) 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 +146 -83
  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/migrations/__init__.py +0 -0
  82. endoreg_db/models/__init__.py +8 -0
  83. endoreg_db/models/administration/ai/active_model.py +5 -5
  84. endoreg_db/models/administration/ai/ai_model.py +41 -18
  85. endoreg_db/models/administration/ai/model_type.py +1 -0
  86. endoreg_db/models/administration/case/case.py +22 -22
  87. endoreg_db/models/administration/center/__init__.py +5 -5
  88. endoreg_db/models/administration/center/center.py +6 -2
  89. endoreg_db/models/administration/center/center_resource.py +18 -4
  90. endoreg_db/models/administration/center/center_shift.py +3 -1
  91. endoreg_db/models/administration/center/center_waste.py +6 -2
  92. endoreg_db/models/administration/person/__init__.py +1 -1
  93. endoreg_db/models/administration/person/employee/__init__.py +1 -1
  94. endoreg_db/models/administration/person/employee/employee_type.py +3 -1
  95. endoreg_db/models/administration/person/examiner/__init__.py +1 -1
  96. endoreg_db/models/administration/person/examiner/examiner.py +10 -2
  97. endoreg_db/models/administration/person/names/first_name.py +6 -4
  98. endoreg_db/models/administration/person/names/last_name.py +4 -3
  99. endoreg_db/models/administration/person/patient/__init__.py +1 -1
  100. endoreg_db/models/administration/person/patient/patient.py +0 -1
  101. endoreg_db/models/administration/person/patient/patient_external_id.py +0 -1
  102. endoreg_db/models/administration/person/person.py +1 -1
  103. endoreg_db/models/administration/product/__init__.py +7 -6
  104. endoreg_db/models/administration/product/product.py +6 -2
  105. endoreg_db/models/administration/product/product_group.py +9 -7
  106. endoreg_db/models/administration/product/product_material.py +9 -2
  107. endoreg_db/models/administration/product/reference_product.py +64 -15
  108. endoreg_db/models/administration/qualification/qualification.py +3 -1
  109. endoreg_db/models/administration/shift/shift.py +3 -1
  110. endoreg_db/models/administration/shift/shift_type.py +12 -4
  111. endoreg_db/models/aidataset/__init__.py +5 -0
  112. endoreg_db/models/aidataset/aidataset.py +193 -0
  113. endoreg_db/models/label/__init__.py +1 -1
  114. endoreg_db/models/label/label.py +10 -2
  115. endoreg_db/models/label/label_set.py +3 -1
  116. endoreg_db/models/label/label_video_segment/_create_from_video.py +6 -2
  117. endoreg_db/models/label/label_video_segment/label_video_segment.py +148 -44
  118. endoreg_db/models/media/__init__.py +12 -5
  119. endoreg_db/models/media/frame/__init__.py +1 -1
  120. endoreg_db/models/media/frame/frame.py +34 -8
  121. endoreg_db/models/media/pdf/__init__.py +2 -1
  122. endoreg_db/models/media/pdf/raw_pdf.py +11 -4
  123. endoreg_db/models/media/pdf/report_file.py +6 -2
  124. endoreg_db/models/media/pdf/report_reader/__init__.py +3 -3
  125. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +15 -5
  126. endoreg_db/models/media/video/create_from_file.py +20 -41
  127. endoreg_db/models/media/video/pipe_1.py +75 -30
  128. endoreg_db/models/media/video/pipe_2.py +37 -12
  129. endoreg_db/models/media/video/video_file.py +36 -24
  130. endoreg_db/models/media/video/video_file_ai.py +235 -70
  131. endoreg_db/models/media/video/video_file_anonymize.py +240 -65
  132. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -1
  133. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +3 -1
  134. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +30 -9
  135. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +95 -29
  136. endoreg_db/models/media/video/video_file_frames/_get_frame.py +13 -3
  137. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -1
  138. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +15 -3
  139. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +15 -3
  140. endoreg_db/models/media/video/video_file_frames/_get_frames.py +7 -2
  141. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +109 -23
  142. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +111 -27
  143. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +46 -13
  144. endoreg_db/models/media/video/video_file_io.py +85 -33
  145. endoreg_db/models/media/video/video_file_meta/__init__.py +6 -6
  146. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +17 -4
  147. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +28 -7
  148. endoreg_db/models/media/video/video_file_meta/get_fps.py +46 -13
  149. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +81 -20
  150. endoreg_db/models/media/video/video_file_meta/text_meta.py +61 -20
  151. endoreg_db/models/media/video/video_file_meta/video_meta.py +40 -12
  152. endoreg_db/models/media/video/video_file_segments.py +118 -27
  153. endoreg_db/models/media/video/video_metadata.py +25 -6
  154. endoreg_db/models/media/video/video_processing.py +54 -15
  155. endoreg_db/models/medical/__init__.py +3 -13
  156. endoreg_db/models/medical/contraindication/__init__.py +3 -1
  157. endoreg_db/models/medical/disease.py +18 -6
  158. endoreg_db/models/medical/event.py +6 -2
  159. endoreg_db/models/medical/examination/__init__.py +5 -1
  160. endoreg_db/models/medical/examination/examination.py +22 -6
  161. endoreg_db/models/medical/examination/examination_indication.py +23 -7
  162. endoreg_db/models/medical/examination/examination_time.py +6 -2
  163. endoreg_db/models/medical/finding/__init__.py +3 -1
  164. endoreg_db/models/medical/finding/finding.py +37 -12
  165. endoreg_db/models/medical/finding/finding_classification.py +27 -8
  166. endoreg_db/models/medical/finding/finding_intervention.py +19 -6
  167. endoreg_db/models/medical/finding/finding_type.py +3 -1
  168. endoreg_db/models/medical/hardware/__init__.py +1 -1
  169. endoreg_db/models/medical/hardware/endoscope.py +14 -2
  170. endoreg_db/models/medical/laboratory/__init__.py +1 -1
  171. endoreg_db/models/medical/laboratory/lab_value.py +139 -39
  172. endoreg_db/models/medical/medication/__init__.py +7 -3
  173. endoreg_db/models/medical/medication/medication.py +3 -1
  174. endoreg_db/models/medical/medication/medication_indication.py +3 -1
  175. endoreg_db/models/medical/medication/medication_indication_type.py +11 -3
  176. endoreg_db/models/medical/medication/medication_intake_time.py +3 -1
  177. endoreg_db/models/medical/medication/medication_schedule.py +3 -1
  178. endoreg_db/models/medical/patient/__init__.py +2 -10
  179. endoreg_db/models/medical/patient/medication_examples.py +3 -14
  180. endoreg_db/models/medical/patient/patient_disease.py +17 -5
  181. endoreg_db/models/medical/patient/patient_event.py +12 -4
  182. endoreg_db/models/medical/patient/patient_examination.py +52 -15
  183. endoreg_db/models/medical/patient/patient_examination_indication.py +15 -4
  184. endoreg_db/models/medical/patient/patient_finding.py +105 -29
  185. endoreg_db/models/medical/patient/patient_finding_classification.py +41 -12
  186. endoreg_db/models/medical/patient/patient_finding_intervention.py +11 -3
  187. endoreg_db/models/medical/patient/patient_lab_sample.py +6 -2
  188. endoreg_db/models/medical/patient/patient_lab_value.py +42 -10
  189. endoreg_db/models/medical/patient/patient_medication.py +25 -7
  190. endoreg_db/models/medical/patient/patient_medication_schedule.py +34 -10
  191. endoreg_db/models/metadata/model_meta.py +40 -12
  192. endoreg_db/models/metadata/model_meta_logic.py +51 -16
  193. endoreg_db/models/metadata/sensitive_meta.py +65 -28
  194. endoreg_db/models/metadata/sensitive_meta_logic.py +28 -26
  195. endoreg_db/models/metadata/video_meta.py +146 -39
  196. endoreg_db/models/metadata/video_prediction_logic.py +70 -21
  197. endoreg_db/models/metadata/video_prediction_meta.py +80 -27
  198. endoreg_db/models/operation_log.py +63 -0
  199. endoreg_db/models/other/__init__.py +10 -10
  200. endoreg_db/models/other/distribution/__init__.py +9 -7
  201. endoreg_db/models/other/distribution/base_value_distribution.py +3 -1
  202. endoreg_db/models/other/distribution/date_value_distribution.py +19 -5
  203. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +3 -1
  204. endoreg_db/models/other/distribution/numeric_value_distribution.py +34 -9
  205. endoreg_db/models/other/emission/__init__.py +1 -1
  206. endoreg_db/models/other/emission/emission_factor.py +9 -3
  207. endoreg_db/models/other/information_source.py +15 -5
  208. endoreg_db/models/other/material.py +3 -1
  209. endoreg_db/models/other/transport_route.py +3 -1
  210. endoreg_db/models/other/unit.py +6 -2
  211. endoreg_db/models/report/report.py +0 -1
  212. endoreg_db/models/requirement/requirement.py +84 -27
  213. endoreg_db/models/requirement/requirement_error.py +5 -6
  214. endoreg_db/models/requirement/requirement_evaluation/__init__.py +1 -1
  215. endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +8 -8
  216. endoreg_db/models/requirement/requirement_evaluation/get_values.py +3 -3
  217. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +24 -8
  218. endoreg_db/models/requirement/requirement_operator.py +28 -8
  219. endoreg_db/models/requirement/requirement_set.py +34 -11
  220. endoreg_db/models/state/__init__.py +1 -0
  221. endoreg_db/models/state/audit_ledger.py +9 -2
  222. endoreg_db/models/{media → state}/processing_history/__init__.py +1 -3
  223. endoreg_db/models/state/processing_history/processing_history.py +136 -0
  224. endoreg_db/models/state/raw_pdf.py +0 -1
  225. endoreg_db/models/state/video.py +2 -3
  226. endoreg_db/models/utils.py +4 -2
  227. endoreg_db/queries/__init__.py +2 -6
  228. endoreg_db/queries/annotations/__init__.py +1 -3
  229. endoreg_db/queries/annotations/legacy.py +37 -26
  230. endoreg_db/root_urls.py +3 -4
  231. endoreg_db/schemas/examination_evaluation.py +3 -0
  232. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +249 -163
  233. endoreg_db/serializers/__init__.py +2 -8
  234. endoreg_db/serializers/administration/__init__.py +1 -2
  235. endoreg_db/serializers/administration/ai/__init__.py +0 -1
  236. endoreg_db/serializers/administration/ai/active_model.py +3 -1
  237. endoreg_db/serializers/administration/ai/ai_model.py +5 -3
  238. endoreg_db/serializers/administration/ai/model_type.py +3 -1
  239. endoreg_db/serializers/administration/center.py +7 -2
  240. endoreg_db/serializers/administration/gender.py +4 -2
  241. endoreg_db/serializers/anonymization.py +13 -13
  242. endoreg_db/serializers/evaluation/examination_evaluation.py +0 -1
  243. endoreg_db/serializers/examination/__init__.py +1 -1
  244. endoreg_db/serializers/examination/base.py +12 -13
  245. endoreg_db/serializers/examination/dropdown.py +6 -7
  246. endoreg_db/serializers/examination_serializer.py +3 -6
  247. endoreg_db/serializers/finding/__init__.py +1 -1
  248. endoreg_db/serializers/finding/finding.py +14 -7
  249. endoreg_db/serializers/finding_classification/__init__.py +3 -3
  250. endoreg_db/serializers/finding_classification/choice.py +3 -3
  251. endoreg_db/serializers/finding_classification/classification.py +2 -4
  252. endoreg_db/serializers/label_video_segment/__init__.py +5 -3
  253. endoreg_db/serializers/{label → label_video_segment}/image_classification_annotation.py +5 -5
  254. endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
  255. endoreg_db/serializers/{label → label_video_segment/label}/label.py +1 -1
  256. endoreg_db/serializers/label_video_segment/label_video_segment.py +338 -228
  257. endoreg_db/serializers/meta/__init__.py +1 -2
  258. endoreg_db/serializers/meta/sensitive_meta_detail.py +28 -13
  259. endoreg_db/serializers/meta/sensitive_meta_update.py +51 -46
  260. endoreg_db/serializers/meta/sensitive_meta_verification.py +19 -16
  261. endoreg_db/serializers/misc/__init__.py +2 -2
  262. endoreg_db/serializers/misc/file_overview.py +11 -7
  263. endoreg_db/serializers/misc/stats.py +10 -8
  264. endoreg_db/serializers/misc/translatable_field_mix_in.py +6 -6
  265. endoreg_db/serializers/misc/upload_job.py +32 -29
  266. endoreg_db/serializers/patient/__init__.py +2 -1
  267. endoreg_db/serializers/patient/patient.py +32 -15
  268. endoreg_db/serializers/patient/patient_dropdown.py +11 -3
  269. endoreg_db/serializers/patient_examination/__init__.py +1 -1
  270. endoreg_db/serializers/patient_examination/patient_examination.py +67 -40
  271. endoreg_db/serializers/patient_finding/__init__.py +1 -1
  272. endoreg_db/serializers/patient_finding/patient_finding.py +2 -1
  273. endoreg_db/serializers/patient_finding/patient_finding_classification.py +17 -9
  274. endoreg_db/serializers/patient_finding/patient_finding_detail.py +26 -17
  275. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +7 -5
  276. endoreg_db/serializers/patient_finding/patient_finding_list.py +10 -11
  277. endoreg_db/serializers/patient_finding/patient_finding_write.py +36 -27
  278. endoreg_db/serializers/pdf/__init__.py +1 -3
  279. endoreg_db/serializers/requirements/requirement_schema.py +1 -6
  280. endoreg_db/serializers/sensitive_meta_serializer.py +100 -81
  281. endoreg_db/serializers/video/__init__.py +2 -2
  282. endoreg_db/serializers/video/{segmentation.py → video_file.py} +66 -47
  283. endoreg_db/serializers/video/video_file_brief.py +6 -2
  284. endoreg_db/serializers/video/video_file_detail.py +36 -23
  285. endoreg_db/serializers/video/video_file_list.py +4 -2
  286. endoreg_db/serializers/video/video_processing_history.py +54 -50
  287. endoreg_db/services/__init__.py +1 -1
  288. endoreg_db/services/anonymization.py +2 -2
  289. endoreg_db/services/examination_evaluation.py +40 -17
  290. endoreg_db/services/model_meta_from_hf.py +76 -0
  291. endoreg_db/services/polling_coordinator.py +101 -70
  292. endoreg_db/services/pseudonym_service.py +27 -22
  293. endoreg_db/services/report_import.py +6 -3
  294. endoreg_db/services/segment_sync.py +75 -59
  295. endoreg_db/services/video_import.py +6 -7
  296. endoreg_db/urls/__init__.py +2 -2
  297. endoreg_db/urls/ai.py +7 -25
  298. endoreg_db/urls/anonymization.py +61 -15
  299. endoreg_db/urls/auth.py +4 -4
  300. endoreg_db/urls/classification.py +4 -9
  301. endoreg_db/urls/examination.py +27 -18
  302. endoreg_db/urls/media.py +27 -34
  303. endoreg_db/urls/patient.py +11 -7
  304. endoreg_db/urls/requirements.py +3 -1
  305. endoreg_db/urls/root_urls.py +2 -3
  306. endoreg_db/urls/stats.py +24 -16
  307. endoreg_db/urls/upload.py +3 -11
  308. endoreg_db/utils/__init__.py +14 -15
  309. endoreg_db/utils/ai/__init__.py +1 -1
  310. endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
  311. endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
  312. endoreg_db/utils/ai/get.py +2 -1
  313. endoreg_db/utils/ai/inference_dataset.py +14 -15
  314. endoreg_db/utils/ai/model_training/config.py +117 -0
  315. endoreg_db/utils/ai/model_training/dataset.py +74 -0
  316. endoreg_db/utils/ai/model_training/losses.py +68 -0
  317. endoreg_db/utils/ai/model_training/metrics.py +78 -0
  318. endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
  319. endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
  320. endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
  321. endoreg_db/utils/ai/multilabel_classification_net.py +21 -6
  322. endoreg_db/utils/ai/predict.py +4 -4
  323. endoreg_db/utils/ai/preprocess.py +19 -11
  324. endoreg_db/utils/calc_duration_seconds.py +4 -4
  325. endoreg_db/utils/case_generator/lab_sample_factory.py +3 -4
  326. endoreg_db/utils/check_video_files.py +74 -47
  327. endoreg_db/utils/cropping.py +10 -9
  328. endoreg_db/utils/dataloader.py +11 -3
  329. endoreg_db/utils/dates.py +3 -4
  330. endoreg_db/utils/defaults/set_default_center.py +7 -6
  331. endoreg_db/utils/env.py +6 -2
  332. endoreg_db/utils/extract_specific_frames.py +24 -9
  333. endoreg_db/utils/file_operations.py +30 -18
  334. endoreg_db/utils/fix_video_path_direct.py +57 -41
  335. endoreg_db/utils/frame_anonymization_utils.py +157 -157
  336. endoreg_db/utils/hashs.py +3 -18
  337. endoreg_db/utils/links/requirement_link.py +96 -52
  338. endoreg_db/utils/ocr.py +30 -25
  339. endoreg_db/utils/operation_log.py +61 -0
  340. endoreg_db/utils/parse_and_generate_yaml.py +12 -13
  341. endoreg_db/utils/paths.py +6 -6
  342. endoreg_db/utils/permissions.py +40 -24
  343. endoreg_db/utils/pipelines/process_video_dir.py +50 -26
  344. endoreg_db/utils/product/sum_emissions.py +5 -3
  345. endoreg_db/utils/product/sum_weights.py +4 -2
  346. endoreg_db/utils/pydantic_models/__init__.py +3 -4
  347. endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +207 -107
  348. endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +252 -65
  349. endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +27 -10
  350. endoreg_db/utils/setup_config.py +21 -5
  351. endoreg_db/utils/storage.py +3 -1
  352. endoreg_db/utils/translation.py +19 -15
  353. endoreg_db/utils/uuid.py +1 -0
  354. endoreg_db/utils/validate_endo_roi.py +12 -4
  355. endoreg_db/utils/validate_subcategory_dict.py +26 -24
  356. endoreg_db/utils/validate_video_detailed.py +207 -149
  357. endoreg_db/utils/video/__init__.py +7 -3
  358. endoreg_db/utils/video/extract_frames.py +30 -18
  359. endoreg_db/utils/video/ffmpeg_wrapper.py +217 -52
  360. endoreg_db/utils/video/names.py +11 -6
  361. endoreg_db/utils/video/streaming_processor.py +175 -101
  362. endoreg_db/utils/video/video_splitter.py +30 -19
  363. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +59 -50
  364. endoreg_db/views/__init__.py +0 -20
  365. endoreg_db/views/anonymization/__init__.py +6 -2
  366. endoreg_db/views/anonymization/media_management.py +2 -6
  367. endoreg_db/views/anonymization/overview.py +34 -1
  368. endoreg_db/views/anonymization/validate.py +79 -18
  369. endoreg_db/views/auth/__init__.py +1 -1
  370. endoreg_db/views/auth/keycloak.py +16 -14
  371. endoreg_db/views/examination/__init__.py +12 -15
  372. endoreg_db/views/examination/examination.py +5 -5
  373. endoreg_db/views/examination/examination_manifest_cache.py +5 -5
  374. endoreg_db/views/examination/get_finding_classification_choices.py +8 -5
  375. endoreg_db/views/examination/get_finding_classifications.py +9 -7
  376. endoreg_db/views/examination/get_findings.py +8 -10
  377. endoreg_db/views/examination/get_instruments.py +3 -2
  378. endoreg_db/views/examination/get_interventions.py +1 -1
  379. endoreg_db/views/finding/__init__.py +2 -2
  380. endoreg_db/views/finding/finding.py +58 -54
  381. endoreg_db/views/finding/get_classifications.py +1 -1
  382. endoreg_db/views/finding/get_interventions.py +1 -1
  383. endoreg_db/views/finding_classification/__init__.py +5 -5
  384. endoreg_db/views/finding_classification/finding_classification.py +5 -6
  385. endoreg_db/views/finding_classification/get_classification_choices.py +3 -4
  386. endoreg_db/views/media/__init__.py +13 -13
  387. endoreg_db/views/media/pdf_media.py +9 -9
  388. endoreg_db/views/media/sensitive_metadata.py +10 -7
  389. endoreg_db/views/media/video_media.py +4 -4
  390. endoreg_db/views/meta/__init__.py +1 -1
  391. endoreg_db/views/meta/sensitive_meta_list.py +20 -22
  392. endoreg_db/views/meta/sensitive_meta_verification.py +14 -11
  393. endoreg_db/views/misc/__init__.py +6 -34
  394. endoreg_db/views/misc/center.py +2 -1
  395. endoreg_db/views/misc/csrf.py +2 -1
  396. endoreg_db/views/misc/gender.py +2 -1
  397. endoreg_db/views/misc/stats.py +141 -106
  398. endoreg_db/views/patient/__init__.py +1 -3
  399. endoreg_db/views/patient/patient.py +141 -99
  400. endoreg_db/views/patient_examination/__init__.py +5 -5
  401. endoreg_db/views/patient_examination/patient_examination.py +43 -42
  402. endoreg_db/views/patient_examination/patient_examination_create.py +10 -15
  403. endoreg_db/views/patient_examination/patient_examination_detail.py +12 -15
  404. endoreg_db/views/patient_examination/patient_examination_list.py +21 -17
  405. endoreg_db/views/patient_examination/video.py +114 -80
  406. endoreg_db/views/patient_finding/__init__.py +1 -1
  407. endoreg_db/views/patient_finding/patient_finding.py +17 -10
  408. endoreg_db/views/patient_finding/patient_finding_optimized.py +127 -95
  409. endoreg_db/views/patient_finding_classification/__init__.py +1 -1
  410. endoreg_db/views/patient_finding_classification/pfc_create.py +35 -27
  411. endoreg_db/views/report/reimport.py +1 -1
  412. endoreg_db/views/report/report_stream.py +5 -8
  413. endoreg_db/views/requirement/__init__.py +2 -1
  414. endoreg_db/views/requirement/evaluate.py +7 -9
  415. endoreg_db/views/requirement/lookup.py +2 -3
  416. endoreg_db/views/requirement/lookup_store.py +0 -1
  417. endoreg_db/views/requirement/requirement_utils.py +2 -4
  418. endoreg_db/views/stats/__init__.py +4 -4
  419. endoreg_db/views/stats/stats_views.py +152 -115
  420. endoreg_db/views/video/__init__.py +18 -27
  421. endoreg_db/views/{ai → video/ai}/__init__.py +2 -2
  422. endoreg_db/views/{ai → video/ai}/label.py +20 -16
  423. endoreg_db/views/video/correction.py +5 -6
  424. endoreg_db/views/video/reimport.py +134 -99
  425. endoreg_db/views/video/segments_crud.py +134 -44
  426. endoreg_db/views/video/video_apply_mask.py +13 -12
  427. endoreg_db/views/video/video_correction.py +2 -1
  428. endoreg_db/views/video/video_download_processed.py +15 -15
  429. endoreg_db/views/video/video_meta_stats.py +7 -6
  430. endoreg_db/views/video/video_processing_history.py +3 -2
  431. endoreg_db/views/video/video_remove_frames.py +13 -12
  432. endoreg_db/views/video/video_stream.py +110 -82
  433. {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/METADATA +9 -3
  434. {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/RECORD +436 -433
  435. endoreg_db/import_files/processing/video_processing/video_cleanup_on_error.py +0 -119
  436. endoreg_db/management/commands/import_fallback_video.py +0 -203
  437. endoreg_db/management/commands/import_video.py +0 -422
  438. endoreg_db/management/commands/import_video_with_classification.py +0 -367
  439. endoreg_db/models/media/processing_history/processing_history.py +0 -96
  440. endoreg_db/serializers/label/__init__.py +0 -7
  441. endoreg_db/serializers/label_video_segment/_lvs_create.py +0 -149
  442. endoreg_db/serializers/label_video_segment/_lvs_update.py +0 -138
  443. endoreg_db/serializers/label_video_segment/_lvs_validate.py +0 -149
  444. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +0 -99
  445. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +0 -163
  446. endoreg_db/services/__old/pdf_import.py +0 -1487
  447. endoreg_db/services/__old/video_import.py +0 -1306
  448. endoreg_db/tasks/upload_tasks.py +0 -216
  449. endoreg_db/tasks/video_ingest.py +0 -161
  450. endoreg_db/tasks/video_processing_tasks.py +0 -327
  451. endoreg_db/views/misc/translation.py +0 -182
  452. {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/WHEEL +0 -0
  453. {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/licenses/LICENSE +0 -0
@@ -7,33 +7,28 @@ from typing import Optional, Union
7
7
 
8
8
  from endoreg_db.import_files.context.file_lock import file_lock
9
9
  from endoreg_db.import_files.context.import_context import ImportContext
10
- from endoreg_db.import_files.processing.report_processing.report_anonymization import (
11
- ReportAnonymizer,
12
- )
13
-
10
+ from endoreg_db.import_files.context.validate_directories import validate_directories
14
11
  from endoreg_db.import_files.file_storage.create_report_file import (
15
12
  create_or_retrieve_report_file,
16
13
  )
17
14
  from endoreg_db.import_files.file_storage.state_management import (
18
- finalize_report_success,
19
15
  finalize_failure,
16
+ finalize_report_success,
20
17
  mark_instance_processing_started,
21
18
  )
22
- from endoreg_db.import_files.context.validate_directories import validate_directories
23
-
24
19
  from endoreg_db.import_files.file_storage.storage import create_sensitive_copy
25
- from endoreg_db.models.media import RawPdfFile
26
- from endoreg_db.utils.paths import (
27
- SENSITIVE_REPORT_DIR,
20
+ from endoreg_db.import_files.processing.report_processing.report_anonymization import (
21
+ ReportAnonymizer,
28
22
  )
29
-
23
+ from endoreg_db.models.media import RawPdfFile
24
+ from endoreg_db.utils.paths import SENSITIVE_REPORT_DIR
30
25
 
31
26
  logger = logging.getLogger(__name__)
32
27
 
33
28
 
34
29
  class ReportImportService:
35
30
  """
36
- Service for importing and anonymizing report (PDF) files.
31
+ Service for importing and anonymizing report (report) files.
37
32
 
38
33
  Responsibilities:
39
34
  - Acquire file lock
@@ -49,9 +44,8 @@ class ReportImportService:
49
44
  self.anonymizer = ReportAnonymizer()
50
45
  self.processing_context: Optional[ImportContext] = None
51
46
  self.current_report: Optional[RawPdfFile] = None
52
-
53
- validate_directories()
54
47
 
48
+ validate_directories()
55
49
 
56
50
  def import_and_anonymize(
57
51
  self,
@@ -68,35 +62,49 @@ class ReportImportService:
68
62
  file_path=Path(file_path),
69
63
  center_name=center_name,
70
64
  delete_source=delete_source,
71
- file_type="report"
65
+ file_type="report",
66
+ original_path=Path(file_path),
72
67
  )
73
68
  self.logger.info("validating and preparing file")
74
69
  if not ctx.file_path.exists():
75
70
  raise FileNotFoundError(f"Video file not found: {file_path}")
76
71
 
77
- ctx.sensitive_path = create_sensitive_copy(
78
- ctx.file_path,
79
- SENSITIVE_REPORT_DIR
80
- )
72
+ ctx.sensitive_path = create_sensitive_copy(ctx.file_path, SENSITIVE_REPORT_DIR)
81
73
 
82
74
  with file_lock(ctx.file_path):
83
75
  logger.info("Acquired file lock for %s", ctx.file_path)
84
76
 
85
77
  # create or retrieve RawPdfFile + update history
86
- ctx.current_report, needs_processing = create_or_retrieve_report_file(ctx)
78
+ ctx.current_report, processed, needs_processing = (
79
+ create_or_retrieve_report_file(ctx)
80
+ )
87
81
  ctx.current_report.get_or_create_state()
88
- assert(ctx.current_report.state is not None)
82
+ assert ctx.current_report.state is not None
89
83
  ctx.current_report = ctx.current_report
90
-
91
- ctx.retry = retry
84
+
85
+ if processed == True or retry == True:
86
+ ctx.retry = True
87
+
92
88
  # Retry is a forced overwrite of needs processing - therefore the retry will cause full deletion of processed files using finalize failure.
93
- if retry and needs_processing and not ctx.current_report.state.anonymization_validated:
89
+ if (
90
+ ctx.retry
91
+ and needs_processing
92
+ and not ctx.current_report.state.anonymization_validated
93
+ ):
94
94
  # ensure clean slate for forced reprocessing
95
95
  finalize_failure(ctx)
96
- ctx.current_report, needs_processing = create_or_retrieve_report_file(ctx)
97
- assert(needs_processing is True)
98
- elif not needs_processing and not retry:
96
+ ctx.current_report, processed, needs_processing = (
97
+ create_or_retrieve_report_file(ctx)
98
+ )
99
+ assert needs_processing is True
100
+ elif not needs_processing and not ctx.retry:
99
101
  return ctx.current_report
102
+ else:
103
+ finalize_failure(ctx)
104
+ ctx.current_report, processed, needs_processing = (
105
+ create_or_retrieve_report_file(ctx)
106
+ )
107
+ assert needs_processing is True
100
108
 
101
109
  mark_instance_processing_started(ctx.current_report, ctx)
102
110
  try:
@@ -117,7 +125,7 @@ class ReportImportService:
117
125
  try:
118
126
  ctx = self.anonymizer.anonymize_report(ctx)
119
127
  except Exception as e:
120
- logger.error(f"PDF Extraction failed for the second time. {e}")
128
+ logger.error(f"report Extraction failed for the second time. {e}")
121
129
  raise
122
130
 
123
131
  logger.info(
@@ -137,5 +145,3 @@ class ReportImportService:
137
145
  # mark failure in history
138
146
  finalize_failure(ctx)
139
147
  raise
140
-
141
-
@@ -10,7 +10,7 @@ from endoreg_db.import_files.context import (
10
10
  )
11
11
  from endoreg_db.import_files.file_storage.state_management import (
12
12
  finalize_failure,
13
- finalize_video_success
13
+ finalize_video_success,
14
14
  )
15
15
  from endoreg_db.import_files.file_storage.storage import create_sensitive_copy
16
16
  from endoreg_db.import_files.file_storage.create_video_file import (
@@ -21,7 +21,9 @@ from endoreg_db.import_files.file_storage.state_management import (
21
21
  mark_instance_processing_started,
22
22
  )
23
23
  from endoreg_db.models import VideoFile
24
- from endoreg_db.import_files.processing.video_processing.video_anonymization import VideoAnonymizer
24
+ from endoreg_db.import_files.processing.video_processing.video_anonymization import (
25
+ VideoAnonymizer,
26
+ )
25
27
  from endoreg_db.utils.paths import (
26
28
  SENSITIVE_VIDEO_DIR,
27
29
  )
@@ -55,16 +57,15 @@ class VideoImportService:
55
57
  self.anonymizer = VideoAnonymizer()
56
58
  self.processing_context: Optional[ImportContext] = None
57
59
  self.current_video: Optional[VideoFile] = None
58
-
60
+
59
61
  validate_directories()
60
-
61
62
 
62
63
  def import_and_anonymize(
63
64
  self,
64
65
  file_path: Union[Path, str],
65
66
  center_name: str,
66
67
  processor_name: str,
67
- retry:bool = False,
68
+ retry: bool = False,
68
69
  delete_source: bool = True,
69
70
  ) -> "VideoFile | None":
70
71
  """
@@ -76,41 +77,43 @@ class VideoImportService:
76
77
  center_name=center_name,
77
78
  processor_name=processor_name,
78
79
  delete_source=delete_source,
79
- file_type="video"
80
+ file_type="video",
80
81
  )
81
82
  self.logger.info("validating and preparing file")
82
83
  if not ctx.file_path.exists():
83
84
  raise FileNotFoundError(f"Video file not found: {file_path}")
84
85
 
85
- ctx.sensitive_path = create_sensitive_copy(
86
- ctx.file_path,
87
- SENSITIVE_VIDEO_DIR
88
- )
86
+ ctx.sensitive_path = create_sensitive_copy(ctx.file_path, SENSITIVE_VIDEO_DIR)
89
87
 
90
88
  with file_lock(ctx.file_path):
91
89
  logger.info("Acquired file lock for %s", ctx.file_path)
92
90
 
93
-
94
91
  # create or retrieve VideoFile + update history
95
- ctx.current_video, needs_processing = (
92
+ ctx.current_video, processed, needs_processing = (
96
93
  create_or_retrieve_video_file(ctx)
97
94
  )
98
95
  ctx.current_video.get_or_create_state()
99
- assert(ctx.current_video.state is not None)
96
+ assert ctx.current_video.state is not None
100
97
  ctx.current_video = ctx.current_video
101
-
98
+
102
99
  ctx.retry = retry
103
100
  # Retry is a forced overwrite of needs processing - therefore the retry will cause full deletion of processed files using finalize failure.
104
101
 
105
- if retry and needs_processing and not ctx.current_video.state.anonymization_validated:
102
+ if (
103
+ retry
104
+ and needs_processing
105
+ and not ctx.current_video.state.anonymization_validated
106
+ ):
106
107
  finalize_failure(ctx)
107
- ctx.current_video, needs_processing = create_or_retrieve_video_file(ctx)
108
- assert(needs_processing is True)
108
+ ctx.current_video, processed, needs_processing = (
109
+ create_or_retrieve_video_file(ctx)
110
+ )
111
+ assert needs_processing is True
109
112
  elif not needs_processing and not retry:
110
113
  return ctx.current_video
111
114
 
112
115
  mark_instance_processing_started(ctx.current_video, ctx)
113
- try:
116
+ try:
114
117
  # --- Anonymization with fallback ---
115
118
  try:
116
119
  ctx = self.anonymizer.anonymize_video(ctx)
@@ -128,20 +131,21 @@ class VideoImportService:
128
131
  try:
129
132
  ctx = self.anonymizer.anonymize_video(ctx)
130
133
  except Exception as e:
131
- logger.error(f"Video Extraction failed for the second time. {e}")
134
+ logger.error(
135
+ f"Video Extraction failed for the second time. {e}"
136
+ )
132
137
  raise
133
138
  logger.info(
134
139
  "Secondary video anonymization succeeded for %s",
135
140
  ctx.file_path,
136
141
  )
137
142
  logger.info(f"Anonymized Video is located at: {ctx.anonymized_path}")
138
-
143
+
139
144
  # --- Finalize success: history + move anonymized file ---
140
145
  finalize_video_success(ctx)
141
-
146
+
142
147
  return ctx.current_video
143
-
144
-
148
+
145
149
  except Exception as exc:
146
150
  logger.exception(
147
151
  "Video import/anonymization failed for %s: %s", ctx.file_path, exc
endoreg_db/logger_conf.py CHANGED
@@ -1,4 +1,3 @@
1
- import logging
2
1
  from pathlib import Path
3
2
  import os
4
3
 
@@ -6,6 +5,7 @@ LOG_DIR = Path("data/logs")
6
5
  DEFAULT_FILE_LOG_LEVEL = "INFO"
7
6
  DEFAULT_CONSOLE_LOG_LEVEL = "WARNING"
8
7
 
8
+
9
9
  def clear_log_files(logger_names, log_dir=None):
10
10
  """
11
11
  Clears specified log files in the log directory.
@@ -20,8 +20,10 @@ def clear_log_files(logger_names, log_dir=None):
20
20
  log_dir.mkdir(parents=True, exist_ok=True)
21
21
 
22
22
  # Files to manage
23
- log_files_to_clear = [log_dir / f"{logger_name}.log" for logger_name in logger_names]
24
- log_files_to_clear.append(log_dir / "root.log") # Add root log file
23
+ log_files_to_clear = [
24
+ log_dir / f"{logger_name}.log" for logger_name in logger_names
25
+ ]
26
+ log_files_to_clear.append(log_dir / "root.log") # Add root log file
25
27
 
26
28
  # Clear existing log files in the directory managed by this config
27
29
  for log_file in log_files_to_clear:
@@ -34,7 +36,10 @@ def clear_log_files(logger_names, log_dir=None):
34
36
  # Optionally, create the log file to ensure it exists after clearing
35
37
  # log_file.touch() # Removed touch to just clear
36
38
 
37
- def get_logging_config(logger_names, file_log_level=None, console_log_level=None, log_dir=None):
39
+
40
+ def get_logging_config(
41
+ logger_names, file_log_level=None, console_log_level=None, log_dir=None
42
+ ):
38
43
  """
39
44
  Generates Django LOGGING configuration dynamically.
40
45
 
@@ -47,38 +52,42 @@ def get_logging_config(logger_names, file_log_level=None, console_log_level=None
47
52
  Returns:
48
53
  dict: The Django LOGGING configuration dictionary.
49
54
  """
50
- file_log_level = file_log_level or os.environ.get("FILE_LOG_LEVEL", DEFAULT_FILE_LOG_LEVEL)
51
- console_log_level = console_log_level or os.environ.get("CONSOLE_LOG_LEVEL", DEFAULT_CONSOLE_LOG_LEVEL)
55
+ file_log_level = file_log_level or os.environ.get(
56
+ "FILE_LOG_LEVEL", DEFAULT_FILE_LOG_LEVEL
57
+ )
58
+ console_log_level = console_log_level or os.environ.get(
59
+ "CONSOLE_LOG_LEVEL", DEFAULT_CONSOLE_LOG_LEVEL
60
+ )
52
61
  log_dir = log_dir or LOG_DIR
53
62
 
54
63
  # Ensure log directory exists
55
64
  log_dir.mkdir(parents=True, exist_ok=True)
56
65
 
57
66
  handlers = {
58
- 'console': {
59
- 'level': console_log_level, # Use console level
60
- 'class': 'logging.StreamHandler',
61
- 'formatter': 'standard',
67
+ "console": {
68
+ "level": console_log_level, # Use console level
69
+ "class": "logging.StreamHandler",
70
+ "formatter": "standard",
62
71
  },
63
- 'file_root': { # Handler for the root logger's file
64
- 'level': file_log_level, # Use file level
65
- 'class': 'logging.FileHandler',
66
- 'filename': log_dir / "root.log",
67
- 'formatter': 'standard',
72
+ "file_root": { # Handler for the root logger's file
73
+ "level": file_log_level, # Use file level
74
+ "class": "logging.FileHandler",
75
+ "filename": log_dir / "root.log",
76
+ "formatter": "standard",
68
77
  },
69
78
  }
70
79
  loggers = {
71
80
  # Root logger configuration - logs INFO+ to file, WARNING+ to console
72
- '': {
73
- 'handlers': ['console', 'file_root'], # Use both handlers
74
- 'level': file_log_level, # Set to lowest level needed (INFO for file)
75
- 'propagate': False, # Root logger doesn't propagate further
81
+ "": {
82
+ "handlers": ["console", "file_root"], # Use both handlers
83
+ "level": file_log_level, # Set to lowest level needed (INFO for file)
84
+ "propagate": False, # Root logger doesn't propagate further
76
85
  },
77
- # Django's default logger
78
- 'django': {
79
- 'handlers': ['console', 'file_root'], # Log to console and root file
80
- 'level': file_log_level, # Or your preferred level, ensure it's captured by root file
81
- 'propagate': False, # Don't propagate Django logs to avoid double handling by root
86
+ # Django's default logger
87
+ "django": {
88
+ "handlers": ["console", "file_root"], # Log to console and root file
89
+ "level": file_log_level, # Or your preferred level, ensure it's captured by root file
90
+ "propagate": False, # Don't propagate Django logs to avoid double handling by root
82
91
  },
83
92
  }
84
93
 
@@ -86,33 +95,34 @@ def get_logging_config(logger_names, file_log_level=None, console_log_level=None
86
95
  for name in logger_names:
87
96
  handler_name = f"file_{name}"
88
97
  handlers[handler_name] = {
89
- 'level': file_log_level, # Use file level
90
- 'class': 'logging.FileHandler',
91
- 'filename': log_dir / f"{name}.log",
92
- 'formatter': 'standard',
98
+ "level": file_log_level, # Use file level
99
+ "class": "logging.FileHandler",
100
+ "filename": log_dir / f"{name}.log",
101
+ "formatter": "standard",
93
102
  }
94
103
  loggers[name] = {
95
- 'handlers': [handler_name], # Log only to its own file directly
96
- 'level': file_log_level, # Use file level
97
- 'propagate': True, # Propagate to root logger (which handles console and root.log)
104
+ "handlers": [handler_name], # Log only to its own file directly
105
+ "level": file_log_level, # Use file level
106
+ "propagate": True, # Propagate to root logger (which handles console and root.log)
98
107
  }
99
108
 
100
109
  return {
101
- 'version': 1,
102
- 'disable_existing_loggers': False,
103
- 'formatters': {
104
- 'standard': {
105
- 'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
110
+ "version": 1,
111
+ "disable_existing_loggers": False,
112
+ "formatters": {
113
+ "standard": {
114
+ "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
106
115
  },
107
116
  },
108
- 'handlers': handlers,
109
- 'loggers': loggers,
117
+ "handlers": handlers,
118
+ "loggers": loggers,
110
119
  }
111
120
 
121
+
112
122
  # Example usage (optional, for testing the function itself)
113
123
  if __name__ == "__main__":
114
124
  test_loggers = ["app1", "app2", "database"]
115
- log_directory = Path("data/logs_test") # Use a test directory
125
+ log_directory = Path("data/logs_test") # Use a test directory
116
126
 
117
127
  # Optionally clear logs before configuring logging
118
128
  print("Clearing logs...")
@@ -120,8 +130,14 @@ if __name__ == "__main__":
120
130
  print("Log clearing complete.")
121
131
 
122
132
  # Get logging configuration
123
- logging_config = get_logging_config(test_loggers, file_log_level="DEBUG", console_log_level="WARNING", log_dir=log_directory)
133
+ logging_config = get_logging_config(
134
+ test_loggers,
135
+ file_log_level="DEBUG",
136
+ console_log_level="WARNING",
137
+ log_dir=log_directory,
138
+ )
124
139
  import json
140
+
125
141
  print("\nGenerated Logging Configuration:")
126
142
  print(json.dumps(logging_config, indent=4))
127
143
 
@@ -1 +1 @@
1
- # Management commands package
1
+ # Management commands package
@@ -1 +1 @@
1
- # Management commands
1
+ # Management commands
@@ -4,68 +4,71 @@ Management command to check and configure authentication settings.
4
4
 
5
5
  from django.core.management.base import BaseCommand
6
6
  from django.conf import settings
7
- from rest_framework.permissions import IsAuthenticated, AllowAny
8
7
  import os
9
8
 
10
9
 
11
10
  class Command(BaseCommand):
12
- help = 'Check and configure authentication settings based on environment'
11
+ help = "Check and configure authentication settings based on environment"
13
12
 
14
13
  def add_arguments(self, parser):
15
14
  parser.add_argument(
16
- '--mode',
17
- choices=['check', 'dev', 'prod'],
18
- default='check',
19
- help='Mode: check current settings, set dev mode, or set prod mode'
15
+ "--mode",
16
+ choices=["check", "dev", "prod"],
17
+ default="check",
18
+ help="Mode: check current settings, set dev mode, or set prod mode",
20
19
  )
21
20
  parser.add_argument(
22
- '--show-permissions',
23
- action='store_true',
24
- help='Show which permission classes will be used'
21
+ "--show-permissions",
22
+ action="store_true",
23
+ help="Show which permission classes will be used",
25
24
  )
26
25
 
27
26
  def handle(self, *args, **options):
28
- mode = options['mode']
29
-
30
- if mode == 'check':
27
+ mode = options["mode"]
28
+
29
+ if mode == "check":
31
30
  self.check_current_settings()
32
- elif mode == 'dev':
31
+ elif mode == "dev":
33
32
  self.set_dev_mode()
34
- elif mode == 'prod':
33
+ elif mode == "prod":
35
34
  self.set_prod_mode()
36
-
37
- if options['show_permissions']:
35
+
36
+ if options["show_permissions"]:
38
37
  self.show_permission_classes()
39
38
 
40
39
  def check_current_settings(self):
41
40
  """Check current authentication configuration."""
42
- debug_mode = getattr(settings, 'DEBUG', False)
43
- settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', 'Unknown')
44
-
45
- self.stdout.write("\n" + "="*50)
41
+ debug_mode = getattr(settings, "DEBUG", False)
42
+ settings_module = os.environ.get("DJANGO_SETTINGS_MODULE", "Unknown")
43
+
44
+ self.stdout.write("\n" + "=" * 50)
46
45
  self.stdout.write("🔍 AUTHENTICATION CONFIGURATION CHECK")
47
- self.stdout.write("="*50)
48
-
46
+ self.stdout.write("=" * 50)
47
+
49
48
  self.stdout.write(f"Settings Module: {settings_module}")
50
49
  self.stdout.write(f"DEBUG Mode: {debug_mode}")
51
-
50
+
52
51
  if debug_mode:
53
- self.stdout.write(self.style.WARNING("🔓 Authentication: DISABLED (AllowAny)"))
52
+ self.stdout.write(
53
+ self.style.WARNING("🔓 Authentication: DISABLED (AllowAny)")
54
+ )
54
55
  self.stdout.write(" - All API endpoints are accessible without login")
55
56
  self.stdout.write(" - Suitable for development and testing")
56
57
  else:
57
- self.stdout.write(self.style.SUCCESS("🔒 Authentication: ENABLED (IsAuthenticated)"))
58
+ self.stdout.write(
59
+ self.style.SUCCESS("🔒 Authentication: ENABLED (IsAuthenticated)")
60
+ )
58
61
  self.stdout.write(" - API endpoints require valid authentication")
59
62
  self.stdout.write(" - Suitable for production deployment")
60
-
63
+
61
64
  # Check if Keycloak is configured
62
- keycloak_server = getattr(settings, 'KEYCLOAK_SERVER_URL', None)
65
+ keycloak_server = getattr(settings, "KEYCLOAK_SERVER_URL", None)
63
66
  if keycloak_server:
64
67
  self.stdout.write(f"Keycloak Server: {keycloak_server}")
65
68
  else:
66
69
  self.stdout.write(self.style.WARNING("⚠️ Keycloak not configured"))
67
-
68
- self.stdout.write("="*50 + "\n")
70
+
71
+ self.stdout.write("=" * 50 + "\n")
69
72
 
70
73
  def set_dev_mode(self):
71
74
  """Instructions for setting development mode."""
@@ -79,7 +82,9 @@ class Command(BaseCommand):
79
82
  self.stdout.write("2. Or run with explicit settings:")
80
83
  self.stdout.write(" python manage.py runserver --settings=dev.dev_settings")
81
84
  self.stdout.write("")
82
- self.stdout.write("This will set DEBUG=True and disable authentication requirements.")
85
+ self.stdout.write(
86
+ "This will set DEBUG=True and disable authentication requirements."
87
+ )
83
88
 
84
89
  def set_prod_mode(self):
85
90
  """Instructions for setting production mode."""
@@ -94,23 +99,25 @@ class Command(BaseCommand):
94
99
  self.stdout.write(" export DJANGO_SECRET_KEY='your-secure-secret-key'")
95
100
  self.stdout.write(" export KEYCLOAK_CLIENT_SECRET='your-keycloak-secret'")
96
101
  self.stdout.write("")
97
- self.stdout.write("This will set DEBUG=False and enable authentication requirements.")
102
+ self.stdout.write(
103
+ "This will set DEBUG=False and enable authentication requirements."
104
+ )
98
105
 
99
106
  def show_permission_classes(self):
100
107
  """Show which permission classes are being used."""
101
- debug_mode = getattr(settings, 'DEBUG', False)
102
-
103
- self.stdout.write("\n" + "="*40)
108
+ debug_mode = getattr(settings, "DEBUG", False)
109
+
110
+ self.stdout.write("\n" + "=" * 40)
104
111
  self.stdout.write("🔐 PERMISSION CLASSES IN USE")
105
- self.stdout.write("="*40)
106
-
112
+ self.stdout.write("=" * 40)
113
+
107
114
  if debug_mode:
108
115
  permission_class = "AllowAny"
109
116
  icon = "🔓"
110
117
  else:
111
118
  permission_class = "IsAuthenticated"
112
119
  icon = "🔒"
113
-
120
+
114
121
  self.stdout.write(f"{icon} Current Mode: {permission_class}")
115
122
  self.stdout.write("")
116
123
  self.stdout.write("Views using dynamic permissions:")
@@ -122,4 +129,4 @@ class Command(BaseCommand):
122
129
  self.stdout.write(" • video_segment_detail_view")
123
130
  self.stdout.write(" • video_segments_by_label_id_view")
124
131
  self.stdout.write(" • video_segments_by_label_name_view")
125
- self.stdout.write("="*40 + "\n")
132
+ self.stdout.write("=" * 40 + "\n")
@@ -2,8 +2,6 @@
2
2
  Django management command to create ModelMeta from Hugging Face model.
3
3
  """
4
4
 
5
- from pathlib import Path
6
-
7
5
  from django.core.files.base import ContentFile
8
6
  from django.core.management.base import BaseCommand, CommandError
9
7
  from huggingface_hub import hf_hub_download
@@ -124,3 +122,56 @@ class Command(BaseCommand):
124
122
 
125
123
  traceback.print_exc()
126
124
  raise CommandError("ModelMeta creation failed") from e
125
+
126
+
127
+ # TODO Review slimmed down version using service endoreg_db/services/model_meta_from_hf.py
128
+ # your management command file
129
+ # from django.core.management.base import BaseCommand, CommandError
130
+
131
+ # from endoreg_db.services.model_meta_from_hf import ensure_model_meta_from_hf
132
+
133
+
134
+ # class Command(BaseCommand):
135
+ # help = "Create ModelMeta by downloading model from Hugging Face"
136
+
137
+ # def add_arguments(self, parser):
138
+ # parser.add_argument(
139
+ # "--model_id",
140
+ # type=str,
141
+ # default="wg-lux/colo_segmentation_RegNetX800MF_base",
142
+ # )
143
+ # parser.add_argument(
144
+ # "--model_name",
145
+ # type=str,
146
+ # default="image_multilabel_classification_colonoscopy_default",
147
+ # )
148
+ # parser.add_argument(
149
+ # "--labelset_name",
150
+ # type=str,
151
+ # default="multilabel_classification_colonoscopy_default",
152
+ # )
153
+ # parser.add_argument(
154
+ # "--meta_version",
155
+ # type=str,
156
+ # default="1",
157
+ # )
158
+ # parser.add_argument(
159
+ # "--labelset_version",
160
+ # type=int,
161
+ # default=None,
162
+ # )
163
+
164
+ # def handle(self, *args, **options):
165
+ # try:
166
+ # model_meta = ensure_model_meta_from_hf(
167
+ # model_id=options["model_id"],
168
+ # model_name=options["model_name"],
169
+ # labelset_name=options["labelset_name"],
170
+ # meta_version=options["meta_version"],
171
+ # labelset_version=options.get("labelset_version"),
172
+ # )
173
+ # self.stdout.write(
174
+ # self.style.SUCCESS(f"Successfully ensured ModelMeta: {model_meta}")
175
+ # )
176
+ # except Exception as e:
177
+ # raise CommandError(f"ModelMeta creation failed: {e}") from e