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
@@ -1,223 +0,0 @@
1
- from pathlib import Path
2
- from rest_framework import serializers
3
- from django.conf import settings
4
- #from ...models import RawPdfFile, SensitiveMeta
5
- from endoreg_db.models import RawPdfFile, SensitiveMeta
6
-
7
- class PDFFileForMetaSerializer(serializers.ModelSerializer):
8
- """
9
- Serializer to fetch PDF metadata along with linked `SensitiveMeta` details.
10
- Implements validation and ensures Vue.js can process errors easily.
11
- """
12
-
13
- # Fetch patient details from `SensitiveMeta`
14
- patient_first_name = serializers.CharField(source="sensitive_meta.patient_first_name", read_only=True)
15
- patient_last_name = serializers.CharField(source="sensitive_meta.patient_last_name", read_only=True)
16
- patient_dob = serializers.CharField(source="sensitive_meta.patient_dob", read_only=True)
17
- examination_date = serializers.CharField(source="sensitive_meta.examination_date", read_only=True)
18
-
19
- # PDF file URL where Vue.js can fetch the document
20
- pdf_url = serializers.SerializerMethodField()
21
-
22
- # Full absolute path of the PDF file
23
- full_pdf_path = serializers.SerializerMethodField()
24
-
25
- # Direct file path from the database
26
- file = serializers.SerializerMethodField()
27
-
28
- class Meta:
29
- model = RawPdfFile
30
- fields = ['id', 'file', 'pdf_url', 'full_pdf_path',
31
- 'sensitive_meta_id', 'patient_first_name',
32
- 'patient_last_name', 'patient_dob', 'examination_date']
33
-
34
- @staticmethod
35
- def get_next_pdf(last_id=None):
36
- """
37
- Retrieves the first available PDF if `last_id` is NOT provided.
38
- Otherwise, fetches the next available PDF where `id > last_id`.
39
- """
40
- query_filter = {} if last_id is None else {"id__gt": int(last_id)}
41
-
42
- # Get the next available PDF
43
- pdf_entry = RawPdfFile.objects.select_related("sensitive_meta").filter(**query_filter).order_by('id').first()
44
-
45
- return pdf_entry # Returns a model instance or None
46
-
47
- def get_pdf_url(self, obj):
48
- """
49
- Generates the full URL for Vue.js to fetch and display the PDF.
50
- """
51
- request = self.context.get('request')
52
- print("---------------------here :",obj.file)
53
- if request and obj.file:
54
- return request.build_absolute_uri(f"/api/pdf/sensitivemeta/?id={obj.id}") # Constructs full API endpoint
55
- return None # Return None if file is missing
56
-
57
- def get_file(self, obj):
58
- """
59
- Returns the relative file path stored in the database.
60
- """
61
- if not obj.file:
62
- return None # No file linked
63
- return str(obj.file.name).strip() # Ensures clean output
64
-
65
- def get_full_pdf_path(self, obj):
66
- """
67
- Constructs the full absolute file path using `settings.MEDIA_ROOT`.
68
- """
69
- if not obj.file:
70
- return None # No file linked
71
-
72
- pdf_relative_path = str(obj.file.name)
73
-
74
- full_path = Path(settings.MEDIA_ROOT) / pdf_relative_path
75
-
76
- return str(full_path) if full_path.exists() else None # Returns path or None if file is missing
77
-
78
- def validate(self, data):
79
- """
80
- Ensures that the PDF file is valid and has required fields.
81
- """
82
- errors = {}
83
-
84
- if 'file' in data and not data['file']:
85
- errors['file'] = "A valid PDF file is required."
86
-
87
- if 'sensitive_meta_id' in data and not SensitiveMeta.objects.filter(id=data['sensitive_meta_id']).exists():
88
- errors['sensitive_meta_id'] = "The provided sensitive_meta_id does not exist."
89
-
90
- if errors:
91
- raise serializers.ValidationError(errors) # Returns structured error response
92
-
93
- return data # Returns validated data
94
-
95
-
96
- from rest_framework import serializers
97
- #from ..models import SensitiveMeta
98
-
99
- class SensitiveMetaUpdateSerializer(serializers.ModelSerializer):
100
- """
101
- Serializer for updating patient details in the `SensitiveMeta` table.
102
- Allows partial updates.
103
- """
104
-
105
- sensitive_meta_id = serializers.IntegerField(write_only=True) # Needed for lookup, not included in response
106
-
107
- class Meta:
108
- model = SensitiveMeta
109
- fields = ['sensitive_meta_id', 'patient_first_name', 'patient_last_name', 'patient_dob', 'examination_date']
110
-
111
- def validate(self, data):
112
- """
113
- Ensures valid input before updating.
114
- """
115
- errors = {}
116
-
117
- if 'patient_first_name' in data and (not data['patient_first_name'].strip()):
118
- errors['patient_first_name'] = "First name cannot be empty."
119
-
120
- if 'patient_last_name' in data and (not data['patient_last_name'].strip()):
121
- errors['patient_last_name'] = "Last name cannot be empty."
122
-
123
- if 'patient_dob' in data and not data['patient_dob']:
124
- errors['patient_dob'] = "Date of birth is required."
125
-
126
- if 'examination_date' in data and not data['examination_date']:
127
- errors['examination_date'] = "Examination date is required."
128
-
129
- if errors:
130
- raise serializers.ValidationError(errors)
131
-
132
- return data
133
-
134
- def update(self, instance, validated_data):
135
- """
136
- Updates only the provided fields dynamically.
137
- """
138
- validated_data.pop("sensitive_meta_id", None) # Remove ID before updating
139
-
140
- for attr, value in validated_data.items():
141
- setattr(instance, attr, value) # Dynamically update fields
142
-
143
- instance.save()
144
- return instance
145
-
146
-
147
-
148
- """
149
- await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
150
- const fetchPdfMeta = async (lastId = 1) => {
151
- const url = lastId
152
- ? `http://localhost:8000/api/pdf/sensitivemeta/?last_id=${lastId}`
153
- : "http://localhost:8000/api/pdf/sensitivemeta/";
154
-
155
- try {
156
- const response = await axios.get(url);
157
- console.log("PDF Metadata:", response.data);
158
- } catch (error) {
159
- console.error("Error fetching PDFs:", error.response?.data || error);
160
- }
161
- };
162
-
163
- fetchPdfMeta(); // Fetch the first available PDF
164
-
165
- """
166
-
167
- """with header response"""
168
- """
169
- await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
170
-
171
- const fetchPdfMeta = async (lastId = 1) => {
172
- const url = lastId
173
- ? `http://localhost:8000/api/pdf/sensitivemeta/?last_id=${lastId}`
174
- : "http://localhost:8000/api/pdf/sensitivemeta/";
175
-
176
- try {
177
- const response = await axios.get(url, {
178
- headers: {
179
- "Accept": "application/json"
180
- }
181
- });
182
-
183
- console.log("PDF Metadata (JSON Expected):", response.data);
184
- } catch (error) {
185
- console.error("Error fetching PDFs:", error.response?.data || error);
186
- }
187
- };
188
-
189
- fetchPdfMeta();
190
- """
191
-
192
-
193
- """
194
- await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
195
-
196
- const updatePatientInfo = async () => {
197
- const updatedData = {
198
- sensitive_meta_id: 1,
199
- patient_first_name: "dummy value",
200
- patient_last_name: "dummy value",
201
- patient_dob: "1994-06-15",
202
- examination_date: "2024-06-15"
203
- };
204
-
205
- try {
206
- const response = await axios.patch("http://localhost:8000/api/pdf/update_sensitivemeta/", updatedData, {
207
- headers: { "Content-Type": "application/json" }
208
- });
209
-
210
- console.log("Update Success:", response.data);
211
- alert("Patient information updated successfully!");
212
-
213
- return response.data;
214
- } catch (error) {
215
- console.error("Update Error:", error.response?.data || error);
216
- alert("Failed to update patient information.");
217
- return error.response?.data || { error: "Unknown error" };
218
- }
219
- };
220
-
221
- updatePatientInfo().then(response => console.log("Final Response:", response));
222
-
223
- """
@@ -1,179 +0,0 @@
1
- from pathlib import Path
2
- from rest_framework import serializers
3
- from django.conf import settings
4
- from ...models import VideoFile, SensitiveMeta
5
- import cv2
6
-
7
-
8
- class VideoFileForMetaSerializer(serializers.ModelSerializer):
9
- """
10
- Serializer to fetch video metadata along with linked `SensitiveMeta` details.
11
- Ensures that Vue.js can properly access and play videos.
12
- """
13
-
14
- # Fetch patient name and DOB from `SensitiveMeta` table
15
- patient_first_name = serializers.CharField(source="sensitive_meta.patient_first_name", read_only=True)
16
- patient_last_name = serializers.CharField(source="sensitive_meta.patient_last_name", read_only=True)
17
- patient_dob = serializers.CharField(source="sensitive_meta.patient_dob", read_only=True)
18
- examination_date = serializers.CharField(source="sensitive_meta.examination_date", read_only=True)
19
-
20
- duration = serializers.SerializerMethodField()
21
-
22
-
23
- # `video_url` generates the full URL where Vue.js can fetch & play the video
24
- video_url = serializers.SerializerMethodField()
25
-
26
- # `full_video_path` dynamically constructs the absolute path using MEDIA_ROOT
27
- full_video_path = serializers.SerializerMethodField()
28
-
29
- file = serializers.SerializerMethodField()
30
-
31
- class Meta:
32
- model = VideoFile
33
- fields = ['id', 'original_file_name', 'file', 'video_url', 'full_video_path',
34
- 'sensitive_meta_id', 'patient_first_name', 'patient_last_name', 'patient_dob', 'examination_date','duration']
35
-
36
- @staticmethod
37
- def get_next_video(last_id=None):
38
- """
39
- Fetches the first or next available video.
40
- Returns a model instance if found, else returns None.
41
- """
42
- query_filter = {} if last_id is None else {"id__gt": int(last_id)}
43
-
44
- # Get next available video
45
- video_entry = VideoFile.objects.select_related("sensitive_meta").filter(**query_filter).order_by('id').first()
46
-
47
- return video_entry # Always return model instance or None
48
-
49
- def get_video_url(self, obj):
50
- """
51
- Returns the absolute URL for streaming the processed video file, or None if unavailable.
52
-
53
- The URL includes an "api/" prefix and is constructed only if a request context and a processed video file are present.
54
- """
55
- request = self.context.get('request')
56
- if request and obj.processed_file:
57
- print("---------------------------:",obj.processed_file)
58
- return request.build_absolute_uri(f"/api/video/{obj.id}/") # Added api/ prefix
59
- return None # Return None instead of an error dictionary
60
-
61
- def get_file(self, obj):
62
- """
63
- Returns the relative file path of the processed video, excluding the `/media/` prefix.
64
-
65
- Returns:
66
- The relative file path as a string if available, otherwise None.
67
- """
68
- if not obj.processed_file:
69
- return None # No file associated
70
-
71
- video_relative_path = str(obj.processed_file.name).strip()
72
- return video_relative_path if video_relative_path else None # Avoids errors if the file path is empty
73
-
74
- def get_full_video_path(self, obj):
75
- """
76
- Constructs the full absolute file path using `settings.MEDIA_ROOT`
77
- and the `file` field from the database.
78
- """
79
- if not obj.processed_file:
80
- return None # No file associated
81
-
82
- video_relative_path = str(obj.processed_file.name).strip()
83
- full_path = Path(settings.MEDIA_ROOT) / video_relative_path
84
-
85
- return str(full_path) if full_path.exists() else None # Return path or None if not found
86
-
87
- def get_duration(self, obj):
88
- """
89
- Returns the total duration of the video in seconds.
90
- - If stored in the database, use it.
91
- - Otherwise, calculate dynamically using OpenCV.
92
- """
93
-
94
- # Step 1: Check if the `duration` field is already stored in the database.
95
- if hasattr(obj, "duration") and obj.duration:
96
- return obj.duration # If duration exists in the database, return it immediately.
97
-
98
- # Step 2: Get the actual video file path
99
- video_path = obj.processed_file.path if obj.processed_file else None # Extracts the file path if it exists
100
-
101
- # Step 3: Validate if the file exists
102
- if not video_path or not Path(video_path).exists():
103
- return None # Return None if the file path is invalid or missing
104
-
105
- # Step 4: Open the video file using OpenCV
106
- cap = cv2.VideoCapture(video_path) # Load the video file
107
-
108
- if not cap.isOpened():
109
- return None # If OpenCV fails to open the video, return None (invalid or corrupted file)
110
-
111
- # Step 5: Extract FPS (Frames Per Second)
112
- fps = cap.get(cv2.CAP_PROP_FPS) # Get the number of frames per second
113
- print("here is the fps------------", fps) # Debugging print to check FPS value
114
-
115
- # Step 6: Get Total Number of Frames
116
- total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) # Get the total number of frames in the video
117
-
118
- # Step 7: Release the video file from OpenCV memory
119
- cap.release() # Free up system memory
120
-
121
- # Step 8: Calculate and Return Video Duration
122
- return round(total_frames / fps, 2) if fps > 0 else None # Divide frames by FPS to get duration (seconds)
123
-
124
-
125
-
126
-
127
- class SensitiveMetaUpdateSerializer(serializers.ModelSerializer):
128
- """
129
- Serializer to update patient information in the `SensitiveMeta` table.
130
- Handles validation and saves the data directly in the serializer.
131
- """
132
-
133
- sensitive_meta_id = serializers.IntegerField(write_only=True) # Needed for lookup but not included in response
134
-
135
- class Meta:
136
- model = SensitiveMeta
137
- fields = ['sensitive_meta_id', 'patient_first_name', 'patient_last_name', 'patient_dob', 'examination_date']
138
-
139
- def validate(self, data):
140
- """
141
- Validate input data before updating.
142
- """
143
- errors = {}
144
-
145
- # Ensure the SensitiveMeta ID exists
146
- sensitive_meta_id = data.get("sensitive_meta_id")
147
- if not SensitiveMeta.objects.filter(id=sensitive_meta_id).exists():
148
- raise serializers.ValidationError({"sensitive_meta_id": "SensitiveMeta entry not found."})
149
-
150
- # Validate each field separately
151
- if 'patient_first_name' in data and (data['patient_first_name'] is None or data['patient_first_name'].strip() == ""):
152
- errors['patient_first_name'] = "First name cannot be empty."
153
-
154
- if 'patient_last_name' in data and (data['patient_last_name'] is None or data['patient_last_name'].strip() == ""):
155
- errors['patient_last_name'] = "Last name cannot be empty."
156
-
157
- if 'patient_dob' in data and not data['patient_dob']:
158
- errors['patient_dob'] = "Date of birth is required."
159
-
160
- if 'examination_date' in data and not data['examination_date']:
161
- errors['examination_date'] = "Examination date is required."
162
-
163
- if errors:
164
- raise serializers.ValidationError(errors) # Raise errors before saving
165
-
166
- return data
167
-
168
- def update(self, instance, validated_data):
169
- """
170
- Update the SensitiveMeta entry directly inside the serializer.
171
- """
172
- # Remove `sensitive_meta_id` before updating
173
- validated_data.pop("sensitive_meta_id", None)
174
-
175
- for attr, value in validated_data.items():
176
- setattr(instance, attr, value) # Set attributes dynamically
177
-
178
- instance.save() # Save changes
179
- return instance # Return updated instance
@@ -1,71 +0,0 @@
1
- from rest_framework import serializers
2
- from endoreg_db.models import VideoFile, VideoImportMeta, LabelVideoSegment, VideoMeta, SensitiveMeta
3
- # serializers/video.py
4
- from pathlib import Path
5
- from rest_framework import serializers
6
- from django.conf import settings
7
-
8
- from .utils import calc_duration_seconds # wrap your OpenCV helper
9
-
10
-
11
- class VideoBriefSer(serializers.ModelSerializer):
12
- class Meta:
13
- model = VideoFile
14
- fields = ["id", "original_file_name", "sensitive_meta_id"]
15
-
16
-
17
- class VideoDetailSer(VideoBriefSer):
18
- patient_first_name = serializers.CharField(source="sensitive_meta.patient_first_name", read_only=True)
19
- patient_last_name = serializers.CharField(source="sensitive_meta.patient_last_name", read_only=True)
20
- patient_dob = serializers.DateField (source="sensitive_meta.patient_dob", read_only=True)
21
- examination_date = serializers.DateField (source="sensitive_meta.examination_date", read_only=True)
22
-
23
- file = serializers.SerializerMethodField()
24
- full_path = serializers.SerializerMethodField()
25
- duration = serializers.SerializerMethodField()
26
- video_url = serializers.SerializerMethodField()
27
-
28
- class Meta(VideoBriefSer.Meta):
29
- fields = VideoBriefSer.Meta.fields + [
30
- "file", "full_path", "video_url",
31
- "patient_first_name", "patient_last_name",
32
- "patient_dob", "examination_date",
33
- "duration",
34
- ]
35
-
36
- # helpers ----------------------------------------------------------
37
- def get_file(self, obj):
38
- f = obj.processed_file or obj.raw_file
39
- return f.name if f else None
40
-
41
- def get_full_path(self, obj):
42
- f = obj.processed_file or obj.raw_file
43
- return str(Path(settings.MEDIA_ROOT) / f.name) if f else None
44
-
45
- def get_video_url(self, obj):
46
- req = self.context.get("request")
47
- return req.build_absolute_uri(f"/api/media/videos/{obj.pk}/") if req else None
48
-
49
- def get_duration(self, obj):
50
- return obj.duration or calc_duration_seconds(obj)
51
-
52
-
53
- class SensitiveMetaUpdateSer(serializers.ModelSerializer):
54
- sensitive_meta_id = serializers.IntegerField(write_only=True)
55
-
56
- class Meta:
57
- model = SensitiveMeta
58
- fields = ["sensitive_meta_id", "patient_first_name",
59
- "patient_last_name", "patient_dob", "examination_date"]
60
-
61
-
62
- class VideoImportMetaSerializer(serializers.ModelSerializer):
63
- class Meta:
64
- model = VideoImportMeta
65
- fields = "__all__"
66
-
67
-
68
- class LabelVideoSegmentSerializer(serializers.ModelSerializer):
69
- class Meta:
70
- model = LabelVideoSegment
71
- fields = "__all__"
@@ -1,115 +0,0 @@
1
- from pathlib import Path
2
- from rest_framework import serializers
3
- from django.conf import settings
4
- from ...models import RawPdfFile, SensitiveMeta
5
-
6
-
7
- class PDFFileForMetaSerializer(serializers.ModelSerializer):
8
- """
9
- Serializer to fetch PDF metadata along with linked `SensitiveMeta` details.
10
- Implements validation and ensures Vue.js can process errors easily.
11
- """
12
-
13
- # Fetch patient details from `SensitiveMeta`
14
- patient_first_name = serializers.CharField(source="sensitive_meta.patient_first_name", read_only=True)
15
- patient_last_name = serializers.CharField(source="sensitive_meta.patient_last_name", read_only=True)
16
- patient_dob = serializers.CharField(source="sensitive_meta.patient_dob", read_only=True)
17
- examination_date = serializers.CharField(source="sensitive_meta.examination_date", read_only=True)
18
-
19
- # PDF file URL where Vue.js can fetch the document
20
- pdf_url = serializers.SerializerMethodField()
21
-
22
- # Full absolute path of the PDF file
23
- full_pdf_path = serializers.SerializerMethodField()
24
-
25
- # Direct file path from the database
26
- file = serializers.SerializerMethodField()
27
-
28
- class Meta:
29
- model = RawPdfFile
30
- fields = ['id', 'file', 'pdf_url', 'full_pdf_path',
31
- 'sensitive_meta_id', 'patient_first_name',
32
- 'patient_last_name', 'patient_dob', 'examination_date']
33
-
34
- @staticmethod
35
- def get_next_pdf(last_id=None):
36
- """
37
- Retrieves the first available PDF if `last_id` is NOT provided.
38
- Otherwise, fetches the next available PDF where `id > last_id`.
39
- """
40
- query_filter = {}
41
- if last_id is not None:
42
- try:
43
- query_filter = {"id__gt": int(last_id)}
44
- except ValueError:
45
- # If last_id is not a valid integer, treat it as if no ID was provided.
46
- # This prevents a crash and safely defaults to fetching the first PDF.
47
- query_filter = {}
48
-
49
- # Get the next available PDF
50
- pdf_entry = RawPdfFile.objects.select_related("sensitive_meta").filter(**query_filter).order_by('id').first()
51
-
52
- return pdf_entry # Returns a model instance or None
53
-
54
- def get_pdf_url(self, obj):
55
- """
56
- Generates an absolute URL for accessing the PDF associated with the given object.
57
-
58
- Returns:
59
- The full URL as a string if the file exists; otherwise, None.
60
- """
61
- request = self.context.get('request')
62
- print("---------------------here :",obj.file)
63
- if request and obj.file:
64
- return request.build_absolute_uri(f"/pdf/sensitivemeta/?id={obj.id}") # Constructs full API endpoint
65
- return None # Return None if file is missing
66
-
67
- def get_file(self, obj):
68
- """
69
- Retrieves the relative file path of the PDF from the database.
70
-
71
- Returns:
72
- The relative file path as a string, or None if no file is linked.
73
- """
74
- if not obj.file:
75
- return None # No file linked
76
- return str(obj.file.name).strip() # Ensures clean output
77
-
78
- def get_full_pdf_path(self, obj):
79
- """
80
- Constructs the full absolute file path using `settings.MEDIA_ROOT`.
81
- """
82
- if not obj.file:
83
- return None # No file linked
84
-
85
- pdf_relative_path = str(obj.file.name)
86
-
87
- full_path = Path(settings.MEDIA_ROOT) / pdf_relative_path
88
-
89
- return str(full_path) if full_path.exists() else None # Returns path or None if file is missing
90
-
91
- def validate(self, data):
92
- """
93
- Validate input data to ensure a PDF file is provided and the referenced sensitive_meta_id exists.
94
-
95
- Raises:
96
- serializers.ValidationError: If the PDF file is missing or the sensitive_meta_id does not correspond to an existing SensitiveMeta record.
97
-
98
- Returns:
99
- dict: The validated input data if all checks pass.
100
- """
101
- errors = {}
102
-
103
- if 'file' in data and not data['file']:
104
- errors['file'] = "A valid PDF file is required."
105
-
106
- if 'sensitive_meta_id' in data and not SensitiveMeta.objects.filter(id=data['sensitive_meta_id']).exists():
107
- errors['sensitive_meta_id'] = "The provided sensitive_meta_id does not exist."
108
-
109
- if errors:
110
- raise serializers.ValidationError(errors) # Returns structured error response
111
-
112
- return data # Returns validated data
113
-
114
-
115
-
@@ -1,53 +0,0 @@
1
- from endoreg_db.models import SensitiveMeta
2
-
3
-
4
- from django.utils import timezone
5
- from rest_framework import serializers
6
-
7
-
8
- class ReportMetaSerializer(serializers.ModelSerializer):
9
- """
10
- Serializer für Report-Metadaten basierend auf SensitiveMeta
11
- """
12
- # Füge fehlende Zeitstempel-Felder hinzu
13
- created_at = serializers.SerializerMethodField()
14
- updated_at = serializers.SerializerMethodField()
15
- casenumber = serializers.CharField(source='casenumber', allow_blank=True, allow_null=True)
16
-
17
- class Meta:
18
- model = SensitiveMeta
19
- fields = [
20
- 'id', 'patient_first_name', 'patient_last_name',
21
- 'patient_gender', 'patient_dob', 'examination_date',
22
- 'casenumber', 'created_at', 'updated_at'
23
- ]
24
-
25
- def get_created_at(self, obj):
26
- """
27
- Retrieve the `created_at` timestamp from the SensitiveMeta instance, or return the current time if unavailable.
28
-
29
- Parameters:
30
- obj: The SensitiveMeta instance being serialized.
31
-
32
- Returns:
33
- datetime: The `created_at` timestamp, or the current time as a fallback.
34
- """
35
- if hasattr(obj, 'created_at') and obj.created_at:
36
- return obj.created_at
37
- # Fallback wenn SensitiveMeta kein created_at hat
38
- return timezone.now()
39
-
40
- def get_updated_at(self, obj):
41
- """
42
- Return the `updated_at` timestamp from the SensitiveMeta instance, or fall back to the `created_at` timestamp if `updated_at` is missing or null.
43
-
44
- Parameters:
45
- obj: The SensitiveMeta instance being serialized.
46
-
47
- Returns:
48
- A datetime representing when the instance was last updated, or created if no update timestamp is available.
49
- """
50
- if hasattr(obj, 'updated_at') and obj.updated_at:
51
- return obj.updated_at
52
- # Fallback wenn SensitiveMeta kein updated_at hat
53
- return self.get_created_at(obj)
@@ -1,9 +0,0 @@
1
- from .report_list import ReportListSerializer
2
- from .report import ReportDataSerializer
3
- from .secure_file_url import SecureFileUrlSerializer
4
-
5
- __all__ = [
6
- "ReportListSerializer",
7
- "ReportDataSerializer",
8
- "SecureFileUrlSerializer"
9
- ]