endoreg-db 0.8.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/__init__.py +0 -0
- endoreg_db/admin.py +92 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +18 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +144 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +91 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/examination/examinations/data.yaml +72 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +8 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +105 -0
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +441 -0
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -0
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +8 -0
- endoreg_db/forms/unit.py +6 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +378 -0
- endoreg_db/helpers/download_segmentation_model.py +31 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +423 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +77 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +62 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_data.py +68 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +75 -0
- endoreg_db/management/commands/load_examination_indication_data.py +86 -0
- endoreg_db/management/commands/load_finding_data.py +128 -0
- endoreg_db/management/commands/load_gender_data.py +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
- endoreg_db/management/commands/load_information_source.py +51 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_medication_data.py +103 -0
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_organ_data.py +43 -0
- endoreg_db/management/commands/load_pdf_type_data.py +61 -0
- endoreg_db/management/commands/load_profession_data.py +44 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/load_unit_data.py +46 -0
- endoreg_db/management/commands/load_user_groups.py +28 -0
- endoreg_db/management/commands/register_ai_model.py +64 -0
- endoreg_db/management/commands/reset_celery_schedule.py +9 -0
- endoreg_db/management/commands/setup_endoreg_db.py +381 -0
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1857 -0
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +359 -0
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/administration/ai/model_type.py +41 -0
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +15 -0
- endoreg_db/models/administration/case/case_template/case_template.py +125 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +18 -0
- endoreg_db/models/administration/person/names/last_name.py +19 -0
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/person.py +31 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/__init__.py +14 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/administration/product/product_weight.py +47 -0
- endoreg_db/models/administration/product/reference_product.py +130 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +83 -0
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/label/video_segmentation_labelset.py +27 -0
- endoreg_db/models/media/__init__.py +16 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +757 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +20 -0
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +168 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +222 -0
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/metadata/pdf_meta.py +89 -0
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/other/gender.py +27 -0
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -0
- endoreg_db/models/other/resource.py +22 -0
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -0
- endoreg_db/models/other/unit.py +32 -0
- endoreg_db/models/other/waste.py +27 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/rule/rule.py +27 -0
- endoreg_db/models/rule/rule_applicator.py +224 -0
- endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
- endoreg_db/models/rule/rule_type.py +20 -0
- endoreg_db/models/rule/ruleset.py +17 -0
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/queries/__init__.py +5 -0
- endoreg_db/queries/annotations/__init__.py +3 -0
- endoreg_db/queries/annotations/legacy.py +158 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +118 -0
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +69 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +1259 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +83 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/get.py +5 -0
- endoreg_db/utils/ai/inference_dataset.py +52 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/utils/ai/preprocess.py +68 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/case_generator/case_generator.py +159 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/utils/case_generator/utils.py +30 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/cropping.py +29 -0
- endoreg_db/utils/dataloader.py +175 -0
- endoreg_db/utils/dates.py +60 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +58 -0
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +153 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +76 -0
- endoreg_db/utils/ocr.py +190 -0
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/uuid.py +4 -0
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +274 -0
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/csrf.py +7 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +8 -0
- endoreg_db/views/pdf/pdf_stream.py +186 -0
- endoreg_db/views/pdf/reimport.py +177 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +367 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -0
- endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
- endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
- endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modern Media Framework - Video Segment API Views
|
|
3
|
+
October 14, 2025 - Migration to unified /api/media/videos/<pk>/segments/ pattern
|
|
4
|
+
|
|
5
|
+
This module provides modern framework views for video segment management,
|
|
6
|
+
wrapping legacy segment views with pk-based parameter handling.
|
|
7
|
+
"""
|
|
8
|
+
from endoreg_db.models import Label, LabelVideoSegment, VideoFile
|
|
9
|
+
from endoreg_db.serializers.label_video_segment.label_video_segment import LabelVideoSegmentSerializer
|
|
10
|
+
|
|
11
|
+
from django.db import transaction
|
|
12
|
+
from rest_framework import status
|
|
13
|
+
from rest_framework.decorators import api_view, permission_classes
|
|
14
|
+
from rest_framework.response import Response
|
|
15
|
+
|
|
16
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
17
|
+
import logging
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@api_view(['GET'])
|
|
23
|
+
@permission_classes([EnvironmentAwarePermission])
|
|
24
|
+
def video_segments_by_pk(request, pk):
|
|
25
|
+
"""
|
|
26
|
+
Modern media framework endpoint for retrieving video segments.
|
|
27
|
+
|
|
28
|
+
GET /api/media/videos/<int:pk>/segments/?label=<label_name>
|
|
29
|
+
|
|
30
|
+
Returns all segments for a video, optionally filtered by label name.
|
|
31
|
+
This is the modern replacement for /api/video/<id>/segments/
|
|
32
|
+
|
|
33
|
+
Query Parameters:
|
|
34
|
+
label (str, optional): Filter segments by label name (e.g., 'outside')
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
200: List of video segments
|
|
38
|
+
404: Video not found
|
|
39
|
+
"""
|
|
40
|
+
try:
|
|
41
|
+
video = VideoFile.objects.get(id=pk)
|
|
42
|
+
except VideoFile.DoesNotExist:
|
|
43
|
+
logger.warning(f"Video with pk {pk} not found")
|
|
44
|
+
return Response(
|
|
45
|
+
{'error': f'Video with id {pk} not found'},
|
|
46
|
+
status=status.HTTP_404_NOT_FOUND
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Start with all segments for this video
|
|
50
|
+
queryset = LabelVideoSegment.objects.filter(video_file=video)
|
|
51
|
+
|
|
52
|
+
# Optional filtering by label name
|
|
53
|
+
label_name = request.GET.get('label')
|
|
54
|
+
if label_name:
|
|
55
|
+
try:
|
|
56
|
+
label = Label.objects.get(name=label_name)
|
|
57
|
+
queryset = queryset.filter(label=label)
|
|
58
|
+
logger.info(f"Filtering segments for video {pk} by label '{label_name}'")
|
|
59
|
+
except Label.DoesNotExist:
|
|
60
|
+
logger.warning(f"Label '{label_name}' not found, returning empty result")
|
|
61
|
+
return Response(
|
|
62
|
+
{'error': f"Label '{label_name}' not found"},
|
|
63
|
+
status=status.HTTP_404_NOT_FOUND
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Order by start time for consistent results
|
|
67
|
+
segments = queryset.order_by('start_frame_number')
|
|
68
|
+
serializer = LabelVideoSegmentSerializer(segments, many=True)
|
|
69
|
+
|
|
70
|
+
logger.info(f"Returning {len(segments)} segments for video {pk}")
|
|
71
|
+
return Response(serializer.data)
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# Modern Media Framework: Sensitive Metadata Management
|
|
2
|
+
from rest_framework.decorators import api_view, permission_classes
|
|
3
|
+
from rest_framework.response import Response
|
|
4
|
+
from rest_framework import status
|
|
5
|
+
from django.db import transaction
|
|
6
|
+
from django.db.models import Q
|
|
7
|
+
from django.shortcuts import get_object_or_404
|
|
8
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
9
|
+
from endoreg_db.models import VideoFile, RawPdfFile, SensitiveMeta
|
|
10
|
+
from endoreg_db.serializers.meta import (
|
|
11
|
+
SensitiveMetaDetailSerializer,
|
|
12
|
+
SensitiveMetaUpdateSerializer,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
# === VIDEO SENSITIVE METADATA ===
|
|
16
|
+
|
|
17
|
+
@api_view(['GET', 'PATCH'])
|
|
18
|
+
@permission_classes([EnvironmentAwarePermission])
|
|
19
|
+
def video_sensitive_metadata(request, pk):
|
|
20
|
+
"""
|
|
21
|
+
GET /api/media/videos/<pk>/sensitive-metadata/
|
|
22
|
+
PATCH /api/media/videos/<pk>/sensitive-metadata/
|
|
23
|
+
|
|
24
|
+
Get or update sensitive metadata for a video.
|
|
25
|
+
Video-scoped: Uses video ID to locate related sensitive metadata.
|
|
26
|
+
"""
|
|
27
|
+
video = get_object_or_404(VideoFile, pk=pk)
|
|
28
|
+
|
|
29
|
+
# Get related sensitive metadata
|
|
30
|
+
if not video.sensitive_meta:
|
|
31
|
+
return Response(
|
|
32
|
+
{"error": f"No sensitive metadata found for video {pk}"},
|
|
33
|
+
status=status.HTTP_404_NOT_FOUND
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
sensitive_meta = video.sensitive_meta
|
|
37
|
+
|
|
38
|
+
if request.method == 'GET':
|
|
39
|
+
serializer = SensitiveMetaDetailSerializer(sensitive_meta)
|
|
40
|
+
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
41
|
+
|
|
42
|
+
elif request.method == 'PATCH':
|
|
43
|
+
serializer = SensitiveMetaUpdateSerializer(
|
|
44
|
+
sensitive_meta,
|
|
45
|
+
data=request.data,
|
|
46
|
+
partial=True
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
if serializer.is_valid():
|
|
50
|
+
updated_instance = serializer.save()
|
|
51
|
+
response_serializer = SensitiveMetaDetailSerializer(updated_instance)
|
|
52
|
+
|
|
53
|
+
return Response({
|
|
54
|
+
"message": "Sensitive metadata updated successfully",
|
|
55
|
+
"sensitive_meta": response_serializer.data,
|
|
56
|
+
"video_id": pk
|
|
57
|
+
}, status=status.HTTP_200_OK)
|
|
58
|
+
|
|
59
|
+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@api_view(['POST'])
|
|
63
|
+
@permission_classes([EnvironmentAwarePermission])
|
|
64
|
+
@transaction.atomic
|
|
65
|
+
def video_sensitive_metadata_verify(request, pk):
|
|
66
|
+
"""
|
|
67
|
+
POST /api/media/videos/<pk>/sensitive-metadata/verify/
|
|
68
|
+
|
|
69
|
+
Update verification state for video sensitive metadata.
|
|
70
|
+
|
|
71
|
+
Expected payload:
|
|
72
|
+
{
|
|
73
|
+
"dob_verified": true,
|
|
74
|
+
"names_verified": true
|
|
75
|
+
}
|
|
76
|
+
"""
|
|
77
|
+
video = get_object_or_404(VideoFile, pk=pk)
|
|
78
|
+
|
|
79
|
+
if not video.sensitive_meta:
|
|
80
|
+
return Response(
|
|
81
|
+
{"error": f"No sensitive metadata found for video {pk}"},
|
|
82
|
+
status=status.HTTP_404_NOT_FOUND
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
sensitive_meta = video.sensitive_meta
|
|
86
|
+
|
|
87
|
+
dob_verified = request.data.get('dob_verified')
|
|
88
|
+
names_verified = request.data.get('names_verified')
|
|
89
|
+
|
|
90
|
+
if dob_verified is None and names_verified is None:
|
|
91
|
+
return Response(
|
|
92
|
+
{"error": "At least one of dob_verified or names_verified must be provided"},
|
|
93
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
state = sensitive_meta.get_or_create_state()
|
|
97
|
+
|
|
98
|
+
if dob_verified is not None:
|
|
99
|
+
state.dob_verified = dob_verified
|
|
100
|
+
if names_verified is not None:
|
|
101
|
+
state.names_verified = names_verified
|
|
102
|
+
|
|
103
|
+
state.save()
|
|
104
|
+
|
|
105
|
+
response_serializer = SensitiveMetaDetailSerializer(sensitive_meta)
|
|
106
|
+
return Response({
|
|
107
|
+
"message": "Verification state updated successfully",
|
|
108
|
+
"sensitive_meta": response_serializer.data,
|
|
109
|
+
"video_id": pk,
|
|
110
|
+
"state_verified": state.is_verified
|
|
111
|
+
}, status=status.HTTP_200_OK)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
# === PDF SENSITIVE METADATA ===
|
|
115
|
+
|
|
116
|
+
@api_view(['GET', 'PATCH'])
|
|
117
|
+
@permission_classes([EnvironmentAwarePermission])
|
|
118
|
+
def pdf_sensitive_metadata(request, pk):
|
|
119
|
+
"""
|
|
120
|
+
GET /api/media/pdfs/<pk>/sensitive-metadata/
|
|
121
|
+
PATCH /api/media/pdfs/<pk>/sensitive-metadata/
|
|
122
|
+
|
|
123
|
+
Get or update sensitive metadata for a PDF.
|
|
124
|
+
PDF-scoped: Uses PDF ID to locate related sensitive metadata.
|
|
125
|
+
"""
|
|
126
|
+
pdf = get_object_or_404(RawPdfFile, pk=pk)
|
|
127
|
+
|
|
128
|
+
# Get related sensitive metadata
|
|
129
|
+
if not pdf.sensitive_meta:
|
|
130
|
+
return Response(
|
|
131
|
+
{"error": f"No sensitive metadata found for PDF {pk}"},
|
|
132
|
+
status=status.HTTP_404_NOT_FOUND
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
sensitive_meta = pdf.sensitive_meta
|
|
136
|
+
|
|
137
|
+
if request.method == 'GET':
|
|
138
|
+
serializer = SensitiveMetaDetailSerializer(sensitive_meta)
|
|
139
|
+
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
140
|
+
|
|
141
|
+
elif request.method == 'PATCH':
|
|
142
|
+
serializer = SensitiveMetaUpdateSerializer(
|
|
143
|
+
sensitive_meta,
|
|
144
|
+
data=request.data,
|
|
145
|
+
partial=True
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
if serializer.is_valid():
|
|
149
|
+
updated_instance = serializer.save()
|
|
150
|
+
response_serializer = SensitiveMetaDetailSerializer(updated_instance)
|
|
151
|
+
|
|
152
|
+
return Response({
|
|
153
|
+
"message": "Sensitive metadata updated successfully",
|
|
154
|
+
"sensitive_meta": response_serializer.data,
|
|
155
|
+
"pdf_id": pk
|
|
156
|
+
}, status=status.HTTP_200_OK)
|
|
157
|
+
|
|
158
|
+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@api_view(['POST'])
|
|
162
|
+
@permission_classes([EnvironmentAwarePermission])
|
|
163
|
+
@transaction.atomic
|
|
164
|
+
def pdf_sensitive_metadata_verify(request, pk):
|
|
165
|
+
"""
|
|
166
|
+
POST /api/media/pdfs/<pk>/sensitive-metadata/verify/
|
|
167
|
+
|
|
168
|
+
Update verification state for PDF sensitive metadata.
|
|
169
|
+
|
|
170
|
+
Expected payload:
|
|
171
|
+
{
|
|
172
|
+
"dob_verified": true,
|
|
173
|
+
"names_verified": true
|
|
174
|
+
}
|
|
175
|
+
"""
|
|
176
|
+
pdf = get_object_or_404(RawPdfFile, pk=pk)
|
|
177
|
+
|
|
178
|
+
if not pdf.sensitive_meta:
|
|
179
|
+
return Response(
|
|
180
|
+
{"error": f"No sensitive metadata found for PDF {pk}"},
|
|
181
|
+
status=status.HTTP_404_NOT_FOUND
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
sensitive_meta = pdf.sensitive_meta
|
|
185
|
+
|
|
186
|
+
dob_verified = request.data.get('dob_verified')
|
|
187
|
+
names_verified = request.data.get('names_verified')
|
|
188
|
+
|
|
189
|
+
if dob_verified is None and names_verified is None:
|
|
190
|
+
return Response(
|
|
191
|
+
{"error": "At least one of dob_verified or names_verified must be provided"},
|
|
192
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
state = sensitive_meta.get_or_create_state()
|
|
196
|
+
|
|
197
|
+
if dob_verified is not None:
|
|
198
|
+
state.dob_verified = dob_verified
|
|
199
|
+
if names_verified is not None:
|
|
200
|
+
state.names_verified = names_verified
|
|
201
|
+
|
|
202
|
+
state.save()
|
|
203
|
+
|
|
204
|
+
response_serializer = SensitiveMetaDetailSerializer(sensitive_meta)
|
|
205
|
+
return Response({
|
|
206
|
+
"message": "Verification state updated successfully",
|
|
207
|
+
"sensitive_meta": response_serializer.data,
|
|
208
|
+
"pdf_id": pk,
|
|
209
|
+
"state_verified": state.is_verified
|
|
210
|
+
}, status=status.HTTP_200_OK)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
# === LIST ENDPOINTS (Collection-Level) ===
|
|
214
|
+
|
|
215
|
+
@api_view(['GET'])
|
|
216
|
+
@permission_classes([EnvironmentAwarePermission])
|
|
217
|
+
def sensitive_metadata_list(request):
|
|
218
|
+
"""
|
|
219
|
+
GET /api/media/sensitive-metadata/
|
|
220
|
+
|
|
221
|
+
List all sensitive metadata (combined PDFs and Videos).
|
|
222
|
+
Supports filtering by content_type, status, etc.
|
|
223
|
+
|
|
224
|
+
Query parameters:
|
|
225
|
+
- content_type: 'pdf' | 'video' (optional)
|
|
226
|
+
- verified: Filter by verification status
|
|
227
|
+
- ordering: Sort field
|
|
228
|
+
- search: Search in patient names
|
|
229
|
+
"""
|
|
230
|
+
from endoreg_db.serializers.meta import SensitiveMetaDetailSerializer
|
|
231
|
+
|
|
232
|
+
# Get all sensitive metadata
|
|
233
|
+
queryset = SensitiveMeta.objects.select_related('state').all()
|
|
234
|
+
|
|
235
|
+
# Filter by content type
|
|
236
|
+
content_type = request.query_params.get('content_type')
|
|
237
|
+
if content_type == 'pdf':
|
|
238
|
+
# Only PDFs - filter by existence of related PDFs
|
|
239
|
+
queryset = queryset.filter(raw_pdf_files__isnull=False).distinct()
|
|
240
|
+
elif content_type == 'video':
|
|
241
|
+
# Only Videos - filter by existence of related video
|
|
242
|
+
queryset = queryset.filter(video_file__isnull=False).distinct()
|
|
243
|
+
|
|
244
|
+
# Filter by verification status
|
|
245
|
+
verified = request.query_params.get('verified')
|
|
246
|
+
if verified is not None:
|
|
247
|
+
verified_bool = verified.lower() in ('true', '1', 'yes')
|
|
248
|
+
queryset = queryset.filter(state__is_verified=verified_bool)
|
|
249
|
+
|
|
250
|
+
# Search in patient names
|
|
251
|
+
search = request.query_params.get('search')
|
|
252
|
+
if search:
|
|
253
|
+
queryset = queryset.filter(
|
|
254
|
+
Q(patient_first_name__icontains=search) |
|
|
255
|
+
Q(patient_last_name__icontains=search)
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
# Ordering
|
|
259
|
+
ordering = request.query_params.get('ordering', '-id')
|
|
260
|
+
queryset = queryset.order_by(ordering)
|
|
261
|
+
|
|
262
|
+
# Pagination
|
|
263
|
+
from rest_framework.pagination import PageNumberPagination
|
|
264
|
+
paginator = PageNumberPagination()
|
|
265
|
+
paginator.page_size = 20
|
|
266
|
+
page = paginator.paginate_queryset(queryset, request)
|
|
267
|
+
|
|
268
|
+
if page is not None:
|
|
269
|
+
serializer = SensitiveMetaDetailSerializer(page, many=True)
|
|
270
|
+
return paginator.get_paginated_response(serializer.data)
|
|
271
|
+
|
|
272
|
+
serializer = SensitiveMetaDetailSerializer(queryset, many=True)
|
|
273
|
+
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
@api_view(['GET'])
|
|
277
|
+
@permission_classes([EnvironmentAwarePermission])
|
|
278
|
+
def pdf_sensitive_metadata_list(request):
|
|
279
|
+
"""
|
|
280
|
+
GET /api/media/pdfs/sensitive-metadata/
|
|
281
|
+
|
|
282
|
+
List sensitive metadata for PDFs only.
|
|
283
|
+
Replaces legacy /api/pdf/sensitivemeta/list/
|
|
284
|
+
"""
|
|
285
|
+
from endoreg_db.serializers.meta import SensitiveMetaDetailSerializer
|
|
286
|
+
|
|
287
|
+
# Get all PDFs with sensitive metadata
|
|
288
|
+
queryset = SensitiveMeta.objects.select_related('state').filter(
|
|
289
|
+
raw_pdf_files__isnull=False
|
|
290
|
+
).distinct()
|
|
291
|
+
|
|
292
|
+
# Apply filters
|
|
293
|
+
search = request.query_params.get('search')
|
|
294
|
+
if search:
|
|
295
|
+
queryset = queryset.filter(
|
|
296
|
+
Q(patient_first_name__icontains=search) |
|
|
297
|
+
Q(patient_last_name__icontains=search)
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
ordering = request.query_params.get('ordering', '-id')
|
|
301
|
+
queryset = queryset.order_by(ordering)
|
|
302
|
+
|
|
303
|
+
# Pagination
|
|
304
|
+
from rest_framework.pagination import PageNumberPagination
|
|
305
|
+
paginator = PageNumberPagination()
|
|
306
|
+
paginator.page_size = 20
|
|
307
|
+
page = paginator.paginate_queryset(queryset, request)
|
|
308
|
+
|
|
309
|
+
if page is not None:
|
|
310
|
+
serializer = SensitiveMetaDetailSerializer(page, many=True)
|
|
311
|
+
return paginator.get_paginated_response(serializer.data)
|
|
312
|
+
|
|
313
|
+
serializer = SensitiveMetaDetailSerializer(queryset, many=True)
|
|
314
|
+
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Video Media Management View (Phase 1.2)
|
|
3
|
+
|
|
4
|
+
Provides CRUD operations for video files including listing, detail retrieval,
|
|
5
|
+
and metadata management for the media management system.
|
|
6
|
+
|
|
7
|
+
This complements VideoStreamView which handles the actual video streaming.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from django.http import Http404
|
|
12
|
+
from rest_framework import status
|
|
13
|
+
from rest_framework.response import Response
|
|
14
|
+
from rest_framework.views import APIView
|
|
15
|
+
from django.db.models import Q
|
|
16
|
+
|
|
17
|
+
from endoreg_db.models import VideoFile
|
|
18
|
+
from endoreg_db.serializers.video.video_file_list import VideoFileListSerializer
|
|
19
|
+
from endoreg_db.serializers.video.video_file_detail import VideoDetailSerializer
|
|
20
|
+
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class VideoMediaView(APIView):
|
|
26
|
+
"""
|
|
27
|
+
Video Media Management API for CRUD operations on video files.
|
|
28
|
+
|
|
29
|
+
Endpoints:
|
|
30
|
+
- GET /api/media/videos/ - List all videos with filtering
|
|
31
|
+
- GET /api/media/videos/{id}/ - Get video details
|
|
32
|
+
- PATCH /api/media/videos/{id}/ - Update video metadata (future)
|
|
33
|
+
- DELETE /api/media/videos/{id}/ - Delete video
|
|
34
|
+
|
|
35
|
+
Query Parameters:
|
|
36
|
+
- status: Filter by processing status (not_started, processing, done, failed, validated)
|
|
37
|
+
- search: Search in filename
|
|
38
|
+
- limit: Limit results (default: 50)
|
|
39
|
+
- offset: Pagination offset
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
- GET /api/media/videos/?status=done&search=exam
|
|
43
|
+
- GET /api/media/videos/123/
|
|
44
|
+
|
|
45
|
+
Phase 1.2 Implementation:
|
|
46
|
+
- List and detail views implemented
|
|
47
|
+
- Filtering and search functionality
|
|
48
|
+
- Pagination support
|
|
49
|
+
- Error handling with proper HTTP status codes
|
|
50
|
+
- Integration with existing serializers
|
|
51
|
+
"""
|
|
52
|
+
permission_classes = [EnvironmentAwarePermission]
|
|
53
|
+
|
|
54
|
+
def get(self, request, pk=None):
|
|
55
|
+
"""
|
|
56
|
+
Handle GET requests for video listing or detail retrieval.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
request: HTTP request object
|
|
60
|
+
pk: Optional video ID for detail view
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Response: JSON response with video data or list
|
|
64
|
+
|
|
65
|
+
Raises:
|
|
66
|
+
Http404: If specific video not found
|
|
67
|
+
"""
|
|
68
|
+
if pk is not None:
|
|
69
|
+
# Detail view
|
|
70
|
+
return self._get_video_detail(pk)
|
|
71
|
+
else:
|
|
72
|
+
# List view
|
|
73
|
+
return self._list_videos(request)
|
|
74
|
+
|
|
75
|
+
def _get_video_detail(self, pk):
|
|
76
|
+
"""
|
|
77
|
+
Get detailed information for a specific video.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
pk: Video primary key
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Response: JSON response with video details
|
|
84
|
+
|
|
85
|
+
Raises:
|
|
86
|
+
Http404: If video not found
|
|
87
|
+
"""
|
|
88
|
+
try:
|
|
89
|
+
# Validate video_id is numeric
|
|
90
|
+
try:
|
|
91
|
+
video_id_int = int(pk)
|
|
92
|
+
except (ValueError, TypeError):
|
|
93
|
+
raise Http404("Invalid video ID format")
|
|
94
|
+
|
|
95
|
+
# Fetch video with related data
|
|
96
|
+
video = VideoFile.objects.select_related(
|
|
97
|
+
'state', 'sensitive_meta'
|
|
98
|
+
).get(pk=video_id_int)
|
|
99
|
+
|
|
100
|
+
# Serialize with request context for URL generation
|
|
101
|
+
serializer = VideoDetailSerializer(video, context={'request': self.request})
|
|
102
|
+
|
|
103
|
+
return Response(serializer.data)
|
|
104
|
+
|
|
105
|
+
except VideoFile.DoesNotExist:
|
|
106
|
+
raise Http404(f"Video with ID {pk} not found")
|
|
107
|
+
|
|
108
|
+
except Exception as e:
|
|
109
|
+
logger.error(f"Unexpected error in video detail view for ID {pk}: {str(e)}")
|
|
110
|
+
return Response(
|
|
111
|
+
{"error": "Failed to retrieve video details"},
|
|
112
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
def _list_videos(self, request):
|
|
116
|
+
"""
|
|
117
|
+
List videos with filtering, search, and pagination.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
request: HTTP request with query parameters
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
Response: JSON response with paginated video list
|
|
124
|
+
"""
|
|
125
|
+
try:
|
|
126
|
+
# Start with all videos
|
|
127
|
+
queryset = VideoFile.objects.select_related('state', 'sensitive_meta').all()
|
|
128
|
+
|
|
129
|
+
# Apply filters
|
|
130
|
+
queryset = self._apply_filters(queryset, request.query_params)
|
|
131
|
+
|
|
132
|
+
# Apply search
|
|
133
|
+
search = request.query_params.get('search', '').strip()
|
|
134
|
+
if search:
|
|
135
|
+
queryset = queryset.filter(
|
|
136
|
+
Q(original_file_name__icontains=search)
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
# Order by upload date (newest first)
|
|
140
|
+
queryset = queryset.order_by('-uploaded_at')
|
|
141
|
+
|
|
142
|
+
# Apply pagination
|
|
143
|
+
limit = min(int(request.query_params.get('limit', 50)), 100)
|
|
144
|
+
offset = int(request.query_params.get('offset', 0))
|
|
145
|
+
|
|
146
|
+
total_count = queryset.count()
|
|
147
|
+
videos = queryset[offset:offset + limit]
|
|
148
|
+
|
|
149
|
+
# Serialize
|
|
150
|
+
serializer = VideoFileListSerializer(videos, many=True)
|
|
151
|
+
|
|
152
|
+
return Response({
|
|
153
|
+
"count": total_count,
|
|
154
|
+
"next": self._get_next_url(request, offset, limit, total_count),
|
|
155
|
+
"previous": self._get_previous_url(request, offset, limit),
|
|
156
|
+
"results": serializer.data
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
except ValueError as e:
|
|
160
|
+
return Response(
|
|
161
|
+
{"error": f"Invalid query parameter: {str(e)}"},
|
|
162
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
except Exception as e:
|
|
166
|
+
logger.error(f"Unexpected error in video list view: {str(e)}")
|
|
167
|
+
return Response(
|
|
168
|
+
{"error": "Failed to retrieve video list"},
|
|
169
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
def _apply_filters(self, queryset, query_params):
|
|
173
|
+
"""
|
|
174
|
+
Apply status and other filters to video queryset.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
queryset: Base queryset to filter
|
|
178
|
+
query_params: Request query parameters
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
QuerySet: Filtered queryset
|
|
182
|
+
"""
|
|
183
|
+
status_filter = query_params.get('status', '').strip().lower()
|
|
184
|
+
|
|
185
|
+
if status_filter:
|
|
186
|
+
if status_filter == 'not_started':
|
|
187
|
+
# Videos without state or with not_started status
|
|
188
|
+
queryset = queryset.filter(
|
|
189
|
+
Q(state__isnull=True) |
|
|
190
|
+
Q(state__frames_extracted=False, state__sensitive_meta_processed=False)
|
|
191
|
+
)
|
|
192
|
+
elif status_filter == 'processing':
|
|
193
|
+
# Videos in any processing state
|
|
194
|
+
queryset = queryset.filter(
|
|
195
|
+
state__frames_extracted=True,
|
|
196
|
+
state__sensitive_meta_processed=False
|
|
197
|
+
)
|
|
198
|
+
elif status_filter == 'done':
|
|
199
|
+
# Videos with anonymization complete but not validated
|
|
200
|
+
queryset = queryset.filter(
|
|
201
|
+
state__anonymized=True,
|
|
202
|
+
sensitive_meta__is_verified=False
|
|
203
|
+
)
|
|
204
|
+
elif status_filter == 'validated':
|
|
205
|
+
# Videos with human validation complete
|
|
206
|
+
queryset = queryset.filter(
|
|
207
|
+
state__anonymized=True,
|
|
208
|
+
sensitive_meta__is_verified=True
|
|
209
|
+
)
|
|
210
|
+
elif status_filter == 'failed':
|
|
211
|
+
# Failed videos (this might need adjustment based on actual failure tracking)
|
|
212
|
+
queryset = queryset.filter(
|
|
213
|
+
state__isnull=False,
|
|
214
|
+
state__frames_extracted=False,
|
|
215
|
+
state__sensitive_meta_processed=False
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
return queryset
|
|
219
|
+
|
|
220
|
+
def _get_next_url(self, request, offset, limit, total_count):
|
|
221
|
+
"""Generate next page URL for pagination."""
|
|
222
|
+
if offset + limit >= total_count:
|
|
223
|
+
return None
|
|
224
|
+
|
|
225
|
+
next_offset = offset + limit
|
|
226
|
+
return self._build_paginated_url(request, next_offset, limit)
|
|
227
|
+
|
|
228
|
+
def _get_previous_url(self, request, offset, limit):
|
|
229
|
+
"""Generate previous page URL for pagination."""
|
|
230
|
+
if offset <= 0:
|
|
231
|
+
return None
|
|
232
|
+
|
|
233
|
+
prev_offset = max(0, offset - limit)
|
|
234
|
+
return self._build_paginated_url(request, prev_offset, limit)
|
|
235
|
+
|
|
236
|
+
def _build_paginated_url(self, request, offset, limit):
|
|
237
|
+
"""Build URL with pagination parameters."""
|
|
238
|
+
params = request.query_params.copy()
|
|
239
|
+
params['offset'] = offset
|
|
240
|
+
params['limit'] = limit
|
|
241
|
+
|
|
242
|
+
base_url = request.build_absolute_uri(request.path)
|
|
243
|
+
if params:
|
|
244
|
+
return f"{base_url}?{params.urlencode()}"
|
|
245
|
+
return base_url
|
|
246
|
+
|
|
247
|
+
# Future implementation placeholders
|
|
248
|
+
def patch(self, request, pk):
|
|
249
|
+
"""
|
|
250
|
+
Update video metadata (Phase 1.2+ future enhancement).
|
|
251
|
+
|
|
252
|
+
Currently returns 501 Not Implemented.
|
|
253
|
+
"""
|
|
254
|
+
return Response(
|
|
255
|
+
{"error": "Video metadata updates not yet implemented"},
|
|
256
|
+
status=status.HTTP_501_NOT_IMPLEMENTED
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
def delete(self, request, pk):
|
|
260
|
+
"""
|
|
261
|
+
Delete video file (Phase 1.2+ future enhancement).
|
|
262
|
+
|
|
263
|
+
Currently returns 501 Not Implemented.
|
|
264
|
+
Use /api/media-management/force-remove/{id}/ instead.
|
|
265
|
+
"""
|
|
266
|
+
return Response(
|
|
267
|
+
{
|
|
268
|
+
"error": "Video deletion not yet implemented",
|
|
269
|
+
"alternative": f"Use DELETE /api/media-management/force-remove/{pk}/ instead"
|
|
270
|
+
},
|
|
271
|
+
status=status.HTTP_501_NOT_IMPLEMENTED
|
|
272
|
+
)
|