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,159 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Centralizes path management for the application.
|
|
3
|
+
|
|
4
|
+
This module sets up all necessary directories for storage and import operations.
|
|
5
|
+
It provides a unified dictionary 'data_paths' for accessing all path objects.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from logging import getLogger
|
|
9
|
+
|
|
10
|
+
logger = getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Dict, Union
|
|
15
|
+
|
|
16
|
+
# Alternative approach using env_path helper, deprecated since monorepo setup. Alright for single install, env is always preferred.
|
|
17
|
+
# from endoreg_db.config.env import env_path
|
|
18
|
+
|
|
19
|
+
STORAGE_DIR = Path(os.getenv("STORAGE_DIR", "internal_storage"))
|
|
20
|
+
|
|
21
|
+
storage_dir_env = os.getenv("STORAGE_DIR")
|
|
22
|
+
if storage_dir_env is None:
|
|
23
|
+
raise RuntimeError("STORAGE_DIR environment variable is not set.")
|
|
24
|
+
storage_dir = Path(storage_dir_env)
|
|
25
|
+
STORAGE_DIR = storage_dir
|
|
26
|
+
if not STORAGE_DIR.exists():
|
|
27
|
+
STORAGE_DIR.mkdir(parents=True, exist_ok=True)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
PREFIX_RAW = "raw_"
|
|
31
|
+
io_dir_env = Path(os.getenv("IO_DIR", "data"))
|
|
32
|
+
io_dir = Path(io_dir_env)
|
|
33
|
+
IO_DIR = io_dir
|
|
34
|
+
if not STORAGE_DIR.exists():
|
|
35
|
+
STORAGE_DIR.mkdir(parents=True, exist_ok=True)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# Data dropoff folders - These can be external, determined by IO_DIR (Default: set to desktop root folder of OS)
|
|
39
|
+
|
|
40
|
+
IMPORT_DIR_NAME = "import"
|
|
41
|
+
EXPORT_DIR_NAME = "export"
|
|
42
|
+
|
|
43
|
+
IMPORT_DIR = IO_DIR / IMPORT_DIR_NAME # data/import
|
|
44
|
+
EXPORT_DIR = IO_DIR / EXPORT_DIR_NAME # data/export
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
IMPORT_VIDEO_DIR_NAME = "video_import"
|
|
48
|
+
REPORT_IMPORT_DIR_NAME = "report_import"
|
|
49
|
+
|
|
50
|
+
VIDEO_EXPORT_DIR_NAME = "video_export"
|
|
51
|
+
REPORT_EXPORT_DIR_NAME = "report_export"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
IMPORT_VIDEO_DIR = IMPORT_DIR / IMPORT_VIDEO_DIR_NAME
|
|
55
|
+
IMPORT_REPORT_DIR = IMPORT_DIR / REPORT_IMPORT_DIR_NAME
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
VIDEO_EXPORT_DIR = EXPORT_DIR / VIDEO_EXPORT_DIR_NAME
|
|
59
|
+
REPORT_EXPORT_DIR = EXPORT_DIR / REPORT_EXPORT_DIR_NAME
|
|
60
|
+
|
|
61
|
+
# Document Dir
|
|
62
|
+
|
|
63
|
+
DOCUMENT_DIR = STORAGE_DIR / "documents"
|
|
64
|
+
|
|
65
|
+
# After initial import, files will remain here.
|
|
66
|
+
|
|
67
|
+
TRANSCODING_DIR = STORAGE_DIR / "temp"
|
|
68
|
+
|
|
69
|
+
SENSITIVE_VIDEO_DIR_NAME = "sensitive_videos"
|
|
70
|
+
SENSITIVE_REPORT_DIR_NAME = "sensitive_reports"
|
|
71
|
+
ANONYM_VIDEO_DIR_NAME = "processed_videos_final"
|
|
72
|
+
ANONYM_REPORT_DIR_NAME = "processed_reports_final"
|
|
73
|
+
|
|
74
|
+
RAW_FRAME_DIR_NAME = f"{PREFIX_RAW}frames"
|
|
75
|
+
FRAME_DIR_NAME = "frames"
|
|
76
|
+
WEIGHTS_DIR_NAME = "model_weights"
|
|
77
|
+
EXAMINATION_DIR_NAME = "examinations"
|
|
78
|
+
|
|
79
|
+
# Define data subdirectories under STORAGE_DIR
|
|
80
|
+
ANONYM_VIDEO_DIR = STORAGE_DIR / ANONYM_VIDEO_DIR_NAME
|
|
81
|
+
SENSITIVE_VIDEO_DIR = STORAGE_DIR / SENSITIVE_VIDEO_DIR_NAME
|
|
82
|
+
ANONYM_REPORT_DIR = STORAGE_DIR / ANONYM_REPORT_DIR_NAME
|
|
83
|
+
SENSITIVE_REPORT_DIR = STORAGE_DIR / SENSITIVE_REPORT_DIR_NAME
|
|
84
|
+
|
|
85
|
+
FRAME_DIR = STORAGE_DIR / FRAME_DIR_NAME
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
WEIGHTS_DIR = STORAGE_DIR / WEIGHTS_DIR_NAME
|
|
89
|
+
RAW_FRAME_DIR = STORAGE_DIR / RAW_FRAME_DIR_NAME
|
|
90
|
+
|
|
91
|
+
WEIGHTS_IMPORT_DIR = IMPORT_DIR / WEIGHTS_DIR_NAME
|
|
92
|
+
WEIGHTS_EXPORT_DIR = EXPORT_DIR / WEIGHTS_DIR_NAME
|
|
93
|
+
|
|
94
|
+
FRAME_IMPORT_DIR = IMPORT_DIR / FRAME_DIR_NAME
|
|
95
|
+
|
|
96
|
+
FRAME_EXPORT_DIR = EXPORT_DIR / FRAME_DIR_NAME
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
data_paths: Dict[str, Path] = {
|
|
100
|
+
"storage": STORAGE_DIR,
|
|
101
|
+
"import": IMPORT_DIR,
|
|
102
|
+
"import_video": IMPORT_VIDEO_DIR,
|
|
103
|
+
"sensitive_video": SENSITIVE_VIDEO_DIR,
|
|
104
|
+
"sensitive_report": SENSITIVE_REPORT_DIR,
|
|
105
|
+
"anonym_video": ANONYM_VIDEO_DIR,
|
|
106
|
+
"anonym_report": ANONYM_REPORT_DIR,
|
|
107
|
+
"import_frame": FRAME_IMPORT_DIR,
|
|
108
|
+
"import_report": IMPORT_REPORT_DIR,
|
|
109
|
+
"raw_frame": RAW_FRAME_DIR,
|
|
110
|
+
"weights": WEIGHTS_DIR,
|
|
111
|
+
"weights_import": WEIGHTS_IMPORT_DIR,
|
|
112
|
+
"export": EXPORT_DIR,
|
|
113
|
+
"report_export": REPORT_EXPORT_DIR,
|
|
114
|
+
"video_export": VIDEO_EXPORT_DIR,
|
|
115
|
+
"frame_export": FRAME_EXPORT_DIR,
|
|
116
|
+
"weights_export": EXPORT_DIR / WEIGHTS_DIR_NAME,
|
|
117
|
+
"transcoding": TRANSCODING_DIR,
|
|
118
|
+
"frame": FRAME_DIR,
|
|
119
|
+
"documents": DOCUMENT_DIR,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
logger.info(f"Storage directory: {STORAGE_DIR.resolve()}")
|
|
123
|
+
logger.info(f"Export directory: {EXPORT_DIR.resolve()}")
|
|
124
|
+
|
|
125
|
+
for key, path in data_paths.items():
|
|
126
|
+
path.mkdir(parents=True, exist_ok=True)
|
|
127
|
+
|
|
128
|
+
logger.info(f"{key.capitalize()} directory: {path.resolve()}")
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def to_storage_relative(path: Union[str, Path]) -> str:
|
|
132
|
+
"""
|
|
133
|
+
Return a path string relative to STORAGE_DIR, suitable for Django FileField.name.
|
|
134
|
+
|
|
135
|
+
- If `path` is inside STORAGE_DIR (absolute or contains STORAGE_DIR as prefix),
|
|
136
|
+
we strip the STORAGE_DIR prefix and return the relative part.
|
|
137
|
+
- If `path` is outside STORAGE_DIR, we return it as a string unchanged
|
|
138
|
+
(caller can decide what to do).
|
|
139
|
+
"""
|
|
140
|
+
# Normalize input to Path
|
|
141
|
+
p = Path(path)
|
|
142
|
+
|
|
143
|
+
# Resolve absolute path for comparison
|
|
144
|
+
storage_root = STORAGE_DIR.resolve()
|
|
145
|
+
|
|
146
|
+
if not p.is_absolute():
|
|
147
|
+
# Resolve relative path against current working directory
|
|
148
|
+
# (in tests, cwd should be project root, so this still lands under STORAGE_DIR)
|
|
149
|
+
p = p.resolve()
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
rel = p.relative_to(storage_root)
|
|
153
|
+
except ValueError:
|
|
154
|
+
# Not under STORAGE_DIR – probably already a relative name or external.
|
|
155
|
+
# In that case, just return the string representation as-is.
|
|
156
|
+
return str(path)
|
|
157
|
+
|
|
158
|
+
# Use POSIX-style separators for Django FileField
|
|
159
|
+
return rel.as_posix()
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Dynamic permission utilities that adapt to environment settings.
|
|
3
|
+
|
|
4
|
+
This module provides permission classes that automatically adjust based on
|
|
5
|
+
the DEBUG setting and other environment configurations.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from django.conf import settings
|
|
9
|
+
from rest_framework.permissions import IsAuthenticated, AllowAny, BasePermission
|
|
10
|
+
|
|
11
|
+
# from rest_framework.decorators import permission_classes as drf_permission_classes
|
|
12
|
+
from functools import wraps
|
|
13
|
+
import logging
|
|
14
|
+
import os
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class DynamicAuthPermission:
|
|
20
|
+
"""
|
|
21
|
+
Permission class that adapts based on environment settings.
|
|
22
|
+
|
|
23
|
+
- In DEBUG mode: Allows access without authentication
|
|
24
|
+
- In production (DEBUG=False): Requires authentication
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
@staticmethod
|
|
28
|
+
def get_permission_classes():
|
|
29
|
+
"""
|
|
30
|
+
Returns appropriate permission classes based on current settings.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
list: Permission classes to use
|
|
34
|
+
"""
|
|
35
|
+
if getattr(settings, "DEBUG", False):
|
|
36
|
+
logger.info("DEBUG mode detected - allowing unauthenticated access")
|
|
37
|
+
return [AllowAny]
|
|
38
|
+
else:
|
|
39
|
+
logger.info("Production mode detected - requiring authentication")
|
|
40
|
+
return [IsAuthenticated]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def dynamic_permission_classes(force_auth=None):
|
|
44
|
+
"""
|
|
45
|
+
Decorator that applies permission classes based on environment settings.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
force_auth (bool, optional):
|
|
49
|
+
- True: Always require authentication regardless of DEBUG
|
|
50
|
+
- False: Always allow access regardless of DEBUG
|
|
51
|
+
- None: Use environment-based logic (default)
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def decorator(view_func):
|
|
55
|
+
from rest_framework.decorators import (
|
|
56
|
+
permission_classes as drf_permission_classes,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
@wraps(view_func)
|
|
60
|
+
def wrapper(*args, **kwargs):
|
|
61
|
+
return view_func(*args, **kwargs)
|
|
62
|
+
|
|
63
|
+
# Determine permission classes
|
|
64
|
+
if force_auth is True:
|
|
65
|
+
permission_cls = [IsAuthenticated]
|
|
66
|
+
logger.info(f"View {view_func.__name__} - forced authentication required")
|
|
67
|
+
elif force_auth is False:
|
|
68
|
+
permission_cls = [AllowAny]
|
|
69
|
+
logger.info(f"View {view_func.__name__} - forced public access")
|
|
70
|
+
else:
|
|
71
|
+
permission_cls = DynamicAuthPermission.get_permission_classes()
|
|
72
|
+
logger.info(
|
|
73
|
+
f"View {view_func.__name__} - dynamic permissions: {permission_cls}"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Apply the permission classes decorator
|
|
77
|
+
return drf_permission_classes(permission_cls)(wrapper)
|
|
78
|
+
|
|
79
|
+
return decorator
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def get_auth_required():
|
|
83
|
+
"""
|
|
84
|
+
Simple function to check if authentication is required in current environment.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
bool: True if authentication is required, False otherwise
|
|
88
|
+
"""
|
|
89
|
+
return not getattr(settings, "DEBUG", False)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def is_debug_mode():
|
|
93
|
+
"""
|
|
94
|
+
Robustly determine if debug mode is enabled, checking both Django settings and environment variable.
|
|
95
|
+
Also treats active pytest sessions as debug to simplify API tests.
|
|
96
|
+
"""
|
|
97
|
+
truthy = {"1", "true", "yes", "on"}
|
|
98
|
+
env_debug = str(os.environ.get("DJANGO_DEBUG", "false")).lower() in truthy
|
|
99
|
+
settings_debug = bool(getattr(settings, "DEBUG", False))
|
|
100
|
+
pytest_active = "PYTEST_CURRENT_TEST" in os.environ
|
|
101
|
+
result = settings_debug or env_debug or pytest_active
|
|
102
|
+
logger.info(
|
|
103
|
+
f"is_debug_mode: env={env_debug}, settings={settings_debug}, pytest={pytest_active}, result={result}"
|
|
104
|
+
)
|
|
105
|
+
return result
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# Compute default permission classes each call to avoid stale values during tests
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def get_debug_permissions():
|
|
112
|
+
return [AllowAny] if is_debug_mode() else [IsAuthenticated]
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# Export a name for convenience, but prefer calling get_debug_permissions() in views
|
|
116
|
+
DEBUG_PERMISSIONS = get_debug_permissions()
|
|
117
|
+
ALWAYS_AUTH_PERMISSIONS = [IsAuthenticated]
|
|
118
|
+
ALWAYS_PUBLIC_PERMISSIONS = [AllowAny]
|
|
119
|
+
|
|
120
|
+
# Log the current permission mode
|
|
121
|
+
if is_debug_mode():
|
|
122
|
+
logger.info("🔓 Authentication disabled for DEBUG mode (robust check)")
|
|
123
|
+
else:
|
|
124
|
+
logger.info("🔒 Authentication required for production mode (robust check)")
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class EnvironmentAwarePermission(BasePermission):
|
|
128
|
+
"""
|
|
129
|
+
Custom permission class that can be used directly in DRF views.
|
|
130
|
+
Honors both Django settings.DEBUG and DJANGO_DEBUG env var.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
def has_permission(self, request, view):
|
|
134
|
+
"""
|
|
135
|
+
Check if the request has permission.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
request: The Django request object
|
|
139
|
+
view: The DRF view
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
bool: True if permission granted, False otherwise
|
|
143
|
+
"""
|
|
144
|
+
if is_debug_mode():
|
|
145
|
+
logger.debug(f"DEBUG mode - granting access to {view.__class__.__name__}")
|
|
146
|
+
return True
|
|
147
|
+
# In production, require authentication
|
|
148
|
+
is_authenticated = bool(
|
|
149
|
+
getattr(request, "user", None) and request.user.is_authenticated
|
|
150
|
+
)
|
|
151
|
+
logger.debug(
|
|
152
|
+
f"Production mode - authentication check for {view.__class__.__name__}: {is_authenticated}"
|
|
153
|
+
)
|
|
154
|
+
return is_authenticated
|
|
155
|
+
|
|
156
|
+
def has_object_permission(self, request, view, obj):
|
|
157
|
+
"""
|
|
158
|
+
Object-level permission check.
|
|
159
|
+
"""
|
|
160
|
+
return self.has_permission(request, view)
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# Pipeline Documentation for `process_video_dir.py`
|
|
2
|
+
|
|
3
|
+
**File Path:** `endoreg_db/utils/pipelines/process_video_dir.py`
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
> This document outlines the multi-stage video processing pipeline implemented in the `process_video_dir.py` module, covering registration, validation, anonymization, and final state outcomes.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## 0. Start: Registering a New Video (before any pipeline)
|
|
12
|
+
|
|
13
|
+
- A new `VideoFile` record is created to register the video file.
|
|
14
|
+
- Linked to a `Center` and an `EndoscopyProcessor`.
|
|
15
|
+
- A `VideoMeta` object is created (or updated) by reading the technical information from the raw video (e.g., **fps**, **resolution**, **frame count**, **duration**).
|
|
16
|
+
- `Frame` objects are initialized in the database — one for each expected frame, but they are not yet extracted.
|
|
17
|
+
- A `VideoState` object is created to track the processing progress for this video.
|
|
18
|
+
- **No frames are extracted yet. No sensitive information or AI predictions exist yet.**
|
|
19
|
+
### Tables Involved
|
|
20
|
+
|
|
21
|
+
| Table Name |
|
|
22
|
+
|--------------|
|
|
23
|
+
| VideoFile |
|
|
24
|
+
| VideoMeta |
|
|
25
|
+
| Frame |
|
|
26
|
+
| VideoState |
|
|
27
|
+
|
|
28
|
+
## Pipeline 1 Steps
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
### Step 1: Ensure VideoState Exists (`_pipe_1_step_ensure_state`)
|
|
33
|
+
- Ensures a tracking object (`VideoState`) exists for this video.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
### Step 2: Update or Create VideoMeta (`_pipe_1_step_update_meta`)
|
|
38
|
+
- Extract technical metadata from the raw file.
|
|
39
|
+
- Update or create the `VideoMeta` object.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
### Step 3: Extract Frames (`_pipe_1_step_extract_frames`)
|
|
44
|
+
- Using `ffmpeg`, the raw video is split into frames.
|
|
45
|
+
- Frames are saved to disk.
|
|
46
|
+
- `Frame` database entries are updated: `is_extracted=True`.
|
|
47
|
+
- `VideoState.frames_extracted` is set to `True`.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### Step 4: Extract Text (OCR) (`_pipe_1_step_extract_text`)
|
|
52
|
+
- A random sample of frames is passed through OCR.
|
|
53
|
+
- Text such as **Patient Name**, **Date of Birth (DOB)**, **IDs** is extracted.
|
|
54
|
+
- A `SensitiveMeta` object is created and filled with this information.
|
|
55
|
+
- `VideoState.text_meta_extracted` is set to `True`.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### Step 5: Predict Labels (AI Prediction) (`_pipe_1_step_predict`)
|
|
60
|
+
- An AI model is run on frames to predict medical labels (e.g., **polyp**, **normal**, **outside**).
|
|
61
|
+
- Smoothed predictions are generated over frames.
|
|
62
|
+
- A `VideoPredictionMeta` is created to store AI model info and predictions.
|
|
63
|
+
- `VideoState.initial_prediction_completed` is set to `True`.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
### Step 6: Create Label Segments (`_pipe_1_step_create_segments`)
|
|
68
|
+
- Predictions are converted into labeled segments (`LabelVideoSegment`).
|
|
69
|
+
- Each segment is linked to frame ranges and specific labels.
|
|
70
|
+
- A `LabelVideoSegmentState` is created for each segment to track validation.
|
|
71
|
+
- `VideoState.lvs_created` is set to `True`.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
## End of PIPE 1
|
|
75
|
+
|
|
76
|
+
At this point in the pipeline:
|
|
77
|
+
|
|
78
|
+
- Frames are **extracted** and **saved**.
|
|
79
|
+
- OCR **text is extracted** and **stored**.
|
|
80
|
+
- AI **predictions are made**.
|
|
81
|
+
- **Label segments are created** based on predictions.
|
|
82
|
+
- **Sensitive information** (e.g. patient identifiers) is stored.
|
|
83
|
+
- `VideoState` is updated to reflect all completed steps.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
### Tables Involved
|
|
88
|
+
|
|
89
|
+
| Table Name |
|
|
90
|
+
|--------------------------|
|
|
91
|
+
| `VideoFile` |
|
|
92
|
+
| `VideoMeta` |
|
|
93
|
+
| `Frame` |
|
|
94
|
+
| `VideoState` |
|
|
95
|
+
| `SensitiveMeta` |
|
|
96
|
+
| `VideoPredictionMeta` |
|
|
97
|
+
| `LabelVideoSegment` |
|
|
98
|
+
| `LabelVideoSegmentState` |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
## 2. VALIDATION Phase: Review and Approval
|
|
102
|
+
|
|
103
|
+
**Goal:** Confirm that automated results are correct before anonymization.
|
|
104
|
+
|
|
105
|
+
### Steps
|
|
106
|
+
|
|
107
|
+
- A human reviewer (or automated test) opens each `LabelVideoSegment` and reviews it.
|
|
108
|
+
- Each segment’s state is updated:
|
|
109
|
+
`LabelVideoSegmentState.is_validated = True`
|
|
110
|
+
- The extracted sensitive metadata (e.g., names, DOB) in `SensitiveMeta` is reviewed.
|
|
111
|
+
- Sensitive metadata state fields are set:
|
|
112
|
+
`dob_verified = True`
|
|
113
|
+
`names_verified = True`
|
|
114
|
+
- If **any** of these validations fail, processing **must stop** and be corrected.
|
|
115
|
+
- **Only** when **all** validations are successfully marked, the video is allowed to proceed to **PIPE 2**.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
### Tables Involved
|
|
120
|
+
|
|
121
|
+
| Table Name |
|
|
122
|
+
|--------------------------|
|
|
123
|
+
| `LabelVideoSegmentState` |
|
|
124
|
+
| `SensitiveMeta` |
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
## 3. PIPELINE 2: Anonymization and Cleanup
|
|
128
|
+
|
|
129
|
+
**Goal:** Prepare a safe, anonymized version of the video.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### Pipeline 2 Major Steps
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
#### Step 1: Ensure VideoState Exists Again (`_pipe_2_step_ensure_state`)
|
|
138
|
+
- Confirm that the `VideoState` tracking object is still present.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
#### Step 2: Ensure Frames Available (`_pipe_2_step_extract_frames`)
|
|
143
|
+
- Check if extracted frames are available.
|
|
144
|
+
- If frames were deleted or are missing, **re-extract** them from the raw video file.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
#### Step 3: Anonymize Video (`_pipe_2_step_anonymize`)
|
|
149
|
+
- Frames labeled as `"outside"` are blacked out.
|
|
150
|
+
- Remaining frames are masked using **endoscopy ROI** (Region of Interest).
|
|
151
|
+
- New anonymized frames are created and saved temporarily.
|
|
152
|
+
- A new anonymized video is assembled from these frames.
|
|
153
|
+
- New video file path is saved in:
|
|
154
|
+
`VideoFile.processed_file`
|
|
155
|
+
- Video hash is calculated and saved in:
|
|
156
|
+
`VideoFile.processed_video_hash`
|
|
157
|
+
- `VideoState.state.anonymization_status.mark_anonymized()`
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
#### Step 4: Delete Raw Files and Frames
|
|
162
|
+
- Raw video file and extracted frames are **permanently deleted**.
|
|
163
|
+
- `VideoState.frames_extracted = False`
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
#### Step 5: Delete SensitiveMeta (`_pipe_2_step_delete_sensitive_meta`)
|
|
168
|
+
- The `SensitiveMeta` object is deleted from the database.
|
|
169
|
+
- `VideoFile.sensitive_meta = None`
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
### At the End of PIPE 2:
|
|
174
|
+
|
|
175
|
+
- Only the **anonymized processed video** remains.
|
|
176
|
+
- **All sensitive data** and **raw video/frames** are permanently deleted.
|
|
177
|
+
- **Technical metadata** and **AI prediction audit data** are retained.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
### Tables Involved
|
|
182
|
+
|
|
183
|
+
| Table Name | Notes |
|
|
184
|
+
|------------------|----------------------------------|
|
|
185
|
+
| `VideoFile` | Updated with processed file info |
|
|
186
|
+
| `Frame` | Frames used, then deleted |
|
|
187
|
+
| `VideoState` | Tracks anonymization status |
|
|
188
|
+
| `SensitiveMeta` | **Deleted after anonymization** |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
## 4. FINAL STATE
|
|
192
|
+
|
|
193
|
+
### Database Contains:
|
|
194
|
+
|
|
195
|
+
- The **processed, safe, anonymized video**:
|
|
196
|
+
`VideoFile.processed_file`
|
|
197
|
+
- **Technical information** about the video:
|
|
198
|
+
`VideoMeta`
|
|
199
|
+
- **Medical label segments** for audit:
|
|
200
|
+
`LabelVideoSegment` and `LabelVideoSegmentState`
|
|
201
|
+
- **AI prediction information** for audit:
|
|
202
|
+
`VideoPredictionMeta`
|
|
203
|
+
- **Sensitive patient information** has been **permanently deleted**
|
|
204
|
+
- **Raw extracted frames** and the **original raw video file** have been **permanently deleted**
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### `VideoState` Summary:
|
|
209
|
+
|
|
210
|
+
- `frames_extracted = False` *(raw frames are gone)*
|
|
211
|
+
- `anonymized = True` *(anonymized video is ready)*
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
### Tables Overview
|
|
216
|
+
|
|
217
|
+
| Table Name | Purpose |
|
|
218
|
+
|--------------------------|-------------------------------------------------------------------------|
|
|
219
|
+
| `VideoFile` | Main entry linking video paths, processed file, and metadata references |
|
|
220
|
+
| `VideoMeta` | Technical information (fps, duration, frame count, etc.) |
|
|
221
|
+
| `Frame` | Individual frame images from the video *(deleted in PIPE 2)* |
|
|
222
|
+
| `VideoState` | Tracks pipeline processing steps and their completion |
|
|
223
|
+
| `SensitiveMeta` | Patient-sensitive data from OCR *(deleted in PIPE 2)* |
|
|
224
|
+
| `VideoPredictionMeta` | Information about the AI model and predictions |
|
|
225
|
+
| `LabelVideoSegment` | Video segments created from AI predictions |
|
|
226
|
+
| `LabelVideoSegmentState` | Tracks human validation status for each segment |
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
### Note: on Frame Deletion and Data Integrity
|
|
230
|
+
|
|
231
|
+
Although the frames are permanently deleted after the entire execution of Pipeline 1 and Pipeline 2, the necessary data and information about these frames are still populated in the database. Therefore, a script is required to utilize the correct imported data and **re-extract potential frames** from the original video.
|
|
232
|
+
|
|
233
|
+
This process ensures that the required frame data can be retrieved and used even after deletion.
|
|
234
|
+
|
|
235
|
+
|
|
File without changes
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from django.core.management import call_command
|
|
5
|
+
from icecream import ic
|
|
6
|
+
from tqdm import tqdm
|
|
7
|
+
from endoreg_db.utils.file_operations import sha256_file
|
|
8
|
+
from endoreg_db.models import (
|
|
9
|
+
AiModel,
|
|
10
|
+
LabelVideoSegment,
|
|
11
|
+
ModelMeta,
|
|
12
|
+
VideoFile,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
# Usage
|
|
17
|
+
# from endoreg_db.utils.pipelines.process_video_dir import process_video_dir
|
|
18
|
+
# (video_dir=Path("/path/to/your/videos"))
|
|
19
|
+
|
|
20
|
+
# DEFAULT_DIR = Path(__file__).resolve().parent.parent.parent.parent / "data/raw_videos"
|
|
21
|
+
DEFAULT_DIR = Path(__file__).resolve().parent.parent.parent.parent / "data/study_data"
|
|
22
|
+
CENTER_NAME = os.environ.get("CENTER_NAME", "university_hospital_wuerzburg")
|
|
23
|
+
ENDOSCOPY_PROCESSOR_NAME = os.environ.get("ENDOSCOPY_PROCESSOR_NAME", "olympus_cv_1500")
|
|
24
|
+
MODEL_NAME = "image_multilabel_classification_colonoscopy_default"
|
|
25
|
+
MODEL_WEIGHTS_PATH = "./tests/assets/colo_segmentation_RegNetX800MF_6.safetensors"
|
|
26
|
+
ic(DEFAULT_DIR)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def process_video_dir(
|
|
30
|
+
video_dir: Path = DEFAULT_DIR,
|
|
31
|
+
center_name: str = CENTER_NAME,
|
|
32
|
+
endoscopy_processor_name: str = ENDOSCOPY_PROCESSOR_NAME,
|
|
33
|
+
):
|
|
34
|
+
"""
|
|
35
|
+
Process a directory of video files and create VideoFile objects in the database.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
video_dir (Path): Path to the directory containing video files.
|
|
39
|
+
center_name (str): Name of the center to associate with the video files.
|
|
40
|
+
endoscopy_processor_name (str): Name of the endoscopy processor to associate with the video files.
|
|
41
|
+
"""
|
|
42
|
+
# Make sure the ai model exists:
|
|
43
|
+
ai_model = AiModel.objects.filter(name=MODEL_NAME)
|
|
44
|
+
if ai_model:
|
|
45
|
+
ai_model = ai_model.first()
|
|
46
|
+
try:
|
|
47
|
+
model_meta = ai_model.get_latest_version()
|
|
48
|
+
assert isinstance(model_meta, ModelMeta), "No ModelMeta found in the database."
|
|
49
|
+
except Exception:
|
|
50
|
+
logger.warning(f"ModelMeta not found for {MODEL_NAME}. Creating a new one.")
|
|
51
|
+
# Create a new ModelMeta instance
|
|
52
|
+
call_command(
|
|
53
|
+
"create_multilabel_model_meta",
|
|
54
|
+
"--model_path",
|
|
55
|
+
MODEL_WEIGHTS_PATH,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# Get the center and endoscopy processor objects
|
|
59
|
+
|
|
60
|
+
# Iterate through all files in the directory
|
|
61
|
+
for file_path in tqdm(video_dir.iterdir()):
|
|
62
|
+
logger.info(f"Processing file: {file_path}")
|
|
63
|
+
if file_path.is_file() and file_path.suffix in [".mp4", ".avi", ".mov"]:
|
|
64
|
+
# Create a VideoFile object
|
|
65
|
+
video_file = VideoFile.create_from_file_initialized(
|
|
66
|
+
file_path=file_path,
|
|
67
|
+
center_name=center_name,
|
|
68
|
+
processor_name=endoscopy_processor_name,
|
|
69
|
+
video_hash=sha256_file(file_path),
|
|
70
|
+
)
|
|
71
|
+
logger.warning(f"Processing video file: {video_file}")
|
|
72
|
+
try:
|
|
73
|
+
success_pipe_1 = video_file.pipe_1(
|
|
74
|
+
model_name=MODEL_NAME,
|
|
75
|
+
)
|
|
76
|
+
assert success_pipe_1, (
|
|
77
|
+
f"Pipe 1 failed for video {video_file.video_hash}"
|
|
78
|
+
)
|
|
79
|
+
except Exception as e:
|
|
80
|
+
logger.error(
|
|
81
|
+
f"Pipe 1 failed for video {video_file.video_hash}: {e}",
|
|
82
|
+
exc_info=True,
|
|
83
|
+
)
|
|
84
|
+
raise e
|
|
85
|
+
|
|
86
|
+
video_file.refresh_from_db()
|
|
87
|
+
|
|
88
|
+
####### SIMULATION OF VALIDATION #######
|
|
89
|
+
# Simulate the validation process for video segments
|
|
90
|
+
outside_segments = video_file.get_outside_segments()
|
|
91
|
+
logger.warning(f"Outside segments found for simulation: {outside_segments}")
|
|
92
|
+
if outside_segments:
|
|
93
|
+
for segment in outside_segments:
|
|
94
|
+
try:
|
|
95
|
+
seg_state = segment.state
|
|
96
|
+
seg_state.is_validated = True
|
|
97
|
+
seg_state.save()
|
|
98
|
+
logger.info(f"Simulated validation for segment {segment.id}")
|
|
99
|
+
except LabelVideoSegment.state.RelatedObjectDoesNotExist:
|
|
100
|
+
logger.warning(
|
|
101
|
+
f"Cannot simulate validation for segment {segment.id}: Related state object does not exist."
|
|
102
|
+
)
|
|
103
|
+
except Exception as e:
|
|
104
|
+
logger.error(
|
|
105
|
+
f"Error during segment state simulation for segment {segment.id}: {e}",
|
|
106
|
+
exc_info=True,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Simulate the validation process for the video files sensitive meta obj
|
|
110
|
+
if video_file.sensitive_meta:
|
|
111
|
+
try:
|
|
112
|
+
sm_state = video_file.sensitive_meta.state
|
|
113
|
+
sm_state.dob_verified = True
|
|
114
|
+
sm_state.names_verified = True
|
|
115
|
+
sm_state.save()
|
|
116
|
+
logger.info(
|
|
117
|
+
f"Simulated validation for sensitive meta of video {video_file.video_hash}"
|
|
118
|
+
)
|
|
119
|
+
except Exception as e:
|
|
120
|
+
logger.error(
|
|
121
|
+
f"Error during sensitive meta state simulation for video {video_file.video_hash}: {e}",
|
|
122
|
+
exc_info=True,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
else:
|
|
126
|
+
logger.warning(
|
|
127
|
+
f"Cannot simulate validation for sensitive meta of video {video_file.video_hash}: SensitiveMeta object does not exist (likely due to pipe_1 failure or incomplete text extraction)."
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
######## SIMULATION OF VALIDATION ########
|
|
131
|
+
|
|
132
|
+
video_file.refresh_from_db()
|
|
133
|
+
if success_pipe_1:
|
|
134
|
+
try:
|
|
135
|
+
video_file.pipe_2()
|
|
136
|
+
except Exception as e:
|
|
137
|
+
logger.error(
|
|
138
|
+
f"Pipe 2 failed for video {video_file.video_hash}: {e}",
|
|
139
|
+
exc_info=True,
|
|
140
|
+
)
|
|
141
|
+
else:
|
|
142
|
+
logger.warning(
|
|
143
|
+
f"Skipping Pipe 2 for video {video_file.video_hash} because Pipe 1 did not complete successfully."
|
|
144
|
+
)
|
|
File without changes
|