endoreg-db 0.8.6.4__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/__init__.py +0 -0
- endoreg_db/admin.py +92 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +18 -0
- 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/__init__.py +0 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +144 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- 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/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- 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 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +91 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- 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 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/examination/examinations/data.yaml +72 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +8 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- 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 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- 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 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- 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/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- 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 +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- 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 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- 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 -0
- 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/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -0
- 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 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +8 -0
- endoreg_db/forms/unit.py +6 -0
- 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 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +62 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_data.py +68 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +75 -0
- 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 +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
- endoreg_db/management/commands/load_information_source.py +51 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_medication_data.py +103 -0
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_organ_data.py +43 -0
- endoreg_db/management/commands/load_pdf_type_data.py +61 -0
- endoreg_db/management/commands/load_profession_data.py +44 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
- 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 +46 -0
- endoreg_db/management/commands/load_user_groups.py +28 -0
- endoreg_db/management/commands/register_ai_model.py +64 -0
- endoreg_db/management/commands/reset_celery_schedule.py +9 -0
- 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 -0
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +359 -0
- 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/administration/ai/model_type.py +41 -0
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +15 -0
- endoreg_db/models/administration/case/case_template/case_template.py +125 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- 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/administration/person/names/first_name.py +18 -0
- endoreg_db/models/administration/person/names/last_name.py +19 -0
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/person.py +31 -0
- 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/administration/product/product_weight.py +47 -0
- endoreg_db/models/administration/product/reference_product.py +130 -0
- 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 -0
- 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 -0
- 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/media/pdf/report_reader/report_reader_flag.py +20 -0
- 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/medical/hardware/endoscopy_processor.py +182 -0
- 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/medical/patient/patient_lab_value.py +222 -0
- 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/metadata/pdf_meta.py +89 -0
- 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 -0
- 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/other/gender.py +27 -0
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -0
- endoreg_db/models/other/resource.py +22 -0
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -0
- endoreg_db/models/other/unit.py +32 -0
- endoreg_db/models/other/waste.py +27 -0
- 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/rule/rule.py +27 -0
- endoreg_db/models/rule/rule_applicator.py +224 -0
- endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
- endoreg_db/models/rule/rule_type.py +20 -0
- endoreg_db/models/rule/ruleset.py +17 -0
- 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 +5 -0
- endoreg_db/queries/annotations/__init__.py +3 -0
- endoreg_db/queries/annotations/legacy.py +158 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- 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 -0
- 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 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/get.py +5 -0
- 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 +29 -0
- endoreg_db/utils/dataloader.py +175 -0
- 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 -0
- 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 -0
- 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 -0
- 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 -0
- 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 +274 -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 +186 -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 -0
- endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
- endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
- endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import datetime # Add import
|
|
2
|
+
from datetime import timedelta # Add import
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
7
|
+
from endoreg_db.models.requirement.requirement import Requirement
|
|
8
|
+
# from endoreg_db.models import Unit # Potentially needed for dynamic unit handling
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# Helper function to check if a date is within the timeframe specified by a Requirement
|
|
12
|
+
def _is_date_in_timeframe(date_to_check: datetime.date | None, requirement: "Requirement") -> bool:
|
|
13
|
+
"""
|
|
14
|
+
Checks if a given date falls within the timeframe specified by a Requirement.
|
|
15
|
+
|
|
16
|
+
The timeframe is defined by `numeric_value_min` and `numeric_value_max` on the
|
|
17
|
+
Requirement, interpreted relative to the current date.
|
|
18
|
+
|
|
19
|
+
Currently, this function only supports timeframes specified in "days".
|
|
20
|
+
If the Requirement's unit is not "days", a NotImplementedError will be raised.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
date_to_check: The date to evaluate. If None, returns False.
|
|
24
|
+
requirement: The Requirement instance containing timeframe definitions
|
|
25
|
+
(unit, numeric_value_min, numeric_value_max).
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
True if the date_to_check is within the defined timeframe, False otherwise.
|
|
29
|
+
Returns False if date_to_check is None or if the requirement lacks
|
|
30
|
+
necessary timeframe information (unit, min/max values).
|
|
31
|
+
|
|
32
|
+
Raises:
|
|
33
|
+
NotImplementedError: If the requirement.unit.name is not 'days' (case-insensitive).
|
|
34
|
+
"""
|
|
35
|
+
if date_to_check is None:
|
|
36
|
+
return False
|
|
37
|
+
if not requirement.unit or requirement.numeric_value_min is None or requirement.numeric_value_max is None:
|
|
38
|
+
return False # Not enough information for timeframe evaluation
|
|
39
|
+
|
|
40
|
+
# For now, primarily supporting 'days'. Extend if other units are common.
|
|
41
|
+
if requirement.unit.name.lower() != "days":
|
|
42
|
+
raise NotImplementedError(
|
|
43
|
+
f"Timeframe unit '{requirement.unit.name}' is not supported. "
|
|
44
|
+
"Currently, only 'days' is implemented for timeframe checks."
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
today = datetime.date.today()
|
|
48
|
+
# numeric_value_min is typically negative for "days ago" (e.g., -30 for 30 days ago)
|
|
49
|
+
# numeric_value_max is typically 0 for "today"
|
|
50
|
+
timeframe_start_delta = int(requirement.numeric_value_min)
|
|
51
|
+
timeframe_end_delta = int(requirement.numeric_value_max)
|
|
52
|
+
|
|
53
|
+
start_date_bound = today + timedelta(days=timeframe_start_delta)
|
|
54
|
+
end_date_bound = today + timedelta(days=timeframe_end_delta)
|
|
55
|
+
|
|
56
|
+
return start_date_bound <= date_to_check <= end_date_bound
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _evaluate_models_match_any(
|
|
60
|
+
requirement_links: "RequirementLinks",
|
|
61
|
+
input_links: "RequirementLinks",
|
|
62
|
+
**kwargs
|
|
63
|
+
) -> bool:
|
|
64
|
+
"""
|
|
65
|
+
Checks if the requirement_links matches any of the input_links.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
requirement_links: The reference set of requirement links to compare against.
|
|
69
|
+
input_links: The aggregated requirement links from the input objects.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
True if the input set of requirement links matches according to requirement_links.match_any; otherwise, False.
|
|
73
|
+
"""
|
|
74
|
+
return requirement_links.match_any(input_links)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _evaluate_models_match_any_in_timeframe(
|
|
78
|
+
requirement_links: "RequirementLinks",
|
|
79
|
+
input_links: "RequirementLinks",
|
|
80
|
+
requirement: "Requirement", # Explicitly pass Requirement
|
|
81
|
+
**kwargs # Keep for consistency, though 'requirement' is the main one used here
|
|
82
|
+
) -> bool:
|
|
83
|
+
"""
|
|
84
|
+
Checks if any relevant model in input_links matches a model specified in
|
|
85
|
+
requirement_links AND falls within the timeframe defined on the Requirement.
|
|
86
|
+
|
|
87
|
+
Currently focuses on PatientEvent instances and their dates.
|
|
88
|
+
"""
|
|
89
|
+
active_req_links_dict = requirement_links.active()
|
|
90
|
+
if not active_req_links_dict:
|
|
91
|
+
# If the Requirement itself doesn't specify any models to match (e.g., requirement.events is empty),
|
|
92
|
+
# then it's vacuously true that "any" of these (non-existent) required models are matched.
|
|
93
|
+
# The timeframe aspect becomes irrelevant if no specific models are being checked.
|
|
94
|
+
return True
|
|
95
|
+
|
|
96
|
+
# --- Handle PatientEvents ---
|
|
97
|
+
# Check if the requirement is concerned with events
|
|
98
|
+
if requirement_links.events: # This list contains Event model instances
|
|
99
|
+
required_event_models = set(requirement_links.events) # Target Event models from the Requirement
|
|
100
|
+
|
|
101
|
+
# input_links.patient_events contains PatientEvent instances provided as input
|
|
102
|
+
for patient_event_instance in input_links.patient_events:
|
|
103
|
+
# Check if the event of the current PatientEvent instance is one of the target events
|
|
104
|
+
if patient_event_instance.event in required_event_models:
|
|
105
|
+
# If it is, check if this PatientEvent's date is within the timeframe
|
|
106
|
+
if _is_date_in_timeframe(patient_event_instance.date, requirement):
|
|
107
|
+
return True # Found a matching event within the timeframe
|
|
108
|
+
|
|
109
|
+
# --- Handle Other Model Types (Example: PatientLabValue) ---
|
|
110
|
+
# if requirement_links.lab_values:
|
|
111
|
+
# required_lab_value_models = set(requirement_links.lab_values)
|
|
112
|
+
# for plv_instance in input_links.patient_lab_values:
|
|
113
|
+
# if plv_instance.lab_value in required_lab_value_models:
|
|
114
|
+
# date_to_check = None
|
|
115
|
+
# if hasattr(plv_instance, 'date_time_value') and plv_instance.date_time_value:
|
|
116
|
+
# date_to_check = plv_instance.date_time_value.date()
|
|
117
|
+
# elif hasattr(plv_instance, 'date') and plv_instance.date: # If it had a simple date field
|
|
118
|
+
# date_to_check = plv_instance.date
|
|
119
|
+
#
|
|
120
|
+
# if _is_date_in_timeframe(date_to_check, requirement):
|
|
121
|
+
# return True
|
|
122
|
+
|
|
123
|
+
# If the code reaches here, no matching model within the timeframe was found
|
|
124
|
+
# for any of the categories specified in requirement_links.
|
|
125
|
+
return False
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _evaluate_models_match_all(
|
|
129
|
+
requirement_links: "RequirementLinks",
|
|
130
|
+
input_links: "RequirementLinks",
|
|
131
|
+
**kwargs
|
|
132
|
+
) -> bool:
|
|
133
|
+
"""
|
|
134
|
+
Evaluates if all active links in requirement_links are present in input_links.
|
|
135
|
+
|
|
136
|
+
For each category of links in requirement_links (e.g., diseases, examinations),
|
|
137
|
+
all items specified in that category in requirement_links must be present in the
|
|
138
|
+
corresponding category in input_links.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
requirement_links: The RequirementLinks object from the Requirement model.
|
|
142
|
+
input_links: The aggregated RequirementLinks object from the input arguments.
|
|
143
|
+
**kwargs: Additional keyword arguments (currently unused).
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
True if all specified items in requirement_links are found in input_links,
|
|
147
|
+
False otherwise.
|
|
148
|
+
"""
|
|
149
|
+
active_req_links = requirement_links.active() # Get dict of non-empty lists from requirement
|
|
150
|
+
|
|
151
|
+
if not active_req_links: # If the requirement specifies no actual items to link
|
|
152
|
+
return True # Vacuously true, as there are no conditions to fail
|
|
153
|
+
|
|
154
|
+
for link_category_name, req_items_list in active_req_links.items():
|
|
155
|
+
input_items_list = getattr(input_links, link_category_name, [])
|
|
156
|
+
|
|
157
|
+
try:
|
|
158
|
+
set_input_items = set(input_items_list)
|
|
159
|
+
set_req_items = set(req_items_list)
|
|
160
|
+
except TypeError:
|
|
161
|
+
for req_item in req_items_list:
|
|
162
|
+
if req_item not in input_items_list:
|
|
163
|
+
return False
|
|
164
|
+
continue
|
|
165
|
+
|
|
166
|
+
if not set_req_items.issubset(set_input_items):
|
|
167
|
+
return False
|
|
168
|
+
|
|
169
|
+
return True
|
|
170
|
+
|
|
171
|
+
def _evaluate_age_gte(
|
|
172
|
+
requirement_links: "RequirementLinks",
|
|
173
|
+
input_links: "RequirementLinks",
|
|
174
|
+
requirement: "Requirement",
|
|
175
|
+
**kwargs
|
|
176
|
+
) -> bool:
|
|
177
|
+
"""
|
|
178
|
+
Checks if any patient in the input has an age greater than or equal to the requirement's numeric_value.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
requirement_links: The RequirementLinks object from the Requirement model (not used for age checks).
|
|
182
|
+
input_links: The aggregated RequirementLinks object from the input arguments.
|
|
183
|
+
requirement: The Requirement instance containing the minimum age in numeric_value.
|
|
184
|
+
**kwargs: Additional keyword arguments, should contain 'original_input_args' with the original Patient instances.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
True if any patient in the input has an age >= requirement.numeric_value, False otherwise.
|
|
188
|
+
"""
|
|
189
|
+
from endoreg_db.models.administration.person.patient import Patient
|
|
190
|
+
import logging
|
|
191
|
+
|
|
192
|
+
logger = logging.getLogger(__name__)
|
|
193
|
+
|
|
194
|
+
if requirement.numeric_value is None:
|
|
195
|
+
logger.debug("age_gte: requirement.numeric_value is None, returning False")
|
|
196
|
+
return False # Cannot evaluate without a minimum age requirement
|
|
197
|
+
|
|
198
|
+
min_age = requirement.numeric_value
|
|
199
|
+
logger.debug(f"age_gte: Checking if any patient has age >= {min_age}")
|
|
200
|
+
|
|
201
|
+
# Check if we have Patient instances in the original_input_args
|
|
202
|
+
original_args = kwargs.get('original_input_args', [])
|
|
203
|
+
logger.debug(f"age_gte: Found {len(original_args)} original input arguments: {[type(arg).__name__ for arg in original_args]}")
|
|
204
|
+
|
|
205
|
+
for i, arg in enumerate(original_args):
|
|
206
|
+
logger.debug(f"age_gte: Checking argument {i}: {type(arg).__name__}")
|
|
207
|
+
if isinstance(arg, Patient):
|
|
208
|
+
patient_age = arg.age()
|
|
209
|
+
logger.debug(f"age_gte: Patient {arg} has age {patient_age}, comparing with min_age {min_age}")
|
|
210
|
+
if patient_age is not None and patient_age >= min_age:
|
|
211
|
+
logger.debug(f"age_gte: Patient age {patient_age} >= {min_age}, returning True")
|
|
212
|
+
return True
|
|
213
|
+
else:
|
|
214
|
+
logger.debug(f"age_gte: Patient age {patient_age} < {min_age} or is None")
|
|
215
|
+
# Handle QuerySets of patients
|
|
216
|
+
elif hasattr(arg, 'model') and issubclass(arg.model, Patient):
|
|
217
|
+
logger.debug(f"age_gte: Found Patient QuerySet with {arg.count()} patients")
|
|
218
|
+
for patient in arg:
|
|
219
|
+
patient_age = patient.age()
|
|
220
|
+
logger.debug(f"age_gte: Patient {patient} has age {patient_age}, comparing with min_age {min_age}")
|
|
221
|
+
if patient_age is not None and patient_age >= min_age:
|
|
222
|
+
logger.debug(f"age_gte: Patient age {patient_age} >= {min_age}, returning True")
|
|
223
|
+
return True
|
|
224
|
+
else:
|
|
225
|
+
logger.debug(f"age_gte: Argument {i} is not a Patient or Patient QuerySet: {type(arg)}")
|
|
226
|
+
|
|
227
|
+
logger.debug(f"age_gte: No patient found with age >= {min_age}, returning False")
|
|
228
|
+
return False
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _evaluate_age_lte(
|
|
232
|
+
requirement_links: "RequirementLinks",
|
|
233
|
+
input_links: "RequirementLinks",
|
|
234
|
+
requirement: "Requirement",
|
|
235
|
+
**kwargs
|
|
236
|
+
) -> bool:
|
|
237
|
+
"""
|
|
238
|
+
Checks if any patient in the input has an age less than or equal to the requirement's numeric_value.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
requirement_links: The RequirementLinks object from the Requirement model (not used for age checks).
|
|
242
|
+
input_links: The aggregated RequirementLinks object from the input arguments.
|
|
243
|
+
requirement: The Requirement instance containing the maximum age in numeric_value.
|
|
244
|
+
**kwargs: Additional keyword arguments, should contain 'original_input_args' with the original Patient instances.
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
True if any patient in the input has an age <= requirement.numeric_value, False otherwise.
|
|
248
|
+
"""
|
|
249
|
+
from endoreg_db.models.administration.person.patient import Patient
|
|
250
|
+
|
|
251
|
+
if requirement.numeric_value is None:
|
|
252
|
+
return False # Cannot evaluate without a maximum age requirement
|
|
253
|
+
|
|
254
|
+
max_age = requirement.numeric_value
|
|
255
|
+
|
|
256
|
+
# Check if we have Patient instances in the original_input_args
|
|
257
|
+
original_args = kwargs.get('original_input_args', [])
|
|
258
|
+
for arg in original_args:
|
|
259
|
+
if isinstance(arg, Patient):
|
|
260
|
+
patient_age = arg.age()
|
|
261
|
+
if patient_age is not None and patient_age <= max_age:
|
|
262
|
+
return True
|
|
263
|
+
# Handle QuerySets of patients
|
|
264
|
+
elif hasattr(arg, 'model') and issubclass(arg.model, Patient):
|
|
265
|
+
for patient in arg:
|
|
266
|
+
patient_age = patient.age()
|
|
267
|
+
if patient_age is not None and patient_age <= max_age:
|
|
268
|
+
return True
|
|
269
|
+
|
|
270
|
+
return False
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def dispatch_operator_evaluation(
|
|
274
|
+
operator_name: str,
|
|
275
|
+
requirement_links: "RequirementLinks",
|
|
276
|
+
input_links: "RequirementLinks",
|
|
277
|
+
**kwargs
|
|
278
|
+
) -> bool:
|
|
279
|
+
"""
|
|
280
|
+
Dispatches the evaluation to the appropriate function based on the operator name.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
operator_name: The name of the operator to evaluate.
|
|
284
|
+
requirement_links: The RequirementLinks object from the Requirement model.
|
|
285
|
+
input_links: The aggregated RequirementLinks object from the input arguments.
|
|
286
|
+
**kwargs: Additional keyword arguments for specific operator logic.
|
|
287
|
+
For lab value operators, this includes 'requirement' (the Requirement model instance).
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
True if the condition defined by the operator is met, False otherwise.
|
|
291
|
+
|
|
292
|
+
Raises:
|
|
293
|
+
NotImplementedError: If the evaluation logic for the operator's name is not implemented.
|
|
294
|
+
"""
|
|
295
|
+
from .lab_value_operators import LAB_VALUE_OPERATOR_FUNCTIONS
|
|
296
|
+
from endoreg_db.models.requirement.requirement import Requirement # Runtime import for isinstance
|
|
297
|
+
|
|
298
|
+
eval_func = None
|
|
299
|
+
requirement = kwargs.get("requirement") # Get requirement for operators that need it
|
|
300
|
+
|
|
301
|
+
if operator_name == "models_match_any":
|
|
302
|
+
eval_func = _evaluate_models_match_any
|
|
303
|
+
return eval_func(
|
|
304
|
+
requirement_links=requirement_links,
|
|
305
|
+
input_links=input_links,
|
|
306
|
+
**kwargs
|
|
307
|
+
)
|
|
308
|
+
elif operator_name == "models_match_all":
|
|
309
|
+
eval_func = _evaluate_models_match_all
|
|
310
|
+
return eval_func(
|
|
311
|
+
requirement_links=requirement_links,
|
|
312
|
+
input_links=input_links,
|
|
313
|
+
**kwargs
|
|
314
|
+
)
|
|
315
|
+
elif operator_name == "models_match_any_in_timeframe":
|
|
316
|
+
# 'requirement' is already extracted from kwargs via requirement = kwargs.get("requirement")
|
|
317
|
+
if not isinstance(requirement, Requirement): # Ensure requirement is present and correct type
|
|
318
|
+
raise ValueError("models_match_any_in_timeframe operator requires a valid 'requirement' instance in kwargs.")
|
|
319
|
+
|
|
320
|
+
# Create a new kwargs dict for the call, excluding 'requirement' to avoid passing it twice,
|
|
321
|
+
# as it's already an explicit parameter for _evaluate_models_match_any_in_timeframe.
|
|
322
|
+
kwargs_for_eval = {k: v for k, v in kwargs.items() if k != 'requirement'}
|
|
323
|
+
|
|
324
|
+
eval_func = _evaluate_models_match_any_in_timeframe
|
|
325
|
+
return eval_func(
|
|
326
|
+
requirement_links=requirement_links,
|
|
327
|
+
input_links=input_links,
|
|
328
|
+
requirement=requirement, # Pass the requirement instance explicitly
|
|
329
|
+
**kwargs_for_eval # Pass the remaining kwargs
|
|
330
|
+
)
|
|
331
|
+
elif operator_name in LAB_VALUE_OPERATOR_FUNCTIONS:
|
|
332
|
+
if not isinstance(requirement, Requirement): # Ensure requirement is present and correct type
|
|
333
|
+
raise ValueError(f"Lab value operator \'{operator_name}\' requires a valid 'requirement' instance in kwargs.")
|
|
334
|
+
|
|
335
|
+
eval_func = LAB_VALUE_OPERATOR_FUNCTIONS[operator_name]
|
|
336
|
+
return eval_func(
|
|
337
|
+
input_links=input_links,
|
|
338
|
+
requirement=requirement,
|
|
339
|
+
operator_kwargs=kwargs
|
|
340
|
+
)
|
|
341
|
+
elif operator_name == "age_gte":
|
|
342
|
+
if not isinstance(requirement, Requirement):
|
|
343
|
+
raise ValueError("age_gte operator requires a valid 'requirement' instance in kwargs.")
|
|
344
|
+
|
|
345
|
+
# Create a new kwargs dict for the call, excluding 'requirement' to avoid passing it twice
|
|
346
|
+
kwargs_for_eval = {k: v for k, v in kwargs.items() if k != 'requirement'}
|
|
347
|
+
|
|
348
|
+
return _evaluate_age_gte(
|
|
349
|
+
requirement_links=requirement_links,
|
|
350
|
+
input_links=input_links,
|
|
351
|
+
requirement=requirement,
|
|
352
|
+
**kwargs_for_eval
|
|
353
|
+
)
|
|
354
|
+
elif operator_name == "age_lte":
|
|
355
|
+
if not isinstance(requirement, Requirement):
|
|
356
|
+
raise ValueError("age_lte operator requires a valid 'requirement' instance in kwargs.")
|
|
357
|
+
|
|
358
|
+
# Create a new kwargs dict for the call, excluding 'requirement' to avoid passing it twice
|
|
359
|
+
kwargs_for_eval = {k: v for k, v in kwargs.items() if k != 'requirement'}
|
|
360
|
+
|
|
361
|
+
return _evaluate_age_lte(
|
|
362
|
+
requirement_links=requirement_links,
|
|
363
|
+
input_links=input_links,
|
|
364
|
+
requirement=requirement,
|
|
365
|
+
**kwargs_for_eval
|
|
366
|
+
)
|
|
367
|
+
else:
|
|
368
|
+
raise NotImplementedError(f"Evaluation logic for operator '{operator_name}' is not implemented.")
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Configuration loader for EndoReg DB setup.
|
|
3
|
+
Handles loading and parsing of setup configuration from YAML files.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import glob
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any, Dict, List, Optional
|
|
11
|
+
|
|
12
|
+
import yaml
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SetupConfig:
|
|
18
|
+
"""
|
|
19
|
+
Handles loading and accessing setup configuration from YAML files.
|
|
20
|
+
Provides methods to get model names, search patterns, and fallback configurations.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, config_file: Optional[Path] = None):
|
|
24
|
+
"""
|
|
25
|
+
Initialize the setup configuration.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
config_file: Path to the setup configuration YAML file.
|
|
29
|
+
If None, uses default location.
|
|
30
|
+
"""
|
|
31
|
+
if config_file is None:
|
|
32
|
+
# Default to setup_config.yaml in data directory
|
|
33
|
+
config_file = Path(__file__).parent.parent / "data" / "setup_config.yaml"
|
|
34
|
+
|
|
35
|
+
self.config_file = config_file
|
|
36
|
+
self._config = self._load_config()
|
|
37
|
+
|
|
38
|
+
def _load_config(self) -> Dict[str, Any]:
|
|
39
|
+
"""Load configuration from YAML file."""
|
|
40
|
+
try:
|
|
41
|
+
if self.config_file.exists():
|
|
42
|
+
with open(self.config_file, "r") as f:
|
|
43
|
+
config = yaml.safe_load(f)
|
|
44
|
+
logger.info(f"Loaded setup configuration from {self.config_file}")
|
|
45
|
+
return config or {}
|
|
46
|
+
else:
|
|
47
|
+
logger.warning(f"Setup config file not found: {self.config_file}")
|
|
48
|
+
return self._get_default_config()
|
|
49
|
+
except Exception as e:
|
|
50
|
+
logger.error(f"Error loading setup config: {e}")
|
|
51
|
+
return self._get_default_config()
|
|
52
|
+
|
|
53
|
+
def _get_default_config(self) -> Dict[str, Any]:
|
|
54
|
+
"""Return default configuration if file is not available."""
|
|
55
|
+
return {
|
|
56
|
+
"default_models": {
|
|
57
|
+
"primary_classification_model": "image_multilabel_classification_colonoscopy_default",
|
|
58
|
+
"primary_labelset": "multilabel_classification_colonoscopy_default",
|
|
59
|
+
},
|
|
60
|
+
"huggingface_fallback": {
|
|
61
|
+
"enabled": True,
|
|
62
|
+
"repo_id": "wg-lux/colo_segmentation_RegNetX800MF_base",
|
|
63
|
+
"filename": "colo_segmentation_RegNetX800MF_base.ckpt",
|
|
64
|
+
"labelset_name": "multilabel_classification_colonoscopy_default",
|
|
65
|
+
},
|
|
66
|
+
"weights_search_patterns": [
|
|
67
|
+
"colo_segmentation_RegNetX800MF_*.ckpt",
|
|
68
|
+
"image_multilabel_classification_colonoscopy_default_*.ckpt",
|
|
69
|
+
"*_colonoscopy_*.ckpt",
|
|
70
|
+
],
|
|
71
|
+
"weights_search_dirs": ["tests/assets", "assets", "data/storage/model_weights", "${STORAGE_DIR}/model_weights"],
|
|
72
|
+
"auto_generation_defaults": {
|
|
73
|
+
"activation": "sigmoid",
|
|
74
|
+
"mean": "0.485,0.456,0.406",
|
|
75
|
+
"std": "0.229,0.224,0.225",
|
|
76
|
+
"size_x": 224,
|
|
77
|
+
"size_y": 224,
|
|
78
|
+
"axes": "CHW",
|
|
79
|
+
"batchsize": 32,
|
|
80
|
+
"num_workers": 4,
|
|
81
|
+
},
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
def get_primary_model_name(self) -> str:
|
|
85
|
+
"""Get the primary classification model name."""
|
|
86
|
+
return self._config.get("default_models", {}).get("primary_classification_model", "image_multilabel_classification_colonoscopy_default")
|
|
87
|
+
|
|
88
|
+
def get_primary_labelset_name(self) -> str:
|
|
89
|
+
"""Get the primary labelset name."""
|
|
90
|
+
return self._config.get("default_models", {}).get("primary_labelset", "multilabel_classification_colonoscopy_default")
|
|
91
|
+
|
|
92
|
+
def get_huggingface_config(self) -> Dict[str, Any]:
|
|
93
|
+
"""Get HuggingFace fallback configuration."""
|
|
94
|
+
return self._config.get("huggingface_fallback", {})
|
|
95
|
+
|
|
96
|
+
def get_weights_search_patterns(self) -> List[str]:
|
|
97
|
+
"""Get weight file search patterns."""
|
|
98
|
+
return self._config.get("weights_search_patterns", ["colo_segmentation_RegNetX800MF_*.ckpt", "*_colonoscopy_*.ckpt"])
|
|
99
|
+
|
|
100
|
+
def get_weights_search_dirs(self) -> List[Path]:
|
|
101
|
+
"""
|
|
102
|
+
Get weight file search directories with environment variable substitution.
|
|
103
|
+
"""
|
|
104
|
+
dirs = self._config.get("weights_search_dirs", [])
|
|
105
|
+
resolved_dirs = []
|
|
106
|
+
|
|
107
|
+
for dir_str in dirs:
|
|
108
|
+
# Handle environment variable substitution
|
|
109
|
+
if "${" in dir_str:
|
|
110
|
+
dir_str = os.path.expandvars(dir_str)
|
|
111
|
+
|
|
112
|
+
resolved_dirs.append(Path(dir_str))
|
|
113
|
+
|
|
114
|
+
return resolved_dirs
|
|
115
|
+
|
|
116
|
+
def get_auto_generation_defaults(self) -> Dict[str, Any]:
|
|
117
|
+
"""Get default values for auto-generated metadata."""
|
|
118
|
+
return self._config.get("auto_generation_defaults", {})
|
|
119
|
+
|
|
120
|
+
def find_model_weights_files(self) -> List[Path]:
|
|
121
|
+
"""
|
|
122
|
+
Find model weight files using configured search patterns and directories.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
List of paths to found weight files
|
|
126
|
+
"""
|
|
127
|
+
found_files = []
|
|
128
|
+
search_dirs = self.get_weights_search_dirs()
|
|
129
|
+
search_patterns = self.get_weights_search_patterns()
|
|
130
|
+
|
|
131
|
+
for search_dir in search_dirs:
|
|
132
|
+
if not search_dir.exists():
|
|
133
|
+
continue
|
|
134
|
+
|
|
135
|
+
for pattern in search_patterns:
|
|
136
|
+
# Use glob to find files matching pattern
|
|
137
|
+
pattern_path = search_dir / pattern
|
|
138
|
+
matches = glob.glob(str(pattern_path))
|
|
139
|
+
for match in matches:
|
|
140
|
+
path = Path(match)
|
|
141
|
+
if path.exists() and path not in found_files:
|
|
142
|
+
found_files.append(path)
|
|
143
|
+
logger.info(f"Found weight file: {path}")
|
|
144
|
+
|
|
145
|
+
return found_files
|
|
146
|
+
|
|
147
|
+
def get_model_specific_config(self, model_name: str) -> Optional[Dict[str, Any]]:
|
|
148
|
+
"""
|
|
149
|
+
Get model-specific configuration from YAML metadata files.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
model_name: Name of the model to get config for
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Model-specific setup configuration if found
|
|
156
|
+
"""
|
|
157
|
+
# This would need to parse the ai_model_meta YAML files
|
|
158
|
+
# and extract setup_config sections for the specified model
|
|
159
|
+
try:
|
|
160
|
+
from endoreg_db.data import AI_MODEL_META_DATA_DIR
|
|
161
|
+
|
|
162
|
+
for yaml_file in AI_MODEL_META_DATA_DIR.glob("*.yaml"):
|
|
163
|
+
with open(yaml_file, "r") as f:
|
|
164
|
+
data = yaml.safe_load(f)
|
|
165
|
+
|
|
166
|
+
if isinstance(data, list):
|
|
167
|
+
for item in data:
|
|
168
|
+
if item.get("fields", {}).get("name") == model_name or item.get("fields", {}).get("model") == model_name:
|
|
169
|
+
return item.get("setup_config", {})
|
|
170
|
+
except Exception as e:
|
|
171
|
+
logger.warning(f"Error loading model-specific config for {model_name}: {e}")
|
|
172
|
+
|
|
173
|
+
return None
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
# Global instance for easy access
|
|
177
|
+
setup_config = SetupConfig()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
def build_multilingual_response(obj, include_choices=False, classification_id=None):
|
|
2
|
+
"""
|
|
3
|
+
Helper to build a multilingual response dict for an object.
|
|
4
|
+
If include_choices is True, adds a 'choices' key with multilingual dicts for each choice.
|
|
5
|
+
If classification_id is given, adds 'classificationId' to each choice.
|
|
6
|
+
"""
|
|
7
|
+
data = {
|
|
8
|
+
'id': obj.id,
|
|
9
|
+
'name': getattr(obj, 'name', ''),
|
|
10
|
+
'name_de': getattr(obj, 'name_de', ''),
|
|
11
|
+
'name_en': getattr(obj, 'name_en', ''),
|
|
12
|
+
'description': getattr(obj, 'description', ''),
|
|
13
|
+
'description_de': getattr(obj, 'description_de', ''),
|
|
14
|
+
'description_en': getattr(obj, 'description_en', ''),
|
|
15
|
+
}
|
|
16
|
+
if hasattr(obj, 'required'):
|
|
17
|
+
data['required'] = getattr(obj, 'required', True)
|
|
18
|
+
if include_choices:
|
|
19
|
+
data['choices'] = [
|
|
20
|
+
build_multilingual_response(choice, include_choices=False, classification_id=classification_id or obj.id)
|
|
21
|
+
for choice in obj.get_choices()
|
|
22
|
+
]
|
|
23
|
+
for choice_dict in data['choices']:
|
|
24
|
+
choice_dict['classificationId'] = classification_id or obj.id
|
|
25
|
+
if classification_id is not None and not include_choices:
|
|
26
|
+
data['classificationId'] = classification_id
|
|
27
|
+
return data
|
endoreg_db/utils/uuid.py
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
def validate_endo_roi(endo_roi_dict:dict):
|
|
2
|
+
"""
|
|
3
|
+
Validate endoscope ROI dictionary. The dictionary must have the following
|
|
4
|
+
keys: x, y, width, height. The values must be greater than or equal to 0
|
|
5
|
+
for x and y, and greater than 0 for width and height.
|
|
6
|
+
"""
|
|
7
|
+
for key, value in endo_roi_dict.items():
|
|
8
|
+
if key == "x":
|
|
9
|
+
assert value >= 0, f"Endoscope ROI x value must be greater than or equal to 0. Got {value}"
|
|
10
|
+
elif key == "y":
|
|
11
|
+
assert value >= 0, f"Endoscope ROI y value must be greater than or equal to 0. Got {value}"
|
|
12
|
+
elif key == "width":
|
|
13
|
+
assert value > 0, f"Endoscope ROI width value must be greater than 0. Got {value}"
|
|
14
|
+
elif key == "height":
|
|
15
|
+
assert value > 0, f"Endoscope ROI height value must be greater than 0. Got {value}"
|
|
16
|
+
else:
|
|
17
|
+
raise ValueError(f"Endoscope ROI key {key} not recognized")
|
|
18
|
+
|
|
19
|
+
return True
|