endoreg-db 0.3.6__py3-none-any.whl → 0.3.8__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.
- endoreg_db/admin.py +3 -3
- endoreg_db/apps.py +6 -6
- endoreg_db/data/__init__.py +67 -64
- endoreg_db/data/active_model/data.yaml +2 -2
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -167
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +7 -7
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +8 -8
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +22 -22
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +18 -18
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +18 -18
- endoreg_db/data/case_template/rule/19_create_patient.yaml +16 -16
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -35
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +58 -58
- endoreg_db/data/case_template/template/base.yaml +7 -7
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +2 -2
- endoreg_db/data/case_template/tmp/_rule_value +13 -13
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -21
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +9 -9
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +6 -6
- endoreg_db/data/center/data.yaml +59 -59
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
- endoreg_db/data/disease/cardiovascular.yaml +37 -37
- endoreg_db/data/disease/hepatology.yaml +4 -4
- endoreg_db/data/disease/misc.yaml +5 -5
- endoreg_db/data/disease/renal.yaml +4 -4
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +5 -5
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +40 -40
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +19 -19
- endoreg_db/data/distribution/date/patient.yaml +6 -6
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/.init +0 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +6 -6
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -132
- endoreg_db/data/endoscope_type/data.yaml +10 -10
- endoreg_db/data/endoscopy_processor/data.yaml +45 -45
- endoreg_db/data/event/cardiology.yaml +27 -27
- endoreg_db/data/event/neurology.yaml +13 -13
- endoreg_db/data/event/surgery.yaml +12 -12
- endoreg_db/data/event/thrombembolism.yaml +19 -19
- endoreg_db/data/examination/examinations/data.yaml +65 -65
- endoreg_db/data/examination/time/data.yaml +47 -47
- endoreg_db/data/examination/time-type/data.yaml +7 -7
- endoreg_db/data/examination/type/data.yaml +5 -5
- endoreg_db/data/gender/data.yaml +18 -18
- endoreg_db/data/information_source/data.yaml +30 -30
- endoreg_db/data/information_source/medication.yaml +5 -5
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +30 -30
- endoreg_db/data/lab_value/coagulation.yaml +48 -48
- endoreg_db/data/lab_value/electrolytes.yaml +189 -189
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -121
- endoreg_db/data/lab_value/hematology.yaml +169 -169
- endoreg_db/data/lab_value/hormones.yaml +53 -53
- endoreg_db/data/lab_value/lipids.yaml +44 -44
- endoreg_db/data/lab_value/misc.yaml +30 -30
- endoreg_db/data/lab_value/renal_function.yaml +10 -10
- endoreg_db/data/label/label/data.yaml +62 -62
- endoreg_db/data/label/label-set/data.yaml +17 -17
- endoreg_db/data/label/label-type/data.yaml +6 -6
- endoreg_db/data/medication/anticoagulation.yaml +64 -64
- endoreg_db/data/medication/tah.yaml +69 -69
- endoreg_db/data/medication_indication/anticoagulation.yaml +120 -120
- endoreg_db/data/medication_indication_type/data.yaml +10 -10
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +40 -40
- endoreg_db/data/medication_intake_time/base.yaml +30 -30
- endoreg_db/data/medication_schedule/apixaban.yaml +94 -94
- endoreg_db/data/medication_schedule/ass.yaml +12 -12
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -26
- endoreg_db/data/model_type/data.yaml +6 -6
- endoreg_db/data/network_device/data.yaml +17 -0
- endoreg_db/data/network_device_type/data.yaml +8 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
- endoreg_db/data/pdf_type/data.yaml +28 -28
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -66
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -33
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -308
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -88
- endoreg_db/data/profession/data.yaml +70 -70
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
- endoreg_db/data/unit/concentration.yaml +92 -92
- endoreg_db/data/unit/data.yaml +17 -17
- endoreg_db/data/unit/length.yaml +30 -30
- endoreg_db/data/unit/misc.yaml +19 -19
- endoreg_db/data/unit/rate.yaml +5 -5
- endoreg_db/data/unit/time.yaml +12 -12
- endoreg_db/data/unit/volume.yaml +35 -35
- endoreg_db/data/unit/weight.yaml +37 -37
- endoreg_db/data/waste/data.yaml +11 -11
- endoreg_db/forms/__init__.py +2 -2
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
- endoreg_db/forms/settings/__init__.py +8 -8
- endoreg_db/forms/unit.py +5 -5
- endoreg_db/management/commands/_load_model_template.py +40 -40
- endoreg_db/management/commands/delete_all.py +18 -18
- endoreg_db/management/commands/delete_legacy_images.py +19 -19
- endoreg_db/management/commands/delete_legacy_videos.py +16 -16
- endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
- endoreg_db/management/commands/fix_auth_permission.py +20 -20
- endoreg_db/management/commands/import_legacy_images.py +94 -94
- endoreg_db/management/commands/import_legacy_videos.py +76 -76
- endoreg_db/management/commands/load_active_model_data.py +44 -44
- endoreg_db/management/commands/load_ai_model_data.py +44 -44
- endoreg_db/management/commands/load_base_db_data.py +132 -128
- endoreg_db/management/commands/load_center_data.py +42 -42
- endoreg_db/management/commands/load_disease_classification_choices_data.py +40 -40
- endoreg_db/management/commands/load_disease_classification_data.py +40 -40
- endoreg_db/management/commands/load_disease_data.py +39 -39
- endoreg_db/management/commands/load_distribution_data.py +65 -65
- endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
- endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
- endoreg_db/management/commands/load_event_data.py +40 -40
- endoreg_db/management/commands/load_examination_data.py +74 -74
- endoreg_db/management/commands/load_g_play_data.py +112 -112
- endoreg_db/management/commands/load_gender_data.py +43 -43
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -132
- endoreg_db/management/commands/load_information_source.py +44 -44
- endoreg_db/management/commands/load_lab_value_data.py +49 -49
- endoreg_db/management/commands/load_label_data.py +66 -66
- endoreg_db/management/commands/load_medication_data.py +40 -40
- endoreg_db/management/commands/load_medication_indication_data.py +62 -62
- endoreg_db/management/commands/load_medication_indication_type_data.py +40 -40
- endoreg_db/management/commands/load_medication_intake_time_data.py +40 -40
- endoreg_db/management/commands/load_medication_schedule_data.py +54 -54
- endoreg_db/management/commands/load_network_data.py +49 -0
- endoreg_db/management/commands/load_pdf_type_data.py +60 -60
- endoreg_db/management/commands/load_profession_data.py +43 -43
- endoreg_db/management/commands/load_report_reader_flag.py +45 -45
- endoreg_db/management/commands/load_unit_data.py +45 -45
- endoreg_db/management/commands/load_user_groups.py +28 -28
- endoreg_db/management/commands/register_ai_model.py +65 -65
- endoreg_db/management/commands/reset_celery_schedule.py +9 -9
- endoreg_db/migrations/0001_initial.py +582 -582
- endoreg_db/migrations/0002_rawvideofile.py +26 -26
- endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -18
- endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -18
- endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -56
- endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -25
- endoreg_db/migrations/0007_rawvideofile_processor.py +19 -19
- endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -18
- endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -31
- endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -18
- endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -18
- endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -109
- endoreg_db/migrations/0013_rawpdffile.py +31 -31
- endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -38
- endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -31
- endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -18
- endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -37
- endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -37
- endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -42
- endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -18
- endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -19
- endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -19
- endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -59
- endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -27
- endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -42
- endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -166
- endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -38
- endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -18
- endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -75
- endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -101
- endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -38
- endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -18
- endoreg_db/migrations/0033_medicationindication_sources.py +18 -18
- endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -20
- endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -18
- endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -20
- endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -18
- endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -164
- endoreg_db/migrations/0039_referenceproduct_name.py +19 -19
- endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -50
- endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -40
- endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -74
- endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -23
- endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -23
- endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -19
- endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -18
- endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -18
- endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -22
- endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -17
- endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -18
- endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -27
- endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -18
- endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -38
- endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -69
- endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -59
- endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -32
- endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -72
- endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -28
- endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -18
- endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -44
- endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -24
- endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -18
- endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -18
- endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -23
- endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -58
- endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -29
- endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -19
- endoreg_db/migrations/0068_networkdevicetype_networkdevicetypemanager_and_more.py +57 -0
- endoreg_db/models/__init__.py +75 -74
- endoreg_db/models/ai_model/__init__.py +3 -3
- endoreg_db/models/ai_model/active_model.py +9 -9
- endoreg_db/models/ai_model/model_meta.py +24 -24
- endoreg_db/models/ai_model/model_type.py +25 -25
- endoreg_db/models/ai_model/utils.py +8 -8
- endoreg_db/models/annotation/__init__.py +1 -1
- endoreg_db/models/annotation/binary_classification_annotation_task.py +80 -80
- endoreg_db/models/annotation/image_classification.py +26 -26
- endoreg_db/models/case_template/__init__.py +5 -5
- endoreg_db/models/case_template/case_template.py +81 -81
- endoreg_db/models/case_template/case_template_rule.py +276 -276
- endoreg_db/models/case_template/case_template_rule_value.py +73 -73
- endoreg_db/models/case_template/case_template_type.py +27 -27
- endoreg_db/models/center/__init__.py +4 -4
- endoreg_db/models/center/center.py +24 -24
- endoreg_db/models/center/center_product.py +33 -33
- endoreg_db/models/center/center_resource.py +18 -18
- endoreg_db/models/center/center_waste.py +10 -10
- endoreg_db/models/data_file/__init__.py +5 -5
- endoreg_db/models/data_file/base_classes/__init__.py +2 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +50 -50
- endoreg_db/models/data_file/base_classes/abstract_video.py +200 -200
- endoreg_db/models/data_file/frame.py +45 -45
- endoreg_db/models/data_file/import_classes/__init__.py +31 -31
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +34 -34
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +188 -188
- endoreg_db/models/data_file/import_classes/raw_video.py +343 -343
- endoreg_db/models/data_file/metadata/__init__.py +3 -3
- endoreg_db/models/data_file/metadata/pdf_meta.py +70 -70
- endoreg_db/models/data_file/metadata/sensitive_meta.py +31 -31
- endoreg_db/models/data_file/metadata/video_meta.py +132 -132
- endoreg_db/models/data_file/report_file.py +89 -89
- endoreg_db/models/data_file/video/__init__.py +6 -6
- endoreg_db/models/data_file/video/import_meta.py +25 -25
- endoreg_db/models/data_file/video/video.py +25 -25
- endoreg_db/models/data_file/video_segment.py +107 -107
- endoreg_db/models/disease.py +55 -55
- endoreg_db/models/emission/emission_factor.py +19 -19
- endoreg_db/models/event.py +21 -21
- endoreg_db/models/examination/__init__.py +3 -3
- endoreg_db/models/examination/examination.py +26 -26
- endoreg_db/models/examination/examination_time.py +27 -27
- endoreg_db/models/examination/examination_time_type.py +24 -24
- endoreg_db/models/examination/examination_type.py +18 -18
- endoreg_db/models/hardware/__init__.py +1 -1
- endoreg_db/models/hardware/endoscope.py +44 -44
- endoreg_db/models/hardware/endoscopy_processor.py +143 -143
- endoreg_db/models/information_source.py +29 -29
- endoreg_db/models/label/label.py +84 -84
- endoreg_db/models/laboratory/lab_value.py +102 -102
- endoreg_db/models/legacy_data/__init__.py +3 -3
- endoreg_db/models/legacy_data/image.py +34 -34
- endoreg_db/models/medication/medication.py +148 -148
- endoreg_db/models/network/__init__.py +2 -0
- endoreg_db/models/network/network_device.py +27 -0
- endoreg_db/models/network/network_device_type.py +23 -0
- endoreg_db/models/other/__init__.py +4 -4
- endoreg_db/models/other/distribution.py +215 -215
- endoreg_db/models/other/material.py +16 -16
- endoreg_db/models/other/resource.py +17 -17
- endoreg_db/models/other/transport_route.py +20 -20
- endoreg_db/models/other/waste.py +20 -20
- endoreg_db/models/patient_examination/__init__.py +35 -35
- endoreg_db/models/permissions/__init__.py +44 -44
- endoreg_db/models/persons/__init__.py +6 -6
- endoreg_db/models/persons/examiner/__init__.py +1 -1
- endoreg_db/models/persons/examiner/examiner.py +15 -15
- endoreg_db/models/persons/examiner/examiner_type.py +1 -1
- endoreg_db/models/persons/first_name.py +17 -17
- endoreg_db/models/persons/gender.py +22 -22
- endoreg_db/models/persons/last_name.py +19 -19
- endoreg_db/models/persons/patient/__init__.py +7 -7
- endoreg_db/models/persons/patient/case/case.py +30 -30
- endoreg_db/models/persons/patient/patient.py +216 -216
- endoreg_db/models/persons/patient/patient_disease.py +16 -16
- endoreg_db/models/persons/patient/patient_event.py +22 -22
- endoreg_db/models/persons/patient/patient_lab_sample.py +106 -106
- endoreg_db/models/persons/patient/patient_lab_value.py +176 -176
- endoreg_db/models/persons/patient/patient_medication.py +43 -43
- endoreg_db/models/persons/patient/patient_medication_schedule.py +27 -27
- endoreg_db/models/persons/person.py +31 -31
- endoreg_db/models/persons/portal_user_information.py +27 -27
- endoreg_db/models/prediction/__init__.py +1 -1
- endoreg_db/models/prediction/image_classification.py +37 -37
- endoreg_db/models/prediction/video_prediction_meta.py +244 -244
- endoreg_db/models/product/__init__.py +4 -4
- endoreg_db/models/product/product.py +97 -97
- endoreg_db/models/product/product_group.py +19 -19
- endoreg_db/models/product/product_material.py +24 -24
- endoreg_db/models/product/product_weight.py +26 -26
- endoreg_db/models/product/reference_product.py +99 -99
- endoreg_db/models/questionnaires/__init__.py +114 -114
- endoreg_db/models/quiz/__init__.py +1 -1
- endoreg_db/models/quiz/quiz_answer.py +41 -41
- endoreg_db/models/quiz/quiz_question.py +54 -54
- endoreg_db/models/report_reader/__init__.py +1 -1
- endoreg_db/models/report_reader/report_reader_config.py +53 -53
- endoreg_db/models/report_reader/report_reader_flag.py +19 -19
- endoreg_db/models/rules/__init__.py +4 -4
- endoreg_db/models/rules/rule.py +23 -23
- endoreg_db/models/rules/rule_applicator.py +224 -224
- endoreg_db/models/rules/rule_attribute_dtype.py +18 -18
- endoreg_db/models/rules/rule_type.py +21 -21
- endoreg_db/models/rules/ruleset.py +19 -19
- endoreg_db/models/unit.py +21 -21
- endoreg_db/queries/__init__.py +4 -4
- endoreg_db/queries/annotations/__init__.py +2 -2
- endoreg_db/queries/annotations/legacy.py +159 -159
- endoreg_db/queries/get/__init__.py +5 -5
- endoreg_db/queries/get/center.py +42 -42
- endoreg_db/queries/get/model.py +13 -13
- endoreg_db/queries/get/patient.py +14 -14
- endoreg_db/queries/get/patient_examination.py +20 -20
- endoreg_db/queries/get/report_file.py +33 -33
- endoreg_db/queries/get/video.py +31 -31
- endoreg_db/serializers/__init__.py +9 -9
- endoreg_db/serializers/ai_model.py +18 -18
- endoreg_db/serializers/annotation.py +17 -17
- endoreg_db/serializers/center.py +11 -11
- endoreg_db/serializers/examination.py +32 -32
- endoreg_db/serializers/frame.py +13 -13
- endoreg_db/serializers/hardware.py +20 -20
- endoreg_db/serializers/label.py +22 -22
- endoreg_db/serializers/patient.py +10 -10
- endoreg_db/serializers/prediction.py +15 -15
- endoreg_db/serializers/report_file.py +7 -7
- endoreg_db/serializers/video.py +27 -27
- endoreg_db/tests.py +3 -3
- endoreg_db/utils/cropping.py +28 -28
- endoreg_db/utils/dataloader.py +92 -92
- endoreg_db/utils/file_operations.py +30 -30
- endoreg_db/utils/hashs.py +33 -33
- endoreg_db/utils/legacy_ocr.py +201 -201
- endoreg_db/utils/ocr.py +197 -197
- endoreg_db/utils/uuid.py +4 -4
- endoreg_db/utils/video_metadata.py +87 -87
- endoreg_db/views.py +3 -3
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/LICENSE +674 -674
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/METADATA +3 -1
- endoreg_db-0.3.8.dist-info/RECORD +367 -0
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/WHEEL +1 -1
- endoreg_db-0.3.6.dist-info/RECORD +0 -357
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
DEFAULT_PATIENT_LAB_SAMPLE_TYPE_NAME = "generic"
|
|
4
|
-
|
|
5
|
-
class PatientLabSampleTypeManager(models.Manager):
|
|
6
|
-
def get_by_natural_key(self, name):
|
|
7
|
-
return self.get(name=name)
|
|
8
|
-
|
|
9
|
-
class PatientLabSampleType(models.Model):
|
|
10
|
-
"""
|
|
11
|
-
A class representing a patient lab sample type.
|
|
12
|
-
|
|
13
|
-
Attributes:
|
|
14
|
-
name (str): The name of the patient lab sample type.
|
|
15
|
-
description (str): A description of the patient lab sample type.
|
|
16
|
-
|
|
17
|
-
"""
|
|
18
|
-
name = models.CharField(max_length=255)
|
|
19
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
20
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
21
|
-
description = models.TextField(blank=True, null=True)
|
|
22
|
-
|
|
23
|
-
objects = PatientLabSampleTypeManager()
|
|
24
|
-
|
|
25
|
-
def natural_key(self):
|
|
26
|
-
return (self.name,)
|
|
27
|
-
|
|
28
|
-
def __str__(self):
|
|
29
|
-
return self.name
|
|
30
|
-
|
|
31
|
-
@classmethod
|
|
32
|
-
def get_default_sample_type(cls):
|
|
33
|
-
"""
|
|
34
|
-
Get the default patient lab sample type.
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
PatientLabSampleType: The default patient lab sample type.
|
|
38
|
-
|
|
39
|
-
"""
|
|
40
|
-
return cls.objects.get_or_create(name="default")[0]
|
|
41
|
-
|
|
42
|
-
from datetime import datetime as dt
|
|
43
|
-
from datetime import timezone
|
|
44
|
-
class PatientLabSample(models.Model):
|
|
45
|
-
"""
|
|
46
|
-
A class representing a patient lab sample.
|
|
47
|
-
|
|
48
|
-
Attributes:
|
|
49
|
-
patient (Patient): The patient to which the lab sample belongs.
|
|
50
|
-
sample_type (PatientLabSampleType): The type of the lab sample.
|
|
51
|
-
date (datetime): The date of the lab sample.
|
|
52
|
-
values (PatientLabValue; One2Many): The value of the lab sample.
|
|
53
|
-
unit (Unit): The unit of the lab sample.
|
|
54
|
-
|
|
55
|
-
"""
|
|
56
|
-
patient = models.ForeignKey("Patient", on_delete=models.CASCADE, related_name="lab_samples")
|
|
57
|
-
sample_type = models.ForeignKey("PatientLabSampleType", on_delete=models.CASCADE)
|
|
58
|
-
date = models.DateTimeField()
|
|
59
|
-
|
|
60
|
-
def __str__(self):
|
|
61
|
-
return f"{self.patient} - {self.sample_type} - {self.date} ()"
|
|
62
|
-
|
|
63
|
-
def get_values(self):
|
|
64
|
-
return self.values
|
|
65
|
-
|
|
66
|
-
@classmethod
|
|
67
|
-
def create_by_patient(cls, patient=None, sample_type=None, date=None, save = True):
|
|
68
|
-
"""
|
|
69
|
-
Create a new patient lab sample by patient.
|
|
70
|
-
|
|
71
|
-
Args:
|
|
72
|
-
patient (Patient): The patient to which the lab sample belongs.
|
|
73
|
-
sample_type (PatientLabSampleType): The type of the lab sample.
|
|
74
|
-
date (datetime): The date of the lab sample.
|
|
75
|
-
|
|
76
|
-
Returns:
|
|
77
|
-
PatientLabSample: The new patient lab sample.
|
|
78
|
-
|
|
79
|
-
"""
|
|
80
|
-
from endoreg_db.models.persons.patient import Patient, PatientLabSampleType
|
|
81
|
-
from warnings import warn
|
|
82
|
-
|
|
83
|
-
if not patient:
|
|
84
|
-
warn("No patient given. Cannot create patient lab sample.")
|
|
85
|
-
return None
|
|
86
|
-
if not sample_type:
|
|
87
|
-
sample_type = PatientLabSampleType.get_default_sample_type()
|
|
88
|
-
else:
|
|
89
|
-
sample_type = PatientLabSampleType.objects.get(name=sample_type)
|
|
90
|
-
if not date:
|
|
91
|
-
date = dt.now(timezone.utc)
|
|
92
|
-
|
|
93
|
-
patient_lab_sample = cls.objects.create(
|
|
94
|
-
patient=patient,
|
|
95
|
-
sample_type=sample_type,
|
|
96
|
-
date=date
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
if save:
|
|
100
|
-
patient_lab_sample.save()
|
|
101
|
-
|
|
102
|
-
return patient_lab_sample
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
DEFAULT_PATIENT_LAB_SAMPLE_TYPE_NAME = "generic"
|
|
4
|
+
|
|
5
|
+
class PatientLabSampleTypeManager(models.Manager):
|
|
6
|
+
def get_by_natural_key(self, name):
|
|
7
|
+
return self.get(name=name)
|
|
8
|
+
|
|
9
|
+
class PatientLabSampleType(models.Model):
|
|
10
|
+
"""
|
|
11
|
+
A class representing a patient lab sample type.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
name (str): The name of the patient lab sample type.
|
|
15
|
+
description (str): A description of the patient lab sample type.
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
name = models.CharField(max_length=255)
|
|
19
|
+
name_de = models.CharField(max_length=255, null=True)
|
|
20
|
+
name_en = models.CharField(max_length=255, null=True)
|
|
21
|
+
description = models.TextField(blank=True, null=True)
|
|
22
|
+
|
|
23
|
+
objects = PatientLabSampleTypeManager()
|
|
24
|
+
|
|
25
|
+
def natural_key(self):
|
|
26
|
+
return (self.name,)
|
|
27
|
+
|
|
28
|
+
def __str__(self):
|
|
29
|
+
return self.name
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def get_default_sample_type(cls):
|
|
33
|
+
"""
|
|
34
|
+
Get the default patient lab sample type.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
PatientLabSampleType: The default patient lab sample type.
|
|
38
|
+
|
|
39
|
+
"""
|
|
40
|
+
return cls.objects.get_or_create(name="default")[0]
|
|
41
|
+
|
|
42
|
+
from datetime import datetime as dt
|
|
43
|
+
from datetime import timezone
|
|
44
|
+
class PatientLabSample(models.Model):
|
|
45
|
+
"""
|
|
46
|
+
A class representing a patient lab sample.
|
|
47
|
+
|
|
48
|
+
Attributes:
|
|
49
|
+
patient (Patient): The patient to which the lab sample belongs.
|
|
50
|
+
sample_type (PatientLabSampleType): The type of the lab sample.
|
|
51
|
+
date (datetime): The date of the lab sample.
|
|
52
|
+
values (PatientLabValue; One2Many): The value of the lab sample.
|
|
53
|
+
unit (Unit): The unit of the lab sample.
|
|
54
|
+
|
|
55
|
+
"""
|
|
56
|
+
patient = models.ForeignKey("Patient", on_delete=models.CASCADE, related_name="lab_samples")
|
|
57
|
+
sample_type = models.ForeignKey("PatientLabSampleType", on_delete=models.CASCADE)
|
|
58
|
+
date = models.DateTimeField()
|
|
59
|
+
|
|
60
|
+
def __str__(self):
|
|
61
|
+
return f"{self.patient} - {self.sample_type} - {self.date} ()"
|
|
62
|
+
|
|
63
|
+
def get_values(self):
|
|
64
|
+
return self.values
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def create_by_patient(cls, patient=None, sample_type=None, date=None, save = True):
|
|
68
|
+
"""
|
|
69
|
+
Create a new patient lab sample by patient.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
patient (Patient): The patient to which the lab sample belongs.
|
|
73
|
+
sample_type (PatientLabSampleType): The type of the lab sample.
|
|
74
|
+
date (datetime): The date of the lab sample.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
PatientLabSample: The new patient lab sample.
|
|
78
|
+
|
|
79
|
+
"""
|
|
80
|
+
from endoreg_db.models.persons.patient import Patient, PatientLabSampleType
|
|
81
|
+
from warnings import warn
|
|
82
|
+
|
|
83
|
+
if not patient:
|
|
84
|
+
warn("No patient given. Cannot create patient lab sample.")
|
|
85
|
+
return None
|
|
86
|
+
if not sample_type:
|
|
87
|
+
sample_type = PatientLabSampleType.get_default_sample_type()
|
|
88
|
+
else:
|
|
89
|
+
sample_type = PatientLabSampleType.objects.get(name=sample_type)
|
|
90
|
+
if not date:
|
|
91
|
+
date = dt.now(timezone.utc)
|
|
92
|
+
|
|
93
|
+
patient_lab_sample = cls.objects.create(
|
|
94
|
+
patient=patient,
|
|
95
|
+
sample_type=sample_type,
|
|
96
|
+
date=date
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
if save:
|
|
100
|
+
patient_lab_sample.save()
|
|
101
|
+
|
|
102
|
+
return patient_lab_sample
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
@@ -1,176 +1,176 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class PatientLabValue(models.Model):
|
|
4
|
-
"""
|
|
5
|
-
A class representing a patient lab value.
|
|
6
|
-
|
|
7
|
-
Attributes:
|
|
8
|
-
patient (Patient): The patient.
|
|
9
|
-
lab_value (LabValue): The lab value.
|
|
10
|
-
value (float): The value of the lab value.
|
|
11
|
-
date (datetime): The date of the lab value.
|
|
12
|
-
"""
|
|
13
|
-
patient = models.ForeignKey('Patient', on_delete=models.CASCADE,
|
|
14
|
-
related_name="lab_values", blank=True, null=True
|
|
15
|
-
)
|
|
16
|
-
lab_value = models.ForeignKey('LabValue', on_delete=models.CASCADE)
|
|
17
|
-
value = models.FloatField(blank=True, null=True)
|
|
18
|
-
value_str = models.CharField(max_length=255, blank=True, null=True)
|
|
19
|
-
sample = models.ForeignKey(
|
|
20
|
-
'PatientLabSample', on_delete=models.CASCADE,
|
|
21
|
-
blank=True, null=True,
|
|
22
|
-
related_name='values'
|
|
23
|
-
)
|
|
24
|
-
datetime = models.DateTimeField(# if not set, use now
|
|
25
|
-
auto_now_add=True
|
|
26
|
-
)
|
|
27
|
-
normal_range = models.JSONField(
|
|
28
|
-
default = dict
|
|
29
|
-
)
|
|
30
|
-
unit = models.ForeignKey('Unit', on_delete=models.CASCADE, blank=True, null=True)
|
|
31
|
-
|
|
32
|
-
@classmethod
|
|
33
|
-
def create_lab_value_by_sample(cls, sample=None, lab_value_name=None, value=None, value_str=None, unit=None):
|
|
34
|
-
from endoreg_db.models import LabValue
|
|
35
|
-
patient = sample.patient
|
|
36
|
-
lab_value = LabValue.objects.get(name=lab_value_name)
|
|
37
|
-
value = value
|
|
38
|
-
value_str = value_str
|
|
39
|
-
|
|
40
|
-
pat_lab_val = cls.objects.create(
|
|
41
|
-
patient = patient,
|
|
42
|
-
lab_value = lab_value,
|
|
43
|
-
value = value,
|
|
44
|
-
value_str = value_str,
|
|
45
|
-
sample = sample,
|
|
46
|
-
unit = unit,
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
pat_lab_val.save()
|
|
50
|
-
|
|
51
|
-
return pat_lab_val
|
|
52
|
-
|
|
53
|
-
def __str__(self):
|
|
54
|
-
_str = f'{self.lab_value} - {self.value} {self.unit} ({self.datetime})'
|
|
55
|
-
print(_str)
|
|
56
|
-
return _str
|
|
57
|
-
|
|
58
|
-
def set_min_norm_value(self, value, save = True):
|
|
59
|
-
self.normal_range["min"] = value
|
|
60
|
-
if save:
|
|
61
|
-
self.save()
|
|
62
|
-
|
|
63
|
-
def set_max_norm_value(self, value, save = True):
|
|
64
|
-
self.normal_range["max"] = value
|
|
65
|
-
if save:
|
|
66
|
-
self.save()
|
|
67
|
-
|
|
68
|
-
def set_norm_values_from_default(self):
|
|
69
|
-
age = self.patient.age()
|
|
70
|
-
gender = self.patient.gender
|
|
71
|
-
min_value, max_value = self.lab_value.get_normal_range(age=age, gender=gender)
|
|
72
|
-
self.set_min_norm_value(min_value, save = False)
|
|
73
|
-
self.set_max_norm_value(max_value, save = False)
|
|
74
|
-
self.save()
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def set_unit_from_default(self):
|
|
78
|
-
self.unit = self.lab_value.default_unit
|
|
79
|
-
self.save()
|
|
80
|
-
|
|
81
|
-
def get_value(self):
|
|
82
|
-
if self.value:
|
|
83
|
-
return self.value
|
|
84
|
-
else:
|
|
85
|
-
return self.value_str
|
|
86
|
-
|
|
87
|
-
def get_value_field_name(self):
|
|
88
|
-
if self.value:
|
|
89
|
-
return "value"
|
|
90
|
-
else:
|
|
91
|
-
return "value_str"
|
|
92
|
-
|
|
93
|
-
# customize save method so that if a numeric value exists, we round it to the precision of the lab value
|
|
94
|
-
def save(self, *args, **kwargs):
|
|
95
|
-
if self.value:
|
|
96
|
-
precision = self.lab_value.numeric_precision
|
|
97
|
-
self.value = round(self.value, precision)
|
|
98
|
-
super().save(*args, **kwargs)
|
|
99
|
-
|
|
100
|
-
def set_value_by_distribution(self, distribution=None, save = True):
|
|
101
|
-
from endoreg_db.models import (
|
|
102
|
-
Patient, LabValue, Gender,
|
|
103
|
-
DateValueDistribution,
|
|
104
|
-
SingleCategoricalValueDistribution,
|
|
105
|
-
NumericValueDistribution,
|
|
106
|
-
MultipleCategoricalValueDistribution,
|
|
107
|
-
)
|
|
108
|
-
import warnings
|
|
109
|
-
|
|
110
|
-
patient:Patient = self.patient
|
|
111
|
-
|
|
112
|
-
dob = patient.dob
|
|
113
|
-
gender:Gender = patient.gender
|
|
114
|
-
lab_value:LabValue = self.lab_value
|
|
115
|
-
|
|
116
|
-
assert self.lab_value, "Lab value must be set to set value by distribution"
|
|
117
|
-
self.unit = self.lab_value.default_unit
|
|
118
|
-
|
|
119
|
-
if not distribution:
|
|
120
|
-
distribution = lab_value.get_default_default_distribution()
|
|
121
|
-
|
|
122
|
-
if not distribution:
|
|
123
|
-
warnings.warn(
|
|
124
|
-
"No distribution set for lab value, assuming uniform numeric distribution based on normal values"
|
|
125
|
-
)
|
|
126
|
-
|
|
127
|
-
if not self.normal_range.get("min", None) or not self.normal_range.get("max", None):
|
|
128
|
-
self.set_norm_values_from_default()
|
|
129
|
-
|
|
130
|
-
self.normal_range:dict
|
|
131
|
-
_min = self.normal_range.get("min", 0.0001)
|
|
132
|
-
_max = self.normal_range.get("max", 100)
|
|
133
|
-
_name = "auto-" + self.lab_value.name + "-distribution-default-uniform"
|
|
134
|
-
distribution = NumericValueDistribution(
|
|
135
|
-
name = _name,
|
|
136
|
-
min_value = _min,
|
|
137
|
-
max_value = _max,
|
|
138
|
-
distribution_type = "uniform"
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
value = distribution.generate_value()
|
|
142
|
-
self.value = value
|
|
143
|
-
if save:
|
|
144
|
-
self.save()
|
|
145
|
-
|
|
146
|
-
return value
|
|
147
|
-
|
|
148
|
-
if isinstance(distribution, SingleCategoricalValueDistribution):
|
|
149
|
-
value = distribution.generate_value()
|
|
150
|
-
self.value_str = value
|
|
151
|
-
if save:
|
|
152
|
-
self.save()
|
|
153
|
-
return value
|
|
154
|
-
|
|
155
|
-
elif isinstance(distribution, NumericValueDistribution):
|
|
156
|
-
value = distribution.generate_value()
|
|
157
|
-
self.value = value
|
|
158
|
-
if save:
|
|
159
|
-
self.save()
|
|
160
|
-
return value
|
|
161
|
-
|
|
162
|
-
elif isinstance(distribution, MultipleCategoricalValueDistribution):
|
|
163
|
-
value = distribution.generate_value()
|
|
164
|
-
self.value_str = value
|
|
165
|
-
if save:
|
|
166
|
-
self.save()
|
|
167
|
-
return value
|
|
168
|
-
|
|
169
|
-
elif isinstance(distribution, DateValueDistribution):
|
|
170
|
-
# raise not implemented error
|
|
171
|
-
value = distribution.generate_value()
|
|
172
|
-
self.value = value
|
|
173
|
-
if save:
|
|
174
|
-
self.save()
|
|
175
|
-
|
|
176
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class PatientLabValue(models.Model):
|
|
4
|
+
"""
|
|
5
|
+
A class representing a patient lab value.
|
|
6
|
+
|
|
7
|
+
Attributes:
|
|
8
|
+
patient (Patient): The patient.
|
|
9
|
+
lab_value (LabValue): The lab value.
|
|
10
|
+
value (float): The value of the lab value.
|
|
11
|
+
date (datetime): The date of the lab value.
|
|
12
|
+
"""
|
|
13
|
+
patient = models.ForeignKey('Patient', on_delete=models.CASCADE,
|
|
14
|
+
related_name="lab_values", blank=True, null=True
|
|
15
|
+
)
|
|
16
|
+
lab_value = models.ForeignKey('LabValue', on_delete=models.CASCADE)
|
|
17
|
+
value = models.FloatField(blank=True, null=True)
|
|
18
|
+
value_str = models.CharField(max_length=255, blank=True, null=True)
|
|
19
|
+
sample = models.ForeignKey(
|
|
20
|
+
'PatientLabSample', on_delete=models.CASCADE,
|
|
21
|
+
blank=True, null=True,
|
|
22
|
+
related_name='values'
|
|
23
|
+
)
|
|
24
|
+
datetime = models.DateTimeField(# if not set, use now
|
|
25
|
+
auto_now_add=True
|
|
26
|
+
)
|
|
27
|
+
normal_range = models.JSONField(
|
|
28
|
+
default = dict
|
|
29
|
+
)
|
|
30
|
+
unit = models.ForeignKey('Unit', on_delete=models.CASCADE, blank=True, null=True)
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def create_lab_value_by_sample(cls, sample=None, lab_value_name=None, value=None, value_str=None, unit=None):
|
|
34
|
+
from endoreg_db.models import LabValue
|
|
35
|
+
patient = sample.patient
|
|
36
|
+
lab_value = LabValue.objects.get(name=lab_value_name)
|
|
37
|
+
value = value
|
|
38
|
+
value_str = value_str
|
|
39
|
+
|
|
40
|
+
pat_lab_val = cls.objects.create(
|
|
41
|
+
patient = patient,
|
|
42
|
+
lab_value = lab_value,
|
|
43
|
+
value = value,
|
|
44
|
+
value_str = value_str,
|
|
45
|
+
sample = sample,
|
|
46
|
+
unit = unit,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
pat_lab_val.save()
|
|
50
|
+
|
|
51
|
+
return pat_lab_val
|
|
52
|
+
|
|
53
|
+
def __str__(self):
|
|
54
|
+
_str = f'{self.lab_value} - {self.value} {self.unit} ({self.datetime})'
|
|
55
|
+
print(_str)
|
|
56
|
+
return _str
|
|
57
|
+
|
|
58
|
+
def set_min_norm_value(self, value, save = True):
|
|
59
|
+
self.normal_range["min"] = value
|
|
60
|
+
if save:
|
|
61
|
+
self.save()
|
|
62
|
+
|
|
63
|
+
def set_max_norm_value(self, value, save = True):
|
|
64
|
+
self.normal_range["max"] = value
|
|
65
|
+
if save:
|
|
66
|
+
self.save()
|
|
67
|
+
|
|
68
|
+
def set_norm_values_from_default(self):
|
|
69
|
+
age = self.patient.age()
|
|
70
|
+
gender = self.patient.gender
|
|
71
|
+
min_value, max_value = self.lab_value.get_normal_range(age=age, gender=gender)
|
|
72
|
+
self.set_min_norm_value(min_value, save = False)
|
|
73
|
+
self.set_max_norm_value(max_value, save = False)
|
|
74
|
+
self.save()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def set_unit_from_default(self):
|
|
78
|
+
self.unit = self.lab_value.default_unit
|
|
79
|
+
self.save()
|
|
80
|
+
|
|
81
|
+
def get_value(self):
|
|
82
|
+
if self.value:
|
|
83
|
+
return self.value
|
|
84
|
+
else:
|
|
85
|
+
return self.value_str
|
|
86
|
+
|
|
87
|
+
def get_value_field_name(self):
|
|
88
|
+
if self.value:
|
|
89
|
+
return "value"
|
|
90
|
+
else:
|
|
91
|
+
return "value_str"
|
|
92
|
+
|
|
93
|
+
# customize save method so that if a numeric value exists, we round it to the precision of the lab value
|
|
94
|
+
def save(self, *args, **kwargs):
|
|
95
|
+
if self.value:
|
|
96
|
+
precision = self.lab_value.numeric_precision
|
|
97
|
+
self.value = round(self.value, precision)
|
|
98
|
+
super().save(*args, **kwargs)
|
|
99
|
+
|
|
100
|
+
def set_value_by_distribution(self, distribution=None, save = True):
|
|
101
|
+
from endoreg_db.models import (
|
|
102
|
+
Patient, LabValue, Gender,
|
|
103
|
+
DateValueDistribution,
|
|
104
|
+
SingleCategoricalValueDistribution,
|
|
105
|
+
NumericValueDistribution,
|
|
106
|
+
MultipleCategoricalValueDistribution,
|
|
107
|
+
)
|
|
108
|
+
import warnings
|
|
109
|
+
|
|
110
|
+
patient:Patient = self.patient
|
|
111
|
+
|
|
112
|
+
dob = patient.dob
|
|
113
|
+
gender:Gender = patient.gender
|
|
114
|
+
lab_value:LabValue = self.lab_value
|
|
115
|
+
|
|
116
|
+
assert self.lab_value, "Lab value must be set to set value by distribution"
|
|
117
|
+
self.unit = self.lab_value.default_unit
|
|
118
|
+
|
|
119
|
+
if not distribution:
|
|
120
|
+
distribution = lab_value.get_default_default_distribution()
|
|
121
|
+
|
|
122
|
+
if not distribution:
|
|
123
|
+
warnings.warn(
|
|
124
|
+
"No distribution set for lab value, assuming uniform numeric distribution based on normal values"
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
if not self.normal_range.get("min", None) or not self.normal_range.get("max", None):
|
|
128
|
+
self.set_norm_values_from_default()
|
|
129
|
+
|
|
130
|
+
self.normal_range:dict
|
|
131
|
+
_min = self.normal_range.get("min", 0.0001)
|
|
132
|
+
_max = self.normal_range.get("max", 100)
|
|
133
|
+
_name = "auto-" + self.lab_value.name + "-distribution-default-uniform"
|
|
134
|
+
distribution = NumericValueDistribution(
|
|
135
|
+
name = _name,
|
|
136
|
+
min_value = _min,
|
|
137
|
+
max_value = _max,
|
|
138
|
+
distribution_type = "uniform"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
value = distribution.generate_value()
|
|
142
|
+
self.value = value
|
|
143
|
+
if save:
|
|
144
|
+
self.save()
|
|
145
|
+
|
|
146
|
+
return value
|
|
147
|
+
|
|
148
|
+
if isinstance(distribution, SingleCategoricalValueDistribution):
|
|
149
|
+
value = distribution.generate_value()
|
|
150
|
+
self.value_str = value
|
|
151
|
+
if save:
|
|
152
|
+
self.save()
|
|
153
|
+
return value
|
|
154
|
+
|
|
155
|
+
elif isinstance(distribution, NumericValueDistribution):
|
|
156
|
+
value = distribution.generate_value()
|
|
157
|
+
self.value = value
|
|
158
|
+
if save:
|
|
159
|
+
self.save()
|
|
160
|
+
return value
|
|
161
|
+
|
|
162
|
+
elif isinstance(distribution, MultipleCategoricalValueDistribution):
|
|
163
|
+
value = distribution.generate_value()
|
|
164
|
+
self.value_str = value
|
|
165
|
+
if save:
|
|
166
|
+
self.save()
|
|
167
|
+
return value
|
|
168
|
+
|
|
169
|
+
elif isinstance(distribution, DateValueDistribution):
|
|
170
|
+
# raise not implemented error
|
|
171
|
+
value = distribution.generate_value()
|
|
172
|
+
self.value = value
|
|
173
|
+
if save:
|
|
174
|
+
self.save()
|
|
175
|
+
|
|
176
|
+
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
from django.utils.translation import gettext_lazy as _
|
|
3
|
-
|
|
4
|
-
class PatientMedication(models.Model):
|
|
5
|
-
patient = models.ForeignKey("Patient", on_delete= models.CASCADE)
|
|
6
|
-
medication_indication = models.ForeignKey(
|
|
7
|
-
"MedicationIndication", on_delete=models.CASCADE,
|
|
8
|
-
related_name="patient_medications", null=True
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
medication_schedules = models.ManyToManyField(
|
|
12
|
-
'MedicationSchedule'
|
|
13
|
-
)
|
|
14
|
-
unit = models.ForeignKey('Unit', on_delete=models.CASCADE)
|
|
15
|
-
dosage = models.JSONField()
|
|
16
|
-
active = models.BooleanField(default=True)
|
|
17
|
-
|
|
18
|
-
objects = models.Manager()
|
|
19
|
-
|
|
20
|
-
class Meta:
|
|
21
|
-
verbose_name = _('Patient Medication')
|
|
22
|
-
verbose_name_plural = _('Patient Medications')
|
|
23
|
-
|
|
24
|
-
@classmethod
|
|
25
|
-
def create_by_patient_and_indication(cls, patient, medication_indication):
|
|
26
|
-
from endoreg_db.models import MedicationIndication
|
|
27
|
-
medication_indication: MedicationIndication
|
|
28
|
-
patient_medication = cls.objects.create(patient=patient, medication_indication=medication_indication)
|
|
29
|
-
patient_medication.save()
|
|
30
|
-
patient_medication.set_schedules_from_indication()
|
|
31
|
-
|
|
32
|
-
return patient_medication
|
|
33
|
-
|
|
34
|
-
def set_schedules_from_indication(self):
|
|
35
|
-
schedules = self.medication_indication.medication_schedules.all()
|
|
36
|
-
self.medication_schedules.set(schedules)
|
|
37
|
-
self.save()
|
|
38
|
-
|
|
39
|
-
def __str__(self):
|
|
40
|
-
indication = self.medication_indication
|
|
41
|
-
schedules = self.medication_schedules.all()
|
|
42
|
-
return f'{indication} - {schedules}'
|
|
43
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
from django.utils.translation import gettext_lazy as _
|
|
3
|
+
|
|
4
|
+
class PatientMedication(models.Model):
|
|
5
|
+
patient = models.ForeignKey("Patient", on_delete= models.CASCADE)
|
|
6
|
+
medication_indication = models.ForeignKey(
|
|
7
|
+
"MedicationIndication", on_delete=models.CASCADE,
|
|
8
|
+
related_name="patient_medications", null=True
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
medication_schedules = models.ManyToManyField(
|
|
12
|
+
'MedicationSchedule'
|
|
13
|
+
)
|
|
14
|
+
unit = models.ForeignKey('Unit', on_delete=models.CASCADE)
|
|
15
|
+
dosage = models.JSONField()
|
|
16
|
+
active = models.BooleanField(default=True)
|
|
17
|
+
|
|
18
|
+
objects = models.Manager()
|
|
19
|
+
|
|
20
|
+
class Meta:
|
|
21
|
+
verbose_name = _('Patient Medication')
|
|
22
|
+
verbose_name_plural = _('Patient Medications')
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def create_by_patient_and_indication(cls, patient, medication_indication):
|
|
26
|
+
from endoreg_db.models import MedicationIndication
|
|
27
|
+
medication_indication: MedicationIndication
|
|
28
|
+
patient_medication = cls.objects.create(patient=patient, medication_indication=medication_indication)
|
|
29
|
+
patient_medication.save()
|
|
30
|
+
patient_medication.set_schedules_from_indication()
|
|
31
|
+
|
|
32
|
+
return patient_medication
|
|
33
|
+
|
|
34
|
+
def set_schedules_from_indication(self):
|
|
35
|
+
schedules = self.medication_indication.medication_schedules.all()
|
|
36
|
+
self.medication_schedules.set(schedules)
|
|
37
|
+
self.save()
|
|
38
|
+
|
|
39
|
+
def __str__(self):
|
|
40
|
+
indication = self.medication_indication
|
|
41
|
+
schedules = self.medication_schedules.all()
|
|
42
|
+
return f'{indication} - {schedules}'
|
|
43
|
+
|
|
44
44
|
|