endoreg-db 0.8.6.1__py3-none-any.whl → 0.8.8.0__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 (360) hide show
  1. endoreg_db/authz/auth.py +74 -0
  2. endoreg_db/authz/backends.py +168 -0
  3. endoreg_db/authz/management/commands/list_routes.py +18 -0
  4. endoreg_db/authz/middleware.py +83 -0
  5. endoreg_db/authz/permissions.py +127 -0
  6. endoreg_db/authz/policy.py +218 -0
  7. endoreg_db/authz/views_auth.py +66 -0
  8. endoreg_db/config/env.py +13 -8
  9. endoreg_db/data/__init__.py +8 -31
  10. endoreg_db/data/_examples/disease.yaml +55 -0
  11. endoreg_db/data/_examples/disease_classification.yaml +13 -0
  12. endoreg_db/data/_examples/disease_classification_choice.yaml +62 -0
  13. endoreg_db/data/_examples/event.yaml +64 -0
  14. endoreg_db/data/_examples/examination.yaml +72 -0
  15. endoreg_db/data/_examples/finding/anatomy_colon.yaml +128 -0
  16. endoreg_db/data/_examples/finding/colonoscopy.yaml +40 -0
  17. endoreg_db/data/_examples/finding/colonoscopy_bowel_prep.yaml +56 -0
  18. endoreg_db/data/_examples/finding/complication.yaml +16 -0
  19. endoreg_db/data/_examples/finding/data.yaml +105 -0
  20. endoreg_db/data/_examples/finding/examination_setting.yaml +16 -0
  21. endoreg_db/data/_examples/finding/medication_related.yaml +18 -0
  22. endoreg_db/data/_examples/finding/outcome.yaml +12 -0
  23. endoreg_db/data/_examples/finding_classification/colonoscopy_bowel_preparation.yaml +68 -0
  24. endoreg_db/data/_examples/finding_classification/colonoscopy_jnet.yaml +22 -0
  25. endoreg_db/data/_examples/finding_classification/colonoscopy_kudo.yaml +25 -0
  26. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  27. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  28. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  29. endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  30. endoreg_db/data/_examples/finding_classification/colonoscopy_location.yaml +80 -0
  31. endoreg_db/data/_examples/finding_classification/colonoscopy_lst.yaml +21 -0
  32. endoreg_db/data/_examples/finding_classification/colonoscopy_nice.yaml +20 -0
  33. endoreg_db/data/_examples/finding_classification/colonoscopy_paris.yaml +26 -0
  34. endoreg_db/data/_examples/finding_classification/colonoscopy_sano.yaml +22 -0
  35. endoreg_db/data/_examples/finding_classification/colonoscopy_summary.yaml +53 -0
  36. endoreg_db/data/_examples/finding_classification/complication_generic.yaml +25 -0
  37. endoreg_db/data/_examples/finding_classification/examination_setting_generic.yaml +40 -0
  38. endoreg_db/data/_examples/finding_classification/histology_colo.yaml +51 -0
  39. endoreg_db/data/_examples/finding_classification/intervention_required.yaml +26 -0
  40. endoreg_db/data/_examples/finding_classification/medication_related.yaml +23 -0
  41. endoreg_db/data/_examples/finding_classification/visualized.yaml +33 -0
  42. endoreg_db/data/_examples/finding_classification_choice/bowel_preparation.yaml +78 -0
  43. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
  44. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  45. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  46. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  47. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_nice.yaml +17 -0
  48. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_paris.yaml +57 -0
  49. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
  50. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  51. endoreg_db/data/_examples/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
  52. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_location.yaml +229 -0
  53. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  54. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_size.yaml +82 -0
  55. endoreg_db/data/_examples/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  56. endoreg_db/data/_examples/finding_classification_choice/complication_generic_types.yaml +15 -0
  57. endoreg_db/data/_examples/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  58. endoreg_db/data/_examples/finding_classification_choice/histology.yaml +24 -0
  59. endoreg_db/data/_examples/finding_classification_choice/histology_polyp.yaml +20 -0
  60. endoreg_db/data/_examples/finding_classification_choice/outcome.yaml +19 -0
  61. endoreg_db/data/_examples/finding_classification_choice/yes_no_na.yaml +11 -0
  62. endoreg_db/data/_examples/finding_classification_type/colonoscopy_basic.yaml +48 -0
  63. endoreg_db/data/_examples/finding_intervention/endoscopy.yaml +43 -0
  64. endoreg_db/data/_examples/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
  65. endoreg_db/data/_examples/finding_intervention/endoscopy_egd.yaml +128 -0
  66. endoreg_db/data/_examples/finding_intervention/endoscopy_ercp.yaml +32 -0
  67. endoreg_db/data/_examples/finding_intervention/endoscopy_eus_lower.yaml +9 -0
  68. endoreg_db/data/_examples/finding_intervention/endoscopy_eus_upper.yaml +36 -0
  69. endoreg_db/data/_examples/finding_intervention_type/endoscopy.yaml +15 -0
  70. endoreg_db/data/_examples/finding_type/data.yaml +43 -0
  71. endoreg_db/data/_examples/requirement/age.yaml +26 -0
  72. endoreg_db/data/_examples/requirement/colonoscopy_baseline_austria.yaml +45 -0
  73. endoreg_db/data/_examples/requirement/disease_cardiovascular.yaml +79 -0
  74. endoreg_db/data/_examples/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
  75. endoreg_db/data/_examples/requirement/disease_hepatology.yaml +12 -0
  76. endoreg_db/data/_examples/requirement/disease_misc.yaml +12 -0
  77. endoreg_db/data/_examples/requirement/disease_renal.yaml +96 -0
  78. endoreg_db/data/_examples/requirement/endoscopy_bleeding_risk.yaml +59 -0
  79. endoreg_db/data/_examples/requirement/event_cardiology.yaml +251 -0
  80. endoreg_db/data/_examples/requirement/event_requirements.yaml +145 -0
  81. endoreg_db/data/_examples/requirement/finding_colon_polyp.yaml +50 -0
  82. endoreg_db/data/_examples/requirement/gender.yaml +25 -0
  83. endoreg_db/data/_examples/requirement/lab_value.yaml +441 -0
  84. endoreg_db/data/_examples/requirement/medication.yaml +93 -0
  85. endoreg_db/data/_examples/requirement_operator/age.yaml +13 -0
  86. endoreg_db/data/_examples/requirement_operator/lab_operators.yaml +129 -0
  87. endoreg_db/data/_examples/requirement_operator/model_operators.yaml +96 -0
  88. endoreg_db/data/_examples/requirement_set/01_endoscopy_generic.yaml +48 -0
  89. endoreg_db/data/_examples/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  90. endoreg_db/data/_examples/yaml_examples.xlsx +0 -0
  91. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +4 -3
  92. endoreg_db/data/event_classification/data.yaml +4 -0
  93. endoreg_db/data/event_classification_choice/data.yaml +9 -0
  94. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +43 -70
  95. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +22 -52
  96. endoreg_db/data/finding_classification/colonoscopy_location.yaml +31 -62
  97. endoreg_db/data/finding_classification/histology_colo.yaml +28 -36
  98. endoreg_db/data/requirement/colon_polyp_intervention.yaml +49 -0
  99. endoreg_db/data/requirement/coloreg_colon_polyp.yaml +49 -0
  100. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +31 -12
  101. endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
  102. endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
  103. endoreg_db/data/requirement_set/90_coloreg.yaml +178 -0
  104. endoreg_db/data/requirement_set/_old_ +109 -0
  105. endoreg_db/data/requirement_set_type/data.yaml +21 -0
  106. endoreg_db/data/setup_config.yaml +4 -4
  107. endoreg_db/data/tag/requirement_set_tags.yaml +21 -0
  108. endoreg_db/exceptions.py +5 -2
  109. endoreg_db/helpers/data_loader.py +1 -1
  110. endoreg_db/management/commands/create_model_meta_from_huggingface.py +21 -10
  111. endoreg_db/management/commands/create_multilabel_model_meta.py +299 -129
  112. endoreg_db/management/commands/import_video.py +9 -10
  113. endoreg_db/management/commands/import_video_with_classification.py +1 -1
  114. endoreg_db/management/commands/init_default_ai_model.py +1 -1
  115. endoreg_db/management/commands/list_routes.py +18 -0
  116. endoreg_db/management/commands/load_center_data.py +12 -12
  117. endoreg_db/management/commands/load_requirement_data.py +60 -31
  118. endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
  119. endoreg_db/management/commands/setup_endoreg_db.py +3 -3
  120. endoreg_db/management/commands/storage_management.py +271 -203
  121. endoreg_db/migrations/0001_initial.py +1799 -1300
  122. endoreg_db/migrations/0002_requirementset_depends_on.py +18 -0
  123. endoreg_db/migrations/_old/0001_initial.py +1857 -0
  124. endoreg_db/migrations/_old/0004_employee_city_employee_post_code_employee_street_and_more.py +68 -0
  125. endoreg_db/migrations/_old/0004_remove_casetemplate_rules_and_more.py +77 -0
  126. endoreg_db/migrations/_old/0005_merge_20251111_1003.py +14 -0
  127. endoreg_db/migrations/_old/0006_sensitivemeta_anonymized_text_and_more.py +68 -0
  128. endoreg_db/migrations/_old/0007_remove_rule_attribute_dtype_remove_rule_rule_type_and_more.py +89 -0
  129. endoreg_db/migrations/_old/0008_remove_event_event_classification_and_more.py +27 -0
  130. endoreg_db/migrations/_old/0009_alter_modelmeta_options_and_more.py +21 -0
  131. endoreg_db/models/__init__.py +78 -123
  132. endoreg_db/models/administration/__init__.py +21 -42
  133. endoreg_db/models/administration/ai/active_model.py +2 -2
  134. endoreg_db/models/administration/ai/ai_model.py +7 -6
  135. endoreg_db/models/administration/case/__init__.py +1 -15
  136. endoreg_db/models/administration/case/case.py +3 -3
  137. endoreg_db/models/administration/case/case_template/__init__.py +2 -14
  138. endoreg_db/models/administration/case/case_template/case_template.py +2 -124
  139. endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
  140. endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
  141. endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
  142. endoreg_db/models/administration/center/center.py +33 -19
  143. endoreg_db/models/administration/center/center_product.py +12 -9
  144. endoreg_db/models/administration/center/center_resource.py +25 -19
  145. endoreg_db/models/administration/center/center_shift.py +21 -17
  146. endoreg_db/models/administration/center/center_waste.py +16 -8
  147. endoreg_db/models/administration/person/__init__.py +2 -0
  148. endoreg_db/models/administration/person/employee/employee.py +10 -5
  149. endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
  150. endoreg_db/models/administration/person/employee/employee_type.py +12 -6
  151. endoreg_db/models/administration/person/examiner/examiner.py +13 -11
  152. endoreg_db/models/administration/person/patient/__init__.py +2 -0
  153. endoreg_db/models/administration/person/patient/patient.py +103 -100
  154. endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
  155. endoreg_db/models/administration/person/person.py +4 -0
  156. endoreg_db/models/administration/person/profession/__init__.py +8 -4
  157. endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
  158. endoreg_db/models/administration/product/product.py +20 -15
  159. endoreg_db/models/administration/product/product_material.py +17 -18
  160. endoreg_db/models/administration/product/product_weight.py +12 -8
  161. endoreg_db/models/administration/product/reference_product.py +23 -55
  162. endoreg_db/models/administration/qualification/qualification.py +7 -3
  163. endoreg_db/models/administration/qualification/qualification_type.py +7 -3
  164. endoreg_db/models/administration/shift/scheduled_days.py +8 -5
  165. endoreg_db/models/administration/shift/shift.py +16 -12
  166. endoreg_db/models/administration/shift/shift_type.py +23 -31
  167. endoreg_db/models/label/__init__.py +7 -8
  168. endoreg_db/models/label/annotation/image_classification.py +10 -9
  169. endoreg_db/models/label/annotation/video_segmentation_annotation.py +8 -5
  170. endoreg_db/models/label/label.py +15 -15
  171. endoreg_db/models/label/label_set.py +19 -6
  172. endoreg_db/models/label/label_type.py +1 -1
  173. endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
  174. endoreg_db/models/label/label_video_segment/label_video_segment.py +76 -102
  175. endoreg_db/models/label/video_segmentation_label.py +4 -0
  176. endoreg_db/models/label/video_segmentation_labelset.py +4 -3
  177. endoreg_db/models/media/frame/frame.py +22 -22
  178. endoreg_db/models/media/pdf/raw_pdf.py +110 -182
  179. endoreg_db/models/media/pdf/report_file.py +25 -29
  180. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +30 -46
  181. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
  182. endoreg_db/models/media/video/__init__.py +1 -0
  183. endoreg_db/models/media/video/create_from_file.py +48 -56
  184. endoreg_db/models/media/video/pipe_2.py +8 -9
  185. endoreg_db/models/media/video/video_file.py +150 -108
  186. endoreg_db/models/media/video/video_file_ai.py +288 -74
  187. endoreg_db/models/media/video/video_file_anonymize.py +38 -38
  188. endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
  189. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
  190. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
  191. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
  192. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
  193. endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
  194. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
  195. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
  196. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
  197. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
  198. endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
  199. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
  200. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
  201. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
  202. endoreg_db/models/media/video/video_file_io.py +109 -62
  203. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
  204. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
  205. endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
  206. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
  207. endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
  208. endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
  209. endoreg_db/models/media/video/video_file_segments.py +24 -17
  210. endoreg_db/models/media/video/video_metadata.py +19 -35
  211. endoreg_db/models/media/video/video_processing.py +96 -95
  212. endoreg_db/models/medical/contraindication/__init__.py +13 -3
  213. endoreg_db/models/medical/disease.py +22 -16
  214. endoreg_db/models/medical/event.py +31 -18
  215. endoreg_db/models/medical/examination/__init__.py +13 -6
  216. endoreg_db/models/medical/examination/examination.py +17 -18
  217. endoreg_db/models/medical/examination/examination_indication.py +26 -25
  218. endoreg_db/models/medical/examination/examination_time.py +16 -6
  219. endoreg_db/models/medical/examination/examination_time_type.py +9 -6
  220. endoreg_db/models/medical/examination/examination_type.py +3 -4
  221. endoreg_db/models/medical/finding/finding.py +38 -39
  222. endoreg_db/models/medical/finding/finding_classification.py +37 -48
  223. endoreg_db/models/medical/finding/finding_intervention.py +27 -22
  224. endoreg_db/models/medical/finding/finding_type.py +13 -12
  225. endoreg_db/models/medical/hardware/endoscope.py +20 -26
  226. endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
  227. endoreg_db/models/medical/laboratory/lab_value.py +62 -91
  228. endoreg_db/models/medical/medication/medication.py +22 -10
  229. endoreg_db/models/medical/medication/medication_indication.py +29 -3
  230. endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
  231. endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
  232. endoreg_db/models/medical/medication/medication_schedule.py +27 -16
  233. endoreg_db/models/medical/organ/__init__.py +15 -12
  234. endoreg_db/models/medical/patient/medication_examples.py +1 -5
  235. endoreg_db/models/medical/patient/patient_disease.py +20 -23
  236. endoreg_db/models/medical/patient/patient_event.py +19 -22
  237. endoreg_db/models/medical/patient/patient_examination.py +48 -54
  238. endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
  239. endoreg_db/models/medical/patient/patient_finding.py +122 -139
  240. endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
  241. endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
  242. endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
  243. endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
  244. endoreg_db/models/medical/patient/patient_medication.py +27 -38
  245. endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
  246. endoreg_db/models/medical/risk/risk.py +7 -6
  247. endoreg_db/models/medical/risk/risk_type.py +8 -5
  248. endoreg_db/models/metadata/model_meta.py +60 -29
  249. endoreg_db/models/metadata/model_meta_logic.py +125 -18
  250. endoreg_db/models/metadata/pdf_meta.py +19 -24
  251. endoreg_db/models/metadata/sensitive_meta.py +102 -85
  252. endoreg_db/models/metadata/sensitive_meta_logic.py +192 -173
  253. endoreg_db/models/metadata/video_meta.py +51 -31
  254. endoreg_db/models/metadata/video_prediction_logic.py +16 -23
  255. endoreg_db/models/metadata/video_prediction_meta.py +29 -33
  256. endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
  257. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
  258. endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
  259. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
  260. endoreg_db/models/other/emission/emission_factor.py +18 -8
  261. endoreg_db/models/other/gender.py +10 -5
  262. endoreg_db/models/other/information_source.py +25 -25
  263. endoreg_db/models/other/material.py +9 -5
  264. endoreg_db/models/other/resource.py +6 -4
  265. endoreg_db/models/other/tag.py +10 -5
  266. endoreg_db/models/other/transport_route.py +13 -8
  267. endoreg_db/models/other/unit.py +10 -6
  268. endoreg_db/models/other/waste.py +6 -5
  269. endoreg_db/models/requirement/requirement.py +580 -272
  270. endoreg_db/models/requirement/requirement_error.py +85 -0
  271. endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
  272. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
  273. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
  274. endoreg_db/models/requirement/requirement_operator.py +36 -33
  275. endoreg_db/models/requirement/requirement_set.py +74 -57
  276. endoreg_db/models/state/__init__.py +4 -4
  277. endoreg_db/models/state/abstract.py +2 -2
  278. endoreg_db/models/state/anonymization.py +12 -0
  279. endoreg_db/models/state/audit_ledger.py +46 -47
  280. endoreg_db/models/state/label_video_segment.py +9 -0
  281. endoreg_db/models/state/raw_pdf.py +40 -46
  282. endoreg_db/models/state/sensitive_meta.py +6 -2
  283. endoreg_db/models/state/video.py +58 -53
  284. endoreg_db/models/upload_job.py +32 -55
  285. endoreg_db/models/utils.py +1 -2
  286. endoreg_db/root_urls.py +21 -2
  287. endoreg_db/serializers/__init__.py +0 -2
  288. endoreg_db/serializers/anonymization.py +18 -10
  289. endoreg_db/serializers/meta/report_meta.py +1 -1
  290. endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
  291. endoreg_db/serializers/misc/file_overview.py +11 -99
  292. endoreg_db/serializers/requirements/requirement_sets.py +92 -22
  293. endoreg_db/serializers/video/segmentation.py +2 -1
  294. endoreg_db/serializers/video/video_processing_history.py +20 -5
  295. endoreg_db/services/anonymization.py +75 -73
  296. endoreg_db/services/lookup_service.py +37 -24
  297. endoreg_db/services/pdf_import.py +166 -68
  298. endoreg_db/services/storage_aware_video_processor.py +140 -114
  299. endoreg_db/services/video_import.py +193 -283
  300. endoreg_db/urls/__init__.py +7 -20
  301. endoreg_db/urls/media.py +108 -67
  302. endoreg_db/urls/root_urls.py +29 -0
  303. endoreg_db/utils/__init__.py +15 -5
  304. endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
  305. endoreg_db/utils/case_generator/__init__.py +3 -0
  306. endoreg_db/utils/dataloader.py +88 -16
  307. endoreg_db/utils/defaults/set_default_center.py +32 -0
  308. endoreg_db/utils/names.py +22 -16
  309. endoreg_db/utils/permissions.py +2 -1
  310. endoreg_db/utils/pipelines/process_video_dir.py +1 -1
  311. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +414 -127
  312. endoreg_db/utils/setup_config.py +8 -5
  313. endoreg_db/utils/storage.py +115 -0
  314. endoreg_db/utils/validate_endo_roi.py +8 -2
  315. endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
  316. endoreg_db/views/__init__.py +0 -10
  317. endoreg_db/views/anonymization/media_management.py +198 -163
  318. endoreg_db/views/anonymization/overview.py +4 -1
  319. endoreg_db/views/anonymization/validate.py +174 -40
  320. endoreg_db/views/media/__init__.py +2 -0
  321. endoreg_db/views/media/pdf_media.py +131 -152
  322. endoreg_db/views/media/sensitive_metadata.py +46 -6
  323. endoreg_db/views/media/video_media.py +89 -82
  324. endoreg_db/views/media/video_segments.py +2 -3
  325. endoreg_db/views/meta/sensitive_meta_detail.py +0 -63
  326. endoreg_db/views/patient/patient.py +5 -4
  327. endoreg_db/views/pdf/pdf_stream.py +20 -21
  328. endoreg_db/views/pdf/reimport.py +11 -32
  329. endoreg_db/views/requirement/evaluate.py +188 -187
  330. endoreg_db/views/requirement/lookup.py +17 -3
  331. endoreg_db/views/requirement/requirement_utils.py +89 -0
  332. endoreg_db/views/video/__init__.py +0 -2
  333. endoreg_db/views/video/correction.py +2 -2
  334. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/METADATA +7 -3
  335. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/RECORD +341 -245
  336. endoreg_db/models/administration/permissions/__init__.py +0 -44
  337. endoreg_db/models/media/video/video_file_frames.py +0 -0
  338. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  339. endoreg_db/models/rule/__init__.py +0 -13
  340. endoreg_db/models/rule/rule.py +0 -27
  341. endoreg_db/models/rule/rule_applicator.py +0 -224
  342. endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
  343. endoreg_db/models/rule/rule_type.py +0 -20
  344. endoreg_db/models/rule/ruleset.py +0 -17
  345. endoreg_db/serializers/video/video_metadata.py +0 -105
  346. endoreg_db/urls/report.py +0 -48
  347. endoreg_db/urls/video.py +0 -61
  348. endoreg_db/utils/case_generator/case_generator.py +0 -159
  349. endoreg_db/utils/case_generator/utils.py +0 -30
  350. endoreg_db/views/report/__init__.py +0 -9
  351. endoreg_db/views/report/report_list.py +0 -112
  352. endoreg_db/views/report/report_with_secure_url.py +0 -28
  353. endoreg_db/views/report/start_examination.py +0 -7
  354. endoreg_db/views.py +0 -0
  355. /endoreg_db/data/{requirement_set → _examples/requirement_set}/endoscopy_bleeding_risk.yaml +0 -0
  356. /endoreg_db/migrations/{0002_add_video_correction_models.py → _old/0002_add_video_correction_models.py} +0 -0
  357. /endoreg_db/migrations/{0003_add_center_display_name.py → _old/0003_add_center_display_name.py} +0 -0
  358. /endoreg_db/{models/media/video/refactor_plan.md → views/pdf/pdf_stream_views.py} +0 -0
  359. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/WHEEL +0 -0
  360. {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,15 +1,15 @@
1
- # Generated by Django 5.2.5 on 2025-09-15 11:52
1
+ # Generated by Django 5.2.7 on 2025-11-16 16:55
2
+
3
+ import uuid
4
+ from decimal import Decimal
2
5
 
3
6
  import django.core.validators
4
7
  import django.db.models.deletion
5
- import pathlib
6
- import uuid
7
8
  from django.conf import settings
8
9
  from django.db import migrations, models
9
10
 
10
11
 
11
12
  class Migration(migrations.Migration):
12
-
13
13
  initial = True
14
14
 
15
15
  dependencies = [
@@ -18,1840 +18,2339 @@ class Migration(migrations.Migration):
18
18
 
19
19
  operations = [
20
20
  migrations.CreateModel(
21
- name='AiModel',
21
+ name="AiModel",
22
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)),
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
27
  ],
28
28
  ),
29
29
  migrations.CreateModel(
30
- name='CaseTemplateRuleType',
30
+ name="Center",
31
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)),
32
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
33
+ ("name", models.CharField(max_length=255)),
34
+ ("display_name", models.CharField(blank=True, default="", max_length=255)),
35
35
  ],
36
36
  ),
37
37
  migrations.CreateModel(
38
- name='CaseTemplateRuleValue',
38
+ name="Contraindication",
39
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)),
40
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
41
+ ("name", models.CharField(max_length=100, unique=True)),
42
+ ("description", models.TextField(blank=True, null=True)),
46
43
  ],
47
44
  ),
48
45
  migrations.CreateModel(
49
- name='CaseTemplateRuleValueType',
46
+ name="DateValueDistribution",
50
47
  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)),
48
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
49
+ ("name", models.CharField(max_length=100)),
50
+ ("description", models.TextField(blank=True, null=True)),
51
+ ("distribution_type", models.CharField(choices=[("uniform", "Uniform"), ("normal", "Normal")], max_length=20)),
52
+ ("mode", models.CharField(choices=[("date", "Date"), ("timedelta", "Timedelta")], max_length=20)),
53
+ ("date_min", models.DateField(blank=True, null=True)),
54
+ ("date_max", models.DateField(blank=True, null=True)),
55
+ ("date_mean", models.DateField(blank=True, null=True)),
56
+ ("date_std_dev", models.IntegerField(blank=True, null=True)),
57
+ ("timedelta_days_min", models.IntegerField(blank=True, null=True)),
58
+ ("timedelta_days_max", models.IntegerField(blank=True, null=True)),
59
+ ("timedelta_days_mean", models.IntegerField(blank=True, null=True)),
60
+ ("timedelta_days_std_dev", models.IntegerField(blank=True, null=True)),
96
61
  ],
97
62
  options={
98
- 'abstract': False,
63
+ "abstract": False,
99
64
  },
100
65
  ),
101
66
  migrations.CreateModel(
102
- name='Disease',
67
+ name="Disease",
103
68
  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)),
69
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
70
+ ("name", models.CharField(max_length=255, unique=True)),
71
+ ("subcategories", models.JSONField(default=dict)),
72
+ ("numerical_descriptors", models.JSONField(default=dict)),
108
73
  ],
109
74
  ),
110
75
  migrations.CreateModel(
111
- name='DocumentType',
76
+ name="DocumentType",
112
77
  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)),
78
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
79
+ ("name", models.CharField(max_length=255, unique=True)),
80
+ ("description", models.TextField(blank=True, null=True)),
116
81
  ],
117
82
  options={
118
- 'verbose_name': 'Document Type',
119
- 'verbose_name_plural': 'Document Types',
83
+ "verbose_name": "Document Type",
84
+ "verbose_name_plural": "Document Types",
120
85
  },
121
86
  ),
122
87
  migrations.CreateModel(
123
- name='EmissionFactor',
88
+ name="EmissionFactor",
124
89
  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()),
90
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
91
+ ("name", models.CharField(max_length=255)),
92
+ ("value", models.FloatField()),
128
93
  ],
129
94
  ),
130
95
  migrations.CreateModel(
131
- name='EmployeeType',
96
+ name="EmployeeType",
132
97
  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)),
98
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
99
+ ("name", models.CharField(max_length=255, unique=True)),
100
+ ("description", models.TextField(blank=True, null=True)),
101
+ ("is_active", models.BooleanField(default=True)),
137
102
  ],
138
103
  ),
139
104
  migrations.CreateModel(
140
- name='EndoscopeType',
105
+ name="EndoscopeType",
141
106
  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)),
107
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
108
+ ("name", models.CharField(max_length=255, unique=True)),
144
109
  ],
145
110
  options={
146
- 'verbose_name': 'Endoscope Type',
147
- 'verbose_name_plural': 'Endoscope Types',
148
- 'ordering': ['name'],
111
+ "verbose_name": "Endoscope Type",
112
+ "verbose_name_plural": "Endoscope Types",
113
+ "ordering": ["name"],
149
114
  },
150
115
  ),
151
116
  migrations.CreateModel(
152
- name='EventClassification',
117
+ name="Event",
153
118
  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)),
119
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
120
+ ("name", models.CharField(max_length=100, unique=True)),
121
+ ("description", models.TextField(blank=True, null=True)),
156
122
  ],
157
123
  ),
158
124
  migrations.CreateModel(
159
- name='Examination',
125
+ name="Examination",
160
126
  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)),
127
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
128
+ ("name", models.CharField(max_length=100, unique=True)),
129
+ ("name_de", models.CharField(max_length=100, null=True, unique=True)),
130
+ ("name_en", models.CharField(max_length=100, null=True, unique=True)),
131
+ ("description", models.TextField(blank=True, null=True)),
132
+ ("description_de", models.TextField(blank=True, null=True)),
133
+ ("description_en", models.TextField(blank=True, null=True)),
168
134
  ],
169
135
  options={
170
- 'verbose_name': 'Examination',
171
- 'verbose_name_plural': 'Examinations',
172
- 'ordering': ['name'],
136
+ "verbose_name": "Examination",
137
+ "verbose_name_plural": "Examinations",
138
+ "ordering": ["name"],
173
139
  },
174
140
  ),
175
141
  migrations.CreateModel(
176
- name='ExaminationType',
142
+ name="ExaminationType",
177
143
  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)),
144
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
145
+ ("name", models.CharField(max_length=100, unique=True)),
180
146
  ],
181
147
  ),
182
148
  migrations.CreateModel(
183
- name='FFMpegMeta',
149
+ name="FFMpegMeta",
184
150
  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)),
151
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
152
+ ("width", models.IntegerField(blank=True, null=True)),
153
+ ("height", models.IntegerField(blank=True, null=True)),
154
+ ("duration", models.FloatField(blank=True, null=True)),
155
+ ("frame_rate_num", models.IntegerField(blank=True, null=True)),
156
+ ("frame_rate_den", models.IntegerField(blank=True, null=True)),
157
+ ("codec_name", models.CharField(blank=True, max_length=50, null=True)),
158
+ ("pixel_format", models.CharField(blank=True, max_length=50, null=True)),
159
+ ("bit_rate", models.BigIntegerField(blank=True, null=True)),
160
+ ("raw_probe_data", models.JSONField(blank=True, null=True)),
195
161
  ],
196
162
  ),
197
163
  migrations.CreateModel(
198
- name='FindingClassificationChoice',
164
+ name="FindingClassificationChoice",
199
165
  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)),
166
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
167
+ ("name", models.CharField(max_length=255, unique=True)),
168
+ ("name_de", models.CharField(max_length=255, null=True, unique=True)),
169
+ ("name_en", models.CharField(max_length=255, null=True, unique=True)),
170
+ ("description", models.TextField(blank=True)),
171
+ ("description_de", models.TextField(blank=True, null=True)),
172
+ ("description_en", models.TextField(blank=True, null=True)),
173
+ ("subcategories", models.JSONField(default=dict)),
174
+ ("numerical_descriptors", models.JSONField(default=dict)),
209
175
  ],
210
176
  ),
211
177
  migrations.CreateModel(
212
- name='FindingClassificationType',
178
+ name="FindingClassificationType",
213
179
  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)),
180
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
181
+ ("name", models.CharField(max_length=255, unique=True)),
182
+ ("description", models.TextField(blank=True)),
217
183
  ],
218
184
  ),
219
185
  migrations.CreateModel(
220
- name='FindingInterventionType',
186
+ name="FindingInterventionType",
221
187
  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)),
188
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
189
+ ("name", models.CharField(max_length=100, unique=True)),
190
+ ("description", models.TextField(blank=True, null=True)),
225
191
  ],
226
192
  ),
227
193
  migrations.CreateModel(
228
- name='FindingType',
194
+ name="FindingType",
229
195
  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)),
196
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
197
+ ("name", models.CharField(max_length=100, unique=True)),
198
+ ("description", models.TextField(blank=True, null=True)),
233
199
  ],
234
200
  ),
235
201
  migrations.CreateModel(
236
- name='FirstName',
202
+ name="FirstName",
237
203
  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)),
204
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
205
+ ("name", models.CharField(max_length=255, unique=True)),
240
206
  ],
241
207
  ),
242
208
  migrations.CreateModel(
243
- name='Gender',
209
+ name="Gender",
244
210
  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)),
211
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
212
+ ("name", models.CharField(max_length=255)),
213
+ ("abbreviation", models.CharField(max_length=255, null=True)),
214
+ ("description", models.TextField(blank=True, null=True)),
249
215
  ],
250
216
  ),
251
217
  migrations.CreateModel(
252
- name='Label',
218
+ name="Label",
253
219
  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)),
220
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
221
+ ("name", models.CharField(max_length=255)),
222
+ ("description", models.TextField(blank=True, null=True)),
257
223
  ],
258
224
  ),
259
225
  migrations.CreateModel(
260
- name='LabelType',
226
+ name="LabelType",
261
227
  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)),
228
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
229
+ ("name", models.CharField(max_length=255)),
230
+ ("description", models.TextField(blank=True, null=True)),
265
231
  ],
266
232
  ),
267
233
  migrations.CreateModel(
268
- name='LastName',
234
+ name="LastName",
269
235
  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)),
236
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
237
+ ("name", models.CharField(max_length=255, unique=True)),
272
238
  ],
273
239
  ),
274
240
  migrations.CreateModel(
275
- name='Medication',
241
+ name="Medication",
276
242
  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)),
243
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
244
+ ("name", models.CharField(max_length=255, unique=True)),
245
+ ("adapt_to_renal_function", models.BooleanField(default=False)),
246
+ ("adapt_to_hepatic_function", models.BooleanField(default=False)),
247
+ ("adapt_to_indication", models.BooleanField(default=False)),
248
+ ("adapt_to_age", models.BooleanField(default=False)),
249
+ ("adapt_to_weight", models.BooleanField(default=False)),
250
+ ("adapt_to_risk", models.BooleanField(default=False)),
285
251
  ],
286
252
  ),
287
253
  migrations.CreateModel(
288
- name='MedicationIndicationType',
254
+ name="MedicationIndicationType",
289
255
  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)),
256
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
257
+ ("name", models.CharField(max_length=255, unique=True)),
292
258
  ],
293
259
  ),
294
260
  migrations.CreateModel(
295
- name='MedicationIntakeTime',
261
+ name="MedicationIntakeTime",
296
262
  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()),
263
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
264
+ ("name", models.CharField(max_length=255, unique=True)),
265
+ ("repeats", models.CharField(default="daily", max_length=20)),
266
+ ("time", models.TimeField()),
301
267
  ],
302
268
  ),
303
269
  migrations.CreateModel(
304
- name='ModelType',
270
+ name="ModelType",
305
271
  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)),
272
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
273
+ ("name", models.CharField(max_length=255)),
274
+ ("description", models.TextField(blank=True, null=True)),
309
275
  ],
310
276
  ),
311
277
  migrations.CreateModel(
312
- name='MultipleCategoricalValueDistribution',
278
+ name="MultipleCategoricalValueDistribution",
313
279
  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)),
280
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
281
+ ("name", models.CharField(max_length=100)),
282
+ ("categories", models.JSONField()),
283
+ ("min_count", models.IntegerField()),
284
+ ("max_count", models.IntegerField()),
285
+ ("count_distribution_type", models.CharField(choices=[("uniform", "Uniform"), ("normal", "Normal")], max_length=20)),
286
+ ("count_mean", models.FloatField(blank=True, null=True)),
287
+ ("count_std_dev", models.FloatField(blank=True, null=True)),
322
288
  ],
323
289
  options={
324
- 'abstract': False,
290
+ "abstract": False,
325
291
  },
326
292
  ),
327
293
  migrations.CreateModel(
328
- name='NumericValueDistribution',
294
+ name="NumericValueDistribution",
329
295
  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)),
296
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
297
+ ("name", models.CharField(max_length=100)),
298
+ (
299
+ "distribution_type",
300
+ models.CharField(choices=[("uniform", "Uniform"), ("normal", "Normal"), ("skewed_normal", "Skewed Normal")], max_length=20),
301
+ ),
302
+ ("min_descriptor", models.CharField(max_length=20)),
303
+ ("max_descriptor", models.CharField(max_length=20)),
304
+ ("min_value", models.FloatField(blank=True, help_text="Lower hard limit for generated values", null=True)),
305
+ ("max_value", models.FloatField(blank=True, help_text="Upper hard limit for generated values", null=True)),
306
+ ("mean", models.FloatField(blank=True, help_text="Mean used for normal or skewed normal distributions", null=True)),
307
+ ("std_dev", models.FloatField(blank=True, help_text="Standard deviation for bell-shaped distributions", null=True)),
308
+ ("skewness", models.FloatField(blank=True, help_text="Shape parameter for skewed normal distributions", null=True)),
335
309
  ],
336
310
  options={
337
- 'abstract': False,
311
+ "abstract": False,
338
312
  },
339
313
  ),
340
314
  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',
315
+ name="Organ",
350
316
  fields=[
351
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
352
- ('name', models.CharField(max_length=255)),
317
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
318
+ ("name", models.CharField(max_length=100, unique=True)),
319
+ ("description", models.TextField(blank=True, null=True)),
353
320
  ],
354
321
  ),
355
322
  migrations.CreateModel(
356
- name='Product',
323
+ name="PatientLabSampleType",
357
324
  fields=[
358
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
359
- ('name', models.CharField(max_length=255)),
325
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
326
+ ("name", models.CharField(max_length=255)),
327
+ ("description", models.TextField(blank=True, null=True)),
360
328
  ],
361
329
  ),
362
330
  migrations.CreateModel(
363
- name='ProductGroup',
331
+ name="PdfType",
364
332
  fields=[
365
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
366
- ('name', models.CharField(max_length=255)),
333
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
334
+ ("name", models.CharField(max_length=255)),
367
335
  ],
368
336
  ),
369
337
  migrations.CreateModel(
370
- name='Profession',
338
+ name="Product",
371
339
  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)),
340
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
341
+ ("name", models.CharField(max_length=255)),
375
342
  ],
376
343
  ),
377
344
  migrations.CreateModel(
378
- name='Qualification',
345
+ name="ProductGroup",
379
346
  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)),
347
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
348
+ ("name", models.CharField(max_length=255)),
384
349
  ],
385
350
  ),
386
351
  migrations.CreateModel(
387
- name='QualificationType',
352
+ name="Profession",
388
353
  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)),
354
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
355
+ ("name", models.CharField(max_length=100)),
356
+ ("description", models.TextField(blank=True, null=True)),
393
357
  ],
394
358
  ),
395
359
  migrations.CreateModel(
396
- name='RawPdfState',
360
+ name="Qualification",
397
361
  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.')),
362
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
363
+ ("name", models.CharField(max_length=255, unique=True)),
364
+ ("description", models.TextField(blank=True, null=True)),
365
+ ("is_active", models.BooleanField(default=True)),
410
366
  ],
411
- options={
412
- 'verbose_name': 'Raw PDF Processing State',
413
- 'verbose_name_plural': 'Raw PDF Processing States',
414
- },
415
367
  ),
416
368
  migrations.CreateModel(
417
- name='ReportReaderFlag',
369
+ name="QualificationType",
418
370
  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)),
371
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
372
+ ("name", models.CharField(max_length=255, unique=True)),
373
+ ("description", models.TextField(blank=True, null=True)),
374
+ ("is_active", models.BooleanField(default=True)),
422
375
  ],
423
376
  ),
424
377
  migrations.CreateModel(
425
- name='RequirementOperator',
378
+ name="RawPdfState",
426
379
  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)),
380
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
381
+ ("text_meta_extracted", models.BooleanField(default=False, help_text="True if text metadata (OCR) has been extracted.")),
382
+ ("initial_prediction_completed", models.BooleanField(default=False, help_text="True if initial AI prediction has run.")),
383
+ (
384
+ "sensitive_meta_processed",
385
+ models.BooleanField(default=False, help_text="True if the video has been fully processed, meaning a anonymized person was created."),
386
+ ),
387
+ ("anonymized", models.BooleanField(default=False, help_text="True if the anonymized video file has been created.")),
388
+ (
389
+ "anonymization_validated",
390
+ models.BooleanField(default=False, help_text="True if the anonymization process has been validated and confirmed."),
391
+ ),
392
+ ("processing_started", models.BooleanField(default=False, help_text="True if the processing has started, but not yet completed.")),
393
+ ("processing_error", models.BooleanField(default=False, help_text="True if an error occurred during processing.")),
394
+ ("date_created", models.DateTimeField(auto_now_add=True)),
395
+ ("date_modified", models.DateTimeField(auto_now=True)),
396
+ ("was_created", models.BooleanField(default=True, help_text="True if this state was created for the first time.")),
397
+ ("pdf_meta_extracted", models.BooleanField(default=False, help_text="True if PDF metadata has been extracted.")),
431
398
  ],
399
+ options={
400
+ "verbose_name": "Raw PDF Processing State",
401
+ "verbose_name_plural": "Raw PDF Processing States",
402
+ },
432
403
  ),
433
404
  migrations.CreateModel(
434
- name='RequirementSetType',
405
+ name="ReportReaderFlag",
435
406
  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)),
407
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
408
+ ("name", models.CharField(max_length=255, unique=True)),
409
+ ("value", models.CharField(max_length=255)),
439
410
  ],
440
411
  ),
441
412
  migrations.CreateModel(
442
- name='RequirementType',
413
+ name="RequirementOperator",
443
414
  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)),
415
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
416
+ ("name", models.CharField(max_length=100, unique=True)),
417
+ ("description", models.TextField(blank=True, null=True)),
418
+ ("evaluation_function_name", models.CharField(blank=True, max_length=255, null=True)),
447
419
  ],
448
420
  ),
449
421
  migrations.CreateModel(
450
- name='Resource',
422
+ name="RequirementSetType",
451
423
  fields=[
452
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
453
- ('name', models.CharField(max_length=255)),
424
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
425
+ ("name", models.CharField(max_length=100, unique=True)),
426
+ ("description", models.TextField(blank=True, null=True)),
454
427
  ],
455
428
  ),
456
429
  migrations.CreateModel(
457
- name='RiskType',
430
+ name="RequirementType",
458
431
  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)),
432
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
433
+ ("name", models.CharField(max_length=100, unique=True)),
434
+ ("description", models.TextField(blank=True, null=True)),
462
435
  ],
463
436
  ),
464
437
  migrations.CreateModel(
465
- name='RuleAttributeDType',
438
+ name="Resource",
466
439
  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)),
440
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
441
+ ("name", models.CharField(max_length=255)),
469
442
  ],
470
443
  ),
471
444
  migrations.CreateModel(
472
- name='RuleType',
445
+ name="RiskType",
473
446
  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)),
447
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
448
+ ("name", models.CharField(max_length=100, unique=True)),
449
+ ("description", models.TextField(blank=True, null=True)),
476
450
  ],
477
- options={
478
- 'verbose_name': 'Rule Type',
479
- 'verbose_name_plural': 'Rule Types',
480
- },
481
451
  ),
482
452
  migrations.CreateModel(
483
- name='ScheduledDays',
453
+ name="ScheduledDays",
484
454
  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)),
455
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
456
+ ("name", models.CharField(help_text="Name of the scheduled days.", max_length=255, unique=True)),
457
+ ("working_days", models.BooleanField(blank=True, default=True, null=True)),
458
+ ("non_working_days", models.BooleanField(blank=True, default=False, null=True)),
459
+ ("limited_time", models.BooleanField(blank=True, default=False, null=True)),
460
+ ("start_date", models.DateField(blank=True, null=True)),
461
+ ("end_date", models.DateField(blank=True, null=True)),
492
462
  ],
493
463
  ),
494
464
  migrations.CreateModel(
495
- name='ShiftType',
465
+ name="ShiftType",
496
466
  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)),
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
+ ("description", models.TextField(blank=True, null=True)),
470
+ ("is_active", models.BooleanField(default=True)),
501
471
  ],
502
472
  ),
503
473
  migrations.CreateModel(
504
- name='SingleCategoricalValueDistribution',
474
+ name="SingleCategoricalValueDistribution",
505
475
  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()),
476
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
477
+ ("name", models.CharField(max_length=100)),
478
+ ("categories", models.JSONField()),
509
479
  ],
510
480
  options={
511
- 'abstract': False,
481
+ "abstract": False,
512
482
  },
513
483
  ),
514
484
  migrations.CreateModel(
515
- name='Tag',
485
+ name="Tag",
516
486
  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)),
487
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
488
+ ("name", models.CharField(max_length=100, unique=True)),
519
489
  ],
520
490
  options={
521
- 'verbose_name': 'Tag',
522
- 'verbose_name_plural': 'Tags',
491
+ "verbose_name": "Tag",
492
+ "verbose_name_plural": "Tags",
523
493
  },
524
494
  ),
525
495
  migrations.CreateModel(
526
- name='Unit',
496
+ name="Unit",
527
497
  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)),
498
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
499
+ ("name", models.CharField(max_length=100)),
500
+ ("description", models.CharField(blank=True, max_length=100, null=True)),
501
+ ("abbreviation", models.CharField(blank=True, max_length=25, null=True)),
532
502
  ],
533
503
  ),
534
504
  migrations.CreateModel(
535
- name='VideoImportMeta',
505
+ name="VideoImportMeta",
536
506
  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)),
507
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
508
+ ("file_name", models.CharField(blank=True, max_length=255, null=True)),
509
+ ("video_anonymized", models.BooleanField(default=False)),
510
+ ("video_patient_data_detected", models.BooleanField(default=False)),
511
+ ("outside_detected", models.BooleanField(default=False)),
512
+ ("patient_data_removed", models.BooleanField(default=False)),
513
+ ("outside_removed", models.BooleanField(default=False)),
544
514
  ],
545
515
  ),
546
516
  migrations.CreateModel(
547
- name='VideoSegmentationLabel',
517
+ name="VideoSegmentationLabel",
548
518
  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)),
519
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
520
+ ("name", models.CharField(max_length=255)),
521
+ ("description", models.TextField(blank=True, null=True)),
522
+ ("color", models.CharField(blank=True, max_length=255, null=True)),
523
+ ("order_priority", models.IntegerField(default=0)),
554
524
  ],
555
525
  ),
556
526
  migrations.CreateModel(
557
- name='VideoState',
527
+ name="VideoState",
558
528
  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.')),
529
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
530
+ ("frames_extracted", models.BooleanField(default=False, help_text="True if raw frames have been extracted to files.")),
531
+ ("frames_initialized", models.BooleanField(default=False, help_text="True if Frame DB objects have been created.")),
532
+ ("frame_count", models.PositiveIntegerField(blank=True, help_text="Number of frames extracted/initialized.", null=True)),
533
+ ("video_meta_extracted", models.BooleanField(default=False, help_text="True if VideoMeta (technical specs) has been extracted.")),
534
+ ("text_meta_extracted", models.BooleanField(default=False, help_text="True if text metadata (OCR) has been extracted.")),
535
+ ("initial_prediction_completed", models.BooleanField(default=False, help_text="True if initial AI prediction has run.")),
536
+ ("lvs_created", models.BooleanField(default=False, help_text="True if LabelVideoSegments have been created from predictions.")),
537
+ (
538
+ "frame_annotations_generated",
539
+ models.BooleanField(default=False, help_text="True if frame-level annotations have been generated from segments."),
540
+ ),
541
+ (
542
+ "sensitive_meta_processed",
543
+ models.BooleanField(default=False, help_text="True if the video has been fully processed, meaning a anonymized person was created."),
544
+ ),
545
+ ("anonymized", models.BooleanField(default=False, help_text="True if the anonymized video file has been created.")),
546
+ (
547
+ "anonymization_validated",
548
+ models.BooleanField(default=False, help_text="True if the anonymization process has been validated and confirmed."),
549
+ ),
550
+ ("processing_started", models.BooleanField(default=False, help_text="True if the processing has started, but not yet completed.")),
551
+ ("date_created", models.DateTimeField(auto_now_add=True)),
552
+ ("date_modified", models.DateTimeField(auto_now=True)),
553
+ (
554
+ "segment_annotations_created",
555
+ models.BooleanField(default=False, help_text="True if segment annotations have been created from LabelVideoSegments."),
556
+ ),
557
+ ("segment_annotations_validated", models.BooleanField(default=False, help_text="True if segment annotations have been validated.")),
558
+ ("was_created", models.BooleanField(default=True, help_text="True if this state was created for the first time.")),
577
559
  ],
578
560
  options={
579
- 'verbose_name': 'Video Processing State',
580
- 'verbose_name_plural': 'Video Processing States',
561
+ "verbose_name": "Video Processing State",
562
+ "verbose_name_plural": "Video Processing States",
581
563
  },
582
564
  ),
583
565
  migrations.CreateModel(
584
- name='Waste',
566
+ name="Waste",
585
567
  fields=[
586
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
587
- ('name', models.CharField(max_length=255)),
568
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
569
+ ("name", models.CharField(max_length=255)),
588
570
  ],
589
571
  ),
590
572
  migrations.CreateModel(
591
- name='CaseTemplateRule',
573
+ name="DiseaseClassification",
592
574
  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')),
575
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
576
+ ("name", models.CharField(max_length=255, unique=True)),
577
+ ("disease", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="disease_classifications", to="endoreg_db.disease")),
609
578
  ],
610
579
  ),
611
580
  migrations.CreateModel(
612
- name='CaseTemplate',
581
+ name="DiseaseClassificationChoice",
613
582
  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')),
583
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
584
+ ("name", models.CharField(max_length=255, unique=True)),
585
+ (
586
+ "disease_classification",
587
+ models.ForeignKey(
588
+ on_delete=django.db.models.deletion.CASCADE, related_name="disease_classification_choices", to="endoreg_db.diseaseclassification"
589
+ ),
590
+ ),
620
591
  ],
621
592
  ),
622
593
  migrations.CreateModel(
623
- name='DiseaseClassification',
594
+ name="Endoscope",
624
595
  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')),
596
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
597
+ ("name", models.CharField(max_length=255)),
598
+ ("sn", models.CharField(max_length=255)),
599
+ (
600
+ "center",
601
+ models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="endoscopes", to="endoreg_db.center"),
602
+ ),
603
+ (
604
+ "endoscope_type",
605
+ models.ForeignKey(
606
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="endoscopes", to="endoreg_db.endoscopetype"
607
+ ),
608
+ ),
646
609
  ],
647
610
  options={
648
- 'verbose_name': 'Endoscope',
649
- 'verbose_name_plural': 'Endoscopes',
650
- 'ordering': ['name'],
611
+ "verbose_name": "Endoscope",
612
+ "verbose_name_plural": "Endoscopes",
613
+ "ordering": ["name"],
651
614
  },
652
615
  ),
653
616
  migrations.CreateModel(
654
- name='EndoscopyProcessor',
617
+ name="EndoscopyProcessor",
655
618
  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')),
619
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
620
+ ("name", models.CharField(max_length=255)),
621
+ ("image_width", models.IntegerField()),
622
+ ("image_height", models.IntegerField()),
623
+ ("endoscope_image_x", models.IntegerField()),
624
+ ("endoscope_image_y", models.IntegerField()),
625
+ ("endoscope_image_width", models.IntegerField()),
626
+ ("endoscope_image_height", models.IntegerField()),
627
+ ("examination_date_x", models.IntegerField()),
628
+ ("examination_date_y", models.IntegerField()),
629
+ ("examination_date_width", models.IntegerField()),
630
+ ("examination_date_height", models.IntegerField()),
631
+ ("examination_time_x", models.IntegerField(blank=True, null=True)),
632
+ ("examination_time_y", models.IntegerField(blank=True, null=True)),
633
+ ("examination_time_width", models.IntegerField(blank=True, null=True)),
634
+ ("examination_time_height", models.IntegerField(blank=True, null=True)),
635
+ ("patient_first_name_x", models.IntegerField()),
636
+ ("patient_first_name_y", models.IntegerField()),
637
+ ("patient_first_name_width", models.IntegerField()),
638
+ ("patient_first_name_height", models.IntegerField()),
639
+ ("patient_last_name_x", models.IntegerField()),
640
+ ("patient_last_name_y", models.IntegerField()),
641
+ ("patient_last_name_width", models.IntegerField()),
642
+ ("patient_last_name_height", models.IntegerField()),
643
+ ("patient_dob_x", models.IntegerField()),
644
+ ("patient_dob_y", models.IntegerField()),
645
+ ("patient_dob_width", models.IntegerField()),
646
+ ("patient_dob_height", models.IntegerField()),
647
+ ("endoscope_type_x", models.IntegerField(blank=True, null=True)),
648
+ ("endoscope_type_y", models.IntegerField(blank=True, null=True)),
649
+ ("endoscope_type_width", models.IntegerField(blank=True, null=True)),
650
+ ("endoscope_type_height", models.IntegerField(blank=True, null=True)),
651
+ ("endoscope_sn_x", models.IntegerField(blank=True, null=True)),
652
+ ("endoscope_sn_y", models.IntegerField(blank=True, null=True)),
653
+ ("endoscope_sn_width", models.IntegerField(blank=True, null=True)),
654
+ ("endoscope_sn_height", models.IntegerField(blank=True, null=True)),
655
+ ("centers", models.ManyToManyField(blank=True, related_name="endoscopy_processors", to="endoreg_db.center")),
693
656
  ],
694
657
  ),
695
658
  migrations.CreateModel(
696
- name='Event',
659
+ name="EventClassification",
697
660
  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')),
661
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
662
+ ("name", models.CharField(max_length=255, unique=True)),
663
+ ("event", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="event_classifications", to="endoreg_db.event")),
702
664
  ],
703
665
  ),
704
666
  migrations.CreateModel(
705
- name='EventClassificationChoice',
667
+ name="EventClassificationChoice",
706
668
  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')),
669
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
670
+ ("name", models.CharField(max_length=255, unique=True)),
671
+ ("subcategories", models.JSONField(default=dict)),
672
+ ("numerical_descriptors", models.JSONField(default=dict)),
673
+ (
674
+ "event_classification",
675
+ models.ForeignKey(
676
+ on_delete=django.db.models.deletion.CASCADE, related_name="event_classification_choices", to="endoreg_db.eventclassification"
677
+ ),
678
+ ),
712
679
  ],
713
680
  ),
714
681
  migrations.CreateModel(
715
- name='ExaminationIndicationClassification',
682
+ name="ExaminationIndicationClassification",
716
683
  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')),
684
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
685
+ ("name", models.CharField(max_length=255, unique=True)),
686
+ ("description", models.TextField(blank=True, null=True)),
687
+ ("examinations", models.ManyToManyField(blank=True, related_name="indication_classifications", to="endoreg_db.examination")),
721
688
  ],
722
689
  ),
723
690
  migrations.CreateModel(
724
- name='ExaminationIndicationClassificationChoice',
691
+ name="ExaminationIndicationClassificationChoice",
725
692
  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')),
693
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
694
+ ("name", models.CharField(max_length=255, unique=True)),
695
+ ("subcategories", models.JSONField(default=dict)),
696
+ ("numerical_descriptors", models.JSONField(default=dict)),
697
+ (
698
+ "classification",
699
+ models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="choices", to="endoreg_db.examinationindicationclassification"),
700
+ ),
731
701
  ],
732
702
  ),
733
703
  migrations.CreateModel(
734
- name='ExaminationRequirementSet',
704
+ name="ExaminationRequirementSet",
735
705
  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')),
706
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
707
+ ("enabled_by_default", models.BooleanField(default=False)),
708
+ ("name", models.CharField(max_length=100, unique=True)),
709
+ ("examinations", models.ManyToManyField(blank=True, related_name="exam_reqset_links", to="endoreg_db.examination")),
740
710
  ],
741
711
  ),
742
712
  migrations.CreateModel(
743
- name='ExaminationTimeType',
713
+ name="ExaminationTimeType",
744
714
  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')),
715
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
716
+ ("name", models.CharField(max_length=100, unique=True)),
717
+ ("examinations", models.ManyToManyField(blank=True, to="endoreg_db.examination")),
748
718
  ],
749
719
  options={
750
- 'verbose_name': 'Examination Time Type',
751
- 'verbose_name_plural': 'Examination Time Types',
752
- 'ordering': ['name'],
720
+ "verbose_name": "Examination Time Type",
721
+ "verbose_name_plural": "Examination Time Types",
722
+ "ordering": ["name"],
753
723
  },
754
724
  ),
755
725
  migrations.CreateModel(
756
- name='ExaminationTime',
726
+ name="ExaminationTime",
757
727
  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')),
728
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
729
+ ("name", models.CharField(max_length=100, unique=True)),
730
+ ("start_time", models.TimeField(blank=True, null=True)),
731
+ ("end_time", models.TimeField(blank=True, null=True)),
732
+ ("time_types", models.ManyToManyField(blank=True, to="endoreg_db.examinationtimetype")),
763
733
  ],
764
734
  options={
765
- 'verbose_name': 'Examination Time',
766
- 'verbose_name_plural': 'Examination Times',
767
- 'ordering': ['name'],
735
+ "verbose_name": "Examination Time",
736
+ "verbose_name_plural": "Examination Times",
737
+ "ordering": ["name"],
768
738
  },
769
739
  ),
770
740
  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')),
741
+ model_name="examination",
742
+ name="examination_types",
743
+ field=models.ManyToManyField(blank=True, to="endoreg_db.examinationtype"),
744
+ ),
745
+ migrations.CreateModel(
746
+ name="Examiner",
747
+ fields=[
748
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
749
+ ("first_name", models.CharField(max_length=255)),
750
+ ("last_name", models.CharField(max_length=255)),
751
+ ("dob", models.DateField(blank=True, null=True, verbose_name="Date of Birth")),
752
+ ("email", models.EmailField(blank=True, max_length=255, null=True)),
753
+ ("phone", models.CharField(blank=True, max_length=255, null=True)),
754
+ ("is_real_person", models.BooleanField(default=True)),
755
+ ("post_code", models.CharField(blank=True, max_length=20, null=True)),
756
+ ("city", models.CharField(blank=True, max_length=255, null=True)),
757
+ ("street", models.CharField(blank=True, max_length=255, null=True)),
758
+ ("hash", models.CharField(max_length=255, unique=True)),
759
+ ("center", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.center")),
760
+ ("gender", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.gender")),
788
761
  ],
789
762
  options={
790
- 'abstract': False,
763
+ "abstract": False,
791
764
  },
792
765
  ),
793
766
  migrations.CreateModel(
794
- name='FindingIntervention',
767
+ name="FindingIntervention",
795
768
  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')),
769
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
770
+ ("name", models.CharField(max_length=100, unique=True)),
771
+ ("name_de", models.CharField(max_length=100, null=True, unique=True)),
772
+ ("name_en", models.CharField(max_length=100, null=True, unique=True)),
773
+ ("description", models.TextField(blank=True, null=True)),
774
+ ("description_de", models.TextField(blank=True, null=True)),
775
+ ("description_en", models.TextField(blank=True, null=True)),
776
+ (
777
+ "contraindications",
778
+ models.ManyToManyField(blank=True, related_name="contraindicating_finding_interventions", to="endoreg_db.contraindication"),
779
+ ),
780
+ ("intervention_types", models.ManyToManyField(blank=True, related_name="interventions", to="endoreg_db.findinginterventiontype")),
805
781
  ],
806
782
  ),
807
783
  migrations.CreateModel(
808
- name='Finding',
784
+ name="Finding",
809
785
  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')),
786
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
787
+ ("name", models.CharField(max_length=100, unique=True)),
788
+ ("name_de", models.CharField(max_length=100, null=True, unique=True)),
789
+ ("name_en", models.CharField(max_length=100, null=True, unique=True)),
790
+ ("description", models.TextField(blank=True, null=True)),
791
+ ("description_de", models.TextField(blank=True, null=True)),
792
+ ("description_en", models.TextField(blank=True, null=True)),
793
+ ("examinations", models.ManyToManyField(blank=True, related_name="findings", to="endoreg_db.examination")),
794
+ ("finding_interventions", models.ManyToManyField(blank=True, related_name="findings", to="endoreg_db.findingintervention")),
795
+ ("finding_types", models.ManyToManyField(blank=True, related_name="findings", to="endoreg_db.findingtype")),
820
796
  ],
821
797
  ),
822
798
  migrations.CreateModel(
823
- name='ExaminationIndication',
799
+ name="ExaminationIndication",
824
800
  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')),
801
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
802
+ ("name", models.CharField(max_length=255, unique=True)),
803
+ ("description", models.TextField(blank=True, null=True)),
804
+ ("examinations", models.ManyToManyField(blank=True, related_name="indications", to="endoreg_db.examination")),
805
+ ("classifications", models.ManyToManyField(blank=True, related_name="indications", to="endoreg_db.examinationindicationclassification")),
806
+ ("expected_interventions", models.ManyToManyField(blank=True, related_name="indications", to="endoreg_db.findingintervention")),
831
807
  ],
832
808
  ),
833
809
  migrations.CreateModel(
834
- name='FindingClassification',
810
+ name="FindingClassification",
835
811
  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')),
812
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
813
+ ("name", models.CharField(max_length=255, unique=True)),
814
+ ("name_de", models.CharField(max_length=255, null=True, unique=True)),
815
+ ("name_en", models.CharField(max_length=255, null=True, unique=True)),
816
+ ("description", models.TextField(blank=True)),
817
+ ("description_de", models.TextField(blank=True, null=True)),
818
+ ("description_en", models.TextField(blank=True, null=True)),
819
+ ("examinations", models.ManyToManyField(blank=True, related_name="finding_classifications", to="endoreg_db.examination")),
820
+ ("findings", models.ManyToManyField(blank=True, related_name="finding_classifications", to="endoreg_db.finding")),
821
+ ("choices", models.ManyToManyField(blank=True, related_name="classifications", to="endoreg_db.findingclassificationchoice")),
822
+ ("classification_types", models.ManyToManyField(to="endoreg_db.findingclassificationtype")),
823
+ ("finding_types", models.ManyToManyField(blank=True, related_name="finding_classifications", to="endoreg_db.findingtype")),
848
824
  ],
849
825
  ),
850
826
  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')),
827
+ model_name="center",
828
+ name="first_names",
829
+ field=models.ManyToManyField(related_name="centers", to="endoreg_db.firstname"),
830
+ ),
831
+ migrations.CreateModel(
832
+ name="Employee",
833
+ fields=[
834
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
835
+ ("first_name", models.CharField(max_length=255)),
836
+ ("last_name", models.CharField(max_length=255)),
837
+ ("dob", models.DateField(blank=True, null=True, verbose_name="Date of Birth")),
838
+ ("email", models.EmailField(blank=True, max_length=255, null=True)),
839
+ ("phone", models.CharField(blank=True, max_length=255, null=True)),
840
+ ("is_real_person", models.BooleanField(default=True)),
841
+ ("post_code", models.CharField(blank=True, max_length=20, null=True)),
842
+ ("city", models.CharField(blank=True, max_length=255, null=True)),
843
+ ("street", models.CharField(blank=True, max_length=255, null=True)),
844
+ ("employee_type", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="employees", to="endoreg_db.employeetype")),
845
+ ("gender", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.gender")),
867
846
  ],
868
847
  options={
869
- 'abstract': False,
848
+ "abstract": False,
870
849
  },
871
850
  ),
872
851
  migrations.CreateModel(
873
- name='InformationSource',
852
+ name="InformationSource",
874
853
  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)),
854
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
855
+ ("name", models.CharField(max_length=100)),
856
+ ("url", models.URLField(blank=True, null=True)),
857
+ ("description", models.TextField(blank=True, null=True)),
858
+ ("date", models.DateField(blank=True, null=True)),
859
+ ("date_created", models.DateField(auto_now_add=True)),
860
+ ("date_modified", models.DateField(auto_now=True)),
861
+ ("abbreviation", models.CharField(blank=True, max_length=100, null=True, unique=True)),
883
862
  ],
884
863
  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')],
864
+ "verbose_name": "Information Source",
865
+ "verbose_name_plural": "Information Sources",
866
+ "indexes": [
867
+ models.Index(fields=["name"], name="endoreg_db__name_febac5_idx"),
868
+ models.Index(fields=["abbreviation"], name="endoreg_db__abbrevi_5a07c4_idx"),
869
+ ],
888
870
  },
889
871
  ),
890
872
  migrations.CreateModel(
891
- name='InformationSourceType',
873
+ name="InformationSourceType",
892
874
  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')),
875
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
876
+ ("name", models.CharField(max_length=100, unique=True)),
877
+ ("description", models.TextField(blank=True, null=True)),
878
+ ("information_sources", models.ManyToManyField(blank=True, related_name="information_source_types", to="endoreg_db.informationsource")),
897
879
  ],
898
880
  options={
899
- 'verbose_name': 'Information Source Type',
900
- 'verbose_name_plural': 'Information Source Types',
881
+ "verbose_name": "Information Source Type",
882
+ "verbose_name_plural": "Information Source Types",
901
883
  },
902
884
  ),
903
885
  migrations.CreateModel(
904
- name='LabelSet',
886
+ name="LabelSet",
905
887
  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')),
888
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
889
+ ("name", models.CharField(max_length=255)),
890
+ ("description", models.TextField(blank=True, null=True)),
891
+ ("version", models.IntegerField()),
892
+ ("labels", models.ManyToManyField(related_name="label_sets", to="endoreg_db.label")),
911
893
  ],
912
894
  ),
913
895
  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'),
896
+ model_name="label",
897
+ name="label_type",
898
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="labels", to="endoreg_db.labeltype"),
917
899
  ),
918
900
  migrations.CreateModel(
919
- name='LabelVideoSegment',
901
+ name="LabelVideoSegment",
920
902
  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')),
903
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
904
+ ("start_frame_number", models.IntegerField()),
905
+ ("end_frame_number", models.IntegerField()),
906
+ ("label", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.label")),
907
+ ("source", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.informationsource")),
926
908
  ],
927
909
  ),
928
910
  migrations.CreateModel(
929
- name='LabelVideoSegmentState',
911
+ name="LabelVideoSegmentState",
930
912
  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')),
913
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
914
+ ("created_at", models.DateTimeField(auto_now_add=True)),
915
+ ("updated_at", models.DateTimeField(auto_now=True)),
916
+ ("prediction", models.BooleanField(default=False)),
917
+ ("annotation", models.BooleanField(default=False)),
918
+ ("frames_extracted", models.BooleanField(default=False)),
919
+ ("is_validated", models.BooleanField(default=False)),
920
+ (
921
+ "origin",
922
+ models.OneToOneField(
923
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="state", to="endoreg_db.labelvideosegment"
924
+ ),
925
+ ),
939
926
  ],
940
927
  options={
941
- 'verbose_name': 'Label Video Segment State',
942
- 'verbose_name_plural': 'Label Video Segment States',
928
+ "verbose_name": "Label Video Segment State",
929
+ "verbose_name_plural": "Label Video Segment States",
943
930
  },
944
931
  ),
945
932
  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')),
933
+ name="LabValue",
934
+ fields=[
935
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
936
+ ("name", models.CharField(max_length=255, unique=True)),
937
+ ("abbreviation", models.CharField(blank=True, max_length=10, null=True)),
938
+ ("numeric_precision", models.IntegerField(default=3)),
939
+ ("default_normal_range", models.JSONField(blank=True, null=True)),
940
+ ("normal_range_age_dependent", models.BooleanField(default=False)),
941
+ ("normal_range_gender_dependent", models.BooleanField(default=False)),
942
+ ("normal_range_special_case", models.BooleanField(default=False)),
943
+ (
944
+ "bound_adjustment_factor",
945
+ models.FloatField(default=0.1, help_text="Factor for adjusting bounds when generating increased/decreased values, e.g., 0.1 for 10%."),
946
+ ),
947
+ (
948
+ "default_date_value_distribution",
949
+ models.ForeignKey(
950
+ blank=True,
951
+ null=True,
952
+ on_delete=django.db.models.deletion.CASCADE,
953
+ related_name="default_date_value_distribution",
954
+ to="endoreg_db.datevaluedistribution",
955
+ ),
956
+ ),
957
+ (
958
+ "default_multiple_categorical_value_distribution",
959
+ models.ForeignKey(
960
+ blank=True,
961
+ null=True,
962
+ on_delete=django.db.models.deletion.CASCADE,
963
+ related_name="default_multiple_categorical_value_distribution",
964
+ to="endoreg_db.multiplecategoricalvaluedistribution",
965
+ ),
966
+ ),
967
+ (
968
+ "default_numerical_value_distribution",
969
+ models.ForeignKey(
970
+ blank=True,
971
+ null=True,
972
+ on_delete=django.db.models.deletion.CASCADE,
973
+ related_name="default_numerical_value_distribution",
974
+ to="endoreg_db.numericvaluedistribution",
975
+ ),
976
+ ),
977
+ (
978
+ "default_single_categorical_value_distribution",
979
+ models.ForeignKey(
980
+ blank=True,
981
+ null=True,
982
+ on_delete=django.db.models.deletion.CASCADE,
983
+ related_name="default_single_categorical_value_distribution",
984
+ to="endoreg_db.singlecategoricalvaluedistribution",
985
+ ),
986
+ ),
987
+ ("default_unit", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.unit")),
962
988
  ],
963
989
  ),
964
990
  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'),
991
+ model_name="findingintervention",
992
+ name="required_lab_values",
993
+ field=models.ManyToManyField(blank=True, related_name="required_by_finding_interventions", to="endoreg_db.labvalue"),
968
994
  ),
969
995
  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')),
996
+ model_name="center",
997
+ name="last_names",
998
+ field=models.ManyToManyField(related_name="centers", to="endoreg_db.lastname"),
999
+ ),
1000
+ migrations.CreateModel(
1001
+ name="Material",
1002
+ fields=[
1003
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1004
+ ("name", models.CharField(max_length=255)),
1005
+ ("emission_factor", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.emissionfactor")),
1006
+ ],
1007
+ ),
1008
+ migrations.CreateModel(
1009
+ name="MedicationSchedule",
1010
+ fields=[
1011
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1012
+ ("name", models.CharField(max_length=255, unique=True)),
1013
+ ("description", models.TextField(blank=True, null=True)),
1014
+ ("therapy_duration_d", models.FloatField(blank=True, null=True)),
1015
+ ("dose", models.FloatField()),
1016
+ ("intake_times", models.ManyToManyField(to="endoreg_db.medicationintaketime")),
1017
+ ("medication", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.medication")),
1018
+ ("unit", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.unit")),
1019
+ ],
1020
+ ),
1021
+ migrations.CreateModel(
1022
+ name="MedicationIndication",
1023
+ fields=[
1024
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1025
+ ("name", models.CharField(max_length=255, unique=True)),
1026
+ ("disease_classification_choices", models.ManyToManyField(to="endoreg_db.diseaseclassificationchoice")),
1027
+ ("diseases", models.ManyToManyField(to="endoreg_db.disease")),
1028
+ ("events", models.ManyToManyField(to="endoreg_db.event")),
1029
+ ("sources", models.ManyToManyField(to="endoreg_db.informationsource")),
1030
+ (
1031
+ "indication_type",
1032
+ models.ForeignKey(
1033
+ on_delete=django.db.models.deletion.CASCADE, related_name="medication_indications", to="endoreg_db.medicationindicationtype"
1034
+ ),
1035
+ ),
1036
+ ("medication_schedules", models.ManyToManyField(to="endoreg_db.medicationschedule")),
1037
+ ],
1038
+ ),
1039
+ migrations.CreateModel(
1040
+ name="ModelMeta",
1041
+ fields=[
1042
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1043
+ ("name", models.CharField(help_text="User-defined name for this specific model metadata set (e.g., 'segmentation_base').", max_length=255)),
1044
+ ("version", models.CharField(help_text="Version identifier for this metadata set (e.g., '1', '2a').", max_length=255)),
1045
+ (
1046
+ "activation",
1047
+ models.CharField(default="sigmoid", help_text="Output activation function (e.g., 'sigmoid', 'softmax', 'none').", max_length=50),
1048
+ ),
1049
+ (
1050
+ "weights",
1051
+ models.FileField(
1052
+ blank=True,
1053
+ help_text="Path to the model weights file (.safetensors), relative to MEDIA_ROOT.",
1054
+ null=True,
1055
+ upload_to="model_weights",
1056
+ validators=[django.core.validators.FileExtensionValidator(allowed_extensions=["safetensors", "pth", "pt"])],
1057
+ ),
1058
+ ),
1059
+ (
1060
+ "mean",
1061
+ models.CharField(
1062
+ default="0.45211223,0.27139644,0.19264949", help_text="Comma-separated mean values for input normalization.", max_length=255
1063
+ ),
1064
+ ),
1065
+ (
1066
+ "std",
1067
+ models.CharField(
1068
+ default="0.31418097,0.21088019,0.16059452",
1069
+ help_text="Comma-separated standard deviation values for input normalization.",
1070
+ max_length=255,
1071
+ ),
1072
+ ),
1073
+ ("size_x", models.IntegerField(default=716, help_text="Expected input image width.")),
1074
+ ("size_y", models.IntegerField(default=716, help_text="Expected input image height.")),
1075
+ ("axes", models.CharField(default="2,0,1", help_text="Comma-separated target axis order (e.g., '2,0,1' for CHW).", max_length=10)),
1076
+ ("batchsize", models.IntegerField(default=16, help_text="Default batch size for inference.")),
1077
+ ("num_workers", models.IntegerField(default=0, help_text="Default number of workers for data loading.")),
1078
+ ("description", models.TextField(blank=True, help_text="Optional description.", null=True)),
1079
+ ("date_created", models.DateTimeField(auto_now_add=True)),
1080
+ (
1081
+ "labelset",
1082
+ models.ForeignKey(
1083
+ help_text="The set of labels this model version predicts.",
1084
+ on_delete=django.db.models.deletion.CASCADE,
1085
+ related_name="model_metadata",
1086
+ to="endoreg_db.labelset",
1087
+ ),
1088
+ ),
1089
+ (
1090
+ "model",
1091
+ models.ForeignKey(
1092
+ help_text="The base AI model architecture this metadata belongs to.",
1093
+ on_delete=django.db.models.deletion.CASCADE,
1094
+ related_name="metadata_versions",
1095
+ to="endoreg_db.aimodel",
1096
+ ),
1097
+ ),
1027
1098
  ],
1099
+ options={
1100
+ "verbose_name": "Model Metadata",
1101
+ "verbose_name_plural": "Model Metadata",
1102
+ "ordering": ["-date_created"],
1103
+ "unique_together": {("name", "version", "model")},
1104
+ },
1028
1105
  ),
1029
1106
  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'),
1107
+ model_name="aimodel",
1108
+ name="active_meta",
1109
+ field=models.ForeignKey(
1110
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="active_model", to="endoreg_db.modelmeta"
1111
+ ),
1033
1112
  ),
1034
1113
  migrations.CreateModel(
1035
- name='ActiveModel',
1114
+ name="ActiveModel",
1036
1115
  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')),
1116
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1117
+ ("name", models.CharField(max_length=255, unique=True)),
1118
+ ("model_meta", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.modelmeta")),
1040
1119
  ],
1041
1120
  ),
1042
1121
  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')),
1122
+ model_name="aimodel",
1123
+ name="model_type",
1124
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="ai_models", to="endoreg_db.modeltype"),
1125
+ ),
1126
+ migrations.CreateModel(
1127
+ name="Patient",
1128
+ fields=[
1129
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1130
+ ("email", models.EmailField(blank=True, max_length=255, null=True)),
1131
+ ("phone", models.CharField(blank=True, max_length=255, null=True)),
1132
+ ("is_real_person", models.BooleanField(default=True)),
1133
+ ("post_code", models.CharField(blank=True, max_length=20, null=True)),
1134
+ ("city", models.CharField(blank=True, max_length=255, null=True)),
1135
+ ("street", models.CharField(blank=True, max_length=255, null=True)),
1136
+ ("first_name", models.CharField(max_length=100)),
1137
+ ("last_name", models.CharField(max_length=100)),
1138
+ ("dob", models.DateField(blank=True, null=True)),
1139
+ ("patient_hash", models.CharField(blank=True, max_length=255, null=True)),
1140
+ ("center", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.center")),
1141
+ ("gender", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.gender")),
1069
1142
  ],
1070
1143
  options={
1071
- 'abstract': False,
1144
+ "abstract": False,
1072
1145
  },
1073
1146
  ),
1074
1147
  migrations.CreateModel(
1075
- name='PatientDisease',
1148
+ name="PatientDisease",
1076
1149
  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')),
1150
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1151
+ ("start_date", models.DateField(blank=True, null=True)),
1152
+ ("end_date", models.DateField(blank=True, null=True)),
1153
+ ("numerical_descriptors", models.JSONField(default=dict)),
1154
+ ("subcategories", models.JSONField(default=dict)),
1155
+ ("last_update", models.DateTimeField(auto_now=True)),
1156
+ ("classification_choices", models.ManyToManyField(to="endoreg_db.diseaseclassificationchoice")),
1157
+ ("disease", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="patient_diseases", to="endoreg_db.disease")),
1158
+ ("patient", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="diseases", to="endoreg_db.patient")),
1086
1159
  ],
1087
1160
  options={
1088
- 'verbose_name': 'Patient Disease',
1089
- 'verbose_name_plural': 'Patient Diseases',
1161
+ "verbose_name": "Patient Disease",
1162
+ "verbose_name_plural": "Patient Diseases",
1090
1163
  },
1091
1164
  ),
1092
1165
  migrations.CreateModel(
1093
- name='PatientEvent',
1166
+ name="PatientEvent",
1094
1167
  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')),
1168
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1169
+ ("date_start", models.DateField()),
1170
+ ("date_end", models.DateField(blank=True, null=True)),
1171
+ ("description", models.TextField(blank=True, null=True)),
1172
+ ("subcategories", models.JSONField(default=dict)),
1173
+ ("numerical_descriptors", models.JSONField(default=dict)),
1174
+ ("last_update", models.DateTimeField(auto_now=True)),
1175
+ (
1176
+ "classification_choice",
1177
+ models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.eventclassificationchoice"),
1178
+ ),
1179
+ ("event", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="patient_events", to="endoreg_db.event")),
1180
+ ("patient", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="events", to="endoreg_db.patient")),
1105
1181
  ],
1106
1182
  ),
1107
1183
  migrations.CreateModel(
1108
- name='PatientExamination',
1184
+ name="PatientExamination",
1109
1185
  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')),
1186
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1187
+ ("date_start", models.DateField(blank=True, null=True)),
1188
+ ("date_end", models.DateField(blank=True, null=True)),
1189
+ ("hash", models.CharField(max_length=255, unique=True)),
1190
+ ("examination", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.examination")),
1191
+ ("patient", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="patient_examinations", to="endoreg_db.patient")),
1116
1192
  ],
1117
1193
  options={
1118
- 'verbose_name': 'Patient Examination',
1119
- 'verbose_name_plural': 'Patient Examinations',
1120
- 'ordering': ['patient', 'examination', 'date_start'],
1194
+ "verbose_name": "Patient Examination",
1195
+ "verbose_name_plural": "Patient Examinations",
1196
+ "ordering": ["patient", "examination", "date_start"],
1121
1197
  },
1122
1198
  ),
1123
1199
  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')),
1200
+ name="Case",
1201
+ fields=[
1202
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1203
+ ("hash", models.CharField(blank=True, help_text="An optional hash value associated with the case.", max_length=255, null=True)),
1204
+ ("start_date", models.DateTimeField(db_index=True, help_text="The start date and time of the case.")),
1205
+ ("end_date", models.DateTimeField(blank=True, help_text="The end date and time of the case (optional).", null=True)),
1206
+ ("is_active", models.BooleanField(db_index=True, default=True, help_text="Flag indicating if the case is currently active.")),
1207
+ ("is_closed", models.BooleanField(db_index=True, default=False, help_text="Flag indicating if the case has been closed.")),
1208
+ ("is_deleted", models.BooleanField(db_index=True, default=False, help_text="Flag indicating if the case is marked as deleted.")),
1209
+ ("created_at", models.DateTimeField(auto_now_add=True, help_text="The date and time the case was created.")),
1210
+ ("updated_at", models.DateTimeField(auto_now=True, help_text="The date and time the case was last updated.")),
1211
+ (
1212
+ "patient",
1213
+ models.ForeignKey(
1214
+ help_text="The patient associated with this case.",
1215
+ on_delete=django.db.models.deletion.CASCADE,
1216
+ related_name="cases",
1217
+ to="endoreg_db.patient",
1218
+ ),
1219
+ ),
1220
+ (
1221
+ "patient_examinations",
1222
+ models.ManyToManyField(help_text="The examinations included in this case.", related_name="cases", to="endoreg_db.patientexamination"),
1223
+ ),
1137
1224
  ],
1138
1225
  options={
1139
- 'verbose_name': 'Case',
1140
- 'verbose_name_plural': 'Cases',
1141
- 'ordering': ['-start_date', 'patient'],
1226
+ "verbose_name": "Case",
1227
+ "verbose_name_plural": "Cases",
1228
+ "ordering": ["-start_date", "patient"],
1142
1229
  },
1143
1230
  ),
1144
1231
  migrations.CreateModel(
1145
- name='AnonymExaminationReport',
1232
+ name="AnonymExaminationReport",
1146
1233
  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')),
1234
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1235
+ ("meta", models.JSONField(blank=True, null=True)),
1236
+ ("text", models.TextField(blank=True, null=True)),
1237
+ ("date", models.DateField(blank=True, null=True)),
1238
+ ("time", models.TimeField(blank=True, null=True)),
1239
+ ("file", models.FileField(blank=True, null=True, upload_to="pdfs")),
1240
+ ("center", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.center")),
1241
+ ("type", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.documenttype")),
1242
+ ("examiners", models.ManyToManyField(blank=True, to="endoreg_db.examiner")),
1243
+ ("patient", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to="endoreg_db.patient")),
1244
+ (
1245
+ "patient_examination",
1246
+ models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.patientexamination"),
1247
+ ),
1158
1248
  ],
1159
1249
  options={
1160
- 'abstract': False,
1250
+ "abstract": False,
1161
1251
  },
1162
1252
  ),
1163
1253
  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)),
1254
+ name="PatientExaminationIndication",
1255
+ fields=[
1256
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1257
+ ("examination_indication", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.examinationindication")),
1258
+ (
1259
+ "indication_choice",
1260
+ models.ForeignKey(
1261
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.examinationindicationclassificationchoice"
1262
+ ),
1263
+ ),
1264
+ (
1265
+ "patient_examination",
1266
+ models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="indications", to="endoreg_db.patientexamination"),
1267
+ ),
1268
+ ],
1269
+ ),
1270
+ migrations.CreateModel(
1271
+ name="PatientExternalID",
1272
+ fields=[
1273
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1274
+ ("external_id", models.CharField(max_length=255)),
1275
+ ("origin", models.CharField(max_length=255)),
1276
+ ("patient", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="external_ids", to="endoreg_db.patient")),
1277
+ ],
1278
+ ),
1279
+ migrations.CreateModel(
1280
+ name="PatientFinding",
1281
+ fields=[
1282
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1283
+ ("created_at", models.DateTimeField(auto_now_add=True)),
1284
+ ("updated_at", models.DateTimeField(auto_now=True)),
1285
+ ("is_active", models.BooleanField(default=True, help_text="Deaktiviert statt gelöscht für Audit-Trail")),
1286
+ ("deactivated_at", models.DateTimeField(blank=True, null=True)),
1287
+ (
1288
+ "created_by",
1289
+ models.ForeignKey(
1290
+ blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="created_findings", to=settings.AUTH_USER_MODEL
1291
+ ),
1292
+ ),
1293
+ (
1294
+ "deactivated_by",
1295
+ models.ForeignKey(
1296
+ blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="deactivated_findings", to=settings.AUTH_USER_MODEL
1297
+ ),
1298
+ ),
1299
+ ("finding", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="finding_patient_findings", to="endoreg_db.finding")),
1300
+ (
1301
+ "patient_examination",
1302
+ models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="patient_findings", to="endoreg_db.patientexamination"),
1303
+ ),
1304
+ (
1305
+ "updated_by",
1306
+ models.ForeignKey(
1307
+ blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="updated_findings", to=settings.AUTH_USER_MODEL
1308
+ ),
1309
+ ),
1185
1310
  ],
1186
1311
  options={
1187
- 'verbose_name': 'Patient Finding',
1188
- 'verbose_name_plural': 'Patient Findings',
1189
- 'ordering': ['patient_examination', 'finding'],
1312
+ "verbose_name": "Patient Finding",
1313
+ "verbose_name_plural": "Patient Findings",
1314
+ "ordering": ["patient_examination", "finding"],
1190
1315
  },
1191
1316
  ),
1192
1317
  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')),
1318
+ model_name="labelvideosegment",
1319
+ name="patient_findings",
1320
+ field=models.ManyToManyField(blank=True, related_name="video_segments", to="endoreg_db.patientfinding"),
1321
+ ),
1322
+ migrations.CreateModel(
1323
+ name="PatientFindingClassification",
1324
+ fields=[
1325
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1326
+ ("is_active", models.BooleanField(default=True, help_text="Indicates if the classification is currently active.")),
1327
+ ("subcategories", models.JSONField(blank=True, null=True)),
1328
+ ("numerical_descriptors", models.JSONField(blank=True, null=True)),
1329
+ (
1330
+ "classification",
1331
+ models.ForeignKey(
1332
+ on_delete=django.db.models.deletion.CASCADE, related_name="patient_finding_classifications", to="endoreg_db.findingclassification"
1333
+ ),
1334
+ ),
1335
+ (
1336
+ "classification_choice",
1337
+ models.ForeignKey(
1338
+ on_delete=django.db.models.deletion.CASCADE, related_name="patient_finding_classifications", to="endoreg_db.findingclassificationchoice"
1339
+ ),
1340
+ ),
1341
+ ("finding", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="classifications", to="endoreg_db.patientfinding")),
1207
1342
  ],
1208
1343
  options={
1209
- 'verbose_name': 'Patient Finding Classification',
1210
- 'verbose_name_plural': 'Patient Finding Classifications',
1211
- 'ordering': ['finding', 'classification', 'classification_choice'],
1344
+ "verbose_name": "Patient Finding Classification",
1345
+ "verbose_name_plural": "Patient Finding Classifications",
1346
+ "ordering": ["finding", "classification", "classification_choice"],
1212
1347
  },
1213
1348
  ),
1214
1349
  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')),
1350
+ name="PatientFindingIntervention",
1351
+ fields=[
1352
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1353
+ ("is_active", models.BooleanField(default=True, help_text="Indicates if the intervention is currently active.")),
1354
+ ("state", models.CharField(blank=True, max_length=100, null=True)),
1355
+ ("time_start", models.DateTimeField(blank=True, null=True)),
1356
+ ("time_end", models.DateTimeField(blank=True, null=True)),
1357
+ ("date", models.DateField(blank=True, null=True)),
1358
+ ("finding", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="interventions", to="endoreg_db.patientfinding")),
1359
+ (
1360
+ "intervention",
1361
+ models.ForeignKey(
1362
+ on_delete=django.db.models.deletion.CASCADE, related_name="patient_finding_interventions", to="endoreg_db.findingintervention"
1363
+ ),
1364
+ ),
1365
+ ],
1366
+ ),
1367
+ migrations.CreateModel(
1368
+ name="PatientLabSample",
1369
+ fields=[
1370
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1371
+ ("date", models.DateTimeField()),
1372
+ ("patient", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="lab_samples", to="endoreg_db.patient")),
1373
+ ("sample_type", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.patientlabsampletype")),
1374
+ ],
1375
+ ),
1376
+ migrations.CreateModel(
1377
+ name="PatientMedication",
1378
+ fields=[
1379
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1380
+ ("dosage", models.JSONField(blank=True, null=True)),
1381
+ ("active", models.BooleanField(default=True)),
1382
+ ("intake_times", models.ManyToManyField(blank=True, related_name="intake_time_patient_medications", to="endoreg_db.medicationintaketime")),
1383
+ (
1384
+ "medication",
1385
+ models.ForeignKey(
1386
+ blank=True, on_delete=django.db.models.deletion.CASCADE, related_name="medication_patient_medications", to="endoreg_db.medication"
1387
+ ),
1388
+ ),
1389
+ (
1390
+ "medication_indication",
1391
+ models.ForeignKey(
1392
+ null=True,
1393
+ on_delete=django.db.models.deletion.CASCADE,
1394
+ related_name="indication_patient_medications",
1395
+ to="endoreg_db.medicationindication",
1396
+ ),
1397
+ ),
1398
+ ("patient", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.patient")),
1399
+ ("unit", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.unit")),
1247
1400
  ],
1248
1401
  options={
1249
- 'verbose_name': 'Patient Medication',
1250
- 'verbose_name_plural': 'Patient Medications',
1402
+ "verbose_name": "Patient Medication",
1403
+ "verbose_name_plural": "Patient Medications",
1251
1404
  },
1252
1405
  ),
1253
1406
  migrations.CreateModel(
1254
- name='PatientMedicationSchedule',
1407
+ name="PatientMedicationSchedule",
1255
1408
  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')),
1409
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1410
+ ("created_at", models.DateTimeField(auto_now_add=True)),
1411
+ ("updated_at", models.DateTimeField(auto_now=True)),
1412
+ ("medication", models.ManyToManyField(blank=True, related_name="patient_medication_schedules", to="endoreg_db.patientmedication")),
1413
+ ("patient", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.patient")),
1261
1414
  ],
1262
1415
  ),
1263
1416
  migrations.CreateModel(
1264
- name='PdfMeta',
1417
+ name="PdfMeta",
1265
1418
  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')),
1419
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1420
+ ("date", models.DateField()),
1421
+ ("time", models.TimeField()),
1422
+ ("pdf_hash", models.CharField(max_length=255, unique=True)),
1423
+ ("pdf_type", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.pdftype")),
1271
1424
  ],
1272
1425
  ),
1273
1426
  migrations.CreateModel(
1274
- name='CenterProduct',
1427
+ name="CenterProduct",
1275
1428
  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')),
1429
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1430
+ ("date_used", models.DateField()),
1431
+ ("center", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="center_products", to="endoreg_db.center")),
1432
+ ("product", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="center_products", to="endoreg_db.product")),
1280
1433
  ],
1281
1434
  options={
1282
- 'verbose_name': 'Center Product Usage',
1283
- 'verbose_name_plural': 'Center Product Usages',
1284
- 'ordering': ['center', '-date_used', 'product'],
1435
+ "verbose_name": "Center Product Usage",
1436
+ "verbose_name_plural": "Center Product Usages",
1437
+ "ordering": ["center", "-date_used", "product"],
1285
1438
  },
1286
1439
  ),
1287
1440
  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')),
1441
+ model_name="product",
1442
+ name="product_group",
1443
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="products", to="endoreg_db.productgroup"),
1444
+ ),
1445
+ migrations.CreateModel(
1446
+ name="PortalUserInfo",
1447
+ fields=[
1448
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1449
+ ("works_in_endoscopy", models.BooleanField(blank=True, null=True)),
1450
+ (
1451
+ "examiner",
1452
+ models.OneToOneField(
1453
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="portal_user_info", to="endoreg_db.examiner"
1454
+ ),
1455
+ ),
1456
+ ("user", models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
1457
+ (
1458
+ "profession",
1459
+ models.ForeignKey(
1460
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="portal_user_infos", to="endoreg_db.profession"
1461
+ ),
1462
+ ),
1300
1463
  ],
1301
1464
  ),
1302
1465
  migrations.AddField(
1303
- model_name='employeetype',
1304
- name='qualifications',
1305
- field=models.ManyToManyField(related_name='employee_types', to='endoreg_db.qualification'),
1466
+ model_name="employeetype",
1467
+ name="qualifications",
1468
+ field=models.ManyToManyField(related_name="employee_types", to="endoreg_db.qualification"),
1306
1469
  ),
1307
1470
  migrations.CreateModel(
1308
- name='EmployeeQualification',
1471
+ name="EmployeeQualification",
1309
1472
  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')),
1473
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1474
+ ("employee", models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name="qualification", to="endoreg_db.employee")),
1475
+ ("qualifications", models.ManyToManyField(related_name="employee_qualifications", to="endoreg_db.qualification")),
1313
1476
  ],
1314
1477
  ),
1315
1478
  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')),
1479
+ model_name="qualification",
1480
+ name="qualification_types",
1481
+ field=models.ManyToManyField(related_name="qualifications", to="endoreg_db.qualificationtype"),
1482
+ ),
1483
+ migrations.CreateModel(
1484
+ name="ReferenceProduct",
1485
+ fields=[
1486
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1487
+ ("name", models.CharField(max_length=255)),
1488
+ (
1489
+ "emission_factor_package",
1490
+ models.ForeignKey(
1491
+ null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="reference_product_package", to="endoreg_db.emissionfactor"
1492
+ ),
1493
+ ),
1494
+ (
1495
+ "emission_factor_product",
1496
+ models.ForeignKey(
1497
+ null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="reference_product_product", to="endoreg_db.emissionfactor"
1498
+ ),
1499
+ ),
1500
+ (
1501
+ "emission_factor_total",
1502
+ models.ForeignKey(
1503
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="reference_products", to="endoreg_db.emissionfactor"
1504
+ ),
1505
+ ),
1506
+ ("product", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="reference_products", to="endoreg_db.product")),
1507
+ (
1508
+ "product_group",
1509
+ models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name="reference_product", to="endoreg_db.productgroup"),
1510
+ ),
1511
+ ],
1512
+ ),
1513
+ migrations.CreateModel(
1514
+ name="ReportReaderConfig",
1515
+ fields=[
1516
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1517
+ ("locale", models.CharField(default="de_DE", max_length=10)),
1518
+ ("text_date_format", models.CharField(default="%d.%m.%Y", max_length=10)),
1519
+ ("first_names", models.ManyToManyField(related_name="report_reader_configs", to="endoreg_db.firstname")),
1520
+ ("last_names", models.ManyToManyField(related_name="report_reader_configs", to="endoreg_db.lastname")),
1521
+ ("cut_off_above", models.ManyToManyField(related_name="report_reader_configs_cut_off_above", to="endoreg_db.reportreaderflag")),
1522
+ ("cut_off_below", models.ManyToManyField(related_name="report_reader_configs_cut_off_below", to="endoreg_db.reportreaderflag")),
1523
+ (
1524
+ "endoscope_info_line_flag",
1525
+ models.ForeignKey(
1526
+ on_delete=django.db.models.deletion.CASCADE, related_name="report_reader_configs_endoscope_info_line", to="endoreg_db.reportreaderflag"
1527
+ ),
1528
+ ),
1529
+ (
1530
+ "examiner_info_line_flag",
1531
+ models.ForeignKey(
1532
+ on_delete=django.db.models.deletion.CASCADE, related_name="report_reader_configs_examiner_info_line", to="endoreg_db.reportreaderflag"
1533
+ ),
1534
+ ),
1535
+ (
1536
+ "patient_info_line_flag",
1537
+ models.ForeignKey(
1538
+ on_delete=django.db.models.deletion.CASCADE, related_name="report_reader_configs_patient_info_line", to="endoreg_db.reportreaderflag"
1539
+ ),
1540
+ ),
1345
1541
  ],
1346
1542
  ),
1347
1543
  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'),
1544
+ model_name="pdftype",
1545
+ name="cut_off_above_lines",
1546
+ field=models.ManyToManyField(related_name="pdf_type_cut_off_above_lines", to="endoreg_db.reportreaderflag"),
1351
1547
  ),
1352
1548
  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'),
1549
+ model_name="pdftype",
1550
+ name="cut_off_below_lines",
1551
+ field=models.ManyToManyField(related_name="pdf_type_cut_off_below_lines", to="endoreg_db.reportreaderflag"),
1356
1552
  ),
1357
1553
  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'),
1554
+ model_name="pdftype",
1555
+ name="endoscope_info_line",
1556
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="pdf_type_endoscopy_info_line", to="endoreg_db.reportreaderflag"),
1361
1557
  ),
1362
1558
  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'),
1559
+ model_name="pdftype",
1560
+ name="examiner_info_line",
1561
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="pdf_type_examiner_info_line", to="endoreg_db.reportreaderflag"),
1366
1562
  ),
1367
1563
  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')),
1564
+ model_name="pdftype",
1565
+ name="patient_info_line",
1566
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="pdf_type_patient_info_line", to="endoreg_db.reportreaderflag"),
1567
+ ),
1568
+ migrations.CreateModel(
1569
+ name="Requirement",
1570
+ fields=[
1571
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1572
+ ("name", models.CharField(max_length=100, unique=True)),
1573
+ ("description", models.TextField(blank=True, null=True)),
1574
+ (
1575
+ "numeric_value",
1576
+ models.FloatField(
1577
+ blank=True, help_text="Numeric value for the requirement. If not set, the requirement is not used in calculations.", null=True
1578
+ ),
1579
+ ),
1580
+ (
1581
+ "numeric_value_min",
1582
+ models.FloatField(
1583
+ blank=True, help_text="Minimum numeric value for the requirement. If not set, the requirement is not used in calculations.", null=True
1584
+ ),
1585
+ ),
1586
+ (
1587
+ "numeric_value_max",
1588
+ models.FloatField(
1589
+ blank=True, help_text="Maximum numeric value for the requirement. If not set, the requirement is not used in calculations.", null=True
1590
+ ),
1591
+ ),
1592
+ (
1593
+ "string_value",
1594
+ models.CharField(
1595
+ blank=True,
1596
+ help_text="String value for the requirement. If not set, the requirement is not used in calculations.",
1597
+ max_length=100,
1598
+ null=True,
1599
+ ),
1600
+ ),
1601
+ (
1602
+ "string_values",
1603
+ models.TextField(
1604
+ blank=True,
1605
+ help_text=" ','-separated list of string values for the requirement.If not set, the requirement is not used in calculations.",
1606
+ null=True,
1607
+ ),
1608
+ ),
1609
+ ("disease_classification_choices", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.diseaseclassificationchoice")),
1610
+ ("diseases", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.disease")),
1611
+ ("events", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.event")),
1612
+ ("examination_indications", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.examinationindication")),
1613
+ ("examinations", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.examination")),
1614
+ ("finding_classification_choices", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.findingclassificationchoice")),
1615
+ ("finding_classifications", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.findingclassification")),
1616
+ ("finding_interventions", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.findingintervention")),
1617
+ ("findings", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.finding")),
1618
+ ("genders", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.gender")),
1619
+ ("lab_values", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.labvalue")),
1620
+ ("medication_indications", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.medicationindication")),
1621
+ ("medication_intake_times", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.medicationintaketime")),
1622
+ ("medication_schedules", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.medicationschedule")),
1623
+ ("medications", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.medication")),
1624
+ ("operators", models.ManyToManyField(blank=True, related_name="required_in", to="endoreg_db.requirementoperator")),
1625
+ ("requirement_types", models.ManyToManyField(blank=True, related_name="linked_requirements", to="endoreg_db.requirementtype")),
1626
+ (
1627
+ "unit",
1628
+ models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="required_in", to="endoreg_db.unit"),
1629
+ ),
1630
+ ],
1631
+ ),
1632
+ migrations.CreateModel(
1633
+ name="Risk",
1634
+ fields=[
1635
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1636
+ ("name", models.CharField(max_length=100, unique=True)),
1637
+ ("name_de", models.CharField(blank=True, max_length=100, null=True)),
1638
+ ("name_en", models.CharField(blank=True, max_length=100, null=True)),
1639
+ ("description", models.TextField(blank=True, null=True)),
1640
+ (
1641
+ "risk_value",
1642
+ models.FloatField(blank=True, help_text="Risk value for the risk. If not set, the risk is not used in calculations.", null=True),
1643
+ ),
1644
+ (
1645
+ "risk_type",
1646
+ models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="risks", to="endoreg_db.risktype"),
1647
+ ),
1648
+ ],
1649
+ ),
1650
+ migrations.CreateModel(
1651
+ name="SensitiveMeta",
1652
+ fields=[
1653
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1654
+ ("examination_date", models.DateField(blank=True, null=True)),
1655
+ ("examination_time", models.TimeField(blank=True, null=True)),
1656
+ ("casenumber", models.CharField(blank=True, max_length=255, null=True)),
1657
+ ("file_path", models.CharField(blank=True, max_length=1024, null=True)),
1658
+ ("patient_first_name", models.CharField(blank=True, max_length=255, null=True)),
1659
+ ("patient_last_name", models.CharField(blank=True, max_length=255, null=True)),
1660
+ ("patient_dob", models.DateTimeField(blank=True, help_text="Date of birth (can be auto-generated).", null=True)),
1661
+ ("examiner_first_name", models.CharField(blank=True, editable=False, max_length=255, null=True)),
1662
+ ("examiner_last_name", models.CharField(blank=True, editable=False, max_length=255, null=True)),
1663
+ ("patient_hash", models.CharField(blank=True, db_index=True, editable=False, max_length=64, null=True)),
1664
+ ("examination_hash", models.CharField(blank=True, db_index=True, editable=False, max_length=64, null=True)),
1665
+ ("endoscope_type", models.CharField(blank=True, max_length=255, null=True)),
1666
+ ("endoscope_sn", models.CharField(blank=True, max_length=255, null=True)),
1667
+ ("text", models.TextField(blank=True, null=True)),
1668
+ ("anonymized_text", models.TextField(blank=True, null=True)),
1669
+ ("center", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.center")),
1670
+ ("examiners", models.ManyToManyField(blank=True, help_text="Pseudo-anonymized examiner(s)", to="endoreg_db.examiner")),
1671
+ ("external_id", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.patientexternalid")),
1672
+ ("patient_gender", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.gender")),
1673
+ (
1674
+ "pseudo_examination",
1675
+ models.ForeignKey(
1676
+ blank=True,
1677
+ help_text="FK to the pseudo-anonymized PatientExamination record.",
1678
+ null=True,
1679
+ on_delete=django.db.models.deletion.CASCADE,
1680
+ to="endoreg_db.patientexamination",
1681
+ ),
1682
+ ),
1683
+ (
1684
+ "pseudo_patient",
1685
+ models.ForeignKey(
1686
+ blank=True,
1687
+ help_text="FK to the pseudo-anonymized Patient record.",
1688
+ null=True,
1689
+ on_delete=django.db.models.deletion.CASCADE,
1690
+ to="endoreg_db.patient",
1691
+ ),
1692
+ ),
1693
+ ],
1694
+ ),
1695
+ migrations.CreateModel(
1696
+ name="RawPdfFile",
1697
+ fields=[
1698
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1699
+ ("pdf_hash", models.CharField(max_length=255, unique=True)),
1700
+ ("text", models.TextField(blank=True, null=True)),
1701
+ ("date_created", models.DateTimeField(auto_now_add=True)),
1702
+ ("date_modified", models.DateTimeField(auto_now=True)),
1703
+ ("anonymized", models.BooleanField(default=False, help_text="True if the PDF has been anonymized.")),
1704
+ ("file", models.FileField(upload_to="pdfs", validators=[django.core.validators.FileExtensionValidator(allowed_extensions=["pdf"])])),
1705
+ (
1706
+ "anonymized_file",
1707
+ models.FileField(
1708
+ blank=True, null=True, upload_to="pdfs", validators=[django.core.validators.FileExtensionValidator(allowed_extensions=["pdf"])]
1709
+ ),
1710
+ ),
1711
+ ("state_report_processing_required", models.BooleanField(default=True)),
1712
+ ("state_report_processed", models.BooleanField(default=False)),
1713
+ ("raw_meta", models.JSONField(blank=True, null=True)),
1714
+ ("anonymized_text", models.TextField(blank=True, null=True)),
1715
+ (
1716
+ "anonym_examination_report",
1717
+ models.OneToOneField(
1718
+ blank=True,
1719
+ null=True,
1720
+ on_delete=django.db.models.deletion.SET_NULL,
1721
+ related_name="raw_pdf_file",
1722
+ to="endoreg_db.anonymexaminationreport",
1723
+ ),
1724
+ ),
1725
+ ("center", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.center")),
1726
+ (
1727
+ "examination",
1728
+ models.ForeignKey(
1729
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="raw_pdf_files", to="endoreg_db.patientexamination"
1730
+ ),
1731
+ ),
1732
+ ("examiner", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.examiner")),
1733
+ (
1734
+ "patient",
1735
+ models.ForeignKey(
1736
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="raw_pdf_files", to="endoreg_db.patient"
1737
+ ),
1738
+ ),
1739
+ ("pdf_type", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.pdftype")),
1740
+ (
1741
+ "state",
1742
+ models.OneToOneField(
1743
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="raw_pdf_file", to="endoreg_db.rawpdfstate"
1744
+ ),
1745
+ ),
1746
+ (
1747
+ "sensitive_meta",
1748
+ models.ForeignKey(
1749
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="raw_pdf_files", to="endoreg_db.sensitivemeta"
1750
+ ),
1751
+ ),
1752
+ ],
1753
+ ),
1754
+ migrations.CreateModel(
1755
+ name="AnonymHistologyReport",
1756
+ fields=[
1757
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1758
+ ("meta", models.JSONField(blank=True, null=True)),
1759
+ ("text", models.TextField(blank=True, null=True)),
1760
+ ("date", models.DateField(blank=True, null=True)),
1761
+ ("time", models.TimeField(blank=True, null=True)),
1762
+ ("file", models.FileField(blank=True, null=True, upload_to="pdfs")),
1763
+ ("center", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.center")),
1764
+ ("type", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.documenttype")),
1765
+ ("examiners", models.ManyToManyField(blank=True, to="endoreg_db.examiner")),
1766
+ ("patient", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to="endoreg_db.patient")),
1767
+ (
1768
+ "patient_examination",
1769
+ models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.patientexamination"),
1770
+ ),
1771
+ ("sensitive_meta", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.sensitivemeta")),
1424
1772
  ],
1425
1773
  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,
1774
+ "abstract": False,
1502
1775
  },
1503
1776
  ),
1504
1777
  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'),
1778
+ model_name="anonymexaminationreport",
1779
+ name="sensitive_meta",
1780
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.sensitivemeta"),
1508
1781
  ),
1509
1782
  migrations.CreateModel(
1510
- name='SensitiveMetaState',
1783
+ name="SensitiveMetaState",
1511
1784
  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')),
1785
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1786
+ ("created_at", models.DateTimeField(auto_now_add=True)),
1787
+ ("updated_at", models.DateTimeField(auto_now=True)),
1788
+ ("dob_verified", models.BooleanField(default=False)),
1789
+ ("names_verified", models.BooleanField(default=False)),
1790
+ (
1791
+ "origin",
1792
+ models.OneToOneField(
1793
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="state", to="endoreg_db.sensitivemeta"
1794
+ ),
1795
+ ),
1518
1796
  ],
1519
1797
  options={
1520
- 'verbose_name': 'Sensitive Meta State',
1521
- 'verbose_name_plural': 'Sensitive Meta States',
1798
+ "verbose_name": "Sensitive Meta State",
1799
+ "verbose_name_plural": "Sensitive Meta States",
1522
1800
  },
1523
1801
  ),
1524
1802
  migrations.CreateModel(
1525
- name='Shift',
1803
+ name="Shift",
1526
1804
  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')),
1805
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1806
+ ("name", models.CharField(max_length=255, unique=True)),
1807
+ ("description", models.TextField(blank=True, null=True)),
1808
+ ("is_active", models.BooleanField(default=True)),
1809
+ ("required_qualifications", models.ManyToManyField(related_name="shifts", to="endoreg_db.qualification")),
1810
+ ("shift_types", models.ManyToManyField(related_name="shifts", to="endoreg_db.shifttype")),
1533
1811
  ],
1534
1812
  ),
1535
1813
  migrations.CreateModel(
1536
- name='CenterShift',
1814
+ name="CenterShift",
1537
1815
  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')),
1816
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1817
+ ("name", models.CharField(max_length=255, unique=True)),
1818
+ ("description", models.TextField(blank=True, null=True)),
1819
+ ("start_time", models.TimeField()),
1820
+ ("end_time", models.TimeField()),
1821
+ ("estimated_presence_fraction", models.DecimalField(decimal_places=4, default=Decimal("0"), max_digits=5)),
1822
+ ("center", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="center_shifts", to="endoreg_db.center")),
1823
+ ("scheduled_days", models.ManyToManyField(related_name="center_shifts", to="endoreg_db.scheduleddays")),
1824
+ ("shift", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="center_shifts", to="endoreg_db.shift")),
1547
1825
  ],
1548
1826
  ),
1549
1827
  migrations.CreateModel(
1550
- name='RequirementSet',
1828
+ name="RequirementSet",
1551
1829
  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')),
1830
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1831
+ ("name", models.CharField(max_length=100, unique=True)),
1832
+ ("description", models.TextField(blank=True, null=True)),
1833
+ ("information_sources", models.ManyToManyField(blank=True, related_name="requirement_sets", to="endoreg_db.informationsource")),
1834
+ ("links_to_sets", models.ManyToManyField(blank=True, related_name="links_from_sets", to="endoreg_db.requirementset")),
1835
+ ("reqset_exam_links", models.ManyToManyField(blank=True, related_name="requirement_set", to="endoreg_db.examinationrequirementset")),
1836
+ ("requirements", models.ManyToManyField(blank=True, related_name="requirement_sets", to="endoreg_db.requirement")),
1837
+ (
1838
+ "requirement_set_type",
1839
+ models.ForeignKey(
1840
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="requirement_sets", to="endoreg_db.requirementsettype"
1841
+ ),
1842
+ ),
1843
+ ("tags", models.ManyToManyField(blank=True, related_name="requirement_sets", to="endoreg_db.tag")),
1561
1844
  ],
1562
1845
  ),
1563
1846
  migrations.CreateModel(
1564
- name='TransportRoute',
1847
+ name="TransportRoute",
1565
1848
  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')),
1849
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1850
+ ("distance", models.FloatField()),
1851
+ ("name", models.CharField(max_length=255)),
1852
+ ("emission_factor", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.emissionfactor")),
1853
+ ("unit", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.unit")),
1571
1854
  ],
1572
1855
  ),
1573
1856
  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'),
1857
+ model_name="product",
1858
+ name="transport_route",
1859
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.transportroute"),
1577
1860
  ),
1578
1861
  migrations.CreateModel(
1579
- name='ProductWeight',
1862
+ name="ProductWeight",
1580
1863
  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')),
1864
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1865
+ ("name", models.CharField(max_length=255, null=True)),
1866
+ ("measured", models.FloatField(null=True)),
1867
+ ("verified", models.FloatField(null=True)),
1868
+ ("manufacturer", models.FloatField(null=True)),
1869
+ ("product", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.product")),
1870
+ ("unit", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.unit")),
1588
1871
  ],
1589
1872
  ),
1590
1873
  migrations.CreateModel(
1591
- name='ProductMaterial',
1874
+ name="ProductMaterial",
1592
1875
  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')),
1876
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1877
+ ("component", models.CharField(max_length=255)),
1878
+ ("quantity", models.FloatField()),
1879
+ (
1880
+ "material",
1881
+ models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="material_product_materials", to="endoreg_db.material"),
1882
+ ),
1883
+ ("product", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="product_product_materials", to="endoreg_db.product")),
1884
+ ("unit", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="unit_product_materials", to="endoreg_db.unit")),
1599
1885
  ],
1600
1886
  ),
1601
1887
  migrations.CreateModel(
1602
- name='PatientLabValue',
1888
+ name="PatientLabValue",
1603
1889
  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')),
1890
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1891
+ ("value", models.FloatField(blank=True, null=True)),
1892
+ ("value_str", models.CharField(blank=True, max_length=255, null=True)),
1893
+ ("datetime", models.DateTimeField(auto_now_add=True)),
1894
+ ("normal_range", models.JSONField(default=dict)),
1895
+ ("lab_value", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.labvalue")),
1896
+ (
1897
+ "patient",
1898
+ models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="lab_values", to="endoreg_db.patient"),
1899
+ ),
1900
+ (
1901
+ "sample",
1902
+ models.ForeignKey(
1903
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="values", to="endoreg_db.patientlabsample"
1904
+ ),
1905
+ ),
1906
+ ("unit", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.unit")),
1613
1907
  ],
1614
1908
  ),
1615
1909
  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'),
1910
+ model_name="medication",
1911
+ name="default_unit",
1912
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.unit"),
1619
1913
  ),
1620
1914
  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')),
1915
+ model_name="emissionfactor",
1916
+ name="unit",
1917
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.unit"),
1918
+ ),
1919
+ migrations.CreateModel(
1920
+ name="CenterResource",
1921
+ fields=[
1922
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1923
+ ("name", models.CharField(max_length=255, null=True)),
1924
+ ("quantity", models.FloatField()),
1925
+ ("year", models.IntegerField()),
1926
+ ("center", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="center_resources", to="endoreg_db.center")),
1927
+ (
1928
+ "transport_emission_factor",
1929
+ models.ForeignKey(
1930
+ null=True,
1931
+ on_delete=django.db.models.deletion.SET_NULL,
1932
+ related_name="center_resource_transport_emission_factor",
1933
+ to="endoreg_db.emissionfactor",
1934
+ ),
1935
+ ),
1936
+ (
1937
+ "use_emission_factor",
1938
+ models.ForeignKey(
1939
+ null=True,
1940
+ on_delete=django.db.models.deletion.SET_NULL,
1941
+ related_name="center_resource_use_emission_factor",
1942
+ to="endoreg_db.emissionfactor",
1943
+ ),
1944
+ ),
1945
+ ("resource", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.resource")),
1946
+ ("unit", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.unit")),
1947
+ ],
1948
+ ),
1949
+ migrations.CreateModel(
1950
+ name="UploadJob",
1951
+ fields=[
1952
+ (
1953
+ "id",
1954
+ models.UUIDField(default=uuid.uuid4, editable=False, help_text="Unique identifier for the upload job", primary_key=True, serialize=False),
1955
+ ),
1956
+ ("file", models.FileField(help_text="Uploaded file (PDF or video)", upload_to="uploads/%Y/%m/%d/")),
1957
+ (
1958
+ "status",
1959
+ models.CharField(
1960
+ choices=[("pending", "Pending"), ("processing", "Processing"), ("anonymized", "Anonymized"), ("error", "Error")],
1961
+ default="pending",
1962
+ help_text="Current processing status of the upload",
1963
+ max_length=20,
1964
+ ),
1965
+ ),
1966
+ ("content_type", models.CharField(blank=True, help_text="MIME type of the uploaded file", max_length=100)),
1967
+ ("error_detail", models.TextField(blank=True, help_text="Error message if processing failed")),
1968
+ ("created_at", models.DateTimeField(auto_now_add=True, help_text="When the upload job was created")),
1969
+ ("updated_at", models.DateTimeField(auto_now=True, help_text="When the upload job was last updated")),
1970
+ (
1971
+ "sensitive_meta",
1972
+ models.ForeignKey(
1973
+ blank=True,
1974
+ help_text="Link to the created SensitiveMeta record after processing",
1975
+ null=True,
1976
+ on_delete=django.db.models.deletion.SET_NULL,
1977
+ to="endoreg_db.sensitivemeta",
1978
+ ),
1979
+ ),
1650
1980
  ],
1651
1981
  options={
1652
- 'verbose_name': 'Upload Job',
1653
- 'verbose_name_plural': 'Upload Jobs',
1654
- 'ordering': ['-created_at'],
1982
+ "verbose_name": "Upload Job",
1983
+ "verbose_name_plural": "Upload Jobs",
1984
+ "ordering": ["-created_at"],
1655
1985
  },
1656
1986
  ),
1657
1987
  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')),
1988
+ name="VideoFile",
1989
+ fields=[
1990
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1991
+ ("uuid", models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
1992
+ (
1993
+ "raw_file",
1994
+ models.FileField(
1995
+ blank=True, null=True, upload_to="videos", validators=[django.core.validators.FileExtensionValidator(allowed_extensions=["mp4"])]
1996
+ ),
1997
+ ),
1998
+ (
1999
+ "processed_file",
2000
+ models.FileField(
2001
+ blank=True, null=True, upload_to="videos", validators=[django.core.validators.FileExtensionValidator(allowed_extensions=["mp4"])]
2002
+ ),
2003
+ ),
2004
+ ("video_hash", models.CharField(help_text="Hash of the raw video file.", max_length=255, unique=True)),
2005
+ (
2006
+ "processed_video_hash",
2007
+ models.CharField(blank=True, help_text="Hash of the processed video file, unique if not null.", max_length=255, null=True, unique=True),
2008
+ ),
2009
+ ("original_file_name", models.CharField(blank=True, max_length=255, null=True)),
2010
+ ("uploaded_at", models.DateTimeField(auto_now_add=True)),
2011
+ ("frame_dir", models.CharField(blank=True, help_text="Path to frames extracted from the raw video.", max_length=512)),
2012
+ ("fps", models.FloatField(blank=True, null=True)),
2013
+ ("duration", models.FloatField(blank=True, null=True)),
2014
+ ("frame_count", models.IntegerField(blank=True, null=True)),
2015
+ ("width", models.IntegerField(blank=True, null=True)),
2016
+ ("height", models.IntegerField(blank=True, null=True)),
2017
+ ("suffix", models.CharField(blank=True, max_length=10, null=True)),
2018
+ ("sequences", models.JSONField(blank=True, default=dict, help_text="AI prediction sequences based on raw frames.")),
2019
+ ("date", models.DateField(blank=True, null=True)),
2020
+ ("meta", models.JSONField(blank=True, null=True)),
2021
+ ("date_created", models.DateTimeField(auto_now_add=True)),
2022
+ ("date_modified", models.DateTimeField(auto_now=True)),
2023
+ ("ai_model_meta", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.modelmeta")),
2024
+ ("center", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="endoreg_db.center")),
2025
+ (
2026
+ "examination",
2027
+ models.ForeignKey(
2028
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="video_files", to="endoreg_db.patientexamination"
2029
+ ),
2030
+ ),
2031
+ (
2032
+ "patient",
2033
+ models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="video_files", to="endoreg_db.patient"),
2034
+ ),
2035
+ ("processor", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to="endoreg_db.endoscopyprocessor")),
2036
+ (
2037
+ "sensitive_meta",
2038
+ models.OneToOneField(
2039
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="video_file", to="endoreg_db.sensitivemeta"
2040
+ ),
2041
+ ),
2042
+ ("import_meta", models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.videoimportmeta")),
1687
2043
  ],
1688
2044
  ),
1689
2045
  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'),
2046
+ model_name="patientexamination",
2047
+ name="video",
2048
+ field=models.OneToOneField(
2049
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="patient_examination", to="endoreg_db.videofile"
2050
+ ),
1693
2051
  ),
1694
2052
  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'),
2053
+ model_name="labelvideosegment",
2054
+ name="video_file",
2055
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="label_video_segments", to="endoreg_db.videofile"),
1698
2056
  ),
1699
2057
  migrations.CreateModel(
1700
- name='Frame',
2058
+ name="Frame",
1701
2059
  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')),
2060
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2061
+ ("frame_number", models.PositiveIntegerField()),
2062
+ ("relative_path", models.CharField(max_length=512)),
2063
+ ("timestamp", models.FloatField(blank=True, null=True)),
2064
+ ("is_extracted", models.BooleanField(default=False)),
2065
+ ("video", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="frames", to="endoreg_db.videofile")),
1708
2066
  ],
1709
2067
  options={
1710
- 'ordering': ['video', 'frame_number'],
2068
+ "ordering": ["video", "frame_number"],
1711
2069
  },
1712
2070
  ),
1713
2071
  migrations.CreateModel(
1714
- name='VideoMeta',
2072
+ name="VideoMeta",
1715
2073
  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')),
2074
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2075
+ ("center", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.center")),
2076
+ ("endoscope", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.endoscope")),
2077
+ ("ffmpeg_meta", models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.ffmpegmeta")),
2078
+ ("import_meta", models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.videoimportmeta")),
2079
+ ("processor", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.endoscopyprocessor")),
1722
2080
  ],
1723
2081
  ),
1724
2082
  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'),
2083
+ model_name="videofile",
2084
+ name="video_meta",
2085
+ field=models.OneToOneField(
2086
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="video_file", to="endoreg_db.videometa"
2087
+ ),
2088
+ ),
2089
+ migrations.CreateModel(
2090
+ name="VideoMetadata",
2091
+ fields=[
2092
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2093
+ (
2094
+ "sensitive_frame_count",
2095
+ models.IntegerField(blank=True, help_text="Number of frames detected as containing sensitive information", null=True),
2096
+ ),
2097
+ ("sensitive_ratio", models.FloatField(blank=True, help_text="Ratio of sensitive frames to total frames (0.0-1.0)", null=True)),
2098
+ ("sensitive_frame_ids", models.TextField(blank=True, help_text="JSON array of sensitive frame indices (0-based)", null=True)),
2099
+ ("analyzed_at", models.DateTimeField(auto_now=True, help_text="Timestamp of last analysis")),
2100
+ (
2101
+ "video",
2102
+ models.OneToOneField(
2103
+ help_text="Video file this metadata belongs to",
2104
+ on_delete=django.db.models.deletion.CASCADE,
2105
+ related_name="metadata",
2106
+ to="endoreg_db.videofile",
2107
+ ),
2108
+ ),
2109
+ ],
2110
+ options={
2111
+ "verbose_name": "Video Metadata",
2112
+ "verbose_name_plural": "Video Metadata",
2113
+ "db_table": "video_metadata",
2114
+ },
1728
2115
  ),
1729
2116
  migrations.CreateModel(
1730
- name='VideoPredictionMeta',
2117
+ name="VideoPredictionMeta",
1731
2118
  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')),
2119
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2120
+ ("date_created", models.DateTimeField(auto_now_add=True)),
2121
+ ("date_modified", models.DateTimeField(auto_now=True)),
2122
+ ("prediction_array", models.BinaryField(blank=True, null=True)),
2123
+ ("model_meta", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.modelmeta")),
2124
+ ("video_file", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="video_prediction_meta", to="endoreg_db.videofile")),
1738
2125
  ],
1739
2126
  ),
1740
2127
  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'),
2128
+ model_name="labelvideosegment",
2129
+ name="prediction_meta",
2130
+ field=models.ForeignKey(
2131
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="label_video_segments", to="endoreg_db.videopredictionmeta"
2132
+ ),
2133
+ ),
2134
+ migrations.CreateModel(
2135
+ name="VideoProcessingHistory",
2136
+ fields=[
2137
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2138
+ (
2139
+ "operation",
2140
+ models.CharField(
2141
+ choices=[
2142
+ ("mask_overlay", "Mask Overlay"),
2143
+ ("frame_removal", "Frame Removal"),
2144
+ ("analysis", "Sensitivity Analysis"),
2145
+ ("reprocessing", "Full Reprocessing"),
2146
+ ],
2147
+ help_text="Type of processing operation",
2148
+ max_length=50,
2149
+ ),
2150
+ ),
2151
+ (
2152
+ "status",
2153
+ models.CharField(
2154
+ choices=[("pending", "Pending"), ("running", "Running"), ("success", "Success"), ("failure", "Failure"), ("cancelled", "Cancelled")],
2155
+ default="pending",
2156
+ help_text="Current status of the operation",
2157
+ max_length=20,
2158
+ ),
2159
+ ),
2160
+ ("config", models.JSONField(default=dict, help_text="Operation configuration (mask settings, frame list, etc.)")),
2161
+ ("output_file", models.CharField(blank=True, help_text="Path to output file (relative to MEDIA_ROOT)", max_length=500)),
2162
+ ("details", models.TextField(blank=True, help_text="Additional details or error messages")),
2163
+ ("task_id", models.CharField(blank=True, help_text="Celery task ID for progress tracking", max_length=100)),
2164
+ ("created_at", models.DateTimeField(auto_now_add=True, help_text="When the operation was started")),
2165
+ ("completed_at", models.DateTimeField(blank=True, help_text="When the operation completed (success or failure)", null=True)),
2166
+ (
2167
+ "video",
2168
+ models.ForeignKey(
2169
+ help_text="Video file this operation was performed on",
2170
+ on_delete=django.db.models.deletion.CASCADE,
2171
+ related_name="processing_history",
2172
+ to="endoreg_db.videofile",
2173
+ ),
2174
+ ),
2175
+ ],
2176
+ options={
2177
+ "verbose_name": "Video Processing History",
2178
+ "verbose_name_plural": "Video Processing Histories",
2179
+ "db_table": "video_processing_history",
2180
+ "ordering": ["-created_at"],
2181
+ },
1744
2182
  ),
1745
2183
  migrations.CreateModel(
1746
- name='VideoSegmentationAnnotation',
2184
+ name="VideoSegmentationAnnotation",
1747
2185
  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')),
2186
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2187
+ ("start_time", models.FloatField()),
2188
+ ("stop_time", models.FloatField()),
2189
+ ("is_true", models.BooleanField(default=True)),
2190
+ (
2191
+ "video_file",
2192
+ models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="video_segmentation_annotations", to="endoreg_db.videofile"),
2193
+ ),
2194
+ ("label", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.videosegmentationlabel")),
1754
2195
  ],
1755
2196
  ),
1756
2197
  migrations.CreateModel(
1757
- name='VideoSegmentationLabelSet',
2198
+ name="VideoSegmentationLabelSet",
1758
2199
  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')),
2200
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2201
+ ("name", models.CharField(max_length=255)),
2202
+ ("description", models.TextField(blank=True, null=True)),
2203
+ ("labels", models.ManyToManyField(related_name="labelsets", to="endoreg_db.videosegmentationlabel")),
1763
2204
  ],
1764
2205
  ),
1765
2206
  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'),
2207
+ model_name="aimodel",
2208
+ name="video_segmentation_labelset",
2209
+ field=models.ForeignKey(
2210
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="ai_models", to="endoreg_db.videosegmentationlabelset"
2211
+ ),
1769
2212
  ),
1770
2213
  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')),
2214
+ model_name="videofile",
2215
+ name="state",
2216
+ field=models.OneToOneField(
2217
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="video_file", to="endoreg_db.videostate"
2218
+ ),
2219
+ ),
2220
+ migrations.CreateModel(
2221
+ name="CenterWaste",
2222
+ fields=[
2223
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2224
+ ("year", models.IntegerField()),
2225
+ ("quantity", models.FloatField()),
2226
+ ("center", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="center_wastes", to="endoreg_db.center")),
2227
+ ("emission_factor", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.emissionfactor")),
2228
+ ("unit", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="endoreg_db.unit")),
2229
+ ("waste", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="endoreg_db.waste")),
2230
+ ],
2231
+ ),
2232
+ migrations.CreateModel(
2233
+ name="ImageClassificationAnnotation",
2234
+ fields=[
2235
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2236
+ ("value", models.BooleanField()),
2237
+ ("float_value", models.FloatField(blank=True, null=True)),
2238
+ ("annotator", models.CharField(blank=True, max_length=255, null=True)),
2239
+ ("date_created", models.DateTimeField(auto_now_add=True)),
2240
+ ("date_modified", models.DateTimeField(auto_now=True)),
2241
+ (
2242
+ "frame",
2243
+ models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="image_classification_annotations", to="endoreg_db.frame"),
2244
+ ),
2245
+ (
2246
+ "information_source",
2247
+ models.ForeignKey(
2248
+ blank=True,
2249
+ default=None,
2250
+ null=True,
2251
+ on_delete=django.db.models.deletion.SET_NULL,
2252
+ related_name="image_classification_annotations",
2253
+ to="endoreg_db.informationsource",
2254
+ ),
2255
+ ),
2256
+ (
2257
+ "label",
2258
+ models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="image_classification_annotations", to="endoreg_db.label"),
2259
+ ),
2260
+ (
2261
+ "model_meta",
2262
+ models.ForeignKey(
2263
+ blank=True,
2264
+ default=None,
2265
+ null=True,
2266
+ on_delete=django.db.models.deletion.SET_NULL,
2267
+ related_name="image_classification_annotations",
2268
+ to="endoreg_db.modelmeta",
2269
+ ),
2270
+ ),
1800
2271
  ],
1801
2272
  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')],
2273
+ "indexes": [
2274
+ models.Index(fields=["frame", "label"], name="endoreg_db__frame_i_47f916_idx"),
2275
+ models.Index(fields=["frame"], name="endoreg_db__frame_i_92c75a_idx"),
2276
+ ],
1803
2277
  },
1804
2278
  ),
2279
+ migrations.AddConstraint(
2280
+ model_name="patientexternalid",
2281
+ constraint=models.UniqueConstraint(fields=("origin", "external_id"), name="uniq_patient_external_id_per_origin"),
2282
+ ),
1805
2283
  migrations.AddIndex(
1806
- model_name='patientfinding',
1807
- index=models.Index(fields=['patient_examination', 'finding'], name='endoreg_db__patient_54869f_idx'),
2284
+ model_name="patientfinding",
2285
+ index=models.Index(fields=["patient_examination", "finding"], name="endoreg_db__patient_54869f_idx"),
1808
2286
  ),
1809
2287
  migrations.AddIndex(
1810
- model_name='patientfinding',
1811
- index=models.Index(fields=['patient_examination', 'is_active'], name='endoreg_db__patient_9359f8_idx'),
2288
+ model_name="patientfinding",
2289
+ index=models.Index(fields=["patient_examination", "is_active"], name="endoreg_db__patient_9359f8_idx"),
1812
2290
  ),
1813
2291
  migrations.AddIndex(
1814
- model_name='patientfinding',
1815
- index=models.Index(fields=['created_at'], name='endoreg_db__created_b44d86_idx'),
2292
+ model_name="patientfinding",
2293
+ index=models.Index(fields=["created_at"], name="endoreg_db__created_b44d86_idx"),
1816
2294
  ),
1817
2295
  migrations.AddIndex(
1818
- model_name='patientfinding',
1819
- index=models.Index(fields=['finding', 'is_active'], name='endoreg_db__finding_2f036b_idx'),
2296
+ model_name="patientfinding",
2297
+ index=models.Index(fields=["finding", "is_active"], name="endoreg_db__finding_2f036b_idx"),
1820
2298
  ),
1821
2299
  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'),
2300
+ model_name="patientfinding",
2301
+ constraint=models.UniqueConstraint(
2302
+ condition=models.Q(("is_active", True)), fields=("patient_examination", "finding"), name="unique_active_finding_per_examination"
2303
+ ),
1824
2304
  ),
1825
2305
  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'),
2306
+ model_name="patientfinding",
2307
+ constraint=models.CheckConstraint(
2308
+ check=models.Q(
2309
+ models.Q(("deactivated_at__isnull", True), ("deactivated_by__isnull", True)),
2310
+ models.Q(("deactivated_at__isnull", False), ("deactivated_by__isnull", False), ("is_active", False)),
2311
+ _connector="OR",
2312
+ ),
2313
+ name="deactivation_fields_consistency",
2314
+ ),
1828
2315
  ),
1829
2316
  migrations.AlterUniqueTogether(
1830
- name='frame',
1831
- unique_together={('video', 'frame_number')},
2317
+ name="frame",
2318
+ unique_together={("video", "frame_number")},
1832
2319
  ),
1833
2320
  migrations.AddIndex(
1834
- model_name='videopredictionmeta',
1835
- index=models.Index(fields=['model_meta', 'video_file'], name='endoreg_db__model_m_208dee_idx'),
2321
+ model_name="videopredictionmeta",
2322
+ index=models.Index(fields=["model_meta", "video_file"], name="endoreg_db__model_m_208dee_idx"),
1836
2323
  ),
1837
2324
  migrations.AddConstraint(
1838
- model_name='videopredictionmeta',
1839
- constraint=models.UniqueConstraint(fields=('model_meta', 'video_file'), name='unique_prediction_per_video_model'),
2325
+ model_name="videopredictionmeta",
2326
+ constraint=models.UniqueConstraint(fields=("model_meta", "video_file"), name="unique_prediction_per_video_model"),
1840
2327
  ),
1841
2328
  migrations.AddIndex(
1842
- model_name='labelvideosegment',
1843
- index=models.Index(fields=['video_file', 'label', 'start_frame_number'], name='endoreg_db__video_f_fa9326_idx'),
2329
+ model_name="labelvideosegment",
2330
+ index=models.Index(fields=["video_file", "label", "start_frame_number"], name="endoreg_db__video_f_fa9326_idx"),
1844
2331
  ),
1845
2332
  migrations.AddIndex(
1846
- model_name='labelvideosegment',
1847
- index=models.Index(fields=['prediction_meta', 'label'], name='endoreg_db__predict_2bfba4_idx'),
2333
+ model_name="labelvideosegment",
2334
+ index=models.Index(fields=["prediction_meta", "label"], name="endoreg_db__predict_2bfba4_idx"),
1848
2335
  ),
1849
2336
  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'),
2337
+ model_name="labelvideosegment",
2338
+ constraint=models.CheckConstraint(check=models.Q(("start_frame_number__lt", models.F("end_frame_number"))), name="segment_start_lt_end"),
2339
+ ),
2340
+ migrations.AddIndex(
2341
+ model_name="videoprocessinghistory",
2342
+ index=models.Index(fields=["video", "-created_at"], name="video_proce_video_i_98ffe0_idx"),
2343
+ ),
2344
+ migrations.AddIndex(
2345
+ model_name="videoprocessinghistory",
2346
+ index=models.Index(fields=["task_id"], name="video_proce_task_id_ec8b15_idx"),
2347
+ ),
2348
+ migrations.AddIndex(
2349
+ model_name="videoprocessinghistory",
2350
+ index=models.Index(fields=["status"], name="video_proce_status_6f71fd_idx"),
1852
2351
  ),
1853
2352
  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'),
2353
+ model_name="videosegmentationannotation",
2354
+ constraint=models.CheckConstraint(check=models.Q(("start_time__lt", models.F("stop_time"))), name="start_time_less_than_stop_time"),
1856
2355
  ),
1857
2356
  ]