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,280 @@
|
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
from django.apps import apps
|
|
3
|
+
from django.db.models import Min, Max, Count, fields
|
|
4
|
+
from django.utils.timezone import is_aware, make_naive
|
|
5
|
+
import datetime
|
|
6
|
+
import os
|
|
7
|
+
from openpyxl import Workbook
|
|
8
|
+
import csv
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Command(BaseCommand):
|
|
12
|
+
help = "Generates a structured report summarizing the database content of custom endoreg_db models and saves it to Excel and CSV files, excluding models with zero records from the files." # Updated help text
|
|
13
|
+
|
|
14
|
+
def handle(self, *args, **options):
|
|
15
|
+
"""
|
|
16
|
+
Generates a summary report of all models in the 'endoreg_db' app and exports the results to Excel and CSV files.
|
|
17
|
+
|
|
18
|
+
For each model, counts the total number of records and includes only models with at least one record in the output files. For models with records, attempts to display the range of values for common date or datetime fields and provides value counts for up to three categorical or ForeignKey fields, using heuristics based on field type and name. Handles missing app configuration, file saving errors, and aggregation exceptions gracefully, outputting progress and warnings to the console. Creates a 'data' directory within the app if it does not exist and saves the reports there.
|
|
19
|
+
"""
|
|
20
|
+
self.stdout.write(
|
|
21
|
+
self.style.SUCCESS(
|
|
22
|
+
"Starting database content summarization for endoreg_db models..."
|
|
23
|
+
)
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
app_config = apps.get_app_config("endoreg_db")
|
|
28
|
+
except LookupError:
|
|
29
|
+
self.stdout.write(
|
|
30
|
+
self.style.ERROR(
|
|
31
|
+
"Could not find the 'endoreg_db' app. Make sure it's correctly installed and configured."
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
data_dir = os.path.join(app_config.path, "data")
|
|
37
|
+
if not os.path.exists(data_dir):
|
|
38
|
+
os.makedirs(data_dir)
|
|
39
|
+
self.stdout.write(self.style.SUCCESS(f"Created directory: {data_dir}"))
|
|
40
|
+
|
|
41
|
+
excel_file_path = os.path.join(data_dir, "db_summary.xlsx")
|
|
42
|
+
csv_file_path = os.path.join(data_dir, "db_summary.csv")
|
|
43
|
+
|
|
44
|
+
# --- Excel Setup ---
|
|
45
|
+
wb = Workbook()
|
|
46
|
+
ws = wb.active
|
|
47
|
+
ws.title = "DB Summary"
|
|
48
|
+
excel_headers = ["Model Name", "Total Records"]
|
|
49
|
+
ws.append(excel_headers)
|
|
50
|
+
# --- End Excel Setup ---
|
|
51
|
+
|
|
52
|
+
# --- CSV Setup ---
|
|
53
|
+
csv_data_for_file = [
|
|
54
|
+
excel_headers
|
|
55
|
+
] # Initialize with headers for CSV, will only store rows with count > 0
|
|
56
|
+
# --- End CSV Setup ---
|
|
57
|
+
|
|
58
|
+
models = app_config.get_models()
|
|
59
|
+
|
|
60
|
+
if not models:
|
|
61
|
+
self.stdout.write(
|
|
62
|
+
self.style.WARNING("No models found in the 'endoreg_db' app.")
|
|
63
|
+
)
|
|
64
|
+
try:
|
|
65
|
+
wb.save(excel_file_path) # wb will only have headers
|
|
66
|
+
self.stdout.write(
|
|
67
|
+
self.style.SUCCESS(
|
|
68
|
+
f"Empty summary report saved to {excel_file_path}"
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
with open(csv_file_path, "w", newline="") as f:
|
|
72
|
+
writer = csv.writer(f)
|
|
73
|
+
writer.writerows(
|
|
74
|
+
csv_data_for_file
|
|
75
|
+
) # csv_data_for_file will only contain headers
|
|
76
|
+
self.stdout.write(
|
|
77
|
+
self.style.SUCCESS(f"Empty summary report saved to {csv_file_path}")
|
|
78
|
+
)
|
|
79
|
+
except Exception as e:
|
|
80
|
+
self.stdout.write(self.style.ERROR(f"Error saving files: {e}"))
|
|
81
|
+
return
|
|
82
|
+
|
|
83
|
+
for model in models:
|
|
84
|
+
model_name = model.__name__
|
|
85
|
+
self.stdout.write(self.style.HTTP_INFO(f"\n--- Model: {model_name} ---"))
|
|
86
|
+
|
|
87
|
+
try:
|
|
88
|
+
count = model.objects.count()
|
|
89
|
+
self.stdout.write(f" Total records: {count}")
|
|
90
|
+
|
|
91
|
+
if count == 0:
|
|
92
|
+
self.stdout.write(
|
|
93
|
+
self.style.NOTICE(
|
|
94
|
+
" No records found for this model. Skipping from file output."
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
continue # Skip further processing for this model if count is 0 for file output
|
|
98
|
+
|
|
99
|
+
# --- Add to Excel (only if count > 0) ---
|
|
100
|
+
ws.append([model_name, count])
|
|
101
|
+
# --- End Add to Excel ---
|
|
102
|
+
|
|
103
|
+
# --- Add to CSV data list (only if count > 0) ---
|
|
104
|
+
csv_data_for_file.append([model_name, count])
|
|
105
|
+
# --- End Add to CSV data list ---
|
|
106
|
+
|
|
107
|
+
# Attempt to get date ranges for common date/datetime fields
|
|
108
|
+
date_fields_to_check = [
|
|
109
|
+
"created_at",
|
|
110
|
+
"updated_at",
|
|
111
|
+
"timestamp",
|
|
112
|
+
"date",
|
|
113
|
+
"start_time",
|
|
114
|
+
"end_time",
|
|
115
|
+
"examination_date",
|
|
116
|
+
"birth_date",
|
|
117
|
+
"record_date",
|
|
118
|
+
]
|
|
119
|
+
processed_date_field = False
|
|
120
|
+
for field_obj in model._meta.get_fields():
|
|
121
|
+
if field_obj.name in date_fields_to_check and isinstance(
|
|
122
|
+
field_obj, (fields.DateField, fields.DateTimeField)
|
|
123
|
+
):
|
|
124
|
+
try:
|
|
125
|
+
aggregation = model.objects.aggregate(
|
|
126
|
+
min_date=Min(field_obj.name),
|
|
127
|
+
max_date=Max(field_obj.name),
|
|
128
|
+
)
|
|
129
|
+
min_val = aggregation.get("min_date")
|
|
130
|
+
max_val = aggregation.get("max_date")
|
|
131
|
+
|
|
132
|
+
if min_val is not None and max_val is not None:
|
|
133
|
+
if isinstance(min_val, datetime.datetime) and is_aware(
|
|
134
|
+
min_val
|
|
135
|
+
):
|
|
136
|
+
min_val = make_naive(min_val).strftime(
|
|
137
|
+
"%Y-%m-%d %H:%M:%S"
|
|
138
|
+
)
|
|
139
|
+
elif isinstance(min_val, datetime.date):
|
|
140
|
+
min_val = min_val.strftime("%Y-%m-%d")
|
|
141
|
+
|
|
142
|
+
if isinstance(max_val, datetime.datetime) and is_aware(
|
|
143
|
+
max_val
|
|
144
|
+
):
|
|
145
|
+
max_val = make_naive(max_val).strftime(
|
|
146
|
+
"%Y-%m-%d %H:%M:%S"
|
|
147
|
+
)
|
|
148
|
+
elif isinstance(max_val, datetime.date):
|
|
149
|
+
max_val = max_val.strftime("%Y-%m-%d")
|
|
150
|
+
|
|
151
|
+
self.stdout.write(
|
|
152
|
+
f" {field_obj.verbose_name.capitalize()} range: {min_val} to {max_val}"
|
|
153
|
+
)
|
|
154
|
+
processed_date_field = True
|
|
155
|
+
break # Process only the first found relevant date field for brevity
|
|
156
|
+
except Exception as e:
|
|
157
|
+
self.stdout.write(
|
|
158
|
+
self.style.WARNING(
|
|
159
|
+
f" Could not aggregate date range for '{field_obj.name}': {e}"
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# Attempt to get value counts for potential categorical/ForeignKey fields
|
|
164
|
+
categorical_fields_found = 0
|
|
165
|
+
MAX_CATEGORICAL_FIELDS_TO_ANALYZE = 3
|
|
166
|
+
MAX_DISTINCT_VALUES_TO_SHOW = 5
|
|
167
|
+
|
|
168
|
+
for field in model._meta.get_fields():
|
|
169
|
+
if categorical_fields_found >= MAX_CATEGORICAL_FIELDS_TO_ANALYZE:
|
|
170
|
+
break
|
|
171
|
+
|
|
172
|
+
is_potential_categorical = False
|
|
173
|
+
field_name_lower = field.name.lower()
|
|
174
|
+
|
|
175
|
+
if (
|
|
176
|
+
field.many_to_one or field.one_to_one
|
|
177
|
+
): # ForeignKey or OneToOneField
|
|
178
|
+
if field.related_model:
|
|
179
|
+
is_potential_categorical = True
|
|
180
|
+
elif isinstance(
|
|
181
|
+
field,
|
|
182
|
+
(
|
|
183
|
+
fields.CharField,
|
|
184
|
+
fields.IntegerField,
|
|
185
|
+
fields.BooleanField,
|
|
186
|
+
fields.TextField,
|
|
187
|
+
),
|
|
188
|
+
):
|
|
189
|
+
# Heuristic for common categorical fields by name or type
|
|
190
|
+
if (
|
|
191
|
+
"type" in field_name_lower
|
|
192
|
+
or "status" in field_name_lower
|
|
193
|
+
or "gender" in field_name_lower
|
|
194
|
+
or "category" in field_name_lower
|
|
195
|
+
or isinstance(field, fields.BooleanField)
|
|
196
|
+
):
|
|
197
|
+
is_potential_categorical = True
|
|
198
|
+
# For CharField/TextField, also consider if it has few distinct values (expensive to check upfront for all)
|
|
199
|
+
# We'll rely on the naming heuristic primarily or if it's a boolean.
|
|
200
|
+
|
|
201
|
+
if is_potential_categorical:
|
|
202
|
+
try:
|
|
203
|
+
self.stdout.write(
|
|
204
|
+
f" Value counts for '{field.verbose_name.capitalize() if hasattr(field, 'verbose_name') else field.name}':"
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
# QuerySet for distinct values and their counts
|
|
208
|
+
values_qs = (
|
|
209
|
+
model.objects.values(field.name)
|
|
210
|
+
.annotate(count=Count(field.name))
|
|
211
|
+
.order_by("-count")
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
distinct_values_count = values_qs.count()
|
|
215
|
+
|
|
216
|
+
if distinct_values_count == 0:
|
|
217
|
+
self.stdout.write(
|
|
218
|
+
" No distinct values found or field is often NULL."
|
|
219
|
+
)
|
|
220
|
+
continue
|
|
221
|
+
|
|
222
|
+
for i, item in enumerate(values_qs):
|
|
223
|
+
if i >= MAX_DISTINCT_VALUES_TO_SHOW:
|
|
224
|
+
self.stdout.write(
|
|
225
|
+
f" ... and {distinct_values_count - MAX_DISTINCT_VALUES_TO_SHOW} more distinct values."
|
|
226
|
+
)
|
|
227
|
+
break
|
|
228
|
+
val = item[field.name]
|
|
229
|
+
val_display = (
|
|
230
|
+
str(val) if val is not None else "None/NULL"
|
|
231
|
+
)
|
|
232
|
+
# Truncate long string values for display
|
|
233
|
+
if isinstance(val, str) and len(val_display) > 50:
|
|
234
|
+
val_display = val_display[:47] + "..."
|
|
235
|
+
self.stdout.write(
|
|
236
|
+
f" - {val_display}: {item['count']}"
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
categorical_fields_found += 1
|
|
240
|
+
|
|
241
|
+
except Exception as e:
|
|
242
|
+
# Some fields (like generic relations or complex custom fields) might not support this directly
|
|
243
|
+
self.stdout.write(
|
|
244
|
+
self.style.WARNING(
|
|
245
|
+
f" Could not get value counts for '{field.name}': {e}"
|
|
246
|
+
)
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
except Exception as e:
|
|
250
|
+
self.stdout.write(
|
|
251
|
+
self.style.ERROR(f" Error processing model {model_name}: {e}")
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
# --- Save Excel File ---
|
|
255
|
+
try:
|
|
256
|
+
wb.save(excel_file_path)
|
|
257
|
+
self.stdout.write(
|
|
258
|
+
self.style.SUCCESS(
|
|
259
|
+
f"\nDatabase summary report saved to {excel_file_path}"
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
except Exception as e:
|
|
263
|
+
self.stdout.write(self.style.ERROR(f"\nError saving Excel file: {e}"))
|
|
264
|
+
# --- End Save Excel File ---
|
|
265
|
+
|
|
266
|
+
# --- Save CSV File ---
|
|
267
|
+
try:
|
|
268
|
+
with open(csv_file_path, "w", newline="") as f:
|
|
269
|
+
writer = csv.writer(f)
|
|
270
|
+
writer.writerows(csv_data_for_file)
|
|
271
|
+
self.stdout.write(
|
|
272
|
+
self.style.SUCCESS(f"Database summary report saved to {csv_file_path}")
|
|
273
|
+
)
|
|
274
|
+
except Exception as e:
|
|
275
|
+
self.stdout.write(self.style.ERROR(f"Error saving CSV file: {e}"))
|
|
276
|
+
# --- End Save CSV File ---
|
|
277
|
+
|
|
278
|
+
self.stdout.write(
|
|
279
|
+
self.style.SUCCESS("\nDatabase content summarization finished.")
|
|
280
|
+
)
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# endoreg_db/management/commands/train_image_multilabel_model.py
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from django.core.management.base import BaseCommand, CommandError
|
|
6
|
+
|
|
7
|
+
from endoreg_db.models import AIDataSet
|
|
8
|
+
from endoreg_db.utils.ai.data_loader_for_model_training import (
|
|
9
|
+
build_dataset_for_training,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Command(BaseCommand):
|
|
14
|
+
help = (
|
|
15
|
+
"Train / fine-tune the image multi-label model on a given AIDataSet.\n"
|
|
16
|
+
"\n"
|
|
17
|
+
"This command is fully dynamic:\n"
|
|
18
|
+
"- It uses the AIDataSet row (id) to decide which annotations to use.\n"
|
|
19
|
+
"- It *infers* the LabelSet from the labels in those annotations.\n"
|
|
20
|
+
"- It builds image_paths, label_vectors, and label_masks for training.\n"
|
|
21
|
+
"- It prints detailed debug information about the chosen LabelSet and samples.\n"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def add_arguments(self, parser):
|
|
25
|
+
parser.add_argument(
|
|
26
|
+
"--dataset-id",
|
|
27
|
+
type=int,
|
|
28
|
+
required=True,
|
|
29
|
+
help="Primary key of the AIDataSet to use for training.",
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
def handle(self, *args, **options):
|
|
33
|
+
dataset_id = options["dataset_id"]
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
dataset = AIDataSet.objects.get(id=dataset_id)
|
|
37
|
+
except AIDataSet.DoesNotExist:
|
|
38
|
+
raise CommandError(f"AIDataSet with id={dataset_id} does not exist.")
|
|
39
|
+
|
|
40
|
+
# ------------------------------------------------------------------
|
|
41
|
+
# Basic dataset info (AIDataSet row)
|
|
42
|
+
# ------------------------------------------------------------------
|
|
43
|
+
self.stdout.write(
|
|
44
|
+
self.style.NOTICE(
|
|
45
|
+
f"Using AIDataSet id={dataset.id}, "
|
|
46
|
+
f"name={dataset.name!r}, "
|
|
47
|
+
f"dataset_type={dataset.dataset_type!r}, "
|
|
48
|
+
f"ai_model_type={dataset.ai_model_type!r}"
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Build in-memory dataset (completely dynamic, labelset inferred automatically)
|
|
53
|
+
data = build_dataset_for_training(dataset)
|
|
54
|
+
|
|
55
|
+
image_paths = data["image_paths"]
|
|
56
|
+
label_vectors = data["label_vectors"]
|
|
57
|
+
label_masks = data["label_masks"]
|
|
58
|
+
labels = data["labels"]
|
|
59
|
+
labelset = data["labelset"]
|
|
60
|
+
|
|
61
|
+
# Optional: additional meta info, if present
|
|
62
|
+
frame_ids = data.get("frame_ids", [])
|
|
63
|
+
old_examination_ids = data.get("old_examination_ids", [])
|
|
64
|
+
|
|
65
|
+
# ------------------------------------------------------------------
|
|
66
|
+
# Debug: show which LabelSet was picked and its labels
|
|
67
|
+
# ------------------------------------------------------------------
|
|
68
|
+
self.stdout.write(self.style.NOTICE("Inferred LabelSet for this AIDataSet:"))
|
|
69
|
+
self.stdout.write(
|
|
70
|
+
f" LabelSet id={labelset.id}, "
|
|
71
|
+
f"name={labelset.name!r}, "
|
|
72
|
+
f"version={labelset.version}"
|
|
73
|
+
)
|
|
74
|
+
self.stdout.write(" Labels (index, id, name):")
|
|
75
|
+
for idx, lbl in enumerate(labels):
|
|
76
|
+
self.stdout.write(f" [{idx}] id={lbl.id}, name={lbl.name!r}")
|
|
77
|
+
|
|
78
|
+
# ------------------------------------------------------------------
|
|
79
|
+
# Summary of constructed dataset
|
|
80
|
+
# ------------------------------------------------------------------
|
|
81
|
+
self.stdout.write(
|
|
82
|
+
self.style.SUCCESS(
|
|
83
|
+
f"\nBuilt training dataset from AIDataSet id={dataset.id}:\n"
|
|
84
|
+
f"- #samples: {len(image_paths)}\n"
|
|
85
|
+
f"- #labels: {len(labels)}"
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# ------------------------------------------------------------------
|
|
90
|
+
# Debug: print each frame's path, label vector and mask
|
|
91
|
+
# NOTE: If your dataset is very large, this will spam the console.
|
|
92
|
+
# For now you want full transparency, so we print all.
|
|
93
|
+
# ------------------------------------------------------------------
|
|
94
|
+
MAX_PRINT = 50
|
|
95
|
+
self.stdout.write(self.style.NOTICE("\nPer-sample debug output:"))
|
|
96
|
+
for i, (path, vec, mask) in enumerate(
|
|
97
|
+
zip(image_paths, label_vectors, label_masks)
|
|
98
|
+
):
|
|
99
|
+
if i >= MAX_PRINT:
|
|
100
|
+
self.stdout.write(
|
|
101
|
+
self.style.WARNING(
|
|
102
|
+
f"... ({len(image_paths) - MAX_PRINT} more samples not shown)"
|
|
103
|
+
)
|
|
104
|
+
)
|
|
105
|
+
break
|
|
106
|
+
|
|
107
|
+
frame_id = frame_ids[i] if i < len(frame_ids) else None
|
|
108
|
+
old_exam = old_examination_ids[i] if i < len(old_examination_ids) else None
|
|
109
|
+
|
|
110
|
+
self.stdout.write(
|
|
111
|
+
f" Sample {i}:"
|
|
112
|
+
f"\n path = {path!r}"
|
|
113
|
+
f"\n frame_id = {frame_id}"
|
|
114
|
+
f"\n old_examination_id = {old_exam}"
|
|
115
|
+
f"\n vector (1/0/None) = {vec}"
|
|
116
|
+
f"\n mask (1=use, 0=ignore) = {mask}"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# ------------------------------------------------------------------
|
|
120
|
+
# TODO: Insert your actual training loop here
|
|
121
|
+
# ------------------------------------------------------------------
|
|
122
|
+
# Example (pseudo-code):
|
|
123
|
+
#
|
|
124
|
+
# import torch
|
|
125
|
+
# from torch.utils.data import Dataset, DataLoader
|
|
126
|
+
#
|
|
127
|
+
# class EndoDataset(Dataset):
|
|
128
|
+
# def __init__(self, image_paths, label_vectors, label_masks):
|
|
129
|
+
# ...
|
|
130
|
+
#
|
|
131
|
+
# ds = EndoDataset(image_paths, label_vectors, label_masks)
|
|
132
|
+
# loader = DataLoader(ds, batch_size=32, shuffle=True)
|
|
133
|
+
#
|
|
134
|
+
# for batch in loader:
|
|
135
|
+
# # forward, compute loss using mask, backward, step, ...
|
|
136
|
+
#
|
|
137
|
+
# ------------------------------------------------------------------
|
|
138
|
+
|
|
139
|
+
self.stdout.write(
|
|
140
|
+
self.style.SUCCESS(
|
|
141
|
+
"\nDataset construction finished. "
|
|
142
|
+
"You can now plug this into your model training code."
|
|
143
|
+
)
|
|
144
|
+
)
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django management command to validate video file existence and accessibility.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
from django.core.management.base import BaseCommand
|
|
9
|
+
|
|
10
|
+
from endoreg_db.models import VideoFile
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
# TODO Review if this is still used. Delete if not.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Command(BaseCommand):
|
|
18
|
+
help = "Validate video file existence and accessibility"
|
|
19
|
+
|
|
20
|
+
def add_arguments(self, parser):
|
|
21
|
+
parser.add_argument(
|
|
22
|
+
"--video-id",
|
|
23
|
+
type=int,
|
|
24
|
+
help="Check specific video ID",
|
|
25
|
+
)
|
|
26
|
+
parser.add_argument(
|
|
27
|
+
"--verbose",
|
|
28
|
+
action="store_true",
|
|
29
|
+
help="Enable verbose output",
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
def handle(self, *args, **options):
|
|
33
|
+
"""Validate video files and their accessibility."""
|
|
34
|
+
verbose = options["verbose"]
|
|
35
|
+
video_id = options.get("video_id")
|
|
36
|
+
fix_missing = options["fix_missing", False]
|
|
37
|
+
|
|
38
|
+
if verbose:
|
|
39
|
+
self.stdout.write(self.style.SUCCESS("Starting video validation..."))
|
|
40
|
+
|
|
41
|
+
# Query videos
|
|
42
|
+
if video_id:
|
|
43
|
+
try:
|
|
44
|
+
videos = [VideoFile.objects.get(pk=video_id)]
|
|
45
|
+
self.stdout.write(f"Checking specific video ID: {video_id}")
|
|
46
|
+
except VideoFile.DoesNotExist:
|
|
47
|
+
self.stdout.write(
|
|
48
|
+
self.style.ERROR(f"Video with ID {video_id} not found")
|
|
49
|
+
)
|
|
50
|
+
return
|
|
51
|
+
else:
|
|
52
|
+
videos = VideoFile.objects.all()
|
|
53
|
+
self.stdout.write(f"Checking {videos.count()} videos...")
|
|
54
|
+
|
|
55
|
+
missing_files = []
|
|
56
|
+
accessible_files = []
|
|
57
|
+
corrupted_files = []
|
|
58
|
+
|
|
59
|
+
for video in videos:
|
|
60
|
+
video_status = self.check_video_file(video, verbose)
|
|
61
|
+
|
|
62
|
+
if video_status["status"] == "missing":
|
|
63
|
+
missing_files.append(video_status)
|
|
64
|
+
elif video_status["status"] == "corrupted":
|
|
65
|
+
corrupted_files.append(video_status)
|
|
66
|
+
else:
|
|
67
|
+
accessible_files.append(video_status)
|
|
68
|
+
|
|
69
|
+
# Report results
|
|
70
|
+
self.stdout.write("\n" + "=" * 60)
|
|
71
|
+
self.stdout.write(self.style.SUCCESS("VALIDATION COMPLETE"))
|
|
72
|
+
self.stdout.write("=" * 60)
|
|
73
|
+
|
|
74
|
+
self.stdout.write(f"✅ Accessible videos: {len(accessible_files)}")
|
|
75
|
+
self.stdout.write(f"❌ Missing files: {len(missing_files)}")
|
|
76
|
+
self.stdout.write(f"⚠️ Potentially corrupted: {len(corrupted_files)}")
|
|
77
|
+
|
|
78
|
+
if missing_files:
|
|
79
|
+
self.stdout.write(self.style.WARNING("\nMISSING FILES:"))
|
|
80
|
+
for file_info in missing_files:
|
|
81
|
+
self.stdout.write(
|
|
82
|
+
f" - Video ID {file_info['video_id']}: {file_info['error']}"
|
|
83
|
+
)
|
|
84
|
+
if fix_missing:
|
|
85
|
+
self.stdout.write(" → Marking as inactive (if applicable)")
|
|
86
|
+
|
|
87
|
+
if corrupted_files:
|
|
88
|
+
self.stdout.write(self.style.WARNING("\nPOTENTIALLY CORRUPTED FILES:"))
|
|
89
|
+
for file_info in corrupted_files:
|
|
90
|
+
self.stdout.write(
|
|
91
|
+
f" - Video ID {file_info['video_id']}: {file_info['error']}"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
if verbose and accessible_files:
|
|
95
|
+
self.stdout.write(self.style.SUCCESS("\nACCESSIBLE FILES:"))
|
|
96
|
+
for file_info in accessible_files[:10]: # Show first 10
|
|
97
|
+
self.stdout.write(
|
|
98
|
+
f" ✅ Video ID {file_info['video_id']}: {file_info['path']} ({file_info['size_mb']:.1f} MB)"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
if len(accessible_files) > 10:
|
|
102
|
+
self.stdout.write(f" ... and {len(accessible_files) - 10} more")
|
|
103
|
+
|
|
104
|
+
def check_video_file(self, video, verbose=False):
|
|
105
|
+
"""
|
|
106
|
+
Check a single video file for existence and basic accessibility.
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
dict: Status information about the video file
|
|
110
|
+
"""
|
|
111
|
+
video_info = {
|
|
112
|
+
"video_id": video.id,
|
|
113
|
+
"video_uuid": str(video.video_hash) if hasattr(video, "uuid") else "N/A",
|
|
114
|
+
"status": "unknown",
|
|
115
|
+
"path": None,
|
|
116
|
+
"size_mb": 0,
|
|
117
|
+
"error": None,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# Helper to check a file attribute
|
|
121
|
+
def _check_file_attr(obj, attr, path_getter=None, label=None):
|
|
122
|
+
if not hasattr(obj, attr):
|
|
123
|
+
return None
|
|
124
|
+
file_field = getattr(obj, attr)
|
|
125
|
+
if not file_field:
|
|
126
|
+
return None
|
|
127
|
+
try:
|
|
128
|
+
file_path = Path(path_getter(file_field) if path_getter else file_field)
|
|
129
|
+
info = video_info.copy()
|
|
130
|
+
info["path"] = str(file_path)
|
|
131
|
+
if not file_path.exists():
|
|
132
|
+
info["status"] = "missing"
|
|
133
|
+
info["error"] = (
|
|
134
|
+
f"{label or attr.replace('_', ' ').title()} does not exist: {file_path}"
|
|
135
|
+
)
|
|
136
|
+
return info
|
|
137
|
+
file_size = file_path.stat().st_size
|
|
138
|
+
info["size_mb"] = file_size / (1024 * 1024)
|
|
139
|
+
if file_size == 0:
|
|
140
|
+
info["status"] = "corrupted"
|
|
141
|
+
info["error"] = (
|
|
142
|
+
f"{label or attr.replace('_', ' ').title()} exists but has zero size"
|
|
143
|
+
)
|
|
144
|
+
else:
|
|
145
|
+
info["status"] = "accessible"
|
|
146
|
+
return info
|
|
147
|
+
except (ValueError, OSError) as e:
|
|
148
|
+
info = video_info.copy()
|
|
149
|
+
info["path"] = str(getattr(file_field, "path", file_field))
|
|
150
|
+
info["status"] = "corrupted"
|
|
151
|
+
info["error"] = (
|
|
152
|
+
f"Cannot access {label or attr.replace('_', ' ').title()}: {e}"
|
|
153
|
+
)
|
|
154
|
+
return info
|
|
155
|
+
|
|
156
|
+
# Try each file attribute in order of preference
|
|
157
|
+
result = None
|
|
158
|
+
# active_file_path: direct path string
|
|
159
|
+
result = _check_file_attr(video, "active_file_path", label="Active file path")
|
|
160
|
+
if result:
|
|
161
|
+
return result
|
|
162
|
+
# active_file: Django FileField
|
|
163
|
+
result = _check_file_attr(
|
|
164
|
+
video, "active_file", path_getter=lambda f: f.path, label="Active file"
|
|
165
|
+
)
|
|
166
|
+
if result:
|
|
167
|
+
return result
|
|
168
|
+
# raw_file: Django FileField
|
|
169
|
+
result = _check_file_attr(
|
|
170
|
+
video, "raw_file", path_getter=lambda f: f.path, label="Raw file"
|
|
171
|
+
)
|
|
172
|
+
if result:
|
|
173
|
+
return result
|
|
174
|
+
# processed_file: Django FileField
|
|
175
|
+
result = _check_file_attr(
|
|
176
|
+
video,
|
|
177
|
+
"processed_file",
|
|
178
|
+
path_getter=lambda f: f.path,
|
|
179
|
+
label="Processed file",
|
|
180
|
+
)
|
|
181
|
+
if result:
|
|
182
|
+
return result
|
|
183
|
+
|
|
184
|
+
# If none found
|
|
185
|
+
video_info["status"] = "missing"
|
|
186
|
+
video_info["error"] = (
|
|
187
|
+
"No video file paths found (no active_file, raw_file, or processed_file)"
|
|
188
|
+
)
|
|
189
|
+
return video_info
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
from django.core.management.base import BaseCommand
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
This command handles the video validation as seen in tests _pipe_1
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Command(BaseCommand):
|
|
13
|
+
help = "Data extraction and validation of video files in the database and updating their states accordingly."
|
|
14
|
+
|
|
15
|
+
def handle(self, *args, **options):
|
|
16
|
+
"""
|
|
17
|
+
Validates video files stored in the database and updates their states based on validation results.
|
|
18
|
+
|
|
19
|
+
This method is intended to be executed as a Django management command to ensure the integrity and correct status of video file records.
|
|
20
|
+
"""
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
```mermaid
|
|
2
|
+
graph TD;
|
|
3
|
+
|
|
4
|
+
%% Main Patient Workflow
|
|
5
|
+
A[Patient: John] --> B[Examination: Colonoscopy]
|
|
6
|
+
B --> C[Finding: Colon Polyp]
|
|
7
|
+
C --> D[Finding Location: Colonoscopy Default - Right Flexure]
|
|
8
|
+
D --> E[Finding Morphology: Colon Lesion Planarity Default - Colon Lesion Planarity Excavated]
|
|
9
|
+
E --> F[Intervention: Colon Lesion Polypectomy - Hot Snare]
|
|
10
|
+
F --> G[Report Generation]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
```mermaid
|
|
2
|
+
graph TD;
|
|
3
|
+
|
|
4
|
+
%% File Handling Process
|
|
5
|
+
A[**Uploaded File**] -->|Original File Uploaded| B[**Anonymized File**]
|
|
6
|
+
B -->|File Anonymized & Stored| C[**Anonymous Image Annotation**]
|
|
7
|
+
|
|
8
|
+
%% Image Annotation & Processing
|
|
9
|
+
C -->|Label Assigned| D[**Anonymized Image Label**]
|
|
10
|
+
C -->|Detected Personal Info Removed| E[**Dropped Name**]
|
|
11
|
+
|
|
12
|
+
%% Relationships & Processing
|
|
13
|
+
E -->|Stored for Record-Keeping| C;
|
|
14
|
+
D -->|Predefined Labels Used| C;
|
|
15
|
+
|
|
16
|
+
%% Example Data (Corrected & Meaningful)
|
|
17
|
+
X1(["**Example: Uploaded colonoscopy.jpg**"]) -.-> A;
|
|
18
|
+
X2(["**Example: anonymized_colonoscopy.jpg**"]) -.-> B;
|
|
19
|
+
X3(["**Example: Label - 'Polyp Detected'**"]) -.-> D;
|
|
20
|
+
X4(["**Example: Name 'John Doe' removed**"]) -.-> E;
|