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,27 @@
1
+ from django.db import models
2
+ from .base import AbstractLogEntry
3
+
4
+ class NetworkDeviceLogEntry(AbstractLogEntry):
5
+ """
6
+ Model for log entries related to network devices.
7
+ """
8
+ device = models.ForeignKey("NetworkDevice", on_delete=models.CASCADE)
9
+ log_type = models.ForeignKey("LogType", on_delete=models.CASCADE, null=True, blank=True)
10
+
11
+ datetime = models.DateTimeField(default=None, null=True, blank=True)
12
+ # hostname = models.CharField(max_length=255, null=True, blank=True)
13
+ aglnet_ip = models.GenericIPAddressField(null=True, blank=True)
14
+ vpn_service_status = models.CharField(max_length=255, null=True, blank=True)
15
+ vpn_service_restart_attempt = models.BooleanField(default=False)
16
+ vpn_service_restart_success = models.BooleanField(null=True, blank=True)
17
+ ping_vpn = models.BooleanField(default=False)
18
+ ping_www = models.BooleanField(default=False)
19
+ transferred_to_host = models.BooleanField(default=False)
20
+
21
+ class Meta:
22
+ verbose_name = "Network Device Log Entry"
23
+ verbose_name_plural = "Network Device Log Entries"
24
+
25
+ def __str__(self):
26
+ return f"{self.timestamp} - {self.user} - {self.ip_address} - {self.device} - {self.message}"
27
+
@@ -0,0 +1,4 @@
1
+ from .client import LxClientType, LxClientTag, LxClient
2
+ from .identity import LxIdentity, LxIdentityType
3
+ from .permission import LxPermission
4
+ from .user import LxUser
@@ -0,0 +1,57 @@
1
+ # Insert models for Client, Client Type, Client Tag
2
+
3
+ from django.db import models
4
+
5
+ class LxClientTypeManager(models.Manager):
6
+ def get_by_natural_key(self, name):
7
+ return self.get(name=name)
8
+
9
+ #TODO implement base population for client Type
10
+
11
+ class LxClientType(models.Model):
12
+ name = models.CharField(max_length=100, unique=True)
13
+ abbreviation = models.CharField(max_length=10, unique=True) # New field
14
+ description = models.TextField(blank=True)
15
+ objects = LxClientTypeManager()
16
+
17
+ def __str__(self):
18
+ return self.name
19
+
20
+ def natural_key(self):
21
+ return (self.name,)
22
+
23
+
24
+ class LxClientTagManager(models.Manager):
25
+ def get_by_natural_key(self, name):
26
+ return self.get(name=name)
27
+
28
+ #TODO implement base population for client Tag
29
+
30
+ class LxClientTag(models.Model):
31
+ name = models.CharField(max_length=100, unique=True)
32
+ description = models.TextField(blank=True)
33
+ objects = LxClientTagManager()
34
+
35
+ # M2M relationship with LxPermission
36
+ permissions = models.ManyToManyField('LxPermission', blank=True, related_name="allowed_client_tags")
37
+
38
+ def __str__(self):
39
+ return self.name
40
+
41
+ def natural_key(self):
42
+ return (self.name,)
43
+
44
+ class LxClientManager(models.Manager):
45
+ def get_by_natural_key(self, name):
46
+ return self.get(name=name)
47
+
48
+ #TODO implement base population for client
49
+
50
+ class LxClient(models.Model):
51
+ name = models.CharField(max_length=100, unique=True)
52
+ description = models.TextField(blank=True)
53
+ client_type = models.ForeignKey(LxClientType, on_delete=models.CASCADE)
54
+ client_tags = models.ManyToManyField(LxClientTag, blank=True)
55
+ vpn_ip = models.GenericIPAddressField(blank=True, null=True)
56
+ objects = LxClientManager()
57
+
@@ -0,0 +1,34 @@
1
+ from django.db import models
2
+
3
+ class LxIdentityTypeManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ #TODO implement base population for identity Type
8
+ ## ed25519, rsa, ecdsa, dsa, etc
9
+
10
+ class LxIdentityType(models.Model):
11
+ name = models.CharField(max_length=100, unique=True)
12
+ description = models.TextField(blank=True)
13
+ objects = LxIdentityTypeManager()
14
+
15
+ def __str__(self):
16
+ return self.name
17
+
18
+ def natural_key(self):
19
+ return (self.name,)
20
+
21
+ class LxIdentity(models.Model):
22
+ name = models.CharField(max_length=100, unique=True)
23
+ description = models.TextField(blank=True)
24
+ identity_type = models.ForeignKey(LxIdentityType, on_delete=models.CASCADE)
25
+ objects = models.Manager()
26
+
27
+ # Foreign key to user, nullable
28
+ user = models.ForeignKey('LxUser', on_delete=models.CASCADE, null=True, blank=True)
29
+
30
+ def __str__(self):
31
+ return self.name
32
+
33
+ def natural_key(self):
34
+ return (self.name,)
@@ -0,0 +1,18 @@
1
+ from django.db import models
2
+
3
+ class LxPermissionManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ #TODO implement base population for permission
8
+
9
+ class LxPermission(models.Model):
10
+ name = models.CharField(max_length=100, unique=True)
11
+ description = models.TextField(blank=True)
12
+ objects = LxPermissionManager()
13
+
14
+ def __str__(self):
15
+ return self.name
16
+
17
+ def natural_key(self):
18
+ return (self.name,)
@@ -0,0 +1,16 @@
1
+ from django.db import models
2
+
3
+ class LxUserManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+
8
+ class LxUser(models.Model):
9
+ name = models.CharField(max_length=100, unique=True)
10
+ description = models.TextField(blank=True)
11
+
12
+
13
+
14
+ # to be extended
15
+
16
+
@@ -0,0 +1,19 @@
1
+ """Medication models initialization module."""
2
+ from .medication import Medication, MedicationManager
3
+ from .medication_schedule import MedicationSchedule, MedicationScheduleManager
4
+ from .medication_intake_time import MedicationIntakeTime, MedicationIntakeTimeManager
5
+ from .medication_indication_type import MedicationIndicationType, MedicationIndicationTypeManager
6
+ from .medication_indication import MedicationIndication, MedicationIndicationManager
7
+
8
+ __all__ = [
9
+ "Medication",
10
+ "MedicationManager",
11
+ "MedicationSchedule",
12
+ "MedicationScheduleManager",
13
+ "MedicationIntakeTime",
14
+ "MedicationIntakeTimeManager",
15
+ "MedicationIndicationType",
16
+ "MedicationIndicationTypeManager",
17
+ "MedicationIndication",
18
+ "MedicationIndicationManager"
19
+ ]
@@ -0,0 +1,33 @@
1
+ '''Model for the medication.'''
2
+ from django.db import models
3
+
4
+
5
+ class MedicationManager(models.Manager):
6
+ '''Manager for the medication model.'''
7
+ def get_by_natural_key(self, name):
8
+ '''Retrieve a medication by its natural key.'''
9
+ return self.get(name=name)
10
+
11
+ class Medication(models.Model):
12
+ '''Model representing a medication.'''
13
+ name = models.CharField(max_length=255, unique=True)
14
+ name_de = models.CharField(max_length=255, blank=True, null=True)
15
+ name_en = models.CharField(max_length=255, blank=True, null=True)
16
+ adapt_to_renal_function = models.BooleanField(default = False)
17
+ adapt_to_hepatic_function = models.BooleanField(default=False)
18
+ adapt_to_indication = models.BooleanField(default=False)
19
+ adapt_to_age = models.BooleanField(default=False)
20
+ adapt_to_weight = models.BooleanField(default=False)
21
+ adapt_to_risk = models.BooleanField(default=False)
22
+ default_unit = models.ForeignKey('Unit', on_delete=models.CASCADE)
23
+
24
+
25
+ objects = MedicationManager()
26
+
27
+ def natural_key(self):
28
+ '''Return the natural key for the medication.'''
29
+ return (self.name,)
30
+
31
+ def __str__(self):
32
+ return str(self.name)
33
+
@@ -0,0 +1,50 @@
1
+ """Model for medication indication."""
2
+
3
+ from django.db import models
4
+
5
+
6
+ class MedicationIndicationManager(models.Manager):
7
+ """Manager for the medication indication model."""
8
+
9
+ def get_by_natural_key(self, name):
10
+ """Retrieve a medication indication by its natural key."""
11
+ return self.get(name=name)
12
+
13
+
14
+ class MedicationIndication(models.Model):
15
+ """Model representing a medication indication."""
16
+
17
+ name = models.CharField(max_length=255, unique=True)
18
+ indication_type = models.ForeignKey(
19
+ "MedicationIndicationType",
20
+ on_delete=models.CASCADE,
21
+ related_name="medication_indications",
22
+ )
23
+ medication_schedules = models.ManyToManyField(
24
+ "MedicationSchedule",
25
+ )
26
+ diseases = models.ManyToManyField("Disease")
27
+ events = models.ManyToManyField("Event")
28
+ disease_classification_choices = models.ManyToManyField(
29
+ "DiseaseClassificationChoice"
30
+ )
31
+ sources = models.ManyToManyField("InformationSource")
32
+
33
+ def get_indication_links(self) -> dict:
34
+ """Return a dictionary of all linked objects for this medication indication."""
35
+ links = {
36
+ "medication_schedules": self.medication_schedules,
37
+ "diseases": self.diseases,
38
+ "events": self.events,
39
+ "disease_classification_choices": self.disease_classification_choices,
40
+ }
41
+ return links
42
+
43
+ objects = MedicationIndicationManager()
44
+
45
+ def natural_key(self):
46
+ """Return the natural key for the medication indication."""
47
+ return (self.name,)
48
+
49
+ def __str__(self):
50
+ return str(self.name)
@@ -0,0 +1,34 @@
1
+ '''Model for medication indication type.'''
2
+ from django.db import models
3
+
4
+ class MedicationIndicationTypeManager(models.Manager):
5
+ '''Manager for the medication indication type model.'''
6
+ def get_by_natural_key(self, name):
7
+ '''Retrieve a medication indication type by its natural key.'''
8
+ return self.get(name=name)
9
+
10
+ class MedicationIndicationType(models.Model):
11
+ '''Model representing a medication indication type.'''
12
+ name = models.CharField(max_length=255, unique=True)
13
+ name_de = models.CharField(max_length=255, blank=True, null=True)
14
+ name_en = models.CharField(max_length=255, blank=True, null=True)
15
+
16
+ objects = MedicationIndicationTypeManager()
17
+
18
+ def natural_key(self):
19
+ '''Return the natural key for the medication indication type.'''
20
+ return (self.name,)
21
+
22
+ def __str__(self):
23
+ return str(self.name)
24
+
25
+ @classmethod
26
+ def get_random_indication_by_type(cls, name) -> "MedicationIndication":
27
+ '''Return a random medication indication of the given type.'''
28
+ return cls.objects.get(name=name).medication_indications.order_by('?').first()
29
+
30
+
31
+ def get_random_medication_indication(self):
32
+ '''Return a random medication indication of this type.'''
33
+ from endoreg_db.models import MedicationIndication
34
+ return MedicationIndication.objects.filter(indication_type=self).order_by('?').first()
@@ -0,0 +1,26 @@
1
+ '''Model for medication intake time'''
2
+ from django.db import models
3
+
4
+
5
+ class MedicationIntakeTimeManager(models.Manager):
6
+ '''Manager for the medication intake time model.'''
7
+ def get_by_natural_key(self, name):
8
+ '''Retrieve a medication intake time by its natural key.'''
9
+ return self.get(name=name)
10
+
11
+ class MedicationIntakeTime(models.Model):
12
+ '''Model representing a medication intake time.'''
13
+ name = models.CharField(max_length=255)
14
+ name_de = models.CharField(max_length=255, blank=True, null=True)
15
+ name_en = models.CharField(max_length=255, blank=True, null=True)
16
+ repeats = models.CharField(max_length=20, default = "daily")
17
+ time = models.TimeField()
18
+
19
+ objects = MedicationIntakeTimeManager()
20
+
21
+ def natural_key(self):
22
+ '''Return the natural key for the medication intake time.'''
23
+ return (self.name,)
24
+
25
+ def __str__(self):
26
+ return self.name + " at " + str(self.time) + " (" + self.repeats + ")"
@@ -0,0 +1,37 @@
1
+ '''Model for the medication schedule.'''
2
+ from typing import List
3
+ from django.db import models
4
+
5
+ class MedicationScheduleManager(models.Manager):
6
+ '''Manager for the medication schedule model.'''
7
+ def get_by_natural_key(self, name):
8
+ '''Retrieve a medication schedule by its natural key.'''
9
+ return self.get(name=name)
10
+
11
+ class MedicationSchedule(models.Model):
12
+ '''Model representing a medication schedule.'''
13
+ name = models.CharField(max_length=255)
14
+ name_de = models.CharField(max_length=255, blank=True, null=True)
15
+ name_en = models.CharField(max_length=255, blank=True, null=True)
16
+ description = models.TextField(blank=True, null=True)
17
+ medication = models.ForeignKey("Medication", on_delete=models.CASCADE)
18
+ unit = models.ForeignKey("Unit", on_delete=models.CASCADE)
19
+ therapy_duration_d = models.FloatField(blank=True, null=True)
20
+ dose = models.FloatField()
21
+ intake_times = models.ManyToManyField(
22
+ "MedicationIntakeTime",
23
+ )
24
+
25
+ objects = MedicationScheduleManager()
26
+
27
+ def natural_key(self):
28
+ '''Return the natural key for the medication schedule.'''
29
+ return (self.name,)
30
+
31
+ def __str__(self):
32
+ return str(self.name)
33
+
34
+ def get_intake_times(self) -> List["MedicationIntakeTime"]:
35
+ '''Return a list of all intake times for this medication schedule.'''
36
+ return [_ for _ in self.intake_times.all()] # type: ignore # pylint: disable=E1101
37
+
@@ -0,0 +1,9 @@
1
+ from .network_device import NetworkDevice
2
+ from .network_device_type import NetworkDeviceType
3
+ from .agl_service import AglService
4
+
5
+ __all__ = [
6
+ "NetworkDevice",
7
+ "NetworkDeviceType",
8
+ "AglService",
9
+ ]
@@ -0,0 +1,38 @@
1
+ from django.db import models
2
+
3
+ class AglServiceManager(models.Manager):
4
+ # Custom manager for AglService; defines name as natural key
5
+ def get_by_natural_key(self, name):
6
+ return self.get(name=name)
7
+
8
+ class AglService(models.Model):
9
+ name = models.CharField(max_length=255)
10
+ description = models.CharField(max_length=255)
11
+ online = models.BooleanField(default=False)
12
+ created = models.DateTimeField(auto_now_add=True)
13
+ updated = models.DateTimeField(auto_now=True)
14
+ objects = AglServiceManager()
15
+ devices = models.ManyToManyField("NetworkDevice", related_name="services")
16
+ port = models.IntegerField(blank=True, null=True)
17
+ protocol = models.CharField(max_length=255, blank=True, null=True)
18
+ url = models.URLField(blank=True, null=True)
19
+
20
+ def alive_log(self, user, ip_address, user_agent):
21
+ from ..logging import AglServiceLogEntry
22
+ AglServiceLogEntry.objects.create(
23
+ user=user,
24
+ ip_address=ip_address,
25
+ user_agent=user_agent,
26
+ message=f"Service {self.name} is alive.",
27
+ service=self
28
+ )
29
+
30
+ def __str__(self):
31
+ return self.name
32
+
33
+ class Meta:
34
+ ordering = ['name']
35
+
36
+ def natural_key(self):
37
+ return (self.name,)
38
+
@@ -0,0 +1,58 @@
1
+ import subprocess
2
+ from django.db import models
3
+
4
+ # Django db class to store network devices (e.g., servers, clients, switches, etc.)
5
+
6
+ class NetworkDeviceManager(models.Manager):
7
+ """Custom manager for NetworkDevice that defines name as natural key."""
8
+ def get_by_natural_key(self, name):
9
+ """Return the network device with the given name as its natural key."""
10
+ return self.get(name=name)
11
+
12
+ class NetworkDevice(models.Model):
13
+ """Django model representing a network device."""
14
+ name = models.CharField(max_length=255)
15
+ ip = models.GenericIPAddressField(blank=True, null=True)
16
+ description = models.CharField(max_length=255)
17
+ device_type = models.ForeignKey("NetworkDeviceType", on_delete=models.CASCADE)
18
+ online = models.BooleanField(default=False)
19
+ created = models.DateTimeField(auto_now_add=True)
20
+ updated = models.DateTimeField(auto_now=True)
21
+ objects = NetworkDeviceManager()
22
+
23
+ def __str__(self):
24
+ """Return the device name."""
25
+ return str(self.name)
26
+
27
+ # pylint: disable=too-few-public-methods
28
+ class Meta:
29
+ """Meta options for the NetworkDevice model."""
30
+ db_table = 'network_devices'
31
+ ordering = ['name']
32
+
33
+ def natural_key(self):
34
+ """Return a tuple representing the natural key for this network device."""
35
+ return (self.name,)
36
+
37
+ def ping(self):
38
+ """Check device availability by sending one ping request."""
39
+ target_ip = self.ip
40
+
41
+ # Define the command
42
+ command = ['ping', '-c', '1', target_ip]
43
+
44
+ # Run the command
45
+ process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
46
+
47
+ # Wait for the process to terminate
48
+ process.wait()
49
+
50
+ # Check the return code
51
+ return_code = process.returncode
52
+
53
+ # Return True if the return code is 0, False otherwise
54
+ self.online = return_code == 0
55
+ self.save()
56
+ return self.online
57
+
58
+
@@ -0,0 +1,23 @@
1
+ # Django db class to store network device types (e.g., server, client, switch, etc.)
2
+
3
+ from django.db import models
4
+
5
+ class NetworkDeviceTypeManager(models.Manager):
6
+ # Custom manager for NetworkDeviceType; defines name as natural key
7
+ def get_by_natural_key(self, name):
8
+ return self.get(name=name)
9
+
10
+ class NetworkDeviceType(models.Model):
11
+ name = models.CharField(max_length=255)
12
+ description = models.CharField(max_length=255)
13
+ created = models.DateTimeField(auto_now_add=True)
14
+ updated = models.DateTimeField(auto_now=True)
15
+ objects = NetworkDeviceTypeManager()
16
+
17
+ def __str__(self):
18
+ return self.name
19
+
20
+ class Meta:
21
+ db_table = 'network_device_types'
22
+ ordering = ['name']
23
+
@@ -0,0 +1,38 @@
1
+ """Module for Organ models."""
2
+ from django.db import models
3
+
4
+ class OrganManager(models.Manager):
5
+ """Manager for Organ model."""
6
+
7
+ def get_by_natural_key(self, name):
8
+ """Retrieve an Organ by its natural key."""
9
+ return self.get(name=name)
10
+
11
+ def all_names(self):
12
+ """Return a list of all organ names."""
13
+ return list(self.all().values_list('name', flat=True))
14
+
15
+ class Organ(models.Model):
16
+ """Model representing an organ."""
17
+
18
+ name = models.CharField(max_length=100, unique=True)
19
+ name_de = models.CharField(max_length=100, blank=True, null=True)
20
+ name_en = models.CharField(max_length=100, blank=True, null=True)
21
+ description = models.TextField(blank=True, null=True)
22
+ description_de = models.TextField(blank=True, null=True)
23
+ description_en = models.TextField(blank=True, null=True)
24
+
25
+ location_choices = models.ManyToManyField(
26
+ 'FindingLocationClassificationChoice',
27
+ blank=True, related_name='organs'
28
+ )
29
+
30
+ objects = OrganManager()
31
+
32
+ def natural_key(self):
33
+ """Return the natural key for the organ."""
34
+ return (self.name,)
35
+
36
+ def __str__(self):
37
+ """Return string representation of the organ."""
38
+ return str(self.name)
@@ -0,0 +1,23 @@
1
+ from .material import Material
2
+ from .resource import Resource
3
+ from .transport_route import TransportRoute
4
+ from .waste import Waste
5
+ from .distribution import (
6
+ BaseValueDistribution,
7
+ NumericValueDistribution,
8
+ SingleCategoricalValueDistribution,
9
+ MultipleCategoricalValueDistribution,
10
+ DateValueDistribution,
11
+ )
12
+
13
+ __all__ = [
14
+ 'Material',
15
+ 'Resource',
16
+ 'TransportRoute',
17
+ 'Waste',
18
+ 'BaseValueDistribution',
19
+ 'NumericValueDistribution',
20
+ 'SingleCategoricalValueDistribution',
21
+ 'MultipleCategoricalValueDistribution',
22
+ 'DateValueDistribution',
23
+ ]
@@ -0,0 +1,44 @@
1
+ '''Module for distribution models.'''
2
+
3
+ from .base_value_distribution import BaseValueDistribution
4
+ from .numeric_value_distribution import NumericValueDistribution
5
+ from .single_categorical_value_distribution import SingleCategoricalValueDistribution
6
+ from .multiple_categorical_value_distribution import MultipleCategoricalValueDistribution
7
+ from .date_value_distribution import DateValueDistribution
8
+
9
+
10
+ __all__ = [
11
+ 'BaseValueDistribution',
12
+ 'NumericValueDistribution',
13
+ 'SingleCategoricalValueDistribution',
14
+ 'MultipleCategoricalValueDistribution',
15
+ 'DateValueDistribution',
16
+ ]
17
+
18
+ # Example Usage
19
+ # Numeric distribution for age
20
+ # age_distribution = NumericValueDistribution.objects.create(
21
+ # name='Age Distribution',
22
+ # distribution_type='normal',
23
+ # min_value=0,
24
+ # max_value=100,
25
+ # mean=50,
26
+ # std_dev=15
27
+ # )
28
+
29
+ # # Single categorical distribution for gender
30
+ # gender_distribution = SingleCategoricalValueDistribution.objects.create(
31
+ # name='Gender Distribution',
32
+ # categories={'male': 0.5, 'female': 0.5}
33
+ # )
34
+
35
+ # # Multiple categorical distribution for symptoms
36
+ # symptoms_distribution = MultipleCategoricalValueDistribution.objects.create(
37
+ # name='Symptoms Distribution',
38
+ # categories={'fever': 0.3, 'cough': 0.4, 'fatigue': 0.2, 'nausea': 0.1},
39
+ # min_count=1,
40
+ # max_count=3,
41
+ # count_distribution_type='normal',
42
+ # count_mean=2,
43
+ # count_std_dev=0.5
44
+ # )
@@ -0,0 +1,20 @@
1
+ from django.db import models
2
+
3
+ class BaseValueDistribution(models.Model):
4
+ """
5
+ Abstract base class for value distributions.
6
+ """
7
+ name = models.CharField(max_length=100)
8
+
9
+ class Meta:
10
+ abstract = True
11
+
12
+ def generate_value(self):
13
+ """
14
+ Generate a value based on the distribution rules.
15
+ Must be implemented by subclasses.
16
+ """
17
+ raise NotImplementedError("Subclasses must implement this method")
18
+
19
+ def natural_key(self):
20
+ return (self.name,)