endoreg-db 0.3.5__py3-none-any.whl → 0.3.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- endoreg_db/admin.py +3 -3
- endoreg_db/apps.py +6 -6
- endoreg_db/data/__init__.py +64 -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_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/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/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 +128 -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_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/models/__init__.py +74 -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/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.5.dist-info → endoreg_db-0.3.6.dist-info}/LICENSE +674 -674
- {endoreg_db-0.3.5.dist-info → endoreg_db-0.3.6.dist-info}/METADATA +2 -2
- endoreg_db-0.3.6.dist-info/RECORD +357 -0
- {endoreg_db-0.3.5.dist-info → endoreg_db-0.3.6.dist-info}/WHEEL +1 -1
- endoreg_db-0.3.5.dist-info/RECORD +0 -357
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
from .model_meta import ModelMeta
|
|
2
|
-
|
|
3
|
-
# get latest model meta by model name
|
|
4
|
-
|
|
5
|
-
# TODO MOVE THIS TO A QUERY FILE
|
|
6
|
-
def get_latest_model_meta_by_model_name(model_name):
|
|
7
|
-
model_meta = ModelMeta.objects.filter(name=model_name).order_by('-version').first()
|
|
8
|
-
return model_meta
|
|
1
|
+
from .model_meta import ModelMeta
|
|
2
|
+
|
|
3
|
+
# get latest model meta by model name
|
|
4
|
+
|
|
5
|
+
# TODO MOVE THIS TO A QUERY FILE
|
|
6
|
+
def get_latest_model_meta_by_model_name(model_name):
|
|
7
|
+
model_meta = ModelMeta.objects.filter(name=model_name).order_by('-version').first()
|
|
8
|
+
return model_meta
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
from .image_classification import ImageClassificationAnnotation
|
|
1
|
+
from .image_classification import ImageClassificationAnnotation
|
|
2
2
|
from .binary_classification_annotation_task import LegacyBinaryClassificationAnnotationTask, BinaryClassificationAnnotationTask
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
from rest_framework import serializers
|
|
3
|
-
from ..label import Label
|
|
4
|
-
from ..data_file.video_segment import LegacyLabelVideoSegment
|
|
5
|
-
from .image_classification import ImageClassificationAnnotation
|
|
6
|
-
|
|
7
|
-
ANNOTATION_PER_S_THRESHOLD = 2
|
|
8
|
-
|
|
9
|
-
def clear_finished_legacy_tasks():
|
|
10
|
-
# fetch all BinaryClassificationAnnotationTasks that are finished and delete them
|
|
11
|
-
tasks = LegacyBinaryClassificationAnnotationTask.objects.filter(finished=True)
|
|
12
|
-
|
|
13
|
-
# delete tasks with a bulk operation
|
|
14
|
-
tasks.delete()
|
|
15
|
-
|
|
16
|
-
def get_legacy_binary_classification_annotation_tasks_by_label(label:Label, n:int=100, legacy=False):
|
|
17
|
-
clear_finished_legacy_tasks()
|
|
18
|
-
|
|
19
|
-
if legacy:
|
|
20
|
-
# fetch all LegacyLabelVideoSegments with the given label
|
|
21
|
-
_segments = LegacyLabelVideoSegment.objects.filter(label=label)
|
|
22
|
-
frames_for_tasks = []
|
|
23
|
-
|
|
24
|
-
for segment in _segments:
|
|
25
|
-
# check if the segment has already been annotated
|
|
26
|
-
annotations = list(ImageClassificationAnnotation.objects.filter(legacy_frame__in=segment.get_frames(), label=label))
|
|
27
|
-
segment_len_in_s = segment.get_segment_len_in_s()
|
|
28
|
-
|
|
29
|
-
target_annotation_number = segment_len_in_s * ANNOTATION_PER_S_THRESHOLD
|
|
30
|
-
|
|
31
|
-
if len(annotations) < target_annotation_number:
|
|
32
|
-
get_frame_number = int(target_annotation_number - len(annotations))
|
|
33
|
-
frames = segment.get_frames_without_annotation(get_frame_number)
|
|
34
|
-
frames_for_tasks.extend(frames)
|
|
35
|
-
|
|
36
|
-
if len(frames_for_tasks) >= n:
|
|
37
|
-
break
|
|
38
|
-
|
|
39
|
-
# create tasks
|
|
40
|
-
tasks = []
|
|
41
|
-
for frame in frames_for_tasks:
|
|
42
|
-
|
|
43
|
-
# get_or_create task
|
|
44
|
-
task, created = LegacyBinaryClassificationAnnotationTask.objects.get_or_create(
|
|
45
|
-
label=label,
|
|
46
|
-
image_path=frame.image.path,
|
|
47
|
-
frame_id=frame.pk,
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
class AbstractBinaryClassificationAnnotationTask(models.Model):
|
|
52
|
-
label = models.ForeignKey("Label", on_delete=models.CASCADE)
|
|
53
|
-
is_finished = models.BooleanField(default=False)
|
|
54
|
-
date_created = models.DateTimeField(auto_now_add=True)
|
|
55
|
-
date_finished = models.DateTimeField(blank=True, null=True)
|
|
56
|
-
image_path = models.CharField(max_length=255, blank=True, null=True)
|
|
57
|
-
image_type = models.CharField(max_length=255, blank=True, null=True)
|
|
58
|
-
frame_id = models.IntegerField(blank=True, null=True)
|
|
59
|
-
labelstudio_project_id = models.IntegerField(blank=True, null=True)
|
|
60
|
-
labelstudio_task_id = models.IntegerField(blank=True, null=True)
|
|
61
|
-
|
|
62
|
-
class Meta:
|
|
63
|
-
abstract = True
|
|
64
|
-
|
|
65
|
-
class BinaryClassificationAnnotationTask(AbstractBinaryClassificationAnnotationTask):
|
|
66
|
-
frame = models.ForeignKey("Frame", on_delete=models.CASCADE, related_name="binary_classification_annotation_tasks")
|
|
67
|
-
image_type = models.CharField(max_length=255, default="frame")
|
|
68
|
-
|
|
69
|
-
def get_frame(self):
|
|
70
|
-
return self.video_segment.get_frame_by_id(self.frame_id)
|
|
71
|
-
|
|
72
|
-
class LegacyBinaryClassificationAnnotationTask(AbstractBinaryClassificationAnnotationTask):
|
|
73
|
-
frame = models.ForeignKey("LegacyFrame", on_delete=models.CASCADE, related_name="binary_classification_annotation_tasks")
|
|
74
|
-
image_type = models.CharField(max_length=255, default="legacy")
|
|
75
|
-
|
|
76
|
-
def get_frame(self):
|
|
77
|
-
return self.frame
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
from ..label import Label
|
|
4
|
+
from ..data_file.video_segment import LegacyLabelVideoSegment
|
|
5
|
+
from .image_classification import ImageClassificationAnnotation
|
|
6
|
+
|
|
7
|
+
ANNOTATION_PER_S_THRESHOLD = 2
|
|
8
|
+
|
|
9
|
+
def clear_finished_legacy_tasks():
|
|
10
|
+
# fetch all BinaryClassificationAnnotationTasks that are finished and delete them
|
|
11
|
+
tasks = LegacyBinaryClassificationAnnotationTask.objects.filter(finished=True)
|
|
12
|
+
|
|
13
|
+
# delete tasks with a bulk operation
|
|
14
|
+
tasks.delete()
|
|
15
|
+
|
|
16
|
+
def get_legacy_binary_classification_annotation_tasks_by_label(label:Label, n:int=100, legacy=False):
|
|
17
|
+
clear_finished_legacy_tasks()
|
|
18
|
+
|
|
19
|
+
if legacy:
|
|
20
|
+
# fetch all LegacyLabelVideoSegments with the given label
|
|
21
|
+
_segments = LegacyLabelVideoSegment.objects.filter(label=label)
|
|
22
|
+
frames_for_tasks = []
|
|
23
|
+
|
|
24
|
+
for segment in _segments:
|
|
25
|
+
# check if the segment has already been annotated
|
|
26
|
+
annotations = list(ImageClassificationAnnotation.objects.filter(legacy_frame__in=segment.get_frames(), label=label))
|
|
27
|
+
segment_len_in_s = segment.get_segment_len_in_s()
|
|
28
|
+
|
|
29
|
+
target_annotation_number = segment_len_in_s * ANNOTATION_PER_S_THRESHOLD
|
|
30
|
+
|
|
31
|
+
if len(annotations) < target_annotation_number:
|
|
32
|
+
get_frame_number = int(target_annotation_number - len(annotations))
|
|
33
|
+
frames = segment.get_frames_without_annotation(get_frame_number)
|
|
34
|
+
frames_for_tasks.extend(frames)
|
|
35
|
+
|
|
36
|
+
if len(frames_for_tasks) >= n:
|
|
37
|
+
break
|
|
38
|
+
|
|
39
|
+
# create tasks
|
|
40
|
+
tasks = []
|
|
41
|
+
for frame in frames_for_tasks:
|
|
42
|
+
|
|
43
|
+
# get_or_create task
|
|
44
|
+
task, created = LegacyBinaryClassificationAnnotationTask.objects.get_or_create(
|
|
45
|
+
label=label,
|
|
46
|
+
image_path=frame.image.path,
|
|
47
|
+
frame_id=frame.pk,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class AbstractBinaryClassificationAnnotationTask(models.Model):
|
|
52
|
+
label = models.ForeignKey("Label", on_delete=models.CASCADE)
|
|
53
|
+
is_finished = models.BooleanField(default=False)
|
|
54
|
+
date_created = models.DateTimeField(auto_now_add=True)
|
|
55
|
+
date_finished = models.DateTimeField(blank=True, null=True)
|
|
56
|
+
image_path = models.CharField(max_length=255, blank=True, null=True)
|
|
57
|
+
image_type = models.CharField(max_length=255, blank=True, null=True)
|
|
58
|
+
frame_id = models.IntegerField(blank=True, null=True)
|
|
59
|
+
labelstudio_project_id = models.IntegerField(blank=True, null=True)
|
|
60
|
+
labelstudio_task_id = models.IntegerField(blank=True, null=True)
|
|
61
|
+
|
|
62
|
+
class Meta:
|
|
63
|
+
abstract = True
|
|
64
|
+
|
|
65
|
+
class BinaryClassificationAnnotationTask(AbstractBinaryClassificationAnnotationTask):
|
|
66
|
+
frame = models.ForeignKey("Frame", on_delete=models.CASCADE, related_name="binary_classification_annotation_tasks")
|
|
67
|
+
image_type = models.CharField(max_length=255, default="frame")
|
|
68
|
+
|
|
69
|
+
def get_frame(self):
|
|
70
|
+
return self.video_segment.get_frame_by_id(self.frame_id)
|
|
71
|
+
|
|
72
|
+
class LegacyBinaryClassificationAnnotationTask(AbstractBinaryClassificationAnnotationTask):
|
|
73
|
+
frame = models.ForeignKey("LegacyFrame", on_delete=models.CASCADE, related_name="binary_classification_annotation_tasks")
|
|
74
|
+
image_type = models.CharField(max_length=255, default="legacy")
|
|
75
|
+
|
|
76
|
+
def get_frame(self):
|
|
77
|
+
return self.frame
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class ImageClassificationAnnotation(models.Model):
|
|
4
|
-
"""
|
|
5
|
-
A class representing an image classification annotation.
|
|
6
|
-
|
|
7
|
-
Attributes:
|
|
8
|
-
label (str): The label that was assigned to the image.
|
|
9
|
-
confidence (float): The confidence that the label is correct.
|
|
10
|
-
annotator (User): The user that created this annotation.
|
|
11
|
-
date (datetime.datetime): The date and time when this annotation was created.
|
|
12
|
-
|
|
13
|
-
"""
|
|
14
|
-
# Foreign keys to Frame, LegacyFrame, and LegacyImage (only one of these should be set)
|
|
15
|
-
frame = models.ForeignKey("Frame", on_delete=models.CASCADE, blank=True, null=True, related_name="image_classification_annotations")
|
|
16
|
-
legacy_frame = models.ForeignKey("LegacyFrame", on_delete=models.CASCADE, blank=True, null=True, related_name="image_classification_annotations")
|
|
17
|
-
legacy_image = models.ForeignKey("LegacyImage", on_delete=models.CASCADE, blank=True, null=True, related_name="image_classification_annotations")
|
|
18
|
-
|
|
19
|
-
label = models.ForeignKey("Label", on_delete=models.CASCADE, related_name="image_classification_annotations")
|
|
20
|
-
value = models.BooleanField()
|
|
21
|
-
annotator = models.CharField(max_length=255)
|
|
22
|
-
date_created = models.DateTimeField(auto_now_add=True)
|
|
23
|
-
date_modified = models.DateTimeField(auto_now=True)
|
|
24
|
-
|
|
25
|
-
def __str__(self):
|
|
26
|
-
return self.label.name + " - " + str(self.value)
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class ImageClassificationAnnotation(models.Model):
|
|
4
|
+
"""
|
|
5
|
+
A class representing an image classification annotation.
|
|
6
|
+
|
|
7
|
+
Attributes:
|
|
8
|
+
label (str): The label that was assigned to the image.
|
|
9
|
+
confidence (float): The confidence that the label is correct.
|
|
10
|
+
annotator (User): The user that created this annotation.
|
|
11
|
+
date (datetime.datetime): The date and time when this annotation was created.
|
|
12
|
+
|
|
13
|
+
"""
|
|
14
|
+
# Foreign keys to Frame, LegacyFrame, and LegacyImage (only one of these should be set)
|
|
15
|
+
frame = models.ForeignKey("Frame", on_delete=models.CASCADE, blank=True, null=True, related_name="image_classification_annotations")
|
|
16
|
+
legacy_frame = models.ForeignKey("LegacyFrame", on_delete=models.CASCADE, blank=True, null=True, related_name="image_classification_annotations")
|
|
17
|
+
legacy_image = models.ForeignKey("LegacyImage", on_delete=models.CASCADE, blank=True, null=True, related_name="image_classification_annotations")
|
|
18
|
+
|
|
19
|
+
label = models.ForeignKey("Label", on_delete=models.CASCADE, related_name="image_classification_annotations")
|
|
20
|
+
value = models.BooleanField()
|
|
21
|
+
annotator = models.CharField(max_length=255)
|
|
22
|
+
date_created = models.DateTimeField(auto_now_add=True)
|
|
23
|
+
date_modified = models.DateTimeField(auto_now=True)
|
|
24
|
+
|
|
25
|
+
def __str__(self):
|
|
26
|
+
return self.label.name + " - " + str(self.value)
|
|
27
27
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Django models to define CaseTemplate and CaseTemplateType models
|
|
2
|
-
# (each with "name" field which acts as a natural key)
|
|
3
|
-
from .case_template_rule import CaseTemplateRule, CaseTemplateRuleType
|
|
4
|
-
from .case_template_rule_value import CaseTemplateRuleValue, CaseTemplateRuleValueType
|
|
5
|
-
from .case_template_type import CaseTemplateType
|
|
1
|
+
# Django models to define CaseTemplate and CaseTemplateType models
|
|
2
|
+
# (each with "name" field which acts as a natural key)
|
|
3
|
+
from .case_template_rule import CaseTemplateRule, CaseTemplateRuleType
|
|
4
|
+
from .case_template_rule_value import CaseTemplateRuleValue, CaseTemplateRuleValueType
|
|
5
|
+
from .case_template_type import CaseTemplateType
|
|
6
6
|
from .case_template import CaseTemplate
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class CaseTemplateManager(models.Manager):
|
|
4
|
-
def get_by_natural_key(self, name):
|
|
5
|
-
return self.get(name=name)
|
|
6
|
-
|
|
7
|
-
class CaseTemplate(models.Model):
|
|
8
|
-
"""
|
|
9
|
-
A class representing a case template.
|
|
10
|
-
|
|
11
|
-
Attributes:
|
|
12
|
-
name (str): The name of the case template. This is the natural key.
|
|
13
|
-
case_template_type (CaseTemplateType): The type of the case template.
|
|
14
|
-
description (str): A description of the case template.
|
|
15
|
-
|
|
16
|
-
"""
|
|
17
|
-
name = models.CharField(max_length=255, unique=True)
|
|
18
|
-
template_type = models.ForeignKey("CaseTemplateType", on_delete=models.CASCADE, related_name="case_templates")
|
|
19
|
-
description = models.TextField(blank=True, null=True)
|
|
20
|
-
|
|
21
|
-
rules = models.ManyToManyField(
|
|
22
|
-
"CaseTemplateRule",
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
secondary_rules = models.ManyToManyField(
|
|
26
|
-
"CaseTemplateRule",
|
|
27
|
-
related_name="secondary_rules"
|
|
28
|
-
)
|
|
29
|
-
|
|
30
|
-
objects = CaseTemplateManager()
|
|
31
|
-
|
|
32
|
-
def natural_key(self):
|
|
33
|
-
return (self.name,)
|
|
34
|
-
|
|
35
|
-
def __str__(self):
|
|
36
|
-
return self.name
|
|
37
|
-
|
|
38
|
-
def get_rules(self):
|
|
39
|
-
rules = self.rules.all()
|
|
40
|
-
return rules
|
|
41
|
-
|
|
42
|
-
def get_secondary_rules(self):
|
|
43
|
-
rules = self.secondary_rules.all()
|
|
44
|
-
return rules
|
|
45
|
-
|
|
46
|
-
def _assert_max_one_create_patient_rule(self):
|
|
47
|
-
"""Asserts that there is at most one rule with the rule_type__name "create-object" and target_model__name "Patient"."""
|
|
48
|
-
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model__name="Patient")
|
|
49
|
-
if len(create_patient_rules) > 1:
|
|
50
|
-
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'.")
|
|
51
|
-
|
|
52
|
-
# custom save method which runs the _assert_max_one_create_patient_rule method and others
|
|
53
|
-
def save(self, *args, **kwargs):
|
|
54
|
-
# self._assert_max_one_create_patient_rule() #TODO Fails on first save since many to many can only be used if object has an id
|
|
55
|
-
super().save(*args, **kwargs)
|
|
56
|
-
|
|
57
|
-
def get_create_patient_rule(self):
|
|
58
|
-
"""Filter the rules for the rule which has the rule_type__name "create-object" and target_model__name "Patient".
|
|
59
|
-
Also makes sure, that only 1 is returned. If there is no such rule, get default create patient rule.
|
|
60
|
-
"""
|
|
61
|
-
from endoreg_db.models.case_template.case_template_rule import CaseTemplateRule
|
|
62
|
-
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model="Patient")
|
|
63
|
-
if len(create_patient_rules) > 1:
|
|
64
|
-
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'.")
|
|
65
|
-
elif len(create_patient_rules) == 0:
|
|
66
|
-
create_patient_rules = CaseTemplateRule.objects.get_default_create_patient_rule()
|
|
67
|
-
return create_patient_rules[0]
|
|
68
|
-
|
|
69
|
-
def get_create_patient_medication_schedule_rule(self):
|
|
70
|
-
"""Filter the rules for the rule which has the rule_type__name "create-object" and target_model__name "PatientMedicationSchedule".
|
|
71
|
-
Also makes sure, that only 1 is returned. If there is no such rule, get default create patient medication schedule rule.
|
|
72
|
-
"""
|
|
73
|
-
from endoreg_db.models.case_template.case_template_rule import CaseTemplateRule
|
|
74
|
-
create_patient_medication_schedule_rules = self.rules.filter(rule_type__name="create-object", target_model="PatientMedicationSchedule")
|
|
75
|
-
if len(create_patient_medication_schedule_rules) > 1:
|
|
76
|
-
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'PatientMedicationSchedule'.")
|
|
77
|
-
elif len(create_patient_medication_schedule_rules) == 0:
|
|
78
|
-
from warnings import warn
|
|
79
|
-
warn("No create patient medication schedule rule found. Using default create patient medication schedule rule.")
|
|
80
|
-
create_patient_medication_schedule_rules = CaseTemplateRule.objects.get_default_create_patient_medication_schedule_rule()
|
|
81
|
-
return create_patient_medication_schedule_rules[0]
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class CaseTemplateManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class CaseTemplate(models.Model):
|
|
8
|
+
"""
|
|
9
|
+
A class representing a case template.
|
|
10
|
+
|
|
11
|
+
Attributes:
|
|
12
|
+
name (str): The name of the case template. This is the natural key.
|
|
13
|
+
case_template_type (CaseTemplateType): The type of the case template.
|
|
14
|
+
description (str): A description of the case template.
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
name = models.CharField(max_length=255, unique=True)
|
|
18
|
+
template_type = models.ForeignKey("CaseTemplateType", on_delete=models.CASCADE, related_name="case_templates")
|
|
19
|
+
description = models.TextField(blank=True, null=True)
|
|
20
|
+
|
|
21
|
+
rules = models.ManyToManyField(
|
|
22
|
+
"CaseTemplateRule",
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
secondary_rules = models.ManyToManyField(
|
|
26
|
+
"CaseTemplateRule",
|
|
27
|
+
related_name="secondary_rules"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
objects = CaseTemplateManager()
|
|
31
|
+
|
|
32
|
+
def natural_key(self):
|
|
33
|
+
return (self.name,)
|
|
34
|
+
|
|
35
|
+
def __str__(self):
|
|
36
|
+
return self.name
|
|
37
|
+
|
|
38
|
+
def get_rules(self):
|
|
39
|
+
rules = self.rules.all()
|
|
40
|
+
return rules
|
|
41
|
+
|
|
42
|
+
def get_secondary_rules(self):
|
|
43
|
+
rules = self.secondary_rules.all()
|
|
44
|
+
return rules
|
|
45
|
+
|
|
46
|
+
def _assert_max_one_create_patient_rule(self):
|
|
47
|
+
"""Asserts that there is at most one rule with the rule_type__name "create-object" and target_model__name "Patient"."""
|
|
48
|
+
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model__name="Patient")
|
|
49
|
+
if len(create_patient_rules) > 1:
|
|
50
|
+
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'.")
|
|
51
|
+
|
|
52
|
+
# custom save method which runs the _assert_max_one_create_patient_rule method and others
|
|
53
|
+
def save(self, *args, **kwargs):
|
|
54
|
+
# self._assert_max_one_create_patient_rule() #TODO Fails on first save since many to many can only be used if object has an id
|
|
55
|
+
super().save(*args, **kwargs)
|
|
56
|
+
|
|
57
|
+
def get_create_patient_rule(self):
|
|
58
|
+
"""Filter the rules for the rule which has the rule_type__name "create-object" and target_model__name "Patient".
|
|
59
|
+
Also makes sure, that only 1 is returned. If there is no such rule, get default create patient rule.
|
|
60
|
+
"""
|
|
61
|
+
from endoreg_db.models.case_template.case_template_rule import CaseTemplateRule
|
|
62
|
+
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model="Patient")
|
|
63
|
+
if len(create_patient_rules) > 1:
|
|
64
|
+
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'.")
|
|
65
|
+
elif len(create_patient_rules) == 0:
|
|
66
|
+
create_patient_rules = CaseTemplateRule.objects.get_default_create_patient_rule()
|
|
67
|
+
return create_patient_rules[0]
|
|
68
|
+
|
|
69
|
+
def get_create_patient_medication_schedule_rule(self):
|
|
70
|
+
"""Filter the rules for the rule which has the rule_type__name "create-object" and target_model__name "PatientMedicationSchedule".
|
|
71
|
+
Also makes sure, that only 1 is returned. If there is no such rule, get default create patient medication schedule rule.
|
|
72
|
+
"""
|
|
73
|
+
from endoreg_db.models.case_template.case_template_rule import CaseTemplateRule
|
|
74
|
+
create_patient_medication_schedule_rules = self.rules.filter(rule_type__name="create-object", target_model="PatientMedicationSchedule")
|
|
75
|
+
if len(create_patient_medication_schedule_rules) > 1:
|
|
76
|
+
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'PatientMedicationSchedule'.")
|
|
77
|
+
elif len(create_patient_medication_schedule_rules) == 0:
|
|
78
|
+
from warnings import warn
|
|
79
|
+
warn("No create patient medication schedule rule found. Using default create patient medication schedule rule.")
|
|
80
|
+
create_patient_medication_schedule_rules = CaseTemplateRule.objects.get_default_create_patient_medication_schedule_rule()
|
|
81
|
+
return create_patient_medication_schedule_rules[0]
|