endoreg-db 0.3.4__py3-none-any.whl → 0.3.6__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.
Files changed (350) hide show
  1. endoreg_db/admin.py +3 -3
  2. endoreg_db/apps.py +6 -6
  3. endoreg_db/data/__init__.py +65 -16
  4. endoreg_db/data/active_model/data.yaml +2 -2
  5. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
  6. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
  7. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
  8. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
  9. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
  10. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
  11. endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
  12. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
  13. endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
  14. endoreg_db/data/case_template/template/base.yaml +8 -0
  15. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
  16. endoreg_db/data/case_template/tmp/_rule_value +13 -0
  17. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
  18. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
  19. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
  20. endoreg_db/data/center/data.yaml +60 -52
  21. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
  22. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
  23. endoreg_db/data/disease/cardiovascular.yaml +37 -0
  24. endoreg_db/data/disease/hepatology.yaml +5 -0
  25. endoreg_db/data/disease/misc.yaml +6 -0
  26. endoreg_db/data/disease/renal.yaml +5 -0
  27. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
  28. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
  29. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
  30. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
  31. endoreg_db/data/distribution/date/patient.yaml +7 -0
  32. endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
  33. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
  34. endoreg_db/data/endoscope_type/data.yaml +10 -10
  35. endoreg_db/data/endoscopy_processor/data.yaml +45 -45
  36. endoreg_db/data/event/cardiology.yaml +28 -0
  37. endoreg_db/data/event/neurology.yaml +14 -0
  38. endoreg_db/data/event/surgery.yaml +13 -0
  39. endoreg_db/data/event/thrombembolism.yaml +20 -0
  40. endoreg_db/data/examination/examinations/data.yaml +65 -16
  41. endoreg_db/data/examination/time/data.yaml +47 -47
  42. endoreg_db/data/examination/time-type/data.yaml +7 -7
  43. endoreg_db/data/examination/type/data.yaml +5 -5
  44. endoreg_db/data/gender/data.yaml +18 -0
  45. endoreg_db/data/information_source/data.yaml +30 -30
  46. endoreg_db/data/information_source/medication.yaml +6 -0
  47. endoreg_db/data/lab_value/cardiac_enzymes.yaml +31 -0
  48. endoreg_db/data/lab_value/coagulation.yaml +49 -0
  49. endoreg_db/data/lab_value/electrolytes.yaml +190 -0
  50. endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -0
  51. endoreg_db/data/lab_value/hematology.yaml +169 -0
  52. endoreg_db/data/lab_value/hormones.yaml +53 -0
  53. endoreg_db/data/lab_value/lipids.yaml +44 -0
  54. endoreg_db/data/lab_value/misc.yaml +30 -0
  55. endoreg_db/data/lab_value/renal_function.yaml +11 -0
  56. endoreg_db/data/label/label/data.yaml +62 -62
  57. endoreg_db/data/label/label-set/data.yaml +17 -17
  58. endoreg_db/data/label/label-type/data.yaml +6 -6
  59. endoreg_db/data/material/material.yaml +91 -0
  60. endoreg_db/data/medication/anticoagulation.yaml +65 -0
  61. endoreg_db/data/medication/tah.yaml +70 -0
  62. endoreg_db/data/medication_indication/anticoagulation.yaml +120 -0
  63. endoreg_db/data/medication_indication_type/data.yaml +11 -0
  64. endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
  65. endoreg_db/data/medication_intake_time/base.yaml +31 -0
  66. endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
  67. endoreg_db/data/medication_schedule/ass.yaml +12 -0
  68. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
  69. endoreg_db/data/model_type/data.yaml +6 -6
  70. endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
  71. endoreg_db/data/pdf_type/data.yaml +28 -28
  72. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
  73. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
  74. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
  75. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
  76. endoreg_db/data/profession/data.yaml +70 -70
  77. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
  78. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
  79. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
  80. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
  81. endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
  82. endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
  83. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
  84. endoreg_db/data/unit/concentration.yaml +92 -0
  85. endoreg_db/data/unit/data.yaml +17 -17
  86. endoreg_db/data/unit/length.yaml +30 -30
  87. endoreg_db/data/unit/misc.yaml +20 -0
  88. endoreg_db/data/unit/rate.yaml +6 -0
  89. endoreg_db/data/unit/time.yaml +13 -0
  90. endoreg_db/data/unit/volume.yaml +35 -26
  91. endoreg_db/data/unit/weight.yaml +37 -30
  92. endoreg_db/data/waste/data.yaml +12 -0
  93. endoreg_db/forms/__init__.py +2 -2
  94. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
  95. endoreg_db/forms/settings/__init__.py +8 -8
  96. endoreg_db/forms/unit.py +5 -5
  97. endoreg_db/management/commands/_load_model_template.py +40 -40
  98. endoreg_db/management/commands/delete_all.py +18 -18
  99. endoreg_db/management/commands/delete_legacy_images.py +19 -19
  100. endoreg_db/management/commands/delete_legacy_videos.py +16 -16
  101. endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
  102. endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
  103. endoreg_db/management/commands/fix_auth_permission.py +20 -20
  104. endoreg_db/management/commands/import_legacy_images.py +94 -94
  105. endoreg_db/management/commands/import_legacy_videos.py +76 -76
  106. endoreg_db/management/commands/load_active_model_data.py +44 -44
  107. endoreg_db/management/commands/load_ai_model_data.py +44 -44
  108. endoreg_db/management/commands/load_base_db_data.py +128 -71
  109. endoreg_db/management/commands/load_center_data.py +42 -42
  110. endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
  111. endoreg_db/management/commands/load_disease_classification_data.py +41 -0
  112. endoreg_db/management/commands/load_disease_data.py +40 -0
  113. endoreg_db/management/commands/load_distribution_data.py +66 -0
  114. endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
  115. endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
  116. endoreg_db/management/commands/load_event_data.py +41 -0
  117. endoreg_db/management/commands/load_examination_data.py +74 -74
  118. endoreg_db/management/commands/load_g_play_data.py +113 -0
  119. endoreg_db/management/commands/load_gender_data.py +44 -0
  120. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +133 -0
  121. endoreg_db/management/commands/load_information_source.py +44 -44
  122. endoreg_db/management/commands/load_lab_value_data.py +50 -0
  123. endoreg_db/management/commands/load_label_data.py +66 -66
  124. endoreg_db/management/commands/load_medication_data.py +41 -0
  125. endoreg_db/management/commands/load_medication_indication_data.py +63 -0
  126. endoreg_db/management/commands/load_medication_indication_type_data.py +41 -0
  127. endoreg_db/management/commands/load_medication_intake_time_data.py +41 -0
  128. endoreg_db/management/commands/load_medication_schedule_data.py +55 -0
  129. endoreg_db/management/commands/load_pdf_type_data.py +60 -60
  130. endoreg_db/management/commands/load_profession_data.py +43 -43
  131. endoreg_db/management/commands/load_report_reader_flag.py +45 -45
  132. endoreg_db/management/commands/load_unit_data.py +45 -45
  133. endoreg_db/management/commands/load_user_groups.py +28 -28
  134. endoreg_db/management/commands/register_ai_model.py +65 -65
  135. endoreg_db/management/commands/reset_celery_schedule.py +9 -9
  136. endoreg_db/migrations/0001_initial.py +582 -582
  137. endoreg_db/migrations/0002_rawvideofile.py +26 -26
  138. endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -18
  139. endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -18
  140. endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -56
  141. endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -25
  142. endoreg_db/migrations/0007_rawvideofile_processor.py +19 -19
  143. endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -18
  144. endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -31
  145. endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -18
  146. endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -18
  147. endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -109
  148. endoreg_db/migrations/0013_rawpdffile.py +31 -31
  149. endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -38
  150. endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -31
  151. endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -18
  152. endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -37
  153. endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -37
  154. endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -42
  155. endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -18
  156. endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -19
  157. endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -19
  158. endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -59
  159. endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -27
  160. endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -0
  161. endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -0
  162. endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -0
  163. endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -0
  164. endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -0
  165. endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -0
  166. endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -0
  167. endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -0
  168. endoreg_db/migrations/0033_medicationindication_sources.py +18 -0
  169. endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -0
  170. endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -0
  171. endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -0
  172. endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -0
  173. endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -0
  174. endoreg_db/migrations/0039_referenceproduct_name.py +19 -0
  175. endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -0
  176. endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -0
  177. endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -0
  178. endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -0
  179. endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -0
  180. endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -0
  181. endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -0
  182. endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -0
  183. endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -0
  184. endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -0
  185. endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -0
  186. endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -0
  187. endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -0
  188. endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -0
  189. endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -0
  190. endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -0
  191. endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -0
  192. endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -0
  193. endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -0
  194. endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -0
  195. endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -0
  196. endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -0
  197. endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -0
  198. endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -0
  199. endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -0
  200. endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -0
  201. endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -0
  202. endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -0
  203. endoreg_db/models/__init__.py +74 -57
  204. endoreg_db/models/ai_model/__init__.py +3 -3
  205. endoreg_db/models/ai_model/active_model.py +9 -9
  206. endoreg_db/models/ai_model/model_meta.py +24 -24
  207. endoreg_db/models/ai_model/model_type.py +25 -25
  208. endoreg_db/models/ai_model/utils.py +8 -8
  209. endoreg_db/models/annotation/__init__.py +1 -1
  210. endoreg_db/models/annotation/binary_classification_annotation_task.py +80 -80
  211. endoreg_db/models/annotation/image_classification.py +26 -26
  212. endoreg_db/models/case_template/__init__.py +6 -0
  213. endoreg_db/models/case_template/case_template.py +81 -0
  214. endoreg_db/models/case_template/case_template_rule.py +276 -0
  215. endoreg_db/models/case_template/case_template_rule_value.py +73 -0
  216. endoreg_db/models/case_template/case_template_type.py +28 -0
  217. endoreg_db/models/center/__init__.py +4 -0
  218. endoreg_db/models/{center.py → center/center.py} +24 -24
  219. endoreg_db/models/center/center_product.py +34 -0
  220. endoreg_db/models/center/center_resource.py +19 -0
  221. endoreg_db/models/center/center_waste.py +11 -0
  222. endoreg_db/models/data_file/__init__.py +5 -5
  223. endoreg_db/models/data_file/base_classes/__init__.py +2 -2
  224. endoreg_db/models/data_file/base_classes/abstract_frame.py +50 -50
  225. endoreg_db/models/data_file/base_classes/abstract_video.py +200 -200
  226. endoreg_db/models/data_file/frame.py +45 -45
  227. endoreg_db/models/data_file/import_classes/__init__.py +31 -31
  228. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +34 -34
  229. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -28
  230. endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -260
  231. endoreg_db/models/data_file/import_classes/raw_pdf.py +188 -185
  232. endoreg_db/models/data_file/import_classes/raw_video.py +343 -343
  233. endoreg_db/models/data_file/metadata/__init__.py +3 -3
  234. endoreg_db/models/data_file/metadata/pdf_meta.py +70 -70
  235. endoreg_db/models/data_file/metadata/sensitive_meta.py +31 -31
  236. endoreg_db/models/data_file/metadata/video_meta.py +132 -131
  237. endoreg_db/models/data_file/report_file.py +89 -89
  238. endoreg_db/models/data_file/video/__init__.py +6 -6
  239. endoreg_db/models/data_file/video/import_meta.py +25 -25
  240. endoreg_db/models/data_file/video/video.py +25 -25
  241. endoreg_db/models/data_file/video_segment.py +107 -107
  242. endoreg_db/models/disease.py +56 -0
  243. endoreg_db/models/emission/__init__.py +1 -0
  244. endoreg_db/models/emission/emission_factor.py +20 -0
  245. endoreg_db/models/event.py +22 -0
  246. endoreg_db/models/examination/__init__.py +3 -3
  247. endoreg_db/models/examination/examination.py +26 -26
  248. endoreg_db/models/examination/examination_time.py +27 -27
  249. endoreg_db/models/examination/examination_time_type.py +24 -24
  250. endoreg_db/models/examination/examination_type.py +18 -18
  251. endoreg_db/models/hardware/__init__.py +1 -1
  252. endoreg_db/models/hardware/endoscope.py +44 -44
  253. endoreg_db/models/hardware/endoscopy_processor.py +143 -143
  254. endoreg_db/models/information_source.py +29 -22
  255. endoreg_db/models/label/label.py +84 -84
  256. endoreg_db/models/laboratory/__init__.py +1 -0
  257. endoreg_db/models/laboratory/lab_value.py +102 -0
  258. endoreg_db/models/legacy_data/__init__.py +3 -3
  259. endoreg_db/models/legacy_data/image.py +34 -34
  260. endoreg_db/models/medication/__init__.py +1 -0
  261. endoreg_db/models/medication/medication.py +148 -0
  262. endoreg_db/models/other/__init__.py +5 -0
  263. endoreg_db/models/other/distribution.py +215 -0
  264. endoreg_db/models/other/material.py +16 -0
  265. endoreg_db/models/other/resource.py +18 -0
  266. endoreg_db/models/other/transport_route.py +21 -0
  267. endoreg_db/models/other/waste.py +20 -0
  268. endoreg_db/models/patient_examination/__init__.py +35 -35
  269. endoreg_db/models/permissions/__init__.py +44 -44
  270. endoreg_db/models/persons/__init__.py +7 -6
  271. endoreg_db/models/persons/examiner/__init__.py +1 -1
  272. endoreg_db/models/persons/examiner/examiner.py +15 -15
  273. endoreg_db/models/persons/examiner/examiner_type.py +1 -1
  274. endoreg_db/models/persons/first_name.py +17 -17
  275. endoreg_db/models/persons/gender.py +22 -0
  276. endoreg_db/models/persons/last_name.py +19 -19
  277. endoreg_db/models/persons/patient/__init__.py +8 -0
  278. endoreg_db/models/persons/patient/case/__init__.py +0 -0
  279. endoreg_db/models/persons/patient/case/case.py +30 -0
  280. endoreg_db/models/persons/patient/patient.py +216 -0
  281. endoreg_db/models/persons/patient/patient_disease.py +16 -0
  282. endoreg_db/models/persons/patient/patient_event.py +22 -0
  283. endoreg_db/models/persons/patient/patient_lab_sample.py +106 -0
  284. endoreg_db/models/persons/patient/patient_lab_value.py +176 -0
  285. endoreg_db/models/persons/patient/patient_medication.py +44 -0
  286. endoreg_db/models/persons/patient/patient_medication_schedule.py +28 -0
  287. endoreg_db/models/persons/person.py +31 -34
  288. endoreg_db/models/persons/portal_user_information.py +27 -29
  289. endoreg_db/models/prediction/__init__.py +1 -1
  290. endoreg_db/models/prediction/image_classification.py +37 -37
  291. endoreg_db/models/prediction/video_prediction_meta.py +244 -244
  292. endoreg_db/models/product/__init__.py +5 -0
  293. endoreg_db/models/product/product.py +97 -0
  294. endoreg_db/models/product/product_group.py +19 -0
  295. endoreg_db/models/product/product_material.py +24 -0
  296. endoreg_db/models/product/product_weight.py +26 -0
  297. endoreg_db/models/product/reference_product.py +99 -0
  298. endoreg_db/models/questionnaires/__init__.py +114 -114
  299. endoreg_db/models/quiz/__init__.py +2 -0
  300. endoreg_db/models/quiz/quiz_answer.py +41 -0
  301. endoreg_db/models/quiz/quiz_question.py +54 -0
  302. endoreg_db/models/report_reader/__init__.py +1 -1
  303. endoreg_db/models/report_reader/report_reader_config.py +53 -53
  304. endoreg_db/models/report_reader/report_reader_flag.py +19 -19
  305. endoreg_db/models/rules/__init__.py +5 -0
  306. endoreg_db/models/rules/rule.py +24 -0
  307. endoreg_db/models/rules/rule_applicator.py +224 -0
  308. endoreg_db/models/rules/rule_attribute_dtype.py +19 -0
  309. endoreg_db/models/rules/rule_type.py +22 -0
  310. endoreg_db/models/rules/ruleset.py +19 -0
  311. endoreg_db/models/unit.py +21 -19
  312. endoreg_db/queries/__init__.py +4 -4
  313. endoreg_db/queries/annotations/__init__.py +2 -2
  314. endoreg_db/queries/annotations/legacy.py +159 -159
  315. endoreg_db/queries/get/__init__.py +5 -5
  316. endoreg_db/queries/get/center.py +42 -42
  317. endoreg_db/queries/get/model.py +13 -13
  318. endoreg_db/queries/get/patient.py +14 -14
  319. endoreg_db/queries/get/patient_examination.py +20 -20
  320. endoreg_db/queries/get/report_file.py +33 -33
  321. endoreg_db/queries/get/video.py +31 -31
  322. endoreg_db/serializers/__init__.py +9 -9
  323. endoreg_db/serializers/ai_model.py +18 -18
  324. endoreg_db/serializers/annotation.py +17 -17
  325. endoreg_db/serializers/center.py +11 -11
  326. endoreg_db/serializers/examination.py +32 -32
  327. endoreg_db/serializers/frame.py +13 -13
  328. endoreg_db/serializers/hardware.py +20 -20
  329. endoreg_db/serializers/label.py +22 -22
  330. endoreg_db/serializers/patient.py +10 -10
  331. endoreg_db/serializers/prediction.py +15 -15
  332. endoreg_db/serializers/report_file.py +7 -7
  333. endoreg_db/serializers/video.py +27 -27
  334. endoreg_db/tests.py +3 -3
  335. endoreg_db/utils/cropping.py +28 -28
  336. endoreg_db/utils/dataloader.py +92 -185
  337. endoreg_db/utils/file_operations.py +30 -30
  338. endoreg_db/utils/hashs.py +33 -33
  339. endoreg_db/utils/legacy_ocr.py +201 -201
  340. endoreg_db/utils/ocr.py +197 -197
  341. endoreg_db/utils/uuid.py +4 -4
  342. endoreg_db/utils/video_metadata.py +87 -87
  343. endoreg_db/views.py +3 -3
  344. {endoreg_db-0.3.4.dist-info → endoreg_db-0.3.6.dist-info}/LICENSE +674 -674
  345. {endoreg_db-0.3.4.dist-info → endoreg_db-0.3.6.dist-info}/METADATA +2 -2
  346. endoreg_db-0.3.6.dist-info/RECORD +357 -0
  347. {endoreg_db-0.3.4.dist-info → endoreg_db-0.3.6.dist-info}/WHEEL +1 -1
  348. endoreg_db/models/persons/patient.py +0 -58
  349. endoreg_db/models.py +0 -3
  350. endoreg_db-0.3.4.dist-info/RECORD +0 -185
@@ -0,0 +1,102 @@
1
+ from django.db import models
2
+ import warnings
3
+
4
+ LANG = "de"
5
+
6
+ class LabValueManager(models.Manager):
7
+ def get_by_natural_key(self, name):
8
+ return self.get(name=name)
9
+
10
+ class LabValue(models.Model):
11
+ name = models.CharField(max_length=255, unique=True)
12
+ name_de = models.CharField(max_length=255, blank=True, null=True)
13
+ name_en = models.CharField(max_length=255, blank=True, null=True)
14
+ abbreviation = models.CharField(max_length=10, blank=True, null=True)
15
+ default_unit = models.ForeignKey('Unit', on_delete=models.CASCADE, blank=True, null=True)
16
+ numeric_precision = models.IntegerField(default=3)
17
+ default_single_categorical_value_distribution = models.ForeignKey(
18
+ 'SingleCategoricalValueDistribution',
19
+ on_delete=models.CASCADE,
20
+ blank=True, null=True,
21
+ related_name='default_single_categorical_value_distribution'
22
+ )
23
+ default_numerical_value_distribution = models.ForeignKey(
24
+ 'NumericValueDistribution',
25
+ on_delete=models.CASCADE,
26
+ blank=True, null=True,
27
+ related_name='default_numerical_value_distribution'
28
+ )
29
+ default_multiple_categorical_value_distribution = models.ForeignKey(
30
+ 'MultipleCategoricalValueDistribution',
31
+ on_delete=models.CASCADE,
32
+ blank=True, null=True,
33
+ related_name='default_multiple_categorical_value_distribution'
34
+ )
35
+ default_date_value_distribution = models.ForeignKey(
36
+ 'DateValueDistribution',
37
+ on_delete=models.CASCADE,
38
+ blank=True, null=True,
39
+ related_name='default_date_value_distribution'
40
+ )
41
+ default_normal_range = models.JSONField(blank=True, null=True)
42
+ normal_range_age_dependent = models.BooleanField(default=False)
43
+ normal_range_gender_dependent = models.BooleanField(default=False)
44
+ normal_range_special_case = models.BooleanField(default=False)
45
+ objects = LabValueManager()
46
+
47
+ def natural_key(self):
48
+ return (self.name,)
49
+
50
+ def __str__(self):
51
+ return self.name
52
+
53
+ def get_default_default_distribution(self):
54
+ if self.default_single_categorical_value_distribution:
55
+ return self.default_single_categorical_value_distribution
56
+ elif self.default_numerical_value_distribution:
57
+ return self.default_numerical_value_distribution
58
+ elif self.default_multiple_categorical_value_distribution:
59
+ return self.default_multiple_categorical_value_distribution
60
+ elif self.default_date_value_distribution:
61
+ return self.default_date_value_distribution
62
+ else:
63
+ warnings.warn("No default distribution set for lab value")
64
+ return None
65
+
66
+ def get_normal_range(self, age=None, gender=None):
67
+ age_dependent = self.normal_range_age_dependent
68
+ gender_dependent = self.normal_range_gender_dependent
69
+ special_case = self.normal_range_special_case
70
+
71
+ min_value = None
72
+ max_value = None
73
+
74
+ if not age_dependent and \
75
+ not gender_dependent and \
76
+ not special_case:
77
+ min_value = self.default_normal_range.get('min', None)
78
+ max_value = self.default_normal_range.get('max', None)
79
+
80
+ if age_dependent:
81
+ # get normal range for age)
82
+ warnings.warn("Age dependent normal range not implemented yet")
83
+ pass
84
+
85
+ if gender_dependent:
86
+ if not gender:
87
+ warnings.warn("Calling get_normal_range with gender_dependent=True requires gender to be set, choosing by random")
88
+ # set gender to either "male" or "female"
89
+ from random import choice
90
+ choices = ["male", "female"]
91
+ gender = choice(choices)
92
+
93
+ default_range_dict = self.default_normal_range.get(gender, {})
94
+ min_value = default_range_dict.get('min', None)
95
+ max_value = default_range_dict.get('max', None)
96
+
97
+ if special_case:
98
+ # get normal range for special case
99
+ warnings.warn("Special case normal range not implemented yet")
100
+
101
+ return min_value, max_value
102
+
@@ -1,3 +1,3 @@
1
- from ..data_file.frame import LegacyFrame
2
- from .image import LegacyImage
3
- from ..data_file.video import LegacyVideo
1
+ from ..data_file.frame import LegacyFrame
2
+ from .image import LegacyImage
3
+ from ..data_file.video import LegacyVideo
@@ -1,34 +1,34 @@
1
- from django.db import models
2
- from ..label.label import Label
3
- from ..annotation.image_classification import ImageClassificationAnnotation
4
-
5
- class LegacyImage(models.Model):
6
- # Add any other fields you need to store frame-related information
7
- image = models.ImageField(upload_to="legacy_images") # Or some other field type, depending on how you're storing the frame
8
- suffix = models.CharField(max_length=255)
9
- # ImageClassificationAnnotation has a foreign key to this model (related name: image_classification_annotations)
10
-
11
- def get_classification_annotations(self):
12
- """
13
- Get all image classification annotations for this image.
14
- """
15
- return ImageClassificationAnnotation.objects.filter(legacy_image=self)
16
-
17
- def get_classification_annotations_by_label(self, label:Label):
18
- """
19
- Get all image classification annotations for this image with the given label.
20
- """
21
- return ImageClassificationAnnotation.objects.filter(legacy_image=self, label=label)
22
-
23
- def get_classification_annotations_by_value(self, value:bool):
24
- """
25
- Get all image classification annotations for this image with the given value.
26
- """
27
- return ImageClassificationAnnotation.objects.filter(legacy_image=self, value=value)
28
-
29
- def get_classification_annotations_by_label_and_value(self, label:Label, value:bool):
30
- """
31
- Get all image classification annotations for this image with the given label and value.
32
- """
33
- return ImageClassificationAnnotation.objects.filter(legacy_image=self, label=label, value=value)
34
-
1
+ from django.db import models
2
+ from ..label.label import Label
3
+ from ..annotation.image_classification import ImageClassificationAnnotation
4
+
5
+ class LegacyImage(models.Model):
6
+ # Add any other fields you need to store frame-related information
7
+ image = models.ImageField(upload_to="legacy_images") # Or some other field type, depending on how you're storing the frame
8
+ suffix = models.CharField(max_length=255)
9
+ # ImageClassificationAnnotation has a foreign key to this model (related name: image_classification_annotations)
10
+
11
+ def get_classification_annotations(self):
12
+ """
13
+ Get all image classification annotations for this image.
14
+ """
15
+ return ImageClassificationAnnotation.objects.filter(legacy_image=self)
16
+
17
+ def get_classification_annotations_by_label(self, label:Label):
18
+ """
19
+ Get all image classification annotations for this image with the given label.
20
+ """
21
+ return ImageClassificationAnnotation.objects.filter(legacy_image=self, label=label)
22
+
23
+ def get_classification_annotations_by_value(self, value:bool):
24
+ """
25
+ Get all image classification annotations for this image with the given value.
26
+ """
27
+ return ImageClassificationAnnotation.objects.filter(legacy_image=self, value=value)
28
+
29
+ def get_classification_annotations_by_label_and_value(self, label:Label, value:bool):
30
+ """
31
+ Get all image classification annotations for this image with the given label and value.
32
+ """
33
+ return ImageClassificationAnnotation.objects.filter(legacy_image=self, label=label, value=value)
34
+
@@ -0,0 +1 @@
1
+ from .medication import *
@@ -0,0 +1,148 @@
1
+ from django.db import models
2
+
3
+ class MedicationManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ class Medication(models.Model):
8
+ name = models.CharField(max_length=255, unique=True)
9
+ name_de = models.CharField(max_length=255, blank=True, null=True)
10
+ name_en = models.CharField(max_length=255, blank=True, null=True)
11
+ adapt_to_renal_function = models.BooleanField(default = False)
12
+ adapt_to_hepatic_function = models.BooleanField(default=False)
13
+ adapt_to_indication = models.BooleanField(default=False)
14
+ adapt_to_age = models.BooleanField(default=False)
15
+ adapt_to_weight = models.BooleanField(default=False)
16
+ adapt_to_risk = models.BooleanField(default=False)
17
+ default_unit = models.ForeignKey('Unit', on_delete=models.CASCADE)
18
+
19
+
20
+ objects = MedicationManager()
21
+
22
+ def natural_key(self):
23
+ return (self.name,)
24
+
25
+ def __str__(self):
26
+ return self.name
27
+
28
+ class MedicationScheduleManager(models.Manager):
29
+ def get_by_natural_key(self, name):
30
+ return self.get(name=name)
31
+
32
+ class MedicationSchedule(models.Model):
33
+ name = models.CharField(max_length=255)
34
+ name_de = models.CharField(max_length=255, blank=True, null=True)
35
+ name_en = models.CharField(max_length=255, blank=True, null=True)
36
+ description = models.TextField(blank=True, null=True)
37
+ medication = models.ForeignKey("Medication", on_delete=models.CASCADE)
38
+ unit = models.ForeignKey("Unit", on_delete=models.CASCADE)
39
+ therapy_duration_d = models.FloatField(blank=True, null=True)
40
+ dose = models.FloatField()
41
+ intake_times = models.ManyToManyField(
42
+ "MedicationIntakeTime",
43
+ )
44
+
45
+ objects = MedicationScheduleManager()
46
+
47
+ def natural_key(self):
48
+ return (self.name,)
49
+
50
+ def __str__(self):
51
+ return self.name
52
+
53
+
54
+ class MedicationIntakeTimeManager(models.Manager):
55
+ def get_by_natural_key(self, name):
56
+ return self.get(name=name)
57
+
58
+ class MedicationIntakeTime(models.Model):
59
+ name = models.CharField(max_length=255)
60
+ name_de = models.CharField(max_length=255, blank=True, null=True)
61
+ name_en = models.CharField(max_length=255, blank=True, null=True)
62
+ repeats = models.CharField(max_length=20, default = "daily")
63
+ time = models.TimeField()
64
+
65
+ objects = MedicationIntakeTimeManager()
66
+
67
+ def natural_key(self):
68
+ return (self.name,)
69
+
70
+ def __str__(self):
71
+ return self.name
72
+
73
+ # IMPLEMENT MEDICATION INDICATION TYPE
74
+ class MedicationIndicationTypeManager(models.Manager):
75
+ def get_by_natural_key(self, name):
76
+ return self.get(name=name)
77
+
78
+ class MedicationIndicationType(models.Model):
79
+ name = models.CharField(max_length=255, unique=True)
80
+ name_de = models.CharField(max_length=255, blank=True, null=True)
81
+ name_en = models.CharField(max_length=255, blank=True, null=True)
82
+
83
+ objects = MedicationIndicationTypeManager()
84
+
85
+ def natural_key(self):
86
+ return (self.name,)
87
+
88
+ def __str__(self):
89
+ return self.name
90
+
91
+ @classmethod
92
+ def get_random_indication_by_type(cls, name) -> "MedicationIndication":
93
+ return cls.objects.get(name=name).medication_indications.order_by('?').first()
94
+
95
+
96
+ def get_random_medication_indication(self):
97
+ from endoreg_db.models import MedicationIndication
98
+ return MedicationIndication.objects.filter(indication_type=self).order_by('?').first()
99
+
100
+
101
+ class MedicationIndicationManager(models.Manager):
102
+ def get_by_natural_key(self, name):
103
+ return self.get(name=name)
104
+
105
+ class MedicationIndication(models.Model):
106
+ name = models.CharField(max_length=255, unique=True)
107
+ indication_type = models.ForeignKey(
108
+ "MedicationIndicationType", on_delete=models.CASCADE, related_name="medication_indications"
109
+ )
110
+ medication_schedules = models.ManyToManyField(
111
+ "MedicationSchedule"
112
+ )
113
+ diseases = models.ManyToManyField(
114
+ "Disease"
115
+ )
116
+ events = models.ManyToManyField(
117
+ "Event"
118
+ )
119
+ classification_choices = models.ManyToManyField(
120
+ "DiseaseClassificationChoice"
121
+ )
122
+ sources = models.ManyToManyField(
123
+ "InformationSource"
124
+ )
125
+
126
+ def get_indication_links(self):
127
+ links = {
128
+ "medication_schedules": self.medication_schedules,
129
+ "diseases": self.diseases,
130
+ "events": self.events,
131
+ "classification_choices": self.classification_choices
132
+ }
133
+
134
+ objects = MedicationIndicationManager()
135
+
136
+ def natural_key(self):
137
+ return (self.name,)
138
+
139
+ def __str__(self):
140
+ return self.name
141
+
142
+ def create_patient_medication_schedules(self, patient):
143
+ from endoreg_db.models import PatientMedicationSchedule
144
+ for medication_schedule in self.medication_schedules.all():
145
+ PatientMedicationSchedule.objects.create(
146
+ patient=patient,
147
+ medication_schedule=medication_schedule
148
+ )
@@ -0,0 +1,5 @@
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 *
@@ -0,0 +1,215 @@
1
+ from django.db import models
2
+ import numpy as np
3
+ from scipy.stats import skewnorm
4
+
5
+ class BaseValueDistribution(models.Model):
6
+ """
7
+ Abstract base class for value distributions.
8
+ """
9
+ name = models.CharField(max_length=100)
10
+
11
+ class Meta:
12
+ abstract = True
13
+
14
+ def generate_value(self):
15
+ """
16
+ Generate a value based on the distribution rules.
17
+ Must be implemented by subclasses.
18
+ """
19
+ raise NotImplementedError("Subclasses must implement this method")
20
+
21
+ def natural_key(self):
22
+ return (self.name,)
23
+
24
+ class NumericValueDistributionManager(models.Manager):
25
+ def get_by_natural_key(self, name):
26
+ return self.get(name=name)
27
+
28
+ class NumericValueDistribution(BaseValueDistribution):
29
+ """
30
+ Numeric value distribution model.
31
+ Supports uniform, normal, and skewed normal distributions with hard limits.
32
+ """
33
+ objects = NumericValueDistributionManager()
34
+ DISTRIBUTION_CHOICES = [
35
+ ('uniform', 'Uniform'),
36
+ ('normal', 'Normal'),
37
+ ('skewed_normal', 'Skewed Normal'),
38
+ ]
39
+
40
+ distribution_type = models.CharField(max_length=20, choices=DISTRIBUTION_CHOICES)
41
+ min_value = models.FloatField()
42
+ max_value = models.FloatField()
43
+ mean = models.FloatField(null=True, blank=True)
44
+ std_dev = models.FloatField(null=True, blank=True)
45
+ skewness = models.FloatField(null=True, blank=True)
46
+
47
+ def generate_value(self):
48
+ if self.distribution_type == 'uniform':
49
+ return np.random.uniform(self.min_value, self.max_value)
50
+ elif self.distribution_type == 'normal':
51
+ value = np.random.normal(self.mean, self.std_dev)
52
+ return np.clip(value, self.min_value, self.max_value)
53
+ elif self.distribution_type == 'skewed_normal':
54
+ value = skewnorm.rvs(a=self.skewness, loc=self.mean, scale=self.std_dev)
55
+ return np.clip(value, self.min_value, self.max_value)
56
+ else:
57
+ raise ValueError("Unsupported distribution type")
58
+
59
+
60
+ class SingleCategoricalValueDistributionManager(models.Manager):
61
+ def get_by_natural_key(self, name):
62
+ return self.get(name=name)
63
+
64
+ class SingleCategoricalValueDistribution(BaseValueDistribution):
65
+ """
66
+ Single categorical value distribution model.
67
+ Assigns a single value based on specified probabilities.
68
+ """
69
+ objects = SingleCategoricalValueDistributionManager()
70
+ categories = models.JSONField() # { "category": "probability", ... }
71
+
72
+ def generate_value(self):
73
+ categories, probabilities = zip(*self.categories.items())
74
+ return np.random.choice(categories, p=probabilities)
75
+
76
+
77
+ class MultipleCategoricalValueDistributionManager(models.Manager):
78
+ def get_by_natural_key(self, name):
79
+ return self.get(name=name)
80
+
81
+ class MultipleCategoricalValueDistribution(BaseValueDistribution):
82
+ """
83
+ Multiple categorical value distribution model.
84
+ Assigns a specific number or varying number of values based on probabilities.
85
+ """
86
+ objects = MultipleCategoricalValueDistributionManager()
87
+ categories = models.JSONField() # { "category": "probability", ... }
88
+ min_count = models.IntegerField()
89
+ max_count = models.IntegerField()
90
+ count_distribution_type = models.CharField(max_length=20, choices=[('uniform', 'Uniform'), ('normal', 'Normal')])
91
+ count_mean = models.FloatField(null=True, blank=True)
92
+ count_std_dev = models.FloatField(null=True, blank=True)
93
+
94
+ def generate_value(self):
95
+ if self.count_distribution_type == 'uniform':
96
+ count = np.random.randint(self.min_count, self.max_count + 1)
97
+ elif self.count_distribution_type == 'normal':
98
+ count = int(np.random.normal(self.count_mean, self.count_std_dev))
99
+ count = np.clip(count, self.min_count, self.max_count)
100
+ else:
101
+ raise ValueError("Unsupported count distribution type")
102
+
103
+ categories, probabilities = zip(*self.categories.items())
104
+ return list(np.random.choice(categories, size=count, p=probabilities))
105
+
106
+
107
+ class DateValueDistributionManager(models.Manager):
108
+ def get_by_natural_key(self, name):
109
+ return self.get(name=name)
110
+
111
+ from datetime import date, timedelta
112
+ class DateValueDistribution(BaseValueDistribution):
113
+ """
114
+ Assign date values based on specified distribution.
115
+ Expects distribution_type (uniform, normal) and mode (date, timedelta) and based on this either
116
+ date_min, date_max, date_mean, date_std_dev or
117
+ timedelta_days_min, timedelta_days_max, timedelta_days_mean, timedelta_days_std_dev
118
+ """
119
+ objects = DateValueDistributionManager()
120
+ name = models.CharField(max_length=100)
121
+ name_de = models.CharField(max_length=100, blank=True, null=True)
122
+ name_en = models.CharField(max_length=100, blank=True, null=True)
123
+ description = models.TextField(blank=True, null=True)
124
+ DISTRIBUTION_CHOICES = [
125
+ ('uniform', 'Uniform'),
126
+ ('normal', 'Normal'),
127
+ ]
128
+ MODE_CHOICES = [
129
+ ('date', 'Date'),
130
+ ('timedelta', 'Timedelta'),
131
+ ]
132
+
133
+ distribution_type = models.CharField(max_length=20, choices=DISTRIBUTION_CHOICES)
134
+ mode = models.CharField(max_length=20, choices=MODE_CHOICES)
135
+
136
+ # Date-related fields
137
+ date_min = models.DateField(blank=True, null=True)
138
+ date_max = models.DateField(blank=True, null=True)
139
+ date_mean = models.DateField(blank=True, null=True)
140
+ date_std_dev = models.IntegerField(blank=True, null=True) # Standard deviation in days
141
+
142
+ # Timedelta-related fields
143
+ timedelta_days_min = models.IntegerField(blank=True, null=True)
144
+ timedelta_days_max = models.IntegerField(blank=True, null=True)
145
+ timedelta_days_mean = models.IntegerField(blank=True, null=True)
146
+ timedelta_days_std_dev = models.IntegerField(blank=True, null=True)
147
+
148
+ def generate_value(self):
149
+ if self.mode == 'date':
150
+ return self._generate_date_value()
151
+ elif self.mode == 'timedelta':
152
+ return self._generate_timedelta_value()
153
+ else:
154
+ raise ValueError("Unsupported mode")
155
+
156
+ def _generate_date_value(self):
157
+ #UNTESTED
158
+ if self.distribution_type == 'uniform':
159
+ start_date = self.date_min.toordinal()
160
+ end_date = self.date_max.toordinal()
161
+ random_ordinal = np.random.randint(start_date, end_date)
162
+ return date.fromordinal(random_ordinal)
163
+ elif self.distribution_type == 'normal':
164
+ mean_ordinal = self.date_mean.toordinal()
165
+ std_dev_days = self.date_std_dev
166
+ random_ordinal = int(np.random.normal(mean_ordinal, std_dev_days))
167
+ random_ordinal = np.clip(random_ordinal, self.date_min.toordinal(), self.date_max.toordinal())
168
+ return date.fromordinal(random_ordinal)
169
+ else:
170
+ raise ValueError("Unsupported distribution type")
171
+
172
+ def _generate_timedelta_value(self):
173
+ if self.distribution_type == 'uniform':
174
+ random_days = np.random.randint(self.timedelta_days_min, self.timedelta_days_max + 1)
175
+
176
+
177
+ elif self.distribution_type == 'normal':
178
+ random_days = int(np.random.normal(self.timedelta_days_mean, self.timedelta_days_std_dev))
179
+ random_days = np.clip(random_days, self.timedelta_days_min, self.timedelta_days_max)
180
+
181
+ else:
182
+ raise ValueError("Unsupported distribution type")
183
+
184
+ current_date = date.today()
185
+ generated_date = current_date - timedelta(days=random_days)
186
+ print(generated_date)
187
+ return(generated_date)
188
+
189
+ # Example Usage
190
+ # Numeric distribution for age
191
+ # age_distribution = NumericValueDistribution.objects.create(
192
+ # name='Age Distribution',
193
+ # distribution_type='normal',
194
+ # min_value=0,
195
+ # max_value=100,
196
+ # mean=50,
197
+ # std_dev=15
198
+ # )
199
+
200
+ # # Single categorical distribution for gender
201
+ # gender_distribution = SingleCategoricalValueDistribution.objects.create(
202
+ # name='Gender Distribution',
203
+ # categories={'male': 0.5, 'female': 0.5}
204
+ # )
205
+
206
+ # # Multiple categorical distribution for symptoms
207
+ # symptoms_distribution = MultipleCategoricalValueDistribution.objects.create(
208
+ # name='Symptoms Distribution',
209
+ # categories={'fever': 0.3, 'cough': 0.4, 'fatigue': 0.2, 'nausea': 0.1},
210
+ # min_count=1,
211
+ # max_count=3,
212
+ # count_distribution_type='normal',
213
+ # count_mean=2,
214
+ # count_std_dev=0.5
215
+ # )
@@ -0,0 +1,16 @@
1
+ from django.db import models
2
+
3
+ class MaterialManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ class Material(models.Model):
8
+ objects = MaterialManager()
9
+
10
+ name = models.CharField(max_length=255)
11
+ name_de = models.CharField(max_length=255, null=True)
12
+ name_en = models.CharField(max_length=255, null=True)
13
+ emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
14
+
15
+ def natural_key(self):
16
+ return (self.name,)
@@ -0,0 +1,18 @@
1
+ from django.db import models
2
+
3
+ class ResourceManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ class Resource(models.Model):
8
+ objects = ResourceManager()
9
+
10
+ name = models.CharField(max_length=255)
11
+ name_de = models.CharField(max_length=255, null=True)
12
+ name_en = models.CharField(max_length=255, null=True)
13
+
14
+ def natural_key(self):
15
+ return (self.name,)
16
+
17
+ def __str__(self):
18
+ return self.name
@@ -0,0 +1,21 @@
1
+ from django.db import models
2
+
3
+ class TransportRouteManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ class TransportRoute(models.Model):
8
+ objects = TransportRouteManager()
9
+
10
+ distance = models.FloatField()
11
+ name = models.CharField(max_length=255)
12
+ name_de = models.CharField(max_length=255, null=True)
13
+ name_en = models.CharField(max_length=255, null=True)
14
+ emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
15
+ unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
16
+
17
+ def natural_key(self):
18
+ return (self.name,)
19
+
20
+ def __str__(self):
21
+ return self.name
@@ -0,0 +1,20 @@
1
+ from django.db import models
2
+
3
+ class WasteManager(models.Manager):
4
+ def get_by_natural_key(self, name):
5
+ return self.get(name=name)
6
+
7
+ class Waste(models.Model):
8
+ objects = WasteManager()
9
+
10
+ name = models.CharField(max_length=255)
11
+ name_de = models.CharField(max_length=255, null=True)
12
+ name_en = models.CharField(max_length=255, null=True)
13
+ # emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
14
+
15
+ def natural_key(self):
16
+ return (self.name,)
17
+
18
+ def __str__(self):
19
+ return self.name
20
+