endoreg-db 0.8.6.4__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (793) hide show
  1. endoreg_db/__init__.py +0 -0
  2. endoreg_db/admin.py +92 -0
  3. endoreg_db/api/serializers/finding_descriptions.py +0 -0
  4. endoreg_db/api/views/finding_descriptions.py +0 -0
  5. endoreg_db/api_urls.py +4 -0
  6. endoreg_db/apps.py +18 -0
  7. endoreg_db/assets/dummy_model.ckpt +1 -0
  8. endoreg_db/codemods/readme.md +88 -0
  9. endoreg_db/codemods/rename_datetime_fields.py +92 -0
  10. endoreg_db/config/__init__.py +0 -0
  11. endoreg_db/config/env.py +101 -0
  12. endoreg_db/data/__init__.py +144 -0
  13. endoreg_db/data/ai_model/data.yaml +7 -0
  14. endoreg_db/data/ai_model_label/label/data.yaml +88 -0
  15. endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
  16. endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
  17. endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
  18. endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
  19. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
  20. endoreg_db/data/ai_model_type/data.yaml +7 -0
  21. endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
  22. endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
  23. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
  24. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
  25. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
  26. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
  27. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
  28. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
  29. endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
  30. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
  31. endoreg_db/data/case_template/rule_value/.init +0 -0
  32. endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
  33. endoreg_db/data/case_template/template/base.yaml +8 -0
  34. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
  35. endoreg_db/data/case_template/tmp/_rule_value +13 -0
  36. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
  37. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
  38. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
  39. endoreg_db/data/center/data.yaml +91 -0
  40. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
  41. endoreg_db/data/center_shift/ukw.yaml +9 -0
  42. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
  43. endoreg_db/data/contraindication/bleeding.yaml +11 -0
  44. endoreg_db/data/db_summary.csv +58 -0
  45. endoreg_db/data/db_summary.xlsx +0 -0
  46. endoreg_db/data/disease/cardiovascular.yaml +37 -0
  47. endoreg_db/data/disease/hepatology.yaml +5 -0
  48. endoreg_db/data/disease/misc.yaml +5 -0
  49. endoreg_db/data/disease/renal.yaml +5 -0
  50. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
  51. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
  52. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
  53. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
  54. endoreg_db/data/distribution/date/patient.yaml +7 -0
  55. endoreg_db/data/distribution/multiple_categorical/.init +0 -0
  56. endoreg_db/data/distribution/numeric/data.yaml +14 -0
  57. endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
  58. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
  59. endoreg_db/data/endoscope/data.yaml +93 -0
  60. endoreg_db/data/endoscope_type/data.yaml +11 -0
  61. endoreg_db/data/endoscopy_processor/data.yaml +50 -0
  62. endoreg_db/data/event/cardiology.yaml +15 -0
  63. endoreg_db/data/event/neurology.yaml +14 -0
  64. endoreg_db/data/event/surgery.yaml +13 -0
  65. endoreg_db/data/event/thrombembolism.yaml +20 -0
  66. endoreg_db/data/examination/examinations/data.yaml +72 -0
  67. endoreg_db/data/examination/time/data.yaml +48 -0
  68. endoreg_db/data/examination/time-type/data.yaml +8 -0
  69. endoreg_db/data/examination/type/data.yaml +17 -0
  70. endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
  71. endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
  72. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
  73. endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
  74. endoreg_db/data/finding/anatomy_colon.yaml +128 -0
  75. endoreg_db/data/finding/colonoscopy.yaml +40 -0
  76. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
  77. endoreg_db/data/finding/complication.yaml +16 -0
  78. endoreg_db/data/finding/data.yaml +105 -0
  79. endoreg_db/data/finding/examination_setting.yaml +16 -0
  80. endoreg_db/data/finding/medication_related.yaml +18 -0
  81. endoreg_db/data/finding/outcome.yaml +12 -0
  82. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
  83. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
  84. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
  85. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  86. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  87. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  88. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  89. endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
  90. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
  91. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
  92. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
  93. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
  94. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
  95. endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
  96. endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
  97. endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
  98. endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
  99. endoreg_db/data/finding_classification/medication_related.yaml +23 -0
  100. endoreg_db/data/finding_classification/visualized.yaml +33 -0
  101. endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
  102. endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
  103. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  104. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  105. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  106. endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
  107. endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
  108. endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
  109. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  110. endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
  111. endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
  112. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  113. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
  114. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  115. endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
  116. endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  117. endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
  118. endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
  119. endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
  120. endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
  121. endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
  122. endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
  123. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
  124. endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
  125. endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
  126. endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
  127. endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
  128. endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
  129. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
  130. endoreg_db/data/finding_type/data.yaml +43 -0
  131. endoreg_db/data/gender/data.yaml +42 -0
  132. endoreg_db/data/information_source/annotation.yaml +6 -0
  133. endoreg_db/data/information_source/data.yaml +30 -0
  134. endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
  135. endoreg_db/data/information_source/medication.yaml +6 -0
  136. endoreg_db/data/information_source/prediction.yaml +7 -0
  137. endoreg_db/data/information_source_type/data.yaml +8 -0
  138. endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
  139. endoreg_db/data/lab_value/coagulation.yaml +54 -0
  140. endoreg_db/data/lab_value/electrolytes.yaml +228 -0
  141. endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
  142. endoreg_db/data/lab_value/hematology.yaml +184 -0
  143. endoreg_db/data/lab_value/hormones.yaml +59 -0
  144. endoreg_db/data/lab_value/lipids.yaml +53 -0
  145. endoreg_db/data/lab_value/misc.yaml +76 -0
  146. endoreg_db/data/lab_value/renal_function.yaml +12 -0
  147. endoreg_db/data/log_type/data.yaml +57 -0
  148. endoreg_db/data/lx_client_tag/base.yaml +54 -0
  149. endoreg_db/data/lx_client_type/base.yaml +30 -0
  150. endoreg_db/data/lx_permission/base.yaml +24 -0
  151. endoreg_db/data/lx_permission/endoreg.yaml +52 -0
  152. endoreg_db/data/material/material.yaml +91 -0
  153. endoreg_db/data/medication/anticoagulation.yaml +65 -0
  154. endoreg_db/data/medication/tah.yaml +70 -0
  155. endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
  156. endoreg_db/data/medication_indication_type/data.yaml +11 -0
  157. endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
  158. endoreg_db/data/medication_intake_time/base.yaml +31 -0
  159. endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
  160. endoreg_db/data/medication_schedule/ass.yaml +12 -0
  161. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
  162. endoreg_db/data/names_first/first_names.yaml +54 -0
  163. endoreg_db/data/names_last/last_names.yaml +51 -0
  164. endoreg_db/data/network_device/data.yaml +59 -0
  165. endoreg_db/data/network_device_type/data.yaml +12 -0
  166. endoreg_db/data/organ/data.yaml +29 -0
  167. endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
  168. endoreg_db/data/pdf_type/data.yaml +46 -0
  169. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
  170. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
  171. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
  172. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
  173. endoreg_db/data/profession/data.yaml +70 -0
  174. endoreg_db/data/qualification/endoscopy.yaml +36 -0
  175. endoreg_db/data/qualification/m2.yaml +39 -0
  176. endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
  177. endoreg_db/data/qualification/sonography.yaml +36 -0
  178. endoreg_db/data/qualification_type/base.yaml +29 -0
  179. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
  180. endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
  181. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
  182. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
  183. endoreg_db/data/requirement/age.yaml +26 -0
  184. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
  185. endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
  186. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
  187. endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
  188. endoreg_db/data/requirement/disease_misc.yaml +12 -0
  189. endoreg_db/data/requirement/disease_renal.yaml +96 -0
  190. endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
  191. endoreg_db/data/requirement/event_cardiology.yaml +251 -0
  192. endoreg_db/data/requirement/event_requirements.yaml +145 -0
  193. endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
  194. endoreg_db/data/requirement/gender.yaml +25 -0
  195. endoreg_db/data/requirement/lab_value.yaml +441 -0
  196. endoreg_db/data/requirement/medication.yaml +93 -0
  197. endoreg_db/data/requirement_operator/age.yaml +13 -0
  198. endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
  199. endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
  200. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
  201. endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  202. endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
  203. endoreg_db/data/requirement_set_type/data.yaml +20 -0
  204. endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
  205. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
  206. endoreg_db/data/risk/bleeding.yaml +26 -0
  207. endoreg_db/data/risk/thrombosis.yaml +37 -0
  208. endoreg_db/data/risk_type/data.yaml +27 -0
  209. endoreg_db/data/setup_config.yaml +38 -0
  210. endoreg_db/data/shift/endoscopy.yaml +21 -0
  211. endoreg_db/data/shift/m2.yaml +0 -0
  212. endoreg_db/data/shift_type/base.yaml +35 -0
  213. endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
  214. endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
  215. endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
  216. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
  217. endoreg_db/data/unit/concentration.yaml +115 -0
  218. endoreg_db/data/unit/data.yaml +17 -0
  219. endoreg_db/data/unit/length.yaml +31 -0
  220. endoreg_db/data/unit/misc.yaml +20 -0
  221. endoreg_db/data/unit/rate.yaml +6 -0
  222. endoreg_db/data/unit/time.yaml +48 -0
  223. endoreg_db/data/unit/volume.yaml +35 -0
  224. endoreg_db/data/unit/weight.yaml +38 -0
  225. endoreg_db/data/waste/data.yaml +12 -0
  226. endoreg_db/exceptions.py +19 -0
  227. endoreg_db/factories/__init__.py +0 -0
  228. endoreg_db/forms/__init__.py +5 -0
  229. endoreg_db/forms/examination_form.py +11 -0
  230. endoreg_db/forms/patient_finding_intervention_form.py +18 -0
  231. endoreg_db/forms/patient_form.py +27 -0
  232. endoreg_db/forms/questionnaires/__init__.py +1 -0
  233. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
  234. endoreg_db/forms/settings/__init__.py +8 -0
  235. endoreg_db/forms/unit.py +6 -0
  236. endoreg_db/helpers/__init__.py +0 -0
  237. endoreg_db/helpers/count_db.py +45 -0
  238. endoreg_db/helpers/data_loader.py +208 -0
  239. endoreg_db/helpers/default_objects.py +378 -0
  240. endoreg_db/helpers/download_segmentation_model.py +31 -0
  241. endoreg_db/helpers/interact.py +6 -0
  242. endoreg_db/helpers/test_video_helper.py +119 -0
  243. endoreg_db/logger_conf.py +140 -0
  244. endoreg_db/management/__init__.py +1 -0
  245. endoreg_db/management/commands/__init__.py +1 -0
  246. endoreg_db/management/commands/anonymize_video.py +0 -0
  247. endoreg_db/management/commands/check_auth.py +125 -0
  248. endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
  249. endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
  250. endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
  251. endoreg_db/management/commands/fix_video_paths.py +165 -0
  252. endoreg_db/management/commands/import_fallback_video.py +203 -0
  253. endoreg_db/management/commands/import_report.py +298 -0
  254. endoreg_db/management/commands/import_video.py +423 -0
  255. endoreg_db/management/commands/import_video_with_classification.py +367 -0
  256. endoreg_db/management/commands/init_default_ai_model.py +112 -0
  257. endoreg_db/management/commands/load_ai_model_data.py +77 -0
  258. endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
  259. endoreg_db/management/commands/load_base_db_data.py +192 -0
  260. endoreg_db/management/commands/load_center_data.py +68 -0
  261. endoreg_db/management/commands/load_contraindication_data.py +41 -0
  262. endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
  263. endoreg_db/management/commands/load_disease_classification_data.py +41 -0
  264. endoreg_db/management/commands/load_disease_data.py +62 -0
  265. endoreg_db/management/commands/load_distribution_data.py +66 -0
  266. endoreg_db/management/commands/load_endoscope_data.py +68 -0
  267. endoreg_db/management/commands/load_event_data.py +41 -0
  268. endoreg_db/management/commands/load_examination_data.py +75 -0
  269. endoreg_db/management/commands/load_examination_indication_data.py +86 -0
  270. endoreg_db/management/commands/load_finding_data.py +128 -0
  271. endoreg_db/management/commands/load_gender_data.py +44 -0
  272. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
  273. endoreg_db/management/commands/load_information_source.py +51 -0
  274. endoreg_db/management/commands/load_lab_value_data.py +50 -0
  275. endoreg_db/management/commands/load_medication_data.py +103 -0
  276. endoreg_db/management/commands/load_name_data.py +37 -0
  277. endoreg_db/management/commands/load_organ_data.py +43 -0
  278. endoreg_db/management/commands/load_pdf_type_data.py +61 -0
  279. endoreg_db/management/commands/load_profession_data.py +44 -0
  280. endoreg_db/management/commands/load_qualification_data.py +59 -0
  281. endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
  282. endoreg_db/management/commands/load_requirement_data.py +180 -0
  283. endoreg_db/management/commands/load_risk_data.py +56 -0
  284. endoreg_db/management/commands/load_shift_data.py +60 -0
  285. endoreg_db/management/commands/load_tag_data.py +57 -0
  286. endoreg_db/management/commands/load_unit_data.py +46 -0
  287. endoreg_db/management/commands/load_user_groups.py +28 -0
  288. endoreg_db/management/commands/register_ai_model.py +64 -0
  289. endoreg_db/management/commands/reset_celery_schedule.py +9 -0
  290. endoreg_db/management/commands/setup_endoreg_db.py +381 -0
  291. endoreg_db/management/commands/start_filewatcher.py +106 -0
  292. endoreg_db/management/commands/storage_management.py +548 -0
  293. endoreg_db/management/commands/summarize_db_content.py +189 -0
  294. endoreg_db/management/commands/validate_video.py +204 -0
  295. endoreg_db/management/commands/validate_video_files.py +161 -0
  296. endoreg_db/management/commands/video_validation.py +22 -0
  297. endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
  298. endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
  299. endoreg_db/mermaid/binary_classification_annotation.md +50 -0
  300. endoreg_db/mermaid/classification.md +8 -0
  301. endoreg_db/mermaid/examination.md +8 -0
  302. endoreg_db/mermaid/findings.md +7 -0
  303. endoreg_db/mermaid/image_classification.md +28 -0
  304. endoreg_db/mermaid/interventions.md +8 -0
  305. endoreg_db/mermaid/morphology.md +8 -0
  306. endoreg_db/mermaid/patient_creation.md +14 -0
  307. endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
  308. endoreg_db/migrations/0001_initial.py +1857 -0
  309. endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
  310. endoreg_db/migrations/0003_add_center_display_name.py +30 -0
  311. endoreg_db/migrations/__init__.py +0 -0
  312. endoreg_db/models/__init__.py +359 -0
  313. endoreg_db/models/administration/__init__.py +116 -0
  314. endoreg_db/models/administration/ai/__init__.py +9 -0
  315. endoreg_db/models/administration/ai/active_model.py +35 -0
  316. endoreg_db/models/administration/ai/ai_model.py +156 -0
  317. endoreg_db/models/administration/ai/model_type.py +41 -0
  318. endoreg_db/models/administration/case/__init__.py +19 -0
  319. endoreg_db/models/administration/case/case.py +114 -0
  320. endoreg_db/models/administration/case/case_template/__init__.py +15 -0
  321. endoreg_db/models/administration/case/case_template/case_template.py +125 -0
  322. endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
  323. endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
  324. endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
  325. endoreg_db/models/administration/center/__init__.py +13 -0
  326. endoreg_db/models/administration/center/center.py +67 -0
  327. endoreg_db/models/administration/center/center_product.py +64 -0
  328. endoreg_db/models/administration/center/center_resource.py +49 -0
  329. endoreg_db/models/administration/center/center_shift.py +88 -0
  330. endoreg_db/models/administration/center/center_waste.py +30 -0
  331. endoreg_db/models/administration/permissions/__init__.py +44 -0
  332. endoreg_db/models/administration/person/__init__.py +24 -0
  333. endoreg_db/models/administration/person/employee/__init__.py +3 -0
  334. endoreg_db/models/administration/person/employee/employee.py +35 -0
  335. endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
  336. endoreg_db/models/administration/person/employee/employee_type.py +42 -0
  337. endoreg_db/models/administration/person/examiner/__init__.py +4 -0
  338. endoreg_db/models/administration/person/examiner/examiner.py +54 -0
  339. endoreg_db/models/administration/person/names/__init__.py +0 -0
  340. endoreg_db/models/administration/person/names/first_name.py +18 -0
  341. endoreg_db/models/administration/person/names/last_name.py +19 -0
  342. endoreg_db/models/administration/person/patient/__init__.py +5 -0
  343. endoreg_db/models/administration/person/patient/patient.py +460 -0
  344. endoreg_db/models/administration/person/person.py +31 -0
  345. endoreg_db/models/administration/person/profession/__init__.py +24 -0
  346. endoreg_db/models/administration/person/user/__init__.py +5 -0
  347. endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
  348. endoreg_db/models/administration/product/__init__.py +14 -0
  349. endoreg_db/models/administration/product/product.py +97 -0
  350. endoreg_db/models/administration/product/product_group.py +39 -0
  351. endoreg_db/models/administration/product/product_material.py +54 -0
  352. endoreg_db/models/administration/product/product_weight.py +47 -0
  353. endoreg_db/models/administration/product/reference_product.py +130 -0
  354. endoreg_db/models/administration/qualification/__init__.py +7 -0
  355. endoreg_db/models/administration/qualification/qualification.py +37 -0
  356. endoreg_db/models/administration/qualification/qualification_type.py +35 -0
  357. endoreg_db/models/administration/shift/__init__.py +9 -0
  358. endoreg_db/models/administration/shift/scheduled_days.py +69 -0
  359. endoreg_db/models/administration/shift/shift.py +51 -0
  360. endoreg_db/models/administration/shift/shift_type.py +108 -0
  361. endoreg_db/models/label/__init__.py +24 -0
  362. endoreg_db/models/label/annotation/__init__.py +12 -0
  363. endoreg_db/models/label/annotation/image_classification.py +84 -0
  364. endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
  365. endoreg_db/models/label/label.py +83 -0
  366. endoreg_db/models/label/label_set.py +53 -0
  367. endoreg_db/models/label/label_type.py +29 -0
  368. endoreg_db/models/label/label_video_segment/__init__.py +3 -0
  369. endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
  370. endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
  371. endoreg_db/models/label/video_segmentation_label.py +31 -0
  372. endoreg_db/models/label/video_segmentation_labelset.py +27 -0
  373. endoreg_db/models/media/__init__.py +16 -0
  374. endoreg_db/models/media/frame/__init__.py +3 -0
  375. endoreg_db/models/media/frame/frame.py +111 -0
  376. endoreg_db/models/media/pdf/__init__.py +11 -0
  377. endoreg_db/models/media/pdf/raw_pdf.py +757 -0
  378. endoreg_db/models/media/pdf/report_file.py +162 -0
  379. endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
  380. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
  381. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +20 -0
  382. endoreg_db/models/media/video/__init__.py +8 -0
  383. endoreg_db/models/media/video/create_from_file.py +358 -0
  384. endoreg_db/models/media/video/pipe_1.py +213 -0
  385. endoreg_db/models/media/video/pipe_2.py +105 -0
  386. endoreg_db/models/media/video/refactor_plan.md +0 -0
  387. endoreg_db/models/media/video/video_file.py +825 -0
  388. endoreg_db/models/media/video/video_file_ai.py +443 -0
  389. endoreg_db/models/media/video/video_file_anonymize.py +349 -0
  390. endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
  391. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
  392. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
  393. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
  394. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
  395. endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
  396. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
  397. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
  398. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
  399. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
  400. endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
  401. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
  402. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
  403. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
  404. endoreg_db/models/media/video/video_file_frames.py +0 -0
  405. endoreg_db/models/media/video/video_file_io.py +168 -0
  406. endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
  407. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
  408. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
  409. endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
  410. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
  411. endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
  412. endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
  413. endoreg_db/models/media/video/video_file_segments.py +209 -0
  414. endoreg_db/models/media/video/video_metadata.py +65 -0
  415. endoreg_db/models/media/video/video_processing.py +152 -0
  416. endoreg_db/models/medical/__init__.py +146 -0
  417. endoreg_db/models/medical/contraindication/__init__.py +17 -0
  418. endoreg_db/models/medical/disease.py +156 -0
  419. endoreg_db/models/medical/event.py +137 -0
  420. endoreg_db/models/medical/examination/__init__.py +9 -0
  421. endoreg_db/models/medical/examination/examination.py +148 -0
  422. endoreg_db/models/medical/examination/examination_indication.py +278 -0
  423. endoreg_db/models/medical/examination/examination_time.py +49 -0
  424. endoreg_db/models/medical/examination/examination_time_type.py +41 -0
  425. endoreg_db/models/medical/examination/examination_type.py +48 -0
  426. endoreg_db/models/medical/finding/__init__.py +18 -0
  427. endoreg_db/models/medical/finding/finding.py +96 -0
  428. endoreg_db/models/medical/finding/finding_classification.py +142 -0
  429. endoreg_db/models/medical/finding/finding_intervention.py +52 -0
  430. endoreg_db/models/medical/finding/finding_type.py +35 -0
  431. endoreg_db/models/medical/hardware/__init__.py +8 -0
  432. endoreg_db/models/medical/hardware/endoscope.py +65 -0
  433. endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
  434. endoreg_db/models/medical/laboratory/__init__.py +5 -0
  435. endoreg_db/models/medical/laboratory/lab_value.py +419 -0
  436. endoreg_db/models/medical/medication/__init__.py +19 -0
  437. endoreg_db/models/medical/medication/medication.py +31 -0
  438. endoreg_db/models/medical/medication/medication_indication.py +50 -0
  439. endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
  440. endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
  441. endoreg_db/models/medical/medication/medication_schedule.py +45 -0
  442. endoreg_db/models/medical/organ/__init__.py +35 -0
  443. endoreg_db/models/medical/patient/__init__.py +56 -0
  444. endoreg_db/models/medical/patient/medication_examples.py +38 -0
  445. endoreg_db/models/medical/patient/patient_disease.py +63 -0
  446. endoreg_db/models/medical/patient/patient_event.py +75 -0
  447. endoreg_db/models/medical/patient/patient_examination.py +249 -0
  448. endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
  449. endoreg_db/models/medical/patient/patient_finding.py +357 -0
  450. endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
  451. endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
  452. endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
  453. endoreg_db/models/medical/patient/patient_lab_value.py +222 -0
  454. endoreg_db/models/medical/patient/patient_medication.py +104 -0
  455. endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
  456. endoreg_db/models/medical/risk/__init__.py +7 -0
  457. endoreg_db/models/medical/risk/risk.py +72 -0
  458. endoreg_db/models/medical/risk/risk_type.py +51 -0
  459. endoreg_db/models/metadata/__init__.py +19 -0
  460. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  461. endoreg_db/models/metadata/model_meta.py +206 -0
  462. endoreg_db/models/metadata/model_meta_logic.py +343 -0
  463. endoreg_db/models/metadata/pdf_meta.py +89 -0
  464. endoreg_db/models/metadata/sensitive_meta.py +288 -0
  465. endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
  466. endoreg_db/models/metadata/video_meta.py +332 -0
  467. endoreg_db/models/metadata/video_prediction_logic.py +190 -0
  468. endoreg_db/models/metadata/video_prediction_meta.py +270 -0
  469. endoreg_db/models/other/__init__.py +40 -0
  470. endoreg_db/models/other/distribution/__init__.py +44 -0
  471. endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
  472. endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
  473. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
  474. endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
  475. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
  476. endoreg_db/models/other/emission/__init__.py +5 -0
  477. endoreg_db/models/other/emission/emission_factor.py +94 -0
  478. endoreg_db/models/other/gender.py +27 -0
  479. endoreg_db/models/other/information_source.py +159 -0
  480. endoreg_db/models/other/material.py +28 -0
  481. endoreg_db/models/other/resource.py +22 -0
  482. endoreg_db/models/other/tag.py +27 -0
  483. endoreg_db/models/other/transport_route.py +33 -0
  484. endoreg_db/models/other/unit.py +32 -0
  485. endoreg_db/models/other/waste.py +27 -0
  486. endoreg_db/models/requirement/__init__.py +11 -0
  487. endoreg_db/models/requirement/requirement.py +767 -0
  488. endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
  489. endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
  490. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
  491. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
  492. endoreg_db/models/requirement/requirement_operator.py +176 -0
  493. endoreg_db/models/requirement/requirement_set.py +287 -0
  494. endoreg_db/models/rule/__init__.py +13 -0
  495. endoreg_db/models/rule/rule.py +27 -0
  496. endoreg_db/models/rule/rule_applicator.py +224 -0
  497. endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
  498. endoreg_db/models/rule/rule_type.py +20 -0
  499. endoreg_db/models/rule/ruleset.py +17 -0
  500. endoreg_db/models/state/__init__.py +12 -0
  501. endoreg_db/models/state/abstract.py +11 -0
  502. endoreg_db/models/state/audit_ledger.py +150 -0
  503. endoreg_db/models/state/label_video_segment.py +22 -0
  504. endoreg_db/models/state/raw_pdf.py +187 -0
  505. endoreg_db/models/state/sensitive_meta.py +46 -0
  506. endoreg_db/models/state/video.py +232 -0
  507. endoreg_db/models/upload_job.py +99 -0
  508. endoreg_db/models/utils.py +135 -0
  509. endoreg_db/queries/__init__.py +5 -0
  510. endoreg_db/queries/annotations/__init__.py +3 -0
  511. endoreg_db/queries/annotations/legacy.py +158 -0
  512. endoreg_db/queries/sanity/__init_.py +0 -0
  513. endoreg_db/renames.yml +8 -0
  514. endoreg_db/root_urls.py +9 -0
  515. endoreg_db/schemas/__init__.py +0 -0
  516. endoreg_db/schemas/examination_evaluation.py +27 -0
  517. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
  518. endoreg_db/serializers/__init__.py +118 -0
  519. endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
  520. endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
  521. endoreg_db/serializers/_old/video.py +71 -0
  522. endoreg_db/serializers/administration/__init__.py +14 -0
  523. endoreg_db/serializers/administration/ai/__init__.py +10 -0
  524. endoreg_db/serializers/administration/ai/active_model.py +10 -0
  525. endoreg_db/serializers/administration/ai/ai_model.py +18 -0
  526. endoreg_db/serializers/administration/ai/model_type.py +10 -0
  527. endoreg_db/serializers/administration/center.py +9 -0
  528. endoreg_db/serializers/administration/gender.py +9 -0
  529. endoreg_db/serializers/anonymization.py +69 -0
  530. endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
  531. endoreg_db/serializers/examination/__init__.py +10 -0
  532. endoreg_db/serializers/examination/base.py +46 -0
  533. endoreg_db/serializers/examination/dropdown.py +21 -0
  534. endoreg_db/serializers/examination_serializer.py +12 -0
  535. endoreg_db/serializers/finding/__init__.py +5 -0
  536. endoreg_db/serializers/finding/finding.py +54 -0
  537. endoreg_db/serializers/finding_classification/__init__.py +7 -0
  538. endoreg_db/serializers/finding_classification/choice.py +19 -0
  539. endoreg_db/serializers/finding_classification/classification.py +13 -0
  540. endoreg_db/serializers/label/__init__.py +7 -0
  541. endoreg_db/serializers/label/image_classification_annotation.py +62 -0
  542. endoreg_db/serializers/label/label.py +15 -0
  543. endoreg_db/serializers/label_video_segment/__init__.py +7 -0
  544. endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
  545. endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
  546. endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
  547. endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
  548. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
  549. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
  550. endoreg_db/serializers/meta/__init__.py +19 -0
  551. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
  552. endoreg_db/serializers/meta/report_meta.py +53 -0
  553. endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
  554. endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
  555. endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
  556. endoreg_db/serializers/meta/video_meta.py +39 -0
  557. endoreg_db/serializers/misc/__init__.py +14 -0
  558. endoreg_db/serializers/misc/file_overview.py +182 -0
  559. endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
  560. endoreg_db/serializers/misc/stats.py +33 -0
  561. endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
  562. endoreg_db/serializers/misc/upload_job.py +71 -0
  563. endoreg_db/serializers/patient/__init__.py +11 -0
  564. endoreg_db/serializers/patient/patient.py +86 -0
  565. endoreg_db/serializers/patient/patient_dropdown.py +27 -0
  566. endoreg_db/serializers/patient_examination/__init__.py +7 -0
  567. endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
  568. endoreg_db/serializers/patient_finding/__init__.py +15 -0
  569. endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
  570. endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
  571. endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
  572. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
  573. endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
  574. endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
  575. endoreg_db/serializers/pdf/__init__.py +5 -0
  576. endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
  577. endoreg_db/serializers/report/__init__.py +9 -0
  578. endoreg_db/serializers/report/mixins.py +45 -0
  579. endoreg_db/serializers/report/report.py +105 -0
  580. endoreg_db/serializers/report/report_list.py +22 -0
  581. endoreg_db/serializers/report/secure_file_url.py +26 -0
  582. endoreg_db/serializers/requirements/requirement_schema.py +25 -0
  583. endoreg_db/serializers/requirements/requirement_sets.py +29 -0
  584. endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
  585. endoreg_db/serializers/video/__init__.py +7 -0
  586. endoreg_db/serializers/video/segmentation.py +263 -0
  587. endoreg_db/serializers/video/video_file_brief.py +10 -0
  588. endoreg_db/serializers/video/video_file_detail.py +83 -0
  589. endoreg_db/serializers/video/video_file_list.py +67 -0
  590. endoreg_db/serializers/video/video_metadata.py +105 -0
  591. endoreg_db/serializers/video/video_processing_history.py +153 -0
  592. endoreg_db/serializers/video_examination.py +198 -0
  593. endoreg_db/services/__init__.py +5 -0
  594. endoreg_db/services/anonymization.py +223 -0
  595. endoreg_db/services/examination_evaluation.py +149 -0
  596. endoreg_db/services/finding_description_service.py +0 -0
  597. endoreg_db/services/lookup_service.py +411 -0
  598. endoreg_db/services/lookup_store.py +266 -0
  599. endoreg_db/services/pdf_import.py +1382 -0
  600. endoreg_db/services/polling_coordinator.py +288 -0
  601. endoreg_db/services/pseudonym_service.py +89 -0
  602. endoreg_db/services/requirements_object.py +147 -0
  603. endoreg_db/services/segment_sync.py +155 -0
  604. endoreg_db/services/storage_aware_video_processor.py +344 -0
  605. endoreg_db/services/video_import.py +1259 -0
  606. endoreg_db/tasks/upload_tasks.py +207 -0
  607. endoreg_db/tasks/video_ingest.py +157 -0
  608. endoreg_db/tasks/video_processing_tasks.py +327 -0
  609. endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
  610. endoreg_db/templates/admin/start_examination.html +12 -0
  611. endoreg_db/templates/timeline.html +176 -0
  612. endoreg_db/urls/__init__.py +83 -0
  613. endoreg_db/urls/anonymization.py +32 -0
  614. endoreg_db/urls/auth.py +16 -0
  615. endoreg_db/urls/classification.py +39 -0
  616. endoreg_db/urls/examination.py +54 -0
  617. endoreg_db/urls/files.py +6 -0
  618. endoreg_db/urls/label_video_segment_validate.py +33 -0
  619. endoreg_db/urls/label_video_segments.py +46 -0
  620. endoreg_db/urls/media.py +227 -0
  621. endoreg_db/urls/patient.py +19 -0
  622. endoreg_db/urls/report.py +48 -0
  623. endoreg_db/urls/requirements.py +13 -0
  624. endoreg_db/urls/sensitive_meta.py +0 -0
  625. endoreg_db/urls/stats.py +46 -0
  626. endoreg_db/urls/upload.py +20 -0
  627. endoreg_db/urls/video.py +61 -0
  628. endoreg_db/urls.py +9 -0
  629. endoreg_db/utils/__init__.py +88 -0
  630. endoreg_db/utils/ai/__init__.py +9 -0
  631. endoreg_db/utils/ai/get.py +5 -0
  632. endoreg_db/utils/ai/inference_dataset.py +52 -0
  633. endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
  634. endoreg_db/utils/ai/postprocess.py +63 -0
  635. endoreg_db/utils/ai/predict.py +291 -0
  636. endoreg_db/utils/ai/preprocess.py +68 -0
  637. endoreg_db/utils/calc_duration_seconds.py +24 -0
  638. endoreg_db/utils/case_generator/__init__.py +0 -0
  639. endoreg_db/utils/case_generator/case_generator.py +159 -0
  640. endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
  641. endoreg_db/utils/case_generator/utils.py +30 -0
  642. endoreg_db/utils/check_video_files.py +148 -0
  643. endoreg_db/utils/cropping.py +29 -0
  644. endoreg_db/utils/dataloader.py +175 -0
  645. endoreg_db/utils/dates.py +60 -0
  646. endoreg_db/utils/env.py +33 -0
  647. endoreg_db/utils/extract_specific_frames.py +72 -0
  648. endoreg_db/utils/file_operations.py +58 -0
  649. endoreg_db/utils/fix_video_path_direct.py +141 -0
  650. endoreg_db/utils/frame_anonymization_utils.py +463 -0
  651. endoreg_db/utils/hashs.py +153 -0
  652. endoreg_db/utils/links/__init__.py +0 -0
  653. endoreg_db/utils/links/requirement_link.py +193 -0
  654. endoreg_db/utils/mime_types.py +0 -0
  655. endoreg_db/utils/names.py +76 -0
  656. endoreg_db/utils/ocr.py +190 -0
  657. endoreg_db/utils/parse_and_generate_yaml.py +46 -0
  658. endoreg_db/utils/paths.py +95 -0
  659. endoreg_db/utils/permissions.py +143 -0
  660. endoreg_db/utils/pipelines/Readme.md +235 -0
  661. endoreg_db/utils/pipelines/__init__.py +0 -0
  662. endoreg_db/utils/pipelines/process_video_dir.py +120 -0
  663. endoreg_db/utils/product/__init__.py +0 -0
  664. endoreg_db/utils/product/sum_emissions.py +20 -0
  665. endoreg_db/utils/product/sum_weights.py +18 -0
  666. endoreg_db/utils/pydantic_models/__init__.py +6 -0
  667. endoreg_db/utils/pydantic_models/db_config.py +57 -0
  668. endoreg_db/utils/requirement_helpers.py +0 -0
  669. endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
  670. endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
  671. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
  672. endoreg_db/utils/setup_config.py +177 -0
  673. endoreg_db/utils/translation.py +27 -0
  674. endoreg_db/utils/uuid.py +4 -0
  675. endoreg_db/utils/validate_endo_roi.py +19 -0
  676. endoreg_db/utils/validate_subcategory_dict.py +91 -0
  677. endoreg_db/utils/validate_video_detailed.py +357 -0
  678. endoreg_db/utils/video/__init__.py +26 -0
  679. endoreg_db/utils/video/extract_frames.py +88 -0
  680. endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
  681. endoreg_db/utils/video/names.py +42 -0
  682. endoreg_db/utils/video/streaming_processor.py +312 -0
  683. endoreg_db/utils/video/video_splitter.py +94 -0
  684. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
  685. endoreg_db/views/__init__.py +274 -0
  686. endoreg_db/views/anonymization/__init__.py +27 -0
  687. endoreg_db/views/anonymization/media_management.py +454 -0
  688. endoreg_db/views/anonymization/overview.py +216 -0
  689. endoreg_db/views/anonymization/validate.py +107 -0
  690. endoreg_db/views/auth/__init__.py +13 -0
  691. endoreg_db/views/auth/keycloak.py +113 -0
  692. endoreg_db/views/examination/__init__.py +33 -0
  693. endoreg_db/views/examination/examination.py +37 -0
  694. endoreg_db/views/examination/examination_manifest_cache.py +26 -0
  695. endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
  696. endoreg_db/views/examination/get_finding_classifications.py +36 -0
  697. endoreg_db/views/examination/get_findings.py +41 -0
  698. endoreg_db/views/examination/get_instruments.py +18 -0
  699. endoreg_db/views/examination/get_interventions.py +14 -0
  700. endoreg_db/views/finding/__init__.py +9 -0
  701. endoreg_db/views/finding/finding.py +112 -0
  702. endoreg_db/views/finding/get_classifications.py +14 -0
  703. endoreg_db/views/finding/get_interventions.py +17 -0
  704. endoreg_db/views/finding_classification/__init__.py +13 -0
  705. endoreg_db/views/finding_classification/base.py +0 -0
  706. endoreg_db/views/finding_classification/finding_classification.py +42 -0
  707. endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
  708. endoreg_db/views/label/__init__.py +5 -0
  709. endoreg_db/views/label/label.py +15 -0
  710. endoreg_db/views/label_video_segment/__init__.py +16 -0
  711. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
  712. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
  713. endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
  714. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
  715. endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
  716. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
  717. endoreg_db/views/label_video_segment/validate.py +226 -0
  718. endoreg_db/views/media/__init__.py +45 -0
  719. endoreg_db/views/media/pdf_media.py +388 -0
  720. endoreg_db/views/media/segments.py +71 -0
  721. endoreg_db/views/media/sensitive_metadata.py +314 -0
  722. endoreg_db/views/media/video_media.py +272 -0
  723. endoreg_db/views/media/video_segments.py +524 -0
  724. endoreg_db/views/meta/__init__.py +15 -0
  725. endoreg_db/views/meta/available_files_list.py +146 -0
  726. endoreg_db/views/meta/report_meta.py +53 -0
  727. endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
  728. endoreg_db/views/meta/sensitive_meta_list.py +104 -0
  729. endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
  730. endoreg_db/views/misc/__init__.py +63 -0
  731. endoreg_db/views/misc/center.py +13 -0
  732. endoreg_db/views/misc/csrf.py +7 -0
  733. endoreg_db/views/misc/gender.py +14 -0
  734. endoreg_db/views/misc/secure_file_serving_view.py +80 -0
  735. endoreg_db/views/misc/secure_file_url_view.py +84 -0
  736. endoreg_db/views/misc/secure_url_validate.py +79 -0
  737. endoreg_db/views/misc/stats.py +220 -0
  738. endoreg_db/views/misc/translation.py +182 -0
  739. endoreg_db/views/misc/upload_views.py +240 -0
  740. endoreg_db/views/patient/__init__.py +5 -0
  741. endoreg_db/views/patient/patient.py +210 -0
  742. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
  743. endoreg_db/views/patient_examination/__init__.py +11 -0
  744. endoreg_db/views/patient_examination/patient_examination.py +140 -0
  745. endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
  746. endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
  747. endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
  748. endoreg_db/views/patient_examination/video.py +194 -0
  749. endoreg_db/views/patient_finding/__init__.py +7 -0
  750. endoreg_db/views/patient_finding/base.py +0 -0
  751. endoreg_db/views/patient_finding/patient_finding.py +64 -0
  752. endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
  753. endoreg_db/views/patient_finding_classification/__init__.py +5 -0
  754. endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
  755. endoreg_db/views/patient_finding_location/__init__.py +5 -0
  756. endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
  757. endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
  758. endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
  759. endoreg_db/views/pdf/__init__.py +8 -0
  760. endoreg_db/views/pdf/pdf_stream.py +186 -0
  761. endoreg_db/views/pdf/reimport.py +177 -0
  762. endoreg_db/views/report/__init__.py +9 -0
  763. endoreg_db/views/report/report_list.py +112 -0
  764. endoreg_db/views/report/report_with_secure_url.py +28 -0
  765. endoreg_db/views/report/start_examination.py +7 -0
  766. endoreg_db/views/requirement/__init__.py +10 -0
  767. endoreg_db/views/requirement/evaluate.py +279 -0
  768. endoreg_db/views/requirement/lookup.py +367 -0
  769. endoreg_db/views/requirement/lookup_store.py +252 -0
  770. endoreg_db/views/requirement_lookup/lookup.py +0 -0
  771. endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
  772. endoreg_db/views/stats/__init__.py +13 -0
  773. endoreg_db/views/stats/stats_views.py +229 -0
  774. endoreg_db/views/video/__init__.py +59 -0
  775. endoreg_db/views/video/correction.py +530 -0
  776. endoreg_db/views/video/reimport.py +195 -0
  777. endoreg_db/views/video/segmentation.py +274 -0
  778. endoreg_db/views/video/task_status.py +49 -0
  779. endoreg_db/views/video/timeline.py +46 -0
  780. endoreg_db/views/video/video_analyze.py +52 -0
  781. endoreg_db/views/video/video_apply_mask.py +48 -0
  782. endoreg_db/views/video/video_correction.py +21 -0
  783. endoreg_db/views/video/video_download_processed.py +58 -0
  784. endoreg_db/views/video/video_examination_viewset.py +242 -0
  785. endoreg_db/views/video/video_meta.py +29 -0
  786. endoreg_db/views/video/video_processing_history.py +24 -0
  787. endoreg_db/views/video/video_remove_frames.py +48 -0
  788. endoreg_db/views/video/video_stream.py +306 -0
  789. endoreg_db/views.py +0 -0
  790. endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
  791. endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
  792. endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
  793. endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
@@ -0,0 +1,1857 @@
1
+ # Generated by Django 5.2.5 on 2025-09-15 11:52
2
+
3
+ import django.core.validators
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
9
+
10
+
11
+ class Migration(migrations.Migration):
12
+
13
+ initial = True
14
+
15
+ dependencies = [
16
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
17
+ ]
18
+
19
+ operations = [
20
+ migrations.CreateModel(
21
+ name='AiModel',
22
+ fields=[
23
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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)),
27
+ ],
28
+ ),
29
+ migrations.CreateModel(
30
+ name='CaseTemplateRuleType',
31
+ fields=[
32
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
33
+ ('name', models.CharField(max_length=255)),
34
+ ('description', models.TextField(blank=True, null=True)),
35
+ ],
36
+ ),
37
+ migrations.CreateModel(
38
+ name='CaseTemplateRuleValue',
39
+ fields=[
40
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
41
+ ('name', models.CharField(max_length=255)),
42
+ ('description', models.TextField(blank=True, null=True)),
43
+ ('fk_value', models.CharField(blank=True, max_length=255, null=True)),
44
+ ('numeric_value', models.FloatField(blank=True, null=True)),
45
+ ('text_value', models.CharField(blank=True, max_length=255, null=True)),
46
+ ],
47
+ ),
48
+ migrations.CreateModel(
49
+ name='CaseTemplateRuleValueType',
50
+ fields=[
51
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
52
+ ('name', models.CharField(max_length=255)),
53
+ ('description', models.TextField(blank=True, null=True)),
54
+ ('distribution_type', models.CharField(choices=[('single_categorical', 'single_categorical'), ('multiple_categorical', 'multiple_categorical'), ('numeric', 'numeric')], max_length=255)),
55
+ ],
56
+ ),
57
+ migrations.CreateModel(
58
+ name='CaseTemplateType',
59
+ fields=[
60
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
61
+ ('name', models.CharField(max_length=255)),
62
+ ('description', models.TextField(blank=True, null=True)),
63
+ ],
64
+ ),
65
+ migrations.CreateModel(
66
+ name='Center',
67
+ fields=[
68
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
69
+ ('name', models.CharField(max_length=255)),
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)),
78
+ ],
79
+ ),
80
+ migrations.CreateModel(
81
+ name='DateValueDistribution',
82
+ fields=[
83
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
84
+ ('name', models.CharField(max_length=100)),
85
+ ('description', models.TextField(blank=True, null=True)),
86
+ ('distribution_type', models.CharField(choices=[('uniform', 'Uniform'), ('normal', 'Normal')], max_length=20)),
87
+ ('mode', models.CharField(choices=[('date', 'Date'), ('timedelta', 'Timedelta')], max_length=20)),
88
+ ('date_min', models.DateField(blank=True, null=True)),
89
+ ('date_max', models.DateField(blank=True, null=True)),
90
+ ('date_mean', models.DateField(blank=True, null=True)),
91
+ ('date_std_dev', models.IntegerField(blank=True, null=True)),
92
+ ('timedelta_days_min', models.IntegerField(blank=True, null=True)),
93
+ ('timedelta_days_max', models.IntegerField(blank=True, null=True)),
94
+ ('timedelta_days_mean', models.IntegerField(blank=True, null=True)),
95
+ ('timedelta_days_std_dev', models.IntegerField(blank=True, null=True)),
96
+ ],
97
+ options={
98
+ 'abstract': False,
99
+ },
100
+ ),
101
+ migrations.CreateModel(
102
+ name='Disease',
103
+ fields=[
104
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
105
+ ('name', models.CharField(max_length=255, unique=True)),
106
+ ('subcategories', models.JSONField(default=dict)),
107
+ ('numerical_descriptors', models.JSONField(default=dict)),
108
+ ],
109
+ ),
110
+ migrations.CreateModel(
111
+ name='DocumentType',
112
+ fields=[
113
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
114
+ ('name', models.CharField(max_length=255, unique=True)),
115
+ ('description', models.TextField(blank=True, null=True)),
116
+ ],
117
+ options={
118
+ 'verbose_name': 'Document Type',
119
+ 'verbose_name_plural': 'Document Types',
120
+ },
121
+ ),
122
+ migrations.CreateModel(
123
+ name='EmissionFactor',
124
+ fields=[
125
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
126
+ ('name', models.CharField(max_length=255)),
127
+ ('value', models.FloatField()),
128
+ ],
129
+ ),
130
+ migrations.CreateModel(
131
+ name='EmployeeType',
132
+ fields=[
133
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
134
+ ('name', models.CharField(max_length=255, unique=True)),
135
+ ('description', models.TextField(blank=True, null=True)),
136
+ ('is_active', models.BooleanField(default=True)),
137
+ ],
138
+ ),
139
+ migrations.CreateModel(
140
+ name='EndoscopeType',
141
+ fields=[
142
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
143
+ ('name', models.CharField(max_length=255, unique=True)),
144
+ ],
145
+ options={
146
+ 'verbose_name': 'Endoscope Type',
147
+ 'verbose_name_plural': 'Endoscope Types',
148
+ 'ordering': ['name'],
149
+ },
150
+ ),
151
+ migrations.CreateModel(
152
+ name='EventClassification',
153
+ fields=[
154
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
155
+ ('name', models.CharField(max_length=255, unique=True)),
156
+ ],
157
+ ),
158
+ migrations.CreateModel(
159
+ name='Examination',
160
+ fields=[
161
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
162
+ ('name', models.CharField(max_length=100, unique=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)),
168
+ ],
169
+ options={
170
+ 'verbose_name': 'Examination',
171
+ 'verbose_name_plural': 'Examinations',
172
+ 'ordering': ['name'],
173
+ },
174
+ ),
175
+ migrations.CreateModel(
176
+ name='ExaminationType',
177
+ fields=[
178
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
179
+ ('name', models.CharField(max_length=100, unique=True)),
180
+ ],
181
+ ),
182
+ migrations.CreateModel(
183
+ name='FFMpegMeta',
184
+ fields=[
185
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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)),
195
+ ],
196
+ ),
197
+ migrations.CreateModel(
198
+ name='FindingClassificationChoice',
199
+ fields=[
200
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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)),
209
+ ],
210
+ ),
211
+ migrations.CreateModel(
212
+ name='FindingClassificationType',
213
+ fields=[
214
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
215
+ ('name', models.CharField(max_length=255, unique=True)),
216
+ ('description', models.TextField(blank=True)),
217
+ ],
218
+ ),
219
+ migrations.CreateModel(
220
+ name='FindingInterventionType',
221
+ fields=[
222
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
223
+ ('name', models.CharField(max_length=100, unique=True)),
224
+ ('description', models.TextField(blank=True, null=True)),
225
+ ],
226
+ ),
227
+ migrations.CreateModel(
228
+ name='FindingType',
229
+ fields=[
230
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
231
+ ('name', models.CharField(max_length=100, unique=True)),
232
+ ('description', models.TextField(blank=True, null=True)),
233
+ ],
234
+ ),
235
+ migrations.CreateModel(
236
+ name='FirstName',
237
+ fields=[
238
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
239
+ ('name', models.CharField(max_length=255, unique=True)),
240
+ ],
241
+ ),
242
+ migrations.CreateModel(
243
+ name='Gender',
244
+ fields=[
245
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
246
+ ('name', models.CharField(max_length=255)),
247
+ ('abbreviation', models.CharField(max_length=255, null=True)),
248
+ ('description', models.TextField(blank=True, null=True)),
249
+ ],
250
+ ),
251
+ migrations.CreateModel(
252
+ name='Label',
253
+ fields=[
254
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
255
+ ('name', models.CharField(max_length=255)),
256
+ ('description', models.TextField(blank=True, null=True)),
257
+ ],
258
+ ),
259
+ migrations.CreateModel(
260
+ name='LabelType',
261
+ fields=[
262
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
263
+ ('name', models.CharField(max_length=255)),
264
+ ('description', models.TextField(blank=True, null=True)),
265
+ ],
266
+ ),
267
+ migrations.CreateModel(
268
+ name='LastName',
269
+ fields=[
270
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
271
+ ('name', models.CharField(max_length=255, unique=True)),
272
+ ],
273
+ ),
274
+ migrations.CreateModel(
275
+ name='Medication',
276
+ fields=[
277
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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)),
285
+ ],
286
+ ),
287
+ migrations.CreateModel(
288
+ name='MedicationIndicationType',
289
+ fields=[
290
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
291
+ ('name', models.CharField(max_length=255, unique=True)),
292
+ ],
293
+ ),
294
+ migrations.CreateModel(
295
+ name='MedicationIntakeTime',
296
+ fields=[
297
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
298
+ ('name', models.CharField(max_length=255, unique=True)),
299
+ ('repeats', models.CharField(default='daily', max_length=20)),
300
+ ('time', models.TimeField()),
301
+ ],
302
+ ),
303
+ migrations.CreateModel(
304
+ name='ModelType',
305
+ fields=[
306
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
307
+ ('name', models.CharField(max_length=255)),
308
+ ('description', models.TextField(blank=True, null=True)),
309
+ ],
310
+ ),
311
+ migrations.CreateModel(
312
+ name='MultipleCategoricalValueDistribution',
313
+ fields=[
314
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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)),
322
+ ],
323
+ options={
324
+ 'abstract': False,
325
+ },
326
+ ),
327
+ migrations.CreateModel(
328
+ name='NumericValueDistribution',
329
+ fields=[
330
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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)),
335
+ ],
336
+ options={
337
+ 'abstract': False,
338
+ },
339
+ ),
340
+ migrations.CreateModel(
341
+ name='PatientLabSampleType',
342
+ fields=[
343
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
344
+ ('name', models.CharField(max_length=255)),
345
+ ('description', models.TextField(blank=True, null=True)),
346
+ ],
347
+ ),
348
+ migrations.CreateModel(
349
+ name='PdfType',
350
+ fields=[
351
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
352
+ ('name', models.CharField(max_length=255)),
353
+ ],
354
+ ),
355
+ migrations.CreateModel(
356
+ name='Product',
357
+ fields=[
358
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
359
+ ('name', models.CharField(max_length=255)),
360
+ ],
361
+ ),
362
+ migrations.CreateModel(
363
+ name='ProductGroup',
364
+ fields=[
365
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
366
+ ('name', models.CharField(max_length=255)),
367
+ ],
368
+ ),
369
+ migrations.CreateModel(
370
+ name='Profession',
371
+ fields=[
372
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
373
+ ('name', models.CharField(max_length=100)),
374
+ ('description', models.TextField(blank=True, null=True)),
375
+ ],
376
+ ),
377
+ migrations.CreateModel(
378
+ name='Qualification',
379
+ fields=[
380
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
381
+ ('name', models.CharField(max_length=255, unique=True)),
382
+ ('description', models.TextField(blank=True, null=True)),
383
+ ('is_active', models.BooleanField(default=True)),
384
+ ],
385
+ ),
386
+ migrations.CreateModel(
387
+ name='QualificationType',
388
+ fields=[
389
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
390
+ ('name', models.CharField(max_length=255, unique=True)),
391
+ ('description', models.TextField(blank=True, null=True)),
392
+ ('is_active', models.BooleanField(default=True)),
393
+ ],
394
+ ),
395
+ migrations.CreateModel(
396
+ name='RawPdfState',
397
+ fields=[
398
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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.')),
410
+ ],
411
+ options={
412
+ 'verbose_name': 'Raw PDF Processing State',
413
+ 'verbose_name_plural': 'Raw PDF Processing States',
414
+ },
415
+ ),
416
+ migrations.CreateModel(
417
+ name='ReportReaderFlag',
418
+ fields=[
419
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
420
+ ('name', models.CharField(max_length=255, unique=True)),
421
+ ('value', models.CharField(max_length=255)),
422
+ ],
423
+ ),
424
+ migrations.CreateModel(
425
+ name='RequirementOperator',
426
+ fields=[
427
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
428
+ ('name', models.CharField(max_length=100, unique=True)),
429
+ ('description', models.TextField(blank=True, null=True)),
430
+ ('evaluation_function_name', models.CharField(blank=True, max_length=255, null=True)),
431
+ ],
432
+ ),
433
+ migrations.CreateModel(
434
+ name='RequirementSetType',
435
+ fields=[
436
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
437
+ ('name', models.CharField(max_length=100, unique=True)),
438
+ ('description', models.TextField(blank=True, null=True)),
439
+ ],
440
+ ),
441
+ migrations.CreateModel(
442
+ name='RequirementType',
443
+ fields=[
444
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
445
+ ('name', models.CharField(max_length=100, unique=True)),
446
+ ('description', models.TextField(blank=True, null=True)),
447
+ ],
448
+ ),
449
+ migrations.CreateModel(
450
+ name='Resource',
451
+ fields=[
452
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
453
+ ('name', models.CharField(max_length=255)),
454
+ ],
455
+ ),
456
+ migrations.CreateModel(
457
+ name='RiskType',
458
+ fields=[
459
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
460
+ ('name', models.CharField(max_length=100, unique=True)),
461
+ ('description', models.TextField(blank=True, null=True)),
462
+ ],
463
+ ),
464
+ migrations.CreateModel(
465
+ name='RuleAttributeDType',
466
+ fields=[
467
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
468
+ ('name', models.CharField(max_length=255, unique=True)),
469
+ ],
470
+ ),
471
+ migrations.CreateModel(
472
+ name='RuleType',
473
+ fields=[
474
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
475
+ ('name', models.CharField(max_length=255, unique=True)),
476
+ ],
477
+ options={
478
+ 'verbose_name': 'Rule Type',
479
+ 'verbose_name_plural': 'Rule Types',
480
+ },
481
+ ),
482
+ migrations.CreateModel(
483
+ name='ScheduledDays',
484
+ fields=[
485
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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)),
501
+ ],
502
+ ),
503
+ migrations.CreateModel(
504
+ name='SingleCategoricalValueDistribution',
505
+ fields=[
506
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
507
+ ('name', models.CharField(max_length=100)),
508
+ ('categories', models.JSONField()),
509
+ ],
510
+ options={
511
+ 'abstract': False,
512
+ },
513
+ ),
514
+ migrations.CreateModel(
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)),
519
+ ],
520
+ options={
521
+ 'verbose_name': 'Tag',
522
+ 'verbose_name_plural': 'Tags',
523
+ },
524
+ ),
525
+ migrations.CreateModel(
526
+ name='Unit',
527
+ fields=[
528
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
529
+ ('name', models.CharField(max_length=100)),
530
+ ('description', models.CharField(blank=True, max_length=100, null=True)),
531
+ ('abbreviation', models.CharField(blank=True, max_length=25, null=True)),
532
+ ],
533
+ ),
534
+ migrations.CreateModel(
535
+ name='VideoImportMeta',
536
+ fields=[
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)),
539
+ ('video_anonymized', models.BooleanField(default=False)),
540
+ ('video_patient_data_detected', models.BooleanField(default=False)),
541
+ ('outside_detected', models.BooleanField(default=False)),
542
+ ('patient_data_removed', models.BooleanField(default=False)),
543
+ ('outside_removed', models.BooleanField(default=False)),
544
+ ],
545
+ ),
546
+ migrations.CreateModel(
547
+ name='VideoSegmentationLabel',
548
+ fields=[
549
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
550
+ ('name', models.CharField(max_length=255)),
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)),
554
+ ],
555
+ ),
556
+ migrations.CreateModel(
557
+ name='VideoState',
558
+ fields=[
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.')),
572
+ ('date_created', models.DateTimeField(auto_now_add=True)),
573
+ ('date_modified', models.DateTimeField(auto_now=True)),
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.')),
577
+ ],
578
+ options={
579
+ 'verbose_name': 'Video Processing State',
580
+ 'verbose_name_plural': 'Video Processing States',
581
+ },
582
+ ),
583
+ migrations.CreateModel(
584
+ name='Waste',
585
+ fields=[
586
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
587
+ ('name', models.CharField(max_length=255)),
588
+ ],
589
+ ),
590
+ migrations.CreateModel(
591
+ name='CaseTemplateRule',
592
+ fields=[
593
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
594
+ ('name', models.CharField(max_length=255)),
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')),
609
+ ],
610
+ ),
611
+ migrations.CreateModel(
612
+ name='CaseTemplate',
613
+ fields=[
614
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
615
+ ('name', models.CharField(max_length=255, unique=True)),
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')),
620
+ ],
621
+ ),
622
+ migrations.CreateModel(
623
+ name='DiseaseClassification',
624
+ fields=[
625
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
628
+ ],
629
+ ),
630
+ migrations.CreateModel(
631
+ name='DiseaseClassificationChoice',
632
+ fields=[
633
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
636
+ ],
637
+ ),
638
+ migrations.CreateModel(
639
+ name='Endoscope',
640
+ fields=[
641
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
642
+ ('name', models.CharField(max_length=255)),
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')),
646
+ ],
647
+ options={
648
+ 'verbose_name': 'Endoscope',
649
+ 'verbose_name_plural': 'Endoscopes',
650
+ 'ordering': ['name'],
651
+ },
652
+ ),
653
+ migrations.CreateModel(
654
+ name='EndoscopyProcessor',
655
+ fields=[
656
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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',
1076
+ fields=[
1077
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1086
+ ],
1087
+ options={
1088
+ 'verbose_name': 'Patient Disease',
1089
+ 'verbose_name_plural': 'Patient Diseases',
1090
+ },
1091
+ ),
1092
+ migrations.CreateModel(
1093
+ name='PatientEvent',
1094
+ fields=[
1095
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1105
+ ],
1106
+ ),
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
+ },
1122
+ ),
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
+ },
1143
+ ),
1144
+ migrations.CreateModel(
1145
+ name='AnonymExaminationReport',
1146
+ fields=[
1147
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1158
+ ],
1159
+ options={
1160
+ 'abstract': False,
1161
+ },
1162
+ ),
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
+ ],
1171
+ ),
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
+ },
1191
+ ),
1192
+ migrations.AddField(
1193
+ model_name='labelvideosegment',
1194
+ name='patient_findings',
1195
+ field=models.ManyToManyField(blank=True, related_name='video_segments', to='endoreg_db.patientfinding'),
1196
+ ),
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
+ },
1213
+ ),
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
+ ],
1226
+ ),
1227
+ migrations.CreateModel(
1228
+ name='PatientLabSample',
1229
+ fields=[
1230
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1234
+ ],
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
+ ),
1253
+ migrations.CreateModel(
1254
+ name='PatientMedicationSchedule',
1255
+ fields=[
1256
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1257
+ ('created_at', models.DateTimeField(auto_now_add=True)),
1258
+ ('updated_at', models.DateTimeField(auto_now=True)),
1259
+ ('medication', models.ManyToManyField(blank=True, related_name='patient_medication_schedules', to='endoreg_db.patientmedication')),
1260
+ ('patient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.patient')),
1261
+ ],
1262
+ ),
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
+ ],
1272
+ ),
1273
+ migrations.CreateModel(
1274
+ name='CenterProduct',
1275
+ fields=[
1276
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1280
+ ],
1281
+ options={
1282
+ 'verbose_name': 'Center Product Usage',
1283
+ 'verbose_name_plural': 'Center Product Usages',
1284
+ 'ordering': ['center', '-date_used', 'product'],
1285
+ },
1286
+ ),
1287
+ migrations.AddField(
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'),
1291
+ ),
1292
+ migrations.CreateModel(
1293
+ name='PortalUserInfo',
1294
+ fields=[
1295
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1300
+ ],
1301
+ ),
1302
+ migrations.AddField(
1303
+ model_name='employeetype',
1304
+ name='qualifications',
1305
+ field=models.ManyToManyField(related_name='employee_types', to='endoreg_db.qualification'),
1306
+ ),
1307
+ migrations.CreateModel(
1308
+ name='EmployeeQualification',
1309
+ fields=[
1310
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1313
+ ],
1314
+ ),
1315
+ migrations.AddField(
1316
+ model_name='qualification',
1317
+ name='qualification_types',
1318
+ field=models.ManyToManyField(related_name='qualifications', to='endoreg_db.qualificationtype'),
1319
+ ),
1320
+ migrations.CreateModel(
1321
+ name='ReferenceProduct',
1322
+ fields=[
1323
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1330
+ ],
1331
+ ),
1332
+ migrations.CreateModel(
1333
+ name='ReportReaderConfig',
1334
+ fields=[
1335
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1345
+ ],
1346
+ ),
1347
+ migrations.AddField(
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'),
1351
+ ),
1352
+ migrations.AddField(
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'),
1356
+ ),
1357
+ migrations.AddField(
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'),
1361
+ ),
1362
+ migrations.AddField(
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'),
1366
+ ),
1367
+ migrations.AddField(
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'),
1371
+ ),
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
+ ],
1414
+ ),
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
+ ],
1458
+ ),
1459
+ migrations.CreateModel(
1460
+ name='RawPdfFile',
1461
+ fields=[
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)),
1465
+ ('date_created', models.DateTimeField(auto_now_add=True)),
1466
+ ('date_modified', models.DateTimeField(auto_now=True)),
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')),
1499
+ ],
1500
+ options={
1501
+ 'abstract': False,
1502
+ },
1503
+ ),
1504
+ migrations.AddField(
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'),
1508
+ ),
1509
+ migrations.CreateModel(
1510
+ name='SensitiveMetaState',
1511
+ fields=[
1512
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1518
+ ],
1519
+ options={
1520
+ 'verbose_name': 'Sensitive Meta State',
1521
+ 'verbose_name_plural': 'Sensitive Meta States',
1522
+ },
1523
+ ),
1524
+ migrations.CreateModel(
1525
+ name='Shift',
1526
+ fields=[
1527
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1533
+ ],
1534
+ ),
1535
+ migrations.CreateModel(
1536
+ name='CenterShift',
1537
+ fields=[
1538
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1547
+ ],
1548
+ ),
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
+ ],
1562
+ ),
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
+ ],
1572
+ ),
1573
+ migrations.AddField(
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'),
1577
+ ),
1578
+ migrations.CreateModel(
1579
+ name='ProductWeight',
1580
+ fields=[
1581
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1588
+ ],
1589
+ ),
1590
+ migrations.CreateModel(
1591
+ name='ProductMaterial',
1592
+ fields=[
1593
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1599
+ ],
1600
+ ),
1601
+ migrations.CreateModel(
1602
+ name='PatientLabValue',
1603
+ fields=[
1604
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1613
+ ],
1614
+ ),
1615
+ migrations.AddField(
1616
+ model_name='medication',
1617
+ name='default_unit',
1618
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.unit'),
1619
+ ),
1620
+ migrations.AddField(
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'),
1624
+ ),
1625
+ migrations.CreateModel(
1626
+ name='CenterResource',
1627
+ fields=[
1628
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1650
+ ],
1651
+ options={
1652
+ 'verbose_name': 'Upload Job',
1653
+ 'verbose_name_plural': 'Upload Jobs',
1654
+ 'ordering': ['-created_at'],
1655
+ },
1656
+ ),
1657
+ migrations.CreateModel(
1658
+ name='VideoFile',
1659
+ fields=[
1660
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1687
+ ],
1688
+ ),
1689
+ migrations.AddField(
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'),
1693
+ ),
1694
+ migrations.AddField(
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'),
1698
+ ),
1699
+ migrations.CreateModel(
1700
+ name='Frame',
1701
+ fields=[
1702
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1708
+ ],
1709
+ options={
1710
+ 'ordering': ['video', 'frame_number'],
1711
+ },
1712
+ ),
1713
+ migrations.CreateModel(
1714
+ name='VideoMeta',
1715
+ fields=[
1716
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1717
+ ('center', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='endoreg_db.center')),
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')),
1722
+ ],
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
+ ),
1729
+ migrations.CreateModel(
1730
+ name='VideoPredictionMeta',
1731
+ fields=[
1732
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1738
+ ],
1739
+ ),
1740
+ migrations.AddField(
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'),
1744
+ ),
1745
+ migrations.CreateModel(
1746
+ name='VideoSegmentationAnnotation',
1747
+ fields=[
1748
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1754
+ ],
1755
+ ),
1756
+ migrations.CreateModel(
1757
+ name='VideoSegmentationLabelSet',
1758
+ fields=[
1759
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1760
+ ('name', models.CharField(max_length=255)),
1761
+ ('description', models.TextField(blank=True, null=True)),
1762
+ ('labels', models.ManyToManyField(related_name='labelsets', to='endoreg_db.videosegmentationlabel')),
1763
+ ],
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
+ ),
1775
+ migrations.CreateModel(
1776
+ name='CenterWaste',
1777
+ fields=[
1778
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1785
+ ],
1786
+ ),
1787
+ migrations.CreateModel(
1788
+ name='ImageClassificationAnnotation',
1789
+ fields=[
1790
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
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')),
1800
+ ],
1801
+ options={
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')],
1803
+ },
1804
+ ),
1805
+ migrations.AddIndex(
1806
+ model_name='patientfinding',
1807
+ index=models.Index(fields=['patient_examination', 'finding'], name='endoreg_db__patient_54869f_idx'),
1808
+ ),
1809
+ migrations.AddIndex(
1810
+ model_name='patientfinding',
1811
+ index=models.Index(fields=['patient_examination', 'is_active'], name='endoreg_db__patient_9359f8_idx'),
1812
+ ),
1813
+ migrations.AddIndex(
1814
+ model_name='patientfinding',
1815
+ index=models.Index(fields=['created_at'], name='endoreg_db__created_b44d86_idx'),
1816
+ ),
1817
+ migrations.AddIndex(
1818
+ model_name='patientfinding',
1819
+ index=models.Index(fields=['finding', 'is_active'], name='endoreg_db__finding_2f036b_idx'),
1820
+ ),
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'),
1824
+ ),
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'),
1828
+ ),
1829
+ migrations.AlterUniqueTogether(
1830
+ name='frame',
1831
+ unique_together={('video', 'frame_number')},
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
+ ),
1857
+ ]