endoreg-db 0.3.6__py3-none-any.whl → 0.8.6.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/admin.py +92 -3
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +18 -6
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +144 -65
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/{label → ai_model_label}/label/data.yaml +88 -62
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +6 -6
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/{model_type → ai_model_type}/data.yaml +6 -6
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- 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 +90 -59
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -37
- endoreg_db/data/disease/hepatology.yaml +4 -4
- endoreg_db/data/disease/misc.yaml +5 -6
- endoreg_db/data/disease/renal.yaml +4 -4
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -6
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -41
- 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/numeric/data.yaml +14 -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/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +10 -10
- endoreg_db/data/endoscopy_processor/data.yaml +50 -45
- endoreg_db/data/event/cardiology.yaml +15 -28
- 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 +72 -66
- 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 +17 -5
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +105 -0
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -0
- endoreg_db/data/gender/data.yaml +42 -18
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -30
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +5 -5
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -31
- endoreg_db/data/lab_value/coagulation.yaml +54 -49
- endoreg_db/data/lab_value/electrolytes.yaml +228 -190
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -121
- endoreg_db/data/lab_value/hematology.yaml +184 -169
- endoreg_db/data/lab_value/hormones.yaml +59 -53
- endoreg_db/data/lab_value/lipids.yaml +53 -44
- endoreg_db/data/lab_value/misc.yaml +76 -30
- endoreg_db/data/lab_value/renal_function.yaml +12 -11
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/medication/anticoagulation.yaml +64 -64
- endoreg_db/data/medication/tah.yaml +69 -69
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -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/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
- endoreg_db/data/pdf_type/data.yaml +46 -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/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -26
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -19
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +441 -0
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
- endoreg_db/data/unit/concentration.yaml +115 -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 +48 -13
- 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/exceptions.py +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -3
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- 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/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +378 -0
- endoreg_db/helpers/download_segmentation_model.py +31 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +423 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +77 -45
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -128
- endoreg_db/management/commands/load_center_data.py +68 -43
- endoreg_db/management/commands/{load_medication_intake_time_data.py → load_contraindication_data.py} +40 -40
- 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 +61 -39
- endoreg_db/management/commands/load_distribution_data.py +65 -65
- endoreg_db/management/commands/{load_endoscope_type_data.py → load_endoscope_data.py} +67 -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_examination_indication_data.py +86 -0
- endoreg_db/management/commands/load_finding_data.py +128 -0
- endoreg_db/management/commands/load_gender_data.py +43 -43
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +131 -132
- endoreg_db/management/commands/load_information_source.py +50 -44
- endoreg_db/management/commands/load_lab_value_data.py +49 -49
- endoreg_db/management/commands/load_medication_data.py +103 -41
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/{load_medication_indication_type_data.py → load_organ_data.py} +42 -40
- 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_qualification_data.py +59 -0
- endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +45 -45
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- 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 +64 -65
- endoreg_db/management/commands/reset_celery_schedule.py +9 -9
- endoreg_db/management/commands/setup_endoreg_db.py +381 -0
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1857 -582
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/models/__init__.py +359 -74
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/{ai_model → administration/ai}/model_type.py +41 -26
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +15 -6
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +125 -81
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +269 -276
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +86 -73
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +26 -28
- endoreg_db/models/{center → administration/center}/__init__.py +13 -4
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/{persons → administration/person/names}/first_name.py +18 -18
- endoreg_db/models/{persons → administration/person/names}/last_name.py +18 -19
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/{persons → administration/person}/person.py +31 -31
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/__init__.py +14 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/{product → administration/product}/product_weight.py +47 -26
- endoreg_db/models/{product → administration/product}/reference_product.py +130 -99
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -1
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +83 -84
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/label/video_segmentation_labelset.py +27 -0
- endoreg_db/models/media/__init__.py +16 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +757 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +19 -19
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +168 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +182 -143
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +222 -176
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +89 -70
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +40 -5
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/{persons → other}/gender.py +27 -22
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -16
- endoreg_db/models/other/resource.py +21 -17
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -21
- endoreg_db/models/{unit.py → other/unit.py} +32 -22
- endoreg_db/models/other/waste.py +27 -20
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/{rules → rule}/rule.py +27 -24
- endoreg_db/models/{rules → rule}/rule_applicator.py +224 -224
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +16 -18
- endoreg_db/models/{rules → rule}/rule_type.py +19 -21
- endoreg_db/models/{rules → rule}/ruleset.py +17 -19
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/queries/__init__.py +4 -4
- endoreg_db/queries/annotations/__init__.py +2 -2
- endoreg_db/queries/annotations/legacy.py +158 -159
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +118 -10
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +69 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +1259 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +83 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -1
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +5 -8
- endoreg_db/utils/ai/inference_dataset.py +52 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/utils/ai/preprocess.py +68 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/case_generator/case_generator.py +159 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/utils/case_generator/utils.py +30 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/cropping.py +28 -28
- endoreg_db/utils/dataloader.py +175 -92
- endoreg_db/utils/dates.py +60 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +58 -30
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +153 -34
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +76 -0
- endoreg_db/utils/ocr.py +190 -197
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/uuid.py +4 -4
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +275 -0
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/csrf.py +7 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +8 -0
- endoreg_db/views/pdf/pdf_stream.py +187 -0
- endoreg_db/views/pdf/reimport.py +177 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +367 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -3
- endoreg_db-0.8.6.1.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.1.dist-info/RECORD +793 -0
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.8.6.1.dist-info}/WHEEL +1 -1
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.8.6.1.dist-info/licenses}/LICENSE +674 -674
- endoreg_db/data/active_model/data.yaml +0 -3
- endoreg_db/data/label/label-set/data.yaml +0 -18
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/delete_legacy_images.py +0 -19
- endoreg_db/management/commands/delete_legacy_videos.py +0 -17
- endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
- endoreg_db/management/commands/fix_auth_permission.py +0 -20
- endoreg_db/management/commands/import_legacy_images.py +0 -94
- endoreg_db/management/commands/import_legacy_videos.py +0 -76
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_label_data.py +0 -67
- endoreg_db/management/commands/load_medication_indication_data.py +0 -63
- endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
- endoreg_db/migrations/0002_rawvideofile.py +0 -26
- endoreg_db/migrations/0003_rawvideofile_frames_required.py +0 -18
- endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +0 -18
- endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +0 -56
- endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +0 -25
- endoreg_db/migrations/0007_rawvideofile_processor.py +0 -19
- endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +0 -18
- endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +0 -31
- endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +0 -18
- endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +0 -18
- endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +0 -109
- endoreg_db/migrations/0013_rawpdffile.py +0 -31
- endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +0 -38
- endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +0 -31
- endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +0 -18
- endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +0 -37
- endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +0 -37
- endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +0 -42
- endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +0 -18
- endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +0 -19
- endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +0 -19
- endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +0 -59
- endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +0 -27
- endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +0 -42
- endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +0 -166
- endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +0 -38
- endoreg_db/migrations/0028_alter_unit_abbreviation.py +0 -18
- endoreg_db/migrations/0029_medicationintaketime_and_more.py +0 -75
- endoreg_db/migrations/0030_medicationindicationtype_and_more.py +0 -101
- endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +0 -38
- endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +0 -18
- endoreg_db/migrations/0033_medicationindication_sources.py +0 -18
- endoreg_db/migrations/0034_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0035_alter_medicationindication_sources.py +0 -18
- endoreg_db/migrations/0036_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0037_alter_medicationindication_sources.py +0 -18
- endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +0 -164
- endoreg_db/migrations/0039_referenceproduct_name.py +0 -19
- endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +0 -50
- endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +0 -40
- endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +0 -74
- endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +0 -23
- endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +0 -23
- endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +0 -19
- endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +0 -18
- endoreg_db/migrations/0047_casetemplaterule_target_model.py +0 -18
- endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +0 -22
- endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +0 -17
- endoreg_db/migrations/0050_casetemplaterule_rule_values.py +0 -18
- endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +0 -27
- endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +0 -18
- endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +0 -38
- endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +0 -69
- endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +0 -59
- endoreg_db/migrations/0056_datevaluedistribution_and_more.py +0 -32
- endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +0 -72
- endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +0 -28
- endoreg_db/migrations/0059_casetemplaterule_rule_values.py +0 -18
- endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +0 -44
- endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +0 -24
- endoreg_db/migrations/0062_labvalue_numeric_precision.py +0 -18
- endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +0 -18
- endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +0 -23
- endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +0 -58
- endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +0 -29
- endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +0 -19
- endoreg_db/models/ai_model/__init__.py +0 -3
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/model_meta.py +0 -24
- endoreg_db/models/annotation/__init__.py +0 -2
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
- endoreg_db/models/annotation/image_classification.py +0 -27
- endoreg_db/models/center/center.py +0 -25
- endoreg_db/models/center/center_product.py +0 -34
- endoreg_db/models/center/center_resource.py +0 -19
- endoreg_db/models/center/center_waste.py +0 -11
- endoreg_db/models/data_file/__init__.py +0 -6
- endoreg_db/models/data_file/base_classes/__init__.py +0 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
- endoreg_db/models/data_file/frame.py +0 -45
- endoreg_db/models/data_file/import_classes/__init__.py +0 -32
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -188
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
- endoreg_db/models/data_file/metadata/__init__.py +0 -3
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
- endoreg_db/models/data_file/metadata/video_meta.py +0 -133
- endoreg_db/models/data_file/report_file.py +0 -89
- endoreg_db/models/data_file/video/__init__.py +0 -7
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -25
- endoreg_db/models/data_file/video_segment.py +0 -107
- endoreg_db/models/disease.py +0 -56
- endoreg_db/models/emission/__init__.py +0 -1
- endoreg_db/models/emission/emission_factor.py +0 -20
- endoreg_db/models/event.py +0 -22
- endoreg_db/models/examination/__init__.py +0 -4
- endoreg_db/models/examination/examination.py +0 -26
- endoreg_db/models/examination/examination_time.py +0 -27
- endoreg_db/models/examination/examination_time_type.py +0 -24
- endoreg_db/models/examination/examination_type.py +0 -18
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/hardware/endoscope.py +0 -44
- endoreg_db/models/information_source.py +0 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -102
- endoreg_db/models/legacy_data/__init__.py +0 -3
- endoreg_db/models/legacy_data/image.py +0 -34
- endoreg_db/models/medication/__init__.py +0 -1
- endoreg_db/models/medication/medication.py +0 -148
- endoreg_db/models/other/distribution.py +0 -215
- endoreg_db/models/patient_examination/__init__.py +0 -35
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -7
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -16
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/case/case.py +0 -30
- endoreg_db/models/persons/patient/patient.py +0 -216
- endoreg_db/models/persons/patient/patient_disease.py +0 -16
- endoreg_db/models/persons/patient/patient_event.py +0 -22
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
- endoreg_db/models/persons/patient/patient_medication.py +0 -44
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -2
- endoreg_db/models/prediction/image_classification.py +0 -37
- endoreg_db/models/prediction/video_prediction_meta.py +0 -244
- endoreg_db/models/product/__init__.py +0 -5
- endoreg_db/models/product/product.py +0 -97
- endoreg_db/models/product/product_group.py +0 -19
- endoreg_db/models/product/product_material.py +0 -24
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -2
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/__init__.py +0 -2
- endoreg_db/models/report_reader/report_reader_config.py +0 -53
- endoreg_db/models/rules/__init__.py +0 -5
- endoreg_db/queries/get/__init__.py +0 -6
- endoreg_db/queries/get/center.py +0 -42
- endoreg_db/queries/get/model.py +0 -13
- endoreg_db/queries/get/patient.py +0 -14
- endoreg_db/queries/get/patient_examination.py +0 -20
- endoreg_db/queries/get/report_file.py +0 -33
- endoreg_db/queries/get/video.py +0 -31
- endoreg_db/serializers/ai_model.py +0 -19
- endoreg_db/serializers/annotation.py +0 -17
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -13
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -10
- endoreg_db/serializers/prediction.py +0 -15
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -27
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video_metadata.py +0 -87
- endoreg_db-0.3.6.dist-info/METADATA +0 -33
- endoreg_db-0.3.6.dist-info/RECORD +0 -357
- /endoreg_db/{models/persons/patient/case/__init__.py → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/prediction.py → config/__init__.py} +0 -0
- /endoreg_db/{queries/get/video_import_meta.py → data/case_template/rule_value/.init} +0 -0
- /endoreg_db/{queries/get/video_prediction_meta.py → data/distribution/multiple_categorical/.init} +0 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Optional
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from endoreg_db.models import (
|
|
6
|
+
Patient,
|
|
7
|
+
PatientExamination,
|
|
8
|
+
Requirement,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
def get_values_from_kwargs(
|
|
12
|
+
requirement: "Requirement",
|
|
13
|
+
patient: Optional["Patient"] = None,
|
|
14
|
+
patient_examination: Optional["PatientExamination"] = None,
|
|
15
|
+
**kwargs,
|
|
16
|
+
) -> dict:
|
|
17
|
+
"""
|
|
18
|
+
Aggregates and validates input values required for evaluating a requirement.
|
|
19
|
+
|
|
20
|
+
Checks the requirement's types to ensure that necessary parameters such as `patient` or `patient_examination` are provided when required. Raises a ValueError if a required parameter is missing. Returns a dictionary containing the validated inputs and any additional keyword arguments.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
A dictionary with keys for 'patient', 'patient_examination', and any extra keyword arguments.
|
|
24
|
+
"""
|
|
25
|
+
requirement_types = [_.name for _ in requirement.requirement_types]
|
|
26
|
+
# operators = [_.name for _ in requirement.operators] # Uncomment when needed
|
|
27
|
+
|
|
28
|
+
if "patient_examination" in requirement_types:
|
|
29
|
+
if patient_examination is None:
|
|
30
|
+
raise ValueError(
|
|
31
|
+
"patient_examination is required for this requirement type"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
if "patient" in requirement_types:
|
|
35
|
+
if patient is None:
|
|
36
|
+
raise ValueError("patient is required for this requirement type")
|
|
37
|
+
|
|
38
|
+
# Prepare and return the extracted values
|
|
39
|
+
return {"patient": patient, "patient_examination": patient_examination, **kwargs}
|
|
40
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from endoreg_db.models import (
|
|
2
|
+
PatientExamination
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
#TODO this should be a list of all models that are used in the requirement evaluation
|
|
6
|
+
#TODO All those models must have a "get_requirement_links" property
|
|
7
|
+
operator_evaluation_models = [
|
|
8
|
+
PatientExamination,
|
|
9
|
+
]
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Currently those strings MUST match the ones
|
|
2
|
+
# in the requirement_type data definitions
|
|
3
|
+
|
|
4
|
+
from typing import Dict, Union
|
|
5
|
+
from endoreg_db.models import (
|
|
6
|
+
Disease,
|
|
7
|
+
DiseaseClassification,
|
|
8
|
+
DiseaseClassificationChoice,
|
|
9
|
+
Event,
|
|
10
|
+
EventClassification,
|
|
11
|
+
EventClassificationChoice,
|
|
12
|
+
Examination,
|
|
13
|
+
ExaminationIndication,
|
|
14
|
+
Finding,
|
|
15
|
+
FindingIntervention,
|
|
16
|
+
FindingClassification,
|
|
17
|
+
FindingClassificationChoice,
|
|
18
|
+
LabValue,
|
|
19
|
+
PatientDisease,
|
|
20
|
+
PatientEvent,
|
|
21
|
+
PatientExamination,
|
|
22
|
+
PatientFinding,
|
|
23
|
+
PatientFindingClassification,
|
|
24
|
+
PatientFindingIntervention,
|
|
25
|
+
PatientLabValue,
|
|
26
|
+
PatientLabSample, # Assuming PatientLabSample is defined elsewhere,
|
|
27
|
+
Patient,
|
|
28
|
+
PatientMedication, # Added PatientMedication
|
|
29
|
+
PatientMedicationSchedule, # Added PatientMedicationSchedule
|
|
30
|
+
)
|
|
31
|
+
from endoreg_db.models.other.gender import Gender
|
|
32
|
+
# if TYPE_CHECKING:
|
|
33
|
+
# from endoreg_db.models import (
|
|
34
|
+
# RequirementOperator,
|
|
35
|
+
# Patient,
|
|
36
|
+
# )
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
data_model_dict: Dict[str, Union[
|
|
41
|
+
Disease,
|
|
42
|
+
DiseaseClassification,
|
|
43
|
+
DiseaseClassificationChoice,
|
|
44
|
+
Event,
|
|
45
|
+
EventClassification,
|
|
46
|
+
EventClassificationChoice,
|
|
47
|
+
Examination,
|
|
48
|
+
ExaminationIndication,
|
|
49
|
+
Finding,
|
|
50
|
+
FindingIntervention,
|
|
51
|
+
FindingClassification,
|
|
52
|
+
FindingClassificationChoice,
|
|
53
|
+
LabValue,
|
|
54
|
+
PatientDisease,
|
|
55
|
+
PatientEvent,
|
|
56
|
+
PatientExamination,
|
|
57
|
+
PatientFinding,
|
|
58
|
+
PatientFindingIntervention,
|
|
59
|
+
PatientFindingClassification,
|
|
60
|
+
PatientLabValue,
|
|
61
|
+
PatientLabSample,
|
|
62
|
+
Patient,
|
|
63
|
+
PatientMedication, # Added PatientMedication
|
|
64
|
+
PatientMedicationSchedule, # Added PatientMedicationSchedule
|
|
65
|
+
]] = {
|
|
66
|
+
"disease": Disease,
|
|
67
|
+
"disease_classification_choice": DiseaseClassificationChoice,
|
|
68
|
+
"disease_classification": DiseaseClassification,
|
|
69
|
+
"event": Event,
|
|
70
|
+
"event_classification": EventClassification,
|
|
71
|
+
"event_classification_choice": EventClassificationChoice,
|
|
72
|
+
"examination": Examination,
|
|
73
|
+
"examination_indication": ExaminationIndication,
|
|
74
|
+
"finding": Finding,
|
|
75
|
+
"finding_intervention": FindingIntervention,
|
|
76
|
+
"finding_classification": FindingClassification,
|
|
77
|
+
"finding_classification_choice": FindingClassificationChoice,
|
|
78
|
+
"lab_value": LabValue,
|
|
79
|
+
"patient_disease": PatientDisease,
|
|
80
|
+
"patient_event": PatientEvent,
|
|
81
|
+
"patient_examination": PatientExamination,
|
|
82
|
+
"patient_finding": PatientFinding,
|
|
83
|
+
"patient_finding_intervention": PatientFindingIntervention,
|
|
84
|
+
"patient_finding_classification": PatientFindingClassification,
|
|
85
|
+
"patient_lab_value": PatientLabValue,
|
|
86
|
+
"patient_lab_sample": PatientLabSample, # Changed from string "PatientLabSample" to the class
|
|
87
|
+
"patient": Patient,
|
|
88
|
+
"patient_medication": PatientMedication, # Added PatientMedication mapping
|
|
89
|
+
"patient_medication_schedule": PatientMedicationSchedule, # Added PatientMedicationSchedule mapping
|
|
90
|
+
"gender": Gender,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
data_model_dict_reverse = {
|
|
94
|
+
v: k for k, v in data_model_dict.items()
|
|
95
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING, List
|
|
3
|
+
from logging import getLogger # Added logger
|
|
4
|
+
|
|
5
|
+
# see how operator evaluation function is fetched, add to docs #TODO
|
|
6
|
+
# endoreg_db/utils/requirement_operator_logic/model_evaluators.py
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
10
|
+
from .requirement import Requirement # Added Requirement import for type hint
|
|
11
|
+
|
|
12
|
+
logger = getLogger(__name__) # Added logger instance
|
|
13
|
+
|
|
14
|
+
class RequirementOperatorManager(models.Manager):
|
|
15
|
+
def get_by_natural_key(self, name):
|
|
16
|
+
"""
|
|
17
|
+
Retrieves a RequirementOperator instance by its unique name.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
name: The unique name of the RequirementOperator.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
The RequirementOperator instance with the specified name.
|
|
24
|
+
"""
|
|
25
|
+
return self.get(name=name)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class RequirementOperator(models.Model):
|
|
29
|
+
"""
|
|
30
|
+
A class representing a requirement operator.
|
|
31
|
+
|
|
32
|
+
Attributes:
|
|
33
|
+
name (str): The name of the requirement operator.
|
|
34
|
+
description (str): A description of the requirement operator.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
name = models.CharField(max_length=100, unique=True)
|
|
38
|
+
description = models.TextField(blank=True, null=True)
|
|
39
|
+
evaluation_function_name = models.CharField(max_length=255, blank=True, null=True) # Added field
|
|
40
|
+
|
|
41
|
+
objects = RequirementOperatorManager()
|
|
42
|
+
|
|
43
|
+
if TYPE_CHECKING:
|
|
44
|
+
from endoreg_db.models.requirement.requirement import Requirement
|
|
45
|
+
|
|
46
|
+
requirements: models.QuerySet[Requirement]
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def operator_evaluation_models(self):
|
|
50
|
+
"""
|
|
51
|
+
Returns a dictionary of operator evaluation models for this requirement operator.
|
|
52
|
+
|
|
53
|
+
This property dynamically imports and provides access to the available operator evaluation models.
|
|
54
|
+
"""
|
|
55
|
+
from .requirement_evaluation.operator_evaluation_models import operator_evaluation_models
|
|
56
|
+
return operator_evaluation_models
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def data_model_dict(self):
|
|
60
|
+
"""
|
|
61
|
+
Returns the dictionary of data models used for requirement evaluation.
|
|
62
|
+
|
|
63
|
+
This property dynamically imports and provides access to the data model dictionary relevant to requirement operators.
|
|
64
|
+
"""
|
|
65
|
+
from .requirement_evaluation.requirement_type_parser import data_model_dict
|
|
66
|
+
return data_model_dict
|
|
67
|
+
|
|
68
|
+
def natural_key(self):
|
|
69
|
+
"""
|
|
70
|
+
Returns a tuple containing the operator's name as its natural key.
|
|
71
|
+
|
|
72
|
+
The natural key uniquely identifies the requirement operator for serialization and deserialization purposes.
|
|
73
|
+
"""
|
|
74
|
+
return (self.name,)
|
|
75
|
+
|
|
76
|
+
def __str__(self):
|
|
77
|
+
"""
|
|
78
|
+
Returns the name of the requirement operator as its string representation.
|
|
79
|
+
"""
|
|
80
|
+
return str(self.name)
|
|
81
|
+
|
|
82
|
+
def evaluate(self, requirement_links: "RequirementLinks", input_links: "RequirementLinks", **kwargs) -> bool: # Changed signature
|
|
83
|
+
|
|
84
|
+
"""
|
|
85
|
+
Evaluates the requirement operator against the provided requirement links and input_links.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
requirement_links: The RequirementLinks object from the Requirement model.
|
|
89
|
+
input_links: The aggregated RequirementLinks object from the input arguments.
|
|
90
|
+
**kwargs: Additional keyword arguments for specific operator logic.
|
|
91
|
+
For lab value operators, this includes 'requirement' (the Requirement model instance).
|
|
92
|
+
The 'requirement' instance is now passed for all operators.
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
True if the condition defined by the operator is met, False otherwise.
|
|
96
|
+
|
|
97
|
+
Raises:
|
|
98
|
+
NotImplementedError: If the evaluation logic for the operator's name is not implemented.
|
|
99
|
+
"""
|
|
100
|
+
# kwargs should contain 'requirement' (the Requirement instance) passed from Requirement.evaluate()
|
|
101
|
+
if self.evaluation_function_name:
|
|
102
|
+
eval_func = getattr(self, self.evaluation_function_name, None)
|
|
103
|
+
if eval_func and callable(eval_func):
|
|
104
|
+
return eval_func(requirement_links=requirement_links, input_links=input_links, **kwargs)
|
|
105
|
+
else:
|
|
106
|
+
logger.error(
|
|
107
|
+
f"Evaluation function '{self.evaluation_function_name}' "
|
|
108
|
+
f"not found or not callable on {self.__class__.__name__} "
|
|
109
|
+
f"for operator '{self.name}'."
|
|
110
|
+
)
|
|
111
|
+
raise NotImplementedError(
|
|
112
|
+
f"Evaluation function '{self.evaluation_function_name}' "
|
|
113
|
+
f"not implemented correctly for operator '{self.name}'."
|
|
114
|
+
)
|
|
115
|
+
else:
|
|
116
|
+
# Fallback to the central dispatcher if no specific function name is provided
|
|
117
|
+
from endoreg_db.utils.requirement_operator_logic.model_evaluators import dispatch_operator_evaluation
|
|
118
|
+
return dispatch_operator_evaluation(
|
|
119
|
+
operator_name=self.name,
|
|
120
|
+
requirement_links=requirement_links,
|
|
121
|
+
input_links=input_links,
|
|
122
|
+
operator_instance=self, # Pass the operator instance
|
|
123
|
+
**kwargs
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
from ..medical.patient.patient_medication import PatientMedication # Added
|
|
127
|
+
from ..medical.medication import MedicationSchedule as MedicationScheduleTemplate # Added with alias
|
|
128
|
+
|
|
129
|
+
def _evaluate_patient_medication_schedule_matches_template(
|
|
130
|
+
self,
|
|
131
|
+
requirement_links: "RequirementLinks",
|
|
132
|
+
input_links: "RequirementLinks",
|
|
133
|
+
requirement: "Requirement", # Added requirement
|
|
134
|
+
**kwargs,
|
|
135
|
+
) -> bool:
|
|
136
|
+
"""
|
|
137
|
+
Checks if any PatientMedication in the input PatientMedicationSchedule
|
|
138
|
+
matches the profile (medication, dose, unit, intake times)
|
|
139
|
+
of any MedicationSchedule template linked to the requirement.
|
|
140
|
+
"""
|
|
141
|
+
# Get MedicationSchedule templates from the requirement
|
|
142
|
+
req_schedule_templates = requirement_links.medication_schedules
|
|
143
|
+
if not req_schedule_templates:
|
|
144
|
+
# If the requirement doesn't specify any templates to match against,
|
|
145
|
+
# it's ambiguous. Consider this a non-match.
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
# Get PatientMedication instances from the input (derived from PatientMedicationSchedule.links)
|
|
149
|
+
input_patient_medications = input_links.patient_medications
|
|
150
|
+
if not input_patient_medications:
|
|
151
|
+
# If the input schedule has no medications, it cannot match any template.
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
for pm_instance in input_patient_medications:
|
|
155
|
+
pm_intake_times_set = set(pm_instance.intake_times.all())
|
|
156
|
+
for schedule_template in req_schedule_templates:
|
|
157
|
+
template_intake_times_set = set(schedule_template.intake_times.all())
|
|
158
|
+
|
|
159
|
+
# Check for profile match
|
|
160
|
+
medication_match = pm_instance.medication == schedule_template.medication
|
|
161
|
+
dose_match = pm_instance.dosage == schedule_template.dose
|
|
162
|
+
unit_match = pm_instance.unit == schedule_template.unit
|
|
163
|
+
intake_times_match = pm_intake_times_set == template_intake_times_set
|
|
164
|
+
|
|
165
|
+
# Debugging output (optional, can be removed)
|
|
166
|
+
# print(f"Comparing PM ID {pm_instance.id} with Template {schedule_template.name}:")
|
|
167
|
+
# print(f" Medication: {pm_instance.medication} vs {schedule_template.medication} -> {medication_match}")
|
|
168
|
+
# print(f" Dose: {pm_instance.dosage} vs {schedule_template.dose} -> {dose_match}")
|
|
169
|
+
# print(f" Unit: {pm_instance.unit} vs {schedule_template.unit} -> {unit_match}")
|
|
170
|
+
# print(f" Intake Times: {pm_intake_times_set} vs {template_intake_times_set} -> {intake_times_match}")
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
if medication_match and dose_match and unit_match and intake_times_match:
|
|
174
|
+
return True # Found a match
|
|
175
|
+
|
|
176
|
+
return False # No PatientMedication matched any template
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING, List
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP = {
|
|
6
|
+
"all": all,
|
|
7
|
+
"any": any,
|
|
8
|
+
"none": lambda x: not any(x), # Custom function for 'none'
|
|
9
|
+
"exactly_1": lambda x: sum(1 for item in x if item) == 1,
|
|
10
|
+
"at_least_1": lambda x: sum(1 for item in x if item) >= 1, # Equivalent to any(x)
|
|
11
|
+
"at_most_1": lambda x: sum(1 for item in x if item) <= 1,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
class RequirementSetTypeManager(models.Manager):
|
|
15
|
+
"""
|
|
16
|
+
Manager for RequirementSetType with custom query methods.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def get_by_natural_key(self, name: str) -> "RequirementSetType":
|
|
20
|
+
"""
|
|
21
|
+
Retrieves a RequirementSetType instance using its natural key.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
name (str): The unique name that serves as the natural key.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
RequirementSetType: The matching RequirementSetType instance.
|
|
28
|
+
"""
|
|
29
|
+
return self.get(name=name)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class RequirementSetType(models.Model):
|
|
33
|
+
"""
|
|
34
|
+
A class representing a type of requirement set.
|
|
35
|
+
|
|
36
|
+
Attributes:
|
|
37
|
+
name (str): The name of the requirement set type.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
name = models.CharField(max_length=100, unique=True)
|
|
41
|
+
description = models.TextField(blank=True, null=True)
|
|
42
|
+
|
|
43
|
+
objects = RequirementSetTypeManager()
|
|
44
|
+
|
|
45
|
+
if TYPE_CHECKING:
|
|
46
|
+
from endoreg_db.models.requirement import RequirementType
|
|
47
|
+
|
|
48
|
+
requirement_types: models.QuerySet[RequirementType]
|
|
49
|
+
|
|
50
|
+
def natural_key(self):
|
|
51
|
+
"""
|
|
52
|
+
Return the natural key tuple for the instance.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
tuple: A one-element tuple containing the instance's name, used as its natural key.
|
|
56
|
+
"""
|
|
57
|
+
return (self.name,)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class RequirementSetManager(models.Manager):
|
|
61
|
+
def get_by_natural_key(self, name):
|
|
62
|
+
"""
|
|
63
|
+
Retrieves a model instance by its natural key.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
name: The natural key value, typically corresponding to the model's unique name.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
The model instance whose name matches the provided natural key.
|
|
70
|
+
"""
|
|
71
|
+
return self.get(name=name)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class RequirementSet(models.Model):
|
|
75
|
+
"""
|
|
76
|
+
A class representing a set of requirements.
|
|
77
|
+
|
|
78
|
+
Attributes:
|
|
79
|
+
name (str): The name of the requirement set.
|
|
80
|
+
description (str): A description of the requirement set.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
name = models.CharField(max_length=100, unique=True)
|
|
84
|
+
description = models.TextField(blank=True, null=True)
|
|
85
|
+
requirements = models.ManyToManyField( # type: ignore[assignment]
|
|
86
|
+
"Requirement",
|
|
87
|
+
blank=True,
|
|
88
|
+
related_name="requirement_sets",
|
|
89
|
+
)
|
|
90
|
+
links_to_sets = models.ManyToManyField( # type: ignore[assignment]
|
|
91
|
+
"RequirementSet",
|
|
92
|
+
blank=True,
|
|
93
|
+
related_name="links_from_sets",
|
|
94
|
+
)
|
|
95
|
+
requirement_set_type = models.ForeignKey( # type: ignore[assignment]
|
|
96
|
+
"RequirementSetType",
|
|
97
|
+
on_delete=models.CASCADE,
|
|
98
|
+
related_name="requirement_sets",
|
|
99
|
+
blank=True,
|
|
100
|
+
null=True,
|
|
101
|
+
)
|
|
102
|
+
information_sources = models.ManyToManyField( # type: ignore[assignment]
|
|
103
|
+
"InformationSource",
|
|
104
|
+
related_name="requirement_sets",
|
|
105
|
+
blank=True,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
reqset_exam_links = models.ManyToManyField( # type: ignore[assignment]
|
|
109
|
+
"ExaminationRequirementSet",
|
|
110
|
+
related_name="requirement_set",
|
|
111
|
+
blank=True,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
tags = models.ManyToManyField( # type: ignore[assignment]
|
|
115
|
+
"Tag",
|
|
116
|
+
related_name="requirement_sets",
|
|
117
|
+
blank=True,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
objects = RequirementSetManager()
|
|
121
|
+
|
|
122
|
+
if TYPE_CHECKING:
|
|
123
|
+
from endoreg_db.models import Tag, Requirement, InformationSource
|
|
124
|
+
from typing import Optional
|
|
125
|
+
|
|
126
|
+
tags: "models.ManyToManyField[Tag]"
|
|
127
|
+
requirements: "models.Manager[Requirement]"
|
|
128
|
+
information_sources: "models.Manager[InformationSource]"
|
|
129
|
+
requirement_set_type: Optional[RequirementSetType]
|
|
130
|
+
links_to_sets: "models.Manager[RequirementSet]"
|
|
131
|
+
links_from_sets: "models.Manager[RequirementSet]"
|
|
132
|
+
|
|
133
|
+
def natural_key(self):
|
|
134
|
+
"""Return the natural key as a tuple containing the instance's name."""
|
|
135
|
+
return (self.name,)
|
|
136
|
+
|
|
137
|
+
def __str__(self):
|
|
138
|
+
"""
|
|
139
|
+
Returns the name of the requirement set as its string representation.
|
|
140
|
+
"""
|
|
141
|
+
return str(self.name)
|
|
142
|
+
|
|
143
|
+
def evaluate_requirements(self, input_object, mode="loose") -> List[bool]:
|
|
144
|
+
"""
|
|
145
|
+
Evaluates all requirements in the set against the provided input object.
|
|
146
|
+
|
|
147
|
+
Intelligently selects the appropriate input data for each requirement based on its expected model types.
|
|
148
|
+
For example, if a requirement expects PatientFinding but receives a PatientExamination,
|
|
149
|
+
it will use the examination's patient_findings instead.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
input_object: The object to be evaluated by each requirement.
|
|
153
|
+
mode: Optional evaluation mode passed to each requirement (default is "loose").
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
A list of boolean values indicating whether each requirement is satisfied.
|
|
157
|
+
"""
|
|
158
|
+
results = []
|
|
159
|
+
for requirement in self.requirements.all():
|
|
160
|
+
# Get the appropriate input for this specific requirement
|
|
161
|
+
evaluation_input = self._get_evaluation_input_for_requirement(requirement, input_object)
|
|
162
|
+
result = requirement.evaluate(evaluation_input, mode=mode)
|
|
163
|
+
results.append(result)
|
|
164
|
+
return results
|
|
165
|
+
|
|
166
|
+
def _get_evaluation_input_for_requirement(self, requirement, input_object):
|
|
167
|
+
"""
|
|
168
|
+
Determines the appropriate input object for evaluating a specific requirement.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
requirement: The requirement to be evaluated
|
|
172
|
+
input_object: The original input object
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
The most appropriate input object for the requirement evaluation
|
|
176
|
+
"""
|
|
177
|
+
expected_models = requirement.expected_models
|
|
178
|
+
|
|
179
|
+
# If the input object is already one of the expected models, use it directly
|
|
180
|
+
for expected_model in expected_models:
|
|
181
|
+
if isinstance(input_object, expected_model):
|
|
182
|
+
return input_object
|
|
183
|
+
|
|
184
|
+
# Import here to avoid circular imports
|
|
185
|
+
from endoreg_db.models.medical.patient.patient_examination import PatientExamination
|
|
186
|
+
from endoreg_db.models.medical.patient.patient_finding import PatientFinding
|
|
187
|
+
|
|
188
|
+
# Handle PatientExamination -> PatientFinding conversion
|
|
189
|
+
if isinstance(input_object, PatientExamination):
|
|
190
|
+
# If requirement expects PatientFinding, return the examination's findings
|
|
191
|
+
if PatientFinding in expected_models:
|
|
192
|
+
return input_object.patient_findings.all()
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
# Handle other model conversions as needed in the future
|
|
196
|
+
# For now, return the original input object as fallback
|
|
197
|
+
return input_object
|
|
198
|
+
|
|
199
|
+
def evaluate_requirement_sets(self, input_object) -> List[bool]:
|
|
200
|
+
"""
|
|
201
|
+
Evaluates all linked requirement sets against the provided input object.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
A list of boolean values indicating whether each linked requirement set is satisfied.
|
|
205
|
+
"""
|
|
206
|
+
results = []
|
|
207
|
+
linked_sets = self.all_linked_sets
|
|
208
|
+
if not linked_sets:
|
|
209
|
+
return results
|
|
210
|
+
for linked_set in linked_sets:
|
|
211
|
+
result = linked_set.evaluate(input_object)
|
|
212
|
+
results.append(result)
|
|
213
|
+
return results
|
|
214
|
+
|
|
215
|
+
@property
|
|
216
|
+
def eval_function(self):
|
|
217
|
+
"""
|
|
218
|
+
Returns the evaluation function associated with this requirement set's type.
|
|
219
|
+
|
|
220
|
+
If the requirement set type is defined and matches a known type, returns the corresponding function from REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP. Returns None if no matching function is found.
|
|
221
|
+
"""
|
|
222
|
+
if self.requirement_set_type and self.requirement_set_type.name in REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP:
|
|
223
|
+
return REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP[self.requirement_set_type.name]
|
|
224
|
+
return None
|
|
225
|
+
|
|
226
|
+
def evaluate(self, input_object):
|
|
227
|
+
"""
|
|
228
|
+
Evaluates whether the input object satisfies this requirement set.
|
|
229
|
+
|
|
230
|
+
Combines the evaluation results of all direct requirements and linked requirement sets, then applies the set's evaluation function (such as all, any, none, etc.) to determine if the input object meets the overall criteria.
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
input_object: The object to be evaluated against the requirements and linked sets.
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
True if the input object satisfies the requirement set according to its evaluation logic; otherwise, False.
|
|
237
|
+
"""
|
|
238
|
+
evaluate_r_results = self.evaluate_requirements(input_object)
|
|
239
|
+
evaluate_rs_results = self.evaluate_requirement_sets(input_object)
|
|
240
|
+
|
|
241
|
+
results = evaluate_r_results + evaluate_rs_results
|
|
242
|
+
|
|
243
|
+
eval_result = self.eval_function(results) if self.eval_function else all(results)
|
|
244
|
+
|
|
245
|
+
return eval_result
|
|
246
|
+
|
|
247
|
+
@property
|
|
248
|
+
def all_linked_sets(self):
|
|
249
|
+
"""
|
|
250
|
+
Returns all linked requirement sets, including those linked to the current set and those linked to any of its linked sets.
|
|
251
|
+
|
|
252
|
+
Uses recursive traversal with cycle detection to safely handle circular relationships.
|
|
253
|
+
Eliminates duplicates by tracking visited sets.
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
List[RequirementSet]: A list of all linked requirement sets.
|
|
257
|
+
"""
|
|
258
|
+
visited = set()
|
|
259
|
+
result:List["RequirementSet"] = []
|
|
260
|
+
|
|
261
|
+
def _collect_linked_sets(requirement_set:"RequirementSet"):
|
|
262
|
+
"""
|
|
263
|
+
Recursively collect linked sets while avoiding cycles and duplicates.
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
requirement_set: The RequirementSet to process
|
|
267
|
+
"""
|
|
268
|
+
# Use the primary key to track visited sets (avoids issues with object comparison)
|
|
269
|
+
if requirement_set.pk in visited:
|
|
270
|
+
return
|
|
271
|
+
|
|
272
|
+
visited.add(requirement_set.pk)
|
|
273
|
+
|
|
274
|
+
# Process all directly linked sets
|
|
275
|
+
for linked_set in requirement_set.links_to_sets.all():
|
|
276
|
+
if linked_set.pk not in visited:
|
|
277
|
+
result.append(linked_set)
|
|
278
|
+
# Recursively process the linked set's links
|
|
279
|
+
_collect_linked_sets(linked_set)
|
|
280
|
+
|
|
281
|
+
# Start the recursive collection from this instance
|
|
282
|
+
_collect_linked_sets(self)
|
|
283
|
+
|
|
284
|
+
return result
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from .rule_type import RuleType
|
|
2
|
+
from .rule import Rule
|
|
3
|
+
from .ruleset import Ruleset
|
|
4
|
+
from .rule_attribute_dtype import RuleAttributeDType
|
|
5
|
+
from .rule_applicator import RuleApplicator
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"RuleType",
|
|
9
|
+
"Rule",
|
|
10
|
+
"Ruleset",
|
|
11
|
+
"RuleAttributeDType",
|
|
12
|
+
"RuleApplicator",
|
|
13
|
+
]
|
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class RuleManager(models.Manager):
|
|
4
|
-
def get_by_natural_key(self, name):
|
|
5
|
-
return self.get(name=name)
|
|
6
|
-
|
|
7
|
-
class Rule(models.Model):
|
|
8
|
-
name = models.CharField(max_length=255, unique=True)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class RuleManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class Rule(models.Model):
|
|
8
|
+
name = models.CharField(max_length=255, unique=True)
|
|
9
|
+
description = models.TextField(blank=True, null=True)
|
|
10
|
+
attribute_key = models.CharField(max_length=255)
|
|
11
|
+
rule_type = models.ForeignKey("RuleType", on_delete=models.CASCADE)
|
|
12
|
+
attribute_dtype = models.ForeignKey("RuleAttributeDType", on_delete=models.CASCADE)
|
|
13
|
+
|
|
14
|
+
objects = RuleManager()
|
|
15
|
+
|
|
16
|
+
class Meta:
|
|
17
|
+
verbose_name = 'Rule'
|
|
18
|
+
verbose_name_plural = 'Rules'
|
|
19
|
+
|
|
20
|
+
def natural_key(self):
|
|
21
|
+
"""
|
|
22
|
+
Return a tuple representing the natural key for this Rule instance.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
tuple: A one-element tuple containing the Rule's unique name.
|
|
26
|
+
"""
|
|
27
|
+
return (self.name,)
|