endoreg-db 0.3.6__py3-none-any.whl → 0.3.7__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 (347) hide show
  1. endoreg_db/admin.py +3 -3
  2. endoreg_db/apps.py +6 -6
  3. endoreg_db/data/__init__.py +67 -64
  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 -167
  6. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +7 -7
  7. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +8 -8
  8. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +22 -22
  9. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +18 -18
  10. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +18 -18
  11. endoreg_db/data/case_template/rule/19_create_patient.yaml +16 -16
  12. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -35
  13. endoreg_db/data/case_template/rule_value_type/base_types.yaml +58 -58
  14. endoreg_db/data/case_template/template/base.yaml +7 -7
  15. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +2 -2
  16. endoreg_db/data/case_template/tmp/_rule_value +13 -13
  17. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -21
  18. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +9 -9
  19. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +6 -6
  20. endoreg_db/data/center/data.yaml +59 -59
  21. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
  22. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
  23. endoreg_db/data/disease/cardiovascular.yaml +37 -37
  24. endoreg_db/data/disease/hepatology.yaml +4 -4
  25. endoreg_db/data/disease/misc.yaml +5 -5
  26. endoreg_db/data/disease/renal.yaml +4 -4
  27. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +5 -5
  28. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
  29. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +40 -40
  30. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +19 -19
  31. endoreg_db/data/distribution/date/patient.yaml +6 -6
  32. endoreg_db/data/distribution/single_categorical/patient.yaml +6 -6
  33. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -132
  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 +27 -27
  37. endoreg_db/data/event/neurology.yaml +13 -13
  38. endoreg_db/data/event/surgery.yaml +12 -12
  39. endoreg_db/data/event/thrombembolism.yaml +19 -19
  40. endoreg_db/data/examination/examinations/data.yaml +65 -65
  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 -18
  45. endoreg_db/data/information_source/data.yaml +30 -30
  46. endoreg_db/data/information_source/medication.yaml +5 -5
  47. endoreg_db/data/lab_value/cardiac_enzymes.yaml +30 -30
  48. endoreg_db/data/lab_value/coagulation.yaml +48 -48
  49. endoreg_db/data/lab_value/electrolytes.yaml +189 -189
  50. endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -121
  51. endoreg_db/data/lab_value/hematology.yaml +169 -169
  52. endoreg_db/data/lab_value/hormones.yaml +53 -53
  53. endoreg_db/data/lab_value/lipids.yaml +44 -44
  54. endoreg_db/data/lab_value/misc.yaml +30 -30
  55. endoreg_db/data/lab_value/renal_function.yaml +10 -10
  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/medication/anticoagulation.yaml +64 -64
  60. endoreg_db/data/medication/tah.yaml +69 -69
  61. endoreg_db/data/medication_indication/anticoagulation.yaml +120 -120
  62. endoreg_db/data/medication_indication_type/data.yaml +10 -10
  63. endoreg_db/data/medication_indication_type/thrombembolism.yaml +40 -40
  64. endoreg_db/data/medication_intake_time/base.yaml +30 -30
  65. endoreg_db/data/medication_schedule/apixaban.yaml +94 -94
  66. endoreg_db/data/medication_schedule/ass.yaml +12 -12
  67. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -26
  68. endoreg_db/data/model_type/data.yaml +6 -6
  69. endoreg_db/data/network_device/data.yaml +17 -0
  70. endoreg_db/data/network_device_type/data.yaml +8 -0
  71. endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
  72. endoreg_db/data/pdf_type/data.yaml +28 -28
  73. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -66
  74. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -33
  75. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -308
  76. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -88
  77. endoreg_db/data/profession/data.yaml +70 -70
  78. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
  79. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
  80. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
  81. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
  82. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
  83. endoreg_db/data/unit/concentration.yaml +92 -92
  84. endoreg_db/data/unit/data.yaml +17 -17
  85. endoreg_db/data/unit/length.yaml +30 -30
  86. endoreg_db/data/unit/misc.yaml +19 -19
  87. endoreg_db/data/unit/rate.yaml +5 -5
  88. endoreg_db/data/unit/time.yaml +12 -12
  89. endoreg_db/data/unit/volume.yaml +35 -35
  90. endoreg_db/data/unit/weight.yaml +37 -37
  91. endoreg_db/data/waste/data.yaml +11 -11
  92. endoreg_db/forms/__init__.py +2 -2
  93. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
  94. endoreg_db/forms/settings/__init__.py +8 -8
  95. endoreg_db/forms/unit.py +5 -5
  96. endoreg_db/management/commands/_load_model_template.py +40 -40
  97. endoreg_db/management/commands/delete_all.py +18 -18
  98. endoreg_db/management/commands/delete_legacy_images.py +19 -19
  99. endoreg_db/management/commands/delete_legacy_videos.py +16 -16
  100. endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
  101. endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
  102. endoreg_db/management/commands/fix_auth_permission.py +20 -20
  103. endoreg_db/management/commands/import_legacy_images.py +94 -94
  104. endoreg_db/management/commands/import_legacy_videos.py +76 -76
  105. endoreg_db/management/commands/load_active_model_data.py +44 -44
  106. endoreg_db/management/commands/load_ai_model_data.py +44 -44
  107. endoreg_db/management/commands/load_base_db_data.py +132 -128
  108. endoreg_db/management/commands/load_center_data.py +42 -42
  109. endoreg_db/management/commands/load_disease_classification_choices_data.py +40 -40
  110. endoreg_db/management/commands/load_disease_classification_data.py +40 -40
  111. endoreg_db/management/commands/load_disease_data.py +39 -39
  112. endoreg_db/management/commands/load_distribution_data.py +65 -65
  113. endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
  114. endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
  115. endoreg_db/management/commands/load_event_data.py +40 -40
  116. endoreg_db/management/commands/load_examination_data.py +74 -74
  117. endoreg_db/management/commands/load_g_play_data.py +112 -112
  118. endoreg_db/management/commands/load_gender_data.py +43 -43
  119. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -132
  120. endoreg_db/management/commands/load_information_source.py +44 -44
  121. endoreg_db/management/commands/load_lab_value_data.py +49 -49
  122. endoreg_db/management/commands/load_label_data.py +66 -66
  123. endoreg_db/management/commands/load_medication_data.py +40 -40
  124. endoreg_db/management/commands/load_medication_indication_data.py +62 -62
  125. endoreg_db/management/commands/load_medication_indication_type_data.py +40 -40
  126. endoreg_db/management/commands/load_medication_intake_time_data.py +40 -40
  127. endoreg_db/management/commands/load_medication_schedule_data.py +54 -54
  128. endoreg_db/management/commands/load_network_data.py +49 -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 -42
  161. endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -166
  162. endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -38
  163. endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -18
  164. endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -75
  165. endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -101
  166. endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -38
  167. endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -18
  168. endoreg_db/migrations/0033_medicationindication_sources.py +18 -18
  169. endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -20
  170. endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -18
  171. endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -20
  172. endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -18
  173. endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -164
  174. endoreg_db/migrations/0039_referenceproduct_name.py +19 -19
  175. endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -50
  176. endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -40
  177. endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -74
  178. endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -23
  179. endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -23
  180. endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -19
  181. endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -18
  182. endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -18
  183. endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -22
  184. endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -17
  185. endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -18
  186. endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -27
  187. endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -18
  188. endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -38
  189. endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -69
  190. endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -59
  191. endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -32
  192. endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -72
  193. endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -28
  194. endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -18
  195. endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -44
  196. endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -24
  197. endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -18
  198. endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -18
  199. endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -23
  200. endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -58
  201. endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -29
  202. endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -19
  203. endoreg_db/models/__init__.py +75 -74
  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 +5 -5
  213. endoreg_db/models/case_template/case_template.py +81 -81
  214. endoreg_db/models/case_template/case_template_rule.py +276 -276
  215. endoreg_db/models/case_template/case_template_rule_value.py +73 -73
  216. endoreg_db/models/case_template/case_template_type.py +27 -27
  217. endoreg_db/models/center/__init__.py +4 -4
  218. endoreg_db/models/center/center.py +24 -24
  219. endoreg_db/models/center/center_product.py +33 -33
  220. endoreg_db/models/center/center_resource.py +18 -18
  221. endoreg_db/models/center/center_waste.py +10 -10
  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 -188
  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 -132
  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 +55 -55
  243. endoreg_db/models/emission/emission_factor.py +19 -19
  244. endoreg_db/models/event.py +21 -21
  245. endoreg_db/models/examination/__init__.py +3 -3
  246. endoreg_db/models/examination/examination.py +26 -26
  247. endoreg_db/models/examination/examination_time.py +27 -27
  248. endoreg_db/models/examination/examination_time_type.py +24 -24
  249. endoreg_db/models/examination/examination_type.py +18 -18
  250. endoreg_db/models/hardware/__init__.py +1 -1
  251. endoreg_db/models/hardware/endoscope.py +44 -44
  252. endoreg_db/models/hardware/endoscopy_processor.py +143 -143
  253. endoreg_db/models/information_source.py +29 -29
  254. endoreg_db/models/label/label.py +84 -84
  255. endoreg_db/models/laboratory/lab_value.py +102 -102
  256. endoreg_db/models/legacy_data/__init__.py +3 -3
  257. endoreg_db/models/legacy_data/image.py +34 -34
  258. endoreg_db/models/medication/medication.py +148 -148
  259. endoreg_db/models/network/__init__.py +2 -0
  260. endoreg_db/models/network/network_device.py +27 -0
  261. endoreg_db/models/network/network_device_type.py +23 -0
  262. endoreg_db/models/other/__init__.py +4 -4
  263. endoreg_db/models/other/distribution.py +215 -215
  264. endoreg_db/models/other/material.py +16 -16
  265. endoreg_db/models/other/resource.py +17 -17
  266. endoreg_db/models/other/transport_route.py +20 -20
  267. endoreg_db/models/other/waste.py +20 -20
  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 +6 -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 -22
  276. endoreg_db/models/persons/last_name.py +19 -19
  277. endoreg_db/models/persons/patient/__init__.py +7 -7
  278. endoreg_db/models/persons/patient/case/case.py +30 -30
  279. endoreg_db/models/persons/patient/patient.py +216 -216
  280. endoreg_db/models/persons/patient/patient_disease.py +16 -16
  281. endoreg_db/models/persons/patient/patient_event.py +22 -22
  282. endoreg_db/models/persons/patient/patient_lab_sample.py +106 -106
  283. endoreg_db/models/persons/patient/patient_lab_value.py +176 -176
  284. endoreg_db/models/persons/patient/patient_medication.py +43 -43
  285. endoreg_db/models/persons/patient/patient_medication_schedule.py +27 -27
  286. endoreg_db/models/persons/person.py +31 -31
  287. endoreg_db/models/persons/portal_user_information.py +27 -27
  288. endoreg_db/models/prediction/__init__.py +1 -1
  289. endoreg_db/models/prediction/image_classification.py +37 -37
  290. endoreg_db/models/prediction/video_prediction_meta.py +244 -244
  291. endoreg_db/models/product/__init__.py +4 -4
  292. endoreg_db/models/product/product.py +97 -97
  293. endoreg_db/models/product/product_group.py +19 -19
  294. endoreg_db/models/product/product_material.py +24 -24
  295. endoreg_db/models/product/product_weight.py +26 -26
  296. endoreg_db/models/product/reference_product.py +99 -99
  297. endoreg_db/models/questionnaires/__init__.py +114 -114
  298. endoreg_db/models/quiz/__init__.py +1 -1
  299. endoreg_db/models/quiz/quiz_answer.py +41 -41
  300. endoreg_db/models/quiz/quiz_question.py +54 -54
  301. endoreg_db/models/report_reader/__init__.py +1 -1
  302. endoreg_db/models/report_reader/report_reader_config.py +53 -53
  303. endoreg_db/models/report_reader/report_reader_flag.py +19 -19
  304. endoreg_db/models/rules/__init__.py +4 -4
  305. endoreg_db/models/rules/rule.py +23 -23
  306. endoreg_db/models/rules/rule_applicator.py +224 -224
  307. endoreg_db/models/rules/rule_attribute_dtype.py +18 -18
  308. endoreg_db/models/rules/rule_type.py +21 -21
  309. endoreg_db/models/rules/ruleset.py +19 -19
  310. endoreg_db/models/unit.py +21 -21
  311. endoreg_db/queries/__init__.py +4 -4
  312. endoreg_db/queries/annotations/__init__.py +2 -2
  313. endoreg_db/queries/annotations/legacy.py +159 -159
  314. endoreg_db/queries/get/__init__.py +5 -5
  315. endoreg_db/queries/get/center.py +42 -42
  316. endoreg_db/queries/get/model.py +13 -13
  317. endoreg_db/queries/get/patient.py +14 -14
  318. endoreg_db/queries/get/patient_examination.py +20 -20
  319. endoreg_db/queries/get/report_file.py +33 -33
  320. endoreg_db/queries/get/video.py +31 -31
  321. endoreg_db/serializers/__init__.py +9 -9
  322. endoreg_db/serializers/ai_model.py +18 -18
  323. endoreg_db/serializers/annotation.py +17 -17
  324. endoreg_db/serializers/center.py +11 -11
  325. endoreg_db/serializers/examination.py +32 -32
  326. endoreg_db/serializers/frame.py +13 -13
  327. endoreg_db/serializers/hardware.py +20 -20
  328. endoreg_db/serializers/label.py +22 -22
  329. endoreg_db/serializers/patient.py +10 -10
  330. endoreg_db/serializers/prediction.py +15 -15
  331. endoreg_db/serializers/report_file.py +7 -7
  332. endoreg_db/serializers/video.py +27 -27
  333. endoreg_db/tests.py +3 -3
  334. endoreg_db/utils/cropping.py +28 -28
  335. endoreg_db/utils/dataloader.py +92 -92
  336. endoreg_db/utils/file_operations.py +30 -30
  337. endoreg_db/utils/hashs.py +33 -33
  338. endoreg_db/utils/legacy_ocr.py +201 -201
  339. endoreg_db/utils/ocr.py +197 -197
  340. endoreg_db/utils/uuid.py +4 -4
  341. endoreg_db/utils/video_metadata.py +87 -87
  342. endoreg_db/views.py +3 -3
  343. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.7.dist-info}/LICENSE +674 -674
  344. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.7.dist-info}/METADATA +2 -2
  345. endoreg_db-0.3.7.dist-info/RECORD +363 -0
  346. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.7.dist-info}/WHEEL +1 -1
  347. endoreg_db-0.3.6.dist-info/RECORD +0 -357
@@ -1,215 +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
- # )
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
+ # )
@@ -1,16 +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,)
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,)
@@ -1,18 +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):
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
18
  return self.name
@@ -1,21 +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):
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
21
  return self.name
@@ -1,20 +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
-
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
+
@@ -1,35 +1,35 @@
1
- from django.db import models
2
-
3
- # Serializer located in serializers/examination.py
4
- class PatientExamination(models.Model):
5
- patient = models.ForeignKey('Patient', on_delete=models.CASCADE, related_name='patient_examinations')
6
- examination = models.ForeignKey('Examination', on_delete=models.CASCADE, null = True, blank = True)
7
- video = models.OneToOneField('Video', on_delete=models.CASCADE, null = True, blank = True, related_name='patient_examination')
8
- report_file = models.OneToOneField('ReportFile', on_delete=models.CASCADE, null = True, blank = True, related_name='patient_examination')
9
-
10
- class Meta:
11
- verbose_name = 'Patient Examination'
12
- verbose_name_plural = 'Patient Examinations'
13
- ordering = ['patient', 'examination']
14
-
15
- def __str__(self):
16
- return f"{self.patient} - {self.report_file}"
17
-
18
- def find_matching_video_from_patient(self):
19
- """
20
- Finds a video for this patient examination based on the patient's videos.
21
- For this, the videos date must be the same as the report file's date.
22
- #TODO add more criteria for matching: Examination type
23
- """
24
- videos = self.patient.video_set.filter(date=self.report_file.date, patient_examination__isnull=True)
25
- if videos:
26
- if len(videos) > 1:
27
- print(f"Warning: Found more than one video for patient {self.patient} on date {self.report_file.date}. Choosing the first one.")
28
- return videos[0]
29
- else:
30
- videos = self.patient.video_set.filter(patient_examination__isnull=True)
31
- if len(videos)==1:
32
- return videos[0]
33
-
34
- return None
35
-
1
+ from django.db import models
2
+
3
+ # Serializer located in serializers/examination.py
4
+ class PatientExamination(models.Model):
5
+ patient = models.ForeignKey('Patient', on_delete=models.CASCADE, related_name='patient_examinations')
6
+ examination = models.ForeignKey('Examination', on_delete=models.CASCADE, null = True, blank = True)
7
+ video = models.OneToOneField('Video', on_delete=models.CASCADE, null = True, blank = True, related_name='patient_examination')
8
+ report_file = models.OneToOneField('ReportFile', on_delete=models.CASCADE, null = True, blank = True, related_name='patient_examination')
9
+
10
+ class Meta:
11
+ verbose_name = 'Patient Examination'
12
+ verbose_name_plural = 'Patient Examinations'
13
+ ordering = ['patient', 'examination']
14
+
15
+ def __str__(self):
16
+ return f"{self.patient} - {self.report_file}"
17
+
18
+ def find_matching_video_from_patient(self):
19
+ """
20
+ Finds a video for this patient examination based on the patient's videos.
21
+ For this, the videos date must be the same as the report file's date.
22
+ #TODO add more criteria for matching: Examination type
23
+ """
24
+ videos = self.patient.video_set.filter(date=self.report_file.date, patient_examination__isnull=True)
25
+ if videos:
26
+ if len(videos) > 1:
27
+ print(f"Warning: Found more than one video for patient {self.patient} on date {self.report_file.date}. Choosing the first one.")
28
+ return videos[0]
29
+ else:
30
+ videos = self.patient.video_set.filter(patient_examination__isnull=True)
31
+ if len(videos)==1:
32
+ return videos[0]
33
+
34
+ return None
35
+