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,237 @@
|
|
|
1
|
+
from typing import List, Optional, TYPE_CHECKING # Modified import
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
from endoreg_db.models import (
|
|
6
|
+
PatientDisease,
|
|
7
|
+
Disease,
|
|
8
|
+
DiseaseClassificationChoice,
|
|
9
|
+
Event,
|
|
10
|
+
PatientEvent,
|
|
11
|
+
Examination,
|
|
12
|
+
ExaminationIndication,
|
|
13
|
+
ExaminationIndicationClassificationChoice,
|
|
14
|
+
PatientExamination,
|
|
15
|
+
PatientExaminationIndication,
|
|
16
|
+
PatientFinding,
|
|
17
|
+
Finding,
|
|
18
|
+
FindingIntervention,
|
|
19
|
+
FindingClassification,
|
|
20
|
+
FindingClassificationChoice,
|
|
21
|
+
LabValue,
|
|
22
|
+
PatientLabValue,
|
|
23
|
+
PatientLabSample,
|
|
24
|
+
PatientLabSampleType,
|
|
25
|
+
PatientMedication, # Added
|
|
26
|
+
PatientMedicationSchedule, # Added
|
|
27
|
+
Medication, # Added
|
|
28
|
+
MedicationIndication, # Added
|
|
29
|
+
MedicationIntakeTime, # Added
|
|
30
|
+
MedicationSchedule, # Added
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING: # Added for Patient import
|
|
34
|
+
from endoreg_db.models.administration.person.patient import Patient
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class RequirementLinks(BaseModel):
|
|
38
|
+
"""
|
|
39
|
+
A class representing a dictionary of models related to a requirement.
|
|
40
|
+
|
|
41
|
+
Attributes:
|
|
42
|
+
# requirement_types (List[RequirementType]): A List of requirement types.
|
|
43
|
+
# operators (List[RequirementOperator]): A List of operators.
|
|
44
|
+
# requirement_sets (List[RequirementSet]): A List of requirement sets.
|
|
45
|
+
examinations (List[Examination]): A List of examinations.
|
|
46
|
+
examination_indications (List[ExaminationIndication]): A List of examination indications.
|
|
47
|
+
lab_values (List[LabValue]): A List of lab values.
|
|
48
|
+
diseases (List[Disease]): A List of diseases.
|
|
49
|
+
disease_classification_choices (List[DiseaseClassificationChoice]): A List of disease classification choices.
|
|
50
|
+
events (List[Event]): A List of events.
|
|
51
|
+
findings (List[Finding]): A List of findings.
|
|
52
|
+
finding_morphology_classification_choices (List[FindingMorphologyClassificationChoice]): A List of finding morphology classification choices.
|
|
53
|
+
finding_location_classification_choices (List[FindingLocationClassificationChoice]): A List of finding location classification choices.
|
|
54
|
+
finding_interventions (List[FindingIntervention]): A List of finding interventions.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
model_config = {"arbitrary_types_allowed": True}
|
|
58
|
+
#
|
|
59
|
+
# requirement_types: Optional[List["RequirementType"]] = None
|
|
60
|
+
# operators: Optional[List["RequirementOperator"]] = None
|
|
61
|
+
# The following model import causes circular import
|
|
62
|
+
# requirement_sets: Optional[List["RequirementSet"]] = None
|
|
63
|
+
examinations: List["Examination"] = Field(default_factory=list)
|
|
64
|
+
examination_indications: List["ExaminationIndication"] = Field(default_factory=list)
|
|
65
|
+
examination_indication_classification_choices: List[
|
|
66
|
+
"ExaminationIndicationClassificationChoice"
|
|
67
|
+
] = Field(default_factory=list)
|
|
68
|
+
patient_examinations: List["PatientExamination"] = Field(default_factory=list)
|
|
69
|
+
|
|
70
|
+
patient_examination_indication: List["PatientExaminationIndication"] = Field(
|
|
71
|
+
default_factory=list
|
|
72
|
+
)
|
|
73
|
+
lab_values: List["LabValue"] = Field(default_factory=list)
|
|
74
|
+
patient_lab_values: List["PatientLabValue"] = Field(default_factory=list)
|
|
75
|
+
patient_lab_samples: List["PatientLabSample"] = Field(default_factory=list)
|
|
76
|
+
patient_diseases: List["PatientDisease"] = Field(default_factory=list)
|
|
77
|
+
diseases: List["Disease"] = Field(default_factory=list)
|
|
78
|
+
disease_classification_choices: List["DiseaseClassificationChoice"] = Field(
|
|
79
|
+
default_factory=list
|
|
80
|
+
)
|
|
81
|
+
events: List["Event"] = Field(default_factory=list)
|
|
82
|
+
patient_events: List["PatientEvent"] = Field(default_factory=list)
|
|
83
|
+
patient_findings: List["PatientFinding"] = Field(default_factory=list)
|
|
84
|
+
findings: List["Finding"] = Field(default_factory=list)
|
|
85
|
+
finding_classification_choices: List["FindingClassificationChoice"] = Field(
|
|
86
|
+
default_factory=list
|
|
87
|
+
)
|
|
88
|
+
finding_classifications: List["FindingClassification"] = Field(
|
|
89
|
+
default_factory=list
|
|
90
|
+
) # Added for direct classification checks if needed
|
|
91
|
+
finding_interventions: List["FindingIntervention"] = Field(default_factory=list)
|
|
92
|
+
patient_lab_sample_types: List["PatientLabSampleType"] = Field(default_factory=list)
|
|
93
|
+
patient_medications: List["PatientMedication"] = Field(
|
|
94
|
+
default_factory=list
|
|
95
|
+
) # Added
|
|
96
|
+
patient_medication_schedules: List["PatientMedicationSchedule"] = Field(
|
|
97
|
+
default_factory=list
|
|
98
|
+
) # Added
|
|
99
|
+
# Added direct medication-related fields
|
|
100
|
+
medications: List["Medication"] = Field(default_factory=list)
|
|
101
|
+
medication_indications: List["MedicationIndication"] = Field(default_factory=list)
|
|
102
|
+
medication_intake_times: List["MedicationIntakeTime"] = Field(default_factory=list)
|
|
103
|
+
medication_schedules: List["MedicationSchedule"] = Field(default_factory=list)
|
|
104
|
+
|
|
105
|
+
def get_first_patient(self) -> Optional["Patient"]:
|
|
106
|
+
"""
|
|
107
|
+
Retrieves the first Patient instance found through the linked patient-specific models.
|
|
108
|
+
Iterates through various patient-related lists and returns the .patient attribute
|
|
109
|
+
from the first relevant object found.
|
|
110
|
+
"""
|
|
111
|
+
if self.patient_lab_values:
|
|
112
|
+
for plv in self.patient_lab_values:
|
|
113
|
+
if (
|
|
114
|
+
hasattr(plv, "sample")
|
|
115
|
+
and plv.sample
|
|
116
|
+
and hasattr(plv.sample, "patient")
|
|
117
|
+
and plv.sample.patient
|
|
118
|
+
):
|
|
119
|
+
return plv.sample.patient
|
|
120
|
+
if self.patient_lab_samples:
|
|
121
|
+
for pls in self.patient_lab_samples:
|
|
122
|
+
if hasattr(pls, "patient") and pls.patient:
|
|
123
|
+
return pls.patient
|
|
124
|
+
if self.patient_examinations:
|
|
125
|
+
for pe in self.patient_examinations:
|
|
126
|
+
if hasattr(pe, "patient") and pe.patient:
|
|
127
|
+
return pe.patient
|
|
128
|
+
if self.patient_diseases:
|
|
129
|
+
for pd in self.patient_diseases:
|
|
130
|
+
if hasattr(pd, "patient") and pd.patient:
|
|
131
|
+
return pd.patient
|
|
132
|
+
if self.patient_events:
|
|
133
|
+
for pev in self.patient_events:
|
|
134
|
+
if hasattr(pev, "patient") and pev.patient:
|
|
135
|
+
return pev.patient
|
|
136
|
+
if self.patient_findings:
|
|
137
|
+
for pf in self.patient_findings:
|
|
138
|
+
if hasattr(pf, "patient") and pf.patient:
|
|
139
|
+
return pf.patient
|
|
140
|
+
# Check PatientMedication
|
|
141
|
+
if self.patient_medications:
|
|
142
|
+
for pm in self.patient_medications:
|
|
143
|
+
if hasattr(pm, "patient") and pm.patient:
|
|
144
|
+
return pm.patient
|
|
145
|
+
# Check PatientMedicationSchedule
|
|
146
|
+
if self.patient_medication_schedules:
|
|
147
|
+
for pms in self.patient_medication_schedules:
|
|
148
|
+
if hasattr(pms, "patient") and pms.patient:
|
|
149
|
+
return pms.patient
|
|
150
|
+
return None
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def data_model_dict(self):
|
|
154
|
+
"""
|
|
155
|
+
Provides access to the data model dictionary used for requirement type parsing.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
The `data_model_dict` imported from the requirement type parser module.
|
|
159
|
+
"""
|
|
160
|
+
from endoreg_db.models.requirement.requirement_evaluation.requirement_type_parser import (
|
|
161
|
+
data_model_dict,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
return data_model_dict
|
|
165
|
+
|
|
166
|
+
@property
|
|
167
|
+
def data_model_dict_reverse(self):
|
|
168
|
+
"""
|
|
169
|
+
Provides a reverse mapping dictionary for data model types used in requirement evaluation.
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
The `data_model_dict_reverse` dictionary imported from the requirement type parser module.
|
|
173
|
+
"""
|
|
174
|
+
from endoreg_db.models.requirement.requirement_evaluation.requirement_type_parser import (
|
|
175
|
+
data_model_dict_reverse,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
return data_model_dict_reverse
|
|
179
|
+
|
|
180
|
+
def match_any(self, other: "RequirementLinks") -> bool:
|
|
181
|
+
"""
|
|
182
|
+
Determines if any linked model in this instance is also present in another RequirementLinks instance.
|
|
183
|
+
|
|
184
|
+
Compares each list attribute of both instances and returns True if any element in any list overlaps.
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
other_dict = other.model_dump()
|
|
188
|
+
self_dict = self.model_dump()
|
|
189
|
+
for key in self_dict:
|
|
190
|
+
# print(f"Checking key: {key}") # This is a debug print, can be removed
|
|
191
|
+
if key in other_dict and self_dict[key] and other_dict[key]:
|
|
192
|
+
if any(item in other_dict[key] for item in self_dict[key]):
|
|
193
|
+
return True
|
|
194
|
+
return False # Ensure False is returned if no match is found
|
|
195
|
+
|
|
196
|
+
def active(self) -> dict[str, list]:
|
|
197
|
+
"""
|
|
198
|
+
Returns a dictionary of all non-empty linked model lists.
|
|
199
|
+
|
|
200
|
+
Only attributes with non-empty lists are included in the returned dictionary.
|
|
201
|
+
"""
|
|
202
|
+
active_links_dict = {}
|
|
203
|
+
# Use model_dump() to iterate field data reliably (pydantic v2)
|
|
204
|
+
for field_name, field_value in self.model_dump().items():
|
|
205
|
+
if isinstance(field_value, list) and field_value:
|
|
206
|
+
active_links_dict[field_name] = field_value
|
|
207
|
+
return active_links_dict
|
|
208
|
+
|
|
209
|
+
def __repr__(self):
|
|
210
|
+
"""
|
|
211
|
+
Returns a concise string summarizing the counts of each linked model list in the instance.
|
|
212
|
+
"""
|
|
213
|
+
data = self.model_dump()
|
|
214
|
+
fields = [
|
|
215
|
+
"examinations",
|
|
216
|
+
"examination_indications",
|
|
217
|
+
"patient_examinations",
|
|
218
|
+
"lab_values",
|
|
219
|
+
"patient_lab_values",
|
|
220
|
+
"patient_diseases",
|
|
221
|
+
"diseases",
|
|
222
|
+
"disease_classification_choices",
|
|
223
|
+
"events",
|
|
224
|
+
"patient_events",
|
|
225
|
+
"findings",
|
|
226
|
+
"patient_findings",
|
|
227
|
+
"finding_classification_choices",
|
|
228
|
+
"finding_interventions",
|
|
229
|
+
"patient_medications",
|
|
230
|
+
"patient_medication_schedules",
|
|
231
|
+
"medications",
|
|
232
|
+
"medication_indications",
|
|
233
|
+
"medication_intake_times",
|
|
234
|
+
"medication_schedules",
|
|
235
|
+
]
|
|
236
|
+
parts = [f"{f}={len(data.get(f, []))}" for f in fields]
|
|
237
|
+
return f"RequirementLinks({', '.join(parts)})"
|
|
File without changes
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Use faker library to generate fake names by gender
|
|
2
|
+
# Use german names by default
|
|
3
|
+
|
|
4
|
+
from faker import Faker
|
|
5
|
+
import gender_guesser.detector as gender_detector
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def create_mock_examiner_name() -> tuple[str, str]:
|
|
9
|
+
"""
|
|
10
|
+
Generate a mock examiner's name using the Faker library.
|
|
11
|
+
This function creates a tuple with a first name and a last name for a mock examiner. It utilizes the "de_DE" locale for generating German names.
|
|
12
|
+
Returns:
|
|
13
|
+
tuple[str, str]: A tuple containing the first name and the last name.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
fake = Faker("de_DE")
|
|
17
|
+
first_name = fake.first_name()
|
|
18
|
+
last_name = fake.last_name()
|
|
19
|
+
return first_name, last_name
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def create_mock_patient_name(gender: str) -> tuple[str, str]:
|
|
23
|
+
"""
|
|
24
|
+
Generate a mock patient's name based on the provided gender using the Faker library.
|
|
25
|
+
This function creates a tuple with a first name and a last name for a mock patient. It utilizes the "de_DE" locale for generating German names. When the input gender string is checked:
|
|
26
|
+
- If it contains "male", a male name is generated.
|
|
27
|
+
- If it contains "female", a female name is generated.
|
|
28
|
+
- Otherwise, a generic name is generated without considering gender.
|
|
29
|
+
Parameters:
|
|
30
|
+
gender (str): A string indicating the gender to be used for generating the name.
|
|
31
|
+
Returns:
|
|
32
|
+
tuple[str, str]: A tuple containing the first name and the last name.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
fake = Faker("de_DE")
|
|
36
|
+
|
|
37
|
+
if "male" in gender.lower():
|
|
38
|
+
gender = "male"
|
|
39
|
+
elif "female" in gender.lower():
|
|
40
|
+
gender = "female"
|
|
41
|
+
|
|
42
|
+
if gender == "male":
|
|
43
|
+
first_name = fake.first_name_male()
|
|
44
|
+
last_name = fake.last_name_male()
|
|
45
|
+
|
|
46
|
+
elif gender == "female":
|
|
47
|
+
first_name = fake.first_name_female()
|
|
48
|
+
last_name = fake.last_name_female()
|
|
49
|
+
|
|
50
|
+
else:
|
|
51
|
+
first_name = fake.first_name()
|
|
52
|
+
last_name = fake.last_name()
|
|
53
|
+
|
|
54
|
+
return first_name, last_name
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def guess_name_gender(name: str) -> str:
|
|
58
|
+
"""Return a normalized gender slug (male|female|unknown) for the given name.
|
|
59
|
+
|
|
60
|
+
Uses :mod:`gender_guesser` to infer gender without touching the database. All
|
|
61
|
+
detector outputs are mapped onto our canonical slugs so callers can perform
|
|
62
|
+
their own model lookups or fall back safely.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
detector = gender_detector.Detector(case_sensitive=False)
|
|
66
|
+
try:
|
|
67
|
+
detected = detector.get_gender(name or "")
|
|
68
|
+
except Exception: # pragma: no cover - defensive, detector is pure-Python
|
|
69
|
+
detected = None
|
|
70
|
+
|
|
71
|
+
if not detected:
|
|
72
|
+
return "unknown"
|
|
73
|
+
|
|
74
|
+
normalized = detected.lower()
|
|
75
|
+
if normalized in {"male", "mostly_male"}:
|
|
76
|
+
return "male"
|
|
77
|
+
if normalized in {"female", "mostly_female"}:
|
|
78
|
+
return "female"
|
|
79
|
+
|
|
80
|
+
# gender-guesser returns "andy" for androgynous names and "unknown" for
|
|
81
|
+
# unrecognised inputs – both should map to our "unknown" slug.
|
|
82
|
+
return "unknown"
|
endoreg_db/utils/ocr.py
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import pytesseract
|
|
2
|
+
from PIL import Image, ImageOps
|
|
3
|
+
import cv2
|
|
4
|
+
import os
|
|
5
|
+
from collections import Counter
|
|
6
|
+
from tempfile import TemporaryDirectory
|
|
7
|
+
import re
|
|
8
|
+
from datetime import datetime
|
|
9
|
+
from typing import Dict, List
|
|
10
|
+
from endoreg_db.utils.cropping import crop_and_insert
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
N_FRAMES_MEAN_OCR = 2
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Helper function to process date strings
|
|
17
|
+
def process_date_text(date_text):
|
|
18
|
+
"""
|
|
19
|
+
Processes a string of text that represents a date and returns a datetime.date object.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
date_text (str): A string of text that represents a date.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
datetime.date: A datetime.date object representing the parsed date, or None if the text cannot be parsed.
|
|
26
|
+
"""
|
|
27
|
+
try:
|
|
28
|
+
# Remove any non-digit characters
|
|
29
|
+
date_text_clean = re.sub(r"\D", "", date_text)
|
|
30
|
+
# Reformat to 'ddmmyyyy' if necessary
|
|
31
|
+
if len(date_text_clean) == 8:
|
|
32
|
+
return datetime.strptime(date_text_clean, "%d%m%Y").date()
|
|
33
|
+
elif len(date_text_clean) == 14:
|
|
34
|
+
return datetime.strptime(date_text_clean, "%d%m%Y%H%M%S").date()
|
|
35
|
+
except ValueError:
|
|
36
|
+
# Return None if the text cannot be parsed into a date
|
|
37
|
+
# set date to 1/1/1900
|
|
38
|
+
return datetime.strptime("01011900", "%d%m%Y").date()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# Helper function to process patient names
|
|
42
|
+
def process_name_text(name_text):
|
|
43
|
+
"""
|
|
44
|
+
Remove all numbers, punctuation, and whitespace from a string of text and return the result.
|
|
45
|
+
"""
|
|
46
|
+
name = re.sub(r'[0-9!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\s]+', "", name_text).strip()
|
|
47
|
+
# capitalize first letter of each word
|
|
48
|
+
name = " ".join([word.capitalize() for word in name.split()])
|
|
49
|
+
return name
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# Helper function to process endoscope type text
|
|
53
|
+
def process_general_text(endoscope_text):
|
|
54
|
+
"""
|
|
55
|
+
This function takes in a string of text from an endoscope and returns a cleaned version of the text.
|
|
56
|
+
"""
|
|
57
|
+
return " ".join(endoscope_text.split())
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def roi_values_valid(roi):
|
|
61
|
+
"""
|
|
62
|
+
Check if all values in an ROI dictionary are valid (>=0).
|
|
63
|
+
"""
|
|
64
|
+
return all([value >= 0 for value in roi.values()])
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# Function to extract text from ROIs
|
|
68
|
+
def extract_text_from_rois(image_path, processor):
|
|
69
|
+
"""
|
|
70
|
+
Extracts text from regions of interest (ROIs) in an image using OCR.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
image_path (str): The path to the image file.
|
|
74
|
+
processor (EndoscopyProcessor): An instance of the EndoscopyProcessor class.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
dict: A dictionary containing the extracted text for each ROI.
|
|
78
|
+
"""
|
|
79
|
+
# Read the image using Pillow
|
|
80
|
+
image = Image.open(image_path)
|
|
81
|
+
image_dimensions = image.size # (width, height)
|
|
82
|
+
|
|
83
|
+
####### Adjust Image #######
|
|
84
|
+
# Convert to grayscale
|
|
85
|
+
gray = image.convert("L")
|
|
86
|
+
|
|
87
|
+
# Invert colors for white text on black background
|
|
88
|
+
inverted = ImageOps.invert(gray)
|
|
89
|
+
|
|
90
|
+
# Initialize the dictionary to hold the extracted text
|
|
91
|
+
extracted_texts = {}
|
|
92
|
+
|
|
93
|
+
# Define your ROIs and their corresponding post-processing functions in tuples
|
|
94
|
+
rois_with_postprocessing = [
|
|
95
|
+
("examination_date", processor.get_roi_examination_date, process_date_text),
|
|
96
|
+
("patient_first_name", processor.get_roi_patient_first_name, process_name_text),
|
|
97
|
+
("patient_last_name", processor.get_roi_patient_last_name, process_name_text),
|
|
98
|
+
("patient_dob", processor.get_roi_patient_dob, process_date_text),
|
|
99
|
+
("endoscope_type", processor.get_roi_endoscope_type, process_general_text),
|
|
100
|
+
("endoscope_sn", processor.get_roi_endoscopy_sn, process_general_text),
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
# Extract and post-process text for each ROI
|
|
104
|
+
for roi_name, roi_function, post_process in rois_with_postprocessing:
|
|
105
|
+
# Get the ROI dictionary
|
|
106
|
+
roi = roi_function()
|
|
107
|
+
|
|
108
|
+
# Check if the ROI has values
|
|
109
|
+
|
|
110
|
+
if roi_values_valid(roi):
|
|
111
|
+
x, y, w, h = roi["x"], roi["y"], roi["width"], roi["height"]
|
|
112
|
+
|
|
113
|
+
# Get white image with original shape and just the roi remaining
|
|
114
|
+
roi_image = crop_and_insert(inverted, x, y, h, w)
|
|
115
|
+
|
|
116
|
+
# OCR configuration: Recognize white text on black background without corrections
|
|
117
|
+
config = "--psm 10 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-üöäÜÖÄß"
|
|
118
|
+
|
|
119
|
+
# Use pytesseract to do OCR on the preprocessed ROI
|
|
120
|
+
text = pytesseract.image_to_string(roi_image, config=config).strip()
|
|
121
|
+
|
|
122
|
+
# Post-process extracted text
|
|
123
|
+
processed_text = post_process(text)
|
|
124
|
+
|
|
125
|
+
extracted_texts[roi_name] = processed_text
|
|
126
|
+
|
|
127
|
+
else:
|
|
128
|
+
pass
|
|
129
|
+
|
|
130
|
+
return extracted_texts
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def get_most_frequent_values(rois_texts: Dict[str, List[str]]) -> Dict[str, str]:
|
|
134
|
+
"""
|
|
135
|
+
Given a dictionary of ROIs and their corresponding texts, returns a dictionary of the most frequent text for each ROI.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
rois_texts: A dictionary where the keys are the names of the ROIs and the values are lists of texts.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
A dictionary where the keys are the names of the ROIs and the values are the most frequent text for each ROI.
|
|
142
|
+
"""
|
|
143
|
+
most_frequent = {}
|
|
144
|
+
for key in rois_texts.keys():
|
|
145
|
+
counter = Counter([text for text in rois_texts[key] if text])
|
|
146
|
+
most_frequent[key], _ = counter.most_common(1)[0] if counter else (None, None)
|
|
147
|
+
return most_frequent
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def process_video(video_path, processor):
|
|
151
|
+
"""
|
|
152
|
+
Processes a video file by extracting text from regions of interest (ROIs) in each frame.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
video_path (str): The path to the video file to process.
|
|
156
|
+
processor (OCRProcessor): An instance of the OCRProcessor class that defines the ROIs to extract text from.
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
dict: A dictionary containing the most frequent text values extracted from each ROI.
|
|
160
|
+
"""
|
|
161
|
+
# Create a temporary directory to store frames
|
|
162
|
+
with TemporaryDirectory() as temp_dir:
|
|
163
|
+
# Capture the video
|
|
164
|
+
video = cv2.VideoCapture(video_path)
|
|
165
|
+
success, frame_number = True, 0
|
|
166
|
+
rois_texts = {roi_name: [] for roi_name in processor.get_rois().keys()}
|
|
167
|
+
frames_for_mean_extraction = 0
|
|
168
|
+
|
|
169
|
+
while success:
|
|
170
|
+
success, frame = video.read()
|
|
171
|
+
|
|
172
|
+
# Check if this is the 200th frame
|
|
173
|
+
if frame_number % 1000 == 0 and success:
|
|
174
|
+
frame_path = os.path.join(temp_dir, f"frame_{frame_number}.jpg")
|
|
175
|
+
cv2.imwrite(frame_path, frame) # Save the frame as a JPEG file
|
|
176
|
+
# cv2.imwrite(f"_tmp/frame_{frame_number}.jpg", frame)
|
|
177
|
+
|
|
178
|
+
# Extract text from ROIs
|
|
179
|
+
extracted_texts = extract_text_from_rois(frame_path, processor)
|
|
180
|
+
|
|
181
|
+
# Store the extracted text from each ROI
|
|
182
|
+
for key, text in extracted_texts.items():
|
|
183
|
+
rois_texts[key].append(text)
|
|
184
|
+
frames_for_mean_extraction += 1
|
|
185
|
+
|
|
186
|
+
frame_number += 1
|
|
187
|
+
|
|
188
|
+
if frames_for_mean_extraction >= N_FRAMES_MEAN_OCR:
|
|
189
|
+
break
|
|
190
|
+
|
|
191
|
+
# Release the video capture object
|
|
192
|
+
video.release()
|
|
193
|
+
|
|
194
|
+
# Get the most frequent values for each ROI
|
|
195
|
+
return get_most_frequent_values(rois_texts)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import Any, Optional
|
|
5
|
+
|
|
6
|
+
from django.http import HttpRequest
|
|
7
|
+
|
|
8
|
+
from endoreg_db.models.operation_log import OperationLog
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# -----------------------------
|
|
14
|
+
# Operation actions
|
|
15
|
+
# -----------------------------
|
|
16
|
+
|
|
17
|
+
ACTION_ANONYMIZATION_START = "anonymization.start"
|
|
18
|
+
ACTION_ANONYMIZATION_VALIDATED = "anonymization.validated"
|
|
19
|
+
|
|
20
|
+
ACTION_SEGMENT_ANNOTATED = "segment.annotated"
|
|
21
|
+
ACTION_SEGMENT_CREATED = "segment.created"
|
|
22
|
+
|
|
23
|
+
# -----------------------------
|
|
24
|
+
# Operation statuses
|
|
25
|
+
# -----------------------------
|
|
26
|
+
|
|
27
|
+
STATUS_VALIDATED = "validated"
|
|
28
|
+
STATUS_UNVALIDATED = "unvalidated"
|
|
29
|
+
|
|
30
|
+
STATUS_NOT_STARTED = "not_started"
|
|
31
|
+
STATUS_PROCESSING = "processing"
|
|
32
|
+
STATUS_ANONYMIZED = "anonymized"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def record_operation(
|
|
36
|
+
request: HttpRequest,
|
|
37
|
+
*,
|
|
38
|
+
action: str,
|
|
39
|
+
resource_type: str = "",
|
|
40
|
+
resource_id: Optional[int] = None,
|
|
41
|
+
status_before: Optional[str] = None,
|
|
42
|
+
status_after: Optional[str] = None,
|
|
43
|
+
meta: Optional[dict[str, Any]] = None,
|
|
44
|
+
) -> None:
|
|
45
|
+
"""
|
|
46
|
+
Create an OperationLog entry from a view.
|
|
47
|
+
"""
|
|
48
|
+
user = getattr(request, "user", None)
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
log = OperationLog(
|
|
52
|
+
actor_user=user if getattr(user, "is_authenticated", False) else None,
|
|
53
|
+
actor_username=getattr(user, "username", "") if user else "",
|
|
54
|
+
actor_email=getattr(user, "email", "") if user else "",
|
|
55
|
+
actor_keycloak_id="", # fill later if you add it to your user model
|
|
56
|
+
action=action,
|
|
57
|
+
http_method=getattr(request, "method", ""),
|
|
58
|
+
path=getattr(request, "path", ""),
|
|
59
|
+
resource_type=resource_type,
|
|
60
|
+
resource_id=resource_id,
|
|
61
|
+
status_before=status_before or "",
|
|
62
|
+
status_after=status_after or "",
|
|
63
|
+
meta=meta or None,
|
|
64
|
+
)
|
|
65
|
+
log.save()
|
|
66
|
+
except Exception:
|
|
67
|
+
# Never kill the main request flow because of logging
|
|
68
|
+
logger.exception(
|
|
69
|
+
"Failed to record operation %s for %s(%s)",
|
|
70
|
+
action,
|
|
71
|
+
resource_type,
|
|
72
|
+
resource_id,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# TODO: will make the name more generic later based on the requirement,after merge
|
|
77
|
+
def get_resource_type_from_instance(obj):
|
|
78
|
+
name = obj.__class__.__name__
|
|
79
|
+
'''if name == "VideoFile":
|
|
80
|
+
return "video"
|
|
81
|
+
if name == "RawPdfFile":
|
|
82
|
+
return "pdf"'''
|
|
83
|
+
return name.lower()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import yaml
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
# get this files path
|
|
5
|
+
file_path = Path(__file__)
|
|
6
|
+
module_root = file_path.parent.parent
|
|
7
|
+
data_dir = module_root / "data"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def collect_center_names():
|
|
11
|
+
input_file_path = data_dir / "center/data.yaml"
|
|
12
|
+
fist_name_dir = data_dir / "names_first"
|
|
13
|
+
last_name_dir = data_dir / "names_last"
|
|
14
|
+
# Load the input YAML file
|
|
15
|
+
with open(input_file_path, "r", encoding="utf-8") as file:
|
|
16
|
+
data = yaml.safe_load(file)
|
|
17
|
+
|
|
18
|
+
# Containers for first and last names
|
|
19
|
+
first_names_set = set()
|
|
20
|
+
last_names_set = set()
|
|
21
|
+
|
|
22
|
+
# Extract first and last names from the YAML data
|
|
23
|
+
for entry in data:
|
|
24
|
+
fields = entry.get("fields", {})
|
|
25
|
+
first_names_set.update(fields.get("first_names", []))
|
|
26
|
+
last_names_set.update(fields.get("last_names", []))
|
|
27
|
+
|
|
28
|
+
# Create a list of dictionaries for first and last names
|
|
29
|
+
first_names_data = [
|
|
30
|
+
{"model": "endoreg_db.first_name", "fields": {"name": name}}
|
|
31
|
+
for name in sorted(first_names_set)
|
|
32
|
+
]
|
|
33
|
+
last_names_data = [
|
|
34
|
+
{"model": "endoreg_db.last_name", "fields": {"name": name}}
|
|
35
|
+
for name in sorted(last_names_set)
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
# Write the data to separate YAML files
|
|
39
|
+
with open(fist_name_dir / "first_names.yaml", "w", encoding="utf-8") as first_file:
|
|
40
|
+
yaml.dump(first_names_data, first_file, allow_unicode=True, sort_keys=False)
|
|
41
|
+
|
|
42
|
+
with open(last_name_dir / "last_names.yaml", "w", encoding="utf-8") as last_file:
|
|
43
|
+
yaml.dump(last_names_data, last_file, allow_unicode=True, sort_keys=False)
|
|
44
|
+
|
|
45
|
+
# print("Generated first_names.yaml and last_names.yaml successfully.")
|