endoreg-db 0.8.9.32__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/_version.py +34 -0
- endoreg_db/admin.py +97 -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 +17 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/authz/auth.py +78 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +20 -0
- endoreg_db/authz/middleware.py +84 -0
- endoreg_db/authz/permissions.py +138 -0
- endoreg_db/authz/policy.py +224 -0
- endoreg_db/authz/settings.py +64 -0
- endoreg_db/authz/views_auth.py +70 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +99 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +106 -0
- endoreg_db/config/settings/__init__.py +6 -0
- endoreg_db/config/settings/base.py +148 -0
- endoreg_db/config/settings/case_gen.py +32 -0
- endoreg_db/config/settings/dev.py +108 -0
- endoreg_db/config/settings/keycloak.py +177 -0
- endoreg_db/config/settings/prod.py +66 -0
- endoreg_db/config/settings/test.py +72 -0
- endoreg_db/data/__init__.py +135 -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 +99 -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/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +172 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +5 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +359 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +90 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +97 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/00_generic.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_baseline.yaml +23 -0
- endoreg_db/data/finding_classification_choice/00_generic_complication.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_histology.yaml +21 -0
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_bowel_preparation.yaml +49 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_generic.yaml +19 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_histology.yaml +20 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_location.yaml +248 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_morphology.yaml +75 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/00_generic.yaml +53 -0
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_type/data.yaml +39 -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/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement/old/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/old/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/old/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/old/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/old/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/old/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/old/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/old/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/old/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/old/gender.yaml +0 -0
- endoreg_db/data/requirement/old/lab_value.yaml +441 -0
- endoreg_db/data/requirement/old/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/_old/age.yaml +13 -0
- endoreg_db/data/requirement_operator/_old/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/_old/model_operators.yaml +96 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +65 -0
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set_type/data.yaml +41 -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 +32 -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 +24 -0
- endoreg_db/export/frames/export.py +6 -0
- endoreg_db/export/frames/export_frames_with_labels.py +616 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +4 -0
- endoreg_db/forms/examination_form.py +12 -0
- endoreg_db/forms/patient_finding_intervention_form.py +40 -0
- endoreg_db/forms/patient_form.py +23 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +11 -0
- endoreg_db/forms/unit.py +7 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +48 -0
- endoreg_db/helpers/data_loader.py +280 -0
- endoreg_db/helpers/default_objects.py +414 -0
- endoreg_db/helpers/download_segmentation_model.py +32 -0
- endoreg_db/helpers/interact.py +1 -0
- endoreg_db/helpers/test_video_helper.py +127 -0
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +83 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +42 -0
- endoreg_db/import_files/context/validate_directories.py +57 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +99 -0
- endoreg_db/import_files/file_storage/create_video_file.py +104 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +42 -0
- endoreg_db/import_files/file_storage/state_management.py +463 -0
- endoreg_db/import_files/file_storage/storage.py +42 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +99 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/pseudonymization/__init__.py +0 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +181 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +139 -0
- endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
- endoreg_db/import_files/report_import_service.py +147 -0
- endoreg_db/import_files/video_import_service.py +154 -0
- endoreg_db/logger_conf.py +156 -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 +132 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +177 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +419 -0
- endoreg_db/management/commands/export_frame_annot.py +196 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +206 -0
- endoreg_db/management/commands/fix_video_paths.py +186 -0
- endoreg_db/management/commands/import_report.py +361 -0
- endoreg_db/management/commands/list_routes.py +20 -0
- endoreg_db/management/commands/load_ai_model_data.py +83 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +60 -0
- endoreg_db/management/commands/load_base_db_data.py +63 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +39 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +38 -0
- endoreg_db/management/commands/load_disease_classification_data.py +38 -0
- endoreg_db/management/commands/load_disease_data.py +59 -0
- endoreg_db/management/commands/load_distribution_data.py +63 -0
- endoreg_db/management/commands/load_endoscope_data.py +58 -0
- endoreg_db/management/commands/load_event_data.py +39 -0
- endoreg_db/management/commands/load_examination_data.py +78 -0
- endoreg_db/management/commands/load_examination_indication_data.py +85 -0
- endoreg_db/management/commands/load_finding_data.py +115 -0
- endoreg_db/management/commands/load_gender_data.py +37 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +142 -0
- endoreg_db/management/commands/load_information_source.py +46 -0
- endoreg_db/management/commands/load_lab_value_data.py +52 -0
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_medication_data.py +104 -0
- endoreg_db/management/commands/load_name_data.py +36 -0
- endoreg_db/management/commands/load_organ_data.py +39 -0
- endoreg_db/management/commands/load_pdf_type_data.py +58 -0
- endoreg_db/management/commands/load_profession_data.py +40 -0
- endoreg_db/management/commands/load_qualification_data.py +56 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +40 -0
- endoreg_db/management/commands/load_requirement_data.py +207 -0
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +57 -0
- endoreg_db/management/commands/load_shift_data.py +57 -0
- endoreg_db/management/commands/load_tag_data.py +54 -0
- endoreg_db/management/commands/load_unit_data.py +40 -0
- endoreg_db/management/commands/load_user_groups.py +26 -0
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +70 -0
- endoreg_db/management/commands/setup_endoreg_db.py +459 -0
- endoreg_db/management/commands/start_filewatcher.py +115 -0
- endoreg_db/management/commands/storage_management.py +622 -0
- endoreg_db/management/commands/summarize_db_content.py +280 -0
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +189 -0
- endoreg_db/management/commands/video_validation.py +20 -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 +1953 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +322 -0
- endoreg_db/models/administration/__init__.py +95 -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 +180 -0
- endoreg_db/models/administration/ai/model_type.py +42 -0
- endoreg_db/models/administration/case/__init__.py +5 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +3 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +85 -0
- endoreg_db/models/administration/center/center_product.py +67 -0
- endoreg_db/models/administration/center/center_resource.py +69 -0
- endoreg_db/models/administration/center/center_shift.py +94 -0
- endoreg_db/models/administration/center/center_waste.py +42 -0
- endoreg_db/models/administration/person/__init__.py +26 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +40 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +44 -0
- endoreg_db/models/administration/person/employee/employee_type.py +50 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +64 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +20 -0
- endoreg_db/models/administration/person/names/last_name.py +20 -0
- endoreg_db/models/administration/person/patient/__init__.py +7 -0
- endoreg_db/models/administration/person/patient/patient.py +488 -0
- endoreg_db/models/administration/person/patient/patient_external_id.py +36 -0
- endoreg_db/models/administration/person/person.py +35 -0
- endoreg_db/models/administration/person/profession/__init__.py +28 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +41 -0
- endoreg_db/models/administration/product/__init__.py +15 -0
- endoreg_db/models/administration/product/product.py +106 -0
- endoreg_db/models/administration/product/product_group.py +41 -0
- endoreg_db/models/administration/product/product_material.py +60 -0
- endoreg_db/models/administration/product/product_weight.py +51 -0
- endoreg_db/models/administration/product/reference_product.py +147 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +43 -0
- endoreg_db/models/administration/qualification/qualification_type.py +39 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +72 -0
- endoreg_db/models/administration/shift/shift.py +57 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +23 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +85 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +61 -0
- endoreg_db/models/label/label.py +91 -0
- endoreg_db/models/label/label_set.py +68 -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 +42 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +611 -0
- endoreg_db/models/label/video_segmentation_label.py +35 -0
- endoreg_db/models/label/video_segmentation_labelset.py +28 -0
- endoreg_db/models/media/__init__.py +23 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +137 -0
- endoreg_db/models/media/pdf/__init__.py +12 -0
- endoreg_db/models/media/pdf/raw_pdf.py +764 -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 +85 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +46 -0
- endoreg_db/models/media/video/__init__.py +9 -0
- endoreg_db/models/media/video/create_from_file.py +402 -0
- endoreg_db/models/media/video/pipe_1.py +258 -0
- endoreg_db/models/media/video/pipe_2.py +129 -0
- endoreg_db/models/media/video/video_file.py +907 -0
- endoreg_db/models/media/video/video_file_ai.py +828 -0
- endoreg_db/models/media/video/video_file_anonymize.py +524 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +49 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +25 -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 +126 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +233 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +36 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +13 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +24 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +40 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +44 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +30 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +205 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +228 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +107 -0
- endoreg_db/models/media/video/video_file_io.py +272 -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 +58 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +62 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +183 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +198 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +178 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +105 -0
- endoreg_db/models/media/video/video_file_segments.py +317 -0
- endoreg_db/models/media/video/video_metadata.py +67 -0
- endoreg_db/models/media/video/video_processing.py +192 -0
- endoreg_db/models/medical/__init__.py +136 -0
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +29 -0
- endoreg_db/models/medical/disease.py +174 -0
- endoreg_db/models/medical/event.py +154 -0
- endoreg_db/models/medical/examination/__init__.py +20 -0
- endoreg_db/models/medical/examination/examination.py +183 -0
- endoreg_db/models/medical/examination/examination_indication.py +229 -0
- endoreg_db/models/medical/examination/examination_time.py +68 -0
- endoreg_db/models/medical/examination/examination_time_type.py +44 -0
- endoreg_db/models/medical/examination/examination_type.py +47 -0
- endoreg_db/models/medical/finding/__init__.py +20 -0
- endoreg_db/models/medical/finding/finding.py +113 -0
- endoreg_db/models/medical/finding/finding_classification.py +131 -0
- endoreg_db/models/medical/finding/finding_intervention.py +68 -0
- endoreg_db/models/medical/finding/finding_type.py +38 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +77 -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 +490 -0
- endoreg_db/models/medical/medication/__init__.py +23 -0
- endoreg_db/models/medical/medication/medication.py +45 -0
- endoreg_db/models/medical/medication/medication_indication.py +78 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +58 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +58 -0
- endoreg_db/models/medical/medication/medication_schedule.py +58 -0
- endoreg_db/models/medical/organ/__init__.py +38 -0
- endoreg_db/models/medical/patient/__init__.py +48 -0
- endoreg_db/models/medical/patient/medication_examples.py +56 -0
- endoreg_db/models/medical/patient/patient_disease.py +72 -0
- endoreg_db/models/medical/patient/patient_event.py +80 -0
- endoreg_db/models/medical/patient/patient_examination.py +280 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +57 -0
- endoreg_db/models/medical/patient/patient_finding.py +416 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +231 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +37 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +157 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +247 -0
- endoreg_db/models/medical/patient/patient_medication.py +111 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +152 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +73 -0
- endoreg_db/models/medical/risk/risk_type.py +54 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/model_meta.py +266 -0
- endoreg_db/models/metadata/model_meta_logic.py +485 -0
- endoreg_db/models/metadata/pdf_meta.py +96 -0
- endoreg_db/models/metadata/sensitive_meta.py +345 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1161 -0
- endoreg_db/models/metadata/video_meta.py +459 -0
- endoreg_db/models/metadata/video_prediction_logic.py +232 -0
- endoreg_db/models/metadata/video_prediction_meta.py +319 -0
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +46 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +22 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +163 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +50 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +211 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +23 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +110 -0
- endoreg_db/models/other/gender.py +32 -0
- endoreg_db/models/other/information_source.py +190 -0
- endoreg_db/models/other/material.py +34 -0
- endoreg_db/models/other/resource.py +24 -0
- endoreg_db/models/other/tag.py +32 -0
- endoreg_db/models/other/transport_route.py +40 -0
- endoreg_db/models/other/unit.py +40 -0
- endoreg_db/models/other/waste.py +28 -0
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +5 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +792 -0
- endoreg_db/models/requirement/requirement_error.py +84 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +137 -0
- endoreg_db/models/requirement/requirement_operator.py +187 -0
- endoreg_db/models/requirement/requirement_set.py +327 -0
- endoreg_db/models/state/__init__.py +13 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/anonymization.py +30 -0
- endoreg_db/models/state/audit_ledger.py +155 -0
- endoreg_db/models/state/label_video_segment.py +31 -0
- endoreg_db/models/state/processing_history/__init__.py +3 -0
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +219 -0
- endoreg_db/models/state/sensitive_meta.py +50 -0
- endoreg_db/models/state/video.py +251 -0
- endoreg_db/models/upload_job.py +100 -0
- endoreg_db/models/utils.py +138 -0
- endoreg_db/queries/__init__.py +3 -0
- endoreg_db/queries/annotations/__init__.py +1 -0
- endoreg_db/queries/annotations/legacy.py +169 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/root_urls.py +27 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +30 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +861 -0
- endoreg_db/serializers/__init__.py +104 -0
- endoreg_db/serializers/administration/__init__.py +13 -0
- endoreg_db/serializers/administration/ai/__init__.py +9 -0
- endoreg_db/serializers/administration/ai/active_model.py +12 -0
- endoreg_db/serializers/administration/ai/ai_model.py +20 -0
- endoreg_db/serializers/administration/ai/model_type.py +12 -0
- endoreg_db/serializers/administration/center.py +14 -0
- endoreg_db/serializers/administration/gender.py +11 -0
- endoreg_db/serializers/anonymization.py +77 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +45 -0
- endoreg_db/serializers/examination/dropdown.py +20 -0
- endoreg_db/serializers/examination_serializer.py +9 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +61 -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 +11 -0
- endoreg_db/serializers/label_video_segment/__init__.py +9 -0
- endoreg_db/serializers/label_video_segment/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/label_video_segment/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +427 -0
- endoreg_db/serializers/meta/__init__.py +13 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +122 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +153 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +62 -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 +72 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +144 -0
- endoreg_db/serializers/misc/stats.py +35 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +74 -0
- endoreg_db/serializers/patient/__init__.py +12 -0
- endoreg_db/serializers/patient/patient.py +103 -0
- endoreg_db/serializers/patient/patient_dropdown.py +35 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +168 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +32 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +47 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +62 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +28 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +40 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +135 -0
- endoreg_db/serializers/pdf/__init__.py +3 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +101 -0
- endoreg_db/serializers/requirements/requirement_schema.py +20 -0
- endoreg_db/serializers/requirements/requirement_sets.py +99 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +301 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/video_file.py +283 -0
- endoreg_db/serializers/video/video_file_brief.py +14 -0
- endoreg_db/serializers/video/video_file_detail.py +96 -0
- endoreg_db/serializers/video/video_file_list.py +100 -0
- endoreg_db/serializers/video/video_processing_history.py +172 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +274 -0
- endoreg_db/services/examination_evaluation.py +172 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +424 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/pdf_import.py +0 -0
- endoreg_db/services/polling_coordinator.py +319 -0
- endoreg_db/services/pseudonym_service.py +94 -0
- endoreg_db/services/report_import.py +13 -0
- endoreg_db/services/segment_sync.py +171 -0
- endoreg_db/services/video_import.py +9 -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 +56 -0
- endoreg_db/urls/ai.py +14 -0
- endoreg_db/urls/anonymization.py +78 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +34 -0
- endoreg_db/urls/examination.py +63 -0
- endoreg_db/urls/media.py +251 -0
- endoreg_db/urls/patient.py +23 -0
- endoreg_db/urls/requirements.py +15 -0
- endoreg_db/urls/root_urls.py +28 -0
- endoreg_db/urls/stats.py +54 -0
- endoreg_db/urls/upload.py +12 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +97 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
- endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
- endoreg_db/utils/ai/get.py +6 -0
- endoreg_db/utils/ai/inference_dataset.py +51 -0
- endoreg_db/utils/ai/model_training/config.py +117 -0
- endoreg_db/utils/ai/model_training/dataset.py +74 -0
- endoreg_db/utils/ai/model_training/losses.py +68 -0
- endoreg_db/utils/ai/model_training/metrics.py +78 -0
- endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
- endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
- endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +270 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +293 -0
- endoreg_db/utils/ai/preprocess.py +76 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +32 -0
- endoreg_db/utils/check_video_files.py +175 -0
- endoreg_db/utils/cropping.py +30 -0
- endoreg_db/utils/dataloader.py +285 -0
- endoreg_db/utils/dates.py +59 -0
- endoreg_db/utils/defaults/set_default_center.py +33 -0
- endoreg_db/utils/env.py +37 -0
- endoreg_db/utils/extract_specific_frames.py +87 -0
- endoreg_db/utils/file_operations.py +70 -0
- endoreg_db/utils/fix_video_path_direct.py +157 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +138 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +237 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +82 -0
- endoreg_db/utils/ocr.py +195 -0
- endoreg_db/utils/operation_log.py +87 -0
- endoreg_db/utils/parse_and_generate_yaml.py +45 -0
- endoreg_db/utils/paths.py +159 -0
- endoreg_db/utils/permissions.py +160 -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 +144 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +22 -0
- endoreg_db/utils/product/sum_weights.py +20 -0
- endoreg_db/utils/pydantic_models/__init__.py +5 -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/_old/lab_value_operators.py +678 -0
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +842 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +114 -0
- endoreg_db/utils/setup_config.py +196 -0
- endoreg_db/utils/storage.py +117 -0
- endoreg_db/utils/translation.py +31 -0
- endoreg_db/utils/uuid.py +5 -0
- endoreg_db/utils/validate_endo_roi.py +33 -0
- endoreg_db/utils/validate_subcategory_dict.py +93 -0
- endoreg_db/utils/validate_video_detailed.py +415 -0
- endoreg_db/utils/video/__init__.py +30 -0
- endoreg_db/utils/video/extract_frames.py +100 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +996 -0
- endoreg_db/utils/video/names.py +47 -0
- endoreg_db/utils/video/streaming_processor.py +386 -0
- endoreg_db/utils/video/video_splitter.py +105 -0
- endoreg_db/versioning.md +79 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +247 -0
- endoreg_db/views/__init__.py +157 -0
- endoreg_db/views/anonymization/__init__.py +31 -0
- endoreg_db/views/anonymization/media_management.py +486 -0
- endoreg_db/views/anonymization/overview.py +307 -0
- endoreg_db/views/anonymization/validate.py +310 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +146 -0
- endoreg_db/views/examination/__init__.py +30 -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 +62 -0
- endoreg_db/views/examination/get_finding_classifications.py +38 -0
- endoreg_db/views/examination/get_findings.py +39 -0
- endoreg_db/views/examination/get_instruments.py +19 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +116 -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 +41 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +54 -0
- endoreg_db/views/media/__init__.py +32 -0
- endoreg_db/views/media/pdf_media.py +411 -0
- endoreg_db/views/media/sensitive_metadata.py +372 -0
- endoreg_db/views/media/video_media.py +275 -0
- endoreg_db/views/meta/__init__.py +7 -0
- endoreg_db/views/meta/sensitive_meta_list.py +102 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +74 -0
- endoreg_db/views/misc/__init__.py +29 -0
- endoreg_db/views/misc/center.py +14 -0
- endoreg_db/views/misc/csrf.py +8 -0
- endoreg_db/views/misc/gender.py +15 -0
- endoreg_db/views/misc/stats.py +255 -0
- endoreg_db/views/misc/upload_views.py +241 -0
- endoreg_db/views/patient/__init__.py +3 -0
- endoreg_db/views/patient/patient.py +253 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +141 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +58 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +72 -0
- endoreg_db/views/patient_examination/video.py +228 -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 +71 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +291 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +75 -0
- endoreg_db/views/report/__init__.py +7 -0
- endoreg_db/views/report/reimport.py +177 -0
- endoreg_db/views/report/report_stream.py +191 -0
- endoreg_db/views/requirement/__init__.py +11 -0
- endoreg_db/views/requirement/evaluate.py +278 -0
- endoreg_db/views/requirement/lookup.py +380 -0
- endoreg_db/views/requirement/lookup_store.py +183 -0
- endoreg_db/views/requirement/requirement_utils.py +87 -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 +266 -0
- endoreg_db/views/video/__init__.py +49 -0
- endoreg_db/views/video/ai/__init__.py +8 -0
- endoreg_db/views/video/ai/label.py +159 -0
- endoreg_db/views/video/correction.py +529 -0
- endoreg_db/views/video/reimport.py +230 -0
- endoreg_db/views/video/segments_crud.py +709 -0
- endoreg_db/views/video/video_apply_mask.py +49 -0
- endoreg_db/views/video/video_correction.py +22 -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_metadata.py +101 -0
- endoreg_db/views/video/video_processing_history.py +25 -0
- endoreg_db/views/video/video_remove_frames.py +49 -0
- endoreg_db/views/video/video_stream.py +334 -0
- endoreg_db-0.8.9.32.dist-info/METADATA +404 -0
- endoreg_db-0.8.9.32.dist-info/RECORD +787 -0
- endoreg_db-0.8.9.32.dist-info/WHEEL +4 -0
- endoreg_db-0.8.9.32.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
from logging import getLogger # Added logger
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Union
|
|
3
|
+
|
|
4
|
+
from django.db import models
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from endoreg_db.utils.requirement_operator_logic.new_operator_logic import (
|
|
8
|
+
REQUIREMENT_OPERATORS,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
# see how operator evaluation function is fetched, add to docs #TODO
|
|
12
|
+
# endoreg_db/utils/requirement_operator_logic/model_evaluators.py
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
16
|
+
|
|
17
|
+
from .requirement import Requirement # Added Requirement import for type hint
|
|
18
|
+
|
|
19
|
+
logger = getLogger(__name__) # Added logger instance
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class OperatorInstructions(BaseModel):
|
|
23
|
+
input_targets: List[str] = []
|
|
24
|
+
requirement_targets: List[str] = []
|
|
25
|
+
kwargs: Dict[str, Union[str, int, float, bool]] = {}
|
|
26
|
+
args: List[Union[str, int, float, bool]] = []
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _parse_operator_instructions(raw: str):
|
|
30
|
+
target_attributes_list = [_.strip() for _ in raw.split(";") if _.strip()]
|
|
31
|
+
|
|
32
|
+
input_targets = []
|
|
33
|
+
kwargs: Dict[str, Union[str, int, float, bool]] = {}
|
|
34
|
+
args: List[Union[str, int, float, bool]] = []
|
|
35
|
+
|
|
36
|
+
valid_prefixes = [
|
|
37
|
+
"!", # Requirement target
|
|
38
|
+
"?", # Input target
|
|
39
|
+
"$", # Keyword argument, keyword and value separated by ":"
|
|
40
|
+
"@", # Positional argument
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
for entry in target_attributes_list:
|
|
44
|
+
_prefix = entry[0]
|
|
45
|
+
|
|
46
|
+
if _prefix in valid_prefixes:
|
|
47
|
+
_attribute = entry[1:].strip()
|
|
48
|
+
if _prefix == "!":
|
|
49
|
+
# Requirement target
|
|
50
|
+
input_targets.append(_attribute)
|
|
51
|
+
elif _prefix == "?":
|
|
52
|
+
# Input target
|
|
53
|
+
input_targets.append(_attribute)
|
|
54
|
+
elif _prefix == "$":
|
|
55
|
+
# Keyword argument
|
|
56
|
+
if ":" in _attribute:
|
|
57
|
+
key, value = _attribute.split(":", 1)
|
|
58
|
+
kwargs[key.strip()] = value.strip()
|
|
59
|
+
else:
|
|
60
|
+
raise ValueError(
|
|
61
|
+
f"Invalid keyword argument format in target_attributes: '{entry}'. Expected format is '$key:value'."
|
|
62
|
+
)
|
|
63
|
+
elif _prefix == "@":
|
|
64
|
+
# Positional argument
|
|
65
|
+
args.append(_attribute)
|
|
66
|
+
else:
|
|
67
|
+
raise ValueError(
|
|
68
|
+
f"Invalid prefix '{_prefix}' in target_attributes entry: '{entry}'. Valid prefixes are {valid_prefixes}."
|
|
69
|
+
)
|
|
70
|
+
return OperatorInstructions(
|
|
71
|
+
input_targets=input_targets,
|
|
72
|
+
requirement_targets=input_targets,
|
|
73
|
+
kwargs=kwargs,
|
|
74
|
+
args=args,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _validate_operator_instructions(instance: "Requirement") -> bool:
|
|
79
|
+
"""Ensures requirement fixtures declare at least one target attribute."""
|
|
80
|
+
if not instance.operator_instructions_parsed:
|
|
81
|
+
raise ValueError(
|
|
82
|
+
f"Requirement '{instance.name}' must declare at least one target attribute."
|
|
83
|
+
)
|
|
84
|
+
return True
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class RequirementOperatorManager(models.Manager):
|
|
88
|
+
def get_by_natural_key(self, name):
|
|
89
|
+
"""
|
|
90
|
+
Retrieves a RequirementOperator instance by its unique name.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
name: The unique name of the RequirementOperator.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
The RequirementOperator instance with the specified name.
|
|
97
|
+
"""
|
|
98
|
+
return self.get(name=name)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class RequirementOperator(models.Model):
|
|
102
|
+
"""
|
|
103
|
+
A class representing a requirement operator.
|
|
104
|
+
|
|
105
|
+
Attributes:
|
|
106
|
+
name (str): The name of the requirement operator.
|
|
107
|
+
description (str): A description of the requirement operator.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
name = models.CharField(max_length=100, unique=True)
|
|
111
|
+
description = models.TextField(blank=True, null=True)
|
|
112
|
+
evaluation_function_name = models.CharField(
|
|
113
|
+
max_length=255, blank=True, null=True
|
|
114
|
+
) # Added field
|
|
115
|
+
|
|
116
|
+
objects = RequirementOperatorManager()
|
|
117
|
+
|
|
118
|
+
if TYPE_CHECKING:
|
|
119
|
+
from endoreg_db.models.requirement.requirement import Requirement
|
|
120
|
+
|
|
121
|
+
requirements: models.QuerySet[Requirement]
|
|
122
|
+
|
|
123
|
+
@classmethod
|
|
124
|
+
def parse_instructions(cls, raw: str) -> OperatorInstructions:
|
|
125
|
+
"""
|
|
126
|
+
Parses the raw target attributes string into structured operator instructions.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
raw: The raw target attributes string.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
An OperatorInstructions instance containing parsed input targets, requirement targets, kwargs, and args.
|
|
133
|
+
"""
|
|
134
|
+
return _parse_operator_instructions(raw)
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def data_model_dict(self):
|
|
138
|
+
"""
|
|
139
|
+
Returns the dictionary of data models used for requirement evaluation.
|
|
140
|
+
|
|
141
|
+
This property dynamically imports and provides access to the data model dictionary relevant to requirement operators.
|
|
142
|
+
"""
|
|
143
|
+
from .requirement_evaluation.requirement_type_parser import data_model_dict
|
|
144
|
+
|
|
145
|
+
return data_model_dict
|
|
146
|
+
|
|
147
|
+
def natural_key(self):
|
|
148
|
+
"""
|
|
149
|
+
Returns a tuple containing the operator's name as its natural key.
|
|
150
|
+
|
|
151
|
+
The natural key uniquely identifies the requirement operator for serialization and deserialization purposes.
|
|
152
|
+
"""
|
|
153
|
+
return (self.name,)
|
|
154
|
+
|
|
155
|
+
def __str__(self):
|
|
156
|
+
"""
|
|
157
|
+
Returns the name of the requirement operator as its string representation.
|
|
158
|
+
"""
|
|
159
|
+
return str(self.name)
|
|
160
|
+
|
|
161
|
+
def get_operator_function(self) -> Callable[..., bool]:
|
|
162
|
+
_operator_function = REQUIREMENT_OPERATORS.get(self.name)
|
|
163
|
+
if not _operator_function:
|
|
164
|
+
raise ValueError(
|
|
165
|
+
f"Operator function for '{self.name}' not found in REQUIREMENT_OPERATORS."
|
|
166
|
+
)
|
|
167
|
+
return _operator_function
|
|
168
|
+
|
|
169
|
+
def evaluate(
|
|
170
|
+
self,
|
|
171
|
+
operator_instructions: "OperatorInstructions",
|
|
172
|
+
requirement: "Requirement",
|
|
173
|
+
input_obj: Any,
|
|
174
|
+
**kwargs,
|
|
175
|
+
) -> bool:
|
|
176
|
+
""" """
|
|
177
|
+
eval_result: bool = False
|
|
178
|
+
requirement_links: "RequirementLinks" = requirement.links
|
|
179
|
+
expected_input_models = requirement.expected_models
|
|
180
|
+
operator_function = self.get_operator_function()
|
|
181
|
+
|
|
182
|
+
input_model = type(input_obj)
|
|
183
|
+
assert input_model in expected_input_models, (
|
|
184
|
+
f"Input model {input_model} not in expected models {expected_input_models}"
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
return eval_result
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, List
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
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
|
+
|
|
15
|
+
class RequirementSetTypeManager(models.Manager):
|
|
16
|
+
"""
|
|
17
|
+
Manager for RequirementSetType with custom query methods.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def get_by_natural_key(self, name: str) -> "RequirementSetType":
|
|
21
|
+
"""
|
|
22
|
+
Retrieves a RequirementSetType instance using its natural key.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
name (str): The unique name that serves as the natural key.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
RequirementSetType: The matching RequirementSetType instance.
|
|
29
|
+
"""
|
|
30
|
+
return self.get(name=name)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class RequirementSetType(models.Model):
|
|
34
|
+
"""
|
|
35
|
+
A class representing a type of requirement set.
|
|
36
|
+
|
|
37
|
+
Attributes:
|
|
38
|
+
name (str): The name of the requirement set type.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
name = models.CharField(max_length=100, unique=True)
|
|
42
|
+
description = models.TextField(blank=True, null=True)
|
|
43
|
+
|
|
44
|
+
objects = RequirementSetTypeManager()
|
|
45
|
+
|
|
46
|
+
if TYPE_CHECKING:
|
|
47
|
+
from endoreg_db.models.requirement import RequirementType
|
|
48
|
+
|
|
49
|
+
requirement_types: models.QuerySet[RequirementType]
|
|
50
|
+
|
|
51
|
+
def natural_key(self):
|
|
52
|
+
"""
|
|
53
|
+
Return the natural key tuple for the instance.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
tuple: A one-element tuple containing the instance's name, used as its natural key.
|
|
57
|
+
"""
|
|
58
|
+
return (self.name,)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class RequirementSetManager(models.Manager):
|
|
62
|
+
def get_by_natural_key(self, name):
|
|
63
|
+
"""
|
|
64
|
+
Retrieves a model instance by its natural key.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
name: The natural key value, typically corresponding to the model's unique name.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
The model instance whose name matches the provided natural key.
|
|
71
|
+
"""
|
|
72
|
+
return self.get(name=name)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class RequirementSet(models.Model):
|
|
76
|
+
"""
|
|
77
|
+
A class representing a set of requirements.
|
|
78
|
+
|
|
79
|
+
Attributes:
|
|
80
|
+
name (str): The name of the requirement set.
|
|
81
|
+
description (str): A description of the requirement set.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
name = models.CharField(max_length=100, unique=True)
|
|
85
|
+
description = models.TextField(blank=True, null=True)
|
|
86
|
+
|
|
87
|
+
depends_on = models.ManyToManyField(
|
|
88
|
+
"self",
|
|
89
|
+
symmetrical=False,
|
|
90
|
+
related_name="dependents",
|
|
91
|
+
blank=True,
|
|
92
|
+
help_text=(
|
|
93
|
+
"Andere RequirementSets, die zuerst erfüllt sein müssen, "
|
|
94
|
+
"bevor dieses Set geprüft wird ('after')."
|
|
95
|
+
),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
requirements = models.ManyToManyField(
|
|
99
|
+
"Requirement",
|
|
100
|
+
blank=True,
|
|
101
|
+
related_name="requirement_sets",
|
|
102
|
+
)
|
|
103
|
+
links_to_sets = models.ManyToManyField(
|
|
104
|
+
"RequirementSet",
|
|
105
|
+
blank=True,
|
|
106
|
+
related_name="links_from_sets",
|
|
107
|
+
)
|
|
108
|
+
requirement_set_type = models.ForeignKey(
|
|
109
|
+
"RequirementSetType",
|
|
110
|
+
on_delete=models.CASCADE,
|
|
111
|
+
related_name="requirement_sets",
|
|
112
|
+
blank=True,
|
|
113
|
+
null=True,
|
|
114
|
+
)
|
|
115
|
+
information_sources = models.ManyToManyField(
|
|
116
|
+
"InformationSource",
|
|
117
|
+
related_name="requirement_sets",
|
|
118
|
+
blank=True,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
reqset_exam_links = models.ManyToManyField(
|
|
122
|
+
"ExaminationRequirementSet",
|
|
123
|
+
related_name="requirement_set",
|
|
124
|
+
blank=True,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
tags = models.ManyToManyField(
|
|
128
|
+
"Tag",
|
|
129
|
+
related_name="requirement_sets",
|
|
130
|
+
blank=True,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
objects = RequirementSetManager()
|
|
134
|
+
|
|
135
|
+
if TYPE_CHECKING:
|
|
136
|
+
from typing import Optional, cast
|
|
137
|
+
|
|
138
|
+
from endoreg_db.models import (
|
|
139
|
+
ExaminationRequirementSet,
|
|
140
|
+
InformationSource,
|
|
141
|
+
Requirement,
|
|
142
|
+
Tag,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
tags = cast(models.manager.RelatedManager["Tag"], tags)
|
|
146
|
+
requirements = cast(models.manager.RelatedManager["Requirement"], requirements)
|
|
147
|
+
links_to_sets = cast(
|
|
148
|
+
models.manager.RelatedManager["RequirementSet"], links_to_sets
|
|
149
|
+
)
|
|
150
|
+
reqset_exam_links = cast(
|
|
151
|
+
models.manager.RelatedManager["ExaminationRequirementSet"],
|
|
152
|
+
reqset_exam_links,
|
|
153
|
+
)
|
|
154
|
+
information_sources = cast(
|
|
155
|
+
models.manager.RelatedManager["InformationSource"], information_sources
|
|
156
|
+
)
|
|
157
|
+
requirement_set_type: models.ForeignKey["RequirementSetType | None"]
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def links_from_sets(
|
|
161
|
+
self,
|
|
162
|
+
) -> "models.manager.RelatedManager[RequirementSet]": ...
|
|
163
|
+
|
|
164
|
+
def natural_key(self):
|
|
165
|
+
"""Return the natural key as a tuple containing the instance's name."""
|
|
166
|
+
return (self.name,)
|
|
167
|
+
|
|
168
|
+
def __str__(self):
|
|
169
|
+
"""
|
|
170
|
+
Returns the name of the requirement set as its string representation.
|
|
171
|
+
"""
|
|
172
|
+
return str(self.name)
|
|
173
|
+
|
|
174
|
+
def evaluate_requirements(self, input_object, mode="loose") -> List[bool]:
|
|
175
|
+
"""
|
|
176
|
+
Evaluates all requirements in the set against the provided input object.
|
|
177
|
+
|
|
178
|
+
Intelligently selects the appropriate input data for each requirement based on its expected model types.
|
|
179
|
+
For example, if a requirement expects PatientFinding but receives a PatientExamination,
|
|
180
|
+
it will use the examination's patient_findings instead.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
input_object: The object to be evaluated by each requirement.
|
|
184
|
+
mode: Optional evaluation mode passed to each requirement (default is "loose").
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
A list of boolean values indicating whether each requirement is satisfied.
|
|
188
|
+
"""
|
|
189
|
+
results = []
|
|
190
|
+
for requirement in self.requirements.all():
|
|
191
|
+
# Get the appropriate input for this specific requirement
|
|
192
|
+
evaluation_input = self._get_evaluation_input_for_requirement(
|
|
193
|
+
requirement, input_object
|
|
194
|
+
)
|
|
195
|
+
result = requirement.evaluate(evaluation_input, mode=mode)
|
|
196
|
+
results.append(result)
|
|
197
|
+
return results
|
|
198
|
+
|
|
199
|
+
def _get_evaluation_input_for_requirement(self, requirement, input_object):
|
|
200
|
+
"""
|
|
201
|
+
Determines the appropriate input object for evaluating a specific requirement.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
requirement: The requirement to be evaluated
|
|
205
|
+
input_object: The original input object
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
The most appropriate input object for the requirement evaluation
|
|
209
|
+
"""
|
|
210
|
+
expected_models = requirement.expected_models
|
|
211
|
+
|
|
212
|
+
# If the input object is already one of the expected models, use it directly
|
|
213
|
+
for expected_model in expected_models:
|
|
214
|
+
if isinstance(input_object, expected_model):
|
|
215
|
+
return input_object
|
|
216
|
+
|
|
217
|
+
# Import here to avoid circular imports
|
|
218
|
+
from endoreg_db.models.medical.patient.patient_examination import (
|
|
219
|
+
PatientExamination,
|
|
220
|
+
)
|
|
221
|
+
from endoreg_db.models.medical.patient.patient_finding import PatientFinding
|
|
222
|
+
|
|
223
|
+
# Handle PatientExamination -> PatientFinding conversion
|
|
224
|
+
if isinstance(input_object, PatientExamination):
|
|
225
|
+
# If the requirement expects PatientFinding instances, scope queryset to relevant findings
|
|
226
|
+
if PatientFinding in expected_models:
|
|
227
|
+
findings_qs = input_object.patient_findings.all()
|
|
228
|
+
required_findings = list(requirement.findings.all())
|
|
229
|
+
if required_findings:
|
|
230
|
+
findings_qs = findings_qs.filter(finding__in=required_findings)
|
|
231
|
+
return findings_qs
|
|
232
|
+
|
|
233
|
+
# Handle other model conversions as needed in the future
|
|
234
|
+
# For now, return the original input object as fallback
|
|
235
|
+
return input_object
|
|
236
|
+
|
|
237
|
+
def evaluate_requirement_sets(self, input_object) -> List[bool]:
|
|
238
|
+
"""
|
|
239
|
+
Evaluates all linked requirement sets against the provided input object.
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
A list of boolean values indicating whether each linked requirement set is satisfied.
|
|
243
|
+
"""
|
|
244
|
+
results = []
|
|
245
|
+
linked_sets = self.all_linked_sets
|
|
246
|
+
if not linked_sets:
|
|
247
|
+
return results
|
|
248
|
+
for linked_set in linked_sets:
|
|
249
|
+
result = linked_set.evaluate(input_object)
|
|
250
|
+
results.append(result)
|
|
251
|
+
return results
|
|
252
|
+
|
|
253
|
+
@property
|
|
254
|
+
def eval_function(self):
|
|
255
|
+
"""
|
|
256
|
+
Returns the evaluation function associated with this requirement set's type.
|
|
257
|
+
|
|
258
|
+
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.
|
|
259
|
+
"""
|
|
260
|
+
if (
|
|
261
|
+
self.requirement_set_type
|
|
262
|
+
and self.requirement_set_type.name in REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP
|
|
263
|
+
):
|
|
264
|
+
return REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP[self.requirement_set_type.name]
|
|
265
|
+
return None
|
|
266
|
+
|
|
267
|
+
def evaluate(self, input_object):
|
|
268
|
+
"""
|
|
269
|
+
Evaluates whether the input object satisfies this requirement set.
|
|
270
|
+
|
|
271
|
+
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.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
input_object: The object to be evaluated against the requirements and linked sets.
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
True if the input object satisfies the requirement set according to its evaluation logic; otherwise, False.
|
|
278
|
+
"""
|
|
279
|
+
evaluate_r_results = self.evaluate_requirements(input_object)
|
|
280
|
+
evaluate_rs_results = self.evaluate_requirement_sets(input_object)
|
|
281
|
+
|
|
282
|
+
results = evaluate_r_results + evaluate_rs_results
|
|
283
|
+
|
|
284
|
+
eval_result = (
|
|
285
|
+
self.eval_function(results) if self.eval_function else all(results)
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
return eval_result
|
|
289
|
+
|
|
290
|
+
@property
|
|
291
|
+
def all_linked_sets(self):
|
|
292
|
+
"""
|
|
293
|
+
Returns all linked requirement sets, including those linked to the current set and those linked to any of its linked sets.
|
|
294
|
+
|
|
295
|
+
Uses recursive traversal with cycle detection to safely handle circular relationships.
|
|
296
|
+
Eliminates duplicates by tracking visited sets.
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
List[RequirementSet]: A list of all linked requirement sets.
|
|
300
|
+
"""
|
|
301
|
+
visited = set()
|
|
302
|
+
result: List["RequirementSet"] = []
|
|
303
|
+
|
|
304
|
+
def _collect_linked_sets(requirement_set: "RequirementSet"):
|
|
305
|
+
"""
|
|
306
|
+
Recursively collect linked sets while avoiding cycles and duplicates.
|
|
307
|
+
|
|
308
|
+
Args:
|
|
309
|
+
requirement_set: The RequirementSet to process
|
|
310
|
+
"""
|
|
311
|
+
# Use the primary key to track visited sets (avoids issues with object comparison)
|
|
312
|
+
if requirement_set.pk in visited:
|
|
313
|
+
return
|
|
314
|
+
|
|
315
|
+
visited.add(requirement_set.pk)
|
|
316
|
+
|
|
317
|
+
# Process all directly linked sets
|
|
318
|
+
for linked_set in requirement_set.links_to_sets.all():
|
|
319
|
+
if linked_set.pk not in visited:
|
|
320
|
+
result.append(linked_set)
|
|
321
|
+
# Recursively process the linked set's links
|
|
322
|
+
_collect_linked_sets(linked_set)
|
|
323
|
+
|
|
324
|
+
# Start the recursive collection from this instance
|
|
325
|
+
_collect_linked_sets(self)
|
|
326
|
+
|
|
327
|
+
return result
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from .label_video_segment import LabelVideoSegmentState
|
|
2
|
+
from .raw_pdf import RawPdfState
|
|
3
|
+
from .sensitive_meta import SensitiveMetaState
|
|
4
|
+
from .video import VideoState
|
|
5
|
+
from .anonymization import AnonymizationState
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"SensitiveMetaState",
|
|
9
|
+
"VideoState",
|
|
10
|
+
"LabelVideoSegmentState",
|
|
11
|
+
"AnonymizationState",
|
|
12
|
+
"RawPdfState",
|
|
13
|
+
]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class AnonymizationState(str, Enum):
|
|
5
|
+
"""Enumeration for the various states of the anonymization process.
|
|
6
|
+
|
|
7
|
+
Cheat Sheet:
|
|
8
|
+
Desired Status (AnonymizationState) Boolean Flags to Set in create()
|
|
9
|
+
VALIDATED anonymization_validated=True
|
|
10
|
+
DONE_PROCESSING_ANONYMIZATION sensitive_meta_processed=True, anonymization_validated=False
|
|
11
|
+
ANONYMIZED anonymized=True, sensitive_meta_processed=False
|
|
12
|
+
PROCESSING_ANONYMIZING processing_started=True, frames_extracted=True (Video only)
|
|
13
|
+
EXTRACTING_FRAMES was_created=True, frames_extracted=False (Video only)
|
|
14
|
+
FAILED processing_error=True (if field exists)
|
|
15
|
+
STARTED processing_started=True
|
|
16
|
+
NOT_STARTED No flags (defaults are usually False)
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
str (_type_): _description_
|
|
20
|
+
Enum (_type_): _description_
|
|
21
|
+
"""
|
|
22
|
+
NOT_STARTED = "not_started"
|
|
23
|
+
EXTRACTING_FRAMES = "extracting_frames"
|
|
24
|
+
PROCESSING_ANONYMIZING = "processing_anonymization"
|
|
25
|
+
DONE_PROCESSING_ANONYMIZATION = "done_processing_anonymization"
|
|
26
|
+
VALIDATED = "validated"
|
|
27
|
+
FAILED = "failed"
|
|
28
|
+
STARTED = "started"
|
|
29
|
+
ANONYMIZED = "anonymized"
|
|
30
|
+
|