endoreg-db 0.8.9.32__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/__init__.py +0 -0
- endoreg_db/_version.py +34 -0
- endoreg_db/admin.py +97 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +17 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/authz/auth.py +78 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +20 -0
- endoreg_db/authz/middleware.py +84 -0
- endoreg_db/authz/permissions.py +138 -0
- endoreg_db/authz/policy.py +224 -0
- endoreg_db/authz/settings.py +64 -0
- endoreg_db/authz/views_auth.py +70 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +99 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +106 -0
- endoreg_db/config/settings/__init__.py +6 -0
- endoreg_db/config/settings/base.py +148 -0
- endoreg_db/config/settings/case_gen.py +32 -0
- endoreg_db/config/settings/dev.py +108 -0
- endoreg_db/config/settings/keycloak.py +177 -0
- endoreg_db/config/settings/prod.py +66 -0
- endoreg_db/config/settings/test.py +72 -0
- endoreg_db/data/__init__.py +135 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +99 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +172 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +5 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +359 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +90 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +97 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/00_generic.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_baseline.yaml +23 -0
- endoreg_db/data/finding_classification_choice/00_generic_complication.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_histology.yaml +21 -0
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_bowel_preparation.yaml +49 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_generic.yaml +19 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_histology.yaml +20 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_location.yaml +248 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_morphology.yaml +75 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/00_generic.yaml +53 -0
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_type/data.yaml +39 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- endoreg_db/data/requirement/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement/old/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/old/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/old/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/old/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/old/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/old/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/old/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/old/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/old/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/old/gender.yaml +0 -0
- endoreg_db/data/requirement/old/lab_value.yaml +441 -0
- endoreg_db/data/requirement/old/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/_old/age.yaml +13 -0
- endoreg_db/data/requirement_operator/_old/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/_old/model_operators.yaml +96 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +65 -0
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set_type/data.yaml +41 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +32 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +24 -0
- endoreg_db/export/frames/export.py +6 -0
- endoreg_db/export/frames/export_frames_with_labels.py +616 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +4 -0
- endoreg_db/forms/examination_form.py +12 -0
- endoreg_db/forms/patient_finding_intervention_form.py +40 -0
- endoreg_db/forms/patient_form.py +23 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +11 -0
- endoreg_db/forms/unit.py +7 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +48 -0
- endoreg_db/helpers/data_loader.py +280 -0
- endoreg_db/helpers/default_objects.py +414 -0
- endoreg_db/helpers/download_segmentation_model.py +32 -0
- endoreg_db/helpers/interact.py +1 -0
- endoreg_db/helpers/test_video_helper.py +127 -0
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +83 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +42 -0
- endoreg_db/import_files/context/validate_directories.py +57 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +99 -0
- endoreg_db/import_files/file_storage/create_video_file.py +104 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +42 -0
- endoreg_db/import_files/file_storage/state_management.py +463 -0
- endoreg_db/import_files/file_storage/storage.py +42 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +99 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/pseudonymization/__init__.py +0 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +181 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +139 -0
- endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
- endoreg_db/import_files/report_import_service.py +147 -0
- endoreg_db/import_files/video_import_service.py +154 -0
- endoreg_db/logger_conf.py +156 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +132 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +177 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +419 -0
- endoreg_db/management/commands/export_frame_annot.py +196 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +206 -0
- endoreg_db/management/commands/fix_video_paths.py +186 -0
- endoreg_db/management/commands/import_report.py +361 -0
- endoreg_db/management/commands/list_routes.py +20 -0
- endoreg_db/management/commands/load_ai_model_data.py +83 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +60 -0
- endoreg_db/management/commands/load_base_db_data.py +63 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +39 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +38 -0
- endoreg_db/management/commands/load_disease_classification_data.py +38 -0
- endoreg_db/management/commands/load_disease_data.py +59 -0
- endoreg_db/management/commands/load_distribution_data.py +63 -0
- endoreg_db/management/commands/load_endoscope_data.py +58 -0
- endoreg_db/management/commands/load_event_data.py +39 -0
- endoreg_db/management/commands/load_examination_data.py +78 -0
- endoreg_db/management/commands/load_examination_indication_data.py +85 -0
- endoreg_db/management/commands/load_finding_data.py +115 -0
- endoreg_db/management/commands/load_gender_data.py +37 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +142 -0
- endoreg_db/management/commands/load_information_source.py +46 -0
- endoreg_db/management/commands/load_lab_value_data.py +52 -0
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_medication_data.py +104 -0
- endoreg_db/management/commands/load_name_data.py +36 -0
- endoreg_db/management/commands/load_organ_data.py +39 -0
- endoreg_db/management/commands/load_pdf_type_data.py +58 -0
- endoreg_db/management/commands/load_profession_data.py +40 -0
- endoreg_db/management/commands/load_qualification_data.py +56 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +40 -0
- endoreg_db/management/commands/load_requirement_data.py +207 -0
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +57 -0
- endoreg_db/management/commands/load_shift_data.py +57 -0
- endoreg_db/management/commands/load_tag_data.py +54 -0
- endoreg_db/management/commands/load_unit_data.py +40 -0
- endoreg_db/management/commands/load_user_groups.py +26 -0
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +70 -0
- endoreg_db/management/commands/setup_endoreg_db.py +459 -0
- endoreg_db/management/commands/start_filewatcher.py +115 -0
- endoreg_db/management/commands/storage_management.py +622 -0
- endoreg_db/management/commands/summarize_db_content.py +280 -0
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +189 -0
- endoreg_db/management/commands/video_validation.py +20 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1953 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +322 -0
- endoreg_db/models/administration/__init__.py +95 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +180 -0
- endoreg_db/models/administration/ai/model_type.py +42 -0
- endoreg_db/models/administration/case/__init__.py +5 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +3 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +85 -0
- endoreg_db/models/administration/center/center_product.py +67 -0
- endoreg_db/models/administration/center/center_resource.py +69 -0
- endoreg_db/models/administration/center/center_shift.py +94 -0
- endoreg_db/models/administration/center/center_waste.py +42 -0
- endoreg_db/models/administration/person/__init__.py +26 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +40 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +44 -0
- endoreg_db/models/administration/person/employee/employee_type.py +50 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +64 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +20 -0
- endoreg_db/models/administration/person/names/last_name.py +20 -0
- endoreg_db/models/administration/person/patient/__init__.py +7 -0
- endoreg_db/models/administration/person/patient/patient.py +488 -0
- endoreg_db/models/administration/person/patient/patient_external_id.py +36 -0
- endoreg_db/models/administration/person/person.py +35 -0
- endoreg_db/models/administration/person/profession/__init__.py +28 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +41 -0
- endoreg_db/models/administration/product/__init__.py +15 -0
- endoreg_db/models/administration/product/product.py +106 -0
- endoreg_db/models/administration/product/product_group.py +41 -0
- endoreg_db/models/administration/product/product_material.py +60 -0
- endoreg_db/models/administration/product/product_weight.py +51 -0
- endoreg_db/models/administration/product/reference_product.py +147 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +43 -0
- endoreg_db/models/administration/qualification/qualification_type.py +39 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +72 -0
- endoreg_db/models/administration/shift/shift.py +57 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +23 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +85 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +61 -0
- endoreg_db/models/label/label.py +91 -0
- endoreg_db/models/label/label_set.py +68 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +42 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +611 -0
- endoreg_db/models/label/video_segmentation_label.py +35 -0
- endoreg_db/models/label/video_segmentation_labelset.py +28 -0
- endoreg_db/models/media/__init__.py +23 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +137 -0
- endoreg_db/models/media/pdf/__init__.py +12 -0
- endoreg_db/models/media/pdf/raw_pdf.py +764 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +85 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +46 -0
- endoreg_db/models/media/video/__init__.py +9 -0
- endoreg_db/models/media/video/create_from_file.py +402 -0
- endoreg_db/models/media/video/pipe_1.py +258 -0
- endoreg_db/models/media/video/pipe_2.py +129 -0
- endoreg_db/models/media/video/video_file.py +907 -0
- endoreg_db/models/media/video/video_file_ai.py +828 -0
- endoreg_db/models/media/video/video_file_anonymize.py +524 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +49 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +25 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +126 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +233 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +36 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +13 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +24 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +40 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +44 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +30 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +205 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +228 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +107 -0
- endoreg_db/models/media/video/video_file_io.py +272 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +58 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +62 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +183 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +198 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +178 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +105 -0
- endoreg_db/models/media/video/video_file_segments.py +317 -0
- endoreg_db/models/media/video/video_metadata.py +67 -0
- endoreg_db/models/media/video/video_processing.py +192 -0
- endoreg_db/models/medical/__init__.py +136 -0
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +29 -0
- endoreg_db/models/medical/disease.py +174 -0
- endoreg_db/models/medical/event.py +154 -0
- endoreg_db/models/medical/examination/__init__.py +20 -0
- endoreg_db/models/medical/examination/examination.py +183 -0
- endoreg_db/models/medical/examination/examination_indication.py +229 -0
- endoreg_db/models/medical/examination/examination_time.py +68 -0
- endoreg_db/models/medical/examination/examination_time_type.py +44 -0
- endoreg_db/models/medical/examination/examination_type.py +47 -0
- endoreg_db/models/medical/finding/__init__.py +20 -0
- endoreg_db/models/medical/finding/finding.py +113 -0
- endoreg_db/models/medical/finding/finding_classification.py +131 -0
- endoreg_db/models/medical/finding/finding_intervention.py +68 -0
- endoreg_db/models/medical/finding/finding_type.py +38 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +77 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +490 -0
- endoreg_db/models/medical/medication/__init__.py +23 -0
- endoreg_db/models/medical/medication/medication.py +45 -0
- endoreg_db/models/medical/medication/medication_indication.py +78 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +58 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +58 -0
- endoreg_db/models/medical/medication/medication_schedule.py +58 -0
- endoreg_db/models/medical/organ/__init__.py +38 -0
- endoreg_db/models/medical/patient/__init__.py +48 -0
- endoreg_db/models/medical/patient/medication_examples.py +56 -0
- endoreg_db/models/medical/patient/patient_disease.py +72 -0
- endoreg_db/models/medical/patient/patient_event.py +80 -0
- endoreg_db/models/medical/patient/patient_examination.py +280 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +57 -0
- endoreg_db/models/medical/patient/patient_finding.py +416 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +231 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +37 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +157 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +247 -0
- endoreg_db/models/medical/patient/patient_medication.py +111 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +152 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +73 -0
- endoreg_db/models/medical/risk/risk_type.py +54 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/model_meta.py +266 -0
- endoreg_db/models/metadata/model_meta_logic.py +485 -0
- endoreg_db/models/metadata/pdf_meta.py +96 -0
- endoreg_db/models/metadata/sensitive_meta.py +345 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1161 -0
- endoreg_db/models/metadata/video_meta.py +459 -0
- endoreg_db/models/metadata/video_prediction_logic.py +232 -0
- endoreg_db/models/metadata/video_prediction_meta.py +319 -0
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +46 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +22 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +163 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +50 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +211 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +23 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +110 -0
- endoreg_db/models/other/gender.py +32 -0
- endoreg_db/models/other/information_source.py +190 -0
- endoreg_db/models/other/material.py +34 -0
- endoreg_db/models/other/resource.py +24 -0
- endoreg_db/models/other/tag.py +32 -0
- endoreg_db/models/other/transport_route.py +40 -0
- endoreg_db/models/other/unit.py +40 -0
- endoreg_db/models/other/waste.py +28 -0
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +5 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +792 -0
- endoreg_db/models/requirement/requirement_error.py +84 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +137 -0
- endoreg_db/models/requirement/requirement_operator.py +187 -0
- endoreg_db/models/requirement/requirement_set.py +327 -0
- endoreg_db/models/state/__init__.py +13 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/anonymization.py +30 -0
- endoreg_db/models/state/audit_ledger.py +155 -0
- endoreg_db/models/state/label_video_segment.py +31 -0
- endoreg_db/models/state/processing_history/__init__.py +3 -0
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +219 -0
- endoreg_db/models/state/sensitive_meta.py +50 -0
- endoreg_db/models/state/video.py +251 -0
- endoreg_db/models/upload_job.py +100 -0
- endoreg_db/models/utils.py +138 -0
- endoreg_db/queries/__init__.py +3 -0
- endoreg_db/queries/annotations/__init__.py +1 -0
- endoreg_db/queries/annotations/legacy.py +169 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/root_urls.py +27 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +30 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +861 -0
- endoreg_db/serializers/__init__.py +104 -0
- endoreg_db/serializers/administration/__init__.py +13 -0
- endoreg_db/serializers/administration/ai/__init__.py +9 -0
- endoreg_db/serializers/administration/ai/active_model.py +12 -0
- endoreg_db/serializers/administration/ai/ai_model.py +20 -0
- endoreg_db/serializers/administration/ai/model_type.py +12 -0
- endoreg_db/serializers/administration/center.py +14 -0
- endoreg_db/serializers/administration/gender.py +11 -0
- endoreg_db/serializers/anonymization.py +77 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +45 -0
- endoreg_db/serializers/examination/dropdown.py +20 -0
- endoreg_db/serializers/examination_serializer.py +9 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +61 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +11 -0
- endoreg_db/serializers/label_video_segment/__init__.py +9 -0
- endoreg_db/serializers/label_video_segment/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/label_video_segment/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +427 -0
- endoreg_db/serializers/meta/__init__.py +13 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +122 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +153 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +62 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +72 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +144 -0
- endoreg_db/serializers/misc/stats.py +35 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +74 -0
- endoreg_db/serializers/patient/__init__.py +12 -0
- endoreg_db/serializers/patient/patient.py +103 -0
- endoreg_db/serializers/patient/patient_dropdown.py +35 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +168 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +32 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +47 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +62 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +28 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +40 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +135 -0
- endoreg_db/serializers/pdf/__init__.py +3 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +101 -0
- endoreg_db/serializers/requirements/requirement_schema.py +20 -0
- endoreg_db/serializers/requirements/requirement_sets.py +99 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +301 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/video_file.py +283 -0
- endoreg_db/serializers/video/video_file_brief.py +14 -0
- endoreg_db/serializers/video/video_file_detail.py +96 -0
- endoreg_db/serializers/video/video_file_list.py +100 -0
- endoreg_db/serializers/video/video_processing_history.py +172 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +274 -0
- endoreg_db/services/examination_evaluation.py +172 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +424 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/pdf_import.py +0 -0
- endoreg_db/services/polling_coordinator.py +319 -0
- endoreg_db/services/pseudonym_service.py +94 -0
- endoreg_db/services/report_import.py +13 -0
- endoreg_db/services/segment_sync.py +171 -0
- endoreg_db/services/video_import.py +9 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +56 -0
- endoreg_db/urls/ai.py +14 -0
- endoreg_db/urls/anonymization.py +78 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +34 -0
- endoreg_db/urls/examination.py +63 -0
- endoreg_db/urls/media.py +251 -0
- endoreg_db/urls/patient.py +23 -0
- endoreg_db/urls/requirements.py +15 -0
- endoreg_db/urls/root_urls.py +28 -0
- endoreg_db/urls/stats.py +54 -0
- endoreg_db/urls/upload.py +12 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +97 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
- endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
- endoreg_db/utils/ai/get.py +6 -0
- endoreg_db/utils/ai/inference_dataset.py +51 -0
- endoreg_db/utils/ai/model_training/config.py +117 -0
- endoreg_db/utils/ai/model_training/dataset.py +74 -0
- endoreg_db/utils/ai/model_training/losses.py +68 -0
- endoreg_db/utils/ai/model_training/metrics.py +78 -0
- endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
- endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
- endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +270 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +293 -0
- endoreg_db/utils/ai/preprocess.py +76 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +32 -0
- endoreg_db/utils/check_video_files.py +175 -0
- endoreg_db/utils/cropping.py +30 -0
- endoreg_db/utils/dataloader.py +285 -0
- endoreg_db/utils/dates.py +59 -0
- endoreg_db/utils/defaults/set_default_center.py +33 -0
- endoreg_db/utils/env.py +37 -0
- endoreg_db/utils/extract_specific_frames.py +87 -0
- endoreg_db/utils/file_operations.py +70 -0
- endoreg_db/utils/fix_video_path_direct.py +157 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +138 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +237 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +82 -0
- endoreg_db/utils/ocr.py +195 -0
- endoreg_db/utils/operation_log.py +87 -0
- endoreg_db/utils/parse_and_generate_yaml.py +45 -0
- endoreg_db/utils/paths.py +159 -0
- endoreg_db/utils/permissions.py +160 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +144 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +22 -0
- endoreg_db/utils/product/sum_weights.py +20 -0
- endoreg_db/utils/pydantic_models/__init__.py +5 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +678 -0
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +842 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +114 -0
- endoreg_db/utils/setup_config.py +196 -0
- endoreg_db/utils/storage.py +117 -0
- endoreg_db/utils/translation.py +31 -0
- endoreg_db/utils/uuid.py +5 -0
- endoreg_db/utils/validate_endo_roi.py +33 -0
- endoreg_db/utils/validate_subcategory_dict.py +93 -0
- endoreg_db/utils/validate_video_detailed.py +415 -0
- endoreg_db/utils/video/__init__.py +30 -0
- endoreg_db/utils/video/extract_frames.py +100 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +996 -0
- endoreg_db/utils/video/names.py +47 -0
- endoreg_db/utils/video/streaming_processor.py +386 -0
- endoreg_db/utils/video/video_splitter.py +105 -0
- endoreg_db/versioning.md +79 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +247 -0
- endoreg_db/views/__init__.py +157 -0
- endoreg_db/views/anonymization/__init__.py +31 -0
- endoreg_db/views/anonymization/media_management.py +486 -0
- endoreg_db/views/anonymization/overview.py +307 -0
- endoreg_db/views/anonymization/validate.py +310 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +146 -0
- endoreg_db/views/examination/__init__.py +30 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +62 -0
- endoreg_db/views/examination/get_finding_classifications.py +38 -0
- endoreg_db/views/examination/get_findings.py +39 -0
- endoreg_db/views/examination/get_instruments.py +19 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +116 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +41 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +54 -0
- endoreg_db/views/media/__init__.py +32 -0
- endoreg_db/views/media/pdf_media.py +411 -0
- endoreg_db/views/media/sensitive_metadata.py +372 -0
- endoreg_db/views/media/video_media.py +275 -0
- endoreg_db/views/meta/__init__.py +7 -0
- endoreg_db/views/meta/sensitive_meta_list.py +102 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +74 -0
- endoreg_db/views/misc/__init__.py +29 -0
- endoreg_db/views/misc/center.py +14 -0
- endoreg_db/views/misc/csrf.py +8 -0
- endoreg_db/views/misc/gender.py +15 -0
- endoreg_db/views/misc/stats.py +255 -0
- endoreg_db/views/misc/upload_views.py +241 -0
- endoreg_db/views/patient/__init__.py +3 -0
- endoreg_db/views/patient/patient.py +253 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +141 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +58 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +72 -0
- endoreg_db/views/patient_examination/video.py +228 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +71 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +291 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +75 -0
- endoreg_db/views/report/__init__.py +7 -0
- endoreg_db/views/report/reimport.py +177 -0
- endoreg_db/views/report/report_stream.py +191 -0
- endoreg_db/views/requirement/__init__.py +11 -0
- endoreg_db/views/requirement/evaluate.py +278 -0
- endoreg_db/views/requirement/lookup.py +380 -0
- endoreg_db/views/requirement/lookup_store.py +183 -0
- endoreg_db/views/requirement/requirement_utils.py +87 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +266 -0
- endoreg_db/views/video/__init__.py +49 -0
- endoreg_db/views/video/ai/__init__.py +8 -0
- endoreg_db/views/video/ai/label.py +159 -0
- endoreg_db/views/video/correction.py +529 -0
- endoreg_db/views/video/reimport.py +230 -0
- endoreg_db/views/video/segments_crud.py +709 -0
- endoreg_db/views/video/video_apply_mask.py +49 -0
- endoreg_db/views/video/video_correction.py +22 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_metadata.py +101 -0
- endoreg_db/views/video/video_processing_history.py +25 -0
- endoreg_db/views/video/video_remove_frames.py +49 -0
- endoreg_db/views/video/video_stream.py +334 -0
- endoreg_db-0.8.9.32.dist-info/METADATA +404 -0
- endoreg_db-0.8.9.32.dist-info/RECORD +787 -0
- endoreg_db-0.8.9.32.dist-info/WHEEL +4 -0
- endoreg_db-0.8.9.32.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,49 @@
|
|
|
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 VideoApplyMaskView(APIView):
|
|
12
|
+
"""
|
|
13
|
+
POST /api/video-apply-mask/{id}/ - Apply mask to video using streaming processing
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
17
|
+
|
|
18
|
+
def post(self, request, pk):
|
|
19
|
+
video = get_object_or_404(VideoFile, pk=pk)
|
|
20
|
+
|
|
21
|
+
mask_type = request.data.get("mask_type", "device_default")
|
|
22
|
+
device_name = request.data.get("device_name", "olympus_cv_1500")
|
|
23
|
+
use_streaming = request.data.get("use_streaming", True)
|
|
24
|
+
custom_mask = request.data.get("custom_mask")
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
# Start async task for video masking
|
|
28
|
+
from endoreg_db.tasks.video_processing_tasks import apply_video_mask_task
|
|
29
|
+
|
|
30
|
+
task_data = {
|
|
31
|
+
"video_id": pk,
|
|
32
|
+
"mask_type": mask_type,
|
|
33
|
+
"device_name": device_name,
|
|
34
|
+
"use_streaming": use_streaming,
|
|
35
|
+
"custom_mask": custom_mask,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
task = apply_video_mask_task.delay(**task_data)
|
|
39
|
+
|
|
40
|
+
return Response(
|
|
41
|
+
{"task_id": task.id, "status": "started"},
|
|
42
|
+
status=status.HTTP_202_ACCEPTED,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
except Exception as e:
|
|
46
|
+
return Response(
|
|
47
|
+
{"error": f"Failed to start masking task: {str(e)}"},
|
|
48
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
49
|
+
)
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
|
|
17
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
18
|
+
|
|
19
|
+
def get(self, request, pk):
|
|
20
|
+
video = get_object_or_404(VideoFile, pk=pk)
|
|
21
|
+
ser = VideoDetailSerializer(video, context={"request": request})
|
|
22
|
+
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
|
+
|
|
17
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
18
|
+
|
|
19
|
+
def get(self, request, pk):
|
|
20
|
+
# Remove unused 'video' variable
|
|
21
|
+
output_path = request.query_params.get("path")
|
|
22
|
+
|
|
23
|
+
# Define the allowed base directory for processed videos
|
|
24
|
+
processed_base_dir = os.path.abspath(
|
|
25
|
+
os.getenv("PROCESSED_VIDEO_DIR", "/srv/processed_videos")
|
|
26
|
+
)
|
|
27
|
+
if not output_path:
|
|
28
|
+
return Response(
|
|
29
|
+
{"error": "Processed file not found"}, status=status.HTTP_404_NOT_FOUND
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Resolve the absolute path and check if it's within the allowed directory
|
|
33
|
+
abs_output_path = os.path.abspath(output_path)
|
|
34
|
+
if not abs_output_path.startswith(processed_base_dir + os.sep):
|
|
35
|
+
return Response(
|
|
36
|
+
{"error": "Invalid file path"}, status=status.HTTP_400_BAD_REQUEST
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
if not os.path.exists(abs_output_path):
|
|
40
|
+
return Response(
|
|
41
|
+
{"error": "Processed file not found"}, status=status.HTTP_404_NOT_FOUND
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
from django.http import FileResponse
|
|
46
|
+
|
|
47
|
+
with open(abs_output_path, "rb") as f:
|
|
48
|
+
response = FileResponse(f, content_type="video/mp4")
|
|
49
|
+
response["Content-Disposition"] = (
|
|
50
|
+
f'attachment; filename="{os.path.basename(abs_output_path)}"'
|
|
51
|
+
)
|
|
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,242 @@
|
|
|
1
|
+
# endoreg_db/views/video/video_examination_viewset.py
|
|
2
|
+
"""
|
|
3
|
+
Video Examination ViewSet
|
|
4
|
+
|
|
5
|
+
Provides REST API endpoints for managing video-based patient examinations.
|
|
6
|
+
Handles CRUD operations for PatientExamination records linked to VideoFile instances.
|
|
7
|
+
|
|
8
|
+
**API Endpoints:**
|
|
9
|
+
- GET /api/video-examinations/ - List all video examinations
|
|
10
|
+
- GET /api/video-examinations/{id}/ - Get examination details
|
|
11
|
+
- POST /api/video-examinations/ - Create new examination
|
|
12
|
+
- PATCH /api/video-examinations/{id}/ - Update examination
|
|
13
|
+
- DELETE /api/video-examinations/{id}/ - Delete examination
|
|
14
|
+
- GET /api/video/{video_id}/examinations/ - List examinations for specific video
|
|
15
|
+
|
|
16
|
+
**Frontend Integration:**
|
|
17
|
+
Used by VideoExaminationAnnotation.vue for annotation workflow.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import logging
|
|
21
|
+
|
|
22
|
+
from django.db import transaction
|
|
23
|
+
from django.shortcuts import get_object_or_404
|
|
24
|
+
from rest_framework import status, viewsets
|
|
25
|
+
from rest_framework.decorators import action
|
|
26
|
+
from rest_framework.response import Response
|
|
27
|
+
|
|
28
|
+
from endoreg_db.models import PatientExamination, VideoFile
|
|
29
|
+
|
|
30
|
+
from ...serializers.video_examination import (
|
|
31
|
+
VideoExaminationCreateSerializer,
|
|
32
|
+
VideoExaminationSerializer,
|
|
33
|
+
VideoExaminationUpdateSerializer,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
logger = logging.getLogger(__name__)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class VideoExaminationViewSet(viewsets.ModelViewSet):
|
|
40
|
+
"""
|
|
41
|
+
ViewSet for Video Examination CRUD operations.
|
|
42
|
+
|
|
43
|
+
Provides comprehensive API for managing patient examinations within
|
|
44
|
+
the video annotation workflow. Supports filtering by video, patient,
|
|
45
|
+
and examination type.
|
|
46
|
+
|
|
47
|
+
**Usage Example:**
|
|
48
|
+
```python
|
|
49
|
+
# Frontend (JavaScript)
|
|
50
|
+
// Get examinations for video 123
|
|
51
|
+
const response = await api.get('/api/video/123/examinations/');
|
|
52
|
+
|
|
53
|
+
// Create new examination
|
|
54
|
+
await api.post('/api/video-examinations/', {
|
|
55
|
+
video_id: 123,
|
|
56
|
+
examination_id: 5,
|
|
57
|
+
date_start: '2024-01-15'
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
queryset = PatientExamination.objects.select_related(
|
|
63
|
+
"patient", "examination", "video"
|
|
64
|
+
).prefetch_related("patient_findings")
|
|
65
|
+
serializer_class = VideoExaminationSerializer
|
|
66
|
+
|
|
67
|
+
def get_serializer_class(self):
|
|
68
|
+
"""
|
|
69
|
+
Return appropriate serializer based on action.
|
|
70
|
+
|
|
71
|
+
- create: VideoExaminationCreateSerializer (handles complex creation logic)
|
|
72
|
+
- update/partial_update: VideoExaminationUpdateSerializer
|
|
73
|
+
- list/retrieve: VideoExaminationSerializer (read-only with nested data)
|
|
74
|
+
"""
|
|
75
|
+
if self.action == "create":
|
|
76
|
+
return VideoExaminationCreateSerializer
|
|
77
|
+
elif self.action in ["update", "partial_update"]:
|
|
78
|
+
return VideoExaminationUpdateSerializer
|
|
79
|
+
return VideoExaminationSerializer
|
|
80
|
+
|
|
81
|
+
def get_queryset(self):
|
|
82
|
+
"""
|
|
83
|
+
Filter examinations based on query parameters.
|
|
84
|
+
|
|
85
|
+
**Supported filters:**
|
|
86
|
+
- ?video_id=123 - Get examinations for specific video
|
|
87
|
+
- ?patient_id=456 - Get examinations for specific patient
|
|
88
|
+
- ?examination_id=789 - Get examinations of specific type
|
|
89
|
+
"""
|
|
90
|
+
queryset = super().get_queryset()
|
|
91
|
+
|
|
92
|
+
# Filter by video if provided
|
|
93
|
+
video_id = self.request.query_params.get("video_id")
|
|
94
|
+
if video_id:
|
|
95
|
+
queryset = queryset.filter(video_id=video_id)
|
|
96
|
+
|
|
97
|
+
# Filter by patient if provided
|
|
98
|
+
patient_id = self.request.query_params.get("patient_id")
|
|
99
|
+
if patient_id:
|
|
100
|
+
queryset = queryset.filter(patient_id=patient_id)
|
|
101
|
+
|
|
102
|
+
# Filter by examination type if provided
|
|
103
|
+
examination_id = self.request.query_params.get("examination_id")
|
|
104
|
+
if examination_id:
|
|
105
|
+
queryset = queryset.filter(examination_id=examination_id)
|
|
106
|
+
|
|
107
|
+
return queryset
|
|
108
|
+
|
|
109
|
+
@action(detail=False, methods=["get"], url_path="video/(?P<video_id>[^/.]+)")
|
|
110
|
+
def by_video(self, request, video_id=None):
|
|
111
|
+
"""
|
|
112
|
+
Get all examinations for a specific video.
|
|
113
|
+
|
|
114
|
+
**Endpoint:** GET /api/video-examinations/video/{video_id}/
|
|
115
|
+
**Alternative:** GET /api/video/{video_id}/examinations/
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
video_id: ID of the video
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
200: List of examinations for the video
|
|
122
|
+
404: Video not found
|
|
123
|
+
"""
|
|
124
|
+
# Validate video exists
|
|
125
|
+
video = get_object_or_404(VideoFile, id=video_id)
|
|
126
|
+
|
|
127
|
+
# Get examinations for this video
|
|
128
|
+
examinations = self.queryset.filter(video=video)
|
|
129
|
+
|
|
130
|
+
serializer = self.get_serializer(examinations, many=True)
|
|
131
|
+
return Response(serializer.data)
|
|
132
|
+
|
|
133
|
+
def create(self, request, *args, **kwargs):
|
|
134
|
+
"""
|
|
135
|
+
Create a new video examination.
|
|
136
|
+
|
|
137
|
+
**Endpoint:** POST /api/video-examinations/
|
|
138
|
+
|
|
139
|
+
**Payload:**
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"video_id": 123,
|
|
143
|
+
"examination_id": 5,
|
|
144
|
+
"date_start": "2024-01-15",
|
|
145
|
+
"date_end": "2024-01-15"
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
201: Examination created successfully
|
|
151
|
+
400: Invalid data (missing required fields, validation errors)
|
|
152
|
+
404: Video or examination type not found
|
|
153
|
+
"""
|
|
154
|
+
serializer = self.get_serializer(data=request.data)
|
|
155
|
+
serializer.is_valid(raise_exception=True)
|
|
156
|
+
|
|
157
|
+
try:
|
|
158
|
+
with transaction.atomic():
|
|
159
|
+
patient_exam = serializer.save()
|
|
160
|
+
|
|
161
|
+
# Return created examination with full serialization
|
|
162
|
+
response_serializer = VideoExaminationSerializer(patient_exam)
|
|
163
|
+
logger.info(
|
|
164
|
+
f"Created video examination: video={request.data.get('video_id')}, "
|
|
165
|
+
f"exam={request.data.get('examination_id')}"
|
|
166
|
+
)
|
|
167
|
+
return Response(
|
|
168
|
+
response_serializer.data, status=status.HTTP_201_CREATED
|
|
169
|
+
)
|
|
170
|
+
except Exception as e:
|
|
171
|
+
logger.error(f"Error creating video examination: {str(e)}")
|
|
172
|
+
return Response(
|
|
173
|
+
{"error": "Internal server error while creating examination"},
|
|
174
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
def update(self, request, *args, **kwargs):
|
|
178
|
+
"""
|
|
179
|
+
Update an existing video examination.
|
|
180
|
+
|
|
181
|
+
**Endpoint:** PATCH /api/video-examinations/{id}/
|
|
182
|
+
|
|
183
|
+
**Payload:**
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"examination_id": 6,
|
|
187
|
+
"date_start": "2024-01-16"
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
200: Examination updated successfully
|
|
193
|
+
400: Invalid data
|
|
194
|
+
404: Examination not found
|
|
195
|
+
"""
|
|
196
|
+
partial = kwargs.pop("partial", False)
|
|
197
|
+
instance = self.get_object()
|
|
198
|
+
serializer = self.get_serializer(instance, data=request.data, partial=partial)
|
|
199
|
+
serializer.is_valid(raise_exception=True)
|
|
200
|
+
|
|
201
|
+
try:
|
|
202
|
+
with transaction.atomic():
|
|
203
|
+
patient_exam = serializer.save()
|
|
204
|
+
|
|
205
|
+
# Return updated examination
|
|
206
|
+
response_serializer = VideoExaminationSerializer(patient_exam)
|
|
207
|
+
logger.info(f"Updated video examination {instance.id}")
|
|
208
|
+
return Response(response_serializer.data)
|
|
209
|
+
except Exception as e:
|
|
210
|
+
logger.error(f"Error updating video examination {instance.id}: {str(e)}")
|
|
211
|
+
return Response(
|
|
212
|
+
{"error": "Internal server error while updating examination"},
|
|
213
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
def destroy(self, request, *args, **kwargs):
|
|
217
|
+
"""
|
|
218
|
+
Delete a video examination.
|
|
219
|
+
|
|
220
|
+
**Endpoint:** DELETE /api/video-examinations/{id}/
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
204: Examination deleted successfully
|
|
224
|
+
404: Examination not found
|
|
225
|
+
"""
|
|
226
|
+
instance = self.get_object()
|
|
227
|
+
examination_id = instance.id
|
|
228
|
+
|
|
229
|
+
try:
|
|
230
|
+
with transaction.atomic():
|
|
231
|
+
instance.delete()
|
|
232
|
+
logger.info(f"Deleted video examination {examination_id}")
|
|
233
|
+
return Response(
|
|
234
|
+
{"message": f"Examination {examination_id} deleted successfully"},
|
|
235
|
+
status=status.HTTP_204_NO_CONTENT,
|
|
236
|
+
)
|
|
237
|
+
except Exception as e:
|
|
238
|
+
logger.error(f"Error deleting examination {examination_id}: {str(e)}")
|
|
239
|
+
return Response(
|
|
240
|
+
{"error": "Internal server error while deleting examination"},
|
|
241
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
242
|
+
)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
from endoreg_db.models import VideoFile
|
|
2
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
3
|
+
from django.shortcuts import get_object_or_404
|
|
4
|
+
from rest_framework import status
|
|
5
|
+
from rest_framework.response import Response
|
|
6
|
+
from rest_framework.views import APIView
|
|
7
|
+
|
|
8
|
+
class VideoMetadataStatsView(APIView):
|
|
9
|
+
"""
|
|
10
|
+
GET media/videos/{pk}/metadata/ - Get comprehensive video metadata.
|
|
11
|
+
|
|
12
|
+
Merges logic from:
|
|
13
|
+
1. VideoFile model (duration, fps, resolution)
|
|
14
|
+
2. VideoState model (status, anonymization flags)
|
|
15
|
+
3. Related models (Center, Processor, SensitiveMeta)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
19
|
+
|
|
20
|
+
def get(self, request, pk):
|
|
21
|
+
# Prefetch related fields to avoid N+1 queries since we access them all
|
|
22
|
+
video = get_object_or_404(
|
|
23
|
+
VideoFile.objects.select_related(
|
|
24
|
+
'state',
|
|
25
|
+
'center',
|
|
26
|
+
'processor',
|
|
27
|
+
'video_meta',
|
|
28
|
+
'sensitive_meta'
|
|
29
|
+
),
|
|
30
|
+
pk=pk
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# --- 1. Basic Specs (from VideoFile) ---
|
|
34
|
+
# Use model fields, defaulting if None
|
|
35
|
+
duration = video.duration if video.duration is not None else 0
|
|
36
|
+
fps = video.fps if video.fps is not None else 50
|
|
37
|
+
|
|
38
|
+
resolution = "BLANK"
|
|
39
|
+
if video.width and video.height:
|
|
40
|
+
resolution = f"{video.width}x{video.height}"
|
|
41
|
+
|
|
42
|
+
# --- 2. Status & State (from VideoState) ---
|
|
43
|
+
status_val = "BLANK"
|
|
44
|
+
is_anonymized = False
|
|
45
|
+
|
|
46
|
+
if hasattr(video, 'state') and video.state:
|
|
47
|
+
# anonymization_status returns an Enum, we need the value (string)
|
|
48
|
+
raw_status = video.state.anonymization_status
|
|
49
|
+
status_val = getattr(raw_status, 'value', str(raw_status))
|
|
50
|
+
|
|
51
|
+
# Check logical anonymization state
|
|
52
|
+
is_anonymized = (
|
|
53
|
+
status_val == 'done_processing_anonymization' or
|
|
54
|
+
video.state.anonymized
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# --- 3. Relations (Center / Processor) ---
|
|
58
|
+
center_name = "Unbekannt"
|
|
59
|
+
if video.center:
|
|
60
|
+
center_name = getattr(video.center, 'name', str(video.center))
|
|
61
|
+
|
|
62
|
+
processor_name = "Unbekannt"
|
|
63
|
+
if video.processor:
|
|
64
|
+
processor_name = getattr(video.processor, 'name', str(video.processor))
|
|
65
|
+
|
|
66
|
+
# --- 4. Deep Inference (SensitiveMeta / VideoMeta) ---
|
|
67
|
+
sensitive_count = None
|
|
68
|
+
total_frames = video.frame_count # Direct from VideoFile model
|
|
69
|
+
sensitive_ratio = None
|
|
70
|
+
outside_frame_count = 0
|
|
71
|
+
|
|
72
|
+
outside_segments = video.get_outside_segments(only_validated=False)
|
|
73
|
+
count = outside_segments.count()
|
|
74
|
+
|
|
75
|
+
print(f"Number of outside segments: {count}")
|
|
76
|
+
# Try to get ROI data (from video_meta relation)
|
|
77
|
+
has_roi = False
|
|
78
|
+
if hasattr(video, 'video_meta') and video.video_meta:
|
|
79
|
+
has_roi = getattr(video.video_meta, 'has_roi', False)
|
|
80
|
+
|
|
81
|
+
# --- 5. Construct Response ---
|
|
82
|
+
metadata = {
|
|
83
|
+
# -- Frontend VideoMeta Requirements --
|
|
84
|
+
"id": video.pk,
|
|
85
|
+
"original_file_name": video.original_file_name or f"Video {pk}",
|
|
86
|
+
"status": str(status_val),
|
|
87
|
+
"assignedUser": "BLANK",
|
|
88
|
+
"anonymized": is_anonymized,
|
|
89
|
+
"duration": duration,
|
|
90
|
+
"fps": fps,
|
|
91
|
+
"hasROI": has_roi,
|
|
92
|
+
"outsideFrameCount": outside_frame_count,
|
|
93
|
+
"centerName": center_name,
|
|
94
|
+
"processorName": processor_name,
|
|
95
|
+
"sensitiveFrameCount": sensitive_count,
|
|
96
|
+
"totalFrames": total_frames,
|
|
97
|
+
"sensitiveRatio": sensitive_ratio,
|
|
98
|
+
"resolution": resolution,
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return Response(metadata, status=status.HTTP_200_OK)
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
|
|
16
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
17
|
+
|
|
18
|
+
def get(self, request, pk):
|
|
19
|
+
_video = get_object_or_404(VideoFile, pk=pk)
|
|
20
|
+
|
|
21
|
+
# For now, return empty history - can be extended with actual history tracking
|
|
22
|
+
# TODO plan when to implement this
|
|
23
|
+
history = []
|
|
24
|
+
|
|
25
|
+
return Response(history, status=status.HTTP_200_OK)
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
|
|
16
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
17
|
+
|
|
18
|
+
def post(self, request, pk):
|
|
19
|
+
video = get_object_or_404(VideoFile, pk=pk)
|
|
20
|
+
|
|
21
|
+
selection_method = request.data.get("selection_method", "automatic")
|
|
22
|
+
detection_engine = request.data.get("detection_engine", "minicpm")
|
|
23
|
+
use_streaming = request.data.get("use_streaming", True)
|
|
24
|
+
manual_frames = request.data.get("manual_frames")
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
# Start async task for frame removal
|
|
28
|
+
from endoreg_db.tasks.video_processing_tasks import remove_video_frames_task
|
|
29
|
+
|
|
30
|
+
task_data = {
|
|
31
|
+
"video_id": pk,
|
|
32
|
+
"selection_method": selection_method,
|
|
33
|
+
"detection_engine": detection_engine,
|
|
34
|
+
"use_streaming": use_streaming,
|
|
35
|
+
"manual_frames": manual_frames,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
task = remove_video_frames_task.delay(**task_data)
|
|
39
|
+
|
|
40
|
+
return Response(
|
|
41
|
+
{"task_id": task.id, "status": "started"},
|
|
42
|
+
status=status.HTTP_202_ACCEPTED,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
except Exception as e:
|
|
46
|
+
return Response(
|
|
47
|
+
{"error": f"Failed to start frame removal task: {str(e)}"},
|
|
48
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
49
|
+
)
|