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,53 @@
|
|
|
1
|
+
from endoreg_db.models import RawPdfFile
|
|
2
|
+
|
|
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
|
+
from pathlib import Path
|
|
8
|
+
import logging
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
class ReportFileMetadataView(APIView):
|
|
13
|
+
"""
|
|
14
|
+
API-Endpunkt für Report-Datei-Metadaten
|
|
15
|
+
GET /api/reports/{report_id}/file-metadata/
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def get(self, _request, report_id):
|
|
19
|
+
try:
|
|
20
|
+
report = get_object_or_404(RawPdfFile, id=report_id)
|
|
21
|
+
|
|
22
|
+
if not report.file:
|
|
23
|
+
return Response(
|
|
24
|
+
{"error": "Keine Datei für diesen Report verfügbar"},
|
|
25
|
+
status=status.HTTP_404_NOT_FOUND
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
metadata = self._get_file_metadata(report)
|
|
29
|
+
return Response(metadata)
|
|
30
|
+
|
|
31
|
+
except (ValueError, TypeError) as e:
|
|
32
|
+
logger.error("Fehler beim Laden der Datei-Metadaten: %s", str(e))
|
|
33
|
+
return Response(
|
|
34
|
+
{"error": "Metadaten konnten nicht geladen werden"},
|
|
35
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
def _get_file_metadata(self, report):
|
|
39
|
+
"""Sammelt Datei-Metadaten"""
|
|
40
|
+
file_path = Path(report.file.name)
|
|
41
|
+
|
|
42
|
+
try:
|
|
43
|
+
file_size = report.file.size
|
|
44
|
+
except OSError:
|
|
45
|
+
file_size = 0
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
'filename': file_path.name,
|
|
49
|
+
'file_type': file_path.suffix.lower().lstrip('.'),
|
|
50
|
+
'file_size': file_size,
|
|
51
|
+
'upload_date': report.created_at if hasattr(report, 'created_at') else None,
|
|
52
|
+
'last_modified': report.updated_at if hasattr(report, 'updated_at') else None
|
|
53
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
from endoreg_db.models import SensitiveMeta
|
|
2
|
+
from endoreg_db.serializers import SensitiveMetaDetailSerializer, SensitiveMetaUpdateSerializer
|
|
3
|
+
|
|
4
|
+
from django.db import transaction
|
|
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
|
+
from endoreg_db.utils.permissions import DEBUG_PERMISSIONS
|
|
11
|
+
import logging
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
class SensitiveMetaDetailView(APIView):
|
|
16
|
+
"""
|
|
17
|
+
API endpoint to retrieve and update SensitiveMeta details with verification state.
|
|
18
|
+
|
|
19
|
+
GET: Returns detailed SensitiveMeta information for annotation/verification
|
|
20
|
+
PATCH: Updates SensitiveMeta fields including verification state
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
permission_classes = DEBUG_PERMISSIONS # Changed from IsAuthenticated for development
|
|
24
|
+
|
|
25
|
+
def get(self, request, sensitive_meta_id=None):
|
|
26
|
+
"""
|
|
27
|
+
Retrieve SensitiveMeta details for display and annotation.
|
|
28
|
+
|
|
29
|
+
Supports both URL parameter and query parameter access patterns:
|
|
30
|
+
- /api/pdf/sensitivemeta/123/ (URL parameter)
|
|
31
|
+
- /api/pdf/sensitivemeta/?id=123 (query parameter - for backward compatibility)
|
|
32
|
+
- /api/pdf/sensitivemeta/ (list all - returns empty list instead of 400)
|
|
33
|
+
|
|
34
|
+
Returns detailed information suitable for user verification.
|
|
35
|
+
"""
|
|
36
|
+
# Handle both URL parameter and query parameter patterns
|
|
37
|
+
if not sensitive_meta_id:
|
|
38
|
+
sensitive_meta_id = request.query_params.get('id')
|
|
39
|
+
|
|
40
|
+
# If no ID provided, return empty list instead of error
|
|
41
|
+
if not sensitive_meta_id:
|
|
42
|
+
return Response([], status=status.HTTP_200_OK)
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
# Convert to int if it's a string
|
|
46
|
+
sensitive_meta_id = int(sensitive_meta_id)
|
|
47
|
+
|
|
48
|
+
# Get the SensitiveMeta instance with related data
|
|
49
|
+
sensitive_meta = SensitiveMeta.objects.select_related(
|
|
50
|
+
'center',
|
|
51
|
+
'patient_gender',
|
|
52
|
+
'pseudo_patient',
|
|
53
|
+
'pseudo_examination'
|
|
54
|
+
).prefetch_related(
|
|
55
|
+
'examiners',
|
|
56
|
+
'state'
|
|
57
|
+
).get(id=sensitive_meta_id)
|
|
58
|
+
|
|
59
|
+
# Serialize for display
|
|
60
|
+
serializer = SensitiveMetaDetailSerializer(sensitive_meta)
|
|
61
|
+
|
|
62
|
+
# Return direct data to match anonymization store expectations
|
|
63
|
+
# Instead of wrapping in "sensitive_meta" key, return data directly
|
|
64
|
+
response_data = serializer.data
|
|
65
|
+
|
|
66
|
+
logger.info(f"Retrieved SensitiveMeta {sensitive_meta_id} for user {request.user}")
|
|
67
|
+
return Response(response_data, status=status.HTTP_200_OK)
|
|
68
|
+
|
|
69
|
+
except ValueError:
|
|
70
|
+
return Response(
|
|
71
|
+
{"error": "Invalid sensitive_meta_id format. Must be an integer."},
|
|
72
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
73
|
+
)
|
|
74
|
+
except SensitiveMeta.DoesNotExist:
|
|
75
|
+
return Response(
|
|
76
|
+
{"error": f"SensitiveMeta with ID {sensitive_meta_id} not found"},
|
|
77
|
+
status=status.HTTP_404_NOT_FOUND
|
|
78
|
+
)
|
|
79
|
+
except Exception as e:
|
|
80
|
+
logger.error(f"Error retrieving SensitiveMeta {sensitive_meta_id}: {e}")
|
|
81
|
+
return Response(
|
|
82
|
+
{"error": "Internal server error occurred"},
|
|
83
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
@transaction.atomic
|
|
87
|
+
def patch(self, request, sensitive_meta_id=None):
|
|
88
|
+
"""
|
|
89
|
+
Update SensitiveMeta fields including verification state.
|
|
90
|
+
|
|
91
|
+
Accepts partial updates for any field in SensitiveMetaUpdateSerializer.
|
|
92
|
+
Special handling for verification state changes.
|
|
93
|
+
"""
|
|
94
|
+
if not sensitive_meta_id:
|
|
95
|
+
return Response(
|
|
96
|
+
{"error": "sensitive_meta_id is required"},
|
|
97
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
try:
|
|
101
|
+
# Get the SensitiveMeta instance
|
|
102
|
+
sensitive_meta = get_object_or_404(SensitiveMeta, id=sensitive_meta_id)
|
|
103
|
+
|
|
104
|
+
# Validate and update using serializer
|
|
105
|
+
serializer = SensitiveMetaUpdateSerializer(
|
|
106
|
+
sensitive_meta,
|
|
107
|
+
data=request.data,
|
|
108
|
+
partial=True
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
if serializer.is_valid():
|
|
112
|
+
updated_instance = serializer.save()
|
|
113
|
+
|
|
114
|
+
# Return updated data using detail serializer
|
|
115
|
+
response_serializer = SensitiveMetaDetailSerializer(updated_instance)
|
|
116
|
+
|
|
117
|
+
response_data = {
|
|
118
|
+
"message": "SensitiveMeta updated successfully",
|
|
119
|
+
"sensitive_meta": response_serializer.data,
|
|
120
|
+
"updated_fields": list(request.data.keys())
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
logger.info(
|
|
124
|
+
f"Updated SensitiveMeta {sensitive_meta_id} by user {request.user}. "
|
|
125
|
+
f"Fields: {list(request.data.keys())}"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
return Response(response_data, status=status.HTTP_200_OK)
|
|
129
|
+
else:
|
|
130
|
+
return Response(
|
|
131
|
+
{
|
|
132
|
+
"error": "Validation failed",
|
|
133
|
+
"details": serializer.errors
|
|
134
|
+
},
|
|
135
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
except SensitiveMeta.DoesNotExist:
|
|
139
|
+
return Response(
|
|
140
|
+
{"error": f"SensitiveMeta with ID {sensitive_meta_id} not found"},
|
|
141
|
+
status=status.HTTP_404_NOT_FOUND
|
|
142
|
+
)
|
|
143
|
+
except Exception as e:
|
|
144
|
+
logger.error(f"Error updating SensitiveMeta {sensitive_meta_id}: {e}")
|
|
145
|
+
return Response(
|
|
146
|
+
{"error": "Internal server error occurred"},
|
|
147
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
148
|
+
)
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
from endoreg_db.models import SensitiveMeta
|
|
2
|
+
from endoreg_db.serializers.meta.sensitive_meta_detail import SensitiveMetaDetailSerializer
|
|
3
|
+
|
|
4
|
+
from rest_framework import status
|
|
5
|
+
from rest_framework.response import Response
|
|
6
|
+
from rest_framework.views import APIView
|
|
7
|
+
from endoreg_db.utils.permissions import DEBUG_PERMISSIONS
|
|
8
|
+
import logging
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SensitiveMetaListView(APIView):
|
|
14
|
+
"""
|
|
15
|
+
API endpoint to list SensitiveMeta entries with filtering options.
|
|
16
|
+
|
|
17
|
+
GET: Returns paginated list of SensitiveMeta entries
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
permission_classes = DEBUG_PERMISSIONS
|
|
21
|
+
|
|
22
|
+
def get(self, request):
|
|
23
|
+
"""
|
|
24
|
+
List SensitiveMeta entries with optional filtering.
|
|
25
|
+
|
|
26
|
+
Query Parameters:
|
|
27
|
+
- verified: Filter by verification status (true/false)
|
|
28
|
+
- center: Filter by center name
|
|
29
|
+
- limit: Number of results to return (default 20)
|
|
30
|
+
- offset: Offset for pagination (default 0)
|
|
31
|
+
"""
|
|
32
|
+
try:
|
|
33
|
+
# Base queryset with related data
|
|
34
|
+
queryset = SensitiveMeta.objects.select_related(
|
|
35
|
+
'center',
|
|
36
|
+
'patient_gender',
|
|
37
|
+
'state'
|
|
38
|
+
).prefetch_related('examiners')
|
|
39
|
+
|
|
40
|
+
# Apply filters
|
|
41
|
+
verified_filter = request.query_params.get('verified')
|
|
42
|
+
if verified_filter is not None:
|
|
43
|
+
if verified_filter.lower() == 'true':
|
|
44
|
+
# Filter for entries where both DOB and names are verified
|
|
45
|
+
queryset = queryset.filter(
|
|
46
|
+
state__dob_verified=True,
|
|
47
|
+
state__names_verified=True
|
|
48
|
+
)
|
|
49
|
+
elif verified_filter.lower() == 'false':
|
|
50
|
+
# Filter for entries that are not fully verified
|
|
51
|
+
queryset = queryset.exclude(
|
|
52
|
+
state__dob_verified=True,
|
|
53
|
+
state__names_verified=True
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
center_filter = request.query_params.get('center')
|
|
57
|
+
if center_filter:
|
|
58
|
+
queryset = queryset.filter(center__name__icontains=center_filter)
|
|
59
|
+
|
|
60
|
+
# Pagination
|
|
61
|
+
try:
|
|
62
|
+
limit = int(request.query_params.get('limit', 10))
|
|
63
|
+
if limit < 0:
|
|
64
|
+
limit = 10
|
|
65
|
+
except (ValueError, TypeError):
|
|
66
|
+
limit = 10
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
offset = int(request.query_params.get('offset', 0))
|
|
70
|
+
if offset < 0:
|
|
71
|
+
offset = 0
|
|
72
|
+
except (ValueError, TypeError):
|
|
73
|
+
offset = 0
|
|
74
|
+
|
|
75
|
+
# Enforce a maximum limit
|
|
76
|
+
if limit > 100:
|
|
77
|
+
limit = 100
|
|
78
|
+
|
|
79
|
+
paginated_queryset = queryset[offset:offset + limit]
|
|
80
|
+
|
|
81
|
+
# Serialize results
|
|
82
|
+
serializer = SensitiveMetaDetailSerializer(paginated_queryset, many=True)
|
|
83
|
+
|
|
84
|
+
response_data = {
|
|
85
|
+
"results": serializer.data,
|
|
86
|
+
"total_count": queryset.count(),
|
|
87
|
+
"limit": limit,
|
|
88
|
+
"offset": offset,
|
|
89
|
+
"has_more": (offset + limit) < queryset.count()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return Response(response_data, status=status.HTTP_200_OK)
|
|
93
|
+
|
|
94
|
+
except ValueError as e:
|
|
95
|
+
return Response(
|
|
96
|
+
{"error": f"Invalid query parameters: {e}"},
|
|
97
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
98
|
+
)
|
|
99
|
+
except Exception as e:
|
|
100
|
+
logger.error(f"Error listing SensitiveMeta entries: {e}")
|
|
101
|
+
return Response(
|
|
102
|
+
{"error": "Internal server error occurred"},
|
|
103
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
104
|
+
)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from endoreg_db.models import SensitiveMeta
|
|
2
|
+
from endoreg_db.serializers.meta import SensitiveMetaDetailSerializer, SensitiveMetaVerificationSerializer
|
|
3
|
+
|
|
4
|
+
from django.db import transaction
|
|
5
|
+
from rest_framework import status
|
|
6
|
+
from rest_framework.response import Response
|
|
7
|
+
from rest_framework.views import APIView
|
|
8
|
+
from endoreg_db.utils.permissions import DEBUG_PERMISSIONS
|
|
9
|
+
import logging
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
class SensitiveMetaVerificationView(APIView):
|
|
14
|
+
"""
|
|
15
|
+
API endpoint specifically for updating verification state.
|
|
16
|
+
|
|
17
|
+
POST: Update verification flags (dob_verified, names_verified) for a SensitiveMeta
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
permission_classes = DEBUG_PERMISSIONS # Changed from IsAuthenticated for development
|
|
21
|
+
|
|
22
|
+
@transaction.atomic
|
|
23
|
+
def post(self, request):
|
|
24
|
+
"""
|
|
25
|
+
Update verification state for a SensitiveMeta instance.
|
|
26
|
+
|
|
27
|
+
Expected payload:
|
|
28
|
+
{
|
|
29
|
+
"sensitive_meta_id": 123,
|
|
30
|
+
"dob_verified": true,
|
|
31
|
+
"names_verified": true
|
|
32
|
+
}
|
|
33
|
+
"""
|
|
34
|
+
serializer = SensitiveMetaVerificationSerializer(data=request.data)
|
|
35
|
+
|
|
36
|
+
if serializer.is_valid():
|
|
37
|
+
try:
|
|
38
|
+
state = serializer.save()
|
|
39
|
+
sensitive_meta_id = serializer.validated_data['sensitive_meta_id']
|
|
40
|
+
|
|
41
|
+
# Get updated SensitiveMeta for response
|
|
42
|
+
sensitive_meta = SensitiveMeta.objects.get(id=sensitive_meta_id)
|
|
43
|
+
response_serializer = SensitiveMetaDetailSerializer(sensitive_meta)
|
|
44
|
+
|
|
45
|
+
response_data = {
|
|
46
|
+
"message": "Verification state updated successfully",
|
|
47
|
+
"sensitive_meta": response_serializer.data,
|
|
48
|
+
"state_verified": state.is_verified
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
logger.info(
|
|
52
|
+
f"Updated verification state for SensitiveMeta {sensitive_meta_id} "
|
|
53
|
+
f"by user {request.user}. Overall verified: {state.is_verified}"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return Response(response_data, status=status.HTTP_200_OK)
|
|
57
|
+
|
|
58
|
+
except Exception as e:
|
|
59
|
+
logger.error(f"Error in verification update: {e}")
|
|
60
|
+
return Response(
|
|
61
|
+
{"error": f"Failed to update verification state: {e}"},
|
|
62
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
63
|
+
)
|
|
64
|
+
else:
|
|
65
|
+
return Response(
|
|
66
|
+
{
|
|
67
|
+
"error": "Validation failed",
|
|
68
|
+
"details": serializer.errors
|
|
69
|
+
},
|
|
70
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
71
|
+
)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from .center import CenterViewSet
|
|
2
|
+
from .csrf import csrf_token_view
|
|
3
|
+
from .gender import GenderViewSet
|
|
4
|
+
from .stats import (
|
|
5
|
+
ExaminationStatsView,
|
|
6
|
+
VideoSegmentStatsView,
|
|
7
|
+
SensitiveMetaStatsView,
|
|
8
|
+
GeneralStatsView,
|
|
9
|
+
)
|
|
10
|
+
from .secure_file_url_view import SecureFileUrlView
|
|
11
|
+
from .secure_file_serving_view import SecureFileServingView
|
|
12
|
+
from .secure_url_validate import validate_secure_url
|
|
13
|
+
|
|
14
|
+
from .translation import (
|
|
15
|
+
ExaminationTranslationOptions,
|
|
16
|
+
FindingTranslationOptions,
|
|
17
|
+
FindingClassificationTranslationOptions,
|
|
18
|
+
FindingClassificationChoiceTranslationOptions,
|
|
19
|
+
InterventionTranslationOptions,
|
|
20
|
+
TranslatedFieldMixin,
|
|
21
|
+
TranslationMigrationHelper,
|
|
22
|
+
TranslatedFixtureLoader,
|
|
23
|
+
MODELTRANSLATION_SETTINGS
|
|
24
|
+
)
|
|
25
|
+
from .upload_views import (
|
|
26
|
+
UploadFileView,
|
|
27
|
+
UploadStatusView,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
"CenterViewSet",
|
|
32
|
+
'csrf_token_view',
|
|
33
|
+
|
|
34
|
+
# Gender view
|
|
35
|
+
"GenderViewSet",
|
|
36
|
+
|
|
37
|
+
# Stats views
|
|
38
|
+
'ExaminationStatsView',
|
|
39
|
+
'VideoSegmentStatsView',
|
|
40
|
+
'SensitiveMetaStatsView',
|
|
41
|
+
"GeneralStatsView",
|
|
42
|
+
|
|
43
|
+
# Secure File / URL views
|
|
44
|
+
"SecureFileUrlView",
|
|
45
|
+
"SecureFileServingView",
|
|
46
|
+
"validate_secure_url",
|
|
47
|
+
|
|
48
|
+
# Translation options
|
|
49
|
+
'ExaminationTranslationOptions',
|
|
50
|
+
'FindingTranslationOptions',
|
|
51
|
+
'FindingClassificationTranslationOptions',
|
|
52
|
+
'FindingClassificationChoiceTranslationOptions',
|
|
53
|
+
'InterventionTranslationOptions',
|
|
54
|
+
'TranslatedFieldMixin',
|
|
55
|
+
'TranslationMigrationHelper',
|
|
56
|
+
'TranslatedFixtureLoader',
|
|
57
|
+
'MODELTRANSLATION_SETTINGS',
|
|
58
|
+
|
|
59
|
+
# Upload views
|
|
60
|
+
'UploadFileView',
|
|
61
|
+
'UploadStatusView',
|
|
62
|
+
|
|
63
|
+
]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from endoreg_db.models import Center
|
|
2
|
+
from endoreg_db.serializers.administration import CenterSerializer
|
|
3
|
+
|
|
4
|
+
from endoreg_db.utils.permissions import DEBUG_PERMISSIONS
|
|
5
|
+
|
|
6
|
+
from rest_framework import viewsets
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class CenterViewSet(viewsets.ReadOnlyModelViewSet):
|
|
10
|
+
"""API endpoint für Center-Optionen (nur lesend)"""
|
|
11
|
+
queryset = Center.objects.all()
|
|
12
|
+
serializer_class = CenterSerializer
|
|
13
|
+
permission_classes = DEBUG_PERMISSIONS
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from rest_framework import viewsets
|
|
2
|
+
from rest_framework.permissions import IsAuthenticatedOrReadOnly
|
|
3
|
+
from ...models import Gender
|
|
4
|
+
from ...serializers.administration import GenderSerializer
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class GenderViewSet(viewsets.ReadOnlyModelViewSet):
|
|
8
|
+
"""
|
|
9
|
+
API endpoint for Gender options.
|
|
10
|
+
Provides read-only access to gender choices for patient forms.
|
|
11
|
+
"""
|
|
12
|
+
queryset = Gender.objects.all()
|
|
13
|
+
serializer_class = GenderSerializer
|
|
14
|
+
permission_classes = [IsAuthenticatedOrReadOnly]
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
from endoreg_db.models import RawPdfFile
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from django.http import Http404, HttpResponse
|
|
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
|
+
from pathlib import Path
|
|
12
|
+
import logging
|
|
13
|
+
from ...utils.paths import data_paths # Added for centralized path management
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SecureFileServingView(APIView):
|
|
19
|
+
"""
|
|
20
|
+
Serviert Dateien über sichere URLs mit Token-Validierung
|
|
21
|
+
GET /api/reports/{report_id}/secure-file/?token={token}
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def get(self, request, report_id):
|
|
25
|
+
token = request.GET.get('token')
|
|
26
|
+
|
|
27
|
+
if not token:
|
|
28
|
+
return Response(
|
|
29
|
+
{"error": "Token ist erforderlich"},
|
|
30
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
try:
|
|
34
|
+
report = get_object_or_404(RawPdfFile, id=report_id)
|
|
35
|
+
|
|
36
|
+
if not report.file:
|
|
37
|
+
raise Http404("Datei nicht gefunden")
|
|
38
|
+
|
|
39
|
+
# Token validieren (hier würde normalerweise eine Token-Speicherung/Validierung stattfinden)
|
|
40
|
+
# Für diese Implementierung nehmen wir an, dass das Token gültig ist
|
|
41
|
+
|
|
42
|
+
# Datei servieren
|
|
43
|
+
return self._serve_file(report.file)
|
|
44
|
+
|
|
45
|
+
except (ValueError, TypeError, OSError) as e:
|
|
46
|
+
logger.error("Fehler beim Servieren der Datei: %s", str(e))
|
|
47
|
+
raise Http404("Datei konnte nicht geladen werden") from e
|
|
48
|
+
|
|
49
|
+
def _serve_file(self, file_field):
|
|
50
|
+
"""Serviert die Datei als HTTP-Response"""
|
|
51
|
+
try:
|
|
52
|
+
file_path = Path(file_field.path)
|
|
53
|
+
|
|
54
|
+
with open(file_field.path, 'rb') as f:
|
|
55
|
+
response = HttpResponse(
|
|
56
|
+
f.read(),
|
|
57
|
+
content_type=self._get_content_type(file_path.suffix)
|
|
58
|
+
)
|
|
59
|
+
response['Content-Disposition'] = f'inline; filename="{file_path.name}"'
|
|
60
|
+
return response
|
|
61
|
+
|
|
62
|
+
except (OSError, IOError) as e:
|
|
63
|
+
logger.error("Fehler beim Lesen der Datei: %s", str(e))
|
|
64
|
+
raise Http404("Datei konnte nicht gelesen werden") from e
|
|
65
|
+
|
|
66
|
+
def _get_content_type(self, file_extension):
|
|
67
|
+
"""Ermittelt den Content-Type basierend auf der Dateiendung"""
|
|
68
|
+
content_types = {
|
|
69
|
+
'.pdf': 'application/pdf',
|
|
70
|
+
'.jpg': 'image/jpeg',
|
|
71
|
+
'.jpeg': 'image/jpeg',
|
|
72
|
+
'.png': 'image/png',
|
|
73
|
+
'.gif': 'image/gif',
|
|
74
|
+
'.bmp': 'image/bmp',
|
|
75
|
+
'.webp': 'image/webp',
|
|
76
|
+
'.txt': 'text/plain',
|
|
77
|
+
'.doc': 'application/msword',
|
|
78
|
+
'.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
79
|
+
}
|
|
80
|
+
return content_types.get(file_extension.lower(), 'application/octet-stream')
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
from endoreg_db.models import RawPdfFile
|
|
2
|
+
from endoreg_db.serializers.report.secure_file_url import SecureFileUrlSerializer
|
|
3
|
+
|
|
4
|
+
from django.shortcuts import get_object_or_404
|
|
5
|
+
from django.utils import timezone
|
|
6
|
+
from rest_framework import status
|
|
7
|
+
from rest_framework.response import Response
|
|
8
|
+
from rest_framework.views import APIView
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
import uuid
|
|
12
|
+
from datetime import timedelta
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
from ...utils.paths import data_paths # Added for centralized path management
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
class SecureFileUrlView(APIView):
|
|
20
|
+
"""
|
|
21
|
+
API-Endpunkt für sichere URL-Generierung
|
|
22
|
+
POST /api/secure-file-urls/
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def post(self, request):
|
|
26
|
+
report_id = request.data.get('report_id')
|
|
27
|
+
file_type = request.data.get('file_type', 'pdf')
|
|
28
|
+
|
|
29
|
+
if not report_id:
|
|
30
|
+
return Response(
|
|
31
|
+
{"error": "report_id ist erforderlich"},
|
|
32
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
report = get_object_or_404(RawPdfFile, id=report_id)
|
|
37
|
+
|
|
38
|
+
if not report.file:
|
|
39
|
+
return Response(
|
|
40
|
+
{"error": "Keine Datei für diesen Report verfügbar"},
|
|
41
|
+
status=status.HTTP_404_NOT_FOUND
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Sichere URL generieren
|
|
45
|
+
secure_url_data = self._generate_secure_url(report, request, file_type)
|
|
46
|
+
serializer = SecureFileUrlSerializer(data=secure_url_data)
|
|
47
|
+
|
|
48
|
+
if serializer.is_valid():
|
|
49
|
+
return Response(serializer.data)
|
|
50
|
+
else:
|
|
51
|
+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
52
|
+
|
|
53
|
+
except (ValueError, TypeError) as e:
|
|
54
|
+
logger.error("Fehler beim Generieren der sicheren URL: %s", str(e))
|
|
55
|
+
return Response(
|
|
56
|
+
{"error": "Sichere URL konnte nicht generiert werden"},
|
|
57
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def _generate_secure_url(self, report, request, file_type):
|
|
61
|
+
"""Generiert eine sichere URL mit Token"""
|
|
62
|
+
token = str(uuid.uuid4())
|
|
63
|
+
expires_at = timezone.now() + timedelta(hours=2)
|
|
64
|
+
|
|
65
|
+
secure_url = request.build_absolute_uri(
|
|
66
|
+
f"/api/reports/{report.id}/secure-file/?token={token}"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Dateigröße ermitteln
|
|
70
|
+
file_size = 0
|
|
71
|
+
try:
|
|
72
|
+
if report.file:
|
|
73
|
+
file_size = report.file.size
|
|
74
|
+
except OSError:
|
|
75
|
+
# Datei nicht verfügbar
|
|
76
|
+
file_size = 0
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
'url': secure_url,
|
|
80
|
+
'expires_at': expires_at,
|
|
81
|
+
'file_type': file_type,
|
|
82
|
+
'original_filename': Path(report.file.name).name if report.file else 'unknown',
|
|
83
|
+
'file_size': file_size
|
|
84
|
+
}
|