endoreg-db 0.4.5__py3-none-any.whl → 0.8.6.3__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.
Files changed (846) hide show
  1. endoreg_db/admin.py +90 -1
  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 +76 -4
  9. endoreg_db/data/ai_model/data.yaml +7 -0
  10. endoreg_db/data/{label → ai_model_label}/label/data.yaml +27 -1
  11. endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
  12. endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
  13. endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
  14. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
  15. endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
  16. endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
  17. endoreg_db/data/center/data.yaml +40 -9
  18. endoreg_db/data/center_shift/ukw.yaml +9 -0
  19. endoreg_db/data/contraindication/bleeding.yaml +11 -0
  20. endoreg_db/data/db_summary.csv +58 -0
  21. endoreg_db/data/db_summary.xlsx +0 -0
  22. endoreg_db/data/disease/misc.yaml +1 -2
  23. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +2 -2
  24. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
  25. endoreg_db/data/distribution/numeric/data.yaml +14 -0
  26. endoreg_db/data/endoscope/data.yaml +93 -0
  27. endoreg_db/data/endoscopy_processor/data.yaml +3 -0
  28. endoreg_db/data/event/cardiology.yaml +0 -13
  29. endoreg_db/data/examination/examinations/data.yaml +34 -28
  30. endoreg_db/data/examination/type/data.yaml +12 -0
  31. endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
  32. endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
  33. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
  34. endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
  35. endoreg_db/data/finding/anatomy_colon.yaml +128 -0
  36. endoreg_db/data/finding/colonoscopy.yaml +40 -0
  37. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
  38. endoreg_db/data/finding/complication.yaml +16 -0
  39. endoreg_db/data/finding/data.yaml +105 -0
  40. endoreg_db/data/finding/examination_setting.yaml +16 -0
  41. endoreg_db/data/finding/medication_related.yaml +18 -0
  42. endoreg_db/data/finding/outcome.yaml +12 -0
  43. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
  44. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
  45. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
  46. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  47. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  48. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  49. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  50. endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
  51. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
  52. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
  53. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
  54. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
  55. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
  56. endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
  57. endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
  58. endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
  59. endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
  60. endoreg_db/data/finding_classification/medication_related.yaml +23 -0
  61. endoreg_db/data/finding_classification/visualized.yaml +33 -0
  62. endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
  63. endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
  64. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  65. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  66. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  67. endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
  68. endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
  69. endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
  70. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  71. endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
  72. endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
  73. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  74. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
  75. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  76. endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
  77. endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  78. endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
  79. endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
  80. endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
  81. endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
  82. endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
  83. endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
  84. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
  85. endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
  86. endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
  87. endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
  88. endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
  89. endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
  90. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
  91. endoreg_db/data/finding_type/data.yaml +43 -0
  92. endoreg_db/data/gender/data.yaml +24 -0
  93. endoreg_db/data/information_source/annotation.yaml +6 -0
  94. endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
  95. endoreg_db/data/information_source/prediction.yaml +7 -0
  96. endoreg_db/data/information_source_type/data.yaml +8 -0
  97. endoreg_db/data/lab_value/cardiac_enzymes.yaml +7 -1
  98. endoreg_db/data/lab_value/coagulation.yaml +6 -1
  99. endoreg_db/data/lab_value/electrolytes.yaml +39 -1
  100. endoreg_db/data/lab_value/gastrointestinal_function.yaml +12 -0
  101. endoreg_db/data/lab_value/hematology.yaml +17 -2
  102. endoreg_db/data/lab_value/hormones.yaml +6 -0
  103. endoreg_db/data/lab_value/lipids.yaml +12 -3
  104. endoreg_db/data/lab_value/misc.yaml +48 -2
  105. endoreg_db/data/lab_value/renal_function.yaml +2 -1
  106. endoreg_db/data/lx_client_tag/base.yaml +54 -0
  107. endoreg_db/data/lx_client_type/base.yaml +30 -0
  108. endoreg_db/data/lx_permission/base.yaml +24 -0
  109. endoreg_db/data/lx_permission/endoreg.yaml +52 -0
  110. endoreg_db/data/medication/anticoagulation.yaml +5 -5
  111. endoreg_db/data/medication/tah.yaml +5 -5
  112. endoreg_db/data/medication_indication/anticoagulation.yaml +48 -53
  113. endoreg_db/data/medication_intake_time/base.yaml +4 -4
  114. endoreg_db/data/names_first/first_names.yaml +54 -0
  115. endoreg_db/data/names_last/last_names.yaml +51 -0
  116. endoreg_db/data/network_device/data.yaml +30 -0
  117. endoreg_db/data/organ/data.yaml +29 -0
  118. endoreg_db/data/pdf_type/data.yaml +27 -9
  119. endoreg_db/data/qualification/endoscopy.yaml +36 -0
  120. endoreg_db/data/qualification/m2.yaml +39 -0
  121. endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
  122. endoreg_db/data/qualification/sonography.yaml +36 -0
  123. endoreg_db/data/qualification_type/base.yaml +29 -0
  124. endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
  125. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +4 -0
  126. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
  127. endoreg_db/data/requirement/age.yaml +26 -0
  128. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
  129. endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
  130. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
  131. endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
  132. endoreg_db/data/requirement/disease_misc.yaml +12 -0
  133. endoreg_db/data/requirement/disease_renal.yaml +96 -0
  134. endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
  135. endoreg_db/data/requirement/event_cardiology.yaml +251 -0
  136. endoreg_db/data/requirement/event_requirements.yaml +145 -0
  137. endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
  138. endoreg_db/data/requirement/gender.yaml +25 -0
  139. endoreg_db/data/requirement/lab_value.yaml +441 -0
  140. endoreg_db/data/requirement/medication.yaml +93 -0
  141. endoreg_db/data/requirement_operator/age.yaml +13 -0
  142. endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
  143. endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
  144. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
  145. endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  146. endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
  147. endoreg_db/data/requirement_set_type/data.yaml +20 -0
  148. endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
  149. endoreg_db/data/risk/bleeding.yaml +26 -0
  150. endoreg_db/data/risk/thrombosis.yaml +37 -0
  151. endoreg_db/data/risk_type/data.yaml +27 -0
  152. endoreg_db/data/setup_config.yaml +38 -0
  153. endoreg_db/data/shift/endoscopy.yaml +21 -0
  154. endoreg_db/data/shift_type/base.yaml +35 -0
  155. endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
  156. endoreg_db/data/unit/concentration.yaml +23 -0
  157. endoreg_db/data/unit/time.yaml +36 -1
  158. endoreg_db/exceptions.py +19 -0
  159. endoreg_db/forms/__init__.py +3 -1
  160. endoreg_db/forms/examination_form.py +11 -0
  161. endoreg_db/forms/patient_finding_intervention_form.py +18 -0
  162. endoreg_db/forms/patient_form.py +27 -0
  163. endoreg_db/forms/questionnaires/__init__.py +1 -1
  164. endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
  165. endoreg_db/helpers/count_db.py +45 -0
  166. endoreg_db/helpers/data_loader.py +208 -0
  167. endoreg_db/helpers/default_objects.py +378 -0
  168. endoreg_db/helpers/download_segmentation_model.py +31 -0
  169. endoreg_db/helpers/interact.py +6 -0
  170. endoreg_db/helpers/test_video_helper.py +119 -0
  171. endoreg_db/logger_conf.py +140 -0
  172. endoreg_db/management/__init__.py +1 -0
  173. endoreg_db/management/commands/__init__.py +1 -0
  174. endoreg_db/management/commands/anonymize_video.py +0 -0
  175. endoreg_db/management/commands/check_auth.py +125 -0
  176. endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
  177. endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
  178. endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
  179. endoreg_db/management/commands/fix_video_paths.py +165 -0
  180. endoreg_db/management/commands/import_fallback_video.py +203 -0
  181. endoreg_db/management/commands/import_report.py +298 -0
  182. endoreg_db/management/commands/import_video.py +423 -0
  183. endoreg_db/management/commands/import_video_with_classification.py +367 -0
  184. endoreg_db/management/commands/init_default_ai_model.py +112 -0
  185. endoreg_db/management/commands/load_ai_model_data.py +58 -26
  186. endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
  187. endoreg_db/management/commands/load_base_db_data.py +174 -118
  188. endoreg_db/management/commands/load_center_data.py +46 -21
  189. endoreg_db/management/commands/{load_logging_data.py → load_contraindication_data.py} +4 -2
  190. endoreg_db/management/commands/load_disease_data.py +29 -7
  191. endoreg_db/management/commands/{load_endoscope_type_data.py → load_endoscope_data.py} +30 -7
  192. endoreg_db/management/commands/load_examination_indication_data.py +86 -0
  193. endoreg_db/management/commands/load_finding_data.py +128 -0
  194. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
  195. endoreg_db/management/commands/load_information_source.py +13 -7
  196. endoreg_db/management/commands/load_lab_value_data.py +3 -3
  197. endoreg_db/management/commands/load_medication_data.py +83 -21
  198. endoreg_db/management/commands/load_name_data.py +37 -0
  199. endoreg_db/management/commands/{load_medication_intake_time_data.py → load_organ_data.py} +7 -5
  200. endoreg_db/management/commands/load_qualification_data.py +59 -0
  201. endoreg_db/management/commands/load_requirement_data.py +180 -0
  202. endoreg_db/management/commands/load_risk_data.py +56 -0
  203. endoreg_db/management/commands/load_shift_data.py +60 -0
  204. endoreg_db/management/commands/load_tag_data.py +57 -0
  205. endoreg_db/management/commands/register_ai_model.py +1 -1
  206. endoreg_db/management/commands/setup_endoreg_db.py +381 -0
  207. endoreg_db/management/commands/start_filewatcher.py +106 -0
  208. endoreg_db/management/commands/storage_management.py +548 -0
  209. endoreg_db/management/commands/summarize_db_content.py +189 -0
  210. endoreg_db/management/commands/validate_video.py +204 -0
  211. endoreg_db/management/commands/validate_video_files.py +161 -0
  212. endoreg_db/management/commands/video_validation.py +22 -0
  213. endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
  214. endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
  215. endoreg_db/mermaid/binary_classification_annotation.md +50 -0
  216. endoreg_db/mermaid/classification.md +8 -0
  217. endoreg_db/mermaid/examination.md +8 -0
  218. endoreg_db/mermaid/findings.md +7 -0
  219. endoreg_db/mermaid/image_classification.md +28 -0
  220. endoreg_db/mermaid/interventions.md +8 -0
  221. endoreg_db/mermaid/morphology.md +8 -0
  222. endoreg_db/mermaid/patient_creation.md +14 -0
  223. endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
  224. endoreg_db/migrations/0001_initial.py +1234 -944
  225. endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
  226. endoreg_db/migrations/0003_add_center_display_name.py +30 -0
  227. endoreg_db/models/__init__.py +339 -53
  228. endoreg_db/models/administration/__init__.py +116 -0
  229. endoreg_db/models/administration/ai/__init__.py +9 -0
  230. endoreg_db/models/administration/ai/active_model.py +35 -0
  231. endoreg_db/models/administration/ai/ai_model.py +156 -0
  232. endoreg_db/models/{ai_model → administration/ai}/model_type.py +19 -4
  233. endoreg_db/models/administration/case/__init__.py +19 -0
  234. endoreg_db/models/administration/case/case.py +114 -0
  235. endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +10 -1
  236. endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +60 -16
  237. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +6 -13
  238. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +21 -8
  239. endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
  240. endoreg_db/models/{center → administration/center}/__init__.py +9 -0
  241. endoreg_db/models/administration/center/center.py +67 -0
  242. endoreg_db/models/administration/center/center_product.py +64 -0
  243. endoreg_db/models/administration/center/center_resource.py +49 -0
  244. endoreg_db/models/administration/center/center_shift.py +88 -0
  245. endoreg_db/models/administration/center/center_waste.py +30 -0
  246. endoreg_db/models/administration/permissions/__init__.py +44 -0
  247. endoreg_db/models/administration/person/__init__.py +24 -0
  248. endoreg_db/models/administration/person/employee/__init__.py +3 -0
  249. endoreg_db/models/administration/person/employee/employee.py +35 -0
  250. endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
  251. endoreg_db/models/administration/person/employee/employee_type.py +42 -0
  252. endoreg_db/models/administration/person/examiner/__init__.py +4 -0
  253. endoreg_db/models/administration/person/examiner/examiner.py +54 -0
  254. endoreg_db/models/administration/person/names/__init__.py +0 -0
  255. endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
  256. endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
  257. endoreg_db/models/administration/person/patient/__init__.py +5 -0
  258. endoreg_db/models/administration/person/patient/patient.py +460 -0
  259. endoreg_db/models/administration/person/profession/__init__.py +24 -0
  260. endoreg_db/models/administration/person/user/__init__.py +5 -0
  261. endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
  262. endoreg_db/models/administration/product/__init__.py +14 -0
  263. endoreg_db/models/administration/product/product.py +97 -0
  264. endoreg_db/models/administration/product/product_group.py +39 -0
  265. endoreg_db/models/administration/product/product_material.py +54 -0
  266. endoreg_db/models/{product → administration/product}/product_weight.py +21 -0
  267. endoreg_db/models/{product → administration/product}/reference_product.py +44 -13
  268. endoreg_db/models/administration/qualification/__init__.py +7 -0
  269. endoreg_db/models/administration/qualification/qualification.py +37 -0
  270. endoreg_db/models/administration/qualification/qualification_type.py +35 -0
  271. endoreg_db/models/administration/shift/__init__.py +9 -0
  272. endoreg_db/models/administration/shift/scheduled_days.py +69 -0
  273. endoreg_db/models/administration/shift/shift.py +51 -0
  274. endoreg_db/models/administration/shift/shift_type.py +108 -0
  275. endoreg_db/models/label/__init__.py +24 -1
  276. endoreg_db/models/label/annotation/__init__.py +12 -0
  277. endoreg_db/models/label/annotation/image_classification.py +84 -0
  278. endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
  279. endoreg_db/models/label/label.py +53 -54
  280. endoreg_db/models/label/label_set.py +53 -0
  281. endoreg_db/models/label/label_type.py +29 -0
  282. endoreg_db/models/label/label_video_segment/__init__.py +3 -0
  283. endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
  284. endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
  285. endoreg_db/models/label/video_segmentation_label.py +31 -0
  286. endoreg_db/models/label/video_segmentation_labelset.py +27 -0
  287. endoreg_db/models/media/__init__.py +16 -0
  288. endoreg_db/models/media/frame/__init__.py +3 -0
  289. endoreg_db/models/media/frame/frame.py +111 -0
  290. endoreg_db/models/media/pdf/__init__.py +11 -0
  291. endoreg_db/models/media/pdf/raw_pdf.py +757 -0
  292. endoreg_db/models/media/pdf/report_file.py +162 -0
  293. endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
  294. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
  295. endoreg_db/models/media/video/__init__.py +8 -0
  296. endoreg_db/models/media/video/create_from_file.py +358 -0
  297. endoreg_db/models/media/video/pipe_1.py +213 -0
  298. endoreg_db/models/media/video/pipe_2.py +105 -0
  299. endoreg_db/models/media/video/refactor_plan.md +0 -0
  300. endoreg_db/models/media/video/video_file.py +825 -0
  301. endoreg_db/models/media/video/video_file_ai.py +443 -0
  302. endoreg_db/models/media/video/video_file_anonymize.py +349 -0
  303. endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
  304. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
  305. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
  306. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
  307. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
  308. endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
  309. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
  310. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
  311. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
  312. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
  313. endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
  314. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
  315. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
  316. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
  317. endoreg_db/models/media/video/video_file_frames.py +0 -0
  318. endoreg_db/models/media/video/video_file_io.py +168 -0
  319. endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
  320. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
  321. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
  322. endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
  323. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
  324. endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
  325. endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
  326. endoreg_db/models/media/video/video_file_segments.py +209 -0
  327. endoreg_db/models/media/video/video_metadata.py +65 -0
  328. endoreg_db/models/media/video/video_processing.py +152 -0
  329. endoreg_db/models/medical/__init__.py +146 -0
  330. endoreg_db/models/medical/contraindication/__init__.py +17 -0
  331. endoreg_db/models/medical/disease.py +156 -0
  332. endoreg_db/models/medical/event.py +137 -0
  333. endoreg_db/models/medical/examination/__init__.py +9 -0
  334. endoreg_db/models/medical/examination/examination.py +148 -0
  335. endoreg_db/models/medical/examination/examination_indication.py +278 -0
  336. endoreg_db/models/medical/examination/examination_time.py +49 -0
  337. endoreg_db/models/medical/examination/examination_time_type.py +41 -0
  338. endoreg_db/models/medical/examination/examination_type.py +48 -0
  339. endoreg_db/models/medical/finding/__init__.py +18 -0
  340. endoreg_db/models/medical/finding/finding.py +96 -0
  341. endoreg_db/models/medical/finding/finding_classification.py +142 -0
  342. endoreg_db/models/medical/finding/finding_intervention.py +52 -0
  343. endoreg_db/models/medical/finding/finding_type.py +35 -0
  344. endoreg_db/models/medical/hardware/__init__.py +8 -0
  345. endoreg_db/models/medical/hardware/endoscope.py +65 -0
  346. endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +68 -29
  347. endoreg_db/models/medical/laboratory/__init__.py +5 -0
  348. endoreg_db/models/medical/laboratory/lab_value.py +419 -0
  349. endoreg_db/models/medical/medication/__init__.py +19 -0
  350. endoreg_db/models/medical/medication/medication.py +31 -0
  351. endoreg_db/models/medical/medication/medication_indication.py +50 -0
  352. endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
  353. endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
  354. endoreg_db/models/medical/medication/medication_schedule.py +45 -0
  355. endoreg_db/models/medical/organ/__init__.py +35 -0
  356. endoreg_db/models/medical/patient/__init__.py +56 -0
  357. endoreg_db/models/medical/patient/medication_examples.py +38 -0
  358. endoreg_db/models/medical/patient/patient_disease.py +63 -0
  359. endoreg_db/models/medical/patient/patient_event.py +75 -0
  360. endoreg_db/models/medical/patient/patient_examination.py +249 -0
  361. endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
  362. endoreg_db/models/medical/patient/patient_finding.py +357 -0
  363. endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
  364. endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
  365. endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
  366. endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +68 -22
  367. endoreg_db/models/medical/patient/patient_medication.py +104 -0
  368. endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
  369. endoreg_db/models/medical/risk/__init__.py +7 -0
  370. endoreg_db/models/medical/risk/risk.py +72 -0
  371. endoreg_db/models/medical/risk/risk_type.py +51 -0
  372. endoreg_db/models/metadata/__init__.py +19 -0
  373. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  374. endoreg_db/models/metadata/model_meta.py +206 -0
  375. endoreg_db/models/metadata/model_meta_logic.py +343 -0
  376. endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +32 -13
  377. endoreg_db/models/metadata/sensitive_meta.py +288 -0
  378. endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
  379. endoreg_db/models/metadata/video_meta.py +332 -0
  380. endoreg_db/models/metadata/video_prediction_logic.py +190 -0
  381. endoreg_db/models/metadata/video_prediction_meta.py +270 -0
  382. endoreg_db/models/other/__init__.py +36 -1
  383. endoreg_db/models/other/distribution/__init__.py +44 -0
  384. endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
  385. endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
  386. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
  387. endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
  388. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
  389. endoreg_db/models/other/emission/__init__.py +5 -0
  390. endoreg_db/models/other/emission/emission_factor.py +94 -0
  391. endoreg_db/models/{persons → other}/gender.py +8 -3
  392. endoreg_db/models/other/information_source.py +159 -0
  393. endoreg_db/models/other/material.py +14 -2
  394. endoreg_db/models/other/resource.py +6 -2
  395. endoreg_db/models/other/tag.py +27 -0
  396. endoreg_db/models/other/transport_route.py +15 -3
  397. endoreg_db/models/{unit.py → other/unit.py} +16 -6
  398. endoreg_db/models/other/waste.py +10 -3
  399. endoreg_db/models/requirement/__init__.py +11 -0
  400. endoreg_db/models/requirement/requirement.py +767 -0
  401. endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
  402. endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
  403. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
  404. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
  405. endoreg_db/models/requirement/requirement_operator.py +176 -0
  406. endoreg_db/models/requirement/requirement_set.py +287 -0
  407. endoreg_db/models/rule/__init__.py +13 -0
  408. endoreg_db/models/{rules → rule}/rule.py +6 -3
  409. endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
  410. endoreg_db/models/{rules → rule}/rule_type.py +0 -2
  411. endoreg_db/models/{rules → rule}/ruleset.py +0 -2
  412. endoreg_db/models/state/__init__.py +12 -0
  413. endoreg_db/models/state/abstract.py +11 -0
  414. endoreg_db/models/state/audit_ledger.py +150 -0
  415. endoreg_db/models/state/label_video_segment.py +22 -0
  416. endoreg_db/models/state/raw_pdf.py +187 -0
  417. endoreg_db/models/state/sensitive_meta.py +46 -0
  418. endoreg_db/models/state/video.py +232 -0
  419. endoreg_db/models/upload_job.py +99 -0
  420. endoreg_db/models/utils.py +135 -0
  421. endoreg_db/renames.yml +8 -0
  422. endoreg_db/root_urls.py +9 -0
  423. endoreg_db/schemas/__init__.py +0 -0
  424. endoreg_db/schemas/examination_evaluation.py +27 -0
  425. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
  426. endoreg_db/serializers/__init__.py +118 -10
  427. endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
  428. endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
  429. endoreg_db/serializers/_old/video.py +71 -0
  430. endoreg_db/serializers/administration/__init__.py +14 -0
  431. endoreg_db/serializers/administration/ai/__init__.py +10 -0
  432. endoreg_db/serializers/administration/ai/active_model.py +10 -0
  433. endoreg_db/serializers/administration/ai/ai_model.py +18 -0
  434. endoreg_db/serializers/administration/ai/model_type.py +10 -0
  435. endoreg_db/serializers/administration/center.py +9 -0
  436. endoreg_db/serializers/administration/gender.py +9 -0
  437. endoreg_db/serializers/anonymization.py +69 -0
  438. endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
  439. endoreg_db/serializers/examination/__init__.py +10 -0
  440. endoreg_db/serializers/examination/base.py +46 -0
  441. endoreg_db/serializers/examination/dropdown.py +21 -0
  442. endoreg_db/serializers/examination_serializer.py +12 -0
  443. endoreg_db/serializers/finding/__init__.py +5 -0
  444. endoreg_db/serializers/finding/finding.py +54 -0
  445. endoreg_db/serializers/finding_classification/__init__.py +7 -0
  446. endoreg_db/serializers/finding_classification/choice.py +19 -0
  447. endoreg_db/serializers/finding_classification/classification.py +13 -0
  448. endoreg_db/serializers/label/__init__.py +7 -0
  449. endoreg_db/serializers/label/image_classification_annotation.py +62 -0
  450. endoreg_db/serializers/label/label.py +15 -0
  451. endoreg_db/serializers/label_video_segment/__init__.py +7 -0
  452. endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
  453. endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
  454. endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
  455. endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
  456. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
  457. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
  458. endoreg_db/serializers/meta/__init__.py +19 -0
  459. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
  460. endoreg_db/serializers/meta/report_meta.py +53 -0
  461. endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
  462. endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
  463. endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
  464. endoreg_db/serializers/meta/video_meta.py +39 -0
  465. endoreg_db/serializers/misc/__init__.py +14 -0
  466. endoreg_db/serializers/misc/file_overview.py +182 -0
  467. endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
  468. endoreg_db/serializers/misc/stats.py +33 -0
  469. endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
  470. endoreg_db/serializers/misc/upload_job.py +71 -0
  471. endoreg_db/serializers/patient/__init__.py +11 -0
  472. endoreg_db/serializers/patient/patient.py +86 -0
  473. endoreg_db/serializers/patient/patient_dropdown.py +27 -0
  474. endoreg_db/serializers/patient_examination/__init__.py +7 -0
  475. endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
  476. endoreg_db/serializers/patient_finding/__init__.py +15 -0
  477. endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
  478. endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
  479. endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
  480. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
  481. endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
  482. endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
  483. endoreg_db/serializers/pdf/__init__.py +5 -0
  484. endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
  485. endoreg_db/serializers/report/__init__.py +9 -0
  486. endoreg_db/serializers/report/mixins.py +45 -0
  487. endoreg_db/serializers/report/report.py +105 -0
  488. endoreg_db/serializers/report/report_list.py +22 -0
  489. endoreg_db/serializers/report/secure_file_url.py +26 -0
  490. endoreg_db/serializers/requirements/requirement_schema.py +25 -0
  491. endoreg_db/serializers/requirements/requirement_sets.py +29 -0
  492. endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
  493. endoreg_db/serializers/video/__init__.py +7 -0
  494. endoreg_db/serializers/video/segmentation.py +263 -0
  495. endoreg_db/serializers/video/video_file_brief.py +10 -0
  496. endoreg_db/serializers/video/video_file_detail.py +83 -0
  497. endoreg_db/serializers/video/video_file_list.py +67 -0
  498. endoreg_db/serializers/video/video_metadata.py +105 -0
  499. endoreg_db/serializers/video/video_processing_history.py +153 -0
  500. endoreg_db/serializers/video_examination.py +198 -0
  501. endoreg_db/services/__init__.py +5 -0
  502. endoreg_db/services/anonymization.py +223 -0
  503. endoreg_db/services/examination_evaluation.py +149 -0
  504. endoreg_db/services/finding_description_service.py +0 -0
  505. endoreg_db/services/lookup_service.py +411 -0
  506. endoreg_db/services/lookup_store.py +266 -0
  507. endoreg_db/services/pdf_import.py +1382 -0
  508. endoreg_db/services/polling_coordinator.py +288 -0
  509. endoreg_db/services/pseudonym_service.py +89 -0
  510. endoreg_db/services/requirements_object.py +147 -0
  511. endoreg_db/services/segment_sync.py +155 -0
  512. endoreg_db/services/storage_aware_video_processor.py +344 -0
  513. endoreg_db/services/video_import.py +1259 -0
  514. endoreg_db/tasks/upload_tasks.py +207 -0
  515. endoreg_db/tasks/video_ingest.py +157 -0
  516. endoreg_db/tasks/video_processing_tasks.py +327 -0
  517. endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
  518. endoreg_db/templates/admin/start_examination.html +12 -0
  519. endoreg_db/templates/timeline.html +176 -0
  520. endoreg_db/urls/__init__.py +83 -0
  521. endoreg_db/urls/anonymization.py +32 -0
  522. endoreg_db/urls/auth.py +16 -0
  523. endoreg_db/urls/classification.py +39 -0
  524. endoreg_db/urls/examination.py +54 -0
  525. endoreg_db/urls/files.py +6 -0
  526. endoreg_db/urls/label_video_segment_validate.py +33 -0
  527. endoreg_db/urls/label_video_segments.py +46 -0
  528. endoreg_db/urls/media.py +227 -0
  529. endoreg_db/urls/patient.py +19 -0
  530. endoreg_db/urls/report.py +48 -0
  531. endoreg_db/urls/requirements.py +13 -0
  532. endoreg_db/urls/sensitive_meta.py +0 -0
  533. endoreg_db/urls/stats.py +46 -0
  534. endoreg_db/urls/upload.py +20 -0
  535. endoreg_db/urls/video.py +61 -0
  536. endoreg_db/urls.py +9 -0
  537. endoreg_db/utils/__init__.py +88 -1
  538. endoreg_db/utils/ai/__init__.py +9 -0
  539. endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
  540. endoreg_db/utils/ai/inference_dataset.py +52 -0
  541. endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
  542. endoreg_db/utils/ai/postprocess.py +63 -0
  543. endoreg_db/utils/ai/predict.py +291 -0
  544. endoreg_db/utils/ai/preprocess.py +68 -0
  545. endoreg_db/utils/calc_duration_seconds.py +24 -0
  546. endoreg_db/utils/case_generator/__init__.py +0 -0
  547. endoreg_db/utils/case_generator/case_generator.py +159 -0
  548. endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
  549. endoreg_db/utils/case_generator/utils.py +30 -0
  550. endoreg_db/utils/check_video_files.py +148 -0
  551. endoreg_db/utils/dataloader.py +118 -35
  552. endoreg_db/utils/dates.py +60 -0
  553. endoreg_db/utils/env.py +33 -0
  554. endoreg_db/utils/extract_specific_frames.py +72 -0
  555. endoreg_db/utils/file_operations.py +29 -1
  556. endoreg_db/utils/fix_video_path_direct.py +141 -0
  557. endoreg_db/utils/frame_anonymization_utils.py +463 -0
  558. endoreg_db/utils/hashs.py +123 -4
  559. endoreg_db/utils/links/__init__.py +0 -0
  560. endoreg_db/utils/links/requirement_link.py +193 -0
  561. endoreg_db/utils/mime_types.py +0 -0
  562. endoreg_db/utils/names.py +76 -0
  563. endoreg_db/utils/parse_and_generate_yaml.py +46 -0
  564. endoreg_db/utils/paths.py +95 -0
  565. endoreg_db/utils/permissions.py +143 -0
  566. endoreg_db/utils/pipelines/Readme.md +235 -0
  567. endoreg_db/utils/pipelines/__init__.py +0 -0
  568. endoreg_db/utils/pipelines/process_video_dir.py +120 -0
  569. endoreg_db/utils/product/__init__.py +0 -0
  570. endoreg_db/utils/product/sum_emissions.py +20 -0
  571. endoreg_db/utils/product/sum_weights.py +18 -0
  572. endoreg_db/utils/pydantic_models/__init__.py +6 -0
  573. endoreg_db/utils/pydantic_models/db_config.py +57 -0
  574. endoreg_db/utils/requirement_helpers.py +0 -0
  575. endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
  576. endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
  577. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
  578. endoreg_db/utils/setup_config.py +177 -0
  579. endoreg_db/utils/translation.py +27 -0
  580. endoreg_db/utils/validate_endo_roi.py +19 -0
  581. endoreg_db/utils/validate_subcategory_dict.py +91 -0
  582. endoreg_db/utils/validate_video_detailed.py +357 -0
  583. endoreg_db/utils/video/__init__.py +26 -0
  584. endoreg_db/utils/video/extract_frames.py +88 -0
  585. endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
  586. endoreg_db/utils/video/names.py +42 -0
  587. endoreg_db/utils/video/streaming_processor.py +312 -0
  588. endoreg_db/utils/video/video_splitter.py +94 -0
  589. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
  590. endoreg_db/views/__init__.py +274 -0
  591. endoreg_db/views/anonymization/__init__.py +27 -0
  592. endoreg_db/views/anonymization/media_management.py +454 -0
  593. endoreg_db/views/anonymization/overview.py +216 -0
  594. endoreg_db/views/anonymization/validate.py +107 -0
  595. endoreg_db/views/auth/__init__.py +13 -0
  596. endoreg_db/views/auth/keycloak.py +113 -0
  597. endoreg_db/views/examination/__init__.py +33 -0
  598. endoreg_db/views/examination/examination.py +37 -0
  599. endoreg_db/views/examination/examination_manifest_cache.py +26 -0
  600. endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
  601. endoreg_db/views/examination/get_finding_classifications.py +36 -0
  602. endoreg_db/views/examination/get_findings.py +41 -0
  603. endoreg_db/views/examination/get_instruments.py +18 -0
  604. endoreg_db/views/examination/get_interventions.py +14 -0
  605. endoreg_db/views/finding/__init__.py +9 -0
  606. endoreg_db/views/finding/finding.py +112 -0
  607. endoreg_db/views/finding/get_classifications.py +14 -0
  608. endoreg_db/views/finding/get_interventions.py +17 -0
  609. endoreg_db/views/finding_classification/__init__.py +13 -0
  610. endoreg_db/views/finding_classification/base.py +0 -0
  611. endoreg_db/views/finding_classification/finding_classification.py +42 -0
  612. endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
  613. endoreg_db/views/label/__init__.py +5 -0
  614. endoreg_db/views/label/label.py +15 -0
  615. endoreg_db/views/label_video_segment/__init__.py +16 -0
  616. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
  617. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
  618. endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
  619. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
  620. endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
  621. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
  622. endoreg_db/views/label_video_segment/validate.py +226 -0
  623. endoreg_db/views/media/__init__.py +45 -0
  624. endoreg_db/views/media/pdf_media.py +388 -0
  625. endoreg_db/views/media/segments.py +71 -0
  626. endoreg_db/views/media/sensitive_metadata.py +314 -0
  627. endoreg_db/views/media/video_media.py +272 -0
  628. endoreg_db/views/media/video_segments.py +524 -0
  629. endoreg_db/views/meta/__init__.py +15 -0
  630. endoreg_db/views/meta/available_files_list.py +146 -0
  631. endoreg_db/views/meta/report_meta.py +53 -0
  632. endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
  633. endoreg_db/views/meta/sensitive_meta_list.py +104 -0
  634. endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
  635. endoreg_db/views/misc/__init__.py +63 -0
  636. endoreg_db/views/misc/center.py +13 -0
  637. endoreg_db/views/misc/csrf.py +7 -0
  638. endoreg_db/views/misc/gender.py +14 -0
  639. endoreg_db/views/misc/secure_file_serving_view.py +80 -0
  640. endoreg_db/views/misc/secure_file_url_view.py +84 -0
  641. endoreg_db/views/misc/secure_url_validate.py +79 -0
  642. endoreg_db/views/misc/stats.py +220 -0
  643. endoreg_db/views/misc/translation.py +182 -0
  644. endoreg_db/views/misc/upload_views.py +240 -0
  645. endoreg_db/views/patient/__init__.py +5 -0
  646. endoreg_db/views/patient/patient.py +210 -0
  647. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
  648. endoreg_db/views/patient_examination/__init__.py +11 -0
  649. endoreg_db/views/patient_examination/patient_examination.py +140 -0
  650. endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
  651. endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
  652. endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
  653. endoreg_db/views/patient_examination/video.py +194 -0
  654. endoreg_db/views/patient_finding/__init__.py +7 -0
  655. endoreg_db/views/patient_finding/base.py +0 -0
  656. endoreg_db/views/patient_finding/patient_finding.py +64 -0
  657. endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
  658. endoreg_db/views/patient_finding_classification/__init__.py +5 -0
  659. endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
  660. endoreg_db/views/patient_finding_location/__init__.py +5 -0
  661. endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
  662. endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
  663. endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
  664. endoreg_db/views/pdf/__init__.py +8 -0
  665. endoreg_db/views/pdf/pdf_stream.py +187 -0
  666. endoreg_db/views/pdf/reimport.py +177 -0
  667. endoreg_db/views/report/__init__.py +9 -0
  668. endoreg_db/views/report/report_list.py +112 -0
  669. endoreg_db/views/report/report_with_secure_url.py +28 -0
  670. endoreg_db/views/report/start_examination.py +7 -0
  671. endoreg_db/views/requirement/__init__.py +10 -0
  672. endoreg_db/views/requirement/evaluate.py +279 -0
  673. endoreg_db/views/requirement/lookup.py +367 -0
  674. endoreg_db/views/requirement/lookup_store.py +252 -0
  675. endoreg_db/views/requirement_lookup/lookup.py +0 -0
  676. endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
  677. endoreg_db/views/stats/__init__.py +13 -0
  678. endoreg_db/views/stats/stats_views.py +229 -0
  679. endoreg_db/views/video/__init__.py +59 -0
  680. endoreg_db/views/video/correction.py +530 -0
  681. endoreg_db/views/video/reimport.py +195 -0
  682. endoreg_db/views/video/segmentation.py +274 -0
  683. endoreg_db/views/video/task_status.py +49 -0
  684. endoreg_db/views/video/timeline.py +46 -0
  685. endoreg_db/views/video/video_analyze.py +52 -0
  686. endoreg_db/views/video/video_apply_mask.py +48 -0
  687. endoreg_db/views/video/video_correction.py +21 -0
  688. endoreg_db/views/video/video_download_processed.py +58 -0
  689. endoreg_db/views/video/video_examination_viewset.py +242 -0
  690. endoreg_db/views/video/video_meta.py +29 -0
  691. endoreg_db/views/video/video_processing_history.py +24 -0
  692. endoreg_db/views/video/video_remove_frames.py +48 -0
  693. endoreg_db/views/video/video_stream.py +306 -0
  694. endoreg_db/views.py +0 -3
  695. endoreg_db-0.8.6.3.dist-info/METADATA +383 -0
  696. endoreg_db-0.8.6.3.dist-info/RECORD +793 -0
  697. {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info}/WHEEL +1 -1
  698. endoreg_db/data/active_model/data.yaml +0 -3
  699. endoreg_db/data/agl_service/data.yaml +0 -19
  700. endoreg_db/data/label/label-set/data.yaml +0 -18
  701. endoreg_db/management/commands/_load_model_template.py +0 -41
  702. endoreg_db/management/commands/delete_all.py +0 -18
  703. endoreg_db/management/commands/delete_legacy_images.py +0 -19
  704. endoreg_db/management/commands/delete_legacy_videos.py +0 -17
  705. endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
  706. endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
  707. endoreg_db/management/commands/fix_auth_permission.py +0 -20
  708. endoreg_db/management/commands/import_legacy_images.py +0 -94
  709. endoreg_db/management/commands/import_legacy_videos.py +0 -76
  710. endoreg_db/management/commands/load_active_model_data.py +0 -45
  711. endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
  712. endoreg_db/management/commands/load_g_play_data.py +0 -113
  713. endoreg_db/management/commands/load_label_data.py +0 -67
  714. endoreg_db/management/commands/load_medication_indication_data.py +0 -63
  715. endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
  716. endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
  717. endoreg_db/management/commands/load_network_data.py +0 -57
  718. endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
  719. endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
  720. endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
  721. endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
  722. endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
  723. endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
  724. endoreg_db/models/ai_model/__init__.py +0 -3
  725. endoreg_db/models/ai_model/active_model.py +0 -9
  726. endoreg_db/models/ai_model/model_meta.py +0 -24
  727. endoreg_db/models/annotation/__init__.py +0 -3
  728. endoreg_db/models/annotation/anonymized_image_annotation.py +0 -60
  729. endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
  730. endoreg_db/models/annotation/image_classification.py +0 -27
  731. endoreg_db/models/center/center.py +0 -25
  732. endoreg_db/models/center/center_product.py +0 -34
  733. endoreg_db/models/center/center_resource.py +0 -19
  734. endoreg_db/models/center/center_waste.py +0 -11
  735. endoreg_db/models/data_file/__init__.py +0 -6
  736. endoreg_db/models/data_file/base_classes/__init__.py +0 -2
  737. endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
  738. endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
  739. endoreg_db/models/data_file/frame.py +0 -45
  740. endoreg_db/models/data_file/import_classes/__init__.py +0 -32
  741. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
  742. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
  743. endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
  744. endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -188
  745. endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
  746. endoreg_db/models/data_file/metadata/__init__.py +0 -3
  747. endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
  748. endoreg_db/models/data_file/metadata/video_meta.py +0 -133
  749. endoreg_db/models/data_file/report_file.py +0 -89
  750. endoreg_db/models/data_file/video/__init__.py +0 -7
  751. endoreg_db/models/data_file/video/import_meta.py +0 -25
  752. endoreg_db/models/data_file/video/video.py +0 -25
  753. endoreg_db/models/data_file/video_segment.py +0 -107
  754. endoreg_db/models/disease.py +0 -56
  755. endoreg_db/models/emission/__init__.py +0 -1
  756. endoreg_db/models/emission/emission_factor.py +0 -20
  757. endoreg_db/models/event.py +0 -22
  758. endoreg_db/models/examination/__init__.py +0 -4
  759. endoreg_db/models/examination/examination.py +0 -26
  760. endoreg_db/models/examination/examination_time.py +0 -27
  761. endoreg_db/models/examination/examination_time_type.py +0 -24
  762. endoreg_db/models/examination/examination_type.py +0 -18
  763. endoreg_db/models/hardware/__init__.py +0 -2
  764. endoreg_db/models/hardware/endoscope.py +0 -44
  765. endoreg_db/models/information_source.py +0 -29
  766. endoreg_db/models/laboratory/__init__.py +0 -1
  767. endoreg_db/models/laboratory/lab_value.py +0 -102
  768. endoreg_db/models/legacy_data/__init__.py +0 -3
  769. endoreg_db/models/legacy_data/image.py +0 -34
  770. endoreg_db/models/logging/__init__.py +0 -4
  771. endoreg_db/models/logging/agl_service.py +0 -19
  772. endoreg_db/models/logging/base.py +0 -22
  773. endoreg_db/models/logging/log_type.py +0 -23
  774. endoreg_db/models/logging/network_device.py +0 -24
  775. endoreg_db/models/medication/__init__.py +0 -1
  776. endoreg_db/models/medication/medication.py +0 -148
  777. endoreg_db/models/network/__init__.py +0 -3
  778. endoreg_db/models/network/agl_service.py +0 -38
  779. endoreg_db/models/network/network_device.py +0 -53
  780. endoreg_db/models/network/network_device_type.py +0 -23
  781. endoreg_db/models/other/distribution.py +0 -215
  782. endoreg_db/models/patient_examination/__init__.py +0 -35
  783. endoreg_db/models/permissions/__init__.py +0 -44
  784. endoreg_db/models/persons/__init__.py +0 -7
  785. endoreg_db/models/persons/examiner/__init__.py +0 -2
  786. endoreg_db/models/persons/examiner/examiner.py +0 -16
  787. endoreg_db/models/persons/examiner/examiner_type.py +0 -2
  788. endoreg_db/models/persons/patient/__init__.py +0 -8
  789. endoreg_db/models/persons/patient/case/case.py +0 -30
  790. endoreg_db/models/persons/patient/patient.py +0 -216
  791. endoreg_db/models/persons/patient/patient_disease.py +0 -16
  792. endoreg_db/models/persons/patient/patient_event.py +0 -22
  793. endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
  794. endoreg_db/models/persons/patient/patient_medication.py +0 -44
  795. endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
  796. endoreg_db/models/persons/portal_user_information.py +0 -27
  797. endoreg_db/models/prediction/__init__.py +0 -2
  798. endoreg_db/models/prediction/image_classification.py +0 -37
  799. endoreg_db/models/prediction/video_prediction_meta.py +0 -244
  800. endoreg_db/models/product/__init__.py +0 -5
  801. endoreg_db/models/product/product.py +0 -97
  802. endoreg_db/models/product/product_group.py +0 -19
  803. endoreg_db/models/product/product_material.py +0 -24
  804. endoreg_db/models/questionnaires/__init__.py +0 -114
  805. endoreg_db/models/quiz/__init__.py +0 -2
  806. endoreg_db/models/quiz/quiz_answer.py +0 -41
  807. endoreg_db/models/quiz/quiz_question.py +0 -54
  808. endoreg_db/models/report_reader/__init__.py +0 -2
  809. endoreg_db/models/report_reader/report_reader_config.py +0 -53
  810. endoreg_db/models/rules/__init__.py +0 -5
  811. endoreg_db/queries/get/__init__.py +0 -6
  812. endoreg_db/queries/get/center.py +0 -42
  813. endoreg_db/queries/get/model.py +0 -13
  814. endoreg_db/queries/get/patient.py +0 -14
  815. endoreg_db/queries/get/patient_examination.py +0 -20
  816. endoreg_db/queries/get/report_file.py +0 -33
  817. endoreg_db/queries/get/video.py +0 -31
  818. endoreg_db/serializers/ai_model.py +0 -19
  819. endoreg_db/serializers/annotation.py +0 -17
  820. endoreg_db/serializers/center.py +0 -11
  821. endoreg_db/serializers/examination.py +0 -33
  822. endoreg_db/serializers/frame.py +0 -13
  823. endoreg_db/serializers/hardware.py +0 -21
  824. endoreg_db/serializers/label.py +0 -22
  825. endoreg_db/serializers/patient.py +0 -10
  826. endoreg_db/serializers/prediction.py +0 -15
  827. endoreg_db/serializers/report_file.py +0 -7
  828. endoreg_db/serializers/video.py +0 -27
  829. endoreg_db/tests.py +0 -3
  830. endoreg_db/utils/legacy_ocr.py +0 -201
  831. endoreg_db/utils/video_metadata.py +0 -87
  832. endoreg_db-0.4.5.dist-info/METADATA +0 -34
  833. endoreg_db-0.4.5.dist-info/RECORD +0 -316
  834. /endoreg_db/{data/distribution/numeric/.init → api/serializers/finding_descriptions.py} +0 -0
  835. /endoreg_db/{models/persons/patient/case/__init__.py → api/views/finding_descriptions.py} +0 -0
  836. /endoreg_db/{queries/get/annotation.py → config/__init__.py} +0 -0
  837. /endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +0 -0
  838. /endoreg_db/data/{model_type → ai_model_type}/data.yaml +0 -0
  839. /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
  840. /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
  841. /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
  842. /endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +0 -0
  843. /endoreg_db/models/{persons → administration/person}/person.py +0 -0
  844. /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
  845. /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
  846. {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info/licenses}/LICENSE +0 -0
@@ -1,10 +1,11 @@
1
- # Generated by Django 4.2.15 on 2024-08-25 12:09
1
+ # Generated by Django 5.2.5 on 2025-09-15 11:52
2
2
 
3
- from django.conf import settings
4
- import django.core.files.storage
5
3
  import django.core.validators
6
- from django.db import migrations, models
7
4
  import django.db.models.deletion
5
+ import pathlib
6
+ import uuid
7
+ from django.conf import settings
8
+ from django.db import migrations, models
8
9
 
9
10
 
10
11
  class Migration(migrations.Migration):
@@ -17,29 +18,19 @@ class Migration(migrations.Migration):
17
18
 
18
19
  operations = [
19
20
  migrations.CreateModel(
20
- name='AglService',
21
+ name='AiModel',
21
22
  fields=[
22
23
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
23
- ('name', models.CharField(max_length=255)),
24
- ('description', models.CharField(max_length=255)),
25
- ('online', models.BooleanField(default=False)),
26
- ('created', models.DateTimeField(auto_now_add=True)),
27
- ('updated', models.DateTimeField(auto_now=True)),
28
- ('port', models.IntegerField(blank=True, null=True)),
29
- ('protocol', models.CharField(blank=True, max_length=255, null=True)),
30
- ('url', models.URLField(blank=True, null=True)),
24
+ ('name', models.CharField(max_length=255, unique=True)),
25
+ ('description', models.TextField(blank=True, null=True)),
26
+ ('model_subtype', models.CharField(blank=True, max_length=255, null=True)),
31
27
  ],
32
- options={
33
- 'ordering': ['name'],
34
- },
35
28
  ),
36
29
  migrations.CreateModel(
37
30
  name='CaseTemplateRuleType',
38
31
  fields=[
39
32
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
40
33
  ('name', models.CharField(max_length=255)),
41
- ('name_de', models.CharField(max_length=255, null=True)),
42
- ('name_en', models.CharField(max_length=255, null=True)),
43
34
  ('description', models.TextField(blank=True, null=True)),
44
35
  ],
45
36
  ),
@@ -59,8 +50,6 @@ class Migration(migrations.Migration):
59
50
  fields=[
60
51
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
61
52
  ('name', models.CharField(max_length=255)),
62
- ('name_de', models.CharField(max_length=255, null=True)),
63
- ('name_en', models.CharField(max_length=255, null=True)),
64
53
  ('description', models.TextField(blank=True, null=True)),
65
54
  ('distribution_type', models.CharField(choices=[('single_categorical', 'single_categorical'), ('multiple_categorical', 'multiple_categorical'), ('numeric', 'numeric')], max_length=255)),
66
55
  ],
@@ -70,8 +59,6 @@ class Migration(migrations.Migration):
70
59
  fields=[
71
60
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
72
61
  ('name', models.CharField(max_length=255)),
73
- ('name_de', models.CharField(max_length=255, null=True)),
74
- ('name_en', models.CharField(max_length=255, null=True)),
75
62
  ('description', models.TextField(blank=True, null=True)),
76
63
  ],
77
64
  ),
@@ -80,8 +67,14 @@ class Migration(migrations.Migration):
80
67
  fields=[
81
68
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
82
69
  ('name', models.CharField(max_length=255)),
83
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
84
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
70
+ ],
71
+ ),
72
+ migrations.CreateModel(
73
+ name='Contraindication',
74
+ fields=[
75
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
76
+ ('name', models.CharField(max_length=100, unique=True)),
77
+ ('description', models.TextField(blank=True, null=True)),
85
78
  ],
86
79
  ),
87
80
  migrations.CreateModel(
@@ -89,8 +82,6 @@ class Migration(migrations.Migration):
89
82
  fields=[
90
83
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
91
84
  ('name', models.CharField(max_length=100)),
92
- ('name_de', models.CharField(blank=True, max_length=100, null=True)),
93
- ('name_en', models.CharField(blank=True, max_length=100, null=True)),
94
85
  ('description', models.TextField(blank=True, null=True)),
95
86
  ('distribution_type', models.CharField(choices=[('uniform', 'Uniform'), ('normal', 'Normal')], max_length=20)),
96
87
  ('mode', models.CharField(choices=[('date', 'Date'), ('timedelta', 'Timedelta')], max_length=20)),
@@ -112,60 +103,44 @@ class Migration(migrations.Migration):
112
103
  fields=[
113
104
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
114
105
  ('name', models.CharField(max_length=255, unique=True)),
115
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
116
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
117
- ],
118
- ),
119
- migrations.CreateModel(
120
- name='DiseaseClassification',
121
- fields=[
122
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
123
- ('name', models.CharField(max_length=255, unique=True)),
124
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
125
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
126
- ('disease', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.disease')),
106
+ ('subcategories', models.JSONField(default=dict)),
107
+ ('numerical_descriptors', models.JSONField(default=dict)),
127
108
  ],
128
109
  ),
129
110
  migrations.CreateModel(
130
- name='DiseaseClassificationChoice',
111
+ name='DocumentType',
131
112
  fields=[
132
113
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
133
114
  ('name', models.CharField(max_length=255, unique=True)),
134
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
135
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
136
- ('disease_classification', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.diseaseclassification')),
115
+ ('description', models.TextField(blank=True, null=True)),
137
116
  ],
117
+ options={
118
+ 'verbose_name': 'Document Type',
119
+ 'verbose_name_plural': 'Document Types',
120
+ },
138
121
  ),
139
122
  migrations.CreateModel(
140
123
  name='EmissionFactor',
141
124
  fields=[
142
125
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
143
126
  ('name', models.CharField(max_length=255)),
144
- ('name_de', models.CharField(max_length=255, null=True)),
145
- ('name_en', models.CharField(max_length=255, null=True)),
146
127
  ('value', models.FloatField()),
147
128
  ],
148
129
  ),
149
130
  migrations.CreateModel(
150
- name='Endoscope',
131
+ name='EmployeeType',
151
132
  fields=[
152
133
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
153
- ('name', models.CharField(max_length=255)),
154
- ('sn', models.CharField(max_length=255)),
134
+ ('name', models.CharField(max_length=255, unique=True)),
135
+ ('description', models.TextField(blank=True, null=True)),
136
+ ('is_active', models.BooleanField(default=True)),
155
137
  ],
156
- options={
157
- 'verbose_name': 'Endoscope',
158
- 'verbose_name_plural': 'Endoscopes',
159
- 'ordering': ['name'],
160
- },
161
138
  ),
162
139
  migrations.CreateModel(
163
140
  name='EndoscopeType',
164
141
  fields=[
165
142
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
166
- ('name', models.CharField(max_length=255)),
167
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
168
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
143
+ ('name', models.CharField(max_length=255, unique=True)),
169
144
  ],
170
145
  options={
171
146
  'verbose_name': 'Endoscope Type',
@@ -174,54 +149,10 @@ class Migration(migrations.Migration):
174
149
  },
175
150
  ),
176
151
  migrations.CreateModel(
177
- name='EndoscopyProcessor',
178
- fields=[
179
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
180
- ('name', models.CharField(max_length=255)),
181
- ('image_width', models.IntegerField()),
182
- ('image_height', models.IntegerField()),
183
- ('endoscope_image_x', models.IntegerField()),
184
- ('endoscope_image_y', models.IntegerField()),
185
- ('endoscope_image_width', models.IntegerField()),
186
- ('endoscope_image_height', models.IntegerField()),
187
- ('examination_date_x', models.IntegerField()),
188
- ('examination_date_y', models.IntegerField()),
189
- ('examination_date_width', models.IntegerField()),
190
- ('examination_date_height', models.IntegerField()),
191
- ('examination_time_x', models.IntegerField(blank=True, null=True)),
192
- ('examination_time_y', models.IntegerField(blank=True, null=True)),
193
- ('examination_time_width', models.IntegerField(blank=True, null=True)),
194
- ('examination_time_height', models.IntegerField(blank=True, null=True)),
195
- ('patient_first_name_x', models.IntegerField()),
196
- ('patient_first_name_y', models.IntegerField()),
197
- ('patient_first_name_width', models.IntegerField()),
198
- ('patient_first_name_height', models.IntegerField()),
199
- ('patient_last_name_x', models.IntegerField()),
200
- ('patient_last_name_y', models.IntegerField()),
201
- ('patient_last_name_width', models.IntegerField()),
202
- ('patient_last_name_height', models.IntegerField()),
203
- ('patient_dob_x', models.IntegerField()),
204
- ('patient_dob_y', models.IntegerField()),
205
- ('patient_dob_width', models.IntegerField()),
206
- ('patient_dob_height', models.IntegerField()),
207
- ('endoscope_type_x', models.IntegerField(blank=True, null=True)),
208
- ('endoscope_type_y', models.IntegerField(blank=True, null=True)),
209
- ('endoscope_type_width', models.IntegerField(blank=True, null=True)),
210
- ('endoscope_type_height', models.IntegerField(blank=True, null=True)),
211
- ('endoscope_sn_x', models.IntegerField(blank=True, null=True)),
212
- ('endoscope_sn_y', models.IntegerField(blank=True, null=True)),
213
- ('endoscope_sn_width', models.IntegerField(blank=True, null=True)),
214
- ('endoscope_sn_height', models.IntegerField(blank=True, null=True)),
215
- ],
216
- ),
217
- migrations.CreateModel(
218
- name='Event',
152
+ name='EventClassification',
219
153
  fields=[
220
154
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
221
- ('name', models.CharField(max_length=100, unique=True)),
222
- ('name_de', models.CharField(blank=True, max_length=100, null=True)),
223
- ('name_en', models.CharField(blank=True, max_length=100, null=True)),
224
- ('description', models.TextField(blank=True, null=True)),
155
+ ('name', models.CharField(max_length=255, unique=True)),
225
156
  ],
226
157
  ),
227
158
  migrations.CreateModel(
@@ -229,10 +160,11 @@ class Migration(migrations.Migration):
229
160
  fields=[
230
161
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
231
162
  ('name', models.CharField(max_length=100, unique=True)),
232
- ('name_de', models.CharField(blank=True, max_length=100, null=True)),
233
- ('name_en', models.CharField(blank=True, max_length=100, null=True)),
234
- ('date', models.DateField(blank=True, null=True)),
235
- ('time', models.TimeField(blank=True, null=True)),
163
+ ('name_de', models.CharField(max_length=100, null=True, unique=True)),
164
+ ('name_en', models.CharField(max_length=100, null=True, unique=True)),
165
+ ('description', models.TextField(blank=True, null=True)),
166
+ ('description_de', models.TextField(blank=True, null=True)),
167
+ ('description_en', models.TextField(blank=True, null=True)),
236
168
  ],
237
169
  options={
238
170
  'verbose_name': 'Examination',
@@ -245,98 +177,83 @@ class Migration(migrations.Migration):
245
177
  fields=[
246
178
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
247
179
  ('name', models.CharField(max_length=100, unique=True)),
248
- ('name_de', models.CharField(blank=True, max_length=100, null=True)),
249
- ('name_en', models.CharField(blank=True, max_length=100, null=True)),
250
180
  ],
251
181
  ),
252
182
  migrations.CreateModel(
253
- name='Examiner',
183
+ name='FFMpegMeta',
254
184
  fields=[
255
185
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
256
- ('first_name', models.CharField(max_length=255)),
257
- ('last_name', models.CharField(max_length=255)),
258
- ('dob', models.DateField(blank=True, null=True, verbose_name='Date of Birth')),
259
- ('email', models.EmailField(blank=True, max_length=255, null=True)),
260
- ('phone', models.CharField(blank=True, max_length=255, null=True)),
261
- ('is_real_person', models.BooleanField(default=True)),
262
- ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
186
+ ('width', models.IntegerField(blank=True, null=True)),
187
+ ('height', models.IntegerField(blank=True, null=True)),
188
+ ('duration', models.FloatField(blank=True, null=True)),
189
+ ('frame_rate_num', models.IntegerField(blank=True, null=True)),
190
+ ('frame_rate_den', models.IntegerField(blank=True, null=True)),
191
+ ('codec_name', models.CharField(blank=True, max_length=50, null=True)),
192
+ ('pixel_format', models.CharField(blank=True, max_length=50, null=True)),
193
+ ('bit_rate', models.BigIntegerField(blank=True, null=True)),
194
+ ('raw_probe_data', models.JSONField(blank=True, null=True)),
263
195
  ],
264
- options={
265
- 'abstract': False,
266
- },
267
196
  ),
268
197
  migrations.CreateModel(
269
- name='FFMpegMeta',
198
+ name='FindingClassificationChoice',
270
199
  fields=[
271
200
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
272
- ('duration', models.FloatField(blank=True, null=True)),
273
- ('width', models.IntegerField(blank=True, null=True)),
274
- ('height', models.IntegerField(blank=True, null=True)),
275
- ('frame_rate', models.FloatField(blank=True, null=True)),
276
- ('video_codec', models.CharField(blank=True, max_length=50, null=True)),
277
- ('audio_codec', models.CharField(blank=True, max_length=50, null=True)),
278
- ('audio_channels', models.IntegerField(blank=True, null=True)),
279
- ('audio_sample_rate', models.IntegerField(blank=True, null=True)),
201
+ ('name', models.CharField(max_length=255, unique=True)),
202
+ ('name_de', models.CharField(max_length=255, null=True, unique=True)),
203
+ ('name_en', models.CharField(max_length=255, null=True, unique=True)),
204
+ ('description', models.TextField(blank=True)),
205
+ ('description_de', models.TextField(blank=True, null=True)),
206
+ ('description_en', models.TextField(blank=True, null=True)),
207
+ ('subcategories', models.JSONField(default=dict)),
208
+ ('numerical_descriptors', models.JSONField(default=dict)),
280
209
  ],
281
210
  ),
282
211
  migrations.CreateModel(
283
- name='FirstName',
212
+ name='FindingClassificationType',
284
213
  fields=[
285
214
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
286
215
  ('name', models.CharField(max_length=255, unique=True)),
216
+ ('description', models.TextField(blank=True)),
287
217
  ],
288
218
  ),
289
219
  migrations.CreateModel(
290
- name='Frame',
220
+ name='FindingInterventionType',
291
221
  fields=[
292
222
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
293
- ('frame_number', models.IntegerField()),
294
- ('image', models.ImageField(upload_to='frames')),
295
- ('suffix', models.CharField(max_length=255)),
223
+ ('name', models.CharField(max_length=100, unique=True)),
224
+ ('description', models.TextField(blank=True, null=True)),
296
225
  ],
297
- options={
298
- 'abstract': False,
299
- },
300
226
  ),
301
227
  migrations.CreateModel(
302
- name='Gender',
228
+ name='FindingType',
303
229
  fields=[
304
230
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
305
- ('name', models.CharField(max_length=255)),
306
- ('name_de', models.CharField(max_length=255, null=True)),
307
- ('name_en', models.CharField(max_length=255, null=True)),
308
- ('abbreviation', models.CharField(max_length=255, null=True)),
231
+ ('name', models.CharField(max_length=100, unique=True)),
309
232
  ('description', models.TextField(blank=True, null=True)),
310
233
  ],
311
234
  ),
312
235
  migrations.CreateModel(
313
- name='InformationSource',
236
+ name='FirstName',
314
237
  fields=[
315
238
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
316
- ('name', models.CharField(max_length=100)),
317
- ('name_de', models.CharField(blank=True, max_length=100, null=True)),
318
- ('name_en', models.CharField(blank=True, max_length=100, null=True)),
319
- ('url', models.URLField(blank=True, null=True)),
320
- ('description', models.TextField(blank=True, null=True)),
321
- ('date', models.DateField(blank=True, null=True)),
239
+ ('name', models.CharField(max_length=255, unique=True)),
322
240
  ],
323
241
  ),
324
242
  migrations.CreateModel(
325
- name='Label',
243
+ name='Gender',
326
244
  fields=[
327
245
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
328
246
  ('name', models.CharField(max_length=255)),
247
+ ('abbreviation', models.CharField(max_length=255, null=True)),
329
248
  ('description', models.TextField(blank=True, null=True)),
330
249
  ],
331
250
  ),
332
251
  migrations.CreateModel(
333
- name='LabelSet',
252
+ name='Label',
334
253
  fields=[
335
254
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
336
255
  ('name', models.CharField(max_length=255)),
337
256
  ('description', models.TextField(blank=True, null=True)),
338
- ('version', models.IntegerField()),
339
- ('labels', models.ManyToManyField(related_name='labels', to='endoreg_db.label')),
340
257
  ],
341
258
  ),
342
259
  migrations.CreateModel(
@@ -348,365 +265,207 @@ class Migration(migrations.Migration):
348
265
  ],
349
266
  ),
350
267
  migrations.CreateModel(
351
- name='LabValue',
268
+ name='LastName',
352
269
  fields=[
353
270
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
354
271
  ('name', models.CharField(max_length=255, unique=True)),
355
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
356
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
357
- ('abbreviation', models.CharField(blank=True, max_length=10, null=True)),
358
- ('numeric_precision', models.IntegerField(default=3)),
359
- ('default_normal_range', models.JSONField(blank=True, null=True)),
360
- ('normal_range_age_dependent', models.BooleanField(default=False)),
361
- ('normal_range_gender_dependent', models.BooleanField(default=False)),
362
- ('normal_range_special_case', models.BooleanField(default=False)),
363
- ('default_date_value_distribution', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_date_value_distribution', to='endoreg_db.datevaluedistribution')),
364
272
  ],
365
273
  ),
366
274
  migrations.CreateModel(
367
- name='LastName',
275
+ name='Medication',
368
276
  fields=[
369
277
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
370
278
  ('name', models.CharField(max_length=255, unique=True)),
279
+ ('adapt_to_renal_function', models.BooleanField(default=False)),
280
+ ('adapt_to_hepatic_function', models.BooleanField(default=False)),
281
+ ('adapt_to_indication', models.BooleanField(default=False)),
282
+ ('adapt_to_age', models.BooleanField(default=False)),
283
+ ('adapt_to_weight', models.BooleanField(default=False)),
284
+ ('adapt_to_risk', models.BooleanField(default=False)),
371
285
  ],
372
286
  ),
373
287
  migrations.CreateModel(
374
- name='LegacyImage',
288
+ name='MedicationIndicationType',
375
289
  fields=[
376
290
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
377
- ('image', models.ImageField(upload_to='legacy_images')),
378
- ('suffix', models.CharField(max_length=255)),
291
+ ('name', models.CharField(max_length=255, unique=True)),
379
292
  ],
380
293
  ),
381
294
  migrations.CreateModel(
382
- name='LegacyVideo',
295
+ name='MedicationIntakeTime',
383
296
  fields=[
384
297
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
385
- ('video_hash', models.CharField(max_length=255, unique=True)),
386
- ('date', models.DateField(blank=True, null=True)),
387
- ('suffix', models.CharField(max_length=255)),
388
- ('fps', models.FloatField()),
389
- ('duration', models.FloatField()),
390
- ('width', models.IntegerField()),
391
- ('height', models.IntegerField()),
392
- ('endoscope_image_x', models.IntegerField(blank=True, null=True)),
393
- ('endoscope_image_y', models.IntegerField(blank=True, null=True)),
394
- ('endoscope_image_width', models.IntegerField(blank=True, null=True)),
395
- ('endoscope_image_height', models.IntegerField(blank=True, null=True)),
396
- ('frames_extracted', models.BooleanField(default=False)),
397
- ('meta', models.JSONField(blank=True, null=True)),
398
- ('file', models.FileField(blank=True, null=True, upload_to='legacy_videos')),
399
- ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
400
- ('endoscopy_processor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.endoscopyprocessor')),
298
+ ('name', models.CharField(max_length=255, unique=True)),
299
+ ('repeats', models.CharField(default='daily', max_length=20)),
300
+ ('time', models.TimeField()),
401
301
  ],
402
- options={
403
- 'abstract': False,
404
- },
405
302
  ),
406
303
  migrations.CreateModel(
407
- name='LogType',
304
+ name='ModelType',
408
305
  fields=[
409
306
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
410
307
  ('name', models.CharField(max_length=255)),
411
- ('description', models.CharField(max_length=255)),
412
- ('created', models.DateTimeField(auto_now_add=True)),
413
- ('updated', models.DateTimeField(auto_now=True)),
308
+ ('description', models.TextField(blank=True, null=True)),
414
309
  ],
415
- options={
416
- 'ordering': ['name'],
417
- },
418
310
  ),
419
311
  migrations.CreateModel(
420
- name='Material',
312
+ name='MultipleCategoricalValueDistribution',
421
313
  fields=[
422
314
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
423
- ('name', models.CharField(max_length=255)),
424
- ('name_de', models.CharField(max_length=255, null=True)),
425
- ('name_en', models.CharField(max_length=255, null=True)),
426
- ('emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.emissionfactor')),
315
+ ('name', models.CharField(max_length=100)),
316
+ ('categories', models.JSONField()),
317
+ ('min_count', models.IntegerField()),
318
+ ('max_count', models.IntegerField()),
319
+ ('count_distribution_type', models.CharField(choices=[('uniform', 'Uniform'), ('normal', 'Normal')], max_length=20)),
320
+ ('count_mean', models.FloatField(blank=True, null=True)),
321
+ ('count_std_dev', models.FloatField(blank=True, null=True)),
427
322
  ],
323
+ options={
324
+ 'abstract': False,
325
+ },
428
326
  ),
429
327
  migrations.CreateModel(
430
- name='Medication',
328
+ name='NumericValueDistribution',
431
329
  fields=[
432
330
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
433
- ('name', models.CharField(max_length=255, unique=True)),
434
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
435
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
436
- ('adapt_to_renal_function', models.BooleanField(default=False)),
437
- ('adapt_to_hepatic_function', models.BooleanField(default=False)),
438
- ('adapt_to_indication', models.BooleanField(default=False)),
439
- ('adapt_to_age', models.BooleanField(default=False)),
440
- ('adapt_to_weight', models.BooleanField(default=False)),
441
- ('adapt_to_risk', models.BooleanField(default=False)),
331
+ ('name', models.CharField(max_length=100)),
332
+ ('distribution_type', models.CharField(choices=[('uniform', 'Uniform'), ('normal', 'Normal'), ('skewed_normal', 'Skewed Normal')], max_length=20)),
333
+ ('min_descriptor', models.CharField(max_length=20)),
334
+ ('max_descriptor', models.CharField(max_length=20)),
442
335
  ],
336
+ options={
337
+ 'abstract': False,
338
+ },
443
339
  ),
444
340
  migrations.CreateModel(
445
- name='MedicationIndication',
341
+ name='PatientLabSampleType',
446
342
  fields=[
447
343
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
448
- ('name', models.CharField(max_length=255, unique=True)),
449
- ('classification_choices', models.ManyToManyField(to='endoreg_db.diseaseclassificationchoice')),
450
- ('diseases', models.ManyToManyField(to='endoreg_db.disease')),
451
- ('events', models.ManyToManyField(to='endoreg_db.event')),
344
+ ('name', models.CharField(max_length=255)),
345
+ ('description', models.TextField(blank=True, null=True)),
452
346
  ],
453
347
  ),
454
348
  migrations.CreateModel(
455
- name='MedicationIndicationType',
349
+ name='PdfType',
456
350
  fields=[
457
351
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
458
- ('name', models.CharField(max_length=255, unique=True)),
459
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
460
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
352
+ ('name', models.CharField(max_length=255)),
461
353
  ],
462
354
  ),
463
355
  migrations.CreateModel(
464
- name='MedicationIntakeTime',
356
+ name='Product',
465
357
  fields=[
466
358
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
467
359
  ('name', models.CharField(max_length=255)),
468
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
469
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
470
- ('repeats', models.CharField(default='daily', max_length=20)),
471
- ('time', models.TimeField()),
472
360
  ],
473
361
  ),
474
362
  migrations.CreateModel(
475
- name='MedicationSchedule',
363
+ name='ProductGroup',
476
364
  fields=[
477
365
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
478
366
  ('name', models.CharField(max_length=255)),
479
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
480
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
481
- ('description', models.TextField(blank=True, null=True)),
482
- ('therapy_duration_d', models.FloatField(blank=True, null=True)),
483
- ('dose', models.FloatField()),
484
- ('intake_times', models.ManyToManyField(to='endoreg_db.medicationintaketime')),
485
- ('medication', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.medication')),
486
367
  ],
487
368
  ),
488
369
  migrations.CreateModel(
489
- name='ModelMeta',
370
+ name='Profession',
490
371
  fields=[
491
372
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
492
- ('name', models.CharField(max_length=255)),
493
- ('version', models.CharField(max_length=255)),
494
- ('weights', models.FileField(upload_to='weights/')),
373
+ ('name', models.CharField(max_length=100)),
495
374
  ('description', models.TextField(blank=True, null=True)),
496
- ('date_created', models.DateTimeField(auto_now_add=True)),
497
- ('labelset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='models', to='endoreg_db.labelset')),
498
375
  ],
499
376
  ),
500
377
  migrations.CreateModel(
501
- name='ModelType',
378
+ name='Qualification',
502
379
  fields=[
503
380
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
504
- ('name', models.CharField(max_length=255)),
381
+ ('name', models.CharField(max_length=255, unique=True)),
505
382
  ('description', models.TextField(blank=True, null=True)),
383
+ ('is_active', models.BooleanField(default=True)),
506
384
  ],
507
385
  ),
508
386
  migrations.CreateModel(
509
- name='MultipleCategoricalValueDistribution',
387
+ name='QualificationType',
510
388
  fields=[
511
389
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
512
- ('name', models.CharField(max_length=100)),
513
- ('categories', models.JSONField()),
514
- ('min_count', models.IntegerField()),
515
- ('max_count', models.IntegerField()),
516
- ('count_distribution_type', models.CharField(choices=[('uniform', 'Uniform'), ('normal', 'Normal')], max_length=20)),
517
- ('count_mean', models.FloatField(blank=True, null=True)),
518
- ('count_std_dev', models.FloatField(blank=True, null=True)),
390
+ ('name', models.CharField(max_length=255, unique=True)),
391
+ ('description', models.TextField(blank=True, null=True)),
392
+ ('is_active', models.BooleanField(default=True)),
519
393
  ],
520
- options={
521
- 'abstract': False,
522
- },
523
394
  ),
524
395
  migrations.CreateModel(
525
- name='NetworkDevice',
396
+ name='RawPdfState',
526
397
  fields=[
527
398
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
528
- ('name', models.CharField(max_length=255)),
529
- ('ip', models.GenericIPAddressField(blank=True, null=True)),
530
- ('description', models.CharField(max_length=255)),
531
- ('online', models.BooleanField(default=False)),
532
- ('created', models.DateTimeField(auto_now_add=True)),
533
- ('updated', models.DateTimeField(auto_now=True)),
399
+ ('text_meta_extracted', models.BooleanField(default=False, help_text='True if text metadata (OCR) has been extracted.')),
400
+ ('initial_prediction_completed', models.BooleanField(default=False, help_text='True if initial AI prediction has run.')),
401
+ ('sensitive_meta_processed', models.BooleanField(default=False, help_text='True if the video has been fully processed, meaning a anonymized person was created.')),
402
+ ('anonymized', models.BooleanField(default=False, help_text='True if the anonymized video file has been created.')),
403
+ ('anonymization_validated', models.BooleanField(default=False, help_text='True if the anonymization process has been validated and confirmed.')),
404
+ ('processing_started', models.BooleanField(default=False, help_text='True if the processing has started, but not yet completed.')),
405
+ ('processing_error', models.BooleanField(default=False, help_text='True if an error occurred during processing.')),
406
+ ('date_created', models.DateTimeField(auto_now_add=True)),
407
+ ('date_modified', models.DateTimeField(auto_now=True)),
408
+ ('was_created', models.BooleanField(default=True, help_text='True if this state was created for the first time.')),
409
+ ('pdf_meta_extracted', models.BooleanField(default=False, help_text='True if PDF metadata has been extracted.')),
534
410
  ],
535
411
  options={
536
- 'db_table': 'network_devices',
537
- 'ordering': ['name'],
412
+ 'verbose_name': 'Raw PDF Processing State',
413
+ 'verbose_name_plural': 'Raw PDF Processing States',
538
414
  },
539
415
  ),
540
416
  migrations.CreateModel(
541
- name='NetworkDeviceType',
417
+ name='ReportReaderFlag',
542
418
  fields=[
543
419
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
544
- ('name', models.CharField(max_length=255)),
545
- ('description', models.CharField(max_length=255)),
546
- ('created', models.DateTimeField(auto_now_add=True)),
547
- ('updated', models.DateTimeField(auto_now=True)),
548
- ],
549
- options={
550
- 'db_table': 'network_device_types',
551
- 'ordering': ['name'],
552
- },
553
- ),
554
- migrations.CreateModel(
555
- name='NumericValueDistribution',
556
- fields=[
557
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
558
- ('name', models.CharField(max_length=100)),
559
- ('distribution_type', models.CharField(choices=[('uniform', 'Uniform'), ('normal', 'Normal'), ('skewed_normal', 'Skewed Normal')], max_length=20)),
560
- ('min_value', models.FloatField()),
561
- ('max_value', models.FloatField()),
562
- ('mean', models.FloatField(blank=True, null=True)),
563
- ('std_dev', models.FloatField(blank=True, null=True)),
564
- ('skewness', models.FloatField(blank=True, null=True)),
565
- ],
566
- options={
567
- 'abstract': False,
568
- },
569
- ),
570
- migrations.CreateModel(
571
- name='Patient',
572
- fields=[
573
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
574
- ('first_name', models.CharField(max_length=255)),
575
- ('last_name', models.CharField(max_length=255)),
576
- ('dob', models.DateField(blank=True, null=True, verbose_name='Date of Birth')),
577
- ('email', models.EmailField(blank=True, max_length=255, null=True)),
578
- ('phone', models.CharField(blank=True, max_length=255, null=True)),
579
- ('is_real_person', models.BooleanField(default=True)),
580
- ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
581
- ('gender', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.gender')),
582
- ],
583
- options={
584
- 'abstract': False,
585
- },
586
- ),
587
- migrations.CreateModel(
588
- name='PatientLabSample',
589
- fields=[
590
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
591
- ('date', models.DateTimeField()),
592
- ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lab_samples', to='endoreg_db.patient')),
593
- ],
594
- ),
595
- migrations.CreateModel(
596
- name='PatientLabSampleType',
597
- fields=[
598
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
599
- ('name', models.CharField(max_length=255)),
600
- ('name_de', models.CharField(max_length=255, null=True)),
601
- ('name_en', models.CharField(max_length=255, null=True)),
602
- ('description', models.TextField(blank=True, null=True)),
603
- ],
604
- ),
605
- migrations.CreateModel(
606
- name='PatientMedication',
607
- fields=[
608
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
609
- ('dosage', models.JSONField()),
610
- ('active', models.BooleanField(default=True)),
611
- ('medication_indication', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='patient_medications', to='endoreg_db.medicationindication')),
612
- ('medication_schedules', models.ManyToManyField(to='endoreg_db.medicationschedule')),
613
- ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient')),
614
- ],
615
- options={
616
- 'verbose_name': 'Patient Medication',
617
- 'verbose_name_plural': 'Patient Medications',
618
- },
619
- ),
620
- migrations.CreateModel(
621
- name='PdfType',
622
- fields=[
623
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
624
- ('name', models.CharField(max_length=255)),
625
- ],
626
- ),
627
- migrations.CreateModel(
628
- name='Product',
629
- fields=[
630
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
631
- ('name', models.CharField(max_length=255)),
632
- ('name_de', models.CharField(max_length=255, null=True)),
633
- ('name_en', models.CharField(max_length=255, null=True)),
634
- ],
635
- ),
636
- migrations.CreateModel(
637
- name='ProductGroup',
638
- fields=[
639
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
640
- ('name', models.CharField(max_length=255)),
641
- ('name_de', models.CharField(max_length=255, null=True)),
642
- ('name_en', models.CharField(max_length=255, null=True)),
420
+ ('name', models.CharField(max_length=255, unique=True)),
421
+ ('value', models.CharField(max_length=255)),
643
422
  ],
644
423
  ),
645
424
  migrations.CreateModel(
646
- name='Profession',
425
+ name='RequirementOperator',
647
426
  fields=[
648
427
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
649
- ('name', models.CharField(max_length=100)),
650
- ('name_de', models.CharField(blank=True, max_length=100, null=True)),
651
- ('name_en', models.CharField(blank=True, max_length=100, null=True)),
428
+ ('name', models.CharField(max_length=100, unique=True)),
652
429
  ('description', models.TextField(blank=True, null=True)),
430
+ ('evaluation_function_name', models.CharField(blank=True, max_length=255, null=True)),
653
431
  ],
654
432
  ),
655
433
  migrations.CreateModel(
656
- name='QuizAnswerType',
434
+ name='RequirementSetType',
657
435
  fields=[
658
436
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
659
- ('name', models.CharField(max_length=255)),
437
+ ('name', models.CharField(max_length=100, unique=True)),
660
438
  ('description', models.TextField(blank=True, null=True)),
661
439
  ],
662
440
  ),
663
441
  migrations.CreateModel(
664
- name='QuizQuestionType',
442
+ name='RequirementType',
665
443
  fields=[
666
444
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
667
- ('name', models.CharField(max_length=255)),
445
+ ('name', models.CharField(max_length=100, unique=True)),
668
446
  ('description', models.TextField(blank=True, null=True)),
669
447
  ],
670
448
  ),
671
- migrations.CreateModel(
672
- name='ReportReaderFlag',
673
- fields=[
674
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
675
- ('name', models.CharField(max_length=255, unique=True)),
676
- ('value', models.CharField(max_length=255)),
677
- ],
678
- ),
679
449
  migrations.CreateModel(
680
450
  name='Resource',
681
451
  fields=[
682
452
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
683
453
  ('name', models.CharField(max_length=255)),
684
- ('name_de', models.CharField(max_length=255, null=True)),
685
- ('name_en', models.CharField(max_length=255, null=True)),
686
454
  ],
687
455
  ),
688
456
  migrations.CreateModel(
689
- name='Rule',
457
+ name='RiskType',
690
458
  fields=[
691
459
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
692
- ('name', models.CharField(max_length=255, unique=True)),
693
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
694
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
460
+ ('name', models.CharField(max_length=100, unique=True)),
695
461
  ('description', models.TextField(blank=True, null=True)),
696
- ('attribute_key', models.CharField(max_length=255)),
697
462
  ],
698
- options={
699
- 'verbose_name': 'Rule',
700
- 'verbose_name_plural': 'Rules',
701
- },
702
463
  ),
703
464
  migrations.CreateModel(
704
465
  name='RuleAttributeDType',
705
466
  fields=[
706
467
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
707
468
  ('name', models.CharField(max_length=255, unique=True)),
708
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
709
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
710
469
  ],
711
470
  ),
712
471
  migrations.CreateModel(
@@ -714,8 +473,6 @@ class Migration(migrations.Migration):
714
473
  fields=[
715
474
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
716
475
  ('name', models.CharField(max_length=255, unique=True)),
717
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
718
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
719
476
  ],
720
477
  options={
721
478
  'verbose_name': 'Rule Type',
@@ -723,15 +480,24 @@ class Migration(migrations.Migration):
723
480
  },
724
481
  ),
725
482
  migrations.CreateModel(
726
- name='SensitiveMeta',
483
+ name='ScheduledDays',
727
484
  fields=[
728
485
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
729
- ('examination_date', models.DateField(blank=True, null=True)),
730
- ('patient_first_name', models.CharField(blank=True, max_length=255, null=True)),
731
- ('patient_last_name', models.CharField(blank=True, max_length=255, null=True)),
732
- ('patient_dob', models.DateField(blank=True, null=True)),
733
- ('endoscope_type', models.CharField(blank=True, max_length=255, null=True)),
734
- ('endoscope_sn', models.CharField(blank=True, max_length=255, null=True)),
486
+ ('name', models.CharField(help_text='Name of the scheduled days.', max_length=255, unique=True)),
487
+ ('working_days', models.BooleanField(blank=True, default=True, null=True)),
488
+ ('non_working_days', models.BooleanField(blank=True, default=False, null=True)),
489
+ ('limited_time', models.BooleanField(blank=True, default=False, null=True)),
490
+ ('start_date', models.DateField(blank=True, null=True)),
491
+ ('end_date', models.DateField(blank=True, null=True)),
492
+ ],
493
+ ),
494
+ migrations.CreateModel(
495
+ name='ShiftType',
496
+ fields=[
497
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
498
+ ('name', models.CharField(max_length=255, unique=True)),
499
+ ('description', models.TextField(blank=True, null=True)),
500
+ ('is_active', models.BooleanField(default=True)),
735
501
  ],
736
502
  ),
737
503
  migrations.CreateModel(
@@ -746,85 +512,30 @@ class Migration(migrations.Migration):
746
512
  },
747
513
  ),
748
514
  migrations.CreateModel(
749
- name='TtoQuestionnaire',
750
- fields=[
751
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
752
- ('patient_name', models.CharField(max_length=255, verbose_name='Identifikation des Patienten (Name)')),
753
- ('birth_date', models.DateField(verbose_name='Geburtsdatum')),
754
- ('emergency_patient', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Notfallpatient/kürzlich untersuchter Patient (Verzicht auf Team-Time-Out möglich)')),
755
- ('consent_signed', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Einverständniserklärung unterschrieben (Arzt, Patient)')),
756
- ('documents_present', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Alle Dokumente liegen vor (Labor, Befunde, etc.)')),
757
- ('communication_possible', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Kommunikation mit Patient möglich')),
758
- ('work_incapacity_certificate', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Arbeitsunfähigkeitsbescheinigung')),
759
- ('pregnancy', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Schwangerschaft')),
760
- ('asa_classification_checked', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='ASA-Klassifikation/Komorbidität geprüft')),
761
- ('previous_anesthesia_complications', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Komplikationen bei bisherigen Narkosen?')),
762
- ('last_meal_over_6_hours_ago', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Zeitpunkt letzte Mahlzeit > 6 Stunden')),
763
- ('allergies', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Allergien, welche?')),
764
- ('outpatient_accompaniment_post_sedation', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Nur bei ambulanter Vorstellung: Begleitung nach Sedierung?')),
765
- ('dental_prosthesis', models.BooleanField(default=False, verbose_name='Zahnprothese')),
766
- ('glasses', models.BooleanField(default=False, verbose_name='Brille')),
767
- ('implants', models.BooleanField(default=False, verbose_name='Implantate')),
768
- ('hearing_aids', models.BooleanField(default=False, verbose_name='Hörgeräte')),
769
- ('anticoagulants_ass', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Antikoagulation, ASS')),
770
- ('blood_pressure_medication', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Blutdruckmedikamente')),
771
- ('glaucoma', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Glaukom')),
772
- ('metal_implants', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Metallimplantate')),
773
- ('pacemaker_icd', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Herzschrittmacher/ICD')),
774
- ('copd', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='COPD')),
775
- ('liver_cirrhosis', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Leberzirrhose')),
776
- ('ibd', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='CED (Chronisch entzündliche Darmerkrankungen)')),
777
- ('radiation', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Bestrahlung')),
778
- ('surgeries', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='OP´s')),
779
- ('team_introduction', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Teamvorstellung mit Name und Aufgabe')),
780
- ('instruments_available', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Notwendige Instrumente vorhanden?')),
781
- ('monitoring_medications_equipment_checked', models.CharField(choices=[('yes', 'Ja'), ('no', 'Nein')], max_length=3, verbose_name='Monitoring, Medikamente, Equipment zum Atemwegsmanagement zur Verfügung und überprüft?')),
782
- ('complete_documentation_inclusive_care_notes', models.TextField(verbose_name='Vollständige Dokumentation inklusive Hinweise für Nachsorge')),
783
- ('notes', models.TextField(default='Keine Bemerkungen', verbose_name='Bemerkungen')),
784
- ('specimens_secured', models.BooleanField(default=False, verbose_name='Histologische Proben gesichert')),
785
- ('patient_condition_documented', models.TextField(verbose_name='Patientenzustand dokumentiert (je nach Ausgangszustand)')),
515
+ name='Tag',
516
+ fields=[
517
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
518
+ ('name', models.CharField(max_length=100, unique=True)),
786
519
  ],
520
+ options={
521
+ 'verbose_name': 'Tag',
522
+ 'verbose_name_plural': 'Tags',
523
+ },
787
524
  ),
788
525
  migrations.CreateModel(
789
526
  name='Unit',
790
527
  fields=[
791
528
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
792
529
  ('name', models.CharField(max_length=100)),
793
- ('name_de', models.CharField(blank=True, max_length=100, null=True)),
794
- ('name_en', models.CharField(blank=True, max_length=100, null=True)),
795
530
  ('description', models.CharField(blank=True, max_length=100, null=True)),
796
531
  ('abbreviation', models.CharField(blank=True, max_length=25, null=True)),
797
532
  ],
798
533
  ),
799
- migrations.CreateModel(
800
- name='Video',
801
- fields=[
802
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
803
- ('file', models.FileField(blank=True, null=True, upload_to='raw_videos')),
804
- ('video_hash', models.CharField(max_length=255, unique=True)),
805
- ('date', models.DateField(blank=True, null=True)),
806
- ('suffix', models.CharField(max_length=255)),
807
- ('fps', models.FloatField()),
808
- ('duration', models.FloatField()),
809
- ('width', models.IntegerField()),
810
- ('height', models.IntegerField()),
811
- ('endoscope_image_x', models.IntegerField(blank=True, null=True)),
812
- ('endoscope_image_y', models.IntegerField(blank=True, null=True)),
813
- ('endoscope_image_width', models.IntegerField(blank=True, null=True)),
814
- ('endoscope_image_height', models.IntegerField(blank=True, null=True)),
815
- ('frames_extracted', models.BooleanField(default=False)),
816
- ('meta', models.JSONField(blank=True, null=True)),
817
- ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
818
- ('endoscopy_processor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.endoscopyprocessor')),
819
- ],
820
- options={
821
- 'abstract': False,
822
- },
823
- ),
824
534
  migrations.CreateModel(
825
535
  name='VideoImportMeta',
826
536
  fields=[
827
537
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
538
+ ('file_name', models.CharField(blank=True, max_length=255, null=True)),
828
539
  ('video_anonymized', models.BooleanField(default=False)),
829
540
  ('video_patient_data_detected', models.BooleanField(default=False)),
830
541
  ('outside_detected', models.BooleanField(default=False)),
@@ -833,735 +544,1314 @@ class Migration(migrations.Migration):
833
544
  ],
834
545
  ),
835
546
  migrations.CreateModel(
836
- name='Waste',
547
+ name='VideoSegmentationLabel',
837
548
  fields=[
838
549
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
839
550
  ('name', models.CharField(max_length=255)),
840
- ('name_de', models.CharField(max_length=255, null=True)),
841
- ('name_en', models.CharField(max_length=255, null=True)),
551
+ ('description', models.TextField(blank=True, null=True)),
552
+ ('color', models.CharField(blank=True, max_length=255, null=True)),
553
+ ('order_priority', models.IntegerField(default=0)),
842
554
  ],
843
555
  ),
844
556
  migrations.CreateModel(
845
- name='VideoPredictionMeta',
557
+ name='VideoState',
846
558
  fields=[
847
559
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
560
+ ('frames_extracted', models.BooleanField(default=False, help_text='True if raw frames have been extracted to files.')),
561
+ ('frames_initialized', models.BooleanField(default=False, help_text='True if Frame DB objects have been created.')),
562
+ ('frame_count', models.PositiveIntegerField(blank=True, help_text='Number of frames extracted/initialized.', null=True)),
563
+ ('video_meta_extracted', models.BooleanField(default=False, help_text='True if VideoMeta (technical specs) has been extracted.')),
564
+ ('text_meta_extracted', models.BooleanField(default=False, help_text='True if text metadata (OCR) has been extracted.')),
565
+ ('initial_prediction_completed', models.BooleanField(default=False, help_text='True if initial AI prediction has run.')),
566
+ ('lvs_created', models.BooleanField(default=False, help_text='True if LabelVideoSegments have been created from predictions.')),
567
+ ('frame_annotations_generated', models.BooleanField(default=False, help_text='True if frame-level annotations have been generated from segments.')),
568
+ ('sensitive_meta_processed', models.BooleanField(default=False, help_text='True if the video has been fully processed, meaning a anonymized person was created.')),
569
+ ('anonymized', models.BooleanField(default=False, help_text='True if the anonymized video file has been created.')),
570
+ ('anonymization_validated', models.BooleanField(default=False, help_text='True if the anonymization process has been validated and confirmed.')),
571
+ ('processing_started', models.BooleanField(default=False, help_text='True if the processing has started, but not yet completed.')),
848
572
  ('date_created', models.DateTimeField(auto_now_add=True)),
849
573
  ('date_modified', models.DateTimeField(auto_now=True)),
850
- ('prediction_array', models.BinaryField(blank=True, null=True)),
851
- ('model_meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.modelmeta')),
852
- ('video', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='video_prediction_meta', to='endoreg_db.video')),
574
+ ('segment_annotations_created', models.BooleanField(default=False, help_text='True if segment annotations have been created from LabelVideoSegments.')),
575
+ ('segment_annotations_validated', models.BooleanField(default=False, help_text='True if segment annotations have been validated.')),
576
+ ('was_created', models.BooleanField(default=True, help_text='True if this state was created for the first time.')),
853
577
  ],
854
578
  options={
855
- 'abstract': False,
856
- 'unique_together': {('model_meta', 'video')},
579
+ 'verbose_name': 'Video Processing State',
580
+ 'verbose_name_plural': 'Video Processing States',
857
581
  },
858
582
  ),
859
583
  migrations.CreateModel(
860
- name='VideoMeta',
584
+ name='Waste',
861
585
  fields=[
862
586
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
863
- ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
864
- ('endoscope', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.endoscope')),
865
- ('ffmpeg_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.ffmpegmeta')),
866
- ('import_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.videoimportmeta')),
867
- ('processor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.endoscopyprocessor')),
587
+ ('name', models.CharField(max_length=255)),
868
588
  ],
869
589
  ),
870
- migrations.AddField(
871
- model_name='video',
872
- name='import_meta',
873
- field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.videoimportmeta'),
874
- ),
875
- migrations.AddField(
876
- model_name='video',
877
- name='patient',
878
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient'),
879
- ),
880
590
  migrations.CreateModel(
881
- name='TransportRoute',
591
+ name='CaseTemplateRule',
882
592
  fields=[
883
593
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
884
- ('distance', models.FloatField()),
885
594
  ('name', models.CharField(max_length=255)),
886
- ('name_de', models.CharField(max_length=255, null=True)),
887
- ('name_en', models.CharField(max_length=255, null=True)),
888
- ('emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.emissionfactor')),
889
- ('unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit')),
595
+ ('description', models.TextField(blank=True, null=True)),
596
+ ('parent_model', models.CharField(blank=True, max_length=255, null=True)),
597
+ ('parent_field', models.CharField(blank=True, max_length=255, null=True)),
598
+ ('target_field', models.CharField(blank=True, max_length=255, null=True)),
599
+ ('target_model', models.CharField(blank=True, max_length=255, null=True)),
600
+ ('rule_values', models.JSONField(blank=True, null=True)),
601
+ ('extra_parameters', models.JSONField(blank=True, null=True)),
602
+ ('chained_rules', models.ManyToManyField(related_name='calling_rules', to='endoreg_db.casetemplaterule')),
603
+ ('rule_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.casetemplateruletype')),
604
+ ('value_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.casetemplaterulevaluetype')),
605
+ ('date_value_distribution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.datevaluedistribution')),
606
+ ('multiple_categorical_value_distribution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.multiplecategoricalvaluedistribution')),
607
+ ('numerical_value_distribution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.numericvaluedistribution')),
608
+ ('single_categorical_value_distribution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.singlecategoricalvaluedistribution')),
890
609
  ],
891
610
  ),
892
611
  migrations.CreateModel(
893
- name='Ruleset',
612
+ name='CaseTemplate',
894
613
  fields=[
895
614
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
896
615
  ('name', models.CharField(max_length=255, unique=True)),
897
- ('name_de', models.CharField(blank=True, max_length=255, null=True)),
898
- ('name_en', models.CharField(blank=True, max_length=255, null=True)),
899
- ('rules', models.ManyToManyField(to='endoreg_db.rule')),
616
+ ('description', models.TextField(blank=True, null=True)),
617
+ ('rules', models.ManyToManyField(to='endoreg_db.casetemplaterule')),
618
+ ('secondary_rules', models.ManyToManyField(related_name='secondary_rules', to='endoreg_db.casetemplaterule')),
619
+ ('template_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='case_templates', to='endoreg_db.casetemplatetype')),
900
620
  ],
901
621
  ),
902
- migrations.AddField(
903
- model_name='rule',
904
- name='attribute_dtype',
905
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.ruleattributedtype'),
906
- ),
907
- migrations.AddField(
908
- model_name='rule',
909
- name='rule_type',
910
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.ruletype'),
911
- ),
912
622
  migrations.CreateModel(
913
- name='ReportReaderConfig',
623
+ name='DiseaseClassification',
914
624
  fields=[
915
625
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
916
- ('locale', models.CharField(default='de_DE', max_length=10)),
917
- ('text_date_format', models.CharField(default='%d.%m.%Y', max_length=10)),
918
- ('cut_off_above', models.ManyToManyField(related_name='report_reader_configs_cut_off_above', to='endoreg_db.reportreaderflag')),
919
- ('cut_off_below', models.ManyToManyField(related_name='report_reader_configs_cut_off_below', to='endoreg_db.reportreaderflag')),
920
- ('endoscope_info_line_flag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='report_reader_configs_endoscope_info_line', to='endoreg_db.reportreaderflag')),
921
- ('examiner_info_line_flag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='report_reader_configs_examiner_info_line', to='endoreg_db.reportreaderflag')),
922
- ('first_names', models.ManyToManyField(related_name='report_reader_configs', to='endoreg_db.firstname')),
923
- ('last_names', models.ManyToManyField(related_name='report_reader_configs', to='endoreg_db.lastname')),
924
- ('patient_info_line_flag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='report_reader_configs_patient_info_line', to='endoreg_db.reportreaderflag')),
626
+ ('name', models.CharField(max_length=255, unique=True)),
627
+ ('disease', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='disease_classifications', to='endoreg_db.disease')),
925
628
  ],
926
629
  ),
927
630
  migrations.CreateModel(
928
- name='ReportFile',
631
+ name='DiseaseClassificationChoice',
929
632
  fields=[
930
633
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
931
- ('pdf', models.FileField(blank=True, null=True, upload_to='raw_report_pdfs')),
932
- ('pdf_hash', models.CharField(max_length=255, unique=True)),
933
- ('meta', models.JSONField(blank=True, null=True)),
934
- ('text', models.TextField(blank=True, null=True)),
935
- ('text_anonymized', models.TextField(blank=True, null=True)),
936
- ('date', models.DateField(blank=True, null=True)),
937
- ('time', models.TimeField(blank=True, null=True)),
938
- ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
939
- ('examiner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.examiner')),
940
- ('patient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient')),
634
+ ('name', models.CharField(max_length=255, unique=True)),
635
+ ('disease_classification', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='disease_classification_choices', to='endoreg_db.diseaseclassification')),
941
636
  ],
942
637
  ),
943
638
  migrations.CreateModel(
944
- name='ReferenceProduct',
639
+ name='Endoscope',
945
640
  fields=[
946
641
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
947
642
  ('name', models.CharField(max_length=255)),
948
- ('emission_factor_package', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reference_product_package', to='endoreg_db.emissionfactor')),
949
- ('emission_factor_product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reference_product_product', to='endoreg_db.emissionfactor')),
950
- ('emission_factor_total', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.emissionfactor')),
951
- ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.product')),
952
- ('product_group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='reference_product', to='endoreg_db.productgroup')),
953
- ],
954
- ),
955
- migrations.CreateModel(
956
- name='RawVideoFile',
957
- fields=[
958
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
959
- ('uuid', models.UUIDField()),
960
- ('file', models.FileField(upload_to='raw_data/')),
961
- ('original_file_name', models.CharField(max_length=255)),
962
- ('video_hash', models.CharField(max_length=255, unique=True)),
963
- ('uploaded_at', models.DateTimeField(auto_now_add=True)),
964
- ('state_frames_required', models.BooleanField(default=True)),
965
- ('state_frames_extracted', models.BooleanField(default=False)),
966
- ('state_initial_prediction_required', models.BooleanField(default=True)),
967
- ('state_initial_prediction_completed', models.BooleanField(default=False)),
968
- ('state_initial_prediction_import_required', models.BooleanField(default=True)),
969
- ('state_initial_prediction_import_completed', models.BooleanField(default=False)),
970
- ('state_ocr_required', models.BooleanField(default=True)),
971
- ('state_ocr_completed', models.BooleanField(default=False)),
972
- ('state_outside_validated', models.BooleanField(default=False)),
973
- ('state_ocr_result_validated', models.BooleanField(default=False)),
974
- ('state_sensitive_data_retrieved', models.BooleanField(default=False)),
975
- ('state_histology_required', models.BooleanField(blank=True, null=True)),
976
- ('state_histology_available', models.BooleanField(default=False)),
977
- ('state_follow_up_intervention_required', models.BooleanField(blank=True, null=True)),
978
- ('state_follow_up_intervention_available', models.BooleanField(default=False)),
979
- ('state_dataset_complete', models.BooleanField(default=False)),
980
- ('state_anonym_video_required', models.BooleanField(default=True)),
981
- ('state_anonym_video_performed', models.BooleanField(default=False)),
982
- ('state_original_reports_deleted', models.BooleanField(default=False)),
983
- ('state_original_video_deleted', models.BooleanField(default=False)),
984
- ('state_finalized', models.BooleanField(default=False)),
985
- ('frame_dir', models.CharField(max_length=255)),
986
- ('prediction_dir', models.CharField(max_length=255)),
987
- ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
988
- ('processor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.endoscopyprocessor')),
989
- ('sensitive_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.sensitivemeta')),
990
- ('video_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.videometa')),
991
- ],
992
- ),
993
- migrations.CreateModel(
994
- name='RawPdfFile',
995
- fields=[
996
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
997
- ('file', models.FileField(storage=django.core.files.storage.FileSystemStorage(location='/home/agl-admin/agl-monitor/agl_monitor/agl_monitor/erc_data/raw_pdf'), upload_to='raw_pdf/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['pdf'])])),
998
- ('pdf_hash', models.CharField(max_length=255, unique=True)),
999
- ('state_report_processing_required', models.BooleanField(default=True)),
1000
- ('state_report_processed', models.BooleanField(default=False)),
1001
- ('text', models.TextField(blank=True, null=True)),
1002
- ('anonymized_text', models.TextField(blank=True, null=True)),
1003
- ('raw_meta', models.JSONField(blank=True, null=True)),
1004
- ('created_at', models.DateTimeField(auto_now_add=True)),
1005
- ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
1006
- ('pdf_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.pdftype')),
1007
- ('sensitive_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='raw_pdf_file', to='endoreg_db.sensitivemeta')),
1008
- ],
1009
- ),
1010
- migrations.CreateModel(
1011
- name='QuizQuestion',
1012
- fields=[
1013
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1014
- ('text', models.TextField()),
1015
- ('description', models.TextField(blank=True, null=True)),
1016
- ('question_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.quizquestiontype')),
643
+ ('sn', models.CharField(max_length=255)),
644
+ ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='endoscopes', to='endoreg_db.center')),
645
+ ('endoscope_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='endoscopes', to='endoreg_db.endoscopetype')),
1017
646
  ],
647
+ options={
648
+ 'verbose_name': 'Endoscope',
649
+ 'verbose_name_plural': 'Endoscopes',
650
+ 'ordering': ['name'],
651
+ },
1018
652
  ),
1019
653
  migrations.CreateModel(
1020
- name='QuizAnswer',
654
+ name='EndoscopyProcessor',
1021
655
  fields=[
1022
656
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1023
- ('text_value', models.CharField(blank=True, max_length=255, null=True)),
1024
- ('number_value', models.FloatField(blank=True, null=True)),
1025
- ('last_updated', models.DateTimeField(auto_now=True)),
1026
- ('answer_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.quizanswertype')),
1027
- ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.quizquestion')),
1028
- ],
1029
- ),
1030
- migrations.CreateModel(
1031
- name='ProductWeight',
657
+ ('name', models.CharField(max_length=255)),
658
+ ('image_width', models.IntegerField()),
659
+ ('image_height', models.IntegerField()),
660
+ ('endoscope_image_x', models.IntegerField()),
661
+ ('endoscope_image_y', models.IntegerField()),
662
+ ('endoscope_image_width', models.IntegerField()),
663
+ ('endoscope_image_height', models.IntegerField()),
664
+ ('examination_date_x', models.IntegerField()),
665
+ ('examination_date_y', models.IntegerField()),
666
+ ('examination_date_width', models.IntegerField()),
667
+ ('examination_date_height', models.IntegerField()),
668
+ ('examination_time_x', models.IntegerField(blank=True, null=True)),
669
+ ('examination_time_y', models.IntegerField(blank=True, null=True)),
670
+ ('examination_time_width', models.IntegerField(blank=True, null=True)),
671
+ ('examination_time_height', models.IntegerField(blank=True, null=True)),
672
+ ('patient_first_name_x', models.IntegerField()),
673
+ ('patient_first_name_y', models.IntegerField()),
674
+ ('patient_first_name_width', models.IntegerField()),
675
+ ('patient_first_name_height', models.IntegerField()),
676
+ ('patient_last_name_x', models.IntegerField()),
677
+ ('patient_last_name_y', models.IntegerField()),
678
+ ('patient_last_name_width', models.IntegerField()),
679
+ ('patient_last_name_height', models.IntegerField()),
680
+ ('patient_dob_x', models.IntegerField()),
681
+ ('patient_dob_y', models.IntegerField()),
682
+ ('patient_dob_width', models.IntegerField()),
683
+ ('patient_dob_height', models.IntegerField()),
684
+ ('endoscope_type_x', models.IntegerField(blank=True, null=True)),
685
+ ('endoscope_type_y', models.IntegerField(blank=True, null=True)),
686
+ ('endoscope_type_width', models.IntegerField(blank=True, null=True)),
687
+ ('endoscope_type_height', models.IntegerField(blank=True, null=True)),
688
+ ('endoscope_sn_x', models.IntegerField(blank=True, null=True)),
689
+ ('endoscope_sn_y', models.IntegerField(blank=True, null=True)),
690
+ ('endoscope_sn_width', models.IntegerField(blank=True, null=True)),
691
+ ('endoscope_sn_height', models.IntegerField(blank=True, null=True)),
692
+ ('centers', models.ManyToManyField(blank=True, related_name='endoscopy_processors', to='endoreg_db.center')),
693
+ ],
694
+ ),
695
+ migrations.CreateModel(
696
+ name='Event',
697
+ fields=[
698
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
699
+ ('name', models.CharField(max_length=100, unique=True)),
700
+ ('description', models.TextField(blank=True, null=True)),
701
+ ('event_classification', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='events', to='endoreg_db.eventclassification')),
702
+ ],
703
+ ),
704
+ migrations.CreateModel(
705
+ name='EventClassificationChoice',
706
+ fields=[
707
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
708
+ ('name', models.CharField(max_length=255, unique=True)),
709
+ ('subcategories', models.JSONField(default=dict)),
710
+ ('numerical_descriptors', models.JSONField(default=dict)),
711
+ ('event_classification', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='event_classification_choices', to='endoreg_db.eventclassification')),
712
+ ],
713
+ ),
714
+ migrations.CreateModel(
715
+ name='ExaminationIndicationClassification',
716
+ fields=[
717
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
718
+ ('name', models.CharField(max_length=255, unique=True)),
719
+ ('description', models.TextField(blank=True, null=True)),
720
+ ('examinations', models.ManyToManyField(blank=True, related_name='indication_classifications', to='endoreg_db.examination')),
721
+ ],
722
+ ),
723
+ migrations.CreateModel(
724
+ name='ExaminationIndicationClassificationChoice',
725
+ fields=[
726
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
727
+ ('name', models.CharField(max_length=255, unique=True)),
728
+ ('subcategories', models.JSONField(default=dict)),
729
+ ('numerical_descriptors', models.JSONField(default=dict)),
730
+ ('classification', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='choices', to='endoreg_db.examinationindicationclassification')),
731
+ ],
732
+ ),
733
+ migrations.CreateModel(
734
+ name='ExaminationRequirementSet',
735
+ fields=[
736
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
737
+ ('enabled_by_default', models.BooleanField(default=False)),
738
+ ('name', models.CharField(max_length=100, unique=True)),
739
+ ('examinations', models.ManyToManyField(blank=True, related_name='exam_reqset_links', to='endoreg_db.examination')),
740
+ ],
741
+ ),
742
+ migrations.CreateModel(
743
+ name='ExaminationTimeType',
744
+ fields=[
745
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
746
+ ('name', models.CharField(max_length=100, unique=True)),
747
+ ('examinations', models.ManyToManyField(blank=True, to='endoreg_db.examination')),
748
+ ],
749
+ options={
750
+ 'verbose_name': 'Examination Time Type',
751
+ 'verbose_name_plural': 'Examination Time Types',
752
+ 'ordering': ['name'],
753
+ },
754
+ ),
755
+ migrations.CreateModel(
756
+ name='ExaminationTime',
757
+ fields=[
758
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
759
+ ('name', models.CharField(max_length=100, unique=True)),
760
+ ('start_time', models.TimeField(blank=True, null=True)),
761
+ ('end_time', models.TimeField(blank=True, null=True)),
762
+ ('time_types', models.ManyToManyField(blank=True, to='endoreg_db.examinationtimetype')),
763
+ ],
764
+ options={
765
+ 'verbose_name': 'Examination Time',
766
+ 'verbose_name_plural': 'Examination Times',
767
+ 'ordering': ['name'],
768
+ },
769
+ ),
770
+ migrations.AddField(
771
+ model_name='examination',
772
+ name='examination_types',
773
+ field=models.ManyToManyField(blank=True, to='endoreg_db.examinationtype'),
774
+ ),
775
+ migrations.CreateModel(
776
+ name='Examiner',
777
+ fields=[
778
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
779
+ ('first_name', models.CharField(max_length=255)),
780
+ ('last_name', models.CharField(max_length=255)),
781
+ ('dob', models.DateField(blank=True, null=True, verbose_name='Date of Birth')),
782
+ ('email', models.EmailField(blank=True, max_length=255, null=True)),
783
+ ('phone', models.CharField(blank=True, max_length=255, null=True)),
784
+ ('is_real_person', models.BooleanField(default=True)),
785
+ ('hash', models.CharField(max_length=255, unique=True)),
786
+ ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
787
+ ('gender', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.gender')),
788
+ ],
789
+ options={
790
+ 'abstract': False,
791
+ },
792
+ ),
793
+ migrations.CreateModel(
794
+ name='FindingIntervention',
795
+ fields=[
796
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
797
+ ('name', models.CharField(max_length=100, unique=True)),
798
+ ('name_de', models.CharField(max_length=100, null=True, unique=True)),
799
+ ('name_en', models.CharField(max_length=100, null=True, unique=True)),
800
+ ('description', models.TextField(blank=True, null=True)),
801
+ ('description_de', models.TextField(blank=True, null=True)),
802
+ ('description_en', models.TextField(blank=True, null=True)),
803
+ ('contraindications', models.ManyToManyField(blank=True, related_name='contraindicating_finding_interventions', to='endoreg_db.contraindication')),
804
+ ('intervention_types', models.ManyToManyField(blank=True, related_name='interventions', to='endoreg_db.findinginterventiontype')),
805
+ ],
806
+ ),
807
+ migrations.CreateModel(
808
+ name='Finding',
809
+ fields=[
810
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
811
+ ('name', models.CharField(max_length=100, unique=True)),
812
+ ('name_de', models.CharField(max_length=100, null=True, unique=True)),
813
+ ('name_en', models.CharField(max_length=100, null=True, unique=True)),
814
+ ('description', models.TextField(blank=True, null=True)),
815
+ ('description_de', models.TextField(blank=True, null=True)),
816
+ ('description_en', models.TextField(blank=True, null=True)),
817
+ ('examinations', models.ManyToManyField(blank=True, related_name='findings', to='endoreg_db.examination')),
818
+ ('finding_interventions', models.ManyToManyField(blank=True, related_name='findings', to='endoreg_db.findingintervention')),
819
+ ('finding_types', models.ManyToManyField(blank=True, related_name='findings', to='endoreg_db.findingtype')),
820
+ ],
821
+ ),
822
+ migrations.CreateModel(
823
+ name='ExaminationIndication',
824
+ fields=[
825
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
826
+ ('name', models.CharField(max_length=255, unique=True)),
827
+ ('description', models.TextField(blank=True, null=True)),
828
+ ('examinations', models.ManyToManyField(blank=True, related_name='indications', to='endoreg_db.examination')),
829
+ ('classifications', models.ManyToManyField(blank=True, related_name='indications', to='endoreg_db.examinationindicationclassification')),
830
+ ('expected_interventions', models.ManyToManyField(blank=True, related_name='indications', to='endoreg_db.findingintervention')),
831
+ ],
832
+ ),
833
+ migrations.CreateModel(
834
+ name='FindingClassification',
835
+ fields=[
836
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
837
+ ('name', models.CharField(max_length=255, unique=True)),
838
+ ('name_de', models.CharField(max_length=255, null=True, unique=True)),
839
+ ('name_en', models.CharField(max_length=255, null=True, unique=True)),
840
+ ('description', models.TextField(blank=True)),
841
+ ('description_de', models.TextField(blank=True, null=True)),
842
+ ('description_en', models.TextField(blank=True, null=True)),
843
+ ('examinations', models.ManyToManyField(blank=True, related_name='finding_classifications', to='endoreg_db.examination')),
844
+ ('findings', models.ManyToManyField(blank=True, related_name='finding_classifications', to='endoreg_db.finding')),
845
+ ('choices', models.ManyToManyField(blank=True, related_name='classifications', to='endoreg_db.findingclassificationchoice')),
846
+ ('classification_types', models.ManyToManyField(to='endoreg_db.findingclassificationtype')),
847
+ ('finding_types', models.ManyToManyField(blank=True, related_name='finding_classifications', to='endoreg_db.findingtype')),
848
+ ],
849
+ ),
850
+ migrations.AddField(
851
+ model_name='center',
852
+ name='first_names',
853
+ field=models.ManyToManyField(related_name='centers', to='endoreg_db.firstname'),
854
+ ),
855
+ migrations.CreateModel(
856
+ name='Employee',
857
+ fields=[
858
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
859
+ ('first_name', models.CharField(max_length=255)),
860
+ ('last_name', models.CharField(max_length=255)),
861
+ ('dob', models.DateField(blank=True, null=True, verbose_name='Date of Birth')),
862
+ ('email', models.EmailField(blank=True, max_length=255, null=True)),
863
+ ('phone', models.CharField(blank=True, max_length=255, null=True)),
864
+ ('is_real_person', models.BooleanField(default=True)),
865
+ ('employee_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='employees', to='endoreg_db.employeetype')),
866
+ ('gender', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.gender')),
867
+ ],
868
+ options={
869
+ 'abstract': False,
870
+ },
871
+ ),
872
+ migrations.CreateModel(
873
+ name='InformationSource',
874
+ fields=[
875
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
876
+ ('name', models.CharField(max_length=100)),
877
+ ('url', models.URLField(blank=True, null=True)),
878
+ ('description', models.TextField(blank=True, null=True)),
879
+ ('date', models.DateField(blank=True, null=True)),
880
+ ('date_created', models.DateField(auto_now_add=True)),
881
+ ('date_modified', models.DateField(auto_now=True)),
882
+ ('abbreviation', models.CharField(blank=True, max_length=100, null=True, unique=True)),
883
+ ],
884
+ options={
885
+ 'verbose_name': 'Information Source',
886
+ 'verbose_name_plural': 'Information Sources',
887
+ 'indexes': [models.Index(fields=['name'], name='endoreg_db__name_febac5_idx'), models.Index(fields=['abbreviation'], name='endoreg_db__abbrevi_5a07c4_idx')],
888
+ },
889
+ ),
890
+ migrations.CreateModel(
891
+ name='InformationSourceType',
892
+ fields=[
893
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
894
+ ('name', models.CharField(max_length=100, unique=True)),
895
+ ('description', models.TextField(blank=True, null=True)),
896
+ ('information_sources', models.ManyToManyField(blank=True, related_name='information_source_types', to='endoreg_db.informationsource')),
897
+ ],
898
+ options={
899
+ 'verbose_name': 'Information Source Type',
900
+ 'verbose_name_plural': 'Information Source Types',
901
+ },
902
+ ),
903
+ migrations.CreateModel(
904
+ name='LabelSet',
905
+ fields=[
906
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
907
+ ('name', models.CharField(max_length=255)),
908
+ ('description', models.TextField(blank=True, null=True)),
909
+ ('version', models.IntegerField()),
910
+ ('labels', models.ManyToManyField(related_name='label_sets', to='endoreg_db.label')),
911
+ ],
912
+ ),
913
+ migrations.AddField(
914
+ model_name='label',
915
+ name='label_type',
916
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='labels', to='endoreg_db.labeltype'),
917
+ ),
918
+ migrations.CreateModel(
919
+ name='LabelVideoSegment',
920
+ fields=[
921
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
922
+ ('start_frame_number', models.IntegerField()),
923
+ ('end_frame_number', models.IntegerField()),
924
+ ('label', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.label')),
925
+ ('source', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.informationsource')),
926
+ ],
927
+ ),
928
+ migrations.CreateModel(
929
+ name='LabelVideoSegmentState',
930
+ fields=[
931
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
932
+ ('created_at', models.DateTimeField(auto_now_add=True)),
933
+ ('updated_at', models.DateTimeField(auto_now=True)),
934
+ ('prediction', models.BooleanField(default=False)),
935
+ ('annotation', models.BooleanField(default=False)),
936
+ ('frames_extracted', models.BooleanField(default=False)),
937
+ ('is_validated', models.BooleanField(default=False)),
938
+ ('origin', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='state', to='endoreg_db.labelvideosegment')),
939
+ ],
940
+ options={
941
+ 'verbose_name': 'Label Video Segment State',
942
+ 'verbose_name_plural': 'Label Video Segment States',
943
+ },
944
+ ),
945
+ migrations.CreateModel(
946
+ name='LabValue',
947
+ fields=[
948
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
949
+ ('name', models.CharField(max_length=255, unique=True)),
950
+ ('abbreviation', models.CharField(blank=True, max_length=10, null=True)),
951
+ ('numeric_precision', models.IntegerField(default=3)),
952
+ ('default_normal_range', models.JSONField(blank=True, null=True)),
953
+ ('normal_range_age_dependent', models.BooleanField(default=False)),
954
+ ('normal_range_gender_dependent', models.BooleanField(default=False)),
955
+ ('normal_range_special_case', models.BooleanField(default=False)),
956
+ ('bound_adjustment_factor', models.FloatField(default=0.1, help_text='Factor for adjusting bounds when generating increased/decreased values, e.g., 0.1 for 10%.')),
957
+ ('default_date_value_distribution', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_date_value_distribution', to='endoreg_db.datevaluedistribution')),
958
+ ('default_multiple_categorical_value_distribution', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_multiple_categorical_value_distribution', to='endoreg_db.multiplecategoricalvaluedistribution')),
959
+ ('default_numerical_value_distribution', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_numerical_value_distribution', to='endoreg_db.numericvaluedistribution')),
960
+ ('default_single_categorical_value_distribution', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_single_categorical_value_distribution', to='endoreg_db.singlecategoricalvaluedistribution')),
961
+ ('default_unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit')),
962
+ ],
963
+ ),
964
+ migrations.AddField(
965
+ model_name='findingintervention',
966
+ name='required_lab_values',
967
+ field=models.ManyToManyField(blank=True, related_name='required_by_finding_interventions', to='endoreg_db.labvalue'),
968
+ ),
969
+ migrations.AddField(
970
+ model_name='center',
971
+ name='last_names',
972
+ field=models.ManyToManyField(related_name='centers', to='endoreg_db.lastname'),
973
+ ),
974
+ migrations.CreateModel(
975
+ name='Material',
976
+ fields=[
977
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
978
+ ('name', models.CharField(max_length=255)),
979
+ ('emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.emissionfactor')),
980
+ ],
981
+ ),
982
+ migrations.CreateModel(
983
+ name='MedicationSchedule',
984
+ fields=[
985
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
986
+ ('name', models.CharField(max_length=255, unique=True)),
987
+ ('description', models.TextField(blank=True, null=True)),
988
+ ('therapy_duration_d', models.FloatField(blank=True, null=True)),
989
+ ('dose', models.FloatField()),
990
+ ('intake_times', models.ManyToManyField(to='endoreg_db.medicationintaketime')),
991
+ ('medication', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.medication')),
992
+ ('unit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit')),
993
+ ],
994
+ ),
995
+ migrations.CreateModel(
996
+ name='MedicationIndication',
997
+ fields=[
998
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
999
+ ('name', models.CharField(max_length=255, unique=True)),
1000
+ ('disease_classification_choices', models.ManyToManyField(to='endoreg_db.diseaseclassificationchoice')),
1001
+ ('diseases', models.ManyToManyField(to='endoreg_db.disease')),
1002
+ ('events', models.ManyToManyField(to='endoreg_db.event')),
1003
+ ('sources', models.ManyToManyField(to='endoreg_db.informationsource')),
1004
+ ('indication_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='medication_indications', to='endoreg_db.medicationindicationtype')),
1005
+ ('medication_schedules', models.ManyToManyField(to='endoreg_db.medicationschedule')),
1006
+ ],
1007
+ ),
1008
+ migrations.CreateModel(
1009
+ name='ModelMeta',
1010
+ fields=[
1011
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1012
+ ('name', models.CharField(help_text="User-defined name for this specific model metadata set (e.g., 'segmentation_base').", max_length=255)),
1013
+ ('version', models.CharField(help_text="Version identifier for this metadata set (e.g., '1', '2a').", max_length=255)),
1014
+ ('activation', models.CharField(default='sigmoid', help_text="Output activation function (e.g., 'sigmoid', 'softmax', 'none').", max_length=50)),
1015
+ ('weights', models.FileField(blank=True, help_text='Path to the model weights file (.ckpt), relative to MEDIA_ROOT.', null=True, upload_to='model_weights', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['ckpt'])])),
1016
+ ('mean', models.CharField(default='0.45211223,0.27139644,0.19264949', help_text='Comma-separated mean values for input normalization.', max_length=255)),
1017
+ ('std', models.CharField(default='0.31418097,0.21088019,0.16059452', help_text='Comma-separated standard deviation values for input normalization.', max_length=255)),
1018
+ ('size_x', models.IntegerField(default=716, help_text='Expected input image width.')),
1019
+ ('size_y', models.IntegerField(default=716, help_text='Expected input image height.')),
1020
+ ('axes', models.CharField(default='2,0,1', help_text="Comma-separated target axis order (e.g., '2,0,1' for CHW).", max_length=10)),
1021
+ ('batchsize', models.IntegerField(default=16, help_text='Default batch size for inference.')),
1022
+ ('num_workers', models.IntegerField(default=0, help_text='Default number of workers for data loading.')),
1023
+ ('description', models.TextField(blank=True, help_text='Optional description.', null=True)),
1024
+ ('date_created', models.DateTimeField(auto_now_add=True)),
1025
+ ('labelset', models.ForeignKey(help_text='The set of labels this model version predicts.', on_delete=django.db.models.deletion.CASCADE, related_name='model_metadata', to='endoreg_db.labelset')),
1026
+ ('model', models.ForeignKey(help_text='The base AI model architecture this metadata belongs to.', on_delete=django.db.models.deletion.CASCADE, related_name='metadata_versions', to='endoreg_db.aimodel')),
1027
+ ],
1028
+ ),
1029
+ migrations.AddField(
1030
+ model_name='aimodel',
1031
+ name='active_meta',
1032
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='active_model', to='endoreg_db.modelmeta'),
1033
+ ),
1034
+ migrations.CreateModel(
1035
+ name='ActiveModel',
1036
+ fields=[
1037
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1038
+ ('name', models.CharField(max_length=255, unique=True)),
1039
+ ('model_meta', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.modelmeta')),
1040
+ ],
1041
+ ),
1042
+ migrations.AddField(
1043
+ model_name='aimodel',
1044
+ name='model_type',
1045
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ai_models', to='endoreg_db.modeltype'),
1046
+ ),
1047
+ migrations.CreateModel(
1048
+ name='Organ',
1049
+ fields=[
1050
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1051
+ ('name', models.CharField(max_length=100, unique=True)),
1052
+ ('description', models.TextField(blank=True, null=True)),
1053
+ ('location_choices', models.ManyToManyField(blank=True, related_name='organs', to='endoreg_db.findingclassificationchoice')),
1054
+ ],
1055
+ ),
1056
+ migrations.CreateModel(
1057
+ name='Patient',
1058
+ fields=[
1059
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1060
+ ('email', models.EmailField(blank=True, max_length=255, null=True)),
1061
+ ('phone', models.CharField(blank=True, max_length=255, null=True)),
1062
+ ('is_real_person', models.BooleanField(default=True)),
1063
+ ('first_name', models.CharField(max_length=100)),
1064
+ ('last_name', models.CharField(max_length=100)),
1065
+ ('dob', models.DateField(blank=True, null=True)),
1066
+ ('patient_hash', models.CharField(blank=True, max_length=255, null=True)),
1067
+ ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.center')),
1068
+ ('gender', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.gender')),
1069
+ ],
1070
+ options={
1071
+ 'abstract': False,
1072
+ },
1073
+ ),
1074
+ migrations.CreateModel(
1075
+ name='PatientDisease',
1032
1076
  fields=[
1033
1077
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1034
- ('name', models.CharField(max_length=255, null=True)),
1035
- ('measured', models.FloatField(null=True)),
1036
- ('verified', models.FloatField(null=True)),
1037
- ('manufacturer', models.FloatField(null=True)),
1038
- ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.product')),
1039
- ('unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit')),
1078
+ ('start_date', models.DateField(blank=True, null=True)),
1079
+ ('end_date', models.DateField(blank=True, null=True)),
1080
+ ('numerical_descriptors', models.JSONField(default=dict)),
1081
+ ('subcategories', models.JSONField(default=dict)),
1082
+ ('last_update', models.DateTimeField(auto_now=True)),
1083
+ ('classification_choices', models.ManyToManyField(to='endoreg_db.diseaseclassificationchoice')),
1084
+ ('disease', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='patient_diseases', to='endoreg_db.disease')),
1085
+ ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='diseases', to='endoreg_db.patient')),
1040
1086
  ],
1087
+ options={
1088
+ 'verbose_name': 'Patient Disease',
1089
+ 'verbose_name_plural': 'Patient Diseases',
1090
+ },
1041
1091
  ),
1042
1092
  migrations.CreateModel(
1043
- name='ProductMaterial',
1093
+ name='PatientEvent',
1044
1094
  fields=[
1045
1095
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1046
- ('component', models.CharField(max_length=255)),
1047
- ('quantity', models.FloatField()),
1048
- ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.material')),
1049
- ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='product_materials', to='endoreg_db.product')),
1050
- ('unit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit')),
1096
+ ('date_start', models.DateField()),
1097
+ ('date_end', models.DateField(blank=True, null=True)),
1098
+ ('description', models.TextField(blank=True, null=True)),
1099
+ ('subcategories', models.JSONField(default=dict)),
1100
+ ('numerical_descriptors', models.JSONField(default=dict)),
1101
+ ('last_update', models.DateTimeField(auto_now=True)),
1102
+ ('classification_choice', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.eventclassificationchoice')),
1103
+ ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='patient_events', to='endoreg_db.event')),
1104
+ ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='events', to='endoreg_db.patient')),
1051
1105
  ],
1052
1106
  ),
1053
- migrations.AddField(
1054
- model_name='product',
1055
- name='product_group',
1056
- field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.productgroup'),
1107
+ migrations.CreateModel(
1108
+ name='PatientExamination',
1109
+ fields=[
1110
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1111
+ ('date_start', models.DateField(blank=True, null=True)),
1112
+ ('date_end', models.DateField(blank=True, null=True)),
1113
+ ('hash', models.CharField(max_length=255, unique=True)),
1114
+ ('examination', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.examination')),
1115
+ ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='patient_examinations', to='endoreg_db.patient')),
1116
+ ],
1117
+ options={
1118
+ 'verbose_name': 'Patient Examination',
1119
+ 'verbose_name_plural': 'Patient Examinations',
1120
+ 'ordering': ['patient', 'examination', 'date_start'],
1121
+ },
1057
1122
  ),
1058
- migrations.AddField(
1059
- model_name='product',
1060
- name='transport_route',
1061
- field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.transportroute'),
1123
+ migrations.CreateModel(
1124
+ name='Case',
1125
+ fields=[
1126
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1127
+ ('hash', models.CharField(blank=True, help_text='An optional hash value associated with the case.', max_length=255, null=True)),
1128
+ ('start_date', models.DateTimeField(db_index=True, help_text='The start date and time of the case.')),
1129
+ ('end_date', models.DateTimeField(blank=True, help_text='The end date and time of the case (optional).', null=True)),
1130
+ ('is_active', models.BooleanField(db_index=True, default=True, help_text='Flag indicating if the case is currently active.')),
1131
+ ('is_closed', models.BooleanField(db_index=True, default=False, help_text='Flag indicating if the case has been closed.')),
1132
+ ('is_deleted', models.BooleanField(db_index=True, default=False, help_text='Flag indicating if the case is marked as deleted.')),
1133
+ ('created_at', models.DateTimeField(auto_now_add=True, help_text='The date and time the case was created.')),
1134
+ ('updated_at', models.DateTimeField(auto_now=True, help_text='The date and time the case was last updated.')),
1135
+ ('patient', models.ForeignKey(help_text='The patient associated with this case.', on_delete=django.db.models.deletion.CASCADE, related_name='cases', to='endoreg_db.patient')),
1136
+ ('patient_examinations', models.ManyToManyField(help_text='The examinations included in this case.', related_name='cases', to='endoreg_db.patientexamination')),
1137
+ ],
1138
+ options={
1139
+ 'verbose_name': 'Case',
1140
+ 'verbose_name_plural': 'Cases',
1141
+ 'ordering': ['-start_date', 'patient'],
1142
+ },
1062
1143
  ),
1063
1144
  migrations.CreateModel(
1064
- name='PortalUserInfo',
1145
+ name='AnonymExaminationReport',
1065
1146
  fields=[
1066
1147
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1067
- ('works_in_endoscopy', models.BooleanField(blank=True, null=True)),
1068
- ('profession', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.profession')),
1069
- ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
1148
+ ('meta', models.JSONField(blank=True, null=True)),
1149
+ ('text', models.TextField(blank=True, null=True)),
1150
+ ('date', models.DateField(blank=True, null=True)),
1151
+ ('time', models.TimeField(blank=True, null=True)),
1152
+ ('file', models.FileField(blank=True, null=True, upload_to=pathlib.PurePosixPath('pdfs'))),
1153
+ ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.center')),
1154
+ ('type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.documenttype')),
1155
+ ('examiners', models.ManyToManyField(blank=True, to='endoreg_db.examiner')),
1156
+ ('patient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='endoreg_db.patient')),
1157
+ ('patient_examination', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.patientexamination')),
1070
1158
  ],
1159
+ options={
1160
+ 'abstract': False,
1161
+ },
1071
1162
  ),
1072
- migrations.AddField(
1073
- model_name='pdftype',
1074
- name='cut_off_above_lines',
1075
- field=models.ManyToManyField(related_name='pdf_type_cut_off_above_lines', to='endoreg_db.reportreaderflag'),
1163
+ migrations.CreateModel(
1164
+ name='PatientExaminationIndication',
1165
+ fields=[
1166
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1167
+ ('examination_indication', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.examinationindication')),
1168
+ ('indication_choice', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.examinationindicationclassificationchoice')),
1169
+ ('patient_examination', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='indications', to='endoreg_db.patientexamination')),
1170
+ ],
1076
1171
  ),
1077
- migrations.AddField(
1078
- model_name='pdftype',
1079
- name='cut_off_below_lines',
1080
- field=models.ManyToManyField(related_name='pdf_type_cut_off_below_lines', to='endoreg_db.reportreaderflag'),
1172
+ migrations.CreateModel(
1173
+ name='PatientFinding',
1174
+ fields=[
1175
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1176
+ ('created_at', models.DateTimeField(auto_now_add=True)),
1177
+ ('updated_at', models.DateTimeField(auto_now=True)),
1178
+ ('is_active', models.BooleanField(default=True, help_text='Deaktiviert statt gelöscht für Audit-Trail')),
1179
+ ('deactivated_at', models.DateTimeField(blank=True, null=True)),
1180
+ ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='created_findings', to=settings.AUTH_USER_MODEL)),
1181
+ ('deactivated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='deactivated_findings', to=settings.AUTH_USER_MODEL)),
1182
+ ('finding', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='finding_patient_findings', to='endoreg_db.finding')),
1183
+ ('patient_examination', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='patient_findings', to='endoreg_db.patientexamination')),
1184
+ ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='updated_findings', to=settings.AUTH_USER_MODEL)),
1185
+ ],
1186
+ options={
1187
+ 'verbose_name': 'Patient Finding',
1188
+ 'verbose_name_plural': 'Patient Findings',
1189
+ 'ordering': ['patient_examination', 'finding'],
1190
+ },
1081
1191
  ),
1082
1192
  migrations.AddField(
1083
- model_name='pdftype',
1084
- name='endoscope_info_line',
1085
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pdf_type_endoscopy_info_line', to='endoreg_db.reportreaderflag'),
1193
+ model_name='labelvideosegment',
1194
+ name='patient_findings',
1195
+ field=models.ManyToManyField(blank=True, related_name='video_segments', to='endoreg_db.patientfinding'),
1086
1196
  ),
1087
- migrations.AddField(
1088
- model_name='pdftype',
1089
- name='examiner_info_line',
1090
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pdf_type_examiner_info_line', to='endoreg_db.reportreaderflag'),
1197
+ migrations.CreateModel(
1198
+ name='PatientFindingClassification',
1199
+ fields=[
1200
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1201
+ ('is_active', models.BooleanField(default=True, help_text='Indicates if the classification is currently active.')),
1202
+ ('subcategories', models.JSONField(blank=True, null=True)),
1203
+ ('numerical_descriptors', models.JSONField(blank=True, null=True)),
1204
+ ('classification', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='patient_finding_classifications', to='endoreg_db.findingclassification')),
1205
+ ('classification_choice', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='patient_finding_classifications', to='endoreg_db.findingclassificationchoice')),
1206
+ ('finding', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='classifications', to='endoreg_db.patientfinding')),
1207
+ ],
1208
+ options={
1209
+ 'verbose_name': 'Patient Finding Classification',
1210
+ 'verbose_name_plural': 'Patient Finding Classifications',
1211
+ 'ordering': ['finding', 'classification', 'classification_choice'],
1212
+ },
1091
1213
  ),
1092
- migrations.AddField(
1093
- model_name='pdftype',
1094
- name='patient_info_line',
1095
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pdf_type_patient_info_line', to='endoreg_db.reportreaderflag'),
1214
+ migrations.CreateModel(
1215
+ name='PatientFindingIntervention',
1216
+ fields=[
1217
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1218
+ ('is_active', models.BooleanField(default=True, help_text='Indicates if the intervention is currently active.')),
1219
+ ('state', models.CharField(blank=True, max_length=100, null=True)),
1220
+ ('time_start', models.DateTimeField(blank=True, null=True)),
1221
+ ('time_end', models.DateTimeField(blank=True, null=True)),
1222
+ ('date', models.DateField(blank=True, null=True)),
1223
+ ('finding', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interventions', to='endoreg_db.patientfinding')),
1224
+ ('intervention', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='patient_finding_interventions', to='endoreg_db.findingintervention')),
1225
+ ],
1096
1226
  ),
1097
1227
  migrations.CreateModel(
1098
- name='PdfMeta',
1228
+ name='PatientLabSample',
1099
1229
  fields=[
1100
1230
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1101
- ('date', models.DateField()),
1102
- ('time', models.TimeField()),
1103
- ('pdf_hash', models.CharField(max_length=255, unique=True)),
1104
- ('pdf_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.pdftype')),
1231
+ ('date', models.DateTimeField()),
1232
+ ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lab_samples', to='endoreg_db.patient')),
1233
+ ('sample_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patientlabsampletype')),
1105
1234
  ],
1106
1235
  ),
1236
+ migrations.CreateModel(
1237
+ name='PatientMedication',
1238
+ fields=[
1239
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1240
+ ('dosage', models.JSONField(blank=True, null=True)),
1241
+ ('active', models.BooleanField(default=True)),
1242
+ ('intake_times', models.ManyToManyField(blank=True, related_name='intake_time_patient_medications', to='endoreg_db.medicationintaketime')),
1243
+ ('medication', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='medication_patient_medications', to='endoreg_db.medication')),
1244
+ ('medication_indication', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='indication_patient_medications', to='endoreg_db.medicationindication')),
1245
+ ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient')),
1246
+ ('unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit')),
1247
+ ],
1248
+ options={
1249
+ 'verbose_name': 'Patient Medication',
1250
+ 'verbose_name_plural': 'Patient Medications',
1251
+ },
1252
+ ),
1107
1253
  migrations.CreateModel(
1108
1254
  name='PatientMedicationSchedule',
1109
1255
  fields=[
1110
1256
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1111
1257
  ('created_at', models.DateTimeField(auto_now_add=True)),
1112
1258
  ('updated_at', models.DateTimeField(auto_now=True)),
1113
- ('medication', models.ManyToManyField(related_name='patient_medication_schedules', to='endoreg_db.patientmedication')),
1259
+ ('medication', models.ManyToManyField(blank=True, related_name='patient_medication_schedules', to='endoreg_db.patientmedication')),
1114
1260
  ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient')),
1115
1261
  ],
1116
1262
  ),
1117
- migrations.AddField(
1118
- model_name='patientmedication',
1119
- name='unit',
1120
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit'),
1263
+ migrations.CreateModel(
1264
+ name='PdfMeta',
1265
+ fields=[
1266
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1267
+ ('date', models.DateField()),
1268
+ ('time', models.TimeField()),
1269
+ ('pdf_hash', models.CharField(max_length=255, unique=True)),
1270
+ ('pdf_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.pdftype')),
1271
+ ],
1121
1272
  ),
1122
1273
  migrations.CreateModel(
1123
- name='PatientLabValue',
1274
+ name='CenterProduct',
1124
1275
  fields=[
1125
1276
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1126
- ('value', models.FloatField(blank=True, null=True)),
1127
- ('value_str', models.CharField(blank=True, max_length=255, null=True)),
1128
- ('datetime', models.DateTimeField(auto_now_add=True)),
1129
- ('normal_range', models.JSONField(default=dict)),
1130
- ('lab_value', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.labvalue')),
1131
- ('patient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='lab_values', to='endoreg_db.patient')),
1132
- ('sample', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='values', to='endoreg_db.patientlabsample')),
1133
- ('unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit')),
1277
+ ('date_used', models.DateField()),
1278
+ ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='center_products', to='endoreg_db.center')),
1279
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='center_products', to='endoreg_db.product')),
1134
1280
  ],
1281
+ options={
1282
+ 'verbose_name': 'Center Product Usage',
1283
+ 'verbose_name_plural': 'Center Product Usages',
1284
+ 'ordering': ['center', '-date_used', 'product'],
1285
+ },
1135
1286
  ),
1136
1287
  migrations.AddField(
1137
- model_name='patientlabsample',
1138
- name='sample_type',
1139
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patientlabsampletype'),
1288
+ model_name='product',
1289
+ name='product_group',
1290
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='products', to='endoreg_db.productgroup'),
1140
1291
  ),
1141
1292
  migrations.CreateModel(
1142
- name='PatientExamination',
1293
+ name='PortalUserInfo',
1143
1294
  fields=[
1144
1295
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1145
- ('examination', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.examination')),
1146
- ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='patient_examinations', to='endoreg_db.patient')),
1147
- ('report_file', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='patient_examination', to='endoreg_db.reportfile')),
1148
- ('video', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='patient_examination', to='endoreg_db.video')),
1296
+ ('works_in_endoscopy', models.BooleanField(blank=True, null=True)),
1297
+ ('examiner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portal_user_info', to='endoreg_db.examiner')),
1298
+ ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
1299
+ ('profession', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portal_user_infos', to='endoreg_db.profession')),
1149
1300
  ],
1150
- options={
1151
- 'verbose_name': 'Patient Examination',
1152
- 'verbose_name_plural': 'Patient Examinations',
1153
- 'ordering': ['patient', 'examination'],
1154
- },
1301
+ ),
1302
+ migrations.AddField(
1303
+ model_name='employeetype',
1304
+ name='qualifications',
1305
+ field=models.ManyToManyField(related_name='employee_types', to='endoreg_db.qualification'),
1155
1306
  ),
1156
1307
  migrations.CreateModel(
1157
- name='PatientEvent',
1308
+ name='EmployeeQualification',
1158
1309
  fields=[
1159
1310
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1160
- ('date_start', models.DateField()),
1161
- ('date_end', models.DateField(blank=True, null=True)),
1162
- ('description', models.TextField(blank=True, null=True)),
1163
- ('last_update', models.DateTimeField(auto_now=True)),
1164
- ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.event')),
1165
- ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient')),
1311
+ ('employee', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='qualification', to='endoreg_db.employee')),
1312
+ ('qualifications', models.ManyToManyField(related_name='employee_qualifications', to='endoreg_db.qualification')),
1166
1313
  ],
1167
1314
  ),
1315
+ migrations.AddField(
1316
+ model_name='qualification',
1317
+ name='qualification_types',
1318
+ field=models.ManyToManyField(related_name='qualifications', to='endoreg_db.qualificationtype'),
1319
+ ),
1168
1320
  migrations.CreateModel(
1169
- name='PatientDisease',
1321
+ name='ReferenceProduct',
1170
1322
  fields=[
1171
1323
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1172
- ('start_date', models.DateField(blank=True, null=True)),
1173
- ('end_date', models.DateField(blank=True, null=True)),
1174
- ('last_update', models.DateTimeField(auto_now=True)),
1175
- ('classification_choices', models.ManyToManyField(to='endoreg_db.diseaseclassificationchoice')),
1176
- ('disease', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.disease')),
1177
- ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient')),
1324
+ ('name', models.CharField(max_length=255)),
1325
+ ('emission_factor_package', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reference_product_package', to='endoreg_db.emissionfactor')),
1326
+ ('emission_factor_product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reference_product_product', to='endoreg_db.emissionfactor')),
1327
+ ('emission_factor_total', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reference_products', to='endoreg_db.emissionfactor')),
1328
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reference_products', to='endoreg_db.product')),
1329
+ ('product_group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='reference_product', to='endoreg_db.productgroup')),
1178
1330
  ],
1179
1331
  ),
1180
1332
  migrations.CreateModel(
1181
- name='NetworkDeviceLogEntry',
1333
+ name='ReportReaderConfig',
1182
1334
  fields=[
1183
1335
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1184
- ('timestamp', models.DateTimeField(auto_now_add=True)),
1185
- ('ip_address', models.GenericIPAddressField(blank=True, null=True)),
1186
- ('user_agent', models.CharField(blank=True, max_length=256, null=True)),
1187
- ('message', models.TextField()),
1188
- ('json_content', models.JSONField(blank=True, null=True)),
1189
- ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.networkdevice')),
1190
- ('log_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.logtype')),
1191
- ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
1336
+ ('locale', models.CharField(default='de_DE', max_length=10)),
1337
+ ('text_date_format', models.CharField(default='%d.%m.%Y', max_length=10)),
1338
+ ('first_names', models.ManyToManyField(related_name='report_reader_configs', to='endoreg_db.firstname')),
1339
+ ('last_names', models.ManyToManyField(related_name='report_reader_configs', to='endoreg_db.lastname')),
1340
+ ('cut_off_above', models.ManyToManyField(related_name='report_reader_configs_cut_off_above', to='endoreg_db.reportreaderflag')),
1341
+ ('cut_off_below', models.ManyToManyField(related_name='report_reader_configs_cut_off_below', to='endoreg_db.reportreaderflag')),
1342
+ ('endoscope_info_line_flag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='report_reader_configs_endoscope_info_line', to='endoreg_db.reportreaderflag')),
1343
+ ('examiner_info_line_flag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='report_reader_configs_examiner_info_line', to='endoreg_db.reportreaderflag')),
1344
+ ('patient_info_line_flag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='report_reader_configs_patient_info_line', to='endoreg_db.reportreaderflag')),
1192
1345
  ],
1193
- options={
1194
- 'verbose_name': 'Network Device Log Entry',
1195
- 'verbose_name_plural': 'Network Device Log Entries',
1196
- },
1197
1346
  ),
1198
1347
  migrations.AddField(
1199
- model_name='networkdevice',
1200
- name='device_type',
1201
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.networkdevicetype'),
1348
+ model_name='pdftype',
1349
+ name='cut_off_above_lines',
1350
+ field=models.ManyToManyField(related_name='pdf_type_cut_off_above_lines', to='endoreg_db.reportreaderflag'),
1202
1351
  ),
1203
1352
  migrations.AddField(
1204
- model_name='modelmeta',
1205
- name='type',
1206
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='models', to='endoreg_db.modeltype'),
1353
+ model_name='pdftype',
1354
+ name='cut_off_below_lines',
1355
+ field=models.ManyToManyField(related_name='pdf_type_cut_off_below_lines', to='endoreg_db.reportreaderflag'),
1207
1356
  ),
1208
1357
  migrations.AddField(
1209
- model_name='medicationschedule',
1210
- name='unit',
1211
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit'),
1358
+ model_name='pdftype',
1359
+ name='endoscope_info_line',
1360
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pdf_type_endoscopy_info_line', to='endoreg_db.reportreaderflag'),
1212
1361
  ),
1213
1362
  migrations.AddField(
1214
- model_name='medicationindication',
1215
- name='indication_type',
1216
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='medication_indications', to='endoreg_db.medicationindicationtype'),
1363
+ model_name='pdftype',
1364
+ name='examiner_info_line',
1365
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pdf_type_examiner_info_line', to='endoreg_db.reportreaderflag'),
1217
1366
  ),
1218
1367
  migrations.AddField(
1219
- model_name='medicationindication',
1220
- name='medication_schedules',
1221
- field=models.ManyToManyField(to='endoreg_db.medicationschedule'),
1368
+ model_name='pdftype',
1369
+ name='patient_info_line',
1370
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pdf_type_patient_info_line', to='endoreg_db.reportreaderflag'),
1222
1371
  ),
1223
- migrations.AddField(
1224
- model_name='medicationindication',
1225
- name='sources',
1226
- field=models.ManyToManyField(to='endoreg_db.informationsource'),
1372
+ migrations.CreateModel(
1373
+ name='Requirement',
1374
+ fields=[
1375
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1376
+ ('name', models.CharField(max_length=100, unique=True)),
1377
+ ('description', models.TextField(blank=True, null=True)),
1378
+ ('numeric_value', models.FloatField(blank=True, help_text='Numeric value for the requirement. If not set, the requirement is not used in calculations.', null=True)),
1379
+ ('numeric_value_min', models.FloatField(blank=True, help_text='Minimum numeric value for the requirement. If not set, the requirement is not used in calculations.', null=True)),
1380
+ ('numeric_value_max', models.FloatField(blank=True, help_text='Maximum numeric value for the requirement. If not set, the requirement is not used in calculations.', null=True)),
1381
+ ('string_value', models.CharField(blank=True, help_text='String value for the requirement. If not set, the requirement is not used in calculations.', max_length=100, null=True)),
1382
+ ('string_values', models.TextField(blank=True, help_text=" ','-separated list of string values for the requirement.If not set, the requirement is not used in calculations.", null=True)),
1383
+ ('disease_classification_choices', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.diseaseclassificationchoice')),
1384
+ ('diseases', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.disease')),
1385
+ ('events', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.event')),
1386
+ ('examination_indications', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.examinationindication')),
1387
+ ('examinations', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.examination')),
1388
+ ('finding_classification_choices', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.findingclassificationchoice')),
1389
+ ('finding_classifications', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.findingclassification')),
1390
+ ('finding_interventions', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.findingintervention')),
1391
+ ('findings', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.finding')),
1392
+ ('genders', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.gender')),
1393
+ ('lab_values', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.labvalue')),
1394
+ ('medication_indications', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.medicationindication')),
1395
+ ('medication_intake_times', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.medicationintaketime')),
1396
+ ('medication_schedules', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.medicationschedule')),
1397
+ ('medications', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.medication')),
1398
+ ('operators', models.ManyToManyField(blank=True, related_name='required_in', to='endoreg_db.requirementoperator')),
1399
+ ('requirement_types', models.ManyToManyField(blank=True, related_name='linked_requirements', to='endoreg_db.requirementtype')),
1400
+ ('unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='required_in', to='endoreg_db.unit')),
1401
+ ],
1402
+ ),
1403
+ migrations.CreateModel(
1404
+ name='Risk',
1405
+ fields=[
1406
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1407
+ ('name', models.CharField(max_length=100, unique=True)),
1408
+ ('name_de', models.CharField(blank=True, max_length=100, null=True)),
1409
+ ('name_en', models.CharField(blank=True, max_length=100, null=True)),
1410
+ ('description', models.TextField(blank=True, null=True)),
1411
+ ('risk_value', models.FloatField(blank=True, help_text='Risk value for the risk. If not set, the risk is not used in calculations.', null=True)),
1412
+ ('risk_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='risks', to='endoreg_db.risktype')),
1413
+ ],
1227
1414
  ),
1228
- migrations.AddField(
1229
- model_name='medication',
1230
- name='default_unit',
1231
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit'),
1415
+ migrations.CreateModel(
1416
+ name='Rule',
1417
+ fields=[
1418
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1419
+ ('name', models.CharField(max_length=255, unique=True)),
1420
+ ('description', models.TextField(blank=True, null=True)),
1421
+ ('attribute_key', models.CharField(max_length=255)),
1422
+ ('attribute_dtype', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.ruleattributedtype')),
1423
+ ('rule_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.ruletype')),
1424
+ ],
1425
+ options={
1426
+ 'verbose_name': 'Rule',
1427
+ 'verbose_name_plural': 'Rules',
1428
+ },
1429
+ ),
1430
+ migrations.CreateModel(
1431
+ name='Ruleset',
1432
+ fields=[
1433
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1434
+ ('name', models.CharField(max_length=255, unique=True)),
1435
+ ('rules', models.ManyToManyField(to='endoreg_db.rule')),
1436
+ ],
1437
+ ),
1438
+ migrations.CreateModel(
1439
+ name='SensitiveMeta',
1440
+ fields=[
1441
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1442
+ ('examination_date', models.DateField(blank=True, null=True)),
1443
+ ('patient_first_name', models.CharField(blank=True, max_length=255, null=True)),
1444
+ ('patient_last_name', models.CharField(blank=True, max_length=255, null=True)),
1445
+ ('patient_dob', models.DateTimeField(blank=True, help_text='Date of birth (can be auto-generated if missing).', null=True)),
1446
+ ('examiner_first_name', models.CharField(blank=True, editable=False, max_length=255, null=True)),
1447
+ ('examiner_last_name', models.CharField(blank=True, editable=False, max_length=255, null=True)),
1448
+ ('examination_hash', models.CharField(blank=True, db_index=True, editable=False, max_length=64, null=True)),
1449
+ ('patient_hash', models.CharField(blank=True, db_index=True, editable=False, max_length=64, null=True)),
1450
+ ('endoscope_type', models.CharField(blank=True, max_length=255, null=True)),
1451
+ ('endoscope_sn', models.CharField(blank=True, max_length=255, null=True)),
1452
+ ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
1453
+ ('examiners', models.ManyToManyField(blank=True, help_text='Pseudo-anonymized examiner(s) associated with the examination.', to='endoreg_db.examiner')),
1454
+ ('patient_gender', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.gender')),
1455
+ ('pseudo_examination', models.ForeignKey(blank=True, help_text='FK to the pseudo-anonymized PatientExamination record.', null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patientexamination')),
1456
+ ('pseudo_patient', models.ForeignKey(blank=True, help_text='FK to the pseudo-anonymized Patient record.', null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient')),
1457
+ ],
1232
1458
  ),
1233
1459
  migrations.CreateModel(
1234
- name='LegacyVideoPredictionMeta',
1460
+ name='RawPdfFile',
1235
1461
  fields=[
1236
1462
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1463
+ ('pdf_hash', models.CharField(max_length=255, unique=True)),
1464
+ ('text', models.TextField(blank=True, null=True)),
1237
1465
  ('date_created', models.DateTimeField(auto_now_add=True)),
1238
1466
  ('date_modified', models.DateTimeField(auto_now=True)),
1239
- ('prediction_array', models.BinaryField(blank=True, null=True)),
1240
- ('model_meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.modelmeta')),
1241
- ('video', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='video_prediction_meta', to='endoreg_db.legacyvideo')),
1467
+ ('anonymized', models.BooleanField(default=False, help_text='True if the PDF has been anonymized.')),
1468
+ ('file', models.FileField(upload_to='raw_pdfs', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['pdf'])])),
1469
+ ('anonymized_file', models.FileField(blank=True, null=True, upload_to='raw_pdfs', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['pdf'])])),
1470
+ ('state_report_processing_required', models.BooleanField(default=True)),
1471
+ ('state_report_processed', models.BooleanField(default=False)),
1472
+ ('raw_meta', models.JSONField(blank=True, null=True)),
1473
+ ('anonymized_text', models.TextField(blank=True, null=True)),
1474
+ ('anonym_examination_report', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='raw_pdf_file', to='endoreg_db.anonymexaminationreport')),
1475
+ ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.center')),
1476
+ ('examination', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='raw_pdf_files', to='endoreg_db.patientexamination')),
1477
+ ('examiner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.examiner')),
1478
+ ('patient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='raw_pdf_files', to='endoreg_db.patient')),
1479
+ ('pdf_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.pdftype')),
1480
+ ('state', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='raw_pdf_file', to='endoreg_db.rawpdfstate')),
1481
+ ('sensitive_meta', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='raw_pdf_files', to='endoreg_db.sensitivemeta')),
1482
+ ],
1483
+ ),
1484
+ migrations.CreateModel(
1485
+ name='AnonymHistologyReport',
1486
+ fields=[
1487
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1488
+ ('meta', models.JSONField(blank=True, null=True)),
1489
+ ('text', models.TextField(blank=True, null=True)),
1490
+ ('date', models.DateField(blank=True, null=True)),
1491
+ ('time', models.TimeField(blank=True, null=True)),
1492
+ ('file', models.FileField(blank=True, null=True, upload_to=pathlib.PurePosixPath('pdfs'))),
1493
+ ('center', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.center')),
1494
+ ('type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.documenttype')),
1495
+ ('examiners', models.ManyToManyField(blank=True, to='endoreg_db.examiner')),
1496
+ ('patient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='endoreg_db.patient')),
1497
+ ('patient_examination', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.patientexamination')),
1498
+ ('sensitive_meta', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.sensitivemeta')),
1242
1499
  ],
1243
1500
  options={
1244
1501
  'abstract': False,
1245
- 'unique_together': {('model_meta', 'video')},
1246
1502
  },
1247
1503
  ),
1248
1504
  migrations.AddField(
1249
- model_name='legacyvideo',
1250
- name='patient',
1251
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient'),
1505
+ model_name='anonymexaminationreport',
1506
+ name='sensitive_meta',
1507
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.sensitivemeta'),
1252
1508
  ),
1253
1509
  migrations.CreateModel(
1254
- name='LegacyLabelVideoSegment',
1510
+ name='SensitiveMetaState',
1255
1511
  fields=[
1256
1512
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1257
- ('start_frame_number', models.IntegerField()),
1258
- ('end_frame_number', models.IntegerField()),
1259
- ('label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.label')),
1260
- ('prediction_meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='video_segments', to='endoreg_db.legacyvideopredictionmeta')),
1261
- ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.informationsource')),
1262
- ('video', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.legacyvideo')),
1513
+ ('created_at', models.DateTimeField(auto_now_add=True)),
1514
+ ('updated_at', models.DateTimeField(auto_now=True)),
1515
+ ('dob_verified', models.BooleanField(default=False)),
1516
+ ('names_verified', models.BooleanField(default=False)),
1517
+ ('origin', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='state', to='endoreg_db.sensitivemeta')),
1263
1518
  ],
1264
1519
  options={
1265
- 'abstract': False,
1520
+ 'verbose_name': 'Sensitive Meta State',
1521
+ 'verbose_name_plural': 'Sensitive Meta States',
1266
1522
  },
1267
1523
  ),
1268
1524
  migrations.CreateModel(
1269
- name='LegacyFrame',
1525
+ name='Shift',
1270
1526
  fields=[
1271
1527
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1272
- ('frame_number', models.IntegerField()),
1273
- ('image', models.ImageField(blank=True, null=True, upload_to='legacy_frames')),
1274
- ('suffix', models.CharField(max_length=255)),
1275
- ('video', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frames', to='endoreg_db.legacyvideo')),
1528
+ ('name', models.CharField(max_length=255, unique=True)),
1529
+ ('description', models.TextField(blank=True, null=True)),
1530
+ ('is_active', models.BooleanField(default=True)),
1531
+ ('required_qualifications', models.ManyToManyField(related_name='shifts', to='endoreg_db.qualification')),
1532
+ ('shift_types', models.ManyToManyField(related_name='shifts', to='endoreg_db.shifttype')),
1276
1533
  ],
1277
1534
  ),
1278
1535
  migrations.CreateModel(
1279
- name='LegacyBinaryClassificationAnnotationTask',
1536
+ name='CenterShift',
1280
1537
  fields=[
1281
1538
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1282
- ('is_finished', models.BooleanField(default=False)),
1283
- ('date_created', models.DateTimeField(auto_now_add=True)),
1284
- ('date_finished', models.DateTimeField(blank=True, null=True)),
1285
- ('image_path', models.CharField(blank=True, max_length=255, null=True)),
1286
- ('labelstudio_project_id', models.IntegerField(blank=True, null=True)),
1287
- ('labelstudio_task_id', models.IntegerField(blank=True, null=True)),
1288
- ('image_type', models.CharField(default='legacy', max_length=255)),
1289
- ('frame', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='binary_classification_annotation_tasks', to='endoreg_db.legacyframe')),
1290
- ('label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.label')),
1539
+ ('name', models.CharField(max_length=255, unique=True)),
1540
+ ('description', models.TextField(blank=True, null=True)),
1541
+ ('start_time', models.TimeField()),
1542
+ ('end_time', models.TimeField()),
1543
+ ('estimated_presence_fraction', models.DecimalField(decimal_places=4, default=0.0, max_digits=5)),
1544
+ ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='center_shifts', to='endoreg_db.center')),
1545
+ ('scheduled_days', models.ManyToManyField(related_name='center_shifts', to='endoreg_db.scheduleddays')),
1546
+ ('shift', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='center_shifts', to='endoreg_db.shift')),
1291
1547
  ],
1292
- options={
1293
- 'abstract': False,
1294
- },
1295
1548
  ),
1296
- migrations.AddField(
1297
- model_name='labvalue',
1298
- name='default_multiple_categorical_value_distribution',
1299
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_multiple_categorical_value_distribution', to='endoreg_db.multiplecategoricalvaluedistribution'),
1300
- ),
1301
- migrations.AddField(
1302
- model_name='labvalue',
1303
- name='default_numerical_value_distribution',
1304
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_numerical_value_distribution', to='endoreg_db.numericvaluedistribution'),
1549
+ migrations.CreateModel(
1550
+ name='RequirementSet',
1551
+ fields=[
1552
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1553
+ ('name', models.CharField(max_length=100, unique=True)),
1554
+ ('description', models.TextField(blank=True, null=True)),
1555
+ ('information_sources', models.ManyToManyField(blank=True, related_name='requirement_sets', to='endoreg_db.informationsource')),
1556
+ ('links_to_sets', models.ManyToManyField(blank=True, related_name='links_from_sets', to='endoreg_db.requirementset')),
1557
+ ('reqset_exam_links', models.ManyToManyField(blank=True, related_name='requirement_set', to='endoreg_db.examinationrequirementset')),
1558
+ ('requirements', models.ManyToManyField(blank=True, related_name='requirement_sets', to='endoreg_db.requirement')),
1559
+ ('requirement_set_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='requirement_sets', to='endoreg_db.requirementsettype')),
1560
+ ('tags', models.ManyToManyField(blank=True, related_name='requirement_sets', to='endoreg_db.tag')),
1561
+ ],
1305
1562
  ),
1306
- migrations.AddField(
1307
- model_name='labvalue',
1308
- name='default_single_categorical_value_distribution',
1309
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_single_categorical_value_distribution', to='endoreg_db.singlecategoricalvaluedistribution'),
1563
+ migrations.CreateModel(
1564
+ name='TransportRoute',
1565
+ fields=[
1566
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1567
+ ('distance', models.FloatField()),
1568
+ ('name', models.CharField(max_length=255)),
1569
+ ('emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.emissionfactor')),
1570
+ ('unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit')),
1571
+ ],
1310
1572
  ),
1311
1573
  migrations.AddField(
1312
- model_name='labvalue',
1313
- name='default_unit',
1314
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit'),
1574
+ model_name='product',
1575
+ name='transport_route',
1576
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.transportroute'),
1315
1577
  ),
1316
1578
  migrations.CreateModel(
1317
- name='LabelVideoSegment',
1579
+ name='ProductWeight',
1318
1580
  fields=[
1319
1581
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1320
- ('start_frame_number', models.IntegerField()),
1321
- ('end_frame_number', models.IntegerField()),
1322
- ('label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.label')),
1323
- ('prediction_meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='video_segments', to='endoreg_db.videopredictionmeta')),
1324
- ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.informationsource')),
1325
- ('video', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.video')),
1582
+ ('name', models.CharField(max_length=255, null=True)),
1583
+ ('measured', models.FloatField(null=True)),
1584
+ ('verified', models.FloatField(null=True)),
1585
+ ('manufacturer', models.FloatField(null=True)),
1586
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.product')),
1587
+ ('unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit')),
1326
1588
  ],
1327
- options={
1328
- 'abstract': False,
1329
- },
1330
- ),
1331
- migrations.AddField(
1332
- model_name='label',
1333
- name='label_type',
1334
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='labels', to='endoreg_db.labeltype'),
1335
1589
  ),
1336
1590
  migrations.CreateModel(
1337
- name='ImageClassificationPrediction',
1591
+ name='ProductMaterial',
1338
1592
  fields=[
1339
1593
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1340
- ('value', models.BooleanField()),
1341
- ('confidence', models.FloatField()),
1342
- ('date_created', models.DateTimeField(auto_now_add=True)),
1343
- ('frame', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_predictions', to='endoreg_db.frame')),
1344
- ('label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_predictions', to='endoreg_db.label')),
1345
- ('legacy_frame', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_predictions', to='endoreg_db.legacyframe')),
1346
- ('legacy_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_predictions', to='endoreg_db.legacyimage')),
1347
- ('model_meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_predictions', to='endoreg_db.modelmeta')),
1594
+ ('component', models.CharField(max_length=255)),
1595
+ ('quantity', models.FloatField()),
1596
+ ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_product_materials', to='endoreg_db.material')),
1597
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='product_product_materials', to='endoreg_db.product')),
1598
+ ('unit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='unit_product_materials', to='endoreg_db.unit')),
1348
1599
  ],
1349
1600
  ),
1350
1601
  migrations.CreateModel(
1351
- name='ImageClassificationAnnotation',
1602
+ name='PatientLabValue',
1352
1603
  fields=[
1353
1604
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1354
- ('value', models.BooleanField()),
1355
- ('annotator', models.CharField(max_length=255)),
1356
- ('date_created', models.DateTimeField(auto_now_add=True)),
1357
- ('date_modified', models.DateTimeField(auto_now=True)),
1358
- ('frame', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_annotations', to='endoreg_db.frame')),
1359
- ('label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_annotations', to='endoreg_db.label')),
1360
- ('legacy_frame', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_annotations', to='endoreg_db.legacyframe')),
1361
- ('legacy_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_annotations', to='endoreg_db.legacyimage')),
1605
+ ('value', models.FloatField(blank=True, null=True)),
1606
+ ('value_str', models.CharField(blank=True, max_length=255, null=True)),
1607
+ ('datetime', models.DateTimeField(auto_now_add=True)),
1608
+ ('normal_range', models.JSONField(default=dict)),
1609
+ ('lab_value', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.labvalue')),
1610
+ ('patient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='lab_values', to='endoreg_db.patient')),
1611
+ ('sample', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='values', to='endoreg_db.patientlabsample')),
1612
+ ('unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit')),
1362
1613
  ],
1363
1614
  ),
1364
1615
  migrations.AddField(
1365
- model_name='frame',
1366
- name='video',
1367
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frames', to='endoreg_db.video'),
1616
+ model_name='medication',
1617
+ name='default_unit',
1618
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit'),
1368
1619
  ),
1369
1620
  migrations.AddField(
1370
- model_name='examiner',
1371
- name='gender',
1372
- field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.gender'),
1621
+ model_name='emissionfactor',
1622
+ name='unit',
1623
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit'),
1373
1624
  ),
1374
1625
  migrations.CreateModel(
1375
- name='ExaminationTimeType',
1626
+ name='CenterResource',
1376
1627
  fields=[
1377
1628
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1378
- ('name', models.CharField(max_length=100, unique=True)),
1379
- ('name_de', models.CharField(blank=True, max_length=100, null=True)),
1380
- ('name_en', models.CharField(blank=True, max_length=100, null=True)),
1381
- ('examinations', models.ManyToManyField(blank=True, to='endoreg_db.examination')),
1629
+ ('name', models.CharField(max_length=255, null=True)),
1630
+ ('quantity', models.FloatField()),
1631
+ ('year', models.IntegerField()),
1632
+ ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='center_resources', to='endoreg_db.center')),
1633
+ ('transport_emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='center_resource_transport_emission_factor', to='endoreg_db.emissionfactor')),
1634
+ ('use_emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='center_resource_use_emission_factor', to='endoreg_db.emissionfactor')),
1635
+ ('resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.resource')),
1636
+ ('unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit')),
1637
+ ],
1638
+ ),
1639
+ migrations.CreateModel(
1640
+ name='UploadJob',
1641
+ fields=[
1642
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, help_text='Unique identifier for the upload job', primary_key=True, serialize=False)),
1643
+ ('file', models.FileField(help_text='Uploaded file (PDF or video)', upload_to='uploads/%Y/%m/%d/')),
1644
+ ('status', models.CharField(choices=[('pending', 'Pending'), ('processing', 'Processing'), ('anonymized', 'Anonymized'), ('error', 'Error')], default='pending', help_text='Current processing status of the upload', max_length=20)),
1645
+ ('content_type', models.CharField(blank=True, help_text='MIME type of the uploaded file', max_length=100)),
1646
+ ('error_detail', models.TextField(blank=True, help_text='Error message if processing failed')),
1647
+ ('created_at', models.DateTimeField(auto_now_add=True, help_text='When the upload job was created')),
1648
+ ('updated_at', models.DateTimeField(auto_now=True, help_text='When the upload job was last updated')),
1649
+ ('sensitive_meta', models.ForeignKey(blank=True, help_text='Link to the created SensitiveMeta record after processing', null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.sensitivemeta')),
1382
1650
  ],
1383
1651
  options={
1384
- 'verbose_name': 'Examination Time Type',
1385
- 'verbose_name_plural': 'Examination Time Types',
1386
- 'ordering': ['name'],
1652
+ 'verbose_name': 'Upload Job',
1653
+ 'verbose_name_plural': 'Upload Jobs',
1654
+ 'ordering': ['-created_at'],
1387
1655
  },
1388
1656
  ),
1389
1657
  migrations.CreateModel(
1390
- name='ExaminationTime',
1658
+ name='VideoFile',
1391
1659
  fields=[
1392
1660
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1393
- ('name', models.CharField(max_length=100, unique=True)),
1394
- ('name_de', models.CharField(blank=True, max_length=100, null=True)),
1395
- ('name_en', models.CharField(blank=True, max_length=100, null=True)),
1396
- ('start_time', models.TimeField(blank=True, null=True)),
1397
- ('end_time', models.TimeField(blank=True, null=True)),
1398
- ('time_types', models.ManyToManyField(blank=True, to='endoreg_db.examinationtimetype')),
1661
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
1662
+ ('raw_file', models.FileField(blank=True, null=True, upload_to='videos', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['mp4'])])),
1663
+ ('processed_file', models.FileField(blank=True, null=True, upload_to='videos', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['mp4'])])),
1664
+ ('video_hash', models.CharField(help_text='Hash of the raw video file.', max_length=255, unique=True)),
1665
+ ('processed_video_hash', models.CharField(blank=True, help_text='Hash of the processed video file, unique if not null.', max_length=255, null=True, unique=True)),
1666
+ ('original_file_name', models.CharField(blank=True, max_length=255, null=True)),
1667
+ ('uploaded_at', models.DateTimeField(auto_now_add=True)),
1668
+ ('frame_dir', models.CharField(blank=True, help_text='Path to frames extracted from the raw video.', max_length=512)),
1669
+ ('fps', models.FloatField(blank=True, null=True)),
1670
+ ('duration', models.FloatField(blank=True, null=True)),
1671
+ ('frame_count', models.IntegerField(blank=True, null=True)),
1672
+ ('width', models.IntegerField(blank=True, null=True)),
1673
+ ('height', models.IntegerField(blank=True, null=True)),
1674
+ ('suffix', models.CharField(blank=True, max_length=10, null=True)),
1675
+ ('sequences', models.JSONField(blank=True, default=dict, help_text='AI prediction sequences based on raw frames.')),
1676
+ ('date', models.DateField(blank=True, null=True)),
1677
+ ('meta', models.JSONField(blank=True, null=True)),
1678
+ ('date_created', models.DateTimeField(auto_now_add=True)),
1679
+ ('date_modified', models.DateTimeField(auto_now=True)),
1680
+ ('ai_model_meta', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.modelmeta')),
1681
+ ('center', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='endoreg_db.center')),
1682
+ ('examination', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='video_files', to='endoreg_db.patientexamination')),
1683
+ ('patient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='video_files', to='endoreg_db.patient')),
1684
+ ('processor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='endoreg_db.endoscopyprocessor')),
1685
+ ('sensitive_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='video_file', to='endoreg_db.sensitivemeta')),
1686
+ ('import_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.videoimportmeta')),
1399
1687
  ],
1400
- options={
1401
- 'verbose_name': 'Examination Time',
1402
- 'verbose_name_plural': 'Examination Times',
1403
- 'ordering': ['name'],
1404
- },
1405
1688
  ),
1406
1689
  migrations.AddField(
1407
- model_name='examination',
1408
- name='examination_types',
1409
- field=models.ManyToManyField(blank=True, to='endoreg_db.examinationtype'),
1690
+ model_name='patientexamination',
1691
+ name='video',
1692
+ field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='patient_examination', to='endoreg_db.videofile'),
1410
1693
  ),
1411
1694
  migrations.AddField(
1412
- model_name='emissionfactor',
1413
- name='unit',
1414
- field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit'),
1695
+ model_name='labelvideosegment',
1696
+ name='video_file',
1697
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='label_video_segments', to='endoreg_db.videofile'),
1415
1698
  ),
1416
1699
  migrations.CreateModel(
1417
- name='CenterWaste',
1700
+ name='Frame',
1418
1701
  fields=[
1419
1702
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1420
- ('year', models.IntegerField()),
1421
- ('quantity', models.FloatField()),
1422
- ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
1423
- ('emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.emissionfactor')),
1424
- ('unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit')),
1425
- ('waste', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.waste')),
1703
+ ('frame_number', models.PositiveIntegerField()),
1704
+ ('relative_path', models.CharField(max_length=512)),
1705
+ ('timestamp', models.FloatField(blank=True, null=True)),
1706
+ ('is_extracted', models.BooleanField(default=False)),
1707
+ ('video', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frames', to='endoreg_db.videofile')),
1426
1708
  ],
1709
+ options={
1710
+ 'ordering': ['video', 'frame_number'],
1711
+ },
1427
1712
  ),
1428
1713
  migrations.CreateModel(
1429
- name='CenterResource',
1714
+ name='VideoMeta',
1430
1715
  fields=[
1431
1716
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1432
- ('name', models.CharField(max_length=255, null=True)),
1433
- ('name_de', models.CharField(max_length=255, null=True)),
1434
- ('name_en', models.CharField(max_length=255, null=True)),
1435
- ('quantity', models.FloatField()),
1436
- ('year', models.IntegerField()),
1437
1717
  ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
1438
- ('resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.resource')),
1439
- ('transport_emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='center_resource_transport_emission_factor', to='endoreg_db.emissionfactor')),
1440
- ('unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit')),
1441
- ('use_emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='center_resource_use_emission_factor', to='endoreg_db.emissionfactor')),
1718
+ ('endoscope', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.endoscope')),
1719
+ ('ffmpeg_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.ffmpegmeta')),
1720
+ ('import_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.videoimportmeta')),
1721
+ ('processor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.endoscopyprocessor')),
1442
1722
  ],
1443
1723
  ),
1724
+ migrations.AddField(
1725
+ model_name='videofile',
1726
+ name='video_meta',
1727
+ field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='video_file', to='endoreg_db.videometa'),
1728
+ ),
1444
1729
  migrations.CreateModel(
1445
- name='CenterProduct',
1730
+ name='VideoPredictionMeta',
1446
1731
  fields=[
1447
1732
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1448
- ('date_used', models.DateField()),
1449
- ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
1450
- ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.product')),
1733
+ ('date_created', models.DateTimeField(auto_now_add=True)),
1734
+ ('date_modified', models.DateTimeField(auto_now=True)),
1735
+ ('prediction_array', models.BinaryField(blank=True, null=True)),
1736
+ ('model_meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.modelmeta')),
1737
+ ('video_file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='video_prediction_meta', to='endoreg_db.videofile')),
1451
1738
  ],
1452
1739
  ),
1453
1740
  migrations.AddField(
1454
- model_name='center',
1455
- name='first_names',
1456
- field=models.ManyToManyField(related_name='centers', to='endoreg_db.firstname'),
1457
- ),
1458
- migrations.AddField(
1459
- model_name='center',
1460
- name='last_names',
1461
- field=models.ManyToManyField(related_name='centers', to='endoreg_db.lastname'),
1741
+ model_name='labelvideosegment',
1742
+ name='prediction_meta',
1743
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='label_video_segments', to='endoreg_db.videopredictionmeta'),
1462
1744
  ),
1463
1745
  migrations.CreateModel(
1464
- name='CaseTemplateRule',
1746
+ name='VideoSegmentationAnnotation',
1465
1747
  fields=[
1466
1748
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1467
- ('name', models.CharField(max_length=255)),
1468
- ('name_de', models.CharField(max_length=255, null=True)),
1469
- ('name_en', models.CharField(max_length=255, null=True)),
1470
- ('description', models.TextField(blank=True, null=True)),
1471
- ('parent_model', models.CharField(blank=True, max_length=255, null=True)),
1472
- ('parent_field', models.CharField(blank=True, max_length=255, null=True)),
1473
- ('target_field', models.CharField(blank=True, max_length=255, null=True)),
1474
- ('target_model', models.CharField(blank=True, max_length=255, null=True)),
1475
- ('rule_values', models.JSONField(blank=True, null=True)),
1476
- ('extra_parameters', models.JSONField(blank=True, null=True)),
1477
- ('chained_rules', models.ManyToManyField(related_name='calling_rules', to='endoreg_db.casetemplaterule')),
1478
- ('date_value_distribution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.datevaluedistribution')),
1479
- ('multiple_categorical_value_distribution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.multiplecategoricalvaluedistribution')),
1480
- ('numerical_value_distribution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.numericvaluedistribution')),
1481
- ('rule_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.casetemplateruletype')),
1482
- ('single_categorical_value_distribution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.singlecategoricalvaluedistribution')),
1483
- ('value_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.casetemplaterulevaluetype')),
1749
+ ('start_time', models.FloatField()),
1750
+ ('stop_time', models.FloatField()),
1751
+ ('is_true', models.BooleanField(default=True)),
1752
+ ('video_file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='video_segmentation_annotations', to='endoreg_db.videofile')),
1753
+ ('label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.videosegmentationlabel')),
1484
1754
  ],
1485
1755
  ),
1486
1756
  migrations.CreateModel(
1487
- name='CaseTemplate',
1757
+ name='VideoSegmentationLabelSet',
1488
1758
  fields=[
1489
1759
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1490
- ('name', models.CharField(max_length=255, unique=True)),
1760
+ ('name', models.CharField(max_length=255)),
1491
1761
  ('description', models.TextField(blank=True, null=True)),
1492
- ('rules', models.ManyToManyField(to='endoreg_db.casetemplaterule')),
1493
- ('secondary_rules', models.ManyToManyField(related_name='secondary_rules', to='endoreg_db.casetemplaterule')),
1494
- ('template_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='case_templates', to='endoreg_db.casetemplatetype')),
1762
+ ('labels', models.ManyToManyField(related_name='labelsets', to='endoreg_db.videosegmentationlabel')),
1495
1763
  ],
1496
1764
  ),
1765
+ migrations.AddField(
1766
+ model_name='aimodel',
1767
+ name='video_segmentation_labelset',
1768
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ai_models', to='endoreg_db.videosegmentationlabelset'),
1769
+ ),
1770
+ migrations.AddField(
1771
+ model_name='videofile',
1772
+ name='state',
1773
+ field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='video_file', to='endoreg_db.videostate'),
1774
+ ),
1497
1775
  migrations.CreateModel(
1498
- name='BinaryClassificationAnnotationTask',
1776
+ name='CenterWaste',
1499
1777
  fields=[
1500
1778
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1501
- ('is_finished', models.BooleanField(default=False)),
1502
- ('date_created', models.DateTimeField(auto_now_add=True)),
1503
- ('date_finished', models.DateTimeField(blank=True, null=True)),
1504
- ('image_path', models.CharField(blank=True, max_length=255, null=True)),
1505
- ('labelstudio_project_id', models.IntegerField(blank=True, null=True)),
1506
- ('labelstudio_task_id', models.IntegerField(blank=True, null=True)),
1507
- ('image_type', models.CharField(default='frame', max_length=255)),
1508
- ('frame', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='binary_classification_annotation_tasks', to='endoreg_db.frame')),
1509
- ('label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.label')),
1779
+ ('year', models.IntegerField()),
1780
+ ('quantity', models.FloatField()),
1781
+ ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='center_wastes', to='endoreg_db.center')),
1782
+ ('emission_factor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.emissionfactor')),
1783
+ ('unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.unit')),
1784
+ ('waste', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.waste')),
1510
1785
  ],
1511
- options={
1512
- 'abstract': False,
1513
- },
1514
1786
  ),
1515
1787
  migrations.CreateModel(
1516
- name='AglServiceLogEntry',
1788
+ name='ImageClassificationAnnotation',
1517
1789
  fields=[
1518
1790
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1519
- ('timestamp', models.DateTimeField(auto_now_add=True)),
1520
- ('ip_address', models.GenericIPAddressField(blank=True, null=True)),
1521
- ('user_agent', models.CharField(blank=True, max_length=256, null=True)),
1522
- ('message', models.TextField()),
1523
- ('json_content', models.JSONField(blank=True, null=True)),
1524
- ('device', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.networkdevice')),
1525
- ('log_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.logtype')),
1526
- ('service', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.aglservice')),
1527
- ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
1791
+ ('value', models.BooleanField()),
1792
+ ('float_value', models.FloatField(blank=True, null=True)),
1793
+ ('annotator', models.CharField(blank=True, max_length=255, null=True)),
1794
+ ('date_created', models.DateTimeField(auto_now_add=True)),
1795
+ ('date_modified', models.DateTimeField(auto_now=True)),
1796
+ ('frame', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_annotations', to='endoreg_db.frame')),
1797
+ ('information_source', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='image_classification_annotations', to='endoreg_db.informationsource')),
1798
+ ('label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='image_classification_annotations', to='endoreg_db.label')),
1799
+ ('model_meta', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='image_classification_annotations', to='endoreg_db.modelmeta')),
1528
1800
  ],
1529
1801
  options={
1530
- 'verbose_name': 'AGL Service Log Entry',
1531
- 'verbose_name_plural': 'AGL Service Log Entries',
1802
+ 'indexes': [models.Index(fields=['frame', 'label'], name='endoreg_db__frame_i_47f916_idx'), models.Index(fields=['frame'], name='endoreg_db__frame_i_92c75a_idx')],
1532
1803
  },
1533
1804
  ),
1534
- migrations.AddField(
1535
- model_name='aglservice',
1536
- name='devices',
1537
- field=models.ManyToManyField(related_name='services', to='endoreg_db.networkdevice'),
1805
+ migrations.AddIndex(
1806
+ model_name='patientfinding',
1807
+ index=models.Index(fields=['patient_examination', 'finding'], name='endoreg_db__patient_54869f_idx'),
1538
1808
  ),
1539
- migrations.CreateModel(
1540
- name='ActiveModel',
1541
- fields=[
1542
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1543
- ('name', models.CharField(max_length=255, unique=True)),
1544
- ('model_meta', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='endoreg_db.modelmeta')),
1545
- ],
1809
+ migrations.AddIndex(
1810
+ model_name='patientfinding',
1811
+ index=models.Index(fields=['patient_examination', 'is_active'], name='endoreg_db__patient_9359f8_idx'),
1546
1812
  ),
1547
1813
  migrations.AddIndex(
1548
- model_name='legacyframe',
1549
- index=models.Index(fields=['video', 'frame_number'], name='endoreg_db__video_i_e10f1c_idx'),
1814
+ model_name='patientfinding',
1815
+ index=models.Index(fields=['created_at'], name='endoreg_db__created_b44d86_idx'),
1550
1816
  ),
1551
- migrations.AlterUniqueTogether(
1552
- name='legacyframe',
1553
- unique_together={('video', 'frame_number')},
1817
+ migrations.AddIndex(
1818
+ model_name='patientfinding',
1819
+ index=models.Index(fields=['finding', 'is_active'], name='endoreg_db__finding_2f036b_idx'),
1554
1820
  ),
1555
- migrations.AlterUniqueTogether(
1556
- name='imageclassificationprediction',
1557
- unique_together={('label', 'frame', 'model_meta')},
1821
+ migrations.AddConstraint(
1822
+ model_name='patientfinding',
1823
+ constraint=models.UniqueConstraint(condition=models.Q(('is_active', True)), fields=('patient_examination', 'finding'), name='unique_active_finding_per_examination'),
1558
1824
  ),
1559
- migrations.AddIndex(
1560
- model_name='frame',
1561
- index=models.Index(fields=['video', 'frame_number'], name='endoreg_db__video_i_56cc44_idx'),
1825
+ migrations.AddConstraint(
1826
+ model_name='patientfinding',
1827
+ constraint=models.CheckConstraint(condition=models.Q(models.Q(('deactivated_at__isnull', True), ('deactivated_by__isnull', True)), models.Q(('deactivated_at__isnull', False), ('deactivated_by__isnull', False), ('is_active', False)), _connector='OR'), name='deactivation_fields_consistency'),
1562
1828
  ),
1563
1829
  migrations.AlterUniqueTogether(
1564
1830
  name='frame',
1565
1831
  unique_together={('video', 'frame_number')},
1566
1832
  ),
1833
+ migrations.AddIndex(
1834
+ model_name='videopredictionmeta',
1835
+ index=models.Index(fields=['model_meta', 'video_file'], name='endoreg_db__model_m_208dee_idx'),
1836
+ ),
1837
+ migrations.AddConstraint(
1838
+ model_name='videopredictionmeta',
1839
+ constraint=models.UniqueConstraint(fields=('model_meta', 'video_file'), name='unique_prediction_per_video_model'),
1840
+ ),
1841
+ migrations.AddIndex(
1842
+ model_name='labelvideosegment',
1843
+ index=models.Index(fields=['video_file', 'label', 'start_frame_number'], name='endoreg_db__video_f_fa9326_idx'),
1844
+ ),
1845
+ migrations.AddIndex(
1846
+ model_name='labelvideosegment',
1847
+ index=models.Index(fields=['prediction_meta', 'label'], name='endoreg_db__predict_2bfba4_idx'),
1848
+ ),
1849
+ migrations.AddConstraint(
1850
+ model_name='labelvideosegment',
1851
+ constraint=models.CheckConstraint(condition=models.Q(('start_frame_number__lt', models.F('end_frame_number'))), name='segment_start_lt_end'),
1852
+ ),
1853
+ migrations.AddConstraint(
1854
+ model_name='videosegmentationannotation',
1855
+ constraint=models.CheckConstraint(condition=models.Q(('start_time__lt', models.F('stop_time'))), name='start_time_less_than_stop_time'),
1856
+ ),
1567
1857
  ]