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,59 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from ...models import SensitiveMeta
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
class SensitiveMetaVerificationSerializer(serializers.Serializer):
|
|
9
|
+
"""
|
|
10
|
+
Simple serializer for bulk verification state updates.
|
|
11
|
+
Used when only updating verification flags.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
sensitive_meta_id = serializers.IntegerField()
|
|
15
|
+
dob_verified = serializers.BooleanField(required=False)
|
|
16
|
+
names_verified = serializers.BooleanField(required=False)
|
|
17
|
+
|
|
18
|
+
def validate_sensitive_meta_id(self, value):
|
|
19
|
+
"""
|
|
20
|
+
Validates that a SensitiveMeta object with the given ID exists and caches it.
|
|
21
|
+
|
|
22
|
+
Raises:
|
|
23
|
+
ValidationError: If no SensitiveMeta object is found with the specified ID.
|
|
24
|
+
"""
|
|
25
|
+
try:
|
|
26
|
+
# Retrieve and cache the SensitiveMeta instance to avoid a second query in the save method.
|
|
27
|
+
self._cached_sensitive_meta = SensitiveMeta.objects.get(id=value)
|
|
28
|
+
return value
|
|
29
|
+
except SensitiveMeta.DoesNotExist:
|
|
30
|
+
raise serializers.ValidationError(f"SensitiveMeta with ID {value} does not exist.")
|
|
31
|
+
|
|
32
|
+
def save(self):
|
|
33
|
+
"""
|
|
34
|
+
Updates the verification state for a specified SensitiveMeta instance.
|
|
35
|
+
|
|
36
|
+
Uses the cached SensitiveMeta object from validation, obtains or creates its verification state,
|
|
37
|
+
updates the `dob_verified` and `names_verified` fields if provided, and saves the changes.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
The updated verification state object.
|
|
41
|
+
"""
|
|
42
|
+
sensitive_meta_id = self.validated_data['sensitive_meta_id']
|
|
43
|
+
dob_verified = self.validated_data.get('dob_verified')
|
|
44
|
+
names_verified = self.validated_data.get('names_verified')
|
|
45
|
+
|
|
46
|
+
# Use the cached instance from the validation step, avoiding a redundant query.
|
|
47
|
+
sensitive_meta = self._cached_sensitive_meta
|
|
48
|
+
state = sensitive_meta.get_or_create_state()
|
|
49
|
+
|
|
50
|
+
if dob_verified is not None:
|
|
51
|
+
state.dob_verified = dob_verified
|
|
52
|
+
|
|
53
|
+
if names_verified is not None:
|
|
54
|
+
state.names_verified = names_verified
|
|
55
|
+
|
|
56
|
+
state.save()
|
|
57
|
+
|
|
58
|
+
logger.info(f"Updated verification state for SensitiveMeta {sensitive_meta_id}")
|
|
59
|
+
return state
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
from endoreg_db.models import VideoMeta, VideoImportMeta
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class VideoMetaSerializer(serializers.ModelSerializer):
|
|
7
|
+
fps = serializers.FloatField(read_only=True, allow_null=True)
|
|
8
|
+
duration = serializers.FloatField(read_only=True, allow_null=True)
|
|
9
|
+
width = serializers.IntegerField(read_only=True, allow_null=True)
|
|
10
|
+
height = serializers.IntegerField(read_only=True, allow_null=True)
|
|
11
|
+
frame_count = serializers.IntegerField(read_only=True, allow_null=True)
|
|
12
|
+
created_at = serializers.SerializerMethodField()
|
|
13
|
+
|
|
14
|
+
def get_created_at(self, obj):
|
|
15
|
+
# returns created_at if your model has it, else None
|
|
16
|
+
return getattr(obj, "created_at", None)
|
|
17
|
+
|
|
18
|
+
class Meta:
|
|
19
|
+
model = VideoMeta
|
|
20
|
+
fields = (
|
|
21
|
+
"id",
|
|
22
|
+
"fps",
|
|
23
|
+
"duration",
|
|
24
|
+
"width",
|
|
25
|
+
"height",
|
|
26
|
+
"frame_count",
|
|
27
|
+
"created_at",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class VideoImportMetaSerializer(serializers.ModelSerializer):
|
|
32
|
+
file_name = serializers.SerializerMethodField()
|
|
33
|
+
|
|
34
|
+
def get_file_name(self, obj):
|
|
35
|
+
return Path(obj.file_name).name if obj.file_name else None
|
|
36
|
+
|
|
37
|
+
class Meta:
|
|
38
|
+
model = VideoImportMeta
|
|
39
|
+
fields = ("id", "file_name", "video_anonymized")
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from .file_overview import FileOverviewSerializer
|
|
2
|
+
from .sensitive_patient_data import VoPPatientDataSerializer
|
|
3
|
+
from .stats import StatsSerializer
|
|
4
|
+
from .upload_job import UploadJobStatusSerializer, UploadCreateResponseSerializer
|
|
5
|
+
from .translatable_field_mix_in import TranslatableFieldMixin
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"FileOverviewSerializer",
|
|
9
|
+
"VoPPatientDataSerializer",
|
|
10
|
+
"StatsSerializer",
|
|
11
|
+
"UploadJobStatusSerializer",
|
|
12
|
+
"UploadCreateResponseSerializer",
|
|
13
|
+
"TranslatableFieldMixin"
|
|
14
|
+
]
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from rest_framework import serializers
|
|
4
|
+
|
|
5
|
+
from endoreg_db.models.media import RawPdfFile, VideoFile
|
|
6
|
+
from endoreg_db.models.state.raw_pdf import (
|
|
7
|
+
AnonymizationStatus as PdfAnonymizationStatus,
|
|
8
|
+
)
|
|
9
|
+
from endoreg_db.models.state.video import (
|
|
10
|
+
AnonymizationStatus as VideoAnonymizationStatus,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class FileOverviewSerializer(serializers.Serializer):
|
|
18
|
+
"""
|
|
19
|
+
Polymorphic "union" serializer – we normalise both model types
|
|
20
|
+
(VideoFile, RawPdfFile) into the data structure the Vue store needs.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
# --- fields expected by the front-end ---------------------------
|
|
24
|
+
# All fields are read_only since they're computed in to_representation
|
|
25
|
+
id = serializers.IntegerField(read_only=True)
|
|
26
|
+
filename = serializers.CharField(read_only=True)
|
|
27
|
+
mediaType = serializers.CharField(read_only=True)
|
|
28
|
+
anonymizationStatus = serializers.CharField(read_only=True)
|
|
29
|
+
annotationStatus = serializers.CharField(read_only=True)
|
|
30
|
+
createdAt = serializers.DateTimeField(read_only=True)
|
|
31
|
+
text = serializers.CharField(required=False, allow_blank=True, read_only=True)
|
|
32
|
+
anonymizedText = serializers.CharField(
|
|
33
|
+
required=False, allow_blank=True, read_only=True
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# --- converting DB objects to that shape -----------------------
|
|
37
|
+
def to_representation(self, instance):
|
|
38
|
+
"""
|
|
39
|
+
Return a unified dictionary representation of either a VideoFile or RawPdfFile instance for front-end use.
|
|
40
|
+
|
|
41
|
+
For VideoFile instances, extracts and structures metadata such as patient, examination, equipment, and examiner information, and generates an anonymized version of the text by replacing sensitive fields with placeholders. For RawPdfFile instances, extracts text and anonymized text directly and determines statuses based on available fields.
|
|
42
|
+
|
|
43
|
+
Parameters:
|
|
44
|
+
instance: A VideoFile or RawPdfFile object to be serialized.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
dict: A normalized dictionary containing id, filename, mediaType, anonymizationStatus, annotationStatus, createdAt, text, and anonymizedText fields.
|
|
48
|
+
|
|
49
|
+
Raises:
|
|
50
|
+
TypeError: If the instance is not a VideoFile or RawPdfFile.
|
|
51
|
+
"""
|
|
52
|
+
text = ""
|
|
53
|
+
anonym_text = ""
|
|
54
|
+
|
|
55
|
+
if isinstance(instance, VideoFile):
|
|
56
|
+
media_type = "video"
|
|
57
|
+
created_at = instance.uploaded_at
|
|
58
|
+
filename = instance.original_file_name or (
|
|
59
|
+
instance.raw_file.name.split("/")[-1]
|
|
60
|
+
if instance.raw_file
|
|
61
|
+
else "unknown"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
# ------- anonymization status using VideoState model
|
|
65
|
+
vs = instance.state
|
|
66
|
+
anonym_status = (
|
|
67
|
+
vs.anonymization_status if vs else VideoAnonymizationStatus.NOT_STARTED
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# ------- annotation status (validated label segments)
|
|
71
|
+
if instance.label_video_segments.filter(state__is_validated=True).exists():
|
|
72
|
+
annot_status = "done"
|
|
73
|
+
else:
|
|
74
|
+
annot_status = "not_started"
|
|
75
|
+
|
|
76
|
+
# ------- Extract text from sensitive_meta for videos
|
|
77
|
+
if instance.sensitive_meta:
|
|
78
|
+
sm = instance.sensitive_meta
|
|
79
|
+
# Create a structured text representation from sensitive meta
|
|
80
|
+
text_parts = []
|
|
81
|
+
|
|
82
|
+
# Patient information
|
|
83
|
+
if sm.patient_first_name or sm.patient_last_name:
|
|
84
|
+
patient_name = f"{sm.patient_first_name or ''} {sm.patient_last_name or ''}".strip()
|
|
85
|
+
text_parts.append(f"Patient: {patient_name}")
|
|
86
|
+
|
|
87
|
+
if sm.patient_dob:
|
|
88
|
+
text_parts.append(f"Date of Birth: {sm.patient_dob.date()}")
|
|
89
|
+
|
|
90
|
+
if sm.patient_gender:
|
|
91
|
+
text_parts.append(f"Gender: {sm.patient_gender}")
|
|
92
|
+
|
|
93
|
+
# Examination information
|
|
94
|
+
if sm.examination_date:
|
|
95
|
+
text_parts.append(f"Examination Date: {sm.examination_date}")
|
|
96
|
+
|
|
97
|
+
if sm.center:
|
|
98
|
+
text_parts.append(f"Center: {sm.center.name}")
|
|
99
|
+
|
|
100
|
+
# Equipment information
|
|
101
|
+
if sm.endoscope_type:
|
|
102
|
+
text_parts.append(f"Endoscope Type: {sm.endoscope_type}")
|
|
103
|
+
|
|
104
|
+
if sm.endoscope_sn:
|
|
105
|
+
text_parts.append(f"Endoscope SN: {sm.endoscope_sn}")
|
|
106
|
+
|
|
107
|
+
# Examiner information
|
|
108
|
+
if sm.pk: # Only if saved
|
|
109
|
+
try:
|
|
110
|
+
examiners = list(sm.examiners.all())
|
|
111
|
+
if examiners:
|
|
112
|
+
examiner_names = ", ".join(str(e) for e in examiners)
|
|
113
|
+
text_parts.append(f"Examiners: {examiner_names}")
|
|
114
|
+
except Exception:
|
|
115
|
+
pass # Ignore examiner lookup errors
|
|
116
|
+
|
|
117
|
+
text = "\n".join(text_parts)
|
|
118
|
+
|
|
119
|
+
# Create anonymized version by replacing sensitive data
|
|
120
|
+
anonym_text = text
|
|
121
|
+
if sm.patient_first_name:
|
|
122
|
+
anonym_text = anonym_text.replace(
|
|
123
|
+
sm.patient_first_name, "[FIRST_NAME]"
|
|
124
|
+
)
|
|
125
|
+
if sm.patient_last_name:
|
|
126
|
+
anonym_text = anonym_text.replace(
|
|
127
|
+
sm.patient_last_name, "[LAST_NAME]"
|
|
128
|
+
)
|
|
129
|
+
if sm.patient_dob:
|
|
130
|
+
anonym_text = anonym_text.replace(
|
|
131
|
+
str(sm.patient_dob.date()), "[DOB]"
|
|
132
|
+
)
|
|
133
|
+
if sm.endoscope_sn:
|
|
134
|
+
anonym_text = anonym_text.replace(sm.endoscope_sn, "[ENDOSCOPE_SN]")
|
|
135
|
+
|
|
136
|
+
# Replace examiner names if available
|
|
137
|
+
if sm.pk:
|
|
138
|
+
try:
|
|
139
|
+
examiners = list(sm.examiners.all())
|
|
140
|
+
for examiner in examiners:
|
|
141
|
+
anonym_text = anonym_text.replace(
|
|
142
|
+
str(examiner), "[EXAMINER]"
|
|
143
|
+
)
|
|
144
|
+
except Exception:
|
|
145
|
+
pass
|
|
146
|
+
|
|
147
|
+
elif isinstance(instance, RawPdfFile):
|
|
148
|
+
instance: RawPdfFile
|
|
149
|
+
media_type = "pdf"
|
|
150
|
+
created_at = instance.date_created
|
|
151
|
+
filename = instance.file.name.split("/")[-1] if instance.file else "unknown"
|
|
152
|
+
|
|
153
|
+
# ------- anonymization status using RawPdfState model (like VideoFile)
|
|
154
|
+
ps = instance.state
|
|
155
|
+
anonym_status = (
|
|
156
|
+
ps.anonymization_status if ps else PdfAnonymizationStatus.NOT_STARTED
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
# PDF annotation == "sensitive meta validated"
|
|
160
|
+
annot_status = (
|
|
161
|
+
"done"
|
|
162
|
+
if getattr(instance.sensitive_meta, "is_verified", False)
|
|
163
|
+
else "not_started"
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
# Extract text content from PDF
|
|
167
|
+
text = instance.text or ""
|
|
168
|
+
anonym_text = instance.anonymized_text or ""
|
|
169
|
+
|
|
170
|
+
else: # shouldn't happen
|
|
171
|
+
raise TypeError(f"Unsupported instance for overview: {type(instance)}")
|
|
172
|
+
|
|
173
|
+
return {
|
|
174
|
+
"id": instance.pk,
|
|
175
|
+
"filename": filename,
|
|
176
|
+
"mediaType": media_type,
|
|
177
|
+
"anonymizationStatus": anonym_status,
|
|
178
|
+
"annotationStatus": annot_status,
|
|
179
|
+
"createdAt": created_at,
|
|
180
|
+
"text": text,
|
|
181
|
+
"anonymizedText": anonym_text,
|
|
182
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
from endoreg_db.models.media import RawPdfFile, VideoFile
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from rest_framework import serializers
|
|
5
|
+
|
|
6
|
+
#TODO add this "naming convention" to the documentation
|
|
7
|
+
# VoP: Video or Pdf
|
|
8
|
+
|
|
9
|
+
class VoPPatientDataSerializer(serializers.Serializer):
|
|
10
|
+
"""
|
|
11
|
+
Serializer that converts a VideoFile or RawPdfFile to the structure
|
|
12
|
+
the Pinia store needs for validation workflow.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# Mark all fields as read_only since they're computed in to_representation
|
|
16
|
+
id = serializers.IntegerField(read_only=True)
|
|
17
|
+
sensitiveMetaId = serializers.IntegerField(read_only=True)
|
|
18
|
+
text = serializers.CharField(read_only=True)
|
|
19
|
+
anonymizedText = serializers.CharField(read_only=True)
|
|
20
|
+
reportMeta = serializers.JSONField(read_only=True)
|
|
21
|
+
status = serializers.CharField(read_only=True)
|
|
22
|
+
error = serializers.BooleanField(read_only=True)
|
|
23
|
+
|
|
24
|
+
def to_representation(self, instance):
|
|
25
|
+
"""
|
|
26
|
+
Serialize a VideoFile or RawPdfFile instance into a structured dictionary for validation workflows.
|
|
27
|
+
|
|
28
|
+
Depending on the instance type, constructs a dictionary containing identifiers, sensitive metadata, text summaries, anonymized text, processing status, and error flag. For VideoFile instances, generates a text summary from associated sensitive metadata and anonymizes personal identifiers. For RawPdfFile instances, uses the instance's text fields directly. Raises a TypeError if the instance is neither type.
|
|
29
|
+
|
|
30
|
+
Parameters:
|
|
31
|
+
instance: A VideoFile or RawPdfFile model instance to serialize.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
dict: A structured representation of the instance suitable for Pinia store consumption.
|
|
35
|
+
"""
|
|
36
|
+
if isinstance(instance, VideoFile):
|
|
37
|
+
# For videos, we don't have text content in the traditional sense
|
|
38
|
+
# But we can extract metadata text from sensitive_meta
|
|
39
|
+
text = ""
|
|
40
|
+
anonym_text = ""
|
|
41
|
+
|
|
42
|
+
if instance.sensitive_meta:
|
|
43
|
+
sm = instance.sensitive_meta
|
|
44
|
+
# Create a structured text representation similar to FileOverviewSerializer
|
|
45
|
+
text_parts = []
|
|
46
|
+
|
|
47
|
+
if sm.patient_first_name or sm.patient_last_name:
|
|
48
|
+
patient_name = f"{sm.patient_first_name or ''} {sm.patient_last_name or ''}".strip()
|
|
49
|
+
text_parts.append(f"Patient: {patient_name}")
|
|
50
|
+
|
|
51
|
+
if sm.patient_dob:
|
|
52
|
+
text_parts.append(f"Date of Birth: {sm.patient_dob.date()}")
|
|
53
|
+
|
|
54
|
+
if sm.examination_date:
|
|
55
|
+
text_parts.append(f"Examination Date: {sm.examination_date}")
|
|
56
|
+
|
|
57
|
+
if sm.center:
|
|
58
|
+
text_parts.append(f"Center: {sm.center.name}")
|
|
59
|
+
|
|
60
|
+
text = "\n".join(text_parts)
|
|
61
|
+
|
|
62
|
+
# Create anonymized version
|
|
63
|
+
anonym_text = text
|
|
64
|
+
if sm.patient_first_name:
|
|
65
|
+
anonym_text = anonym_text.replace(sm.patient_first_name, "[FIRST_NAME]")
|
|
66
|
+
if sm.patient_last_name:
|
|
67
|
+
anonym_text = anonym_text.replace(sm.patient_last_name, "[LAST_NAME]")
|
|
68
|
+
if sm.patient_dob:
|
|
69
|
+
anonym_text = anonym_text.replace(str(sm.patient_dob.date()), "[DOB]")
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
"id": instance.pk,
|
|
73
|
+
"sensitiveMetaId": instance.sensitive_meta.pk if instance.sensitive_meta else None,
|
|
74
|
+
"text": text,
|
|
75
|
+
"anonymizedText": anonym_text,
|
|
76
|
+
"reportMeta": self._serialize_sensitive_meta(instance.sensitive_meta) if instance.sensitive_meta else None,
|
|
77
|
+
"status": "processing" if instance.state and instance.state.frames_extracted else "not_started",
|
|
78
|
+
"error": False,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
elif isinstance(instance, RawPdfFile):
|
|
82
|
+
# Generate PDF streaming URL using pdf_id (RawPdfFile.id)
|
|
83
|
+
pdf_stream_url = f"/api/media/pdfs/{instance.pk}/stream/"
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
"id": instance.pk,
|
|
87
|
+
"sensitiveMetaId": instance.sensitive_meta.pk if instance.sensitive_meta else None,
|
|
88
|
+
"text": instance.text or "",
|
|
89
|
+
"anonymizedText": instance.anonymized_text or "",
|
|
90
|
+
"reportMeta": self._serialize_sensitive_meta(instance.sensitive_meta) if instance.sensitive_meta else None,
|
|
91
|
+
"status": "done" if instance.anonymized_text else "not_started",
|
|
92
|
+
"error": False,
|
|
93
|
+
"pdfStreamUrl": pdf_stream_url,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
else:
|
|
97
|
+
raise TypeError(f"Unsupported instance for VoPPatientDataSerializer: {type(instance)}")
|
|
98
|
+
|
|
99
|
+
def _serialize_sensitive_meta(self, sensitive_meta):
|
|
100
|
+
"""
|
|
101
|
+
Serialize a SensitiveMeta object into a dictionary with patient and examination details.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
dict or None: A dictionary containing patient and examination metadata fields, or None if sensitive_meta is not provided.
|
|
105
|
+
"""
|
|
106
|
+
if not sensitive_meta:
|
|
107
|
+
return None
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
"id": sensitive_meta.pk,
|
|
111
|
+
"patientFirstName": sensitive_meta.patient_first_name or "",
|
|
112
|
+
"patientLastName": sensitive_meta.patient_last_name or "",
|
|
113
|
+
"patientDob": sensitive_meta.patient_dob.isoformat() if sensitive_meta.patient_dob else "",
|
|
114
|
+
"patientGender": str(sensitive_meta.patient_gender) if sensitive_meta.patient_gender else "",
|
|
115
|
+
"examinationDate": sensitive_meta.examination_date.isoformat() if sensitive_meta.examination_date else "",
|
|
116
|
+
"centerName": sensitive_meta.center.name if sensitive_meta.center else "",
|
|
117
|
+
"endoscopeType": sensitive_meta.endoscope_type or "",
|
|
118
|
+
"endoscopeSn": sensitive_meta.endoscope_sn or "",
|
|
119
|
+
"isVerified": getattr(sensitive_meta, "is_verified", False),
|
|
120
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
|
|
3
|
+
class StatsSerializer(serializers.Serializer):
|
|
4
|
+
"""
|
|
5
|
+
Serializer for statistics data from AuditLedger.
|
|
6
|
+
|
|
7
|
+
This serializer defines the structure of statistics data and ensures
|
|
8
|
+
consistent API responses.
|
|
9
|
+
"""
|
|
10
|
+
totalCases = serializers.IntegerField()
|
|
11
|
+
totalVideos = serializers.IntegerField()
|
|
12
|
+
totalAnnotations = serializers.IntegerField()
|
|
13
|
+
totalAnonymizations = serializers.IntegerField()
|
|
14
|
+
totalImages = serializers.IntegerField()
|
|
15
|
+
videosCompleted = serializers.IntegerField()
|
|
16
|
+
videosAnonym = serializers.IntegerField()
|
|
17
|
+
|
|
18
|
+
# You can add additional fields or methods here as needed
|
|
19
|
+
# For example, to calculate derived statistics:
|
|
20
|
+
#TODO
|
|
21
|
+
def get_completion_percentage(self, obj):
|
|
22
|
+
"""
|
|
23
|
+
Calculates the percentage of completed videos out of the total videos.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
obj: A dictionary containing 'videosCompleted' and 'totalVideos' keys.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
The completion percentage as a float rounded to two decimal places, or 0 if totalVideos is zero or less.
|
|
30
|
+
"""
|
|
31
|
+
if obj['totalVideos'] > 0:
|
|
32
|
+
return round((obj['videosCompleted'] / obj['totalVideos']) * 100, 2)
|
|
33
|
+
return 0
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from django.utils.translation import get_language
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TranslatableFieldMixin:
|
|
5
|
+
"""Mixin für automatische Sprachauswahl basierend auf Accept-Language"""
|
|
6
|
+
|
|
7
|
+
def get_localized_name(self, obj, field_base='name'):
|
|
8
|
+
"""
|
|
9
|
+
Retrieve a localized value for a specified field from an object, using language preference fallbacks.
|
|
10
|
+
|
|
11
|
+
Attempts to return the value of the field with the current language code suffix (e.g., `name_en`). If unavailable or empty, falls back to the German (`_de`) version, then the English (`_en`) version, and finally the base field without a language suffix. Returns an empty string if no value is found.
|
|
12
|
+
|
|
13
|
+
Parameters:
|
|
14
|
+
obj: The object containing the translatable fields.
|
|
15
|
+
field_base (str): The base name of the field to localize (default is 'name').
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
str: The localized field value, or an empty string if none is available.
|
|
19
|
+
"""
|
|
20
|
+
current_lang = get_language() or 'en'
|
|
21
|
+
|
|
22
|
+
# Versuche sprachspezifisches Feld
|
|
23
|
+
lang_field = f"{field_base}_{current_lang}"
|
|
24
|
+
if hasattr(obj, lang_field):
|
|
25
|
+
value = getattr(obj, lang_field)
|
|
26
|
+
if value:
|
|
27
|
+
return value
|
|
28
|
+
|
|
29
|
+
# Fallback auf Deutsch
|
|
30
|
+
de_field = f"{field_base}_de"
|
|
31
|
+
if hasattr(obj, de_field):
|
|
32
|
+
value = getattr(obj, de_field)
|
|
33
|
+
if value:
|
|
34
|
+
return value
|
|
35
|
+
|
|
36
|
+
# Fallback auf Englisch
|
|
37
|
+
en_field = f"{field_base}_en"
|
|
38
|
+
if hasattr(obj, en_field):
|
|
39
|
+
value = getattr(obj, en_field)
|
|
40
|
+
if value:
|
|
41
|
+
return value
|
|
42
|
+
|
|
43
|
+
# Letzter Fallback auf Basis-Feld
|
|
44
|
+
return getattr(obj, field_base, '')
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
from endoreg_db.models.upload_job import UploadJob
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class UploadJobStatusSerializer(serializers.ModelSerializer):
|
|
6
|
+
"""
|
|
7
|
+
Read-only serializer for upload job status responses.
|
|
8
|
+
Returns status information for polling endpoints.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
sensitive_meta_id = serializers.IntegerField(
|
|
12
|
+
source='sensitive_meta.id',
|
|
13
|
+
read_only=True,
|
|
14
|
+
allow_null=True,
|
|
15
|
+
help_text="ID of the created SensitiveMeta record (only when anonymized)"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
# Optional helper fields for preview (can be populated by view if needed)
|
|
19
|
+
text = serializers.CharField(read_only=True, required=False, allow_blank=True)
|
|
20
|
+
anonymized_text = serializers.CharField(read_only=True, required=False, allow_blank=True)
|
|
21
|
+
|
|
22
|
+
class Meta:
|
|
23
|
+
model = UploadJob
|
|
24
|
+
fields = [
|
|
25
|
+
'status',
|
|
26
|
+
'error_detail',
|
|
27
|
+
'sensitive_meta_id',
|
|
28
|
+
'id',
|
|
29
|
+
'text',
|
|
30
|
+
'anonymized_text'
|
|
31
|
+
]
|
|
32
|
+
read_only_fields = fields
|
|
33
|
+
|
|
34
|
+
def to_representation(self, instance):
|
|
35
|
+
"""
|
|
36
|
+
Customize the representation to only include relevant fields based on status.
|
|
37
|
+
"""
|
|
38
|
+
data = super().to_representation(instance)
|
|
39
|
+
|
|
40
|
+
# Only include error_detail if status is error
|
|
41
|
+
if instance.status != UploadJob.Status.ERROR:
|
|
42
|
+
data.pop('error_detail', None)
|
|
43
|
+
|
|
44
|
+
# Only include sensitive_meta_id if status is anonymized and we have a meta record
|
|
45
|
+
if instance.status != UploadJob.Status.ANONYMIZED or not instance.sensitive_meta:
|
|
46
|
+
data.pop('sensitive_meta_id', None)
|
|
47
|
+
|
|
48
|
+
# Remove empty optional fields
|
|
49
|
+
if not data.get('text'):
|
|
50
|
+
data.pop('text', None)
|
|
51
|
+
if not data.get('anonymized_text'):
|
|
52
|
+
data.pop('anonymized_text', None)
|
|
53
|
+
|
|
54
|
+
return data
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class UploadCreateResponseSerializer(serializers.Serializer):
|
|
58
|
+
"""
|
|
59
|
+
Serializer for the initial upload response.
|
|
60
|
+
Returns upload_id and status_url for polling.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
upload_id = serializers.UUIDField(
|
|
64
|
+
read_only=True,
|
|
65
|
+
help_text="UUID of the created upload job"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
status_url = serializers.CharField(
|
|
69
|
+
read_only=True,
|
|
70
|
+
help_text="URL to poll for upload status updates"
|
|
71
|
+
)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
from endoreg_db.models import Patient, Gender, Center
|
|
3
|
+
from datetime import date
|
|
4
|
+
|
|
5
|
+
class PatientSerializer(serializers.ModelSerializer):
|
|
6
|
+
# Use the slug field "name" so that the gender is represented by its string value
|
|
7
|
+
gender = serializers.SlugRelatedField(
|
|
8
|
+
slug_field='name',
|
|
9
|
+
queryset=Gender.objects.all(),
|
|
10
|
+
required=False,
|
|
11
|
+
allow_null=True
|
|
12
|
+
)
|
|
13
|
+
center = serializers.SlugRelatedField(
|
|
14
|
+
slug_field='name',
|
|
15
|
+
queryset=Center.objects.all(),
|
|
16
|
+
required=False,
|
|
17
|
+
allow_null=True
|
|
18
|
+
)
|
|
19
|
+
age = serializers.SerializerMethodField()
|
|
20
|
+
|
|
21
|
+
class Meta:
|
|
22
|
+
model = Patient
|
|
23
|
+
fields = ['id', 'first_name', 'last_name', 'dob', 'gender', 'center',
|
|
24
|
+
'email', 'phone', 'patient_hash', 'is_real_person', 'age']
|
|
25
|
+
read_only_fields = ['id', 'age']
|
|
26
|
+
|
|
27
|
+
def get_age(self, obj):
|
|
28
|
+
"""Berechnet das Alter des Patienten"""
|
|
29
|
+
if obj.dob:
|
|
30
|
+
return obj.age()
|
|
31
|
+
return None
|
|
32
|
+
|
|
33
|
+
def validate_first_name(self, value):
|
|
34
|
+
"""Validiert den Vornamen"""
|
|
35
|
+
if not value or not value.strip():
|
|
36
|
+
raise serializers.ValidationError("Vorname ist erforderlich")
|
|
37
|
+
return value.strip()
|
|
38
|
+
|
|
39
|
+
def validate_last_name(self, value):
|
|
40
|
+
"""Validiert den Nachnamen"""
|
|
41
|
+
if not value or not value.strip():
|
|
42
|
+
raise serializers.ValidationError("Nachname ist erforderlich")
|
|
43
|
+
return value.strip()
|
|
44
|
+
|
|
45
|
+
def validate_dob(self, value):
|
|
46
|
+
"""Validiert das Geburtsdatum"""
|
|
47
|
+
if value and value > date.today():
|
|
48
|
+
raise serializers.ValidationError("Geburtsdatum kann nicht in der Zukunft liegen")
|
|
49
|
+
return value
|
|
50
|
+
|
|
51
|
+
def validate_email(self, value):
|
|
52
|
+
"""Validiert die E-Mail-Adresse"""
|
|
53
|
+
if value and '@' not in value:
|
|
54
|
+
raise serializers.ValidationError("Ungültige E-Mail-Adresse")
|
|
55
|
+
return value
|
|
56
|
+
|
|
57
|
+
def create(self, validated_data):
|
|
58
|
+
"""Erstellt einen neuen Patienten mit verbesserter Fehlerbehandlung"""
|
|
59
|
+
try:
|
|
60
|
+
patient = Patient.objects.create(**validated_data)
|
|
61
|
+
return patient
|
|
62
|
+
except Exception as e:
|
|
63
|
+
raise serializers.ValidationError(f"Fehler beim Erstellen des Patienten: {str(e)}")
|
|
64
|
+
|
|
65
|
+
def update(self, instance, validated_data):
|
|
66
|
+
"""
|
|
67
|
+
Update an existing Patient instance with validated data.
|
|
68
|
+
|
|
69
|
+
Parameters:
|
|
70
|
+
instance (Patient): The Patient instance to update.
|
|
71
|
+
validated_data (dict): Dictionary of validated data to update the instance with.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
Patient: The updated Patient instance.
|
|
75
|
+
|
|
76
|
+
Raises:
|
|
77
|
+
ValidationError: If an error occurs during the update process.
|
|
78
|
+
"""
|
|
79
|
+
try:
|
|
80
|
+
for attr, value in validated_data.items():
|
|
81
|
+
setattr(instance, attr, value)
|
|
82
|
+
instance.save()
|
|
83
|
+
return instance
|
|
84
|
+
except Exception as e:
|
|
85
|
+
raise serializers.ValidationError(f"Fehler beim Aktualisieren des Patienten: {str(e)}")
|
|
86
|
+
|