endoreg-db 0.6.4__py3-none-any.whl → 0.8.1__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 (778) hide show
  1. endoreg_db/admin.py +26 -26
  2. endoreg_db/api_urls.py +4 -0
  3. endoreg_db/apps.py +12 -0
  4. endoreg_db/assets/dummy_model.ckpt +1 -0
  5. endoreg_db/codemods/readme.md +88 -0
  6. endoreg_db/codemods/rename_datetime_fields.py +92 -0
  7. endoreg_db/config/env.py +101 -0
  8. endoreg_db/data/__init__.py +12 -0
  9. endoreg_db/data/ai_model/data.yaml +1 -1
  10. endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
  11. endoreg_db/data/ai_model_label/label-set/data.yaml +20 -1
  12. endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
  13. endoreg_db/data/center/data.yaml +13 -12
  14. endoreg_db/data/center_shift/ukw.yaml +9 -0
  15. endoreg_db/data/db_summary.csv +58 -0
  16. endoreg_db/data/db_summary.xlsx +0 -0
  17. endoreg_db/data/disease/misc.yaml +1 -2
  18. endoreg_db/data/endoscopy_processor/data.yaml +3 -0
  19. endoreg_db/data/event/cardiology.yaml +0 -13
  20. endoreg_db/data/examination/examinations/data.yaml +14 -9
  21. endoreg_db/data/examination_indication/endoscopy.yaml +30 -30
  22. endoreg_db/data/examination_indication_classification/endoscopy.yaml +11 -11
  23. endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
  24. endoreg_db/data/finding/anatomy_colon.yaml +128 -0
  25. endoreg_db/data/finding/colonoscopy.yaml +40 -0
  26. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
  27. endoreg_db/data/finding/complication.yaml +16 -0
  28. endoreg_db/data/finding/data.yaml +3 -46
  29. endoreg_db/data/finding/examination_setting.yaml +16 -0
  30. endoreg_db/data/finding/medication_related.yaml +18 -0
  31. endoreg_db/data/finding/outcome.yaml +12 -0
  32. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
  33. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
  34. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
  35. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  36. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  37. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  38. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  39. endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
  40. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
  41. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
  42. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
  43. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
  44. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
  45. endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
  46. endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
  47. endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
  48. endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
  49. endoreg_db/data/finding_classification/medication_related.yaml +23 -0
  50. endoreg_db/data/finding_classification/visualized.yaml +33 -0
  51. endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
  52. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_circularity_default.yaml +0 -2
  53. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  54. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  55. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  56. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_nice.yaml +4 -7
  57. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_paris.yaml +0 -8
  58. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_planarity_default.yaml +6 -13
  59. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  60. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_surface_intact_default.yaml +3 -6
  61. endoreg_db/data/{finding_location_classification_choice/colonoscopy.yaml → finding_classification_choice/colonoscopy_location.yaml} +11 -22
  62. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  63. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
  64. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  65. endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
  66. endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  67. endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
  68. endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
  69. endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
  70. endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
  71. endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
  72. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +8 -3
  73. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +6 -6
  74. endoreg_db/data/finding_type/data.yaml +23 -10
  75. endoreg_db/data/gender/data.yaml +8 -1
  76. endoreg_db/data/information_source/annotation.yaml +6 -0
  77. endoreg_db/data/information_source/prediction.yaml +7 -0
  78. endoreg_db/data/information_source_type/data.yaml +8 -0
  79. endoreg_db/data/lab_value/misc.yaml +43 -0
  80. endoreg_db/data/medication/anticoagulation.yaml +5 -5
  81. endoreg_db/data/medication/tah.yaml +5 -5
  82. endoreg_db/data/medication_intake_time/base.yaml +4 -4
  83. endoreg_db/data/names_first/first_names.yaml +3 -0
  84. endoreg_db/data/pdf_type/data.yaml +26 -2
  85. endoreg_db/data/qualification/endoscopy.yaml +36 -0
  86. endoreg_db/data/qualification/m2.yaml +39 -0
  87. endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
  88. endoreg_db/data/qualification/sonography.yaml +36 -0
  89. endoreg_db/data/qualification_type/base.yaml +29 -0
  90. endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
  91. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
  92. endoreg_db/data/requirement/age.yaml +26 -0
  93. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
  94. endoreg_db/data/requirement/disease_cardiovascular.yaml +6 -6
  95. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +9 -6
  96. endoreg_db/data/requirement/disease_hepatology.yaml +1 -1
  97. endoreg_db/data/requirement/disease_misc.yaml +3 -3
  98. endoreg_db/data/requirement/disease_renal.yaml +18 -2
  99. endoreg_db/data/requirement/{colonoscopy_indications.yaml → endoscopy_bleeding_risk.yaml} +6 -3
  100. endoreg_db/data/requirement/event_cardiology.yaml +17 -17
  101. endoreg_db/data/requirement/event_requirements.yaml +145 -0
  102. endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
  103. endoreg_db/data/requirement/gender.yaml +25 -0
  104. endoreg_db/data/requirement/lab_value.yaml +352 -31
  105. endoreg_db/data/requirement/medication.yaml +93 -0
  106. endoreg_db/data/requirement_operator/age.yaml +13 -0
  107. endoreg_db/data/requirement_operator/lab_operators.yaml +36 -35
  108. endoreg_db/data/requirement_operator/model_operators.yaml +13 -7
  109. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
  110. endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  111. endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +42 -2
  112. endoreg_db/data/requirement_type/requirement_types.yaml +82 -0
  113. endoreg_db/data/shift/endoscopy.yaml +21 -0
  114. endoreg_db/data/shift_type/base.yaml +35 -0
  115. endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
  116. endoreg_db/data/unit/concentration.yaml +23 -0
  117. endoreg_db/exceptions.py +19 -0
  118. endoreg_db/forms/patient_finding_intervention_form.py +4 -5
  119. endoreg_db/forms/patient_form.py +7 -6
  120. endoreg_db/forms/questionnaires/__init__.py +1 -1
  121. endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
  122. endoreg_db/helpers/count_db.py +45 -0
  123. endoreg_db/helpers/data_loader.py +208 -0
  124. endoreg_db/helpers/default_objects.py +359 -0
  125. endoreg_db/helpers/interact.py +6 -0
  126. endoreg_db/helpers/test_video_helper.py +119 -0
  127. endoreg_db/logger_conf.py +140 -0
  128. endoreg_db/management/__init__.py +1 -0
  129. endoreg_db/management/commands/__init__.py +1 -0
  130. endoreg_db/management/commands/anonymize_video.py +0 -0
  131. endoreg_db/management/commands/check_auth.py +125 -0
  132. endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
  133. endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
  134. endoreg_db/management/commands/fix_video_paths.py +165 -0
  135. endoreg_db/management/commands/import_fallback_video.py +203 -0
  136. endoreg_db/management/commands/import_report.py +298 -0
  137. endoreg_db/management/commands/import_video.py +422 -0
  138. endoreg_db/management/commands/import_video_with_classification.py +367 -0
  139. endoreg_db/management/commands/init_default_ai_model.py +112 -0
  140. endoreg_db/management/commands/load_ai_model_data.py +2 -7
  141. endoreg_db/management/commands/load_base_db_data.py +1 -0
  142. endoreg_db/management/commands/load_endoscope_data.py +2 -2
  143. endoreg_db/management/commands/load_examination_indication_data.py +2 -3
  144. endoreg_db/management/commands/load_finding_data.py +49 -92
  145. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
  146. endoreg_db/management/commands/load_information_source.py +13 -7
  147. endoreg_db/management/commands/load_name_data.py +37 -0
  148. endoreg_db/management/commands/load_qualification_data.py +59 -0
  149. endoreg_db/management/commands/load_requirement_data.py +30 -6
  150. endoreg_db/management/commands/load_shift_data.py +60 -0
  151. endoreg_db/management/commands/load_tag_data.py +57 -0
  152. endoreg_db/management/commands/register_ai_model.py +1 -1
  153. endoreg_db/management/commands/start_filewatcher.py +106 -0
  154. endoreg_db/management/commands/storage_management.py +548 -0
  155. endoreg_db/management/commands/summarize_db_content.py +189 -0
  156. endoreg_db/management/commands/validate_video.py +204 -0
  157. endoreg_db/management/commands/validate_video_files.py +161 -0
  158. endoreg_db/management/commands/video_validation.py +22 -0
  159. endoreg_db/migrations/0001_initial.py +625 -813
  160. endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
  161. endoreg_db/models/__init__.py +270 -307
  162. endoreg_db/models/administration/__init__.py +116 -0
  163. endoreg_db/models/{ai_model → administration/ai}/__init__.py +6 -1
  164. endoreg_db/models/administration/ai/active_model.py +35 -0
  165. endoreg_db/models/administration/ai/ai_model.py +156 -0
  166. endoreg_db/models/{ai_model → administration/ai}/model_type.py +6 -1
  167. endoreg_db/models/administration/case/__init__.py +19 -0
  168. endoreg_db/models/administration/case/case.py +114 -0
  169. endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +3 -3
  170. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +3 -10
  171. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +2 -4
  172. endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
  173. endoreg_db/models/{center → administration/center}/__init__.py +3 -1
  174. endoreg_db/models/administration/center/center.py +61 -0
  175. endoreg_db/models/administration/center/center_product.py +64 -0
  176. endoreg_db/models/{center → administration/center}/center_resource.py +19 -3
  177. endoreg_db/models/administration/center/center_shift.py +88 -0
  178. endoreg_db/models/administration/center/center_waste.py +30 -0
  179. endoreg_db/models/administration/permissions/__init__.py +44 -0
  180. endoreg_db/models/administration/person/__init__.py +24 -0
  181. endoreg_db/models/administration/person/employee/__init__.py +3 -0
  182. endoreg_db/models/administration/person/employee/employee.py +35 -0
  183. endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
  184. endoreg_db/models/administration/person/employee/employee_type.py +42 -0
  185. endoreg_db/models/administration/person/examiner/__init__.py +4 -0
  186. endoreg_db/models/administration/person/examiner/examiner.py +54 -0
  187. endoreg_db/models/administration/person/names/__init__.py +0 -0
  188. endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
  189. endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
  190. endoreg_db/models/administration/person/patient/__init__.py +5 -0
  191. endoreg_db/models/administration/person/patient/patient.py +460 -0
  192. endoreg_db/models/administration/person/profession/__init__.py +24 -0
  193. endoreg_db/models/administration/person/user/__init__.py +5 -0
  194. endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
  195. endoreg_db/models/administration/product/product.py +97 -0
  196. endoreg_db/models/administration/product/product_group.py +39 -0
  197. endoreg_db/models/administration/product/product_material.py +54 -0
  198. endoreg_db/models/{product → administration/product}/product_weight.py +9 -0
  199. endoreg_db/models/{product → administration/product}/reference_product.py +26 -11
  200. endoreg_db/models/administration/qualification/__init__.py +7 -0
  201. endoreg_db/models/administration/qualification/qualification.py +37 -0
  202. endoreg_db/models/administration/qualification/qualification_type.py +35 -0
  203. endoreg_db/models/administration/shift/__init__.py +9 -0
  204. endoreg_db/models/administration/shift/scheduled_days.py +69 -0
  205. endoreg_db/models/administration/shift/shift.py +51 -0
  206. endoreg_db/models/administration/shift/shift_type.py +108 -0
  207. endoreg_db/models/label/__init__.py +24 -1
  208. endoreg_db/models/label/annotation/__init__.py +12 -0
  209. endoreg_db/models/label/annotation/image_classification.py +84 -0
  210. endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
  211. endoreg_db/models/label/label.py +45 -74
  212. endoreg_db/models/label/label_set.py +53 -0
  213. endoreg_db/models/label/label_type.py +29 -0
  214. endoreg_db/models/label/label_video_segment/__init__.py +3 -0
  215. endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
  216. endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
  217. endoreg_db/models/label/video_segmentation_label.py +31 -0
  218. endoreg_db/models/{annotation → label}/video_segmentation_labelset.py +7 -0
  219. endoreg_db/models/media/__init__.py +14 -0
  220. endoreg_db/models/media/frame/__init__.py +3 -0
  221. endoreg_db/models/media/frame/frame.py +111 -0
  222. endoreg_db/models/media/pdf/__init__.py +11 -0
  223. endoreg_db/models/media/pdf/raw_pdf.py +608 -0
  224. endoreg_db/models/media/pdf/report_file.py +162 -0
  225. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
  226. endoreg_db/models/media/video/__init__.py +4 -0
  227. endoreg_db/models/media/video/create_from_file.py +336 -0
  228. endoreg_db/models/media/video/pipe_1.py +195 -0
  229. endoreg_db/models/media/video/pipe_2.py +105 -0
  230. endoreg_db/models/media/video/refactor_plan.md +0 -0
  231. endoreg_db/models/media/video/video_file.py +680 -0
  232. endoreg_db/models/media/video/video_file_ai.py +443 -0
  233. endoreg_db/models/media/video/video_file_anonymize.py +348 -0
  234. endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
  235. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
  236. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
  237. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
  238. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
  239. endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
  240. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
  241. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
  242. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
  243. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
  244. endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
  245. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
  246. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +129 -0
  247. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
  248. endoreg_db/models/media/video/video_file_frames.py +0 -0
  249. endoreg_db/models/media/video/video_file_io.py +166 -0
  250. endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
  251. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
  252. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
  253. endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
  254. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
  255. endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
  256. endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
  257. endoreg_db/models/media/video/video_file_meta.py +11 -0
  258. endoreg_db/models/media/video/video_file_segments.py +209 -0
  259. endoreg_db/models/medical/__init__.py +146 -0
  260. endoreg_db/models/{contraindication → medical/contraindication}/__init__.py +1 -5
  261. endoreg_db/models/{disease.py → medical/disease.py} +60 -52
  262. endoreg_db/models/{event.py → medical/event.py} +31 -54
  263. endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
  264. endoreg_db/models/medical/examination/examination.py +148 -0
  265. endoreg_db/models/{examination → medical/examination}/examination_indication.py +64 -35
  266. endoreg_db/models/{examination → medical/examination}/examination_time.py +0 -4
  267. endoreg_db/models/{examination → medical/examination}/examination_time_type.py +1 -8
  268. endoreg_db/models/{examination → medical/examination}/examination_type.py +1 -7
  269. endoreg_db/models/medical/finding/__init__.py +18 -0
  270. endoreg_db/models/medical/finding/finding.py +96 -0
  271. endoreg_db/models/medical/finding/finding_classification.py +142 -0
  272. endoreg_db/models/{finding → medical/finding}/finding_intervention.py +2 -10
  273. endoreg_db/models/medical/finding/finding_type.py +35 -0
  274. endoreg_db/models/medical/hardware/__init__.py +8 -0
  275. endoreg_db/models/{hardware → medical/hardware}/endoscope.py +28 -23
  276. endoreg_db/models/medical/laboratory/__init__.py +5 -0
  277. endoreg_db/models/medical/laboratory/lab_value.py +419 -0
  278. endoreg_db/models/{medication → medical/medication}/medication.py +1 -3
  279. endoreg_db/models/{medication → medical/medication}/medication_indication_type.py +8 -3
  280. endoreg_db/models/{medication → medical/medication}/medication_intake_time.py +21 -3
  281. endoreg_db/models/{medication → medical/medication}/medication_schedule.py +13 -5
  282. endoreg_db/models/{organ → medical/organ}/__init__.py +3 -6
  283. endoreg_db/models/medical/patient/__init__.py +56 -0
  284. endoreg_db/models/medical/patient/medication_examples.py +38 -0
  285. endoreg_db/models/medical/patient/patient_disease.py +63 -0
  286. endoreg_db/models/medical/patient/patient_event.py +75 -0
  287. endoreg_db/models/medical/patient/patient_examination.py +249 -0
  288. endoreg_db/models/{persons → medical}/patient/patient_examination_indication.py +21 -9
  289. endoreg_db/models/medical/patient/patient_finding.py +357 -0
  290. endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
  291. endoreg_db/models/{patient → medical/patient}/patient_finding_intervention.py +15 -1
  292. endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
  293. endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +40 -15
  294. endoreg_db/models/medical/patient/patient_medication.py +104 -0
  295. endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
  296. endoreg_db/models/{risk → medical/risk}/risk_type.py +0 -4
  297. endoreg_db/models/{data_file/metadata → metadata}/__init__.py +6 -0
  298. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  299. endoreg_db/models/metadata/model_meta.py +193 -0
  300. endoreg_db/models/metadata/model_meta_logic.py +236 -0
  301. endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +28 -13
  302. endoreg_db/models/metadata/sensitive_meta.py +288 -0
  303. endoreg_db/models/metadata/sensitive_meta_logic.py +643 -0
  304. endoreg_db/models/metadata/video_meta.py +332 -0
  305. endoreg_db/models/metadata/video_prediction_logic.py +190 -0
  306. endoreg_db/models/metadata/video_prediction_meta.py +270 -0
  307. endoreg_db/models/other/__init__.py +17 -0
  308. endoreg_db/models/other/distribution/date_value_distribution.py +0 -2
  309. endoreg_db/models/other/distribution/numeric_value_distribution.py +30 -2
  310. endoreg_db/models/{emission → other/emission}/emission_factor.py +15 -6
  311. endoreg_db/models/{persons → other}/gender.py +8 -3
  312. endoreg_db/models/other/information_source.py +159 -0
  313. endoreg_db/models/other/material.py +10 -2
  314. endoreg_db/models/other/resource.py +6 -2
  315. endoreg_db/models/other/tag.py +27 -0
  316. endoreg_db/models/other/transport_route.py +13 -2
  317. endoreg_db/models/{unit.py → other/unit.py} +16 -6
  318. endoreg_db/models/other/waste.py +10 -3
  319. endoreg_db/models/requirement/requirement.py +556 -114
  320. endoreg_db/models/requirement/requirement_evaluation/__init__.py +4 -132
  321. endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
  322. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
  323. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +80 -87
  324. endoreg_db/models/requirement/requirement_operator.py +132 -14
  325. endoreg_db/models/requirement/requirement_set.py +181 -21
  326. endoreg_db/models/rule/__init__.py +13 -0
  327. endoreg_db/models/{rules → rule}/rule.py +6 -3
  328. endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
  329. endoreg_db/models/{rules → rule}/rule_type.py +0 -2
  330. endoreg_db/models/{rules → rule}/ruleset.py +0 -2
  331. endoreg_db/models/state/__init__.py +12 -0
  332. endoreg_db/models/state/abstract.py +11 -0
  333. endoreg_db/models/state/audit_ledger.py +150 -0
  334. endoreg_db/models/state/label_video_segment.py +22 -0
  335. endoreg_db/models/state/raw_pdf.py +187 -0
  336. endoreg_db/models/state/sensitive_meta.py +46 -0
  337. endoreg_db/models/state/video.py +232 -0
  338. endoreg_db/models/upload_job.py +99 -0
  339. endoreg_db/models/utils.py +135 -0
  340. endoreg_db/models/video_metadata.py +66 -0
  341. endoreg_db/models/video_processing.py +153 -0
  342. endoreg_db/renames.yml +8 -0
  343. endoreg_db/root_urls.py +9 -0
  344. endoreg_db/schemas/__init__.py +0 -0
  345. endoreg_db/schemas/examination_evaluation.py +27 -0
  346. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
  347. endoreg_db/serializers/__init__.py +147 -10
  348. endoreg_db/serializers/{raw_pdf_meta_validation.py → _old/raw_pdf_meta_validation.py} +3 -3
  349. endoreg_db/serializers/{raw_video_meta_validation.py → _old/raw_video_meta_validation.py} +18 -14
  350. endoreg_db/serializers/_old/video.py +71 -0
  351. endoreg_db/serializers/administration/__init__.py +14 -0
  352. endoreg_db/serializers/administration/ai/__init__.py +10 -0
  353. endoreg_db/serializers/administration/ai/active_model.py +10 -0
  354. endoreg_db/serializers/administration/ai/ai_model.py +18 -0
  355. endoreg_db/serializers/administration/ai/model_type.py +10 -0
  356. endoreg_db/serializers/administration/center.py +9 -0
  357. endoreg_db/serializers/administration/gender.py +9 -0
  358. endoreg_db/serializers/anonymization.py +66 -0
  359. endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
  360. endoreg_db/serializers/examination/__init__.py +10 -0
  361. endoreg_db/serializers/examination/base.py +46 -0
  362. endoreg_db/serializers/examination/dropdown.py +21 -0
  363. endoreg_db/serializers/examination_serializer.py +12 -0
  364. endoreg_db/serializers/finding/__init__.py +5 -0
  365. endoreg_db/serializers/finding/finding.py +54 -0
  366. endoreg_db/serializers/finding_classification/__init__.py +7 -0
  367. endoreg_db/serializers/finding_classification/choice.py +19 -0
  368. endoreg_db/serializers/finding_classification/classification.py +13 -0
  369. endoreg_db/serializers/label/__init__.py +7 -0
  370. endoreg_db/serializers/label/image_classification_annotation.py +62 -0
  371. endoreg_db/serializers/label/label.py +15 -0
  372. endoreg_db/serializers/label_video_segment/__init__.py +7 -0
  373. endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
  374. endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
  375. endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
  376. endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
  377. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
  378. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
  379. endoreg_db/serializers/meta/__init__.py +19 -0
  380. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
  381. endoreg_db/serializers/meta/report_meta.py +53 -0
  382. endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
  383. endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
  384. endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
  385. endoreg_db/serializers/meta/video_meta.py +39 -0
  386. endoreg_db/serializers/misc/__init__.py +14 -0
  387. endoreg_db/serializers/misc/file_overview.py +152 -0
  388. endoreg_db/serializers/misc/stats.py +33 -0
  389. endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
  390. endoreg_db/serializers/misc/upload_job.py +71 -0
  391. endoreg_db/serializers/misc/vop_patient_data.py +120 -0
  392. endoreg_db/serializers/patient/__init__.py +11 -0
  393. endoreg_db/serializers/patient/patient.py +86 -0
  394. endoreg_db/serializers/patient/patient_dropdown.py +27 -0
  395. endoreg_db/serializers/patient_examination/__init__.py +7 -0
  396. endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
  397. endoreg_db/serializers/patient_finding/__init__.py +15 -0
  398. endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
  399. endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
  400. endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
  401. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
  402. endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
  403. endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
  404. endoreg_db/serializers/pdf/__init__.py +5 -0
  405. endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
  406. endoreg_db/serializers/report/__init__.py +9 -0
  407. endoreg_db/serializers/report/mixins.py +45 -0
  408. endoreg_db/serializers/report/report.py +105 -0
  409. endoreg_db/serializers/report/report_list.py +22 -0
  410. endoreg_db/serializers/report/secure_file_url.py +26 -0
  411. endoreg_db/serializers/requirements/requirement_schema.py +25 -0
  412. endoreg_db/serializers/requirements/requirement_sets.py +29 -0
  413. endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
  414. endoreg_db/serializers/video/__init__.py +7 -0
  415. endoreg_db/serializers/video/segmentation.py +263 -0
  416. endoreg_db/serializers/video/video_file_brief.py +10 -0
  417. endoreg_db/serializers/video/video_file_detail.py +83 -0
  418. endoreg_db/serializers/video/video_file_list.py +67 -0
  419. endoreg_db/serializers/video/video_metadata.py +105 -0
  420. endoreg_db/serializers/video/video_processing_history.py +153 -0
  421. endoreg_db/services/__init__.py +5 -0
  422. endoreg_db/services/anonymization.py +223 -0
  423. endoreg_db/services/examination_evaluation.py +149 -0
  424. endoreg_db/services/finding_description_service.py +0 -0
  425. endoreg_db/services/lookup_service.py +241 -0
  426. endoreg_db/services/lookup_store.py +122 -0
  427. endoreg_db/services/ollama_api_docs.py +1528 -0
  428. endoreg_db/services/pdf_import.py +993 -0
  429. endoreg_db/services/polling_coordinator.py +288 -0
  430. endoreg_db/services/pseudonym_service.py +89 -0
  431. endoreg_db/services/requirements_object.py +147 -0
  432. endoreg_db/services/segment_sync.py +155 -0
  433. endoreg_db/services/storage_aware_video_processor.py +344 -0
  434. endoreg_db/services/video_import.py +915 -0
  435. endoreg_db/tasks/upload_tasks.py +207 -0
  436. endoreg_db/tasks/video_ingest.py +157 -0
  437. endoreg_db/tasks/video_processing_tasks.py +327 -0
  438. endoreg_db/urls/__init__.py +72 -0
  439. endoreg_db/urls/anonymization.py +32 -0
  440. endoreg_db/urls/auth.py +16 -0
  441. endoreg_db/urls/classification.py +39 -0
  442. endoreg_db/urls/examination.py +54 -0
  443. endoreg_db/urls/files.py +6 -0
  444. endoreg_db/urls/label_video_segment_validate.py +33 -0
  445. endoreg_db/urls/label_video_segments.py +44 -0
  446. endoreg_db/urls/media.py +32 -0
  447. endoreg_db/urls/patient.py +19 -0
  448. endoreg_db/urls/pdf.py +0 -0
  449. endoreg_db/urls/report.py +78 -0
  450. endoreg_db/urls/requirements.py +13 -0
  451. endoreg_db/urls/sensitive_meta.py +36 -0
  452. endoreg_db/urls/stats.py +46 -0
  453. endoreg_db/urls/upload.py +20 -0
  454. endoreg_db/urls/video.py +119 -0
  455. endoreg_db/urls.py +6 -283
  456. endoreg_db/utils/__init__.py +66 -57
  457. endoreg_db/utils/ai/__init__.py +9 -0
  458. endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
  459. endoreg_db/{models/ai_model/lightning → utils/ai}/inference_dataset.py +0 -1
  460. endoreg_db/{models/ai_model/lightning → utils/ai}/multilabel_classification_net.py +14 -10
  461. endoreg_db/{models/ai_model/lightning → utils/ai}/postprocess.py +15 -5
  462. endoreg_db/utils/ai/predict.py +291 -0
  463. endoreg_db/{models/ai_model/lightning → utils/ai}/preprocess.py +1 -1
  464. endoreg_db/utils/calc_duration_seconds.py +24 -0
  465. endoreg_db/utils/case_generator/__init__.py +0 -0
  466. endoreg_db/utils/check_video_files.py +148 -0
  467. endoreg_db/utils/dataloader.py +50 -12
  468. endoreg_db/utils/dates.py +21 -0
  469. endoreg_db/utils/env.py +33 -0
  470. endoreg_db/utils/extract_specific_frames.py +72 -0
  471. endoreg_db/utils/file_operations.py +29 -1
  472. endoreg_db/utils/fix_video_path_direct.py +141 -0
  473. endoreg_db/utils/frame_anonymization_utils.py +463 -0
  474. endoreg_db/utils/links/__init__.py +0 -0
  475. endoreg_db/utils/links/requirement_link.py +193 -0
  476. endoreg_db/utils/mime_types.py +0 -0
  477. endoreg_db/utils/names.py +2 -0
  478. endoreg_db/utils/paths.py +100 -82
  479. endoreg_db/utils/permissions.py +143 -0
  480. endoreg_db/utils/pipelines/Readme.md +235 -0
  481. endoreg_db/utils/pipelines/__init__.py +0 -0
  482. endoreg_db/utils/pipelines/process_video_dir.py +120 -0
  483. endoreg_db/utils/product/__init__.py +0 -0
  484. endoreg_db/utils/product/sum_emissions.py +20 -0
  485. endoreg_db/utils/product/sum_weights.py +18 -0
  486. endoreg_db/utils/pydantic_models/db_config.py +1 -1
  487. endoreg_db/utils/requirement_helpers.py +0 -0
  488. endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
  489. endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
  490. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
  491. endoreg_db/utils/translation.py +27 -0
  492. endoreg_db/utils/validate_video_detailed.py +357 -0
  493. endoreg_db/utils/video/__init__.py +19 -6
  494. endoreg_db/utils/video/extract_frames.py +37 -70
  495. endoreg_db/utils/video/ffmpeg_wrapper.py +772 -0
  496. endoreg_db/utils/video/names.py +42 -0
  497. endoreg_db/utils/video/streaming_processor.py +312 -0
  498. endoreg_db/utils/video/video_splitter.py +94 -0
  499. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
  500. endoreg_db/views/__init__.py +282 -2
  501. endoreg_db/views/anonymization/__init__.py +27 -0
  502. endoreg_db/views/anonymization/media_management.py +454 -0
  503. endoreg_db/views/anonymization/overview.py +216 -0
  504. endoreg_db/views/anonymization/validate.py +63 -0
  505. endoreg_db/views/auth/__init__.py +13 -0
  506. endoreg_db/views/{views.py → auth/keycloak.py} +19 -13
  507. endoreg_db/views/examination/__init__.py +33 -0
  508. endoreg_db/views/examination/examination.py +37 -0
  509. endoreg_db/views/examination/examination_manifest_cache.py +26 -0
  510. endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
  511. endoreg_db/views/examination/get_finding_classifications.py +36 -0
  512. endoreg_db/views/examination/get_findings.py +41 -0
  513. endoreg_db/views/examination/get_instruments.py +18 -0
  514. endoreg_db/views/examination/get_interventions.py +14 -0
  515. endoreg_db/views/finding/__init__.py +9 -0
  516. endoreg_db/views/finding/finding.py +112 -0
  517. endoreg_db/views/finding/get_classifications.py +14 -0
  518. endoreg_db/views/finding/get_interventions.py +17 -0
  519. endoreg_db/views/finding_classification/__init__.py +13 -0
  520. endoreg_db/views/finding_classification/base.py +0 -0
  521. endoreg_db/views/finding_classification/finding_classification.py +42 -0
  522. endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
  523. endoreg_db/views/label/__init__.py +5 -0
  524. endoreg_db/views/label/label.py +15 -0
  525. endoreg_db/views/label_video_segment/__init__.py +16 -0
  526. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
  527. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
  528. endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
  529. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
  530. endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
  531. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
  532. endoreg_db/views/label_video_segment/validate.py +226 -0
  533. endoreg_db/views/media/__init__.py +9 -0
  534. endoreg_db/views/media/pdf_media.py +386 -0
  535. endoreg_db/views/media/video_media.py +272 -0
  536. endoreg_db/views/meta/__init__.py +15 -0
  537. endoreg_db/views/meta/available_files_list.py +146 -0
  538. endoreg_db/views/meta/report_meta.py +53 -0
  539. endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
  540. endoreg_db/views/meta/sensitive_meta_list.py +104 -0
  541. endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
  542. endoreg_db/views/misc/__init__.py +63 -0
  543. endoreg_db/views/misc/center.py +13 -0
  544. endoreg_db/views/misc/gender.py +14 -0
  545. endoreg_db/views/misc/secure_file_serving_view.py +80 -0
  546. endoreg_db/views/misc/secure_file_url_view.py +84 -0
  547. endoreg_db/views/misc/secure_url_validate.py +79 -0
  548. endoreg_db/views/misc/stats.py +220 -0
  549. endoreg_db/views/misc/translation.py +182 -0
  550. endoreg_db/views/misc/upload_views.py +240 -0
  551. endoreg_db/views/patient/__init__.py +5 -0
  552. endoreg_db/views/patient/patient.py +210 -0
  553. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
  554. endoreg_db/views/patient_examination/__init__.py +11 -0
  555. endoreg_db/views/patient_examination/patient_examination.py +140 -0
  556. endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
  557. endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
  558. endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
  559. endoreg_db/views/patient_examination/video.py +194 -0
  560. endoreg_db/views/patient_finding/__init__.py +7 -0
  561. endoreg_db/views/patient_finding/base.py +0 -0
  562. endoreg_db/views/patient_finding/patient_finding.py +64 -0
  563. endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
  564. endoreg_db/views/patient_finding_classification/__init__.py +5 -0
  565. endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
  566. endoreg_db/views/patient_finding_location/__init__.py +5 -0
  567. endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
  568. endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
  569. endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
  570. endoreg_db/views/pdf/__init__.py +11 -0
  571. endoreg_db/views/pdf/pdf_media.py +239 -0
  572. endoreg_db/views/pdf/pdf_stream_views.py +127 -0
  573. endoreg_db/views/pdf/reimport.py +151 -0
  574. endoreg_db/views/report/__init__.py +9 -0
  575. endoreg_db/views/report/report_list.py +112 -0
  576. endoreg_db/views/report/report_with_secure_url.py +28 -0
  577. endoreg_db/views/report/start_examination.py +7 -0
  578. endoreg_db/views/requirement/__init__.py +10 -0
  579. endoreg_db/views/requirement/evaluate.py +279 -0
  580. endoreg_db/views/requirement/lookup.py +483 -0
  581. endoreg_db/views/requirement/lookup_store.py +252 -0
  582. endoreg_db/views/requirement_lookup/lookup.py +0 -0
  583. endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
  584. endoreg_db/views/stats/__init__.py +13 -0
  585. endoreg_db/views/stats/stats_views.py +229 -0
  586. endoreg_db/views/video/__init__.py +72 -0
  587. endoreg_db/views/video/correction.py +672 -0
  588. endoreg_db/views/video/media/__init__.py +23 -0
  589. endoreg_db/views/video/media/task_status.py +49 -0
  590. endoreg_db/views/video/media/video_analyze.py +52 -0
  591. endoreg_db/views/video/media/video_apply_mask.py +48 -0
  592. endoreg_db/views/video/media/video_correction.py +21 -0
  593. endoreg_db/views/video/media/video_download_processed.py +58 -0
  594. endoreg_db/views/video/media/video_media.py +158 -0
  595. endoreg_db/views/video/media/video_meta.py +29 -0
  596. endoreg_db/views/video/media/video_processing_history.py +24 -0
  597. endoreg_db/views/video/media/video_remove_frames.py +48 -0
  598. endoreg_db/views/video/media/video_reprocess.py +40 -0
  599. endoreg_db/views/video/reimport.py +192 -0
  600. endoreg_db/views/video/segmentation.py +274 -0
  601. endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
  602. endoreg_db/views/video/video_examination_viewset.py +329 -0
  603. endoreg_db/views/video/video_stream.py +188 -0
  604. endoreg_db-0.8.1.dist-info/METADATA +384 -0
  605. endoreg_db-0.8.1.dist-info/RECORD +789 -0
  606. endoreg_db/data/agl_service/data.yaml +0 -19
  607. endoreg_db/data/finding_location_classification/colonoscopy.yaml +0 -46
  608. endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +0 -48
  609. endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +0 -57
  610. endoreg_db/management/commands/_load_model_template.py +0 -41
  611. endoreg_db/management/commands/delete_all.py +0 -18
  612. endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
  613. endoreg_db/management/commands/fix_auth_permission.py +0 -20
  614. endoreg_db/management/commands/load_active_model_data.py +0 -45
  615. endoreg_db/management/commands/load_g_play_data.py +0 -113
  616. endoreg_db/management/commands/load_logging_data.py +0 -39
  617. endoreg_db/management/commands/load_lx_data.py +0 -64
  618. endoreg_db/management/commands/load_medication_indication_data.py +0 -63
  619. endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
  620. endoreg_db/management/commands/load_medication_intake_time_data.py +0 -41
  621. endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
  622. endoreg_db/management/commands/load_network_data.py +0 -57
  623. endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +0 -23
  624. endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +0 -23
  625. endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +0 -25
  626. endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +0 -33
  627. endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +0 -23
  628. endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +0 -24
  629. endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +0 -48
  630. endoreg_db/migrations/0009_requirementoperator_requirementsettype_and_more.py +0 -154
  631. endoreg_db/models/ai_model/active_model.py +0 -9
  632. endoreg_db/models/ai_model/ai_model.py +0 -90
  633. endoreg_db/models/ai_model/lightning/__init__.py +0 -3
  634. endoreg_db/models/ai_model/lightning/predict.py +0 -172
  635. endoreg_db/models/ai_model/lightning/prediction_visualizer.py +0 -55
  636. endoreg_db/models/ai_model/lightning/run_visualizer.py +0 -21
  637. endoreg_db/models/ai_model/model_meta.py +0 -240
  638. endoreg_db/models/annotation/__init__.py +0 -32
  639. endoreg_db/models/annotation/anonymized_image_annotation.py +0 -115
  640. endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -117
  641. endoreg_db/models/annotation/image_classification.py +0 -86
  642. endoreg_db/models/annotation/video_segmentation_annotation.py +0 -52
  643. endoreg_db/models/case/__init__.py +0 -1
  644. endoreg_db/models/case/case.py +0 -34
  645. endoreg_db/models/center/center.py +0 -51
  646. endoreg_db/models/center/center_product.py +0 -33
  647. endoreg_db/models/center/center_waste.py +0 -16
  648. endoreg_db/models/data_file/__init__.py +0 -39
  649. endoreg_db/models/data_file/base_classes/__init__.py +0 -7
  650. endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -98
  651. endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -127
  652. endoreg_db/models/data_file/base_classes/abstract_video.py +0 -806
  653. endoreg_db/models/data_file/base_classes/frame_helpers.py +0 -17
  654. endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +0 -19
  655. endoreg_db/models/data_file/base_classes/utils.py +0 -58
  656. endoreg_db/models/data_file/frame.py +0 -29
  657. endoreg_db/models/data_file/import_classes/__init__.py +0 -18
  658. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
  659. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
  660. endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
  661. endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -254
  662. endoreg_db/models/data_file/import_classes/raw_video.py +0 -290
  663. endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -290
  664. endoreg_db/models/data_file/metadata/video_meta.py +0 -199
  665. endoreg_db/models/data_file/report_file.py +0 -56
  666. endoreg_db/models/data_file/video/__init__.py +0 -11
  667. endoreg_db/models/data_file/video/import_meta.py +0 -25
  668. endoreg_db/models/data_file/video/video.py +0 -196
  669. endoreg_db/models/data_file/video_segment.py +0 -214
  670. endoreg_db/models/examination/examination.py +0 -67
  671. endoreg_db/models/finding/__init__.py +0 -11
  672. endoreg_db/models/finding/finding.py +0 -75
  673. endoreg_db/models/finding/finding_location_classification.py +0 -94
  674. endoreg_db/models/finding/finding_morphology_classification.py +0 -89
  675. endoreg_db/models/finding/finding_type.py +0 -22
  676. endoreg_db/models/hardware/__init__.py +0 -2
  677. endoreg_db/models/information_source.py +0 -65
  678. endoreg_db/models/laboratory/__init__.py +0 -1
  679. endoreg_db/models/laboratory/lab_value.py +0 -162
  680. endoreg_db/models/logging/__init__.py +0 -11
  681. endoreg_db/models/logging/agl_service.py +0 -19
  682. endoreg_db/models/logging/base.py +0 -22
  683. endoreg_db/models/logging/log_type.py +0 -23
  684. endoreg_db/models/logging/network_device.py +0 -27
  685. endoreg_db/models/lx/__init__.py +0 -4
  686. endoreg_db/models/lx/client.py +0 -57
  687. endoreg_db/models/lx/identity.py +0 -34
  688. endoreg_db/models/lx/permission.py +0 -18
  689. endoreg_db/models/lx/user.py +0 -16
  690. endoreg_db/models/network/__init__.py +0 -9
  691. endoreg_db/models/network/agl_service.py +0 -38
  692. endoreg_db/models/network/network_device.py +0 -58
  693. endoreg_db/models/network/network_device_type.py +0 -23
  694. endoreg_db/models/other/distribution.py +0 -5
  695. endoreg_db/models/patient/__init__.py +0 -24
  696. endoreg_db/models/patient/patient_examination.py +0 -182
  697. endoreg_db/models/patient/patient_finding.py +0 -143
  698. endoreg_db/models/patient/patient_finding_location.py +0 -120
  699. endoreg_db/models/patient/patient_finding_morphology.py +0 -166
  700. endoreg_db/models/permissions/__init__.py +0 -44
  701. endoreg_db/models/persons/__init__.py +0 -34
  702. endoreg_db/models/persons/examiner/__init__.py +0 -2
  703. endoreg_db/models/persons/examiner/examiner.py +0 -60
  704. endoreg_db/models/persons/examiner/examiner_type.py +0 -2
  705. endoreg_db/models/persons/patient/__init__.py +0 -8
  706. endoreg_db/models/persons/patient/patient.py +0 -389
  707. endoreg_db/models/persons/patient/patient_disease.py +0 -22
  708. endoreg_db/models/persons/patient/patient_event.py +0 -52
  709. endoreg_db/models/persons/patient/patient_lab_sample.py +0 -108
  710. endoreg_db/models/persons/patient/patient_medication.py +0 -59
  711. endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -88
  712. endoreg_db/models/persons/portal_user_information.py +0 -27
  713. endoreg_db/models/prediction/__init__.py +0 -8
  714. endoreg_db/models/prediction/image_classification.py +0 -51
  715. endoreg_db/models/prediction/video_prediction_meta.py +0 -306
  716. endoreg_db/models/product/product.py +0 -110
  717. endoreg_db/models/product/product_group.py +0 -27
  718. endoreg_db/models/product/product_material.py +0 -28
  719. endoreg_db/models/questionnaires/__init__.py +0 -114
  720. endoreg_db/models/quiz/__init__.py +0 -9
  721. endoreg_db/models/quiz/quiz_answer.py +0 -41
  722. endoreg_db/models/quiz/quiz_question.py +0 -54
  723. endoreg_db/models/report_reader/report_reader_config.py +0 -53
  724. endoreg_db/models/rules/__init__.py +0 -5
  725. endoreg_db/queries/get/__init__.py +0 -6
  726. endoreg_db/queries/get/center.py +0 -42
  727. endoreg_db/queries/get/model.py +0 -13
  728. endoreg_db/queries/get/patient.py +0 -14
  729. endoreg_db/queries/get/patient_examination.py +0 -20
  730. endoreg_db/queries/get/report_file.py +0 -33
  731. endoreg_db/queries/get/video.py +0 -31
  732. endoreg_db/serializers/ai_model.py +0 -19
  733. endoreg_db/serializers/annotation.py +0 -14
  734. endoreg_db/serializers/center.py +0 -11
  735. endoreg_db/serializers/examination.py +0 -33
  736. endoreg_db/serializers/frame.py +0 -9
  737. endoreg_db/serializers/hardware.py +0 -21
  738. endoreg_db/serializers/label.py +0 -22
  739. endoreg_db/serializers/patient.py +0 -33
  740. endoreg_db/serializers/prediction.py +0 -10
  741. endoreg_db/serializers/raw_pdf_anony_text_validation.py +0 -137
  742. endoreg_db/serializers/report_file.py +0 -7
  743. endoreg_db/serializers/video.py +0 -20
  744. endoreg_db/serializers/video_segmentation.py +0 -574
  745. endoreg_db/tests.py +0 -3
  746. endoreg_db/utils/legacy_ocr.py +0 -201
  747. endoreg_db/utils/video/transcode_videofile.py +0 -111
  748. endoreg_db/views/patient_views.py +0 -90
  749. endoreg_db/views/raw_pdf_anony_text_validation_views.py +0 -95
  750. endoreg_db/views/raw_pdf_meta_validation_views.py +0 -111
  751. endoreg_db/views/raw_video_meta_validation_views.py +0 -148
  752. endoreg_db/views/report_views.py +0 -96
  753. endoreg_db/views/video_segmentation_views.py +0 -166
  754. endoreg_db-0.6.4.dist-info/METADATA +0 -161
  755. endoreg_db-0.6.4.dist-info/RECORD +0 -470
  756. /endoreg_db/{case_generator/__init__.py → api/serializers/finding_descriptions.py} +0 -0
  757. /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
  758. /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
  759. /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
  760. /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
  761. /endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +0 -0
  762. /endoreg_db/models/{persons → administration/person}/person.py +0 -0
  763. /endoreg_db/models/{product → administration/product}/__init__.py +0 -0
  764. /endoreg_db/models/{report_reader → media/pdf/report_reader}/__init__.py +0 -0
  765. /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
  766. /endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +0 -0
  767. /endoreg_db/models/{medication → medical/medication}/__init__.py +0 -0
  768. /endoreg_db/models/{medication → medical/medication}/medication_indication.py +0 -0
  769. /endoreg_db/models/{risk → medical/risk}/__init__.py +0 -0
  770. /endoreg_db/models/{risk → medical/risk}/risk.py +0 -0
  771. /endoreg_db/models/{emission → other/emission}/__init__.py +0 -0
  772. /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
  773. /endoreg_db/{case_generator → utils/case_generator}/case_generator.py +0 -0
  774. /endoreg_db/{case_generator → utils/case_generator}/lab_sample_factory.py +0 -0
  775. /endoreg_db/{case_generator → utils/case_generator}/utils.py +0 -0
  776. /endoreg_db/views/{csrf.py → misc/csrf.py} +0 -0
  777. {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
  778. {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,116 @@
1
+ # AI
2
+ from .ai import (
3
+ AiModel,
4
+ ActiveModel,
5
+ ModelType,
6
+ )
7
+
8
+ # Case
9
+ from .case import (
10
+ Case,
11
+ CaseTemplate,
12
+ CaseTemplateRule,
13
+ CaseTemplateRuleType,
14
+ CaseTemplateRuleValue,
15
+ CaseTemplateRuleValueType,
16
+ CaseTemplateType,
17
+ )
18
+
19
+ # Center
20
+ from .center import (
21
+ Center,
22
+ CenterProduct,
23
+ CenterResource,
24
+ CenterWaste,
25
+ CenterShift,
26
+ )
27
+
28
+
29
+ #TODO Review module
30
+ # from .permissions import ()
31
+
32
+ # Person
33
+ from .person import (
34
+ Person,
35
+ Examiner,
36
+ Patient,
37
+ PortalUserInfo,
38
+ FirstName,
39
+ LastName,
40
+ Profession,
41
+ Employee,
42
+ EmployeeType,
43
+ EmployeeQualification,
44
+ )
45
+
46
+ # Product
47
+ from .product import (
48
+ Product,
49
+ ProductMaterial,
50
+ ProductGroup,
51
+ ReferenceProduct,
52
+ ProductWeight,
53
+ )
54
+
55
+ from .qualification import (
56
+ Qualification,
57
+ QualificationType,
58
+ )
59
+
60
+ from .shift import (
61
+ Shift,
62
+ ShiftType,
63
+ ScheduledDays,
64
+ )
65
+
66
+ __all__ = [
67
+ # AI
68
+ "AiModel",
69
+ "ActiveModel",
70
+ "ModelType",
71
+
72
+ # Case
73
+ "Case",
74
+ "CaseTemplate",
75
+ "CaseTemplateRule",
76
+ "CaseTemplateRuleType",
77
+ "CaseTemplateRuleValue",
78
+ "CaseTemplateRuleValueType",
79
+ "CaseTemplateType",
80
+
81
+ # Center
82
+ "Center",
83
+ "CenterProduct",
84
+ "CenterResource",
85
+ "CenterWaste",
86
+ "CenterShift",
87
+
88
+ # Person
89
+ "Person",
90
+ "Patient",
91
+ "Examiner",
92
+ "PortalUserInfo",
93
+ "FirstName",
94
+ "LastName",
95
+ "Profession",
96
+ "Employee",
97
+ "EmployeeType",
98
+ "EmployeeQualification",
99
+
100
+ # Product
101
+ 'Product',
102
+ 'ProductMaterial',
103
+ 'ProductGroup',
104
+ 'ReferenceProduct',
105
+ 'ProductWeight',
106
+
107
+ # Qualification
108
+ "Qualification",
109
+ "QualificationType",
110
+
111
+ # Shift
112
+ "Shift",
113
+ "ShiftType",
114
+ "ScheduledDays",
115
+ ]
116
+
@@ -1,4 +1,9 @@
1
- from .model_meta import ModelMeta
2
1
  from .model_type import ModelType
3
2
  from .active_model import ActiveModel
4
3
  from .ai_model import AiModel
4
+
5
+ __all__ = [
6
+ "ModelType",
7
+ "ActiveModel",
8
+ "AiModel",
9
+ ]
@@ -0,0 +1,35 @@
1
+ from django.db import models
2
+ from typing import TYPE_CHECKING, Optional
3
+
4
+ if TYPE_CHECKING:
5
+ from endoreg_db.models.metadata import ModelMeta
6
+
7
+
8
+ class ActiveModelManager(models.Manager):
9
+ def get_by_natural_key(self, name):
10
+ return self.get(name=name)
11
+
12
+ class ActiveModel(models.Model):
13
+ """
14
+ ActiveModel represents an active instance of a model within the application.
15
+ Attributes:
16
+ name (str): A unique identifier for the active model.
17
+ model_meta (ModelMeta, optional): A reference to the metadata of the model. This field acts as a ForeignKey
18
+ to the ModelMeta model and can be null.
19
+ Notes:
20
+ - The model_meta attribute is configured with on_delete=models.SET_NULL, meaning that if the related ModelMeta
21
+ record is deleted, model_meta will be set to null.
22
+ - Type hints for model_meta are provided under a TYPE_CHECKING conditional import to avoid circular dependencies,
23
+ importing ModelMeta only when type checking is performed.
24
+ Managers:
25
+ objects (ActiveModelManager): Custom manager providing specialized query capabilities for ActiveModel instances.
26
+ """
27
+
28
+ name = models.CharField(max_length=255, unique=True)
29
+
30
+ model_meta:Optional[models.ForeignKey["ModelMeta"]] = models.ForeignKey(
31
+ 'ModelMeta', on_delete=models.SET_NULL,
32
+ blank=True, null=True
33
+ )
34
+
35
+ objects = ActiveModelManager()
@@ -0,0 +1,156 @@
1
+ """
2
+ Django model for AI models.
3
+ """
4
+ from importlib import metadata
5
+ from django.db import models
6
+ from icecream import ic
7
+ from typing import TYPE_CHECKING, Optional, Union
8
+
9
+ if TYPE_CHECKING:
10
+ from .model_type import ModelType
11
+ from ...metadata import ModelMeta
12
+ from ...label import VideoSegmentationLabelSet
13
+ # Forward reference AiModel for use in type hints within the class itself
14
+ from typing import ForwardRef
15
+ AiModelRef = ForwardRef("'AiModel'")
16
+
17
+
18
+ class AiModelManager(models.Manager):
19
+ """
20
+ Manager for AI models with custom query methods.
21
+ """
22
+
23
+ def get_by_natural_key(self, name: str):
24
+ """
25
+ Retrieves the AiModel instance with the specified unique name.
26
+
27
+ Args:
28
+ name: The unique identifier of the AiModel to retrieve.
29
+
30
+ Returns:
31
+ The AiModel instance matching the given name.
32
+
33
+ Raises:
34
+ AiModel.DoesNotExist: If no AiModel with the specified name exists.
35
+ """
36
+ return self.get(name=name)
37
+
38
+
39
+ class AiModel(models.Model):
40
+ """
41
+ Represents a generic AI model that encapsulates high-level metadata about the model,
42
+ including names (default, German, and English), a description, categorization details,
43
+ and associated label sets and meta information.
44
+
45
+ name (str): Unique name of the AI model.
46
+ description (str): Optional detailed description of the AI model.
47
+ model_type (str): Optional type/category of the AI model.
48
+ model_subtype (str): Optional subtype within the broader model type.
49
+ video_segmentation_labelset (VideoSegmentationLabelSet): Optional associated label set for video segmentation tasks.
50
+ active_meta (ModelMeta): Optional reference to the currently active ModelMeta instance associated with the model.
51
+ """
52
+ objects = AiModelManager()
53
+
54
+ name = models.CharField(max_length=255, unique=True)
55
+
56
+ description = models.TextField(blank=True, null=True)
57
+ model_type:Optional[models.ForeignKey[Union["ModelType", None]]] = models.ForeignKey(
58
+ "ModelType",
59
+ on_delete=models.CASCADE,
60
+ related_name="ai_models",
61
+ blank=True,
62
+ null=True,
63
+ )
64
+ model_subtype = models.CharField(max_length=255, blank=True, null=True)
65
+ video_segmentation_labelset:Optional[models.ForeignKey[Union["VideoSegmentationLabelSet", None]]] = models.ForeignKey(
66
+ "VideoSegmentationLabelSet",
67
+ on_delete=models.CASCADE,
68
+ related_name="ai_models",
69
+ blank=True,
70
+ null=True,
71
+ )
72
+ active_meta:Optional[models.ForeignKey[Union["ModelMeta", None]]] = models.ForeignKey(
73
+ "ModelMeta",
74
+ on_delete=models.SET_NULL,
75
+ related_name="active_model",
76
+ blank=True,
77
+ null=True,
78
+ )
79
+
80
+ if TYPE_CHECKING:
81
+ metadata_versions: models.QuerySet["ModelMeta"]
82
+
83
+
84
+ def get_version(self, version: int) -> "ModelMeta":
85
+ """
86
+ Retrieves the ModelMeta instance for the specified version.
87
+
88
+ If the active_meta matches the requested version, it is returned. Otherwise, searches related metadata_versions for a matching version. Raises ValueError if no matching metadata is found.
89
+
90
+ Args:
91
+ version: The version number of the desired ModelMeta.
92
+
93
+ Returns:
94
+ The ModelMeta instance corresponding to the specified version.
95
+
96
+ Raises:
97
+ ValueError: If no ModelMeta with the given version exists.
98
+ """
99
+ if self.active_meta is not None and self.active_meta.version == version:
100
+ return self.active_meta
101
+
102
+ # Get the model metadata with the given version
103
+ model_meta = self.metadata_versions.filter(version=version).first()
104
+ if model_meta is not None:
105
+ return model_meta
106
+
107
+ raise ValueError(f"No model metadata found for version {version}.")
108
+
109
+ def get_latest_version(self) -> "ModelMeta":
110
+ """
111
+ Get the model_metadata object from metadata_versions with the highest version number.
112
+ """
113
+ if self.active_meta is not None:
114
+ return self.active_meta
115
+
116
+ # Get the latest version of the model metadata
117
+ latest_version = self.metadata_versions.order_by("-version").first()
118
+ if latest_version is not None:
119
+ return latest_version
120
+
121
+ raise ValueError("No model metadata found for this model.")
122
+
123
+ @classmethod
124
+ def set_active_model_meta(cls, model_name: str, meta_name: str, meta_version: int):
125
+ """
126
+ Sets the active metadata version for the specified AI model.
127
+
128
+ Updates the `active_meta` field of the AiModel identified by `model_name` to the ModelMeta instance matching `meta_name` and `meta_version`.
129
+ """
130
+ from ...metadata import ModelMeta
131
+
132
+ model = cls.objects.get(name=model_name)
133
+ assert model is not None, "Model not found"
134
+
135
+ ic(f"Getting model meta for {model_name} {meta_name} {meta_version}")
136
+
137
+ model_meta = ModelMeta.objects.get(
138
+ name=meta_name, model=model, version=meta_version
139
+ )
140
+ assert model_meta is not None, "ModelMeta not found"
141
+
142
+ model.active_meta = model_meta
143
+ model.save()
144
+
145
+ ic(
146
+ f"Set active model meta for {model_name} to {meta_name} version {meta_version}"
147
+ )
148
+
149
+ def natural_key(self):
150
+ """
151
+ Return the natural key for this model.
152
+ """
153
+ return (self.name,)
154
+
155
+ def __str__(self):
156
+ return str(self.name)
@@ -1,6 +1,8 @@
1
1
  from django.db import models
2
- from django.core import serializers
2
+ from typing import TYPE_CHECKING
3
3
 
4
+ if TYPE_CHECKING:
5
+ from .ai_model import AiModel
4
6
 
5
7
  class ModelTypeManager(models.Manager):
6
8
  """
@@ -27,6 +29,9 @@ class ModelType(models.Model):
27
29
 
28
30
  objects = ModelTypeManager()
29
31
 
32
+ if TYPE_CHECKING:
33
+ ai_models: models.QuerySet["AiModel"]
34
+
30
35
  def natural_key(self):
31
36
  """Return the natural key for this model type"""
32
37
  return (self.name,)
@@ -0,0 +1,19 @@
1
+ from .case import Case
2
+ from .case_template import (
3
+ CaseTemplate,
4
+ CaseTemplateRule,
5
+ CaseTemplateRuleType,
6
+ CaseTemplateRuleValue,
7
+ CaseTemplateRuleValueType,
8
+ CaseTemplateType,
9
+ )
10
+
11
+ __all__ = [
12
+ "Case",
13
+ "CaseTemplate",
14
+ "CaseTemplateRule",
15
+ "CaseTemplateRuleType",
16
+ "CaseTemplateRuleValue",
17
+ "CaseTemplateRuleValueType",
18
+ "CaseTemplateType",
19
+ ]
@@ -0,0 +1,114 @@
1
+ from django.db import models
2
+
3
+ from typing import TYPE_CHECKING
4
+ if TYPE_CHECKING:
5
+ from ..person import Patient
6
+ from ...medical.patient.patient_examination import PatientExamination
7
+ from django.utils import timezone
8
+
9
+ class Case(models.Model):
10
+ """
11
+ Represents a clinical case, linking a patient to one or more examinations over a specific period.
12
+
13
+ Attributes:
14
+ patient (Patient): The patient associated with this case.
15
+ patient_examinations (QuerySet[PatientExamination]): Examinations included in this case.
16
+ hash (str): An optional hash value for the case.
17
+ start_date (datetime): The start date and time of the case.
18
+ end_date (datetime): The end date and time of the case (optional).
19
+ is_active (bool): Indicates if the case is currently active.
20
+ is_closed (bool): Indicates if the case has been closed.
21
+ is_deleted (bool): Indicates if the case is marked as deleted.
22
+ created_at (datetime): Timestamp of case creation.
23
+ updated_at (datetime): Timestamp of last case update.
24
+ """
25
+ patient = models.ForeignKey(
26
+ 'Patient',
27
+ on_delete=models.CASCADE,
28
+ related_name='cases',
29
+ help_text="The patient associated with this case.",
30
+ db_index=True
31
+ )
32
+ patient_examinations = models.ManyToManyField(
33
+ 'PatientExamination',
34
+ related_name='cases',
35
+ help_text="The examinations included in this case."
36
+ )
37
+ hash = models.CharField(
38
+ max_length=255,
39
+ blank=True,
40
+ null=True,
41
+ help_text="An optional hash value associated with the case."
42
+ )
43
+
44
+ start_date = models.DateTimeField(
45
+ help_text="The start date and time of the case.",
46
+ db_index=True
47
+ )
48
+ end_date = models.DateTimeField(
49
+ null=True,
50
+ blank=True,
51
+ help_text="The end date and time of the case (optional)."
52
+ )
53
+ is_active = models.BooleanField(
54
+ default=True,
55
+ help_text="Flag indicating if the case is currently active.",
56
+ db_index=True
57
+ )
58
+ is_closed = models.BooleanField(
59
+ default=False,
60
+ help_text="Flag indicating if the case has been closed.",
61
+ db_index=True
62
+ )
63
+ is_deleted = models.BooleanField(
64
+ default=False,
65
+ help_text="Flag indicating if the case is marked as deleted.",
66
+ db_index=True
67
+ )
68
+ created_at = models.DateTimeField(
69
+ auto_now_add=True,
70
+ help_text="The date and time the case was created."
71
+ )
72
+ updated_at = models.DateTimeField(
73
+ auto_now=True,
74
+ help_text="The date and time the case was last updated."
75
+ )
76
+
77
+ if TYPE_CHECKING:
78
+ patient: "Patient"
79
+ patient_examinations: models.QuerySet["PatientExamination"]
80
+
81
+ class Meta:
82
+ ordering = ['-start_date', 'patient']
83
+ verbose_name = "Case"
84
+ verbose_name_plural = "Cases"
85
+
86
+ def __str__(self):
87
+ string_representation = f"Case {self.pk} ({self.patient})"
88
+ if self.start_date:
89
+ string_representation += f" - {self.start_date.strftime('%Y-%m-%d')}"
90
+ if self.end_date:
91
+ string_representation += f" - {self.end_date.strftime('%Y-%m-%d')}"
92
+ return string_representation
93
+
94
+ def close(self, end_date=None):
95
+ """Close this case with optional end date."""
96
+ self.is_closed = True
97
+ self.is_active = False
98
+ if end_date:
99
+ self.end_date = end_date
100
+ elif not self.end_date:
101
+ self.end_date = timezone.now()
102
+ self.save()
103
+
104
+ def reopen(self):
105
+ """Reopen this case if it was closed."""
106
+ self.is_closed = False
107
+ self.is_active = True
108
+ self.save()
109
+
110
+ def mark_as_deleted(self):
111
+ """Mark this case as deleted."""
112
+ self.is_deleted = True
113
+ self.is_active = False
114
+ self.save()
@@ -46,7 +46,7 @@ class CaseTemplate(models.Model):
46
46
  Returns:
47
47
  str: The name of the case template.
48
48
  """
49
- return self.name
49
+ return str(self.name)
50
50
 
51
51
  def get_rules(self):
52
52
  """
@@ -96,7 +96,7 @@ class CaseTemplate(models.Model):
96
96
  Raises:
97
97
  ValueError: If multiple such rules exist.
98
98
  """
99
- from endoreg_db.models.case_template.case_template_rule import CaseTemplateRule
99
+ from .case_template_rule import CaseTemplateRule
100
100
  create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model="Patient")
101
101
  if len(create_patient_rules) > 1:
102
102
  raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'.")
@@ -114,7 +114,7 @@ class CaseTemplate(models.Model):
114
114
  Raises:
115
115
  ValueError: If multiple such rules exist.
116
116
  """
117
- from endoreg_db.models.case_template.case_template_rule import CaseTemplateRule
117
+ from .case_template_rule import CaseTemplateRule
118
118
  create_patient_medication_schedule_rules = self.rules.filter(rule_type__name="create-object", target_model="PatientMedicationSchedule")
119
119
  if len(create_patient_medication_schedule_rules) > 1:
120
120
  raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'PatientMedicationSchedule'.")
@@ -10,13 +10,9 @@ class CaseTemplateRuleType(models.Model):
10
10
 
11
11
  Attributes:
12
12
  name (str): The name of the rule type.
13
- name_de (str): The German name of the rule type.
14
- name_en (str): The English name of the rule type.
15
13
  description (str): A description of the rule type.
16
14
  """
17
15
  name = models.CharField(max_length=255)
18
- name_de = models.CharField(max_length=255, null=True)
19
- name_en = models.CharField(max_length=255, null=True)
20
16
  description = models.TextField(blank=True, null=True)
21
17
 
22
18
  objects = CaseTemplateRuleTypeManager()
@@ -25,7 +21,7 @@ class CaseTemplateRuleType(models.Model):
25
21
  return (self.name,)
26
22
 
27
23
  def __str__(self):
28
- return self.name
24
+ return str(self.name)
29
25
 
30
26
  class CaseTemplateRuleManager(models.Manager):
31
27
  def get_by_natural_key(self, name):
@@ -52,8 +48,6 @@ class CaseTemplateRule(models.Model):
52
48
  Attributes:
53
49
  name (str): The name of the case template rule.
54
50
  description (str): A description of the case template rule.
55
- name_de (str): The name of the case template rule in German.
56
- name_en (str): The name of the case template rule in English.
57
51
  rule_type (CaseTemplateRuleType): The type of the rule.
58
52
  parent_model (str): The model on which the rule is applied.
59
53
  target_field (str): The field of the parent model on which the rule is applied.
@@ -79,8 +73,6 @@ class CaseTemplateRule(models.Model):
79
73
 
80
74
  """
81
75
  name = models.CharField(max_length=255)
82
- name_de = models.CharField(max_length=255, null=True)
83
- name_en = models.CharField(max_length=255, null=True)
84
76
  description = models.TextField(blank=True, null=True)
85
77
  rule_type = models.ForeignKey(
86
78
  "CaseTemplateRuleType", on_delete=models.CASCADE
@@ -124,7 +116,7 @@ class CaseTemplateRule(models.Model):
124
116
 
125
117
  :return: A string representation of the rule.
126
118
  """
127
- return self.name
119
+ return str(self.name)
128
120
 
129
121
  def get_rule_type(self):
130
122
  """
@@ -193,6 +185,7 @@ class CaseTemplateRule(models.Model):
193
185
 
194
186
  def chained_rules_has_self_reference(self):
195
187
  """
188
+ :noindex:
196
189
  Check if any directly or indirectly chained rules reference this rule, creating a non-terminating loop.
197
190
  Return a list containing a tuple (first_rule, self_referencing_rule) for each self-reference.
198
191
  first_rule is the most upward rule in the chain that references the rule.
@@ -21,8 +21,6 @@ class CaseTemplateRuleValueType(models.Model):
21
21
  objects = CaseTemplateRuleValueTypeManager()
22
22
 
23
23
  name = models.CharField(max_length=255)
24
- name_de = models.CharField(max_length=255, null=True)
25
- name_en = models.CharField(max_length=255, null=True)
26
24
  description = models.TextField(blank=True, null=True)
27
25
 
28
26
  distribution_type = models.CharField(max_length=255, choices=DISTRIBUTION_TYPES)
@@ -32,7 +30,7 @@ class CaseTemplateRuleValueType(models.Model):
32
30
  return (self.name,)
33
31
 
34
32
  def __str__(self):
35
- return self.name
33
+ return str(self.name)
36
34
 
37
35
  class CaseTemplateRuleValueManager(models.Manager):
38
36
  def get_by_natural_key(self, name):
@@ -68,7 +66,7 @@ class CaseTemplateRuleValue(models.Model):
68
66
  """
69
67
  String representation of the object.
70
68
  """
71
- return self.name
69
+ return str(self.name)
72
70
 
73
71
  def get_value(self):
74
72
  """
@@ -15,8 +15,6 @@ class CaseTemplateType(models.Model):
15
15
 
16
16
  """
17
17
  name = models.CharField(max_length=255)
18
- name_de = models.CharField(max_length=255, null=True)
19
- name_en = models.CharField(max_length=255, null=True)
20
18
  description = models.TextField(blank=True, null=True)
21
19
 
22
20
  objects = CaseTemplateTypeManager()
@@ -25,4 +23,4 @@ class CaseTemplateType(models.Model):
25
23
  return (self.name,)
26
24
 
27
25
  def __str__(self):
28
- return self.name
26
+ return str(self.name)
@@ -2,10 +2,12 @@ from .center import Center
2
2
  from .center_product import CenterProduct
3
3
  from .center_resource import CenterResource
4
4
  from .center_waste import CenterWaste
5
+ from .center_shift import CenterShift
5
6
 
6
7
  __all__ = [
7
8
  'Center',
8
9
  'CenterProduct',
9
10
  'CenterResource',
10
- 'CenterWaste'
11
+ 'CenterWaste',
12
+ 'CenterShift',
11
13
  ]
@@ -0,0 +1,61 @@
1
+ from django.db import models
2
+ from typing import TYPE_CHECKING
3
+
4
+ if TYPE_CHECKING:
5
+ from ...medical import Endoscope, EndoscopyProcessor
6
+ from ...administration import (
7
+ CenterProduct,
8
+ CenterWaste, CenterResource
9
+ )
10
+ from ...media import AnonymExaminationReport, AnonymHistologyReport
11
+
12
+ class CenterManager(models.Manager):
13
+ def get_by_natural_key(self, name) -> "Center":
14
+ return self.get(name=name)
15
+
16
+
17
+ class Center(models.Model):
18
+ objects = CenterManager()
19
+
20
+ # import_id = models.IntegerField(primary_key=True)
21
+ name = models.CharField(max_length=255)
22
+
23
+ first_names = models.ManyToManyField(
24
+ to="FirstName",
25
+ related_name="centers",
26
+ )
27
+ last_names = models.ManyToManyField("LastName", related_name="centers")
28
+
29
+ if TYPE_CHECKING:
30
+ # first_names: RelatedManager["FirstName"]
31
+ # last_names: RelatedManager["LastName"]
32
+ center_products: models.QuerySet["CenterProduct"]
33
+ center_resources: models.QuerySet["CenterResource"]
34
+ center_wastes: models.QuerySet["CenterWaste"]
35
+ endoscopy_processors: models.QuerySet["EndoscopyProcessor"]
36
+ endoscopes: models.QuerySet["Endoscope"]
37
+ anonymexaminationreport_set: models.QuerySet["AnonymExaminationReport"]
38
+ anonymhistologyreport_set: models.QuerySet["AnonymHistologyReport"]
39
+
40
+
41
+ @classmethod
42
+ def get_by_name(cls, name):
43
+ return cls.objects.get(name=name)
44
+
45
+ def natural_key(self) -> tuple[str]:
46
+ return (self.name,)
47
+
48
+ def __str__(self) -> str:
49
+ return str(object=self.name)
50
+
51
+ def get_first_names(self):
52
+ return self.first_names.all()
53
+
54
+ def get_last_names(self):
55
+ return self.last_names.all()
56
+
57
+ def get_endoscopes(self):
58
+ """
59
+ Returns all Endoscope instances associated with this center.
60
+ """
61
+ return self.endoscopes.all()