endoreg-db 0.8.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/__init__.py +0 -0
- endoreg_db/admin.py +92 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +18 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +144 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +91 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/examination/examinations/data.yaml +72 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +8 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +105 -0
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +441 -0
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -0
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +8 -0
- endoreg_db/forms/unit.py +6 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +378 -0
- endoreg_db/helpers/download_segmentation_model.py +31 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +423 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +77 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +62 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_data.py +68 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +75 -0
- endoreg_db/management/commands/load_examination_indication_data.py +86 -0
- endoreg_db/management/commands/load_finding_data.py +128 -0
- endoreg_db/management/commands/load_gender_data.py +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
- endoreg_db/management/commands/load_information_source.py +51 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_medication_data.py +103 -0
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_organ_data.py +43 -0
- endoreg_db/management/commands/load_pdf_type_data.py +61 -0
- endoreg_db/management/commands/load_profession_data.py +44 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/load_unit_data.py +46 -0
- endoreg_db/management/commands/load_user_groups.py +28 -0
- endoreg_db/management/commands/register_ai_model.py +64 -0
- endoreg_db/management/commands/reset_celery_schedule.py +9 -0
- endoreg_db/management/commands/setup_endoreg_db.py +381 -0
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1857 -0
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +359 -0
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/administration/ai/model_type.py +41 -0
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +15 -0
- endoreg_db/models/administration/case/case_template/case_template.py +125 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +18 -0
- endoreg_db/models/administration/person/names/last_name.py +19 -0
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/person.py +31 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/__init__.py +14 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/administration/product/product_weight.py +47 -0
- endoreg_db/models/administration/product/reference_product.py +130 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +83 -0
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/label/video_segmentation_labelset.py +27 -0
- endoreg_db/models/media/__init__.py +16 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +757 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +20 -0
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +168 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +222 -0
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/metadata/pdf_meta.py +89 -0
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/other/gender.py +27 -0
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -0
- endoreg_db/models/other/resource.py +22 -0
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -0
- endoreg_db/models/other/unit.py +32 -0
- endoreg_db/models/other/waste.py +27 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/rule/rule.py +27 -0
- endoreg_db/models/rule/rule_applicator.py +224 -0
- endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
- endoreg_db/models/rule/rule_type.py +20 -0
- endoreg_db/models/rule/ruleset.py +17 -0
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/queries/__init__.py +5 -0
- endoreg_db/queries/annotations/__init__.py +3 -0
- endoreg_db/queries/annotations/legacy.py +158 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +118 -0
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +69 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +1259 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +83 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/get.py +5 -0
- endoreg_db/utils/ai/inference_dataset.py +52 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/utils/ai/preprocess.py +68 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/case_generator/case_generator.py +159 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/utils/case_generator/utils.py +30 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/cropping.py +29 -0
- endoreg_db/utils/dataloader.py +175 -0
- endoreg_db/utils/dates.py +60 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +58 -0
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +153 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +76 -0
- endoreg_db/utils/ocr.py +190 -0
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/uuid.py +4 -0
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +274 -0
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/csrf.py +7 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +8 -0
- endoreg_db/views/pdf/pdf_stream.py +186 -0
- endoreg_db/views/pdf/reimport.py +177 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +367 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -0
- endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
- endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
- endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,189 @@
|
|
|
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
|
+
from django.conf import settings
|
|
9
|
+
import csv
|
|
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(self.style.SUCCESS("Starting database content summarization for endoreg_db models..."))
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
app_config = apps.get_app_config('endoreg_db')
|
|
24
|
+
except LookupError:
|
|
25
|
+
self.stdout.write(self.style.ERROR("Could not find the 'endoreg_db' app. Make sure it's correctly installed and configured."))
|
|
26
|
+
return
|
|
27
|
+
|
|
28
|
+
data_dir = os.path.join(app_config.path, 'data')
|
|
29
|
+
if not os.path.exists(data_dir):
|
|
30
|
+
os.makedirs(data_dir)
|
|
31
|
+
self.stdout.write(self.style.SUCCESS(f"Created directory: {data_dir}"))
|
|
32
|
+
|
|
33
|
+
excel_file_path = os.path.join(data_dir, 'db_summary.xlsx')
|
|
34
|
+
csv_file_path = os.path.join(data_dir, 'db_summary.csv')
|
|
35
|
+
|
|
36
|
+
# --- Excel Setup ---
|
|
37
|
+
wb = Workbook()
|
|
38
|
+
ws = wb.active
|
|
39
|
+
ws.title = "DB Summary"
|
|
40
|
+
excel_headers = ["Model Name", "Total Records"]
|
|
41
|
+
ws.append(excel_headers)
|
|
42
|
+
# --- End Excel Setup ---
|
|
43
|
+
|
|
44
|
+
# --- CSV Setup ---
|
|
45
|
+
csv_data_for_file = [excel_headers] # Initialize with headers for CSV, will only store rows with count > 0
|
|
46
|
+
# --- End CSV Setup ---
|
|
47
|
+
|
|
48
|
+
models = app_config.get_models()
|
|
49
|
+
|
|
50
|
+
if not models:
|
|
51
|
+
self.stdout.write(self.style.WARNING("No models found in the 'endoreg_db' app."))
|
|
52
|
+
try:
|
|
53
|
+
wb.save(excel_file_path) # wb will only have headers
|
|
54
|
+
self.stdout.write(self.style.SUCCESS(f"Empty summary report saved to {excel_file_path}"))
|
|
55
|
+
with open(csv_file_path, 'w', newline='') as f:
|
|
56
|
+
writer = csv.writer(f)
|
|
57
|
+
writer.writerows(csv_data_for_file) # csv_data_for_file will only contain headers
|
|
58
|
+
self.stdout.write(self.style.SUCCESS(f"Empty summary report saved to {csv_file_path}"))
|
|
59
|
+
except Exception as e:
|
|
60
|
+
self.stdout.write(self.style.ERROR(f"Error saving files: {e}"))
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
for model in models:
|
|
64
|
+
model_name = model.__name__
|
|
65
|
+
self.stdout.write(self.style.HTTP_INFO(f"\n--- Model: {model_name} ---"))
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
count = model.objects.count()
|
|
69
|
+
self.stdout.write(f" Total records: {count}")
|
|
70
|
+
|
|
71
|
+
if count == 0:
|
|
72
|
+
self.stdout.write(self.style.NOTICE(" No records found for this model. Skipping from file output."))
|
|
73
|
+
continue # Skip further processing for this model if count is 0 for file output
|
|
74
|
+
|
|
75
|
+
# --- Add to Excel (only if count > 0) ---
|
|
76
|
+
ws.append([model_name, count])
|
|
77
|
+
# --- End Add to Excel ---
|
|
78
|
+
|
|
79
|
+
# --- Add to CSV data list (only if count > 0) ---
|
|
80
|
+
csv_data_for_file.append([model_name, count])
|
|
81
|
+
# --- End Add to CSV data list ---
|
|
82
|
+
|
|
83
|
+
# Attempt to get date ranges for common date/datetime fields
|
|
84
|
+
date_fields_to_check = ['created_at', 'updated_at', 'timestamp', 'date',
|
|
85
|
+
'start_time', 'end_time', 'examination_date',
|
|
86
|
+
'birth_date', 'record_date']
|
|
87
|
+
processed_date_field = False
|
|
88
|
+
for field_obj in model._meta.get_fields():
|
|
89
|
+
if field_obj.name in date_fields_to_check and isinstance(field_obj, (fields.DateField, fields.DateTimeField)):
|
|
90
|
+
try:
|
|
91
|
+
aggregation = model.objects.aggregate(min_date=Min(field_obj.name), max_date=Max(field_obj.name))
|
|
92
|
+
min_val = aggregation.get('min_date')
|
|
93
|
+
max_val = aggregation.get('max_date')
|
|
94
|
+
|
|
95
|
+
if min_val is not None and max_val is not None:
|
|
96
|
+
if isinstance(min_val, datetime.datetime) and is_aware(min_val):
|
|
97
|
+
min_val = make_naive(min_val).strftime('%Y-%m-%d %H:%M:%S')
|
|
98
|
+
elif isinstance(min_val, datetime.date):
|
|
99
|
+
min_val = min_val.strftime('%Y-%m-%d')
|
|
100
|
+
|
|
101
|
+
if isinstance(max_val, datetime.datetime) and is_aware(max_val):
|
|
102
|
+
max_val = make_naive(max_val).strftime('%Y-%m-%d %H:%M:%S')
|
|
103
|
+
elif isinstance(max_val, datetime.date):
|
|
104
|
+
max_val = max_val.strftime('%Y-%m-%d')
|
|
105
|
+
|
|
106
|
+
self.stdout.write(f" {field_obj.verbose_name.capitalize()} range: {min_val} to {max_val}")
|
|
107
|
+
processed_date_field = True
|
|
108
|
+
break # Process only the first found relevant date field for brevity
|
|
109
|
+
except Exception as e:
|
|
110
|
+
self.stdout.write(self.style.WARNING(f" Could not aggregate date range for '{field_obj.name}': {e}"))
|
|
111
|
+
|
|
112
|
+
# Attempt to get value counts for potential categorical/ForeignKey fields
|
|
113
|
+
categorical_fields_found = 0
|
|
114
|
+
MAX_CATEGORICAL_FIELDS_TO_ANALYZE = 3
|
|
115
|
+
MAX_DISTINCT_VALUES_TO_SHOW = 5
|
|
116
|
+
|
|
117
|
+
for field in model._meta.get_fields():
|
|
118
|
+
if categorical_fields_found >= MAX_CATEGORICAL_FIELDS_TO_ANALYZE:
|
|
119
|
+
break
|
|
120
|
+
|
|
121
|
+
is_potential_categorical = False
|
|
122
|
+
field_name_lower = field.name.lower()
|
|
123
|
+
|
|
124
|
+
if field.many_to_one or field.one_to_one: # ForeignKey or OneToOneField
|
|
125
|
+
if field.related_model:
|
|
126
|
+
is_potential_categorical = True
|
|
127
|
+
elif isinstance(field, (fields.CharField, fields.IntegerField, fields.BooleanField, fields.TextField)):
|
|
128
|
+
# Heuristic for common categorical fields by name or type
|
|
129
|
+
if 'type' in field_name_lower or \
|
|
130
|
+
'status' in field_name_lower or \
|
|
131
|
+
'gender' in field_name_lower or \
|
|
132
|
+
'category' in field_name_lower or \
|
|
133
|
+
isinstance(field, fields.BooleanField):
|
|
134
|
+
is_potential_categorical = True
|
|
135
|
+
# For CharField/TextField, also consider if it has few distinct values (expensive to check upfront for all)
|
|
136
|
+
# We'll rely on the naming heuristic primarily or if it's a boolean.
|
|
137
|
+
|
|
138
|
+
if is_potential_categorical:
|
|
139
|
+
try:
|
|
140
|
+
self.stdout.write(f" Value counts for '{field.verbose_name.capitalize() if hasattr(field, 'verbose_name') else field.name}':")
|
|
141
|
+
|
|
142
|
+
# QuerySet for distinct values and their counts
|
|
143
|
+
values_qs = model.objects.values(field.name).annotate(count=Count(field.name)).order_by('-count')
|
|
144
|
+
|
|
145
|
+
distinct_values_count = values_qs.count()
|
|
146
|
+
|
|
147
|
+
if distinct_values_count == 0:
|
|
148
|
+
self.stdout.write(f" No distinct values found or field is often NULL.")
|
|
149
|
+
continue
|
|
150
|
+
|
|
151
|
+
for i, item in enumerate(values_qs):
|
|
152
|
+
if i >= MAX_DISTINCT_VALUES_TO_SHOW:
|
|
153
|
+
self.stdout.write(f" ... and {distinct_values_count - MAX_DISTINCT_VALUES_TO_SHOW} more distinct values.")
|
|
154
|
+
break
|
|
155
|
+
val = item[field.name]
|
|
156
|
+
val_display = str(val) if val is not None else "None/NULL"
|
|
157
|
+
# Truncate long string values for display
|
|
158
|
+
if isinstance(val, str) and len(val_display) > 50:
|
|
159
|
+
val_display = val_display[:47] + "..."
|
|
160
|
+
self.stdout.write(f" - {val_display}: {item['count']}")
|
|
161
|
+
|
|
162
|
+
categorical_fields_found += 1
|
|
163
|
+
|
|
164
|
+
except Exception as e:
|
|
165
|
+
# Some fields (like generic relations or complex custom fields) might not support this directly
|
|
166
|
+
self.stdout.write(self.style.WARNING(f" Could not get value counts for '{field.name}': {e}"))
|
|
167
|
+
|
|
168
|
+
except Exception as e:
|
|
169
|
+
self.stdout.write(self.style.ERROR(f" Error processing model {model_name}: {e}"))
|
|
170
|
+
|
|
171
|
+
# --- Save Excel File ---
|
|
172
|
+
try:
|
|
173
|
+
wb.save(excel_file_path)
|
|
174
|
+
self.stdout.write(self.style.SUCCESS(f"\nDatabase summary report saved to {excel_file_path}"))
|
|
175
|
+
except Exception as e:
|
|
176
|
+
self.stdout.write(self.style.ERROR(f"\nError saving Excel file: {e}"))
|
|
177
|
+
# --- End Save Excel File ---
|
|
178
|
+
|
|
179
|
+
# --- Save CSV File ---
|
|
180
|
+
try:
|
|
181
|
+
with open(csv_file_path, 'w', newline='') as f:
|
|
182
|
+
writer = csv.writer(f)
|
|
183
|
+
writer.writerows(csv_data_for_file)
|
|
184
|
+
self.stdout.write(self.style.SUCCESS(f"Database summary report saved to {csv_file_path}"))
|
|
185
|
+
except Exception as e:
|
|
186
|
+
self.stdout.write(self.style.ERROR(f"Error saving CSV file: {e}"))
|
|
187
|
+
# --- End Save CSV File ---
|
|
188
|
+
|
|
189
|
+
self.stdout.write(self.style.SUCCESS("\nDatabase content summarization finished."))
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
from endoreg_db.models import VideoFile
|
|
3
|
+
from endoreg_db.helpers.default_objects import get_latest_segmentation_model
|
|
4
|
+
from django.db.models import Q # Add this import
|
|
5
|
+
|
|
6
|
+
# VideoFile instances have a related 'state' (a VideoState object).
|
|
7
|
+
# VideoState uses boolean fields (e.g., state.anonymized, state.initial_prediction_completed)
|
|
8
|
+
# to track the processing status, rather than a single status field with choices.
|
|
9
|
+
# This command interprets combinations of these boolean fields to determine
|
|
10
|
+
# if a video is considered "validated" or "anonymized".
|
|
11
|
+
# The VideoState model itself is defined in endoreg_db/models/state/video.py (or similar)
|
|
12
|
+
# and does not contain an enum like the previously assumed 'VideoFileStateChoices'.
|
|
13
|
+
|
|
14
|
+
class Command(BaseCommand):
|
|
15
|
+
help = "Data extraction and validation of video files in the database and updating their states accordingly."
|
|
16
|
+
|
|
17
|
+
def add_arguments(self, parser):
|
|
18
|
+
"""
|
|
19
|
+
Adds command-line arguments for verbose output, forced revalidation, and anonymization.
|
|
20
|
+
|
|
21
|
+
This method configures the management command to accept optional flags:
|
|
22
|
+
--verbose for detailed output, --force to revalidate all videos regardless of status,
|
|
23
|
+
and --anonymize to anonymize video files during processing.
|
|
24
|
+
"""
|
|
25
|
+
parser.add_argument(
|
|
26
|
+
"--verbose",
|
|
27
|
+
action="store_true",
|
|
28
|
+
help="Display verbose output",
|
|
29
|
+
)
|
|
30
|
+
parser.add_argument(
|
|
31
|
+
"--force",
|
|
32
|
+
action="store_true",
|
|
33
|
+
help="Force revalidation of all video files, even if they are already validated.",
|
|
34
|
+
)
|
|
35
|
+
parser.add_argument(
|
|
36
|
+
"--anonymize",
|
|
37
|
+
action="store_true",
|
|
38
|
+
help="Anonymize video files.",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
def handle(self, *args, **options):
|
|
42
|
+
"""
|
|
43
|
+
Validates video files stored in the database and updates their validation states.
|
|
44
|
+
|
|
45
|
+
This method processes video files according to the provided command-line options,
|
|
46
|
+
such as verbose output, forced revalidation, or anonymization.
|
|
47
|
+
It interprets the boolean flags in the related VideoState object to determine
|
|
48
|
+
if a video is 'validated' (e.g., initial_prediction_completed and lvs_created are True)
|
|
49
|
+
or 'anonymized' (e.g., anonymized is True).
|
|
50
|
+
"""
|
|
51
|
+
#TODO @maxhild here is some ai generated code for now, not validated yet
|
|
52
|
+
verbose = options["verbose"]
|
|
53
|
+
force = options["force"]
|
|
54
|
+
anonymize_option = options["anonymize"]
|
|
55
|
+
|
|
56
|
+
if verbose:
|
|
57
|
+
self.stdout.write(self.style.SUCCESS("Starting video validation and/or anonymization process..."))
|
|
58
|
+
|
|
59
|
+
# Eager load related state if VideoFile.state is a ForeignKey or OneToOneField
|
|
60
|
+
videos_query = VideoFile.objects.select_related('state').all()
|
|
61
|
+
|
|
62
|
+
# Define conditions for "validated" and "anonymized" based on VideoState boolean fields
|
|
63
|
+
# Validated: initial_prediction_completed = True AND lvs_created = True
|
|
64
|
+
q_validated = Q(state__initial_prediction_completed=True, state__lvs_created=True)
|
|
65
|
+
# Anonymized: anonymized = True
|
|
66
|
+
q_anonymized = Q(state__anonymized=True)
|
|
67
|
+
|
|
68
|
+
if not force:
|
|
69
|
+
if anonymize_option:
|
|
70
|
+
# If anonymization is the goal, process videos not yet anonymized.
|
|
71
|
+
videos_query = videos_query.exclude(q_anonymized)
|
|
72
|
+
else:
|
|
73
|
+
# If only validation is the goal, process videos not yet validated or anonymized.
|
|
74
|
+
videos_query = videos_query.exclude(q_validated | q_anonymized)
|
|
75
|
+
|
|
76
|
+
videos_to_process = list(videos_query)
|
|
77
|
+
|
|
78
|
+
if not videos_to_process:
|
|
79
|
+
if verbose:
|
|
80
|
+
self.stdout.write(self.style.SUCCESS("No videos found requiring processing with the current options."))
|
|
81
|
+
return
|
|
82
|
+
|
|
83
|
+
processed_count = 0
|
|
84
|
+
failed_count = 0
|
|
85
|
+
model_name_for_pipe1 = None
|
|
86
|
+
|
|
87
|
+
try:
|
|
88
|
+
# Attempt to get the model for pipe_1. This might be optional for pipe_1.
|
|
89
|
+
ai_model_meta = get_latest_segmentation_model()
|
|
90
|
+
model_name_for_pipe1 = ai_model_meta.model.name
|
|
91
|
+
if verbose:
|
|
92
|
+
self.stdout.write(self.style.SUCCESS(f"Using model '{model_name_for_pipe1}' for pipe_1 processing."))
|
|
93
|
+
except Exception as e:
|
|
94
|
+
self.stdout.write(self.style.WARNING(f"Could not retrieve segmentation model: {e}. pipe_1 might proceed without a specific model or use a default."))
|
|
95
|
+
# model_name_for_pipe1 can remain None if pipe_1 handles it, or set a default if known.
|
|
96
|
+
|
|
97
|
+
for video in videos_to_process:
|
|
98
|
+
state_summary = "N/A"
|
|
99
|
+
if hasattr(video, 'state') and video.state:
|
|
100
|
+
s = video.state
|
|
101
|
+
state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
102
|
+
|
|
103
|
+
if verbose:
|
|
104
|
+
self.stdout.write(f"Processing video: {video.uuid} (Current state: {state_summary})")
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
# Determine if pipe_1 needs to run
|
|
108
|
+
needs_pipe_1 = force
|
|
109
|
+
if not force and hasattr(video, 'state') and video.state:
|
|
110
|
+
s = video.state
|
|
111
|
+
is_validated = s.initial_prediction_completed and s.lvs_created
|
|
112
|
+
is_anonymized = s.anonymized
|
|
113
|
+
if not (is_validated or is_anonymized):
|
|
114
|
+
needs_pipe_1 = True
|
|
115
|
+
elif not force: # No state object, assume it needs processing
|
|
116
|
+
needs_pipe_1 = True
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
if needs_pipe_1:
|
|
120
|
+
if verbose:
|
|
121
|
+
self.stdout.write(f"Running pipe_1 for video {video.uuid} (force={force})...")
|
|
122
|
+
if not model_name_for_pipe1 and verbose:
|
|
123
|
+
self.stdout.write(self.style.WARNING(f"Attempting pipe_1 for {video.uuid} without a specific model name."))
|
|
124
|
+
|
|
125
|
+
success_pipe_1 = video.pipe_1(model_name=model_name_for_pipe1)
|
|
126
|
+
video.refresh_from_db()
|
|
127
|
+
|
|
128
|
+
new_state_summary = "N/A"
|
|
129
|
+
if hasattr(video, 'state') and video.state:
|
|
130
|
+
s = video.state
|
|
131
|
+
new_state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
132
|
+
|
|
133
|
+
if not success_pipe_1:
|
|
134
|
+
raise Exception(f"pipe_1 validation failed for video {video.uuid}. State after attempt: {new_state_summary}")
|
|
135
|
+
|
|
136
|
+
if verbose:
|
|
137
|
+
self.stdout.write(self.style.SUCCESS(f"Video {video.uuid} successfully passed pipe_1. New state: {new_state_summary}"))
|
|
138
|
+
elif verbose:
|
|
139
|
+
self.stdout.write(f"Video {video.uuid} already meets validation criteria or is anonymized, skipping pipe_1 (force=False).")
|
|
140
|
+
|
|
141
|
+
# Anonymization step
|
|
142
|
+
if anonymize_option:
|
|
143
|
+
should_anonymize = False
|
|
144
|
+
current_state_summary_for_anonym = "N/A"
|
|
145
|
+
if hasattr(video, 'state') and video.state:
|
|
146
|
+
s = video.state
|
|
147
|
+
current_state_summary_for_anonym = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
148
|
+
is_validated_for_anonymization = s.initial_prediction_completed and s.lvs_created
|
|
149
|
+
is_currently_anonymized = s.anonymized
|
|
150
|
+
if force or (is_validated_for_anonymization and not is_currently_anonymized):
|
|
151
|
+
should_anonymize = True
|
|
152
|
+
elif force: # No state, but force anonymize
|
|
153
|
+
should_anonymize = True
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
if should_anonymize:
|
|
157
|
+
if verbose:
|
|
158
|
+
self.stdout.write(f"Attempting to anonymize video: {video.uuid} (force={force}, current_state_before_anonym={current_state_summary_for_anonym}).")
|
|
159
|
+
|
|
160
|
+
if hasattr(video, 'anonymize_video_content'):
|
|
161
|
+
video.anonymize_video_content()
|
|
162
|
+
video.refresh_from_db()
|
|
163
|
+
else:
|
|
164
|
+
self.stdout.write(self.style.ERROR(f"Video model does not have 'anonymize_video_content' method. Skipping anonymization for {video.uuid}."))
|
|
165
|
+
# Potentially raise an error or handle as a failure
|
|
166
|
+
|
|
167
|
+
post_anonym_state_summary = "N/A"
|
|
168
|
+
is_now_anonymized = False
|
|
169
|
+
if hasattr(video, 'state') and video.state:
|
|
170
|
+
s = video.state
|
|
171
|
+
post_anonym_state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
172
|
+
is_now_anonymized = s.anonymized
|
|
173
|
+
|
|
174
|
+
if is_now_anonymized:
|
|
175
|
+
if verbose:
|
|
176
|
+
self.stdout.write(self.style.SUCCESS(f"Video {video.uuid} successfully anonymized. New state: {post_anonym_state_summary}"))
|
|
177
|
+
else:
|
|
178
|
+
if hasattr(video, 'anonymize_video_content'): # Only raise if we attempted
|
|
179
|
+
raise Exception(f"Anonymization called but video is not marked as anonymized for video {video.uuid}. Current state: {post_anonym_state_summary}")
|
|
180
|
+
|
|
181
|
+
elif hasattr(video, 'state') and video.state and video.state.anonymized and verbose: # Already anonymized
|
|
182
|
+
self.stdout.write(f"Video {video.uuid} is already anonymized.")
|
|
183
|
+
elif verbose:
|
|
184
|
+
self.stdout.write(f"Skipping anonymization for video {video.uuid} (not validated for anonymization, or already anonymized and not forced).")
|
|
185
|
+
|
|
186
|
+
processed_count += 1
|
|
187
|
+
except Exception as e:
|
|
188
|
+
failed_count += 1
|
|
189
|
+
video.refresh_from_db()
|
|
190
|
+
error_state_summary = "N/A"
|
|
191
|
+
if hasattr(video, 'state') and video.state:
|
|
192
|
+
s = video.state
|
|
193
|
+
error_state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
194
|
+
self.stdout.write(self.style.ERROR(f"Error processing video {video.uuid}: {e}. State after error: {error_state_summary}"))
|
|
195
|
+
# Optionally, explicitly set an error state if the methods don't do it reliably:
|
|
196
|
+
# if hasattr(video, 'state') and video.state: # Further checks would depend on how an error state is defined with booleans
|
|
197
|
+
# # video.state.set_status(VideoFile.VideoFileStateChoices.ERROR, message=f"Validation command error: {str(e)[:250]}") # Old way
|
|
198
|
+
# # video.state.save() # New way would involve setting specific boolean flags to indicate error
|
|
199
|
+
pass
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
if verbose:
|
|
203
|
+
self.stdout.write(self.style.SUCCESS(f"Video processing finished. Succeeded: {processed_count}, Failed: {failed_count}."))
|
|
204
|
+
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django management command to validate video file existence and accessibility.
|
|
3
|
+
"""
|
|
4
|
+
from django.core.management.base import BaseCommand
|
|
5
|
+
|
|
6
|
+
from endoreg_db.models import VideoFile
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import logging
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Command(BaseCommand):
|
|
14
|
+
help = 'Validate video file existence and accessibility'
|
|
15
|
+
|
|
16
|
+
def add_arguments(self, parser):
|
|
17
|
+
parser.add_argument(
|
|
18
|
+
'--video-id',
|
|
19
|
+
type=int,
|
|
20
|
+
help='Check specific video ID',
|
|
21
|
+
)
|
|
22
|
+
parser.add_argument(
|
|
23
|
+
'--verbose',
|
|
24
|
+
action='store_true',
|
|
25
|
+
help='Enable verbose output',
|
|
26
|
+
)
|
|
27
|
+
parser.add_argument(
|
|
28
|
+
'--fix-missing',
|
|
29
|
+
action='store_true',
|
|
30
|
+
help='Mark videos with missing files as inactive',
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def handle(self, *args, **options):
|
|
34
|
+
"""Validate video files and their accessibility."""
|
|
35
|
+
verbose = options['verbose']
|
|
36
|
+
video_id = options.get('video_id')
|
|
37
|
+
fix_missing = options['fix_missing']
|
|
38
|
+
|
|
39
|
+
if verbose:
|
|
40
|
+
self.stdout.write(self.style.SUCCESS("Starting video validation..."))
|
|
41
|
+
|
|
42
|
+
# Query videos
|
|
43
|
+
if video_id:
|
|
44
|
+
try:
|
|
45
|
+
videos = [VideoFile.objects.get(pk=video_id)]
|
|
46
|
+
self.stdout.write(f"Checking specific video ID: {video_id}")
|
|
47
|
+
except VideoFile.DoesNotExist:
|
|
48
|
+
self.stdout.write(self.style.ERROR(f"Video with ID {video_id} not found"))
|
|
49
|
+
return
|
|
50
|
+
else:
|
|
51
|
+
videos = VideoFile.objects.all()
|
|
52
|
+
self.stdout.write(f"Checking {videos.count()} videos...")
|
|
53
|
+
|
|
54
|
+
missing_files = []
|
|
55
|
+
accessible_files = []
|
|
56
|
+
corrupted_files = []
|
|
57
|
+
|
|
58
|
+
for video in videos:
|
|
59
|
+
video_status = self.check_video_file(video, verbose)
|
|
60
|
+
|
|
61
|
+
if video_status['status'] == 'missing':
|
|
62
|
+
missing_files.append(video_status)
|
|
63
|
+
elif video_status['status'] == 'corrupted':
|
|
64
|
+
corrupted_files.append(video_status)
|
|
65
|
+
else:
|
|
66
|
+
accessible_files.append(video_status)
|
|
67
|
+
|
|
68
|
+
# Report results
|
|
69
|
+
self.stdout.write("\n" + "="*60)
|
|
70
|
+
self.stdout.write(self.style.SUCCESS("VALIDATION COMPLETE"))
|
|
71
|
+
self.stdout.write("="*60)
|
|
72
|
+
|
|
73
|
+
self.stdout.write(f"✅ Accessible videos: {len(accessible_files)}")
|
|
74
|
+
self.stdout.write(f"❌ Missing files: {len(missing_files)}")
|
|
75
|
+
self.stdout.write(f"⚠️ Potentially corrupted: {len(corrupted_files)}")
|
|
76
|
+
|
|
77
|
+
if missing_files:
|
|
78
|
+
self.stdout.write(self.style.WARNING("\nMISSING FILES:"))
|
|
79
|
+
for file_info in missing_files:
|
|
80
|
+
self.stdout.write(f" - Video ID {file_info['video_id']}: {file_info['error']}")
|
|
81
|
+
if fix_missing:
|
|
82
|
+
self.stdout.write(" → Marking as inactive (if applicable)")
|
|
83
|
+
|
|
84
|
+
if corrupted_files:
|
|
85
|
+
self.stdout.write(self.style.WARNING("\nPOTENTIALLY CORRUPTED FILES:"))
|
|
86
|
+
for file_info in corrupted_files:
|
|
87
|
+
self.stdout.write(f" - Video ID {file_info['video_id']}: {file_info['error']}")
|
|
88
|
+
|
|
89
|
+
if verbose and accessible_files:
|
|
90
|
+
self.stdout.write(self.style.SUCCESS("\nACCESSIBLE FILES:"))
|
|
91
|
+
for file_info in accessible_files[:10]: # Show first 10
|
|
92
|
+
self.stdout.write(f" ✅ Video ID {file_info['video_id']}: {file_info['path']} ({file_info['size_mb']:.1f} MB)")
|
|
93
|
+
|
|
94
|
+
if len(accessible_files) > 10:
|
|
95
|
+
self.stdout.write(f" ... and {len(accessible_files) - 10} more")
|
|
96
|
+
|
|
97
|
+
def check_video_file(self, video, verbose=False):
|
|
98
|
+
"""
|
|
99
|
+
Check a single video file for existence and basic accessibility.
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
dict: Status information about the video file
|
|
103
|
+
"""
|
|
104
|
+
video_info = {
|
|
105
|
+
'video_id': video.id,
|
|
106
|
+
'video_uuid': str(video.uuid) if hasattr(video, 'uuid') else 'N/A',
|
|
107
|
+
'status': 'unknown',
|
|
108
|
+
'path': None,
|
|
109
|
+
'size_mb': 0,
|
|
110
|
+
'error': None
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
# Helper to check a file attribute
|
|
114
|
+
def _check_file_attr(obj, attr, path_getter=None, label=None):
|
|
115
|
+
if not hasattr(obj, attr):
|
|
116
|
+
return None
|
|
117
|
+
file_field = getattr(obj, attr)
|
|
118
|
+
if not file_field:
|
|
119
|
+
return None
|
|
120
|
+
try:
|
|
121
|
+
file_path = Path(path_getter(file_field) if path_getter else file_field)
|
|
122
|
+
info = video_info.copy()
|
|
123
|
+
info['path'] = str(file_path)
|
|
124
|
+
if not file_path.exists():
|
|
125
|
+
info['status'] = 'missing'
|
|
126
|
+
info['error'] = f"{label or attr.replace('_', ' ').title()} does not exist: {file_path}"
|
|
127
|
+
return info
|
|
128
|
+
file_size = file_path.stat().st_size
|
|
129
|
+
info['size_mb'] = file_size / (1024 * 1024)
|
|
130
|
+
if file_size == 0:
|
|
131
|
+
info['status'] = 'corrupted'
|
|
132
|
+
info['error'] = f"{label or attr.replace('_', ' ').title()} exists but has zero size"
|
|
133
|
+
else:
|
|
134
|
+
info['status'] = 'accessible'
|
|
135
|
+
return info
|
|
136
|
+
except (ValueError, OSError) as e:
|
|
137
|
+
info = video_info.copy()
|
|
138
|
+
info['path'] = str(getattr(file_field, 'path', file_field))
|
|
139
|
+
info['status'] = 'corrupted'
|
|
140
|
+
info['error'] = f"Cannot access {label or attr.replace('_', ' ').title()}: {e}"
|
|
141
|
+
return info
|
|
142
|
+
|
|
143
|
+
# Try each file attribute in order of preference
|
|
144
|
+
result = None
|
|
145
|
+
# active_file_path: direct path string
|
|
146
|
+
result = _check_file_attr(video, 'active_file_path', label='Active file path')
|
|
147
|
+
if result: return result
|
|
148
|
+
# active_file: Django FileField
|
|
149
|
+
result = _check_file_attr(video, 'active_file', path_getter=lambda f: f.path, label='Active file')
|
|
150
|
+
if result: return result
|
|
151
|
+
# raw_file: Django FileField
|
|
152
|
+
result = _check_file_attr(video, 'raw_file', path_getter=lambda f: f.path, label='Raw file')
|
|
153
|
+
if result: return result
|
|
154
|
+
# processed_file: Django FileField
|
|
155
|
+
result = _check_file_attr(video, 'processed_file', path_getter=lambda f: f.path, label='Processed file')
|
|
156
|
+
if result: return result
|
|
157
|
+
|
|
158
|
+
# If none found
|
|
159
|
+
video_info['status'] = 'missing'
|
|
160
|
+
video_info['error'] = "No video file paths found (no active_file, raw_file, or processed_file)"
|
|
161
|
+
return video_info
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from endoreg_db.models import VideoPredictionMeta
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
from django.core.management.base import BaseCommand
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
This command handles the video validation as seen in tests _pipe_1
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from endoreg_db.models import VideoFile, VideoState
|
|
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
|
+
"""
|
|
21
|
+
|
|
22
|
+
|
|
@@ -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;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
```mermaid
|
|
2
|
+
graph TD;
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
%% Step 1: Image Classification (Start)
|
|
7
|
+
|
|
8
|
+
A[**Image Classification**] -->|Uses| B[**Label**];
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
%% Step 2: Video Segmentation
|
|
13
|
+
|
|
14
|
+
A -->|Segments Stored In| C[**Video Segmentation**];
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
%% Step 3: Automatic Segmentation Detection
|
|
19
|
+
|
|
20
|
+
D["**find_segments_in_prediction_array()**"] -->|Detects & Segments| C;
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
%% Step 4: Fetching Unclassified Frames for Annotation
|
|
25
|
+
|
|
26
|
+
E["get_legacy_binary_classification_annotation_tasks_by_label()"] -->|Finds Frames Needing Annotation| F;
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
%% Step 5: Binary Classification Task Management
|
|
31
|
+
|
|
32
|
+
F[**Binary Classification Task**] -->|Assigned To| G[**Frame**];
|
|
33
|
+
|
|
34
|
+
F -->|Assigned To| H[**Legacy Frame**];
|
|
35
|
+
|
|
36
|
+
F -->|Uses| B;
|
|
37
|
+
|
|
38
|
+
%% Step 6: Task Completion & Cleanup (End)
|
|
39
|
+
|
|
40
|
+
I["clear_finished_legacy_tasks()"] -->|Removes Completed Tasks| F;
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
%% Example Data
|
|
45
|
+
|
|
46
|
+
X1(["Example: Frame classified as 'Polyp Present'"]) -.-> A;
|
|
47
|
+
|
|
48
|
+
X2(["Example: Video segment marked from 100s to 200s"]) -.-> C;
|
|
49
|
+
|
|
50
|
+
X3(["Example: 10 unclassified frames found"]) -.-> F;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
```mermaid
|
|
2
|
+
graph TD;
|
|
3
|
+
|
|
4
|
+
A["Start: Select Finding Location Classification"] --> B["Store in endoreg_db_findinglocationclassification"]
|
|
5
|
+
B --> C["Retrieve Available Choices"]
|
|
6
|
+
C --> D["Save Selected Location in endoreg_db_patientfinding_locations"]
|
|
7
|
+
D --> E["Link Location to Patient Finding via Foreign Key"]
|
|
8
|
+
E --> F["Finding Location Process Completed"]
|