endoreg-db 0.8.5.1__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 +613 -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 +699 -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 +730 -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 +147 -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 +152 -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/misc/vop_patient_data.py +120 -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/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 +241 -0
- endoreg_db/services/lookup_store.py +122 -0
- endoreg_db/services/pdf_import.py +1159 -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 +1258 -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 +70 -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 +44 -0
- endoreg_db/urls/media.py +226 -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 +272 -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 +386 -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 +11 -0
- endoreg_db/views/pdf/pdf_media.py +239 -0
- endoreg_db/views/pdf/pdf_stream_views.py +127 -0
- endoreg_db/views/pdf/reimport.py +161 -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 +483 -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 +61 -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 +329 -0
- endoreg_db/views/video/video_media.py +158 -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.5.1.dist-info/METADATA +383 -0
- endoreg_db-0.8.5.1.dist-info/RECORD +794 -0
- endoreg_db-0.8.5.1.dist-info/WHEEL +4 -0
- endoreg_db-0.8.5.1.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from endoreg_db.models import VideoFile
|
|
2
|
+
from endoreg_db.serializers.video.video_file_detail import VideoDetailSerializer
|
|
3
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
from django.shortcuts import get_object_or_404
|
|
7
|
+
from rest_framework import status
|
|
8
|
+
from rest_framework.response import Response
|
|
9
|
+
from rest_framework.views import APIView
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class VideoCorrectionView(APIView):
|
|
13
|
+
"""
|
|
14
|
+
GET /api/video/media/video-correction/{id}/ - Get video details for correction
|
|
15
|
+
"""
|
|
16
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
17
|
+
|
|
18
|
+
def get(self, request, pk):
|
|
19
|
+
video = get_object_or_404(VideoFile, pk=pk)
|
|
20
|
+
ser = VideoDetailSerializer(video, context={"request": request})
|
|
21
|
+
return Response(ser.data, status=status.HTTP_200_OK)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from rest_framework import status
|
|
5
|
+
from rest_framework.response import Response
|
|
6
|
+
from rest_framework.views import APIView
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class VideoDownloadProcessedView(APIView):
|
|
13
|
+
"""
|
|
14
|
+
GET /api/video-download-processed/{id}/ - Download processed video result
|
|
15
|
+
"""
|
|
16
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
17
|
+
|
|
18
|
+
def get(self, request, pk):
|
|
19
|
+
# Remove unused 'video' variable
|
|
20
|
+
output_path = request.query_params.get('path')
|
|
21
|
+
|
|
22
|
+
# Define the allowed base directory for processed videos
|
|
23
|
+
processed_base_dir = os.path.abspath(os.getenv("PROCESSED_VIDEO_DIR", "/srv/processed_videos"))
|
|
24
|
+
if not output_path:
|
|
25
|
+
return Response(
|
|
26
|
+
{"error": "Processed file not found"},
|
|
27
|
+
status=status.HTTP_404_NOT_FOUND
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# Resolve the absolute path and check if it's within the allowed directory
|
|
31
|
+
abs_output_path = os.path.abspath(output_path)
|
|
32
|
+
if not abs_output_path.startswith(processed_base_dir + os.sep):
|
|
33
|
+
return Response(
|
|
34
|
+
{"error": "Invalid file path"},
|
|
35
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
if not os.path.exists(abs_output_path):
|
|
39
|
+
return Response(
|
|
40
|
+
{"error": "Processed file not found"},
|
|
41
|
+
status=status.HTTP_404_NOT_FOUND
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
from django.http import FileResponse
|
|
46
|
+
with open(abs_output_path, 'rb') as f:
|
|
47
|
+
response = FileResponse(
|
|
48
|
+
f,
|
|
49
|
+
content_type='video/mp4'
|
|
50
|
+
)
|
|
51
|
+
response['Content-Disposition'] = f'attachment; filename="{os.path.basename(abs_output_path)}"'
|
|
52
|
+
return response
|
|
53
|
+
|
|
54
|
+
except Exception as e:
|
|
55
|
+
return Response(
|
|
56
|
+
{"error": f"Failed to serve file: {str(e)}"},
|
|
57
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
58
|
+
)
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
# endoreg_db/views/examination_views.py
|
|
2
|
+
from rest_framework.viewsets import ModelViewSet
|
|
3
|
+
from rest_framework import status
|
|
4
|
+
from rest_framework.decorators import api_view
|
|
5
|
+
from rest_framework.response import Response
|
|
6
|
+
from django.shortcuts import get_object_or_404
|
|
7
|
+
from rest_framework import viewsets
|
|
8
|
+
|
|
9
|
+
from endoreg_db.models import (
|
|
10
|
+
Examination,
|
|
11
|
+
VideoFile,
|
|
12
|
+
FindingClassification,
|
|
13
|
+
FindingClassificationChoice,
|
|
14
|
+
FindingIntervention,
|
|
15
|
+
Finding
|
|
16
|
+
)
|
|
17
|
+
from ...serializers.examination import (
|
|
18
|
+
ExaminationSerializer as ExaminationSerializer,
|
|
19
|
+
# FindingSerializer as FindingSerializer,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ExaminationViewSet(ModelViewSet):
|
|
24
|
+
queryset = Examination.objects.all()
|
|
25
|
+
serializer_class = ExaminationSerializer
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# NEW: Video Examination CRUD ViewSet
|
|
29
|
+
class VideoExaminationViewSet(viewsets.ModelViewSet):
|
|
30
|
+
"""
|
|
31
|
+
ViewSet for Video Examination CRUD operations
|
|
32
|
+
Handles POST and PATCH for video examinations at timestamps
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def get_queryset(self):
|
|
36
|
+
# Return empty queryset as we handle retrieval manually
|
|
37
|
+
return []
|
|
38
|
+
|
|
39
|
+
def create(self, request, *args, **kwargs):
|
|
40
|
+
"""
|
|
41
|
+
Create a new video examination
|
|
42
|
+
POST /api/examinations/
|
|
43
|
+
|
|
44
|
+
Expected payload:
|
|
45
|
+
{
|
|
46
|
+
"videoId": 123,
|
|
47
|
+
"timestamp": 45.5,
|
|
48
|
+
"examinationTypeId": 1,
|
|
49
|
+
"findingId": 2,
|
|
50
|
+
"locationClassificationId": 3,
|
|
51
|
+
"locationChoiceId": 4,
|
|
52
|
+
"morphologyClassificationId": 5,
|
|
53
|
+
"morphologyChoiceId": 6,
|
|
54
|
+
"interventionIds": [7, 8],
|
|
55
|
+
"notes": "Sample notes"
|
|
56
|
+
}
|
|
57
|
+
"""
|
|
58
|
+
from django.db import transaction
|
|
59
|
+
import logging
|
|
60
|
+
|
|
61
|
+
logger = logging.getLogger(__name__)
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
data = request.data
|
|
65
|
+
|
|
66
|
+
# Validate required fields
|
|
67
|
+
required_fields = ['videoId', 'timestamp', 'examinationTypeId', 'findingId']
|
|
68
|
+
for field in required_fields:
|
|
69
|
+
if field not in data or data[field] is None:
|
|
70
|
+
return Response(
|
|
71
|
+
{'error': f'Missing or null required field: {field}'},
|
|
72
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# Validate data types
|
|
76
|
+
try:
|
|
77
|
+
video_id = int(data['videoId'])
|
|
78
|
+
timestamp = float(data['timestamp'])
|
|
79
|
+
examination_type_id = int(data['examinationTypeId'])
|
|
80
|
+
finding_id = int(data['findingId'])
|
|
81
|
+
except (ValueError, TypeError) as e:
|
|
82
|
+
return Response(
|
|
83
|
+
{'error': f'Invalid data type in request: {str(e)}'},
|
|
84
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# Validate timestamp is not negative
|
|
88
|
+
if timestamp < 0:
|
|
89
|
+
return Response(
|
|
90
|
+
{'error': 'Timestamp cannot be negative'},
|
|
91
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
with transaction.atomic():
|
|
95
|
+
# Get video
|
|
96
|
+
try:
|
|
97
|
+
video = VideoFile.objects.get(id=video_id)
|
|
98
|
+
except VideoFile.DoesNotExist:
|
|
99
|
+
return Response(
|
|
100
|
+
{'error': 'Video not found'},
|
|
101
|
+
status=status.HTTP_404_NOT_FOUND
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Get examination type
|
|
105
|
+
try:
|
|
106
|
+
examination = Examination.objects.get(id=examination_type_id)
|
|
107
|
+
except Examination.DoesNotExist:
|
|
108
|
+
return Response(
|
|
109
|
+
{'error': 'Examination type not found'},
|
|
110
|
+
status=status.HTTP_404_NOT_FOUND
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Get finding
|
|
114
|
+
try:
|
|
115
|
+
finding = Finding.objects.get(id=finding_id)
|
|
116
|
+
except Finding.DoesNotExist:
|
|
117
|
+
return Response(
|
|
118
|
+
{'error': 'Finding not found'},
|
|
119
|
+
status=status.HTTP_404_NOT_FOUND
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Validate optional foreign keys if provided
|
|
123
|
+
if data.get('locationClassificationId'):
|
|
124
|
+
try:
|
|
125
|
+
FindingClassification.objects.get(id=data['locationClassificationId'], classification_types__name__iexact="location")
|
|
126
|
+
except FindingClassification.DoesNotExist:
|
|
127
|
+
return Response(
|
|
128
|
+
{'error': 'Location classification not found'},
|
|
129
|
+
status=status.HTTP_404_NOT_FOUND
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
if data.get('morphologyClassificationId'):
|
|
133
|
+
try:
|
|
134
|
+
FindingClassification.objects.get(
|
|
135
|
+
id=data['morphologyClassificationId'],
|
|
136
|
+
classification_types__name__iexact="morphology"
|
|
137
|
+
)
|
|
138
|
+
except FindingClassification.DoesNotExist:
|
|
139
|
+
return Response(
|
|
140
|
+
{'error': 'Morphology classification not found'},
|
|
141
|
+
status=status.HTTP_404_NOT_FOUND
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
# Create examination record
|
|
145
|
+
examination_data = {
|
|
146
|
+
'id': f"exam_{video.id}_{timestamp}_{examination.id}",
|
|
147
|
+
'video_id': video_id,
|
|
148
|
+
'timestamp': timestamp,
|
|
149
|
+
'examination_type': examination.name,
|
|
150
|
+
'finding': finding.name,
|
|
151
|
+
'location_classification': data.get('locationClassificationId'),
|
|
152
|
+
'location_choice': data.get('locationChoiceId'),
|
|
153
|
+
'morphology_classification': data.get('morphologyClassificationId'),
|
|
154
|
+
'morphology_choice': data.get('morphologyChoiceId'),
|
|
155
|
+
'interventions': data.get('interventionIds', []),
|
|
156
|
+
'notes': data.get('notes', ''),
|
|
157
|
+
'created_at': '2024-01-01T00:00:00Z' # Placeholder timestamp
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
logger.info(f"Created video examination for video {video_id} at timestamp {timestamp}")
|
|
161
|
+
return Response(examination_data, status=status.HTTP_201_CREATED)
|
|
162
|
+
|
|
163
|
+
except Exception as e:
|
|
164
|
+
logger.error(f"Unexpected error creating examination: {str(e)}")
|
|
165
|
+
return Response(
|
|
166
|
+
{'error': 'Internal server error while creating examination'},
|
|
167
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
def update(self, request, *args, **kwargs):
|
|
171
|
+
"""
|
|
172
|
+
Update an existing video examination
|
|
173
|
+
PATCH /api/examinations/{id}/
|
|
174
|
+
"""
|
|
175
|
+
from django.db import transaction
|
|
176
|
+
import logging
|
|
177
|
+
|
|
178
|
+
logger = logging.getLogger(__name__)
|
|
179
|
+
|
|
180
|
+
try:
|
|
181
|
+
examination_id = kwargs.get('pk')
|
|
182
|
+
if not examination_id:
|
|
183
|
+
return Response(
|
|
184
|
+
{'error': 'Examination ID is required'},
|
|
185
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
data = request.data
|
|
189
|
+
|
|
190
|
+
# Validate data types for provided fields
|
|
191
|
+
if 'videoId' in data:
|
|
192
|
+
try:
|
|
193
|
+
data['videoId'] = int(data['videoId'])
|
|
194
|
+
except (ValueError, TypeError):
|
|
195
|
+
return Response(
|
|
196
|
+
{'error': 'Invalid videoId format'},
|
|
197
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
if 'timestamp' in data:
|
|
201
|
+
try:
|
|
202
|
+
timestamp = float(data['timestamp'])
|
|
203
|
+
if timestamp < 0:
|
|
204
|
+
return Response(
|
|
205
|
+
{'error': 'Timestamp cannot be negative'},
|
|
206
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
207
|
+
)
|
|
208
|
+
data['timestamp'] = timestamp
|
|
209
|
+
except (ValueError, TypeError):
|
|
210
|
+
return Response(
|
|
211
|
+
{'error': 'Invalid timestamp format'},
|
|
212
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
with transaction.atomic():
|
|
216
|
+
# Validate foreign keys if provided
|
|
217
|
+
if 'videoId' in data:
|
|
218
|
+
try:
|
|
219
|
+
VideoFile.objects.get(id=data['videoId'])
|
|
220
|
+
except VideoFile.DoesNotExist:
|
|
221
|
+
return Response(
|
|
222
|
+
{'error': 'Video not found'},
|
|
223
|
+
status=status.HTTP_404_NOT_FOUND
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
if 'examinationTypeId' in data:
|
|
227
|
+
try:
|
|
228
|
+
examination_type_id = int(data['examinationTypeId'])
|
|
229
|
+
Examination.objects.get(id=examination_type_id)
|
|
230
|
+
except (ValueError, TypeError):
|
|
231
|
+
return Response(
|
|
232
|
+
{'error': 'Invalid examination type ID format'},
|
|
233
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
234
|
+
)
|
|
235
|
+
except Examination.DoesNotExist:
|
|
236
|
+
return Response(
|
|
237
|
+
{'error': 'Examination type not found'},
|
|
238
|
+
status=status.HTTP_404_NOT_FOUND
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
if 'findingId' in data:
|
|
242
|
+
try:
|
|
243
|
+
finding_id = int(data['findingId'])
|
|
244
|
+
Finding.objects.get(id=finding_id)
|
|
245
|
+
except (ValueError, TypeError):
|
|
246
|
+
return Response(
|
|
247
|
+
{'error': 'Invalid finding ID format'},
|
|
248
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
249
|
+
)
|
|
250
|
+
except Finding.DoesNotExist:
|
|
251
|
+
return Response(
|
|
252
|
+
{'error': 'Finding not found'},
|
|
253
|
+
status=status.HTTP_404_NOT_FOUND
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
# Return updated examination data
|
|
257
|
+
examination_data = {
|
|
258
|
+
'id': examination_id,
|
|
259
|
+
'video_id': data.get('videoId'),
|
|
260
|
+
'timestamp': data.get('timestamp'),
|
|
261
|
+
'examination_type': data.get('examinationTypeId'),
|
|
262
|
+
'finding': data.get('findingId'),
|
|
263
|
+
'location_classification': data.get('locationClassificationId'),
|
|
264
|
+
'location_choice': data.get('locationChoiceId'),
|
|
265
|
+
'morphology_classification': data.get('morphologyClassificationId'),
|
|
266
|
+
'morphology_choice': data.get('morphologyChoiceId'),
|
|
267
|
+
'interventions': data.get('interventionIds', []),
|
|
268
|
+
'notes': data.get('notes', ''),
|
|
269
|
+
'updated_at': '2024-01-01T00:00:00Z' # Placeholder timestamp
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
logger.info(f"Updated video examination {examination_id}")
|
|
273
|
+
return Response(examination_data, status=status.HTTP_200_OK)
|
|
274
|
+
|
|
275
|
+
except Exception as e:
|
|
276
|
+
logger.error(f"Unexpected error updating examination {examination_id}: {str(e)}")
|
|
277
|
+
return Response(
|
|
278
|
+
{'error': 'Internal server error while updating examination'},
|
|
279
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
def destroy(self, request, *args, **kwargs):
|
|
283
|
+
"""
|
|
284
|
+
Delete a video examination
|
|
285
|
+
DELETE /api/examinations/{id}/
|
|
286
|
+
"""
|
|
287
|
+
from django.db import transaction
|
|
288
|
+
import logging
|
|
289
|
+
|
|
290
|
+
logger = logging.getLogger(__name__)
|
|
291
|
+
|
|
292
|
+
try:
|
|
293
|
+
examination_id = kwargs.get('pk')
|
|
294
|
+
if not examination_id:
|
|
295
|
+
return Response(
|
|
296
|
+
{'error': 'Examination ID is required'},
|
|
297
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
# Validate examination_id format
|
|
301
|
+
try:
|
|
302
|
+
# For now, we're using string IDs, so just validate it's not empty
|
|
303
|
+
if not str(examination_id).strip():
|
|
304
|
+
return Response(
|
|
305
|
+
{'error': 'Invalid examination ID format'},
|
|
306
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
307
|
+
)
|
|
308
|
+
except (ValueError, TypeError):
|
|
309
|
+
return Response(
|
|
310
|
+
{'error': 'Invalid examination ID format'},
|
|
311
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
with transaction.atomic():
|
|
315
|
+
# For now, we simulate successful deletion
|
|
316
|
+
# TODO: Implement actual examination record deletion when persistence is added
|
|
317
|
+
|
|
318
|
+
logger.info(f"Deleted video examination {examination_id}")
|
|
319
|
+
return Response(
|
|
320
|
+
{'message': f'Examination {examination_id} deleted successfully'},
|
|
321
|
+
status=status.HTTP_204_NO_CONTENT
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
except Exception as e:
|
|
325
|
+
logger.error(f"Unexpected error deleting examination {examination_id}: {str(e)}")
|
|
326
|
+
return Response(
|
|
327
|
+
{'error': 'Internal server error while deleting examination'},
|
|
328
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
329
|
+
)
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
from endoreg_db.models import SensitiveMeta, VideoFile
|
|
2
|
+
from endoreg_db.serializers import SensitiveMetaUpdateSerializer
|
|
3
|
+
from endoreg_db.serializers.video.video_file_detail import VideoDetailSerializer
|
|
4
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
5
|
+
from endoreg_db.views.video.segmentation import _stream_video_file
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
from django.db import transaction
|
|
9
|
+
from django.shortcuts import get_object_or_404
|
|
10
|
+
from rest_framework import status
|
|
11
|
+
from rest_framework.response import Response
|
|
12
|
+
from rest_framework.views import APIView
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
|
|
17
|
+
import logging
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class VideoMediaView(APIView):
|
|
22
|
+
"""
|
|
23
|
+
One endpoint that does
|
|
24
|
+
GET /api/media/videos/ → next video meta
|
|
25
|
+
GET /api/media/videos/?last_id=7
|
|
26
|
+
GET /api/media/videos/42/ → meta for id 42
|
|
27
|
+
GET /api/media/videos/42/ (Accept≠JSON) → byte‐range stream
|
|
28
|
+
PATCH /api/media/videos/42/ → update sensitive meta and handle raw file deletion
|
|
29
|
+
"""
|
|
30
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
31
|
+
|
|
32
|
+
# ---------- GET ----------
|
|
33
|
+
def get(self, request, pk=None):
|
|
34
|
+
# Prüfe explizit auf Streaming-Anfrage via Query-Parameter
|
|
35
|
+
wants_stream = request.query_params.get("stream") is not None or request.query_params.get("type") is not None
|
|
36
|
+
|
|
37
|
+
if pk and wants_stream: # STREAM
|
|
38
|
+
vf = get_object_or_404(VideoFile, pk=pk)
|
|
39
|
+
file_type = (request.query_params.get("type") or "auto").lower()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
return _stream_video_file(
|
|
43
|
+
vf,
|
|
44
|
+
os.getenv("FRONTEND_ORIGIN", "*"),
|
|
45
|
+
file_type
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
# META (list or single) - nur wenn kein Streaming gewünscht
|
|
49
|
+
if pk: # detail JSON
|
|
50
|
+
vf = get_object_or_404(VideoFile, pk=pk)
|
|
51
|
+
else:
|
|
52
|
+
last_id = request.query_params.get("last_id")
|
|
53
|
+
if last_id is not None:
|
|
54
|
+
try:
|
|
55
|
+
last_id = int(last_id)
|
|
56
|
+
except (ValueError, TypeError):
|
|
57
|
+
return Response(
|
|
58
|
+
{"error": "Invalid last_id parameter"},
|
|
59
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
60
|
+
)
|
|
61
|
+
vf = VideoFile.objects.next_after(last_id)
|
|
62
|
+
if not vf:
|
|
63
|
+
return Response({"error": "No more videos"}, status=404)
|
|
64
|
+
|
|
65
|
+
ser = VideoDetailSerializer(vf, context={"request": request})
|
|
66
|
+
return Response(ser.data, status=status.HTTP_200_OK)
|
|
67
|
+
|
|
68
|
+
# ---------- PATCH ----------
|
|
69
|
+
@transaction.atomic
|
|
70
|
+
def patch(self, request, pk=None):
|
|
71
|
+
sm_id = request.data.get("sensitive_meta_id")
|
|
72
|
+
if not sm_id:
|
|
73
|
+
return Response(
|
|
74
|
+
{"error": "sensitive_meta_id is required"},
|
|
75
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
76
|
+
)
|
|
77
|
+
try:
|
|
78
|
+
sm_id = int(sm_id)
|
|
79
|
+
except (ValueError, TypeError):
|
|
80
|
+
return Response(
|
|
81
|
+
{"error": "Invalid sensitive_meta_id"},
|
|
82
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
sm = get_object_or_404(SensitiveMeta, pk=sm_id)
|
|
86
|
+
|
|
87
|
+
# Check if this is a validation acceptance (is_verified being set to True)
|
|
88
|
+
is_accepting_validation = request.data.get("is_verified", False)
|
|
89
|
+
delete_raw_files = request.data.get("delete_raw_files", False)
|
|
90
|
+
|
|
91
|
+
# If user is accepting validation, automatically set delete_raw_files to True
|
|
92
|
+
if is_accepting_validation:
|
|
93
|
+
delete_raw_files = True
|
|
94
|
+
logger.info(f"Validation accepted for SensitiveMeta {sm_id}, marking raw files for deletion")
|
|
95
|
+
|
|
96
|
+
ser = SensitiveMetaUpdateSerializer(sm, data=request.data, partial=True)
|
|
97
|
+
ser.is_valid(raise_exception=True)
|
|
98
|
+
updated_sm = ser.save()
|
|
99
|
+
|
|
100
|
+
# Handle raw file deletion if requested or if validation was accepted
|
|
101
|
+
if delete_raw_files and updated_sm.is_verified:
|
|
102
|
+
try:
|
|
103
|
+
# Find associated video file
|
|
104
|
+
video_file = VideoFile.objects.filter(sensitive_meta=updated_sm).first()
|
|
105
|
+
if video_file:
|
|
106
|
+
self._schedule_raw_file_deletion(video_file)
|
|
107
|
+
logger.info(f"Scheduled raw file deletion for video {video_file.uuid}")
|
|
108
|
+
else:
|
|
109
|
+
logger.warning(f"No video file found for SensitiveMeta {sm_id}")
|
|
110
|
+
except Exception as e:
|
|
111
|
+
logger.error(f"Error scheduling raw file deletion for SensitiveMeta {sm_id}: {e}")
|
|
112
|
+
# Don't fail the entire request if deletion scheduling fails
|
|
113
|
+
|
|
114
|
+
return Response(ser.data, status=status.HTTP_200_OK)
|
|
115
|
+
|
|
116
|
+
def _schedule_raw_file_deletion(self, video_file):
|
|
117
|
+
"""
|
|
118
|
+
Schedule deletion of raw video file after validation acceptance.
|
|
119
|
+
Uses the existing cleanup mechanism from the anonymization pipeline.
|
|
120
|
+
"""
|
|
121
|
+
try:
|
|
122
|
+
# Import here to avoid circular imports
|
|
123
|
+
from django.db import transaction
|
|
124
|
+
|
|
125
|
+
def cleanup_raw_files():
|
|
126
|
+
"""Cleanup function to be called after transaction commit"""
|
|
127
|
+
try:
|
|
128
|
+
if hasattr(video_file, 'raw_video_file') and video_file.raw_video_file:
|
|
129
|
+
raw_file = video_file.raw_video_file
|
|
130
|
+
if raw_file.file and os.path.exists(raw_file.file.path):
|
|
131
|
+
logger.info(f"Deleting raw video file: {raw_file.file.path}")
|
|
132
|
+
os.remove(raw_file.file.path)
|
|
133
|
+
raw_file.file = None
|
|
134
|
+
raw_file.save()
|
|
135
|
+
logger.info(f"Successfully deleted raw video file for video {video_file.uuid}")
|
|
136
|
+
else:
|
|
137
|
+
logger.info(f"Raw video file already deleted or not found for video {video_file.uuid}")
|
|
138
|
+
else:
|
|
139
|
+
logger.info(f"No raw video file found for video {video_file.uuid}")
|
|
140
|
+
|
|
141
|
+
# Also delete any associated raw frames if they exist
|
|
142
|
+
if hasattr(video_file, 'raw_frames_dir'):
|
|
143
|
+
frames_dir = getattr(video_file, 'raw_frames_dir', None)
|
|
144
|
+
if frames_dir and os.path.exists(frames_dir):
|
|
145
|
+
import shutil
|
|
146
|
+
logger.info(f"Deleting raw frames directory: {frames_dir}")
|
|
147
|
+
shutil.rmtree(frames_dir)
|
|
148
|
+
logger.info(f"Successfully deleted raw frames for video {video_file.uuid}")
|
|
149
|
+
|
|
150
|
+
except Exception as e:
|
|
151
|
+
logger.error(f"Error during raw file cleanup for video {video_file.uuid}: {e}")
|
|
152
|
+
|
|
153
|
+
# Schedule cleanup after transaction commits
|
|
154
|
+
transaction.on_commit(cleanup_raw_files)
|
|
155
|
+
|
|
156
|
+
except Exception as e:
|
|
157
|
+
logger.error(f"Error scheduling raw file deletion for video {video_file.uuid}: {e}")
|
|
158
|
+
raise
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from endoreg_db.models import VideoFile
|
|
2
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
from django.shortcuts import get_object_or_404
|
|
6
|
+
from rest_framework import status
|
|
7
|
+
from rest_framework.response import Response
|
|
8
|
+
from rest_framework.views import APIView
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class VideoMetadataView(APIView):
|
|
12
|
+
"""
|
|
13
|
+
GET /api/video-metadata/{id}/ - Get video metadata including sensitivity analysis
|
|
14
|
+
"""
|
|
15
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
16
|
+
|
|
17
|
+
def get(self, request, pk):
|
|
18
|
+
video = get_object_or_404(VideoFile, pk=pk)
|
|
19
|
+
|
|
20
|
+
# Get or calculate metadata
|
|
21
|
+
metadata = {
|
|
22
|
+
'sensitiveFrameCount': getattr(video, 'sensitive_frame_count', None),
|
|
23
|
+
'totalFrames': getattr(video, 'total_frames', None),
|
|
24
|
+
'sensitiveRatio': getattr(video, 'sensitive_ratio', None),
|
|
25
|
+
'duration': getattr(video, 'duration', None),
|
|
26
|
+
'resolution': getattr(video, 'resolution', None),
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return Response(metadata, status=status.HTTP_200_OK)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from endoreg_db.models import VideoFile
|
|
2
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
from django.shortcuts import get_object_or_404
|
|
6
|
+
from rest_framework import status
|
|
7
|
+
from rest_framework.response import Response
|
|
8
|
+
from rest_framework.views import APIView
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class VideoProcessingHistoryView(APIView):
|
|
12
|
+
"""
|
|
13
|
+
GET /api/video-processing-history/{id}/ - Get processing history for a video
|
|
14
|
+
"""
|
|
15
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
16
|
+
|
|
17
|
+
def get(self, request, pk):
|
|
18
|
+
_video = get_object_or_404(VideoFile, pk=pk)
|
|
19
|
+
|
|
20
|
+
# For now, return empty history - can be extended with actual history tracking
|
|
21
|
+
#TODO plan when to implement this
|
|
22
|
+
history = []
|
|
23
|
+
|
|
24
|
+
return Response(history, status=status.HTTP_200_OK)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from endoreg_db.models import VideoFile
|
|
2
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
from django.shortcuts import get_object_or_404
|
|
6
|
+
from rest_framework import status
|
|
7
|
+
from rest_framework.response import Response
|
|
8
|
+
from rest_framework.views import APIView
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class VideoRemoveFramesView(APIView):
|
|
12
|
+
"""
|
|
13
|
+
POST /api/video-remove-frames/{id}/ - Remove frames from video using streaming processing
|
|
14
|
+
"""
|
|
15
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
16
|
+
|
|
17
|
+
def post(self, request, pk):
|
|
18
|
+
video = get_object_or_404(VideoFile, pk=pk)
|
|
19
|
+
|
|
20
|
+
selection_method = request.data.get('selection_method', 'automatic')
|
|
21
|
+
detection_engine = request.data.get('detection_engine', 'minicpm')
|
|
22
|
+
use_streaming = request.data.get('use_streaming', True)
|
|
23
|
+
manual_frames = request.data.get('manual_frames')
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
# Start async task for frame removal
|
|
27
|
+
from endoreg_db.tasks.video_processing_tasks import remove_video_frames_task
|
|
28
|
+
|
|
29
|
+
task_data = {
|
|
30
|
+
'video_id': pk,
|
|
31
|
+
'selection_method': selection_method,
|
|
32
|
+
'detection_engine': detection_engine,
|
|
33
|
+
'use_streaming': use_streaming,
|
|
34
|
+
'manual_frames': manual_frames
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
task = remove_video_frames_task.delay(**task_data)
|
|
38
|
+
|
|
39
|
+
return Response(
|
|
40
|
+
{"task_id": task.id, "status": "started"},
|
|
41
|
+
status=status.HTTP_202_ACCEPTED
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
except Exception as e:
|
|
45
|
+
return Response(
|
|
46
|
+
{"error": f"Failed to start frame removal task: {str(e)}"},
|
|
47
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
48
|
+
)
|