endoreg-db 0.6.0__py3-none-any.whl → 0.6.2__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (416) hide show
  1. endoreg_db/case_generator/__init__.py +0 -0
  2. endoreg_db/case_generator/case_generator.py +159 -0
  3. endoreg_db/case_generator/lab_sample_factory.py +33 -0
  4. endoreg_db/case_generator/utils.py +30 -0
  5. endoreg_db/data/__init__.py +118 -0
  6. endoreg_db/data/agl_service/data.yaml +19 -0
  7. endoreg_db/data/ai_model/data.yaml +7 -0
  8. endoreg_db/data/ai_model_label/label/data.yaml +88 -0
  9. endoreg_db/data/ai_model_label/label-set/data.yaml +21 -0
  10. endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
  11. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +5 -0
  12. endoreg_db/data/ai_model_type/data.yaml +7 -0
  13. endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
  14. endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
  15. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
  16. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
  17. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
  18. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
  19. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
  20. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
  21. endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
  22. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
  23. endoreg_db/data/case_template/rule_value/.init +0 -0
  24. endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
  25. endoreg_db/data/case_template/template/base.yaml +8 -0
  26. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
  27. endoreg_db/data/case_template/tmp/_rule_value +13 -0
  28. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
  29. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
  30. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
  31. endoreg_db/data/center/data.yaml +90 -0
  32. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
  33. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
  34. endoreg_db/data/contraindication/bleeding.yaml +11 -0
  35. endoreg_db/data/disease/cardiovascular.yaml +37 -0
  36. endoreg_db/data/disease/hepatology.yaml +5 -0
  37. endoreg_db/data/disease/misc.yaml +6 -0
  38. endoreg_db/data/disease/renal.yaml +5 -0
  39. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
  40. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
  41. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
  42. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
  43. endoreg_db/data/distribution/date/patient.yaml +7 -0
  44. endoreg_db/data/distribution/multiple_categorical/.init +0 -0
  45. endoreg_db/data/distribution/numeric/data.yaml +14 -0
  46. endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
  47. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
  48. endoreg_db/data/endoscope/data.yaml +93 -0
  49. endoreg_db/data/endoscope_type/data.yaml +11 -0
  50. endoreg_db/data/endoscopy_processor/data.yaml +47 -0
  51. endoreg_db/data/event/cardiology.yaml +28 -0
  52. endoreg_db/data/event/neurology.yaml +14 -0
  53. endoreg_db/data/event/surgery.yaml +13 -0
  54. endoreg_db/data/event/thrombembolism.yaml +20 -0
  55. endoreg_db/data/examination/examinations/data.yaml +66 -0
  56. endoreg_db/data/examination/time/data.yaml +48 -0
  57. endoreg_db/data/examination/time-type/data.yaml +8 -0
  58. endoreg_db/data/examination/type/data.yaml +5 -0
  59. endoreg_db/data/examination_indication/endoscopy.yaml +8 -0
  60. endoreg_db/data/examination_indication_classification/endoscopy.yaml +8 -0
  61. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
  62. endoreg_db/data/finding/data.yaml +141 -0
  63. endoreg_db/data/finding_intervention/endoscopy.yaml +138 -0
  64. endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
  65. endoreg_db/data/finding_location_classification/colonoscopy.yaml +46 -0
  66. endoreg_db/data/finding_location_classification_choice/colonoscopy.yaml +240 -0
  67. endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +48 -0
  68. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_circularity_default.yaml +34 -0
  69. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_nice.yaml +20 -0
  70. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_paris.yaml +65 -0
  71. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_planarity_default.yaml +56 -0
  72. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_surface_intact_default.yaml +39 -0
  73. endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +57 -0
  74. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
  75. endoreg_db/data/finding_type/data.yaml +30 -0
  76. endoreg_db/data/gender/data.yaml +35 -0
  77. endoreg_db/data/information_source/data.yaml +30 -0
  78. endoreg_db/data/information_source/medication.yaml +6 -0
  79. endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
  80. endoreg_db/data/lab_value/coagulation.yaml +54 -0
  81. endoreg_db/data/lab_value/electrolytes.yaml +228 -0
  82. endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
  83. endoreg_db/data/lab_value/hematology.yaml +184 -0
  84. endoreg_db/data/lab_value/hormones.yaml +59 -0
  85. endoreg_db/data/lab_value/lipids.yaml +53 -0
  86. endoreg_db/data/lab_value/misc.yaml +33 -0
  87. endoreg_db/data/lab_value/renal_function.yaml +12 -0
  88. endoreg_db/data/log_type/data.yaml +57 -0
  89. endoreg_db/data/lx_client_tag/base.yaml +54 -0
  90. endoreg_db/data/lx_client_type/base.yaml +30 -0
  91. endoreg_db/data/lx_permission/base.yaml +24 -0
  92. endoreg_db/data/lx_permission/endoreg.yaml +52 -0
  93. endoreg_db/data/material/material.yaml +91 -0
  94. endoreg_db/data/medication/anticoagulation.yaml +65 -0
  95. endoreg_db/data/medication/tah.yaml +70 -0
  96. endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
  97. endoreg_db/data/medication_indication_type/data.yaml +11 -0
  98. endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
  99. endoreg_db/data/medication_intake_time/base.yaml +31 -0
  100. endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
  101. endoreg_db/data/medication_schedule/ass.yaml +12 -0
  102. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
  103. endoreg_db/data/names_first/first_names.yaml +51 -0
  104. endoreg_db/data/names_last/last_names.yaml +51 -0
  105. endoreg_db/data/network_device/data.yaml +59 -0
  106. endoreg_db/data/network_device_type/data.yaml +12 -0
  107. endoreg_db/data/organ/data.yaml +29 -0
  108. endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
  109. endoreg_db/data/pdf_type/data.yaml +29 -0
  110. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
  111. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
  112. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
  113. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
  114. endoreg_db/data/profession/data.yaml +70 -0
  115. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
  116. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
  117. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -0
  118. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
  119. endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
  120. endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
  121. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
  122. endoreg_db/data/unit/concentration.yaml +92 -0
  123. endoreg_db/data/unit/data.yaml +17 -0
  124. endoreg_db/data/unit/length.yaml +31 -0
  125. endoreg_db/data/unit/misc.yaml +20 -0
  126. endoreg_db/data/unit/rate.yaml +6 -0
  127. endoreg_db/data/unit/time.yaml +13 -0
  128. endoreg_db/data/unit/volume.yaml +35 -0
  129. endoreg_db/data/unit/weight.yaml +38 -0
  130. endoreg_db/data/waste/data.yaml +12 -0
  131. endoreg_db/forms/__init__.py +5 -0
  132. endoreg_db/forms/examination_form.py +11 -0
  133. endoreg_db/forms/patient_finding_intervention_form.py +19 -0
  134. endoreg_db/forms/patient_form.py +26 -0
  135. endoreg_db/forms/questionnaires/__init__.py +1 -0
  136. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
  137. endoreg_db/forms/settings/__init__.py +8 -0
  138. endoreg_db/forms/unit.py +6 -0
  139. endoreg_db/management/__init__.py +0 -0
  140. endoreg_db/management/commands/__init__.py +0 -0
  141. endoreg_db/management/commands/_load_model_template.py +41 -0
  142. endoreg_db/management/commands/delete_all.py +18 -0
  143. endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -0
  144. endoreg_db/management/commands/fix_auth_permission.py +20 -0
  145. endoreg_db/management/commands/load_active_model_data.py +45 -0
  146. endoreg_db/management/commands/load_ai_model_data.py +79 -0
  147. endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
  148. endoreg_db/management/commands/load_base_db_data.py +178 -0
  149. endoreg_db/management/commands/load_center_data.py +43 -0
  150. endoreg_db/management/commands/load_contraindication_data.py +41 -0
  151. endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
  152. endoreg_db/management/commands/load_disease_classification_data.py +41 -0
  153. endoreg_db/management/commands/load_disease_data.py +62 -0
  154. endoreg_db/management/commands/load_distribution_data.py +66 -0
  155. endoreg_db/management/commands/load_endoscope_data.py +68 -0
  156. endoreg_db/management/commands/load_event_data.py +41 -0
  157. endoreg_db/management/commands/load_examination_data.py +75 -0
  158. endoreg_db/management/commands/load_examination_indication_data.py +65 -0
  159. endoreg_db/management/commands/load_finding_data.py +171 -0
  160. endoreg_db/management/commands/load_g_play_data.py +113 -0
  161. endoreg_db/management/commands/load_gender_data.py +44 -0
  162. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +133 -0
  163. endoreg_db/management/commands/load_information_source.py +45 -0
  164. endoreg_db/management/commands/load_lab_value_data.py +50 -0
  165. endoreg_db/management/commands/load_logging_data.py +39 -0
  166. endoreg_db/management/commands/load_lx_data.py +64 -0
  167. endoreg_db/management/commands/load_medication_data.py +103 -0
  168. endoreg_db/management/commands/load_medication_indication_data.py +63 -0
  169. endoreg_db/management/commands/load_medication_indication_type_data.py +41 -0
  170. endoreg_db/management/commands/load_medication_intake_time_data.py +41 -0
  171. endoreg_db/management/commands/load_medication_schedule_data.py +55 -0
  172. endoreg_db/management/commands/load_name_data.py +37 -0
  173. endoreg_db/management/commands/load_network_data.py +57 -0
  174. endoreg_db/management/commands/load_organ_data.py +43 -0
  175. endoreg_db/management/commands/load_pdf_type_data.py +61 -0
  176. endoreg_db/management/commands/load_profession_data.py +44 -0
  177. endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
  178. endoreg_db/management/commands/load_unit_data.py +46 -0
  179. endoreg_db/management/commands/load_user_groups.py +28 -0
  180. endoreg_db/management/commands/register_ai_model.py +64 -0
  181. endoreg_db/management/commands/reset_celery_schedule.py +9 -0
  182. endoreg_db/migrations/0001_initial.py +2045 -0
  183. endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +23 -0
  184. endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +23 -0
  185. endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +25 -0
  186. endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +33 -0
  187. endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +23 -0
  188. endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +24 -0
  189. endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +48 -0
  190. endoreg_db/migrations/__init__.py +0 -0
  191. endoreg_db/models/__init__.py +376 -0
  192. endoreg_db/models/ai_model/__init__.py +4 -0
  193. endoreg_db/models/ai_model/active_model.py +9 -0
  194. endoreg_db/models/ai_model/ai_model.py +103 -0
  195. endoreg_db/models/ai_model/lightning/__init__.py +3 -0
  196. endoreg_db/models/ai_model/lightning/inference_dataset.py +53 -0
  197. endoreg_db/models/ai_model/lightning/multilabel_classification_net.py +155 -0
  198. endoreg_db/models/ai_model/lightning/postprocess.py +53 -0
  199. endoreg_db/models/ai_model/lightning/predict.py +172 -0
  200. endoreg_db/models/ai_model/lightning/prediction_visualizer.py +55 -0
  201. endoreg_db/models/ai_model/lightning/preprocess.py +68 -0
  202. endoreg_db/models/ai_model/lightning/run_visualizer.py +21 -0
  203. endoreg_db/models/ai_model/model_meta.py +250 -0
  204. endoreg_db/models/ai_model/model_type.py +36 -0
  205. endoreg_db/models/ai_model/utils.py +8 -0
  206. endoreg_db/models/annotation/__init__.py +32 -0
  207. endoreg_db/models/annotation/anonymized_image_annotation.py +115 -0
  208. endoreg_db/models/annotation/binary_classification_annotation_task.py +117 -0
  209. endoreg_db/models/annotation/image_classification.py +86 -0
  210. endoreg_db/models/annotation/video_segmentation_annotation.py +52 -0
  211. endoreg_db/models/annotation/video_segmentation_labelset.py +20 -0
  212. endoreg_db/models/case/__init__.py +1 -0
  213. endoreg_db/models/case/case.py +34 -0
  214. endoreg_db/models/case_template/__init__.py +15 -0
  215. endoreg_db/models/case_template/case_template.py +125 -0
  216. endoreg_db/models/case_template/case_template_rule.py +276 -0
  217. endoreg_db/models/case_template/case_template_rule_value.py +88 -0
  218. endoreg_db/models/case_template/case_template_type.py +28 -0
  219. endoreg_db/models/center/__init__.py +11 -0
  220. endoreg_db/models/center/center.py +51 -0
  221. endoreg_db/models/center/center_product.py +33 -0
  222. endoreg_db/models/center/center_resource.py +33 -0
  223. endoreg_db/models/center/center_waste.py +16 -0
  224. endoreg_db/models/contraindication/__init__.py +21 -0
  225. endoreg_db/models/data_file/__init__.py +39 -0
  226. endoreg_db/models/data_file/base_classes/__init__.py +7 -0
  227. endoreg_db/models/data_file/base_classes/abstract_frame.py +100 -0
  228. endoreg_db/models/data_file/base_classes/abstract_pdf.py +136 -0
  229. endoreg_db/models/data_file/base_classes/abstract_video.py +807 -0
  230. endoreg_db/models/data_file/base_classes/frame_helpers.py +17 -0
  231. endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +19 -0
  232. endoreg_db/models/data_file/base_classes/utils.py +80 -0
  233. endoreg_db/models/data_file/frame.py +29 -0
  234. endoreg_db/models/data_file/import_classes/__init__.py +18 -0
  235. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +35 -0
  236. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -0
  237. endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -0
  238. endoreg_db/models/data_file/import_classes/raw_pdf.py +260 -0
  239. endoreg_db/models/data_file/import_classes/raw_video.py +288 -0
  240. endoreg_db/models/data_file/metadata/__init__.py +13 -0
  241. endoreg_db/models/data_file/metadata/pdf_meta.py +74 -0
  242. endoreg_db/models/data_file/metadata/sensitive_meta.py +290 -0
  243. endoreg_db/models/data_file/metadata/video_meta.py +199 -0
  244. endoreg_db/models/data_file/report_file.py +56 -0
  245. endoreg_db/models/data_file/video/__init__.py +11 -0
  246. endoreg_db/models/data_file/video/import_meta.py +25 -0
  247. endoreg_db/models/data_file/video/video.py +196 -0
  248. endoreg_db/models/data_file/video_segment.py +214 -0
  249. endoreg_db/models/disease.py +79 -0
  250. endoreg_db/models/emission/__init__.py +5 -0
  251. endoreg_db/models/emission/emission_factor.py +85 -0
  252. endoreg_db/models/event.py +73 -0
  253. endoreg_db/models/examination/__init__.py +9 -0
  254. endoreg_db/models/examination/examination.py +67 -0
  255. endoreg_db/models/examination/examination_indication.py +170 -0
  256. endoreg_db/models/examination/examination_time.py +53 -0
  257. endoreg_db/models/examination/examination_time_type.py +48 -0
  258. endoreg_db/models/examination/examination_type.py +40 -0
  259. endoreg_db/models/finding/__init__.py +11 -0
  260. endoreg_db/models/finding/finding.py +75 -0
  261. endoreg_db/models/finding/finding_intervention.py +60 -0
  262. endoreg_db/models/finding/finding_location_classification.py +94 -0
  263. endoreg_db/models/finding/finding_morphology_classification.py +89 -0
  264. endoreg_db/models/finding/finding_type.py +22 -0
  265. endoreg_db/models/hardware/__init__.py +2 -0
  266. endoreg_db/models/hardware/endoscope.py +60 -0
  267. endoreg_db/models/hardware/endoscopy_processor.py +155 -0
  268. endoreg_db/models/information_source.py +29 -0
  269. endoreg_db/models/label/__init__.py +1 -0
  270. endoreg_db/models/label/label.py +112 -0
  271. endoreg_db/models/laboratory/__init__.py +1 -0
  272. endoreg_db/models/laboratory/lab_value.py +111 -0
  273. endoreg_db/models/logging/__init__.py +11 -0
  274. endoreg_db/models/logging/agl_service.py +19 -0
  275. endoreg_db/models/logging/base.py +22 -0
  276. endoreg_db/models/logging/log_type.py +23 -0
  277. endoreg_db/models/logging/network_device.py +27 -0
  278. endoreg_db/models/lx/__init__.py +4 -0
  279. endoreg_db/models/lx/client.py +57 -0
  280. endoreg_db/models/lx/identity.py +34 -0
  281. endoreg_db/models/lx/permission.py +18 -0
  282. endoreg_db/models/lx/user.py +16 -0
  283. endoreg_db/models/medication/__init__.py +19 -0
  284. endoreg_db/models/medication/medication.py +33 -0
  285. endoreg_db/models/medication/medication_indication.py +50 -0
  286. endoreg_db/models/medication/medication_indication_type.py +34 -0
  287. endoreg_db/models/medication/medication_intake_time.py +26 -0
  288. endoreg_db/models/medication/medication_schedule.py +37 -0
  289. endoreg_db/models/network/__init__.py +9 -0
  290. endoreg_db/models/network/agl_service.py +38 -0
  291. endoreg_db/models/network/network_device.py +58 -0
  292. endoreg_db/models/network/network_device_type.py +23 -0
  293. endoreg_db/models/organ/__init__.py +38 -0
  294. endoreg_db/models/other/__init__.py +23 -0
  295. endoreg_db/models/other/distribution/__init__.py +44 -0
  296. endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
  297. endoreg_db/models/other/distribution/date_value_distribution.py +91 -0
  298. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
  299. endoreg_db/models/other/distribution/numeric_value_distribution.py +97 -0
  300. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
  301. endoreg_db/models/other/distribution.py +5 -0
  302. endoreg_db/models/other/material.py +20 -0
  303. endoreg_db/models/other/resource.py +18 -0
  304. endoreg_db/models/other/transport_route.py +22 -0
  305. endoreg_db/models/other/waste.py +20 -0
  306. endoreg_db/models/patient/__init__.py +24 -0
  307. endoreg_db/models/patient/patient_examination.py +182 -0
  308. endoreg_db/models/patient/patient_finding.py +143 -0
  309. endoreg_db/models/patient/patient_finding_intervention.py +26 -0
  310. endoreg_db/models/patient/patient_finding_location.py +120 -0
  311. endoreg_db/models/patient/patient_finding_morphology.py +166 -0
  312. endoreg_db/models/permissions/__init__.py +44 -0
  313. endoreg_db/models/persons/__init__.py +34 -0
  314. endoreg_db/models/persons/examiner/__init__.py +2 -0
  315. endoreg_db/models/persons/examiner/examiner.py +60 -0
  316. endoreg_db/models/persons/examiner/examiner_type.py +2 -0
  317. endoreg_db/models/persons/first_name.py +18 -0
  318. endoreg_db/models/persons/gender.py +22 -0
  319. endoreg_db/models/persons/last_name.py +20 -0
  320. endoreg_db/models/persons/patient/__init__.py +8 -0
  321. endoreg_db/models/persons/patient/patient.py +389 -0
  322. endoreg_db/models/persons/patient/patient_disease.py +22 -0
  323. endoreg_db/models/persons/patient/patient_event.py +52 -0
  324. endoreg_db/models/persons/patient/patient_examination_indication.py +32 -0
  325. endoreg_db/models/persons/patient/patient_lab_sample.py +108 -0
  326. endoreg_db/models/persons/patient/patient_lab_value.py +197 -0
  327. endoreg_db/models/persons/patient/patient_medication.py +59 -0
  328. endoreg_db/models/persons/patient/patient_medication_schedule.py +88 -0
  329. endoreg_db/models/persons/person.py +31 -0
  330. endoreg_db/models/persons/portal_user_information.py +27 -0
  331. endoreg_db/models/prediction/__init__.py +8 -0
  332. endoreg_db/models/prediction/image_classification.py +51 -0
  333. endoreg_db/models/prediction/video_prediction_meta.py +306 -0
  334. endoreg_db/models/product/__init__.py +14 -0
  335. endoreg_db/models/product/product.py +110 -0
  336. endoreg_db/models/product/product_group.py +27 -0
  337. endoreg_db/models/product/product_material.py +28 -0
  338. endoreg_db/models/product/product_weight.py +38 -0
  339. endoreg_db/models/product/reference_product.py +115 -0
  340. endoreg_db/models/questionnaires/__init__.py +114 -0
  341. endoreg_db/models/quiz/__init__.py +9 -0
  342. endoreg_db/models/quiz/quiz_answer.py +41 -0
  343. endoreg_db/models/quiz/quiz_question.py +54 -0
  344. endoreg_db/models/report_reader/__init__.py +7 -0
  345. endoreg_db/models/report_reader/report_reader_config.py +53 -0
  346. endoreg_db/models/report_reader/report_reader_flag.py +20 -0
  347. endoreg_db/models/rules/__init__.py +5 -0
  348. endoreg_db/models/rules/rule.py +24 -0
  349. endoreg_db/models/rules/rule_applicator.py +224 -0
  350. endoreg_db/models/rules/rule_attribute_dtype.py +19 -0
  351. endoreg_db/models/rules/rule_type.py +22 -0
  352. endoreg_db/models/rules/ruleset.py +19 -0
  353. endoreg_db/models/unit.py +22 -0
  354. endoreg_db/queries/__init__.py +5 -0
  355. endoreg_db/queries/annotations/__init__.py +3 -0
  356. endoreg_db/queries/annotations/legacy.py +158 -0
  357. endoreg_db/queries/get/__init__.py +6 -0
  358. endoreg_db/queries/get/annotation.py +0 -0
  359. endoreg_db/queries/get/center.py +42 -0
  360. endoreg_db/queries/get/model.py +13 -0
  361. endoreg_db/queries/get/patient.py +14 -0
  362. endoreg_db/queries/get/patient_examination.py +20 -0
  363. endoreg_db/queries/get/prediction.py +0 -0
  364. endoreg_db/queries/get/report_file.py +33 -0
  365. endoreg_db/queries/get/video.py +31 -0
  366. endoreg_db/queries/get/video_import_meta.py +0 -0
  367. endoreg_db/queries/get/video_prediction_meta.py +0 -0
  368. endoreg_db/queries/sanity/__init_.py +0 -0
  369. endoreg_db/serializers/__init__.py +10 -0
  370. endoreg_db/serializers/ai_model.py +19 -0
  371. endoreg_db/serializers/annotation.py +14 -0
  372. endoreg_db/serializers/center.py +11 -0
  373. endoreg_db/serializers/examination.py +33 -0
  374. endoreg_db/serializers/frame.py +9 -0
  375. endoreg_db/serializers/hardware.py +21 -0
  376. endoreg_db/serializers/label.py +22 -0
  377. endoreg_db/serializers/patient.py +33 -0
  378. endoreg_db/serializers/prediction.py +10 -0
  379. endoreg_db/serializers/raw_video_meta_validation.py +13 -0
  380. endoreg_db/serializers/report_file.py +7 -0
  381. endoreg_db/serializers/video.py +20 -0
  382. endoreg_db/serializers/video_segmentation.py +492 -0
  383. endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
  384. endoreg_db/templates/admin/start_examination.html +12 -0
  385. endoreg_db/templates/timeline.html +176 -0
  386. endoreg_db/utils/__init__.py +36 -0
  387. endoreg_db/utils/cropping.py +29 -0
  388. endoreg_db/utils/dataloader.py +118 -0
  389. endoreg_db/utils/dates.py +39 -0
  390. endoreg_db/utils/file_operations.py +30 -0
  391. endoreg_db/utils/hashs.py +152 -0
  392. endoreg_db/utils/legacy_ocr.py +201 -0
  393. endoreg_db/utils/names.py +74 -0
  394. endoreg_db/utils/ocr.py +190 -0
  395. endoreg_db/utils/parse_and_generate_yaml.py +46 -0
  396. endoreg_db/utils/pydantic_models/__init__.py +6 -0
  397. endoreg_db/utils/pydantic_models/db_config.py +57 -0
  398. endoreg_db/utils/uuid.py +4 -0
  399. endoreg_db/utils/validate_endo_roi.py +19 -0
  400. endoreg_db/utils/validate_subcategory_dict.py +91 -0
  401. endoreg_db/utils/video/__init__.py +13 -0
  402. endoreg_db/utils/video/extract_frames.py +121 -0
  403. endoreg_db/utils/video/transcode_videofile.py +111 -0
  404. endoreg_db/views/__init__.py +2 -0
  405. endoreg_db/views/csrf.py +7 -0
  406. endoreg_db/views/patient_views.py +90 -0
  407. endoreg_db/views/raw_video_meta_validation_views.py +38 -0
  408. endoreg_db/views/report_views.py +96 -0
  409. endoreg_db/views/video_segmentation_views.py +149 -0
  410. endoreg_db/views/views_for_timeline.py +46 -0
  411. {endoreg_db-0.6.0.dist-info → endoreg_db-0.6.2.dist-info}/METADATA +14 -4
  412. endoreg_db-0.6.2.dist-info/RECORD +420 -0
  413. {endoreg_db-0.6.0.dist-info → endoreg_db-0.6.2.dist-info}/WHEEL +1 -2
  414. endoreg_db-0.6.0.dist-info/RECORD +0 -11
  415. endoreg_db-0.6.0.dist-info/top_level.txt +0 -1
  416. {endoreg_db-0.6.0.dist-info → endoreg_db-0.6.2.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,67 @@
1
+ from django.db import models
2
+ from typing import List
3
+
4
+
5
+ class ExaminationManager(models.Manager):
6
+ """
7
+ Manager for Examination with custom query methods.
8
+ """
9
+
10
+ def get_by_natural_key(self, name: str) -> "Examination":
11
+ return self.get(name=name)
12
+
13
+
14
+ class Examination(models.Model):
15
+ """
16
+ Represents an examination with associated details.
17
+
18
+ Attributes:
19
+ name (str): The unique name of the examination.
20
+ name_de (str): The German name of the examination.
21
+ name_en (str): The English name of the examination.
22
+ examination_types (ManyToManyField): The types associated with the examination.
23
+ date (DateField): The date of the examination.
24
+ time (TimeField): The time of the examination.
25
+ """
26
+
27
+ name = models.CharField(max_length=100, unique=True)
28
+ name_de = models.CharField(max_length=100, blank=True, null=True)
29
+ name_en = models.CharField(max_length=100, blank=True, null=True)
30
+ examination_types = models.ManyToManyField("ExaminationType", blank=True)
31
+
32
+ objects = ExaminationManager()
33
+
34
+ def __str__(self) -> str:
35
+ """
36
+ String representation of the examination.
37
+
38
+ Returns:
39
+ str: The name of the examination.
40
+ """
41
+ return self.name
42
+
43
+ def natural_key(self) -> tuple:
44
+ """
45
+ Returns the natural key for the examination.
46
+
47
+ Returns:
48
+ tuple: The natural key consisting of the name.
49
+ """
50
+ return (self.name,)
51
+
52
+ def get_available_findings(self) -> List["Finding"]:
53
+ """
54
+ Retrieves all findings associated with the examination.
55
+
56
+ Returns:
57
+ list: A list of findings related to the examination.
58
+ """
59
+ from endoreg_db.models import Finding
60
+
61
+ findings: List[Finding] = [_ for _ in self.findings.all()]
62
+ return findings
63
+
64
+ class Meta:
65
+ verbose_name = "Examination"
66
+ verbose_name_plural = "Examinations"
67
+ ordering = ["name"]
@@ -0,0 +1,170 @@
1
+ from django.db import models
2
+ from typing import List
3
+
4
+ class ExaminationIndicationManager(models.Manager):
5
+ """
6
+ Manager for ExaminationIndication with custom query methods.
7
+ """
8
+ def get_by_natural_key(self, name: str) -> "ExaminationIndication":
9
+ return self.get(name=name)
10
+
11
+ class ExaminationIndication(models.Model):
12
+ """
13
+ Represents an indication for an examination.
14
+
15
+ Attributes:
16
+ name (str): The unique name of the indication.
17
+ name_de (str): The German name of the indication.
18
+ name_en (str): The English name of the indication.
19
+ classification (ForeignKey): The classification associated with the indication.
20
+ examination (ForeignKey): The examination associated with the indication.
21
+ """
22
+ name = models.CharField(max_length=255, unique=True)
23
+ name_de = models.CharField(max_length=255, blank=True, null=True)
24
+ name_en = models.CharField(max_length=255, blank=True, null=True)
25
+ classification = models.ForeignKey(
26
+ 'ExaminationIndicationClassification', on_delete=models.CASCADE,
27
+ related_name='indications',
28
+ blank=True, null=True
29
+ )
30
+ examination = models.ForeignKey(
31
+ 'Examination', on_delete=models.CASCADE,
32
+ related_name='indications',
33
+ )
34
+
35
+ objects = ExaminationIndicationManager()
36
+
37
+ def natural_key(self) -> tuple:
38
+ """
39
+ Returns the natural key for the indication.
40
+
41
+ Returns:
42
+ tuple: The natural key consisting of the name.
43
+ """
44
+ return (self.name,)
45
+
46
+ def __str__(self) -> str:
47
+ """
48
+ String representation of the indication.
49
+
50
+ Returns:
51
+ str: The name of the indication.
52
+ """
53
+ return self.name
54
+
55
+ def get_choices(self) -> List['ExaminationIndicationClassificationChoice']:
56
+ """
57
+ Retrieves all choices associated with the classification.
58
+
59
+ Returns:
60
+ list: A list of classification choices.
61
+ """
62
+ return list(self.classification.choices.all()) if self.classification else []
63
+
64
+ def get_examination(self) -> 'Examination':
65
+ """
66
+ Retrieves the associated examination.
67
+
68
+ Returns:
69
+ Examination: The associated examination.
70
+ """
71
+ return self.examination
72
+
73
+ class ExaminationIndicationClassificationManager(models.Manager):
74
+ """
75
+ Manager for ExaminationIndicationClassification with custom query methods.
76
+ """
77
+ def get_by_natural_key(self, name: str) -> "ExaminationIndicationClassification":
78
+ return self.get(name=name)
79
+
80
+ class ExaminationIndicationClassification(models.Model):
81
+ """
82
+ Represents a classification for examination indications.
83
+
84
+ Attributes:
85
+ name (str): The unique name of the classification.
86
+ name_de (str): The German name of the classification.
87
+ name_en (str): The English name of the classification.
88
+ """
89
+ name = models.CharField(max_length=255, unique=True)
90
+ name_de = models.CharField(max_length=255, blank=True, null=True)
91
+ name_en = models.CharField(max_length=255, blank=True, null=True)
92
+
93
+
94
+ objects = ExaminationIndicationClassificationManager()
95
+
96
+ def natural_key(self) -> tuple:
97
+ """
98
+ Returns the natural key for the classification.
99
+
100
+ Returns:
101
+ tuple: The natural key consisting of the name.
102
+ """
103
+ return (self.name,)
104
+
105
+ def __str__(self) -> str:
106
+ """
107
+ String representation of the classification.
108
+
109
+ Returns:
110
+ str: The name of the classification.
111
+ """
112
+ return self.name
113
+
114
+ def get_choices(self) -> List['ExaminationIndicationClassificationChoice']:
115
+ """
116
+ Retrieves all choices associated with this classification.
117
+
118
+ Returns:
119
+ list: A list of classification choices.
120
+ """
121
+ return list(self.choices.all())
122
+
123
+ class ExaminationIndicationClassificationChoiceManager(models.Manager):
124
+ """
125
+ Manager for ExaminationIndicationClassificationChoice with custom query methods.
126
+ """
127
+ def get_by_natural_key(self, name: str) -> "ExaminationIndicationClassificationChoice":
128
+ return self.get(name=name)
129
+
130
+ class ExaminationIndicationClassificationChoice(models.Model):
131
+ """
132
+ Represents a choice within an examination indication classification.
133
+
134
+ Attributes:
135
+ name (str): The unique name of the choice.
136
+ name_de (str): The German name of the choice.
137
+ name_en (str): The English name of the choice.
138
+ subcategories (JSONField): Subcategories associated with the choice.
139
+ numerical_descriptors (JSONField): Numerical descriptors for the choice.
140
+ classification (ForeignKey): The classification to which this choice belongs.
141
+ """
142
+ name = models.CharField(max_length=255, unique=True)
143
+ name_de = models.CharField(max_length=255, blank=True, null=True)
144
+ name_en = models.CharField(max_length=255, blank=True, null=True)
145
+ subcategories = models.JSONField(default=dict)
146
+ numerical_descriptors = models.JSONField(default=dict)
147
+ classification = models.ForeignKey(
148
+ ExaminationIndicationClassification, on_delete=models.CASCADE,
149
+ related_name='choices'
150
+ )
151
+
152
+ objects = ExaminationIndicationClassificationChoiceManager()
153
+
154
+ def natural_key(self) -> tuple:
155
+ """
156
+ Returns the natural key for the classification choice.
157
+
158
+ Returns:
159
+ tuple: The natural key consisting of the name.
160
+ """
161
+ return (self.name,)
162
+
163
+ def __str__(self) -> str:
164
+ """
165
+ String representation of the classification choice.
166
+
167
+ Returns:
168
+ str: The name of the classification choice.
169
+ """
170
+ return self.name
@@ -0,0 +1,53 @@
1
+ from django.db import models
2
+ from rest_framework import serializers
3
+
4
+ class ExaminationTimeManager(models.Manager):
5
+ """
6
+ Manager for ExaminationTime with custom query methods.
7
+ """
8
+ def get_by_natural_key(self, name: str) -> "ExaminationTime":
9
+ return self.get(name=name)
10
+
11
+ class ExaminationTime(models.Model):
12
+ """
13
+ Represents a specific time configuration for examinations.
14
+
15
+ Attributes:
16
+ name (str): The unique name of the examination time.
17
+ name_de (str): The German name of the examination time.
18
+ name_en (str): The English name of the examination time.
19
+ start_time (TimeField): The starting time for the examination.
20
+ end_time (TimeField): The ending time for the examination.
21
+ time_types (ManyToManyField): The types associated with this examination time.
22
+ """
23
+ name = models.CharField(max_length=100, unique=True)
24
+ name_de = models.CharField(max_length=100, blank=True, null=True)
25
+ name_en = models.CharField(max_length=100, blank=True, null=True)
26
+ start_time = models.TimeField(blank=True, null=True)
27
+ time_types = models.ManyToManyField('ExaminationTimeType', blank=True)
28
+ end_time = models.TimeField(blank=True, null=True)
29
+ objects = ExaminationTimeManager()
30
+
31
+ def __str__(self) -> str:
32
+ """
33
+ String representation of the examination time.
34
+
35
+ Returns:
36
+ str: The name of the examination time.
37
+ """
38
+ return self.name
39
+
40
+ def natural_key(self) -> tuple:
41
+ """
42
+ Returns the natural key for the examination time.
43
+
44
+ Returns:
45
+ tuple: The natural key consisting of the name.
46
+ """
47
+ return (self.name,)
48
+
49
+ class Meta:
50
+ verbose_name = 'Examination Time'
51
+ verbose_name_plural = 'Examination Times'
52
+ ordering = ['name']
53
+
@@ -0,0 +1,48 @@
1
+ from django.db import models
2
+
3
+ class ExaminationTimeTypeManager(models.Manager):
4
+ """
5
+ Manager for ExaminationTimeType with custom query methods.
6
+ """
7
+ def get_by_natural_key(self, name: str) -> "ExaminationTimeType":
8
+ return self.get(name=name)
9
+
10
+ class ExaminationTimeType(models.Model):
11
+ """
12
+ Represents a type of examination time.
13
+
14
+ Attributes:
15
+ name (str): The unique name of the examination time type.
16
+ name_de (str): The German name of the examination time type.
17
+ name_en (str): The English name of the examination time type.
18
+ examinations: The examinations associated with this type.
19
+ """
20
+ objects = ExaminationTimeTypeManager()
21
+ name = models.CharField(max_length=100, unique=True)
22
+ name_de = models.CharField(max_length=100, blank=True, null=True)
23
+ name_en = models.CharField(max_length=100, blank=True, null=True)
24
+ examinations = models.ManyToManyField('Examination', blank=True)
25
+
26
+ def __str__(self) -> str:
27
+ """
28
+ String representation of the examination time type.
29
+
30
+ Returns:
31
+ str: The name of the examination time type.
32
+ """
33
+ return self.name
34
+
35
+ def natural_key(self) -> tuple:
36
+ """
37
+ Returns the natural key for the examination time type.
38
+
39
+ Returns:
40
+ tuple: The natural key consisting of the name.
41
+ """
42
+ return (self.name,)
43
+
44
+ class Meta:
45
+ verbose_name = 'Examination Time Type'
46
+ verbose_name_plural = 'Examination Time Types'
47
+ ordering = ['name']
48
+
@@ -0,0 +1,40 @@
1
+ from django.db import models
2
+
3
+ class ExaminationTypeManager(models.Manager):
4
+ """
5
+ Manager for ExaminationType with custom query methods.
6
+ """
7
+ def get_by_natural_key(self, name: str) -> "ExaminationType":
8
+ return self.get(name=name)
9
+
10
+ class ExaminationType(models.Model):
11
+ """
12
+ Represents a type of examination.
13
+
14
+ Attributes:
15
+ name (str): The unique name of the examination type.
16
+ name_de (str): The German name of the examination type.
17
+ name_en (str): The English name of the examination type.
18
+ """
19
+ objects = ExaminationTypeManager()
20
+ name = models.CharField(max_length=100, unique=True)
21
+ name_de = models.CharField(max_length=100, blank=True, null=True)
22
+ name_en = models.CharField(max_length=100, blank=True, null=True)
23
+
24
+ def __str__(self) -> str:
25
+ """
26
+ String representation of the examination type.
27
+
28
+ Returns:
29
+ str: The name of the examination type.
30
+ """
31
+ return self.name_en or self.name
32
+
33
+ def natural_key(self) -> tuple:
34
+ """
35
+ Returns the natural key for the examination type.
36
+
37
+ Returns:
38
+ tuple: The natural key consisting of the name.
39
+ """
40
+ return (self.name,)
@@ -0,0 +1,11 @@
1
+ from .finding import Finding
2
+ from .finding_type import FindingType
3
+ from .finding_location_classification import (
4
+ FindingLocationClassification, FindingLocationClassificationChoice
5
+ )
6
+ from .finding_morphology_classification import (
7
+ FindingMorphologyClassificationType, FindingMorphologyClassificationChoice,
8
+ FindingMorphologyClassification
9
+ )
10
+
11
+ from .finding_intervention import FindingIntervention, FindingInterventionType
@@ -0,0 +1,75 @@
1
+ # Class to represent findings of examinations
2
+ from django.db import models
3
+ from typing import List
4
+
5
+ class FindingManager(models.Manager):
6
+ def get_by_natural_key(self, name):
7
+ return self.get(name=name)
8
+
9
+ class Finding(models.Model):
10
+ name = models.CharField(max_length=100, unique=True)
11
+ name_de = models.CharField(max_length=100, blank=True, null=True)
12
+ name_en = models.CharField(max_length=100, blank=True, null=True)
13
+ description = models.TextField(blank=True, null=True)
14
+ description_de = models.TextField(blank=True, null=True)
15
+ description_en = models.TextField(blank=True, null=True)
16
+ examinations = models.ManyToManyField('Examination', blank=True, related_name='findings')
17
+ finding_types = models.ManyToManyField('FindingType', blank=True, related_name='findings')
18
+
19
+ finding_interventions = models.ManyToManyField(
20
+ 'FindingIntervention',
21
+ blank=True,
22
+ related_name='findings'
23
+ )
24
+
25
+ causing_finding_interventions = models.ManyToManyField(
26
+ 'FindingIntervention',
27
+ blank=True,
28
+ related_name='causing_findings'
29
+ )
30
+
31
+ opt_causing_finding_interventions = models.ManyToManyField(
32
+ 'FindingIntervention',
33
+ blank=True,
34
+ related_name='opt_causing_findings'
35
+ )
36
+
37
+ required_morphology_classification_types = models.ManyToManyField(
38
+ 'FindingMorphologyClassificationType',
39
+ blank=True,
40
+ related_name='required_by_findings'
41
+ )
42
+
43
+ optional_morphology_classification_types = models.ManyToManyField(
44
+ 'FindingMorphologyClassificationType',
45
+ blank=True,
46
+ related_name='optional_for_findings'
47
+ )
48
+
49
+ objects = FindingManager()
50
+
51
+ def natural_key(self):
52
+ return (self.name,)
53
+
54
+ def __str__(self):
55
+ return self.name
56
+
57
+ def get_finding_types(self):
58
+ return self.finding_types.all()
59
+
60
+ def get_location_classifications(self):
61
+ from endoreg_db.models import FindingLocationClassification
62
+ # FindingLocationClassification is a class with a many-to-many relationship to Finding
63
+ # related name is location_classifications
64
+
65
+ location_classifications:FindingLocationClassification = self.location_classifications.all()
66
+
67
+ return location_classifications
68
+
69
+ def get_required_morphology_classification_types(self):
70
+ from endoreg_db.models import FindingMorphologyClassificationType
71
+ finding_morphology_classification_types:List[FindingMorphologyClassificationType] = [
72
+ _ for _ in self.required_morphology_classification_types.all()
73
+ ]
74
+ return finding_morphology_classification_types
75
+
@@ -0,0 +1,60 @@
1
+ from django.db import models
2
+
3
+ class FindingInterventionManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ class FindingIntervention(models.Model):
8
+ name = models.CharField(max_length=100, unique=True)
9
+ name_de = models.CharField(max_length=100, blank=True, null=True)
10
+ name_en = models.CharField(max_length=100, blank=True, null=True)
11
+ description = models.TextField(blank=True, null=True)
12
+ description_de = models.TextField(blank=True, null=True)
13
+ description_en = models.TextField(blank=True, null=True)
14
+
15
+ intervention_types = models.ManyToManyField(
16
+ 'FindingInterventionType',
17
+ blank=True,
18
+ related_name='interventions'
19
+ )
20
+
21
+ required_lab_values = models.ManyToManyField(
22
+ 'LabValue',
23
+ blank=True,
24
+ related_name='required_by_finding_interventions'
25
+ )
26
+
27
+ contraindications = models.ManyToManyField(
28
+ 'Contraindication',
29
+ blank=True,
30
+ related_name='contraindicating_finding_interventions'
31
+ )
32
+
33
+ objects = FindingInterventionManager()
34
+
35
+ def natural_key(self):
36
+ return (self.name,)
37
+
38
+ def __str__(self):
39
+ return self.name
40
+
41
+
42
+ class FindingInterventionTypeManager(models.Manager):
43
+ def get_by_natural_key(self, name):
44
+ return self.get(name=name)
45
+
46
+ class FindingInterventionType(models.Model):
47
+ name = models.CharField(max_length=100, unique=True)
48
+ name_de = models.CharField(max_length=100, blank=True, null=True)
49
+ name_en = models.CharField(max_length=100, blank=True, null=True)
50
+ description = models.TextField(blank=True, null=True)
51
+ description_de = models.TextField(blank=True, null=True)
52
+ description_en = models.TextField(blank=True, null=True)
53
+
54
+ objects = FindingInterventionTypeManager()
55
+
56
+ def natural_key(self):
57
+ return (self.name,)
58
+
59
+ def __str__(self):
60
+ return self.name
@@ -0,0 +1,94 @@
1
+ from django.db import models
2
+ from typing import List
3
+ # Class to represent the LocationClassifications of a Finding
4
+
5
+ class FindingLocationClassificationManager(models.Manager):
6
+ def get_by_natural_key(self, name):
7
+ return self.get(name=name)
8
+
9
+ class FindingLocationClassification(models.Model):
10
+ name = models.CharField(max_length=100, unique=True)
11
+ name_de = models.CharField(max_length=100, blank=True, null=True)
12
+ name_en = models.CharField(max_length=100, blank=True, null=True)
13
+ description = models.TextField(blank=True, null=True)
14
+ description_de = models.TextField(blank=True, null=True)
15
+ description_en = models.TextField(blank=True, null=True)
16
+
17
+ # Many to many relationships:
18
+ findings = models.ManyToManyField('Finding', blank=True, related_name='location_classifications')
19
+ examinations = models.ManyToManyField('Examination', blank=True, related_name='location_classifications')
20
+ finding_types = models.ManyToManyField('FindingType', blank=True, related_name='location_classifications')
21
+ choices = models.ManyToManyField('FindingLocationClassificationChoice', blank=True, related_name='location_classifications')
22
+
23
+ objects = FindingLocationClassificationManager()
24
+
25
+ def natural_key(self):
26
+ return (self.name,)
27
+
28
+ def __str__(self):
29
+ return self.name
30
+
31
+ def get_available_findings(self):
32
+ from endoreg_db.models import Finding
33
+ available_findings:List[Finding] = [_ for _ in self.findings.all()]
34
+ return available_findings
35
+
36
+ def remove_unavailable_findings(
37
+ self,
38
+ findings
39
+ ):
40
+ """
41
+ Returns a list of findings that are in the input list but not available for this location classification.
42
+ """
43
+ from endoreg_db.models import Finding
44
+ for _ in findings:
45
+ assert isinstance(_, Finding)
46
+ available_findings:List['Finding'] = self.get_available_findings()
47
+ available_finding_names = [
48
+ finding.name for finding in available_findings
49
+ ]
50
+
51
+ filtered_findings = []
52
+
53
+ for finding in findings:
54
+ if finding.name in available_finding_names:
55
+ filtered_findings.append(finding)
56
+
57
+ return filtered_findings
58
+
59
+ def get_choices(self):
60
+ return self.choices.all()
61
+
62
+ class FindingLocationClassificationChoiceManager(models.Manager):
63
+ def get_by_natural_key(self, name):
64
+ return self.get(name=name)
65
+
66
+ class FindingLocationClassificationChoice(models.Model):
67
+ name = models.CharField(max_length=100, unique=True)
68
+ name_de = models.CharField(max_length=100, blank=True, null=True)
69
+ name_en = models.CharField(max_length=100, blank=True, null=True)
70
+ description = models.TextField(blank=True, null=True)
71
+ description_de = models.TextField(blank=True, null=True)
72
+ description_en = models.TextField(blank=True, null=True)
73
+
74
+ # Foreign key relationships: # migrated to organs
75
+ # organs = models.ManyToManyField('Organ', blank=True, related_name='location_choices')
76
+
77
+ # Optional Descriptors:
78
+ # subcategories_str is a List of strings with names of categorical descriptors
79
+ subcategories = models.JSONField(blank=True, null=True)
80
+ numerical_descriptors = models.JSONField(blank=True, null=True)
81
+
82
+ objects = FindingLocationClassificationChoiceManager()
83
+
84
+ def natural_key(self):
85
+ return (self.name,)
86
+
87
+ def __str__(self):
88
+ return self.name
89
+
90
+ def get_subcategories(self)->dict:
91
+ return self.subcategories
92
+
93
+ def get_numerical_descriptors(self)->dict:
94
+ return self.numerical_descriptors