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,196 @@
1
+ from django.db import models
2
+ from endoreg_db.models.data_file.frame import Frame
3
+ from django.core.validators import FileExtensionValidator
4
+ from django.core.files.storage import FileSystemStorage
5
+ from typing import TYPE_CHECKING
6
+ import cv2
7
+ from ..base_classes import AbstractVideoFile
8
+ from ..base_classes.utils import (
9
+ VIDEO_DIR_NAME,
10
+ STORAGE_LOCATION,
11
+ FRAME_PROCESSING_BATCH_SIZE,
12
+ )
13
+
14
+ if TYPE_CHECKING:
15
+ from django.db.models import QuerySet
16
+ from endoreg_db.models import (
17
+ LabelVideoSegment,
18
+ VideoImportMeta,
19
+ SensitiveMeta,
20
+ Patient,
21
+ PatientExamination,
22
+ RawVideoFile,
23
+ )
24
+
25
+
26
+ class Video(AbstractVideoFile):
27
+ file = models.FileField(
28
+ upload_to=VIDEO_DIR_NAME,
29
+ validators=[FileExtensionValidator(allowed_extensions=["mp4"])], # FIXME
30
+ storage=FileSystemStorage(location=STORAGE_LOCATION.resolve().as_posix()),
31
+ )
32
+
33
+ patient = models.ForeignKey(
34
+ "Patient",
35
+ on_delete=models.CASCADE,
36
+ blank=True,
37
+ null=True,
38
+ related_name="videos",
39
+ )
40
+
41
+ examination = models.ForeignKey(
42
+ "PatientExamination",
43
+ on_delete=models.SET_NULL,
44
+ blank=True,
45
+ null=True,
46
+ related_name="videos",
47
+ )
48
+
49
+ # Deprecate and move to video meta?
50
+ date = models.DateField(blank=True, null=True)
51
+ suffix = models.CharField(max_length=255, blank=True, null=True)
52
+ fps = models.FloatField(blank=True, null=True)
53
+ duration = models.FloatField(blank=True, null=True)
54
+ width = models.IntegerField(blank=True, null=True)
55
+ height = models.IntegerField(blank=True, null=True)
56
+ endoscope_image_x = models.IntegerField(blank=True, null=True)
57
+ endoscope_image_y = models.IntegerField(blank=True, null=True)
58
+ endoscope_image_width = models.IntegerField(blank=True, null=True)
59
+ endoscope_image_height = models.IntegerField(blank=True, null=True)
60
+
61
+ state_frames_extracted = models.BooleanField(default=False)
62
+
63
+ meta = models.JSONField(blank=True, null=True)
64
+
65
+ sensitive_meta = models.ForeignKey(
66
+ "SensitiveMeta",
67
+ on_delete=models.CASCADE,
68
+ related_name="videos",
69
+ null=True,
70
+ blank=True,
71
+ )
72
+
73
+ import_meta = models.OneToOneField(
74
+ "VideoImportMeta", on_delete=models.CASCADE, blank=True, null=True
75
+ )
76
+
77
+ if TYPE_CHECKING:
78
+ import_meta: "VideoImportMeta"
79
+ patient: "Patient"
80
+ examination: "PatientExamination"
81
+ frames: "QuerySet[Frame]"
82
+ label_video_segments: (
83
+ "QuerySet[LabelVideoSegment]" # Foreign key in LabelVideoSegment.video
84
+ )
85
+ sensitive_meta: "SensitiveMeta"
86
+ raw_videos: "QuerySet[RawVideoFile]"
87
+
88
+ # override the save method to set fps if not set
89
+ def save(self, *args, **kwargs):
90
+ if not self.fps:
91
+ self.fps = self.get_fps()
92
+ super().save(*args, **kwargs)
93
+
94
+ def label_segments_to_frame_annotations(self):
95
+ """
96
+ Generate annotations for all label video segments.
97
+ """
98
+ for lvs in self.label_video_segments.all():
99
+ lvs.generate_annotations()
100
+
101
+ def sync_from_raw_video(self):
102
+ """
103
+ Sync metadata from the associated raw video file.
104
+ """
105
+ from endoreg_db.models import RawVideoFile, LabelVideoSegment
106
+
107
+ raw_video: RawVideoFile = self.raw_videos.first()
108
+
109
+ assert isinstance(raw_video, RawVideoFile), "Raw video is not a file"
110
+
111
+ self.predictions = raw_video.predictions
112
+ self.readable_predictions = raw_video.readable_predictions
113
+ self.sequences = raw_video.sequences
114
+
115
+ label_video_segments = raw_video.label_video_segments.all()
116
+
117
+ label_video_segments = [
118
+ LabelVideoSegment.from_raw(
119
+ video=self, raw_label_video_segment=raw_label_video_segment
120
+ )
121
+ # LabelVideoSegment.from_raw(self, raw_label_video_segment)
122
+ for raw_label_video_segment in label_video_segments
123
+ ]
124
+
125
+ for lvs in label_video_segments:
126
+ lvs.save()
127
+
128
+ self.state_histology_required = raw_video.state_histology_required
129
+ self.state_histology_available = raw_video.state_histology_available
130
+ self.state_follow_up_intervention_required = (
131
+ raw_video.state_follow_up_intervention_required
132
+ )
133
+ self.state_follow_up_intervention_available = (
134
+ raw_video.state_follow_up_intervention_available
135
+ )
136
+ self.state_dataset_complete = raw_video.state_dataset_complete
137
+
138
+ self.save()
139
+
140
+ ## Deprecated
141
+ # def get_roi_endoscope_image(self):
142
+ # return {
143
+ # "x": self.endoscope_image_content_x,
144
+ # "y": self.endoscope_image_content_y,
145
+ # "width": self.endoscope_image_content_width,
146
+ # "height": self.endoscope_image_content_height,
147
+ # }
148
+
149
+ # def initialize_metadata_in_db(self, video_meta=None):
150
+ # if not video_meta:
151
+ # video_meta = self.meta
152
+ # self.set_examination_date_from_video_meta(video_meta)
153
+ # self.patient, created = self.get_or_create_patient(video_meta)
154
+ # self.save()
155
+
156
+ # def get_or_create_patient(self, video_meta=None):
157
+ # from ...persons import Patient
158
+
159
+ # if not video_meta:
160
+ # video_meta = self.meta
161
+
162
+ # patient_first_name = video_meta["patient_first_name"]
163
+ # patient_last_name = video_meta["patient_last_name"]
164
+ # patient_dob = video_meta["patient_dob"]
165
+
166
+ # # assert that we got all the necessary information
167
+ # assert patient_first_name and patient_last_name and patient_dob, (
168
+ # "Missing patient information"
169
+ # )
170
+
171
+ # patient, created = Patient.objects.get_or_create(
172
+ # first_name=patient_first_name, last_name=patient_last_name, dob=patient_dob
173
+ # )
174
+
175
+ # return patient, created
176
+
177
+ # DEPRECATED
178
+ # def set_examination_date_from_video_meta(self, video_meta=None):
179
+ # if not video_meta:
180
+ # video_meta = self.meta
181
+ # date_str = video_meta["examination_date"] # e.g. 2020-01-01
182
+ # if date_str:
183
+ # self.date = date.fromisoformat(date_str)
184
+ # self.save()
185
+
186
+ def initialize_video_specs(self):
187
+ """
188
+ Initialize and save video metadata like framerate, dimensions, and duration.
189
+ """
190
+ video = cv2.VideoCapture(self.file.path)
191
+ self.fps = video.get(cv2.CAP_PROP_FPS)
192
+ self.width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
193
+ self.height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
194
+ self.duration = video.get(cv2.CAP_PROP_FRAME_COUNT) / self.fps
195
+ self.save()
196
+ video.release()
@@ -0,0 +1,214 @@
1
+ from django.db import models
2
+ import numpy as np
3
+ from ..annotation import ImageClassificationAnnotation
4
+ from typing import TYPE_CHECKING, Union
5
+ from tqdm import tqdm
6
+
7
+ if TYPE_CHECKING:
8
+ from endoreg_db.models import (
9
+ RawVideoFile,
10
+ Video,
11
+ Label,
12
+ InformationSource,
13
+ VideoPredictionMeta,
14
+ RawVideoPredictionMeta,
15
+ )
16
+
17
+
18
+ def find_segments_in_prediction_array(prediction_array: np.array, min_frame_len: int):
19
+ """
20
+ Expects a prediction array of shape (num_frames) and a minimum frame length.
21
+ Returns a list of tuples (start_frame_number, end_frame_number) that represent the segments.
22
+ """
23
+ # Add False to the beginning and end to detect changes at the array boundaries
24
+ padded_prediction = np.pad(
25
+ prediction_array, (1, 1), "constant", constant_values=False
26
+ )
27
+
28
+ # Find the start points and end points of the segments
29
+ diffs = np.diff(padded_prediction.astype(int))
30
+ segment_starts = np.where(diffs == 1)[0]
31
+ segment_ends = np.where(diffs == -1)[0]
32
+
33
+ # Filter segments based on min_frame_len
34
+ segments = [
35
+ (start, end)
36
+ for start, end in zip(segment_starts, segment_ends)
37
+ if end - start >= min_frame_len
38
+ ]
39
+
40
+ return segments
41
+
42
+
43
+ class AbstractLabelVideoSegment(models.Model):
44
+ start_frame_number = models.IntegerField()
45
+ end_frame_number = models.IntegerField()
46
+ source = models.ForeignKey(
47
+ "InformationSource", on_delete=models.SET_NULL, null=True
48
+ )
49
+ label = models.ForeignKey("Label", on_delete=models.SET_NULL, null=True, blank=True)
50
+
51
+ if TYPE_CHECKING:
52
+ label: "Label"
53
+ source: "InformationSource"
54
+ prediction_meta: Union["RawVideoPredictionMeta", "VideoPredictionMeta"]
55
+ video: Union[Video, RawVideoFile]
56
+
57
+ class Meta:
58
+ abstract = True
59
+
60
+ def __str__(self):
61
+ video = self.video
62
+ label = self.label
63
+
64
+ str_repr = (
65
+ video.file.path
66
+ + " Label - "
67
+ + label.name
68
+ + " - "
69
+ + str(self.start_frame_number)
70
+ + " - "
71
+ + str(self.end_frame_number)
72
+ )
73
+ assert isinstance(str_repr, str), "String representation is not a string"
74
+ return str_repr
75
+
76
+ def get_model_meta(self):
77
+ return self.prediction_meta.model_meta
78
+
79
+ def get_frames(self):
80
+ video = self.video
81
+ return video.get_frame_range(self.start_frame_number, self.end_frame_number)
82
+
83
+ def get_annotations(self):
84
+ frames = self.get_frames()
85
+ annotations = ImageClassificationAnnotation.objects.filter(
86
+ frame__in=frames, label=self.label
87
+ )
88
+
89
+ return annotations
90
+
91
+ def get_segment_len_in_s(self):
92
+ return (self.end_frame_number - self.start_frame_number) / self.video.get_fps()
93
+
94
+ def get_frames_without_annotation(self, n_frames: int):
95
+ """
96
+ Get a frame without an annotation.
97
+ """
98
+ frames = self.get_frames()
99
+ annotations = ImageClassificationAnnotation.objects.filter(
100
+ frame__in=frames, label=self.label
101
+ )
102
+
103
+ annotated_frames = [annotation.frame for annotation in annotations]
104
+ frames_without_annotation = [
105
+ frame for frame in frames if frame not in annotated_frames
106
+ ]
107
+
108
+ # draw n random frames
109
+ if len(frames_without_annotation) > n_frames:
110
+ frames_without_annotation = np.random.choice(
111
+ frames_without_annotation, n_frames, replace=False
112
+ )
113
+
114
+ return frames_without_annotation
115
+
116
+
117
+ class LabelVideoSegment(AbstractLabelVideoSegment):
118
+ video = models.ForeignKey(
119
+ "Video", on_delete=models.CASCADE, related_name="label_video_segments"
120
+ )
121
+ prediction_meta = models.ForeignKey(
122
+ "VideoPredictionMeta",
123
+ on_delete=models.SET_NULL,
124
+ null=True,
125
+ blank=True,
126
+ related_name="label_video_segments",
127
+ )
128
+
129
+ if TYPE_CHECKING:
130
+ video: "Video"
131
+ label: "Label"
132
+ source: "InformationSource"
133
+ prediction_meta: "VideoPredictionMeta"
134
+
135
+ @classmethod
136
+ def from_raw(cls, video: "Video", raw_label_video_segment: "LabelRawVideoSegment"):
137
+ from endoreg_db.models import VideoPredictionMeta
138
+
139
+ raw_video_prediction_meta = raw_label_video_segment.prediction_meta
140
+
141
+ prediction_meta = VideoPredictionMeta.from_raw(
142
+ video=video, raw_video_prediction_meta=raw_video_prediction_meta
143
+ )
144
+ existing_segment = cls.objects.filter(
145
+ video=video,
146
+ start_frame_number=raw_label_video_segment.start_frame_number,
147
+ end_frame_number=raw_label_video_segment.end_frame_number,
148
+ source=raw_label_video_segment.source,
149
+ label=raw_label_video_segment.label,
150
+ prediction_meta=prediction_meta,
151
+ ).first()
152
+ if existing_segment:
153
+ return existing_segment
154
+ segment = cls(
155
+ start_frame_number=raw_label_video_segment.start_frame_number,
156
+ end_frame_number=raw_label_video_segment.end_frame_number,
157
+ source=raw_label_video_segment.source,
158
+ label=raw_label_video_segment.label,
159
+ video=video,
160
+ prediction_meta=prediction_meta,
161
+ )
162
+
163
+ segment.save()
164
+ return segment
165
+
166
+ def get_video_model(self):
167
+ from endoreg_db.models import Video
168
+
169
+ return Video
170
+
171
+ def generate_annotations(self):
172
+ """
173
+ Generate annotations for the segment.
174
+ """
175
+ from endoreg_db.models import InformationSource
176
+
177
+ frames = self.get_frames()
178
+ model_meta = self.get_model_meta()
179
+ information_source, _created = InformationSource.objects.get_or_create(
180
+ name="prediction"
181
+ )
182
+
183
+ for frame in tqdm(frames):
184
+ ImageClassificationAnnotation.objects.get_or_create(
185
+ frame=frame,
186
+ label=self.label,
187
+ model_meta=model_meta,
188
+ value=1,
189
+ information_source=information_source,
190
+ )
191
+
192
+
193
+ class LabelRawVideoSegment(AbstractLabelVideoSegment):
194
+ video = models.ForeignKey(
195
+ "RawVideoFile", on_delete=models.CASCADE, related_name="label_video_segments"
196
+ )
197
+ prediction_meta = models.ForeignKey(
198
+ "RawVideoPredictionMeta",
199
+ on_delete=models.SET_NULL,
200
+ null=True,
201
+ blank=True,
202
+ related_name="label_video_segments",
203
+ )
204
+
205
+ if TYPE_CHECKING:
206
+ video: "RawVideoFile"
207
+ label: "Label"
208
+ source: "InformationSource"
209
+ prediction_meta: "RawVideoPredictionMeta"
210
+
211
+ def get_video_model(self):
212
+ from endoreg_db.models import RawVideoFile
213
+
214
+ return RawVideoFile
@@ -0,0 +1,79 @@
1
+ from django.db import models
2
+ from typing import List
3
+
4
+ class DiseaseManager(models.Manager):
5
+ def get_by_natural_key(self, name):
6
+ return self.get(name=name)
7
+
8
+ class Disease(models.Model):
9
+ name = models.CharField(max_length=255, unique=True)
10
+ name_de = models.CharField(max_length=255, blank=True, null=True)
11
+ name_en = models.CharField(max_length=255, blank=True, null=True)
12
+ subcategories = models.JSONField(default=dict)
13
+ numerical_descriptors = models.JSONField(default=dict)
14
+
15
+ objects = DiseaseManager()
16
+
17
+ def natural_key(self):
18
+ return (self.name,)
19
+
20
+ def __str__(self):
21
+ return self.name
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+ def get_classifications(self)->List['DiseaseClassification']:
30
+ classifications: List[DiseaseClassification] = [_ for _ in self.disease_classifications.all()]
31
+ return classifications
32
+
33
+ class DiseaseClassificationManager(models.Manager):
34
+ def get_by_natural_key(self, name):
35
+ return self.get(name=name)
36
+
37
+ class DiseaseClassification(models.Model):
38
+ name = models.CharField(max_length=255, unique=True)
39
+ name_de = models.CharField(max_length=255, blank=True, null=True)
40
+ name_en = models.CharField(max_length=255, blank=True, null=True)
41
+
42
+ disease = models.ForeignKey(
43
+ Disease, on_delete=models.CASCADE,
44
+ related_name='disease_classifications'
45
+ )
46
+
47
+ objects = DiseaseClassificationManager()
48
+
49
+ def natural_key(self):
50
+ return (self.name,)
51
+
52
+ def __str__(self):
53
+ return self.name
54
+
55
+ def get_choices(self)->List['DiseaseClassificationChoice']:
56
+ choices:List[DiseaseClassificationChoice] = [_ for _ in self.disease_classification_choices.all()]
57
+ return choices
58
+
59
+ class DiseaseClassificationChoiceManager(models.Manager):
60
+ def get_by_natural_key(self, name):
61
+ return self.get(name=name)
62
+
63
+ class DiseaseClassificationChoice(models.Model):
64
+ name = models.CharField(max_length=255, unique=True)
65
+ name_de = models.CharField(max_length=255, blank=True, null=True)
66
+ name_en = models.CharField(max_length=255, blank=True, null=True)
67
+
68
+ disease_classification = models.ForeignKey(
69
+ DiseaseClassification, on_delete=models.CASCADE,
70
+ related_name='disease_classification_choices'
71
+ )
72
+
73
+ objects = DiseaseClassificationChoiceManager()
74
+
75
+ def natural_key(self):
76
+ return (self.name,)
77
+
78
+ def __str__(self):
79
+ return self.name
@@ -0,0 +1,5 @@
1
+ from .emission_factor import EmissionFactor
2
+
3
+ __all__ = [
4
+ 'EmissionFactor',
5
+ ]
@@ -0,0 +1,85 @@
1
+ from django.db import models
2
+ from typing import List
3
+ class EmissionFactorManager(models.Manager):
4
+ """
5
+ Manager for EmissionFactor with custom query methods.
6
+ """
7
+ def get_by_natural_key(self, name: str) -> "EmissionFactor":
8
+ return self.get(name=name)
9
+
10
+ # get debug from settings
11
+ # from django.conf import settings
12
+ # DEBUG = settings.DEBUG
13
+
14
+ class EmissionFactor(models.Model):
15
+ """
16
+ Represents an emission factor with associated unit and value.
17
+
18
+ Attributes:
19
+ name (str): The name of the emission factor.
20
+ name_de (str): The German name of the emission factor.
21
+ name_en (str): The English name of the emission factor.
22
+ unit (ForeignKey): The unit associated with the emission factor.
23
+ value (float): The value of the emission factor.
24
+ """
25
+ objects = EmissionFactorManager()
26
+
27
+ name = models.CharField(max_length=255)
28
+ name_de = models.CharField(max_length=255, null=True)
29
+ name_en = models.CharField(max_length=255, null=True)
30
+ unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
31
+ value = models.FloatField()
32
+
33
+ def natural_key(self) -> tuple:
34
+ """
35
+ Returns the natural key for the emission factor.
36
+
37
+ Returns:
38
+ tuple: The natural key consisting of the name.
39
+ """
40
+ return (self.name,)
41
+
42
+ def __str__(self, verbose: bool = False) -> str:
43
+ """
44
+ String representation of the emission factor.
45
+
46
+ Args:
47
+ verbose (bool): If True, includes additional details.
48
+
49
+ Returns:
50
+ str: The string representation of the emission factor.
51
+ """
52
+ result = f"{self.name}: {self.value} per {self.unit}"
53
+ if verbose:
54
+ result += "\n\tSources:"
55
+ for source in self.sources():
56
+ result += f"\n\t\t{source}"
57
+
58
+ return result
59
+
60
+ def get_reference_products(self) -> List["ReferenceProduct"]:
61
+ """
62
+ Retrieves all reference products associated with the emission factor.
63
+
64
+ Returns:
65
+ list: A list of ReferenceProduct instances associated with this emission factor.
66
+ """
67
+ from endoreg_db.models import ReferenceProduct
68
+
69
+ reference_products = []
70
+ reference_products += ReferenceProduct.objects.filter(emission_factor_total=self)
71
+ reference_products += ReferenceProduct.objects.filter(emission_factor_package=self)
72
+ reference_products += ReferenceProduct.objects.filter(emission_factor_product=self)
73
+
74
+ return reference_products
75
+
76
+ def sources(self) -> List:
77
+ """
78
+ Retrieves all sources related to the emission factor.
79
+
80
+ Returns:
81
+ list: A list of sources related to the emission factor.
82
+ """
83
+ sources = []
84
+ sources.extend(self.get_reference_products())
85
+ return sources
@@ -0,0 +1,73 @@
1
+ from django.db import models
2
+ from typing import List
3
+
4
+ class Event(models.Model):
5
+ """
6
+ A class representing an event.
7
+
8
+ Attributes:
9
+ name (str): The name of the event.
10
+ name_de (str): The German name of the event.
11
+ name_en (str): The English name of the event.
12
+ description (str): A description of the event.
13
+ """
14
+ name = models.CharField(max_length=100, unique=True)
15
+ name_de = models.CharField(max_length=100, blank=True, null=True)
16
+ name_en = models.CharField(max_length=100, blank=True, null=True)
17
+ description = models.TextField(blank=True, null=True)
18
+ event_classification = models.ForeignKey(
19
+ 'EventClassification', on_delete=models.CASCADE, related_name='events',
20
+ null=True, blank=True
21
+ )
22
+
23
+ def natural_key(self):
24
+ return (self.name,)
25
+
26
+ def __str__(self):
27
+ return self.name
28
+
29
+
30
+ class EventClassificationManager(models.Manager):
31
+ def get_by_natural_key(self, name):
32
+ return self.get(name=name)
33
+
34
+ class EventClassification(models.Model):
35
+ name = models.CharField(max_length=255, unique=True)
36
+ name_de = models.CharField(max_length=255, blank=True, null=True)
37
+ name_en = models.CharField(max_length=255, blank=True, null=True)
38
+
39
+ objects = EventClassificationManager()
40
+
41
+ def natural_key(self):
42
+ return (self.name,)
43
+
44
+ def __str__(self):
45
+ return self.name
46
+
47
+ def get_choices(self)->List['EventClassificationChoice']:
48
+ choices:List[EventClassificationChoice] = [_ for _ in self.event_classification_choices.all()]
49
+ return choices
50
+
51
+ class EventClassificationChoiceManager(models.Manager):
52
+ def get_by_natural_key(self, name):
53
+ return self.get(name=name)
54
+
55
+ class EventClassificationChoice(models.Model):
56
+ name = models.CharField(max_length=255, unique=True)
57
+ name_de = models.CharField(max_length=255, blank=True, null=True)
58
+ name_en = models.CharField(max_length=255, blank=True, null=True)
59
+ subcategories = models.JSONField(default=dict)
60
+ numerical_descriptors = models.JSONField(default=dict)
61
+
62
+ event_classification = models.ForeignKey(
63
+ EventClassification, on_delete=models.CASCADE,
64
+ related_name='event_classification_choices'
65
+ )
66
+
67
+ objects = EventClassificationChoiceManager()
68
+
69
+ def natural_key(self):
70
+ return (self.name,)
71
+
72
+ def __str__(self):
73
+ return self.name
@@ -0,0 +1,9 @@
1
+ from .examination import Examination
2
+ from .examination_type import ExaminationType
3
+ from .examination_time import ExaminationTime
4
+ from .examination_time_type import ExaminationTimeType
5
+ from .examination_indication import(
6
+ ExaminationIndication,
7
+ ExaminationIndicationClassification,
8
+ ExaminationIndicationClassificationChoice
9
+ )