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,89 @@
1
+ from django.db import models
2
+ from typing import List
3
+
4
+ class FindingMorphologyClassificationTypeManager(models.Manager):
5
+ def get_by_natural_key(self, name):
6
+ return self.get(name=name)
7
+
8
+ class FindingMorphologyClassificationType(models.Model):
9
+ name = models.CharField(max_length=255, unique=True)
10
+ name_de = models.CharField(max_length=255, blank=True)
11
+ name_en = models.CharField(max_length=255, blank=True)
12
+ description = models.TextField(blank=True)
13
+
14
+ objects = FindingMorphologyClassificationTypeManager()
15
+
16
+ def natural_key(self):
17
+ return (self.name,)
18
+
19
+ def __str__(self):
20
+ return self.name
21
+
22
+ @classmethod
23
+ def get_required_classifications_for_finding(cls, finding):
24
+ """
25
+ Returns all required morphology classification types for a given finding.
26
+ """
27
+ from endoreg_db.models import FindingMorphologyClassificationType
28
+ required_classification_types:List[FindingMorphologyClassificationType] = [
29
+ _ for _ in finding.required_morphology_classification_types.all()
30
+ ]
31
+ return required_classification_types
32
+
33
+ class FindingMorphologyClassificationManager(models.Manager):
34
+ def get_by_natural_key(self, name):
35
+ return self.get(name=name)
36
+
37
+ class FindingMorphologyClassification(models.Model):
38
+ name = models.CharField(max_length=255, unique=True)
39
+ name_de = models.CharField(max_length=255, blank=True)
40
+ name_en = models.CharField(max_length=255, blank=True)
41
+ description = models.TextField(blank=True)
42
+ classification_type = models.ForeignKey(FindingMorphologyClassificationType, on_delete=models.CASCADE)
43
+
44
+ objects = FindingMorphologyClassificationManager()
45
+
46
+ def natural_key(self):
47
+ return (self.name,)
48
+
49
+ def __str__(self):
50
+ return self.name
51
+
52
+ def get_choices(self):
53
+ choices: List[FindingMorphologyClassificationChoice] = [_ for _ in self.choices.all()]
54
+ return choices
55
+
56
+ class FindingMorphologyClassificationChoiceManager(models.Manager):
57
+ def get_by_natural_key(self, name):
58
+ return self.get(name=name)
59
+
60
+ class FindingMorphologyClassificationChoice(models.Model):
61
+ name = models.CharField(max_length=255, unique=True)
62
+ name_de = models.CharField(max_length=255, blank=True)
63
+ name_en = models.CharField(max_length=255, blank=True)
64
+ description = models.TextField(blank=True)
65
+ classification = models.ForeignKey(
66
+ FindingMorphologyClassification,
67
+ on_delete=models.CASCADE,
68
+ related_name='choices'
69
+ )
70
+
71
+ subcategories = models.JSONField(
72
+ default = dict
73
+ )
74
+
75
+ numerical_descriptors = models.JSONField(
76
+ default = dict
77
+ )
78
+
79
+ objects = FindingMorphologyClassificationChoiceManager()
80
+
81
+ def natural_key(self):
82
+ return (self.name,)
83
+
84
+ def __str__(self):
85
+ _str = f"{self.name} ({self.classification})"
86
+ return _str
87
+
88
+
89
+
@@ -0,0 +1,22 @@
1
+ from django.db import models
2
+
3
+
4
+ class FindingTypeManager(models.Manager):
5
+ def get_by_natural_key(self, name):
6
+ return self.get(name=name)
7
+
8
+ class FindingType(models.Model):
9
+ name = models.CharField(max_length=100, unique=True)
10
+ name_de = models.CharField(max_length=100, blank=True, null=True)
11
+ name_en = models.CharField(max_length=100, blank=True, null=True)
12
+ description = models.TextField(blank=True, null=True)
13
+ description_de = models.TextField(blank=True, null=True)
14
+ description_en = models.TextField(blank=True, null=True)
15
+
16
+ objects = FindingTypeManager()
17
+
18
+ def natural_key(self):
19
+ return (self.name,)
20
+
21
+ def __str__(self):
22
+ return self.name
@@ -0,0 +1,2 @@
1
+ from .endoscopy_processor import EndoscopyProcessor
2
+ from .endoscope import Endoscope, EndoscopeType
@@ -0,0 +1,60 @@
1
+ from django.db import models
2
+
3
+ class EndoscopeManager(models.Manager):
4
+ def get_by_natural_key(self, name, sn):
5
+ return self.get(name=name, sn=sn)
6
+
7
+ class Endoscope(models.Model):
8
+ objects = EndoscopeManager()
9
+
10
+ name = models.CharField(max_length=255)
11
+ name_de = models.CharField(max_length=255, blank=True, null=True)
12
+ name_en = models.CharField(max_length=255, blank=True, null=True)
13
+ sn = models.CharField(max_length=255)
14
+ center = models.ForeignKey(
15
+ 'Center',
16
+ blank=True,
17
+ null=True,
18
+ on_delete=models.CASCADE,
19
+ related_name='endoscopes'
20
+ )
21
+ endoscope_type = models.ForeignKey(
22
+ 'EndoscopeType',
23
+ blank=True,
24
+ null=True,
25
+ on_delete=models.CASCADE,
26
+ related_name='endoscopes'
27
+ )
28
+
29
+ def natural_key(self):
30
+ return (self.name, self.sn)
31
+
32
+ def __str__(self):
33
+ return self.name
34
+
35
+ class Meta:
36
+ ordering = ['name']
37
+ verbose_name = 'Endoscope'
38
+ verbose_name_plural = 'Endoscopes'
39
+
40
+ class EndoscopeTypeManager(models.Manager):
41
+ def get_by_natural_key(self, name):
42
+ return self.get(name=name)
43
+
44
+ class EndoscopeType(models.Model):
45
+ objects = EndoscopeTypeManager()
46
+
47
+ name = models.CharField(max_length=255)
48
+ name_de = models.CharField(max_length=255, blank=True, null=True)
49
+ name_en = models.CharField(max_length=255, blank=True, null=True)
50
+
51
+ def natural_key(self):
52
+ return (self.name,)
53
+
54
+ def __str__(self):
55
+ return self.name
56
+
57
+ class Meta:
58
+ ordering = ['name']
59
+ verbose_name = 'Endoscope Type'
60
+ verbose_name_plural = 'Endoscope Types'
@@ -0,0 +1,155 @@
1
+ from django.db import models
2
+
3
+
4
+ class EndoscopyProcessorManager(models.Manager):
5
+ def get_by_natural_key(self, name):
6
+ return self.get(name=name)
7
+
8
+
9
+ class EndoscopyProcessor(models.Model):
10
+ objects = EndoscopyProcessorManager()
11
+
12
+ centers = models.ManyToManyField(
13
+ "Center",
14
+ blank=True,
15
+ related_name="endoscopy_processors",
16
+ )
17
+
18
+ name = models.CharField(max_length=255)
19
+ image_width = models.IntegerField()
20
+ image_height = models.IntegerField()
21
+ # image_fps = models.IntegerField()
22
+
23
+ # Roi for endoscope image
24
+ endoscope_image_x = models.IntegerField()
25
+ endoscope_image_y = models.IntegerField()
26
+ endoscope_image_width = models.IntegerField()
27
+ endoscope_image_height = models.IntegerField()
28
+
29
+ # Roi for examination date
30
+ examination_date_x = models.IntegerField()
31
+ examination_date_y = models.IntegerField()
32
+ examination_date_width = models.IntegerField()
33
+ examination_date_height = models.IntegerField()
34
+
35
+ # Roi for examination time
36
+ examination_time_x = models.IntegerField(blank=True, null=True)
37
+ examination_time_y = models.IntegerField(blank=True, null=True)
38
+ examination_time_width = models.IntegerField(blank=True, null=True)
39
+ examination_time_height = models.IntegerField(blank=True, null=True)
40
+
41
+ # Roi for patient first name
42
+ patient_first_name_x = models.IntegerField()
43
+ patient_first_name_y = models.IntegerField()
44
+ patient_first_name_width = models.IntegerField()
45
+ patient_first_name_height = models.IntegerField()
46
+
47
+ # Roi for patient name
48
+ patient_last_name_x = models.IntegerField()
49
+ patient_last_name_y = models.IntegerField()
50
+ patient_last_name_width = models.IntegerField()
51
+ patient_last_name_height = models.IntegerField()
52
+
53
+ # Roi for patient dob
54
+ patient_dob_x = models.IntegerField()
55
+ patient_dob_y = models.IntegerField()
56
+ patient_dob_width = models.IntegerField()
57
+ patient_dob_height = models.IntegerField()
58
+
59
+ # Roi for endoscope type
60
+ endoscope_type_x = models.IntegerField(blank=True, null=True)
61
+ endoscope_type_y = models.IntegerField(blank=True, null=True)
62
+ endoscope_type_width = models.IntegerField(blank=True, null=True)
63
+ endoscope_type_height = models.IntegerField(blank=True, null=True)
64
+
65
+ # Roi for endoscopy sn
66
+ endoscope_sn_x = models.IntegerField(blank=True, null=True)
67
+ endoscope_sn_y = models.IntegerField(blank=True, null=True)
68
+ endoscope_sn_width = models.IntegerField(blank=True, null=True)
69
+ endoscope_sn_height = models.IntegerField(blank=True, null=True)
70
+
71
+ def natural_key(self):
72
+ return (self.name,)
73
+
74
+ @classmethod
75
+ def get_by_name(self, name):
76
+ return self.objects.get(name=name)
77
+
78
+ def __str__(self):
79
+ return self.name
80
+
81
+ def get_roi_endoscope_image(self):
82
+ return {
83
+ "x": self.endoscope_image_x,
84
+ "y": self.endoscope_image_y,
85
+ "width": self.endoscope_image_width,
86
+ "height": self.endoscope_image_height,
87
+ }
88
+
89
+ def get_roi_examination_date(self):
90
+ return {
91
+ "x": self.examination_date_x,
92
+ "y": self.examination_date_y,
93
+ "width": self.examination_date_width,
94
+ "height": self.examination_date_height,
95
+ }
96
+
97
+ def get_roi_examination_time(self):
98
+ return {
99
+ "x": self.examination_time_x,
100
+ "y": self.examination_time_y,
101
+ "width": self.examination_time_width,
102
+ "height": self.examination_time_height,
103
+ }
104
+
105
+ def get_roi_patient_last_name(self):
106
+ return {
107
+ "x": self.patient_last_name_x,
108
+ "y": self.patient_last_name_y,
109
+ "width": self.patient_last_name_width,
110
+ "height": self.patient_last_name_height,
111
+ }
112
+
113
+ def get_roi_patient_first_name(self):
114
+ return {
115
+ "x": self.patient_first_name_x,
116
+ "y": self.patient_first_name_y,
117
+ "width": self.patient_first_name_width,
118
+ "height": self.patient_first_name_height,
119
+ }
120
+
121
+ def get_roi_patient_dob(self):
122
+ return {
123
+ "x": self.patient_dob_x,
124
+ "y": self.patient_dob_y,
125
+ "width": self.patient_dob_width,
126
+ "height": self.patient_dob_height,
127
+ }
128
+
129
+ def get_roi_endoscope_type(self):
130
+ return {
131
+ "x": self.endoscope_type_x,
132
+ "y": self.endoscope_type_y,
133
+ "width": self.endoscope_type_width,
134
+ "height": self.endoscope_type_height,
135
+ }
136
+
137
+ def get_roi_endoscopy_sn(self):
138
+ return {
139
+ "x": self.endoscope_sn_x,
140
+ "y": self.endoscope_sn_y,
141
+ "width": self.endoscope_sn_width,
142
+ "height": self.endoscope_sn_height,
143
+ }
144
+
145
+ def get_rois(self):
146
+ return {
147
+ "endoscope_image": self.get_roi_endoscope_image(),
148
+ "examination_date": self.get_roi_examination_date(),
149
+ "examination_time": self.get_roi_examination_time(),
150
+ "patient_first_name": self.get_roi_patient_first_name(),
151
+ "patient_last_name": self.get_roi_patient_last_name(),
152
+ "patient_dob": self.get_roi_patient_dob(),
153
+ "endoscope_type": self.get_roi_endoscope_type(),
154
+ "endoscope_sn": self.get_roi_endoscopy_sn(),
155
+ }
@@ -0,0 +1,29 @@
1
+ from django.db import models
2
+
3
+ def get_prediction_information_source():
4
+ _source = InformationSource.objects.get(name="prediction")
5
+
6
+ # make sure to return only one object
7
+ assert _source, "No prediction information source found"
8
+ return _source
9
+
10
+ class InformationSourceManager(models.Manager):
11
+ def get_by_natural_key(self, name):
12
+ return self.get(name=name)
13
+
14
+ class InformationSource(models.Model):
15
+ objects = InformationSourceManager()
16
+
17
+ name = models.CharField(max_length=100)
18
+ name_de = models.CharField(max_length=100, blank=True, null=True)
19
+ name_en = models.CharField(max_length=100, blank=True, null=True)
20
+
21
+ url = models.URLField(blank=True, null=True)
22
+ description = models.TextField(blank=True, null=True)
23
+ date = models.DateField(blank=True, null=True)
24
+
25
+ def natural_key(self):
26
+ return (self.name,)
27
+
28
+ def __str__(self):
29
+ return self.name
@@ -0,0 +1 @@
1
+ from .label import Label, LabelType, LabelSet
@@ -0,0 +1,112 @@
1
+ from django.db import models
2
+
3
+
4
+ class LabelTypeManager(models.Manager):
5
+ def get_by_natural_key(self, name):
6
+ return self.get(name=name)
7
+
8
+
9
+ class LabelType(models.Model):
10
+ """
11
+ A class representing a label type.
12
+
13
+ Attributes:
14
+ name (str): The name of the label type.
15
+ description (str): A description of the label type.
16
+
17
+ """
18
+
19
+ name = models.CharField(max_length=255)
20
+ description = models.TextField(blank=True, null=True)
21
+
22
+ objects = LabelTypeManager()
23
+
24
+ def natural_key(self):
25
+ """Return the natural key of this label type"""
26
+ return (self.name,)
27
+
28
+ def __str__(self):
29
+ return str(self.name)
30
+
31
+
32
+ class LabelManager(models.Manager):
33
+ """Manager class for handling Label model operations."""
34
+
35
+ def get_by_natural_key(self, name):
36
+ """Retrieves a Label instance by its natural key (name)."""
37
+ return self.get(name=name)
38
+
39
+
40
+ class Label(models.Model):
41
+ """
42
+ A class representing a label.
43
+
44
+ Attributes:
45
+ name (str): The name of the label.
46
+ label_type (LabelType): The type of the label.
47
+ description (str): A description of the label.
48
+
49
+ """
50
+
51
+ name = models.CharField(max_length=255)
52
+ label_type = models.ForeignKey(
53
+ "LabelType", on_delete=models.CASCADE, related_name="labels"
54
+ )
55
+ description = models.TextField(blank=True, null=True)
56
+
57
+ objects = LabelManager()
58
+
59
+ def natural_key(self):
60
+ """Return the natural key of this label"""
61
+ return (self.name,)
62
+
63
+ def __str__(self):
64
+ return str(self.name)
65
+
66
+
67
+ class LabelSetManager(models.Manager):
68
+ """
69
+ Manager class for handling LabelSet model operations.
70
+ Methods
71
+ -------
72
+ get_by_natural_key(name)
73
+
74
+ """
75
+
76
+ def get_by_natural_key(self, name):
77
+ """Retrieves a LabelSet instance by its natural key (name)."""
78
+ return self.get(name=name)
79
+
80
+
81
+ class LabelSet(models.Model):
82
+ """
83
+ A class representing a label set.
84
+
85
+ Attributes:
86
+ name (str): The name of the label set.
87
+ description (str): A description of the label set.
88
+
89
+ """
90
+
91
+ name = models.CharField(max_length=255)
92
+ description = models.TextField(blank=True, null=True)
93
+ version = models.IntegerField()
94
+ labels = models.ManyToManyField("Label", related_name="labels")
95
+
96
+ objects = LabelSetManager()
97
+
98
+ def natural_key(self):
99
+ """Return the natural key of this label set"""
100
+ return (self.name,)
101
+
102
+ def __str__(self):
103
+ return str(self.name)
104
+
105
+ def get_labels_in_order(self):
106
+ """
107
+ Get all labels in this label set as list in the correct order.
108
+ Ordered by string representation (a is first).
109
+ """
110
+ labels = list(self.labels.all())
111
+ labels.sort(key=lambda x: x.name)
112
+ return labels
@@ -0,0 +1 @@
1
+ from .lab_value import LabValue
@@ -0,0 +1,111 @@
1
+ from django.db import models
2
+ import warnings
3
+
4
+ LANG = "de"
5
+
6
+ class LabValueManager(models.Manager):
7
+ def get_by_natural_key(self, name):
8
+ return self.get(name=name)
9
+
10
+ class LabValue(models.Model):
11
+ name = models.CharField(max_length=255, unique=True)
12
+ name_de = models.CharField(max_length=255, blank=True, null=True)
13
+ name_en = models.CharField(max_length=255, blank=True, null=True)
14
+ abbreviation = models.CharField(max_length=10, blank=True, null=True)
15
+ default_unit = models.ForeignKey('Unit', on_delete=models.CASCADE, blank=True, null=True)
16
+ numeric_precision = models.IntegerField(default=3)
17
+ default_single_categorical_value_distribution = models.ForeignKey(
18
+ 'SingleCategoricalValueDistribution',
19
+ on_delete=models.CASCADE,
20
+ blank=True, null=True,
21
+ related_name='default_single_categorical_value_distribution'
22
+ )
23
+ default_numerical_value_distribution = models.ForeignKey(
24
+ 'NumericValueDistribution',
25
+ on_delete=models.CASCADE,
26
+ blank=True, null=True,
27
+ related_name='default_numerical_value_distribution'
28
+ )
29
+ default_multiple_categorical_value_distribution = models.ForeignKey(
30
+ 'MultipleCategoricalValueDistribution',
31
+ on_delete=models.CASCADE,
32
+ blank=True, null=True,
33
+ related_name='default_multiple_categorical_value_distribution'
34
+ )
35
+ default_date_value_distribution = models.ForeignKey(
36
+ 'DateValueDistribution',
37
+ on_delete=models.CASCADE,
38
+ blank=True, null=True,
39
+ related_name='default_date_value_distribution'
40
+ )
41
+ default_normal_range = models.JSONField(blank=True, null=True)
42
+ normal_range_age_dependent = models.BooleanField(default=False)
43
+ normal_range_gender_dependent = models.BooleanField(default=False)
44
+ normal_range_special_case = models.BooleanField(default=False)
45
+ objects = LabValueManager()
46
+
47
+ def natural_key(self):
48
+ return (self.name,)
49
+
50
+ def __str__(self):
51
+ return self.name
52
+
53
+ def get_default_default_distribution(self):
54
+ if self.default_single_categorical_value_distribution:
55
+ return self.default_single_categorical_value_distribution
56
+ elif self.default_numerical_value_distribution:
57
+ return self.default_numerical_value_distribution
58
+ elif self.default_multiple_categorical_value_distribution:
59
+ return self.default_multiple_categorical_value_distribution
60
+ elif self.default_date_value_distribution:
61
+ return self.default_date_value_distribution
62
+ else:
63
+ warnings.warn("No default distribution set for lab value")
64
+ return None
65
+
66
+ def get_normal_range(self, age:int=None, gender=None):
67
+ from endoreg_db.models import Gender
68
+ assert isinstance(age, int) or age is None
69
+ assert isinstance(gender, Gender) or gender is None
70
+
71
+ age_dependent = self.normal_range_age_dependent
72
+ gender_dependent = self.normal_range_gender_dependent
73
+ special_case = self.normal_range_special_case
74
+
75
+ min_value = None
76
+ max_value = None
77
+
78
+ if not age_dependent and \
79
+ not gender_dependent and \
80
+ not special_case:
81
+ min_value = self.default_normal_range.get('min', None)
82
+ max_value = self.default_normal_range.get('max', None)
83
+
84
+ if age_dependent:
85
+ # get normal range for age)
86
+ warnings.warn("Age dependent normal range not implemented yet")
87
+ pass
88
+
89
+ if gender_dependent:
90
+ if not gender:
91
+ warnings.warn("Calling get_normal_range with gender_dependent=True requires gender to be set, choosing by random")
92
+ # set gender to either "male" or "female"
93
+ from random import choice
94
+ choices = ["male", "female"]
95
+ gender = choice(choices)
96
+
97
+ default_range_dict = self.default_normal_range.get(gender.name, {})
98
+ min_value = default_range_dict.get('min', None)
99
+ max_value = default_range_dict.get('max', None)
100
+
101
+ if special_case:
102
+ # get normal range for special case
103
+ warnings.warn("Special case normal range not implemented yet")
104
+
105
+ normal_range_dict = {
106
+ "min": min_value,
107
+ "max": max_value
108
+ }
109
+
110
+ return normal_range_dict
111
+
@@ -0,0 +1,11 @@
1
+ from .base import AbstractLogEntry
2
+ from .network_device import NetworkDeviceLogEntry
3
+ from .log_type import LogType
4
+ from .agl_service import AglServiceLogEntry
5
+
6
+ __all__ = [
7
+ "AbstractLogEntry",
8
+ "NetworkDeviceLogEntry",
9
+ "LogType",
10
+ "AglServiceLogEntry",
11
+ ]
@@ -0,0 +1,19 @@
1
+ from django.db import models
2
+ from .base import AbstractLogEntry
3
+
4
+ class AglServiceLogEntry(AbstractLogEntry):
5
+ """
6
+ Model for log entries related to AGL services.
7
+ """
8
+ service = models.ForeignKey("AglService", on_delete=models.CASCADE)
9
+ device = models.ForeignKey(
10
+ "NetworkDevice", on_delete=models.CASCADE, null=True, blank=True
11
+ )
12
+ log_type = models.ForeignKey("LogType", on_delete=models.CASCADE, null=True, blank=True)
13
+
14
+ class Meta:
15
+ verbose_name = "AGL Service Log Entry"
16
+ verbose_name_plural = "AGL Service Log Entries"
17
+
18
+ def __str__(self):
19
+ return f"{self.timestamp} - {self.user} - {self.ip_address} - {self.service} - {self.message}"
@@ -0,0 +1,22 @@
1
+ # django model for logging, first define an abstract base model
2
+ from django.db import models
3
+ from django.conf import settings
4
+
5
+ class AbstractLogEntry(models.Model):
6
+ """
7
+ Abstract base model for log entries.
8
+ """
9
+
10
+ class Meta:
11
+ abstract = True
12
+
13
+ timestamp = models.DateTimeField(auto_now_add=True)
14
+ user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True)
15
+ ip_address = models.GenericIPAddressField(null=True, blank=True)
16
+ user_agent = models.CharField(max_length=256, null=True, blank=True)
17
+ message = models.TextField()
18
+ json_content = models.JSONField(null=True, blank=True)
19
+
20
+
21
+ def __str__(self):
22
+ return f"{self.timestamp} - {self.user} - {self.ip_address} - {self.message}"
@@ -0,0 +1,23 @@
1
+ from django.db import models
2
+
3
+ class LogTypeManager(models.Manager):
4
+ # Custom manager for LogType; defines name as natural key
5
+ def get_by_natural_key(self, name):
6
+ return self.get(name=name)
7
+
8
+
9
+ class LogType(models.Model):
10
+ name = models.CharField(max_length=255)
11
+ description = models.CharField(max_length=255)
12
+ created = models.DateTimeField(auto_now_add=True)
13
+ updated = models.DateTimeField(auto_now=True)
14
+ objects = LogTypeManager()
15
+
16
+ def __str__(self):
17
+ return self.name
18
+
19
+ class Meta:
20
+ ordering = ['name']
21
+
22
+ def natural_key(self):
23
+ return (self.name,)