endoreg-db 0.8.8.0__py3-none-any.whl → 0.8.9.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of endoreg-db might be problematic. Click here for more details.

Files changed (402) hide show
  1. endoreg_db/data/__init__.py +22 -8
  2. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +0 -1
  3. endoreg_db/data/examination/examinations/data.yaml +114 -14
  4. endoreg_db/data/examination/time-type/data.yaml +0 -3
  5. endoreg_db/data/examination_indication/endoscopy.yaml +108 -173
  6. endoreg_db/data/examination_indication_classification/endoscopy.yaml +0 -70
  7. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +33 -37
  8. endoreg_db/data/finding/00_generic.yaml +35 -0
  9. endoreg_db/data/finding/00_generic_complication.yaml +9 -0
  10. endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
  11. endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
  12. endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
  13. endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
  14. endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
  15. endoreg_db/data/finding_classification/00_generic.yaml +44 -0
  16. endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
  17. endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
  18. endoreg_db/data/finding_classification/{colonoscopy_bowel_preparation.yaml → 02_colonoscopy_baseline.yaml} +35 -20
  19. endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
  20. endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
  21. endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
  22. endoreg_db/data/finding_classification_choice/{yes_no_na.yaml → 00_generic.yaml} +5 -1
  23. endoreg_db/data/finding_classification_choice/{examination_setting_generic_types.yaml → 00_generic_baseline.yaml} +10 -2
  24. endoreg_db/data/finding_classification_choice/{complication_generic_types.yaml → 00_generic_complication.yaml} +1 -1
  25. endoreg_db/data/finding_classification_choice/{histology.yaml → 00_generic_histology.yaml} +1 -4
  26. endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
  27. endoreg_db/data/finding_classification_choice/{bowel_preparation.yaml → 02_colonoscopy_bowel_preparation.yaml} +1 -30
  28. endoreg_db/data/{_examples/finding_classification_choice/colonoscopy_not_complete_reason.yaml → finding_classification_choice/02_colonoscopy_generic.yaml} +1 -1
  29. endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
  30. endoreg_db/data/{_examples/finding_classification_choice/colonoscopy_location.yaml → finding_classification_choice/02_colonoscopy_location.yaml} +23 -4
  31. endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
  32. endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
  33. endoreg_db/data/{_examples/finding_classification_choice/colon_lesion_paris.yaml → finding_classification_choice/02_colonoscopy_polyp_morphology.yaml} +26 -8
  34. endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
  35. endoreg_db/data/finding_classification_type/{colonoscopy_basic.yaml → 00_generic.yaml} +18 -13
  36. endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
  37. endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
  38. endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
  39. endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
  40. endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
  41. endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
  42. endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
  43. endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
  44. endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
  45. endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
  46. endoreg_db/data/finding_type/data.yaml +8 -12
  47. endoreg_db/data/requirement/01_patient_data.yaml +93 -0
  48. endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
  49. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +0 -2
  50. endoreg_db/data/requirement_set/90_coloreg.yaml +20 -8
  51. endoreg_db/exceptions.py +0 -1
  52. endoreg_db/forms/examination_form.py +1 -1
  53. endoreg_db/helpers/data_loader.py +124 -52
  54. endoreg_db/helpers/default_objects.py +116 -81
  55. endoreg_db/import_files/__init__.py +27 -0
  56. endoreg_db/import_files/context/__init__.py +7 -0
  57. endoreg_db/import_files/context/default_sensitive_meta.py +81 -0
  58. endoreg_db/import_files/context/ensure_center.py +17 -0
  59. endoreg_db/import_files/context/file_lock.py +66 -0
  60. endoreg_db/import_files/context/import_context.py +43 -0
  61. endoreg_db/import_files/context/validate_directories.py +56 -0
  62. endoreg_db/import_files/file_storage/__init__.py +15 -0
  63. endoreg_db/import_files/file_storage/create_report_file.py +76 -0
  64. endoreg_db/import_files/file_storage/create_video_file.py +75 -0
  65. endoreg_db/import_files/file_storage/sensitive_meta_storage.py +39 -0
  66. endoreg_db/import_files/file_storage/state_management.py +496 -0
  67. endoreg_db/import_files/file_storage/storage.py +36 -0
  68. endoreg_db/import_files/import_service.md +26 -0
  69. endoreg_db/import_files/processing/__init__.py +11 -0
  70. endoreg_db/import_files/processing/report_processing/report_anonymization.py +94 -0
  71. endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
  72. endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
  73. endoreg_db/import_files/pseudonymization/fake.py +52 -0
  74. endoreg_db/import_files/pseudonymization/k_anonymity.py +182 -0
  75. endoreg_db/import_files/pseudonymization/k_pseudonymity.py +128 -0
  76. endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
  77. endoreg_db/import_files/report_import_service.py +141 -0
  78. endoreg_db/import_files/video_import_service.py +150 -0
  79. endoreg_db/management/commands/import_report.py +130 -65
  80. endoreg_db/management/commands/import_video_with_classification.py +1 -1
  81. endoreg_db/management/commands/load_ai_model_data.py +5 -5
  82. endoreg_db/management/commands/load_ai_model_label_data.py +9 -7
  83. endoreg_db/management/commands/load_base_db_data.py +5 -134
  84. endoreg_db/management/commands/load_contraindication_data.py +14 -16
  85. endoreg_db/management/commands/load_disease_classification_choices_data.py +15 -18
  86. endoreg_db/management/commands/load_disease_classification_data.py +15 -18
  87. endoreg_db/management/commands/load_disease_data.py +25 -28
  88. endoreg_db/management/commands/load_endoscope_data.py +20 -27
  89. endoreg_db/management/commands/load_event_data.py +14 -16
  90. endoreg_db/management/commands/load_examination_data.py +31 -44
  91. endoreg_db/management/commands/load_examination_indication_data.py +20 -21
  92. endoreg_db/management/commands/load_finding_data.py +52 -80
  93. endoreg_db/management/commands/load_information_source.py +21 -23
  94. endoreg_db/management/commands/load_lab_value_data.py +17 -26
  95. endoreg_db/management/commands/load_medication_data.py +13 -12
  96. endoreg_db/management/commands/load_organ_data.py +15 -19
  97. endoreg_db/management/commands/load_pdf_type_data.py +19 -18
  98. endoreg_db/management/commands/load_profession_data.py +14 -17
  99. endoreg_db/management/commands/load_qualification_data.py +20 -23
  100. endoreg_db/management/commands/load_report_reader_flag_data.py +17 -19
  101. endoreg_db/management/commands/load_requirement_data.py +14 -20
  102. endoreg_db/management/commands/load_risk_data.py +7 -6
  103. endoreg_db/management/commands/load_shift_data.py +20 -23
  104. endoreg_db/management/commands/load_tag_data.py +8 -11
  105. endoreg_db/management/commands/load_unit_data.py +17 -19
  106. endoreg_db/management/commands/start_filewatcher.py +46 -37
  107. endoreg_db/management/commands/validate_video_files.py +1 -5
  108. endoreg_db/migrations/0001_initial.py +1360 -1812
  109. endoreg_db/models/administration/person/patient/patient.py +72 -46
  110. endoreg_db/models/label/__init__.py +2 -2
  111. endoreg_db/models/label/annotation/video_segmentation_annotation.py +18 -26
  112. endoreg_db/models/label/label_video_segment/label_video_segment.py +23 -1
  113. endoreg_db/models/media/pdf/raw_pdf.py +136 -64
  114. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +34 -10
  115. endoreg_db/models/media/processing_history/__init__.py +5 -0
  116. endoreg_db/models/media/processing_history/processing_history.py +96 -0
  117. endoreg_db/models/media/video/create_from_file.py +101 -31
  118. endoreg_db/models/media/video/video_file.py +125 -105
  119. endoreg_db/models/media/video/video_file_io.py +31 -26
  120. endoreg_db/models/medical/contraindication/README.md +1 -0
  121. endoreg_db/models/medical/examination/examination.py +28 -8
  122. endoreg_db/models/medical/examination/examination_indication.py +13 -79
  123. endoreg_db/models/medical/examination/examination_time.py +8 -3
  124. endoreg_db/models/medical/finding/finding.py +5 -12
  125. endoreg_db/models/medical/finding/finding_classification.py +18 -37
  126. endoreg_db/models/medical/finding/finding_intervention.py +7 -9
  127. endoreg_db/models/medical/hardware/endoscope.py +6 -0
  128. endoreg_db/models/medical/patient/medication_examples.py +5 -1
  129. endoreg_db/models/medical/patient/patient_finding.py +1 -1
  130. endoreg_db/models/metadata/pdf_meta.py +22 -10
  131. endoreg_db/models/metadata/sensitive_meta.py +3 -0
  132. endoreg_db/models/metadata/sensitive_meta_logic.py +200 -124
  133. endoreg_db/models/other/information_source.py +27 -6
  134. endoreg_db/models/report/__init__.py +0 -0
  135. endoreg_db/models/report/images.py +0 -0
  136. endoreg_db/models/report/report.py +6 -0
  137. endoreg_db/models/requirement/requirement.py +59 -399
  138. endoreg_db/models/requirement/requirement_operator.py +86 -98
  139. endoreg_db/models/state/audit_ledger.py +4 -5
  140. endoreg_db/models/state/raw_pdf.py +69 -30
  141. endoreg_db/models/state/video.py +65 -49
  142. endoreg_db/models/upload_job.py +33 -9
  143. endoreg_db/models/utils.py +27 -23
  144. endoreg_db/queries/__init__.py +3 -1
  145. endoreg_db/schemas/examination_evaluation.py +1 -1
  146. endoreg_db/serializers/__init__.py +2 -8
  147. endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
  148. endoreg_db/serializers/meta/__init__.py +1 -6
  149. endoreg_db/serializers/misc/sensitive_patient_data.py +50 -26
  150. endoreg_db/serializers/patient_examination/patient_examination.py +3 -3
  151. endoreg_db/serializers/pdf/anony_text_validation.py +39 -23
  152. endoreg_db/serializers/video/video_file_list.py +65 -34
  153. endoreg_db/services/__old/pdf_import.py +1487 -0
  154. endoreg_db/services/__old/video_import.py +1306 -0
  155. endoreg_db/services/anonymization.py +63 -26
  156. endoreg_db/services/lookup_service.py +28 -28
  157. endoreg_db/services/lookup_store.py +2 -2
  158. endoreg_db/services/pdf_import.py +0 -1480
  159. endoreg_db/services/report_import.py +10 -0
  160. endoreg_db/services/video_import.py +6 -1165
  161. endoreg_db/tasks/upload_tasks.py +79 -70
  162. endoreg_db/tasks/video_ingest.py +8 -4
  163. endoreg_db/urls/__init__.py +0 -14
  164. endoreg_db/urls/ai.py +32 -0
  165. endoreg_db/urls/media.py +21 -24
  166. endoreg_db/utils/dataloader.py +87 -57
  167. endoreg_db/utils/paths.py +110 -46
  168. endoreg_db/utils/pipelines/Readme.md +1 -1
  169. endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
  170. endoreg_db/utils/video/ffmpeg_wrapper.py +217 -52
  171. endoreg_db/views/__init__.py +85 -173
  172. endoreg_db/views/ai/__init__.py +8 -0
  173. endoreg_db/views/ai/label.py +155 -0
  174. endoreg_db/views/anonymization/media_management.py +8 -7
  175. endoreg_db/views/anonymization/overview.py +97 -68
  176. endoreg_db/views/anonymization/validate.py +25 -21
  177. endoreg_db/views/media/__init__.py +5 -20
  178. endoreg_db/views/media/pdf_media.py +109 -65
  179. endoreg_db/views/media/sensitive_metadata.py +163 -148
  180. endoreg_db/views/meta/__init__.py +0 -8
  181. endoreg_db/views/misc/__init__.py +1 -7
  182. endoreg_db/views/misc/upload_views.py +94 -93
  183. endoreg_db/views/report/__init__.py +7 -0
  184. endoreg_db/views/{pdf → report}/reimport.py +45 -24
  185. endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +40 -32
  186. endoreg_db/views/requirement/lookup_store.py +22 -90
  187. endoreg_db/views/video/__init__.py +23 -22
  188. endoreg_db/views/video/correction.py +201 -172
  189. endoreg_db/views/video/reimport.py +1 -1
  190. endoreg_db/views/{media/video_segments.py → video/segments_crud.py} +75 -37
  191. endoreg_db/views/video/{video_meta.py → video_meta_stats.py} +2 -2
  192. endoreg_db/views/video/video_stream.py +7 -8
  193. {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/METADATA +2 -2
  194. {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/RECORD +217 -335
  195. {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/WHEEL +1 -1
  196. endoreg_db/data/_examples/disease.yaml +0 -55
  197. endoreg_db/data/_examples/disease_classification.yaml +0 -13
  198. endoreg_db/data/_examples/disease_classification_choice.yaml +0 -62
  199. endoreg_db/data/_examples/event.yaml +0 -64
  200. endoreg_db/data/_examples/examination.yaml +0 -72
  201. endoreg_db/data/_examples/finding/anatomy_colon.yaml +0 -128
  202. endoreg_db/data/_examples/finding/colonoscopy.yaml +0 -40
  203. endoreg_db/data/_examples/finding/colonoscopy_bowel_prep.yaml +0 -56
  204. endoreg_db/data/_examples/finding/complication.yaml +0 -16
  205. endoreg_db/data/_examples/finding/data.yaml +0 -105
  206. endoreg_db/data/_examples/finding/examination_setting.yaml +0 -16
  207. endoreg_db/data/_examples/finding/medication_related.yaml +0 -18
  208. endoreg_db/data/_examples/finding/outcome.yaml +0 -12
  209. endoreg_db/data/_examples/finding_classification/colonoscopy_bowel_preparation.yaml +0 -68
  210. endoreg_db/data/_examples/finding_classification/colonoscopy_jnet.yaml +0 -22
  211. endoreg_db/data/_examples/finding_classification/colonoscopy_kudo.yaml +0 -25
  212. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
  213. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
  214. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_size.yaml +0 -68
  215. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
  216. endoreg_db/data/_examples/finding_classification/colonoscopy_location.yaml +0 -80
  217. endoreg_db/data/_examples/finding_classification/colonoscopy_lst.yaml +0 -21
  218. endoreg_db/data/_examples/finding_classification/colonoscopy_nice.yaml +0 -20
  219. endoreg_db/data/_examples/finding_classification/colonoscopy_paris.yaml +0 -26
  220. endoreg_db/data/_examples/finding_classification/colonoscopy_sano.yaml +0 -22
  221. endoreg_db/data/_examples/finding_classification/colonoscopy_summary.yaml +0 -53
  222. endoreg_db/data/_examples/finding_classification/complication_generic.yaml +0 -25
  223. endoreg_db/data/_examples/finding_classification/examination_setting_generic.yaml +0 -40
  224. endoreg_db/data/_examples/finding_classification/histology_colo.yaml +0 -51
  225. endoreg_db/data/_examples/finding_classification/intervention_required.yaml +0 -26
  226. endoreg_db/data/_examples/finding_classification/medication_related.yaml +0 -23
  227. endoreg_db/data/_examples/finding_classification/visualized.yaml +0 -33
  228. endoreg_db/data/_examples/finding_classification_choice/bowel_preparation.yaml +0 -78
  229. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
  230. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
  231. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
  232. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_lst.yaml +0 -15
  233. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_nice.yaml +0 -17
  234. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
  235. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_sano.yaml +0 -14
  236. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
  237. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_size.yaml +0 -82
  238. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
  239. endoreg_db/data/_examples/finding_classification_choice/complication_generic_types.yaml +0 -15
  240. endoreg_db/data/_examples/finding_classification_choice/examination_setting_generic_types.yaml +0 -15
  241. endoreg_db/data/_examples/finding_classification_choice/histology.yaml +0 -24
  242. endoreg_db/data/_examples/finding_classification_choice/histology_polyp.yaml +0 -20
  243. endoreg_db/data/_examples/finding_classification_choice/outcome.yaml +0 -19
  244. endoreg_db/data/_examples/finding_classification_choice/yes_no_na.yaml +0 -11
  245. endoreg_db/data/_examples/finding_classification_type/colonoscopy_basic.yaml +0 -48
  246. endoreg_db/data/_examples/finding_intervention/endoscopy.yaml +0 -43
  247. endoreg_db/data/_examples/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
  248. endoreg_db/data/_examples/finding_intervention/endoscopy_egd.yaml +0 -128
  249. endoreg_db/data/_examples/finding_intervention/endoscopy_ercp.yaml +0 -32
  250. endoreg_db/data/_examples/finding_intervention/endoscopy_eus_lower.yaml +0 -9
  251. endoreg_db/data/_examples/finding_intervention/endoscopy_eus_upper.yaml +0 -36
  252. endoreg_db/data/_examples/finding_intervention_type/endoscopy.yaml +0 -15
  253. endoreg_db/data/_examples/finding_type/data.yaml +0 -43
  254. endoreg_db/data/_examples/requirement/age.yaml +0 -26
  255. endoreg_db/data/_examples/requirement/gender.yaml +0 -25
  256. endoreg_db/data/_examples/requirement_set/01_endoscopy_generic.yaml +0 -48
  257. endoreg_db/data/_examples/requirement_set/colonoscopy_austria_screening.yaml +0 -57
  258. endoreg_db/data/_examples/requirement_set/endoscopy_bleeding_risk.yaml +0 -52
  259. endoreg_db/data/_examples/yaml_examples.xlsx +0 -0
  260. endoreg_db/data/finding/anatomy_colon.yaml +0 -128
  261. endoreg_db/data/finding/colonoscopy.yaml +0 -40
  262. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +0 -56
  263. endoreg_db/data/finding/complication.yaml +0 -16
  264. endoreg_db/data/finding/data.yaml +0 -105
  265. endoreg_db/data/finding/examination_setting.yaml +0 -16
  266. endoreg_db/data/finding/medication_related.yaml +0 -18
  267. endoreg_db/data/finding/outcome.yaml +0 -12
  268. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +0 -22
  269. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +0 -25
  270. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
  271. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
  272. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +0 -38
  273. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
  274. endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -49
  275. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +0 -21
  276. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +0 -20
  277. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +0 -26
  278. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +0 -22
  279. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +0 -53
  280. endoreg_db/data/finding_classification/complication_generic.yaml +0 -25
  281. endoreg_db/data/finding_classification/examination_setting_generic.yaml +0 -40
  282. endoreg_db/data/finding_classification/histology_colo.yaml +0 -43
  283. endoreg_db/data/finding_classification/intervention_required.yaml +0 -26
  284. endoreg_db/data/finding_classification/medication_related.yaml +0 -23
  285. endoreg_db/data/finding_classification/visualized.yaml +0 -33
  286. endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
  287. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
  288. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
  289. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +0 -15
  290. endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +0 -17
  291. endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +0 -57
  292. endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
  293. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +0 -14
  294. endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
  295. endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +0 -229
  296. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +0 -19
  297. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +0 -82
  298. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
  299. endoreg_db/data/finding_classification_choice/outcome.yaml +0 -19
  300. endoreg_db/data/finding_intervention/endoscopy.yaml +0 -43
  301. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
  302. endoreg_db/data/finding_intervention/endoscopy_egd.yaml +0 -128
  303. endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +0 -32
  304. endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +0 -9
  305. endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +0 -36
  306. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +0 -79
  307. endoreg_db/data/requirement/age.yaml +0 -26
  308. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +0 -45
  309. endoreg_db/data/requirement/disease_cardiovascular.yaml +0 -79
  310. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +0 -41
  311. endoreg_db/data/requirement/disease_hepatology.yaml +0 -12
  312. endoreg_db/data/requirement/disease_misc.yaml +0 -12
  313. endoreg_db/data/requirement/disease_renal.yaml +0 -96
  314. endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +0 -59
  315. endoreg_db/data/requirement/event_cardiology.yaml +0 -251
  316. endoreg_db/data/requirement/event_requirements.yaml +0 -145
  317. endoreg_db/data/requirement/finding_colon_polyp.yaml +0 -50
  318. endoreg_db/data/requirement/gender.yaml +0 -25
  319. endoreg_db/data/requirement/lab_value.yaml +0 -441
  320. endoreg_db/data/requirement/medication.yaml +0 -93
  321. endoreg_db/data/requirement_operator/age.yaml +0 -13
  322. endoreg_db/data/requirement_operator/lab_operators.yaml +0 -129
  323. endoreg_db/data/requirement_operator/model_operators.yaml +0 -96
  324. endoreg_db/management/commands/init_default_ai_model.py +0 -112
  325. endoreg_db/management/commands/reset_celery_schedule.py +0 -9
  326. endoreg_db/management/commands/validate_video.py +0 -204
  327. endoreg_db/migrations/0002_requirementset_depends_on.py +0 -18
  328. endoreg_db/migrations/_old/0001_initial.py +0 -1857
  329. endoreg_db/migrations/_old/0002_add_video_correction_models.py +0 -52
  330. endoreg_db/migrations/_old/0003_add_center_display_name.py +0 -30
  331. endoreg_db/migrations/_old/0004_employee_city_employee_post_code_employee_street_and_more.py +0 -68
  332. endoreg_db/migrations/_old/0004_remove_casetemplate_rules_and_more.py +0 -77
  333. endoreg_db/migrations/_old/0005_merge_20251111_1003.py +0 -14
  334. endoreg_db/migrations/_old/0006_sensitivemeta_anonymized_text_and_more.py +0 -68
  335. endoreg_db/migrations/_old/0007_remove_rule_attribute_dtype_remove_rule_rule_type_and_more.py +0 -89
  336. endoreg_db/migrations/_old/0008_remove_event_event_classification_and_more.py +0 -27
  337. endoreg_db/migrations/_old/0009_alter_modelmeta_options_and_more.py +0 -21
  338. endoreg_db/renames.yml +0 -8
  339. endoreg_db/serializers/_old/raw_pdf_meta_validation.py +0 -223
  340. endoreg_db/serializers/_old/raw_video_meta_validation.py +0 -179
  341. endoreg_db/serializers/_old/video.py +0 -71
  342. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +0 -115
  343. endoreg_db/serializers/meta/report_meta.py +0 -53
  344. endoreg_db/serializers/report/__init__.py +0 -9
  345. endoreg_db/serializers/report/mixins.py +0 -45
  346. endoreg_db/serializers/report/report.py +0 -105
  347. endoreg_db/serializers/report/report_list.py +0 -22
  348. endoreg_db/serializers/report/secure_file_url.py +0 -26
  349. endoreg_db/services/requirements_object.py +0 -147
  350. endoreg_db/services/storage_aware_video_processor.py +0 -370
  351. endoreg_db/urls/files.py +0 -6
  352. endoreg_db/urls/label_video_segment_validate.py +0 -33
  353. endoreg_db/urls/label_video_segments.py +0 -46
  354. endoreg_db/views/label/__init__.py +0 -5
  355. endoreg_db/views/label/label.py +0 -15
  356. endoreg_db/views/label_video_segment/__init__.py +0 -16
  357. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +0 -44
  358. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +0 -50
  359. endoreg_db/views/label_video_segment/label_video_segment.py +0 -77
  360. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +0 -174
  361. endoreg_db/views/label_video_segment/label_video_segment_detail.py +0 -73
  362. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +0 -46
  363. endoreg_db/views/label_video_segment/validate.py +0 -226
  364. endoreg_db/views/media/segments.py +0 -71
  365. endoreg_db/views/meta/available_files_list.py +0 -146
  366. endoreg_db/views/meta/report_meta.py +0 -53
  367. endoreg_db/views/meta/sensitive_meta_detail.py +0 -85
  368. endoreg_db/views/misc/secure_file_serving_view.py +0 -80
  369. endoreg_db/views/misc/secure_file_url_view.py +0 -84
  370. endoreg_db/views/misc/secure_url_validate.py +0 -79
  371. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +0 -164
  372. endoreg_db/views/patient_finding_location/__init__.py +0 -5
  373. endoreg_db/views/patient_finding_location/pfl_create.py +0 -70
  374. endoreg_db/views/patient_finding_morphology/__init__.py +0 -5
  375. endoreg_db/views/patient_finding_morphology/pfm_create.py +0 -70
  376. endoreg_db/views/pdf/__init__.py +0 -8
  377. endoreg_db/views/video/segmentation.py +0 -274
  378. endoreg_db/views/video/task_status.py +0 -49
  379. endoreg_db/views/video/timeline.py +0 -46
  380. endoreg_db/views/video/video_analyze.py +0 -52
  381. /endoreg_db/data/requirement/{colon_polyp_intervention.yaml → old/colon_polyp_intervention.yaml} +0 -0
  382. /endoreg_db/data/{_examples/requirement → requirement/old}/colonoscopy_baseline_austria.yaml +0 -0
  383. /endoreg_db/data/requirement/{coloreg_colon_polyp.yaml → old/coloreg_colon_polyp.yaml} +0 -0
  384. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_cardiovascular.yaml +0 -0
  385. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_classification_choice_cardiovascular.yaml +0 -0
  386. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_hepatology.yaml +0 -0
  387. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_misc.yaml +0 -0
  388. /endoreg_db/data/{_examples/requirement → requirement/old}/disease_renal.yaml +0 -0
  389. /endoreg_db/data/{_examples/requirement → requirement/old}/endoscopy_bleeding_risk.yaml +0 -0
  390. /endoreg_db/data/{_examples/requirement → requirement/old}/event_cardiology.yaml +0 -0
  391. /endoreg_db/data/{_examples/requirement → requirement/old}/event_requirements.yaml +0 -0
  392. /endoreg_db/data/{_examples/requirement → requirement/old}/finding_colon_polyp.yaml +0 -0
  393. /endoreg_db/{urls/sensitive_meta.py → data/requirement/old/gender.yaml} +0 -0
  394. /endoreg_db/data/{_examples/requirement → requirement/old}/lab_value.yaml +0 -0
  395. /endoreg_db/data/{_examples/requirement → requirement/old}/medication.yaml +0 -0
  396. /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/age.yaml +0 -0
  397. /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/lab_operators.yaml +0 -0
  398. /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/model_operators.yaml +0 -0
  399. /endoreg_db/{views/pdf/pdf_stream_views.py → import_files/pseudonymization/__init__.py} +0 -0
  400. /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
  401. /endoreg_db/utils/requirement_operator_logic/{model_evaluators.py → _old/model_evaluators.py} +0 -0
  402. {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,150 @@
1
+ # endoreg_db/services/video_import.py
2
+ import logging
3
+ from pathlib import Path
4
+ from typing import Optional, Union
5
+
6
+
7
+ from endoreg_db.import_files.context import (
8
+ ImportContext,
9
+ file_lock,
10
+ )
11
+ from endoreg_db.import_files.file_storage.state_management import (
12
+ finalize_failure,
13
+ finalize_video_success
14
+ )
15
+ from endoreg_db.import_files.file_storage.storage import create_sensitive_copy
16
+ from endoreg_db.import_files.file_storage.create_video_file import (
17
+ create_or_retrieve_video_file,
18
+ )
19
+ from endoreg_db.import_files.context.validate_directories import validate_directories
20
+ from endoreg_db.import_files.file_storage.state_management import (
21
+ mark_instance_processing_started,
22
+ )
23
+ from endoreg_db.models import VideoFile
24
+ from endoreg_db.import_files.processing.video_processing.video_anonymization import VideoAnonymizer
25
+ from endoreg_db.utils.paths import (
26
+ SENSITIVE_VIDEO_DIR,
27
+ )
28
+
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+
33
+ class VideoImportService:
34
+ """
35
+ Service for importing and anonymizing video files.
36
+ Uses a central video instance pattern for cleaner state management.
37
+ Responsibility:
38
+ Validate path
39
+ Move/copy raw file into stable storage
40
+ Create/attach VideoFile, VideoState, default SensitiveMeta
41
+ Mark a single clear state like state.import_completed = True or state.ready_for_anonymization = True
42
+
43
+ It does not:
44
+ Run frame cleaning
45
+ Run ML
46
+ Create processed_file
47
+ Decide fallback anonymization
48
+
49
+ These actions are delegated to the modules inside file_import
50
+
51
+ """
52
+
53
+ def __init__(self):
54
+ self.logger = logger
55
+ self.anonymizer = VideoAnonymizer()
56
+ self.processing_context: Optional[ImportContext] = None
57
+ self.current_video: Optional[VideoFile] = None
58
+
59
+ validate_directories()
60
+
61
+
62
+ def import_and_anonymize(
63
+ self,
64
+ file_path: Union[Path, str],
65
+ center_name: str,
66
+ processor_name: str,
67
+ retry:bool = False,
68
+ delete_source: bool = True,
69
+ ) -> "VideoFile | None":
70
+ """
71
+ Public entrypoint: wrap import_and_anonymize logic.
72
+ """
73
+ # First, initialize import context. this will be updated during import and keep track of current paths, file type and center and processor.
74
+ ctx = ImportContext(
75
+ file_path=Path(file_path),
76
+ center_name=center_name,
77
+ processor_name=processor_name,
78
+ delete_source=delete_source,
79
+ file_type="video"
80
+ )
81
+ self.logger.info("validating and preparing file")
82
+ if not ctx.file_path.exists():
83
+ raise FileNotFoundError(f"Video file not found: {file_path}")
84
+
85
+ ctx.sensitive_path = create_sensitive_copy(
86
+ ctx.file_path,
87
+ SENSITIVE_VIDEO_DIR
88
+ )
89
+
90
+ with file_lock(ctx.file_path):
91
+ logger.info("Acquired file lock for %s", ctx.file_path)
92
+
93
+
94
+ # create or retrieve VideoFile + update history
95
+ ctx.current_video, needs_processing = (
96
+ create_or_retrieve_video_file(ctx)
97
+ )
98
+ ctx.current_video.get_or_create_state()
99
+ assert(ctx.current_video.state is not None)
100
+ ctx.current_video = ctx.current_video
101
+
102
+ ctx.retry = retry
103
+ # Retry is a forced overwrite of needs processing - therefore the retry will cause full deletion of processed files using finalize failure.
104
+
105
+ if retry and needs_processing and not ctx.current_video.state.anonymization_validated:
106
+ finalize_failure(ctx)
107
+ ctx.current_video, needs_processing = create_or_retrieve_video_file(ctx)
108
+ assert(needs_processing is True)
109
+ elif not needs_processing and not retry:
110
+ return ctx.current_video
111
+
112
+ mark_instance_processing_started(ctx.current_video, ctx)
113
+ try:
114
+ # --- Anonymization with fallback ---
115
+ try:
116
+ ctx = self.anonymizer.anonymize_video(ctx)
117
+ logger.info(
118
+ "Primary video anonymization succeeded for %s",
119
+ ctx.file_path,
120
+ )
121
+ except Exception as primary_exc:
122
+ logger.exception(
123
+ "Primary video anonymization failed for %s: %s "
124
+ "- trying basic anonymization",
125
+ ctx.file_path,
126
+ primary_exc,
127
+ )
128
+ try:
129
+ ctx = self.anonymizer.anonymize_video(ctx)
130
+ except Exception as e:
131
+ logger.error(f"Video Extraction failed for the second time. {e}")
132
+ raise
133
+ logger.info(
134
+ "Secondary video anonymization succeeded for %s",
135
+ ctx.file_path,
136
+ )
137
+ logger.info(f"Anonymized Video is located at: {ctx.anonymized_path}")
138
+
139
+ # --- Finalize success: history + move anonymized file ---
140
+ finalize_video_success(ctx)
141
+
142
+ return ctx.current_video
143
+
144
+
145
+ except Exception as exc:
146
+ logger.exception(
147
+ "Video import/anonymization failed for %s: %s", ctx.file_path, exc
148
+ )
149
+ finalize_failure(ctx)
150
+ raise
@@ -1,27 +1,28 @@
1
- from pathlib import Path
2
1
  import os
3
2
  import sys
3
+ from pathlib import Path
4
+
4
5
  from django.core.management import BaseCommand
5
- from endoreg_db.models import (
6
- RawPdfFile,
7
- PdfType,
8
- )
9
- from endoreg_db.helpers.data_loader import (
10
- load_data
11
- )
12
6
  from icecream import ic
7
+
8
+ from endoreg_db.helpers.data_loader import load_data
9
+ from endoreg_db.models import PdfType, RawPdfFile
10
+
11
+
13
12
  # python manage.py import_report tests/assets/lux-gastro-report.pdf --verbose --start_ollama
14
13
  # Dynamic import path manipulation to ensure local development version is used
15
14
  def ensure_local_lx_anonymizer():
16
15
  """
17
16
  Checks for a local development version of the lx-anonymizer package and adds it to sys.path if available.
18
-
17
+
19
18
  Returns:
20
19
  True if the local lx-anonymizer directory was found and added to sys.path; False otherwise.
21
20
  """
22
- script_dir = Path(__file__).parent.parent.parent.parent.parent # /home/admin/dev/lx-annotate/endoreg-db
21
+ script_dir = Path(
22
+ __file__
23
+ ).parent.parent.parent.parent.parent # /home/admin/dev/lx-annotate/endoreg-db
23
24
  local_lx_anonymizer_path = script_dir / "lx-anonymizer"
24
-
25
+
25
26
  if local_lx_anonymizer_path.exists() and local_lx_anonymizer_path.is_dir():
26
27
  # Add the directory containing lx_anonymizer to the Python path
27
28
  if str(local_lx_anonymizer_path) not in sys.path:
@@ -30,11 +31,11 @@ def ensure_local_lx_anonymizer():
30
31
  return True
31
32
  return False
32
33
 
34
+
33
35
  # Try to use local version, fall back to installed version
34
36
  local_version_available = ensure_local_lx_anonymizer()
35
37
 
36
38
 
37
-
38
39
  # Now import from lx_anonymizer
39
40
  try:
40
41
  from lx_anonymizer.ollama_service import ollama_service
@@ -42,6 +43,7 @@ except ImportError:
42
43
  print("Could not import init_ollama_service from local or installed lx_anonymizer")
43
44
  raise
44
45
 
46
+
45
47
  class Command(BaseCommand):
46
48
  """Management Command to import a report file to the database"""
47
49
 
@@ -53,7 +55,7 @@ class Command(BaseCommand):
53
55
  def add_arguments(self, parser):
54
56
  """
55
57
  Defines command-line arguments for the import_report management command.
56
-
58
+
57
59
  Adds options for specifying the report file path, center name, report directory, deletion and save behavior, and controls for initializing the Ollama LLM service.
58
60
  """
59
61
  parser.add_argument(
@@ -94,21 +96,21 @@ class Command(BaseCommand):
94
96
  default=False,
95
97
  help="Save the report object to the database",
96
98
  )
97
-
99
+
98
100
  parser.add_argument(
99
101
  "--start_ollama",
100
102
  action="store_true",
101
103
  default=False,
102
104
  help="Start Ollama server for LLM processing",
103
105
  )
104
-
106
+
105
107
  parser.add_argument(
106
108
  "--ollama_debug",
107
109
  action="store_true",
108
110
  default=False,
109
111
  help="Enable debug mode for Ollama",
110
112
  )
111
-
113
+
112
114
  parser.add_argument(
113
115
  "--ollama_timeout",
114
116
  type=int,
@@ -118,9 +120,9 @@ class Command(BaseCommand):
118
120
 
119
121
  def handle(self, *args, **options):
120
122
  """
121
- Handles the import of a PDF report file into the database, with optional LLM service initialization and anonymization.
122
-
123
- This method validates input options, optionally starts the Ollama LLM service, ensures the existence of required files and directories, determines the report type, processes the PDF for text and metadata extraction, anonymizes content, and saves the resulting data to the database. Provides verbose output and error handling throughout the process.
123
+ Handles the import of a report report file into the database, with optional LLM service initialization and anonymization.
124
+
125
+ This method validates input options, optionally starts the Ollama LLM service, ensures the existence of required files and directories, determines the report type, processes the report for text and metadata extraction, anonymizes content, and saves the resulting data to the database. Provides verbose output and error handling throughout the process.
124
126
  """
125
127
  # Load initial or prerequisite data for the application.
126
128
  # This may include loading default values, configurations, or lookup table data
@@ -132,8 +134,7 @@ class Command(BaseCommand):
132
134
  self.stdout.write(self.style.ERROR(f"Failed to load initial data: {e}"))
133
135
  # Depending on the criticality of load_data(), you might want to exit or handle differently.
134
136
  # For now, we'll just log the error and continue.
135
-
136
-
137
+
137
138
  verbose = options["verbose"]
138
139
  center_name = options["center_name"]
139
140
  report_dir_root = options["report_dir_root"]
@@ -147,11 +148,15 @@ class Command(BaseCommand):
147
148
  if not isinstance(delete_source, bool):
148
149
  raise ValueError("delete_source must be a boolean")
149
150
 
150
- self.stdout.write(self.style.SUCCESS(f"Starting report import for {file_path}..."))
151
-
151
+ self.stdout.write(
152
+ self.style.SUCCESS(f"Starting report import for {file_path}...")
153
+ )
154
+
152
155
  if local_version_available:
153
- self.stdout.write(self.style.SUCCESS("Using local development version of lx-anonymizer"))
154
-
156
+ self.stdout.write(
157
+ self.style.SUCCESS("Using local development version of lx-anonymizer")
158
+ )
159
+
155
160
  ollama_proc = None # Track Ollama process if started
156
161
  try:
157
162
  # Initialize Ollama service if requested
@@ -161,60 +166,101 @@ class Command(BaseCommand):
161
166
  # Set Ollama environment variables
162
167
  os.environ["OLLAMA_MAX_WAIT_TIME"] = str(ollama_timeout)
163
168
  os.environ["OLLAMA_DEBUG"] = "true" if ollama_debug else "false"
164
-
169
+
165
170
  # Try to find Ollama binary location from env or common paths
166
171
  ollama_bin = os.environ.get("OLLAMA_BIN")
167
172
  if not ollama_bin:
168
173
  # Try common Nix store paths first
169
- for path in ["/run/current-system/sw/bin/ollama",
170
- "/nix/store/*/bin/ollama"]:
174
+ for path in [
175
+ "/run/current-system/sw/bin/ollama",
176
+ "/nix/store/*/bin/ollama",
177
+ ]:
171
178
  import glob
179
+
172
180
  matches = glob.glob(path)
173
181
  if matches:
174
182
  ollama_bin = matches[0]
175
183
  break
176
-
184
+
177
185
  if ollama_bin:
178
- self.stdout.write(self.style.SUCCESS(f"Using Ollama binary at: {ollama_bin}"))
186
+ self.stdout.write(
187
+ self.style.SUCCESS(f"Using Ollama binary at: {ollama_bin}")
188
+ )
179
189
  os.environ["OLLAMA_BIN"] = ollama_bin
180
-
190
+
181
191
  # Start Ollama server process if not already running
182
- import subprocess
183
192
  import shutil
184
-
193
+ import subprocess
194
+
185
195
  # Check if ollama is already running
186
196
  try:
187
197
  import requests
188
- resp = requests.get("http://127.0.0.1:11434/api/version", timeout=1)
198
+
199
+ resp = requests.get(
200
+ "http://127.0.0.1:11434/api/version", timeout=1
201
+ )
189
202
  if resp.status_code == 200:
190
- self.stdout.write(self.style.SUCCESS("Ollama is already running"))
203
+ self.stdout.write(
204
+ self.style.SUCCESS("Ollama is already running")
205
+ )
191
206
  else:
192
- self.stdout.write(self.style.WARNING(f"Ollama returned status code {resp.status_code}"))
207
+ self.stdout.write(
208
+ self.style.WARNING(
209
+ f"Ollama returned status code {resp.status_code}"
210
+ )
211
+ )
193
212
  except requests.exceptions.RequestException:
194
- self.stdout.write(self.style.WARNING("Ollama is not running, attempting to start..."))
213
+ self.stdout.write(
214
+ self.style.WARNING(
215
+ "Ollama is not running, attempting to start..."
216
+ )
217
+ )
195
218
  # Find ollama binary
196
219
  ollama_path = ollama_bin or shutil.which("ollama")
197
220
  if ollama_path:
198
- self.stdout.write(self.style.SUCCESS(f"Starting Ollama using {ollama_path}"))
221
+ self.stdout.write(
222
+ self.style.SUCCESS(
223
+ f"Starting Ollama using {ollama_path}"
224
+ )
225
+ )
199
226
  # Start ollama serve in background
200
- ollama_proc = subprocess.Popen([
201
- ollama_path, "serve"
202
- ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, start_new_session=True)
203
- self.stdout.write(self.style.SUCCESS("Ollama server started in background"))
227
+ ollama_proc = subprocess.Popen(
228
+ [ollama_path, "serve"],
229
+ stdout=subprocess.PIPE,
230
+ stderr=subprocess.STDOUT,
231
+ start_new_session=True,
232
+ )
233
+ self.stdout.write(
234
+ self.style.SUCCESS(
235
+ "Ollama server started in background"
236
+ )
237
+ )
204
238
  else:
205
- self.stdout.write(self.style.ERROR("Ollama binary not found in PATH"))
206
-
239
+ self.stdout.write(
240
+ self.style.ERROR("Ollama binary not found in PATH")
241
+ )
242
+
207
243
  # Start the service with explicit initialization
208
244
  ollama_service(auto_start=True)
209
- self.stdout.write(self.style.SUCCESS("Ollama service initialized successfully"))
245
+ self.stdout.write(
246
+ self.style.SUCCESS("Ollama service initialized successfully")
247
+ )
210
248
  except Exception as e:
211
- self.stdout.write(self.style.ERROR(f"Failed to initialize Ollama service: {e}"))
212
- self.stdout.write(self.style.WARNING("Continuing without Ollama - some features may not work"))
249
+ self.stdout.write(
250
+ self.style.ERROR(f"Failed to initialize Ollama service: {e}")
251
+ )
252
+ self.stdout.write(
253
+ self.style.WARNING(
254
+ "Continuing without Ollama - some features may not work"
255
+ )
256
+ )
213
257
 
214
258
  # Ensure the report file exists
215
259
  file_path = Path(file_path).expanduser()
216
260
  if not file_path.exists():
217
- self.stdout.write(self.style.ERROR(f"Report file not found: {file_path}"))
261
+ self.stdout.write(
262
+ self.style.ERROR(f"Report file not found: {file_path}")
263
+ )
218
264
  return
219
265
 
220
266
  # Ensure the report directory exists
@@ -222,7 +268,9 @@ class Command(BaseCommand):
222
268
  report_dir_root.mkdir(parents=True, exist_ok=True)
223
269
 
224
270
  # Create the report file object
225
- self.stdout.write(self.style.SUCCESS(f"Creating RawPdfFile object from {file_path}..."))
271
+ self.stdout.write(
272
+ self.style.SUCCESS(f"Creating RawPdfFile object from {file_path}...")
273
+ )
226
274
  report_file_obj = RawPdfFile.create_from_file(
227
275
  file_path=file_path,
228
276
  center_name=center_name,
@@ -230,11 +278,13 @@ class Command(BaseCommand):
230
278
  save=save,
231
279
  )
232
280
  if not report_file_obj:
233
- self.stdout.write(self.style.ERROR("Failed to create RawPdfFile object."))
281
+ self.stdout.write(
282
+ self.style.ERROR("Failed to create RawPdfFile object.")
283
+ )
234
284
  return
235
-
285
+
236
286
  report_file_obj.anonymized = False
237
-
287
+
238
288
  # Assign pdfType to the report file object
239
289
  if "report" in file_path.name:
240
290
  pdf_type_name = "ukw-endoscopy-examination-report-generic"
@@ -247,19 +297,24 @@ class Command(BaseCommand):
247
297
  else:
248
298
  raise ValueError(f"Unknown report type: {file_path.name}")
249
299
 
250
- self.stdout.write(self.style.SUCCESS(f"Using PDF type: {pdf_type_name}"))
300
+ self.stdout.write(self.style.SUCCESS(f"Using report type: {pdf_type_name}"))
251
301
  try:
252
302
  pdf_type = PdfType.objects.get(name=pdf_type_name)
253
303
  except PdfType.DoesNotExist:
254
- self.stdout.write(self.style.ERROR(f"PdfType with name '{pdf_type_name}' does not exist."))
304
+ self.stdout.write(
305
+ self.style.ERROR(
306
+ f"PdfType with name '{pdf_type_name}' does not exist."
307
+ )
308
+ )
255
309
  return
256
310
  report_file_obj.pdf_type = pdf_type
257
311
 
258
312
  rr_config = report_file_obj.get_report_reader_config()
259
313
  pdf_path = report_file_obj.file.path
260
-
314
+
261
315
  # Import at this point to avoid initializing the module too early
262
316
  from lx_anonymizer import ReportReader
317
+
263
318
  self.stdout.write(self.style.SUCCESS("Creating ReportReader..."))
264
319
  rr = ReportReader(**rr_config)
265
320
 
@@ -270,29 +325,39 @@ class Command(BaseCommand):
270
325
 
271
326
  if verbose:
272
327
  ic(text, anonymized_text, report_meta)
273
-
328
+
274
329
  self.stdout.write(self.style.SUCCESS("Processing file..."))
275
- report_file_obj.process_file(text, anonymized_text, report_meta, verbose=verbose)
276
-
330
+ report_file_obj.process_file(
331
+ text, anonymized_text, report_meta, verbose=verbose
332
+ )
333
+
277
334
  sensitive_meta = report_file_obj.sensitive_meta
278
335
  if verbose:
279
336
  ic(report_file_obj.sensitive_meta)
280
-
281
-
337
+
282
338
  self.stdout.write(self.style.SUCCESS("Saving..."))
283
339
  sensitive_meta.save()
284
340
  if verbose:
285
341
  ic(sensitive_meta)
286
-
287
- report_file_obj.anonymized=True
342
+
343
+ report_file_obj.state.anonymization_status.mark_anonymized()
288
344
  finally:
289
345
  # Clean up Ollama process if we started it
290
346
  if ollama_proc is not None:
291
347
  import signal
292
- self.stdout.write(self.style.SUCCESS("Cleaning up Ollama server process..."))
348
+
349
+ self.stdout.write(
350
+ self.style.SUCCESS("Cleaning up Ollama server process...")
351
+ )
293
352
  try:
294
353
  ollama_proc.terminate()
295
354
  ollama_proc.wait(timeout=10)
296
- self.stdout.write(self.style.SUCCESS("Ollama server process terminated."))
355
+ self.stdout.write(
356
+ self.style.SUCCESS("Ollama server process terminated.")
357
+ )
297
358
  except Exception as e:
298
- self.stdout.write(self.style.WARNING(f"Failed to terminate Ollama server process: {e}"))
359
+ self.stdout.write(
360
+ self.style.WARNING(
361
+ f"Failed to terminate Ollama server process: {e}"
362
+ )
363
+ )
@@ -10,7 +10,7 @@ from endoreg_db.models.administration.center import Center
10
10
  from endoreg_db.models.medical.hardware import EndoscopyProcessor
11
11
 
12
12
  # TODO Migrate
13
- from endoreg_db.serializers._old.Frames_NICE_and_PARIS_classifications import (
13
+ from endoreg_db.serializers.Frames_NICE_and_PARIS_classifications import (
14
14
  ForNiceClassificationSerializer,
15
15
  ForParisClassificationSerializer
16
16
  )
@@ -22,13 +22,13 @@ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
22
22
  VideoSegmentationLabel.__name__,
23
23
  VideoSegmentationLabelSet.__name__,
24
24
  AiModel.__name__,
25
- ModelMeta.__name__, # Re-enable ModelMeta loading
25
+ # ModelMeta.__name__, # Disable automatic model meta loading
26
26
  ]
27
27
 
28
28
  IMPORT_METADATA = {
29
29
  ModelType.__name__: {
30
30
  "dir": MODEL_TYPE_DATA_DIR, # e.g. "intervention_types"
31
- "model": ModelType, # e.g. InterventionType
31
+ "model": ModelType,
32
32
  "foreign_keys": [], # e.g. ["interventions"]
33
33
  "foreign_key_models": [], # e.g. [Intervention]
34
34
  },
@@ -40,19 +40,19 @@ IMPORT_METADATA = {
40
40
  },
41
41
  VideoSegmentationLabel.__name__: {
42
42
  "dir": VIDEO_SEGMENTATION_LABEL_DATA_DIR, # e.g. "interventions"
43
- "model": VideoSegmentationLabel, # e.g. Intervention
43
+ "model": VideoSegmentationLabel,
44
44
  "foreign_keys": [], # e.g. ["intervention_types"]
45
45
  "foreign_key_models": [], # e.g. [InterventionType]
46
46
  },
47
47
  VideoSegmentationLabelSet.__name__: {
48
48
  "dir": VIDEO_SEGMENTATION_LABELSET_DATA_DIR, # e.g. "interventions"
49
- "model": VideoSegmentationLabelSet, # e.g. Intervention
49
+ "model": VideoSegmentationLabelSet,
50
50
  "foreign_keys": ["labels"], # e.g. ["intervention_types"]
51
51
  "foreign_key_models": [VideoSegmentationLabel], # e.g. [Intervention]
52
52
  },
53
53
  AiModel.__name__: {
54
54
  "dir": AI_MODEL_DATA_DIR, # e.g. "intervention_types"
55
- "model": AiModel, # e.g. InterventionType
55
+ "model": AiModel,
56
56
  "foreign_keys": ["video_segmentation_labelset", "model_type"], # e.g. ["interventions"]
57
57
  "foreign_key_models": [VideoSegmentationLabelSet, ModelType], # e.g. [Intervention]
58
58
  },
@@ -1,9 +1,11 @@
1
+ import os
2
+
1
3
  from django.conf import settings
2
4
  from django.core.management.base import BaseCommand
3
- from ...models import Label, LabelType, LabelSet
4
- import os
5
- from ...utils import load_model_data_from_yaml
5
+
6
6
  from ...data import LABEL_DATA_DIR
7
+ from ...models import Label, LabelSet, LabelType
8
+ from ...utils import load_model_data_from_yaml
7
9
 
8
10
  SOURCE_DIR = LABEL_DATA_DIR
9
11
 
@@ -16,25 +18,25 @@ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
16
18
  IMPORT_METADATA = {
17
19
  # "": { # same as model name in "import models", e.g. "Intervention"
18
20
  # "subdir": os.path.join(SOURCE_DIR,""), # e.g. "interventions"
19
- # "model": None, # e.g. Intervention
21
+ # "model": None,
20
22
  # "foreign_keys": [], # e.g. ["intervention_types"]
21
23
  # "foreign_key_models": [] # e.g. [InterventionType]
22
24
  # },
23
25
  "LabelType": {
24
26
  "dir": os.path.join(SOURCE_DIR, "label-type"), # e.g. "interventions"
25
- "model": LabelType, # e.g. Intervention
27
+ "model": LabelType,
26
28
  "foreign_keys": [], # e.g. ["intervention_types"]
27
29
  "foreign_key_models": [], # e.g. [InterventionType]
28
30
  },
29
31
  "Label": {
30
32
  "dir": os.path.join(SOURCE_DIR, "label"), # e.g. "interventions"
31
- "model": Label, # e.g. Intervention
33
+ "model": Label,
32
34
  "foreign_keys": ["label_type"], # e.g. ["intervention_types"]
33
35
  "foreign_key_models": [LabelType], # e.g. [InterventionType]
34
36
  },
35
37
  "LabelSet": {
36
38
  "dir": os.path.join(SOURCE_DIR, "label-set"), # e.g. "interventions"
37
- "model": LabelSet, # e.g. Intervention
39
+ "model": LabelSet,
38
40
  "foreign_keys": ["labels"], # e.g. ["intervention_types"]
39
41
  "foreign_key_models": [Label], # e.g. [InterventionType]
40
42
  },