endoreg-db 0.8.9.32__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/__init__.py +0 -0
- endoreg_db/_version.py +34 -0
- endoreg_db/admin.py +97 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +17 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/authz/auth.py +78 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +20 -0
- endoreg_db/authz/middleware.py +84 -0
- endoreg_db/authz/permissions.py +138 -0
- endoreg_db/authz/policy.py +224 -0
- endoreg_db/authz/settings.py +64 -0
- endoreg_db/authz/views_auth.py +70 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +99 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +106 -0
- endoreg_db/config/settings/__init__.py +6 -0
- endoreg_db/config/settings/base.py +148 -0
- endoreg_db/config/settings/case_gen.py +32 -0
- endoreg_db/config/settings/dev.py +108 -0
- endoreg_db/config/settings/keycloak.py +177 -0
- endoreg_db/config/settings/prod.py +66 -0
- endoreg_db/config/settings/test.py +72 -0
- endoreg_db/data/__init__.py +135 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +99 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +172 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +5 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +359 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +90 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +97 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/00_generic.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_baseline.yaml +23 -0
- endoreg_db/data/finding_classification_choice/00_generic_complication.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_histology.yaml +21 -0
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_bowel_preparation.yaml +49 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_generic.yaml +19 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_histology.yaml +20 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_location.yaml +248 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_morphology.yaml +75 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/00_generic.yaml +53 -0
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_type/data.yaml +39 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- endoreg_db/data/requirement/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement/old/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/old/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/old/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/old/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/old/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/old/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/old/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/old/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/old/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/old/gender.yaml +0 -0
- endoreg_db/data/requirement/old/lab_value.yaml +441 -0
- endoreg_db/data/requirement/old/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/_old/age.yaml +13 -0
- endoreg_db/data/requirement_operator/_old/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/_old/model_operators.yaml +96 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +65 -0
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set_type/data.yaml +41 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +32 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +24 -0
- endoreg_db/export/frames/export.py +6 -0
- endoreg_db/export/frames/export_frames_with_labels.py +616 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +4 -0
- endoreg_db/forms/examination_form.py +12 -0
- endoreg_db/forms/patient_finding_intervention_form.py +40 -0
- endoreg_db/forms/patient_form.py +23 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +11 -0
- endoreg_db/forms/unit.py +7 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +48 -0
- endoreg_db/helpers/data_loader.py +280 -0
- endoreg_db/helpers/default_objects.py +414 -0
- endoreg_db/helpers/download_segmentation_model.py +32 -0
- endoreg_db/helpers/interact.py +1 -0
- endoreg_db/helpers/test_video_helper.py +127 -0
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +83 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +42 -0
- endoreg_db/import_files/context/validate_directories.py +57 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +99 -0
- endoreg_db/import_files/file_storage/create_video_file.py +104 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +42 -0
- endoreg_db/import_files/file_storage/state_management.py +463 -0
- endoreg_db/import_files/file_storage/storage.py +42 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +99 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/pseudonymization/__init__.py +0 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +181 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +139 -0
- endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
- endoreg_db/import_files/report_import_service.py +147 -0
- endoreg_db/import_files/video_import_service.py +154 -0
- endoreg_db/logger_conf.py +156 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +132 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +177 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +419 -0
- endoreg_db/management/commands/export_frame_annot.py +196 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +206 -0
- endoreg_db/management/commands/fix_video_paths.py +186 -0
- endoreg_db/management/commands/import_report.py +361 -0
- endoreg_db/management/commands/list_routes.py +20 -0
- endoreg_db/management/commands/load_ai_model_data.py +83 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +60 -0
- endoreg_db/management/commands/load_base_db_data.py +63 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +39 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +38 -0
- endoreg_db/management/commands/load_disease_classification_data.py +38 -0
- endoreg_db/management/commands/load_disease_data.py +59 -0
- endoreg_db/management/commands/load_distribution_data.py +63 -0
- endoreg_db/management/commands/load_endoscope_data.py +58 -0
- endoreg_db/management/commands/load_event_data.py +39 -0
- endoreg_db/management/commands/load_examination_data.py +78 -0
- endoreg_db/management/commands/load_examination_indication_data.py +85 -0
- endoreg_db/management/commands/load_finding_data.py +115 -0
- endoreg_db/management/commands/load_gender_data.py +37 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +142 -0
- endoreg_db/management/commands/load_information_source.py +46 -0
- endoreg_db/management/commands/load_lab_value_data.py +52 -0
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_medication_data.py +104 -0
- endoreg_db/management/commands/load_name_data.py +36 -0
- endoreg_db/management/commands/load_organ_data.py +39 -0
- endoreg_db/management/commands/load_pdf_type_data.py +58 -0
- endoreg_db/management/commands/load_profession_data.py +40 -0
- endoreg_db/management/commands/load_qualification_data.py +56 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +40 -0
- endoreg_db/management/commands/load_requirement_data.py +207 -0
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +57 -0
- endoreg_db/management/commands/load_shift_data.py +57 -0
- endoreg_db/management/commands/load_tag_data.py +54 -0
- endoreg_db/management/commands/load_unit_data.py +40 -0
- endoreg_db/management/commands/load_user_groups.py +26 -0
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +70 -0
- endoreg_db/management/commands/setup_endoreg_db.py +459 -0
- endoreg_db/management/commands/start_filewatcher.py +115 -0
- endoreg_db/management/commands/storage_management.py +622 -0
- endoreg_db/management/commands/summarize_db_content.py +280 -0
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +189 -0
- endoreg_db/management/commands/video_validation.py +20 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1953 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +322 -0
- endoreg_db/models/administration/__init__.py +95 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +180 -0
- endoreg_db/models/administration/ai/model_type.py +42 -0
- endoreg_db/models/administration/case/__init__.py +5 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +3 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +85 -0
- endoreg_db/models/administration/center/center_product.py +67 -0
- endoreg_db/models/administration/center/center_resource.py +69 -0
- endoreg_db/models/administration/center/center_shift.py +94 -0
- endoreg_db/models/administration/center/center_waste.py +42 -0
- endoreg_db/models/administration/person/__init__.py +26 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +40 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +44 -0
- endoreg_db/models/administration/person/employee/employee_type.py +50 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +64 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +20 -0
- endoreg_db/models/administration/person/names/last_name.py +20 -0
- endoreg_db/models/administration/person/patient/__init__.py +7 -0
- endoreg_db/models/administration/person/patient/patient.py +488 -0
- endoreg_db/models/administration/person/patient/patient_external_id.py +36 -0
- endoreg_db/models/administration/person/person.py +35 -0
- endoreg_db/models/administration/person/profession/__init__.py +28 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +41 -0
- endoreg_db/models/administration/product/__init__.py +15 -0
- endoreg_db/models/administration/product/product.py +106 -0
- endoreg_db/models/administration/product/product_group.py +41 -0
- endoreg_db/models/administration/product/product_material.py +60 -0
- endoreg_db/models/administration/product/product_weight.py +51 -0
- endoreg_db/models/administration/product/reference_product.py +147 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +43 -0
- endoreg_db/models/administration/qualification/qualification_type.py +39 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +72 -0
- endoreg_db/models/administration/shift/shift.py +57 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +23 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +85 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +61 -0
- endoreg_db/models/label/label.py +91 -0
- endoreg_db/models/label/label_set.py +68 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +42 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +611 -0
- endoreg_db/models/label/video_segmentation_label.py +35 -0
- endoreg_db/models/label/video_segmentation_labelset.py +28 -0
- endoreg_db/models/media/__init__.py +23 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +137 -0
- endoreg_db/models/media/pdf/__init__.py +12 -0
- endoreg_db/models/media/pdf/raw_pdf.py +764 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +85 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +46 -0
- endoreg_db/models/media/video/__init__.py +9 -0
- endoreg_db/models/media/video/create_from_file.py +402 -0
- endoreg_db/models/media/video/pipe_1.py +258 -0
- endoreg_db/models/media/video/pipe_2.py +129 -0
- endoreg_db/models/media/video/video_file.py +907 -0
- endoreg_db/models/media/video/video_file_ai.py +828 -0
- endoreg_db/models/media/video/video_file_anonymize.py +524 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +49 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +25 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +126 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +233 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +36 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +13 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +24 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +40 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +44 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +30 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +205 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +228 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +107 -0
- endoreg_db/models/media/video/video_file_io.py +272 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +58 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +62 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +183 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +198 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +178 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +105 -0
- endoreg_db/models/media/video/video_file_segments.py +317 -0
- endoreg_db/models/media/video/video_metadata.py +67 -0
- endoreg_db/models/media/video/video_processing.py +192 -0
- endoreg_db/models/medical/__init__.py +136 -0
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +29 -0
- endoreg_db/models/medical/disease.py +174 -0
- endoreg_db/models/medical/event.py +154 -0
- endoreg_db/models/medical/examination/__init__.py +20 -0
- endoreg_db/models/medical/examination/examination.py +183 -0
- endoreg_db/models/medical/examination/examination_indication.py +229 -0
- endoreg_db/models/medical/examination/examination_time.py +68 -0
- endoreg_db/models/medical/examination/examination_time_type.py +44 -0
- endoreg_db/models/medical/examination/examination_type.py +47 -0
- endoreg_db/models/medical/finding/__init__.py +20 -0
- endoreg_db/models/medical/finding/finding.py +113 -0
- endoreg_db/models/medical/finding/finding_classification.py +131 -0
- endoreg_db/models/medical/finding/finding_intervention.py +68 -0
- endoreg_db/models/medical/finding/finding_type.py +38 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +77 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +490 -0
- endoreg_db/models/medical/medication/__init__.py +23 -0
- endoreg_db/models/medical/medication/medication.py +45 -0
- endoreg_db/models/medical/medication/medication_indication.py +78 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +58 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +58 -0
- endoreg_db/models/medical/medication/medication_schedule.py +58 -0
- endoreg_db/models/medical/organ/__init__.py +38 -0
- endoreg_db/models/medical/patient/__init__.py +48 -0
- endoreg_db/models/medical/patient/medication_examples.py +56 -0
- endoreg_db/models/medical/patient/patient_disease.py +72 -0
- endoreg_db/models/medical/patient/patient_event.py +80 -0
- endoreg_db/models/medical/patient/patient_examination.py +280 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +57 -0
- endoreg_db/models/medical/patient/patient_finding.py +416 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +231 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +37 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +157 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +247 -0
- endoreg_db/models/medical/patient/patient_medication.py +111 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +152 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +73 -0
- endoreg_db/models/medical/risk/risk_type.py +54 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/model_meta.py +266 -0
- endoreg_db/models/metadata/model_meta_logic.py +485 -0
- endoreg_db/models/metadata/pdf_meta.py +96 -0
- endoreg_db/models/metadata/sensitive_meta.py +345 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1161 -0
- endoreg_db/models/metadata/video_meta.py +459 -0
- endoreg_db/models/metadata/video_prediction_logic.py +232 -0
- endoreg_db/models/metadata/video_prediction_meta.py +319 -0
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +46 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +22 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +163 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +50 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +211 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +23 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +110 -0
- endoreg_db/models/other/gender.py +32 -0
- endoreg_db/models/other/information_source.py +190 -0
- endoreg_db/models/other/material.py +34 -0
- endoreg_db/models/other/resource.py +24 -0
- endoreg_db/models/other/tag.py +32 -0
- endoreg_db/models/other/transport_route.py +40 -0
- endoreg_db/models/other/unit.py +40 -0
- endoreg_db/models/other/waste.py +28 -0
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +5 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +792 -0
- endoreg_db/models/requirement/requirement_error.py +84 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +137 -0
- endoreg_db/models/requirement/requirement_operator.py +187 -0
- endoreg_db/models/requirement/requirement_set.py +327 -0
- endoreg_db/models/state/__init__.py +13 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/anonymization.py +30 -0
- endoreg_db/models/state/audit_ledger.py +155 -0
- endoreg_db/models/state/label_video_segment.py +31 -0
- endoreg_db/models/state/processing_history/__init__.py +3 -0
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +219 -0
- endoreg_db/models/state/sensitive_meta.py +50 -0
- endoreg_db/models/state/video.py +251 -0
- endoreg_db/models/upload_job.py +100 -0
- endoreg_db/models/utils.py +138 -0
- endoreg_db/queries/__init__.py +3 -0
- endoreg_db/queries/annotations/__init__.py +1 -0
- endoreg_db/queries/annotations/legacy.py +169 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/root_urls.py +27 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +30 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +861 -0
- endoreg_db/serializers/__init__.py +104 -0
- endoreg_db/serializers/administration/__init__.py +13 -0
- endoreg_db/serializers/administration/ai/__init__.py +9 -0
- endoreg_db/serializers/administration/ai/active_model.py +12 -0
- endoreg_db/serializers/administration/ai/ai_model.py +20 -0
- endoreg_db/serializers/administration/ai/model_type.py +12 -0
- endoreg_db/serializers/administration/center.py +14 -0
- endoreg_db/serializers/administration/gender.py +11 -0
- endoreg_db/serializers/anonymization.py +77 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +45 -0
- endoreg_db/serializers/examination/dropdown.py +20 -0
- endoreg_db/serializers/examination_serializer.py +9 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +61 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +11 -0
- endoreg_db/serializers/label_video_segment/__init__.py +9 -0
- endoreg_db/serializers/label_video_segment/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/label_video_segment/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +427 -0
- endoreg_db/serializers/meta/__init__.py +13 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +122 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +153 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +62 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +72 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +144 -0
- endoreg_db/serializers/misc/stats.py +35 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +74 -0
- endoreg_db/serializers/patient/__init__.py +12 -0
- endoreg_db/serializers/patient/patient.py +103 -0
- endoreg_db/serializers/patient/patient_dropdown.py +35 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +168 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +32 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +47 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +62 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +28 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +40 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +135 -0
- endoreg_db/serializers/pdf/__init__.py +3 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +101 -0
- endoreg_db/serializers/requirements/requirement_schema.py +20 -0
- endoreg_db/serializers/requirements/requirement_sets.py +99 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +301 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/video_file.py +283 -0
- endoreg_db/serializers/video/video_file_brief.py +14 -0
- endoreg_db/serializers/video/video_file_detail.py +96 -0
- endoreg_db/serializers/video/video_file_list.py +100 -0
- endoreg_db/serializers/video/video_processing_history.py +172 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +274 -0
- endoreg_db/services/examination_evaluation.py +172 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +424 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/pdf_import.py +0 -0
- endoreg_db/services/polling_coordinator.py +319 -0
- endoreg_db/services/pseudonym_service.py +94 -0
- endoreg_db/services/report_import.py +13 -0
- endoreg_db/services/segment_sync.py +171 -0
- endoreg_db/services/video_import.py +9 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +56 -0
- endoreg_db/urls/ai.py +14 -0
- endoreg_db/urls/anonymization.py +78 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +34 -0
- endoreg_db/urls/examination.py +63 -0
- endoreg_db/urls/media.py +251 -0
- endoreg_db/urls/patient.py +23 -0
- endoreg_db/urls/requirements.py +15 -0
- endoreg_db/urls/root_urls.py +28 -0
- endoreg_db/urls/stats.py +54 -0
- endoreg_db/urls/upload.py +12 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +97 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
- endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
- endoreg_db/utils/ai/get.py +6 -0
- endoreg_db/utils/ai/inference_dataset.py +51 -0
- endoreg_db/utils/ai/model_training/config.py +117 -0
- endoreg_db/utils/ai/model_training/dataset.py +74 -0
- endoreg_db/utils/ai/model_training/losses.py +68 -0
- endoreg_db/utils/ai/model_training/metrics.py +78 -0
- endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
- endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
- endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +270 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +293 -0
- endoreg_db/utils/ai/preprocess.py +76 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +32 -0
- endoreg_db/utils/check_video_files.py +175 -0
- endoreg_db/utils/cropping.py +30 -0
- endoreg_db/utils/dataloader.py +285 -0
- endoreg_db/utils/dates.py +59 -0
- endoreg_db/utils/defaults/set_default_center.py +33 -0
- endoreg_db/utils/env.py +37 -0
- endoreg_db/utils/extract_specific_frames.py +87 -0
- endoreg_db/utils/file_operations.py +70 -0
- endoreg_db/utils/fix_video_path_direct.py +157 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +138 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +237 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +82 -0
- endoreg_db/utils/ocr.py +195 -0
- endoreg_db/utils/operation_log.py +87 -0
- endoreg_db/utils/parse_and_generate_yaml.py +45 -0
- endoreg_db/utils/paths.py +159 -0
- endoreg_db/utils/permissions.py +160 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +144 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +22 -0
- endoreg_db/utils/product/sum_weights.py +20 -0
- endoreg_db/utils/pydantic_models/__init__.py +5 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +678 -0
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +842 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +114 -0
- endoreg_db/utils/setup_config.py +196 -0
- endoreg_db/utils/storage.py +117 -0
- endoreg_db/utils/translation.py +31 -0
- endoreg_db/utils/uuid.py +5 -0
- endoreg_db/utils/validate_endo_roi.py +33 -0
- endoreg_db/utils/validate_subcategory_dict.py +93 -0
- endoreg_db/utils/validate_video_detailed.py +415 -0
- endoreg_db/utils/video/__init__.py +30 -0
- endoreg_db/utils/video/extract_frames.py +100 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +996 -0
- endoreg_db/utils/video/names.py +47 -0
- endoreg_db/utils/video/streaming_processor.py +386 -0
- endoreg_db/utils/video/video_splitter.py +105 -0
- endoreg_db/versioning.md +79 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +247 -0
- endoreg_db/views/__init__.py +157 -0
- endoreg_db/views/anonymization/__init__.py +31 -0
- endoreg_db/views/anonymization/media_management.py +486 -0
- endoreg_db/views/anonymization/overview.py +307 -0
- endoreg_db/views/anonymization/validate.py +310 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +146 -0
- endoreg_db/views/examination/__init__.py +30 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +62 -0
- endoreg_db/views/examination/get_finding_classifications.py +38 -0
- endoreg_db/views/examination/get_findings.py +39 -0
- endoreg_db/views/examination/get_instruments.py +19 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +116 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +41 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +54 -0
- endoreg_db/views/media/__init__.py +32 -0
- endoreg_db/views/media/pdf_media.py +411 -0
- endoreg_db/views/media/sensitive_metadata.py +372 -0
- endoreg_db/views/media/video_media.py +275 -0
- endoreg_db/views/meta/__init__.py +7 -0
- endoreg_db/views/meta/sensitive_meta_list.py +102 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +74 -0
- endoreg_db/views/misc/__init__.py +29 -0
- endoreg_db/views/misc/center.py +14 -0
- endoreg_db/views/misc/csrf.py +8 -0
- endoreg_db/views/misc/gender.py +15 -0
- endoreg_db/views/misc/stats.py +255 -0
- endoreg_db/views/misc/upload_views.py +241 -0
- endoreg_db/views/patient/__init__.py +3 -0
- endoreg_db/views/patient/patient.py +253 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +141 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +58 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +72 -0
- endoreg_db/views/patient_examination/video.py +228 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +71 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +291 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +75 -0
- endoreg_db/views/report/__init__.py +7 -0
- endoreg_db/views/report/reimport.py +177 -0
- endoreg_db/views/report/report_stream.py +191 -0
- endoreg_db/views/requirement/__init__.py +11 -0
- endoreg_db/views/requirement/evaluate.py +278 -0
- endoreg_db/views/requirement/lookup.py +380 -0
- endoreg_db/views/requirement/lookup_store.py +183 -0
- endoreg_db/views/requirement/requirement_utils.py +87 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +266 -0
- endoreg_db/views/video/__init__.py +49 -0
- endoreg_db/views/video/ai/__init__.py +8 -0
- endoreg_db/views/video/ai/label.py +159 -0
- endoreg_db/views/video/correction.py +529 -0
- endoreg_db/views/video/reimport.py +230 -0
- endoreg_db/views/video/segments_crud.py +709 -0
- endoreg_db/views/video/video_apply_mask.py +49 -0
- endoreg_db/views/video/video_correction.py +22 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_metadata.py +101 -0
- endoreg_db/views/video/video_processing_history.py +25 -0
- endoreg_db/views/video/video_remove_frames.py +49 -0
- endoreg_db/views/video/video_stream.py +334 -0
- endoreg_db-0.8.9.32.dist-info/METADATA +404 -0
- endoreg_db-0.8.9.32.dist-info/RECORD +787 -0
- endoreg_db-0.8.9.32.dist-info/WHEEL +4 -0
- endoreg_db-0.8.9.32.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
from django.db import transaction
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from ...models import SensitiveMeta, Center, Gender
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SensitiveMetaUpdateSerializer(serializers.ModelSerializer):
|
|
11
|
+
"""
|
|
12
|
+
Serializer for updating SensitiveMeta fields including verification state.
|
|
13
|
+
Handles partial updates and state management.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
# Verification state fields
|
|
17
|
+
dob_verified = serializers.BooleanField(required=False)
|
|
18
|
+
names_verified = serializers.BooleanField(required=False)
|
|
19
|
+
|
|
20
|
+
# Center can be updated by name
|
|
21
|
+
center_name = serializers.CharField(write_only=True, required=False)
|
|
22
|
+
|
|
23
|
+
# Gender can be updated by name
|
|
24
|
+
patient_gender_name = serializers.CharField(write_only=True, required=False)
|
|
25
|
+
|
|
26
|
+
class Meta:
|
|
27
|
+
model = SensitiveMeta
|
|
28
|
+
fields = [
|
|
29
|
+
"patient_first_name",
|
|
30
|
+
"patient_last_name",
|
|
31
|
+
"patient_dob",
|
|
32
|
+
"examination_date",
|
|
33
|
+
"center_name",
|
|
34
|
+
"patient_gender_name",
|
|
35
|
+
"endoscope_type",
|
|
36
|
+
"endoscope_sn",
|
|
37
|
+
"examiner_first_name",
|
|
38
|
+
"examiner_last_name",
|
|
39
|
+
"dob_verified",
|
|
40
|
+
"names_verified",
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
def validate_center_name(self, value):
|
|
44
|
+
"""
|
|
45
|
+
Validates that a center with the given natural key exists.
|
|
46
|
+
|
|
47
|
+
Raises a validation error if the specified center does not exist.
|
|
48
|
+
"""
|
|
49
|
+
if value:
|
|
50
|
+
try:
|
|
51
|
+
Center.objects.get_by_natural_key(value)
|
|
52
|
+
return value
|
|
53
|
+
except Center.DoesNotExist:
|
|
54
|
+
raise serializers.ValidationError(f"Center '{value}' does not exist.")
|
|
55
|
+
return value
|
|
56
|
+
|
|
57
|
+
def validate_patient_gender_name(self, value):
|
|
58
|
+
"""
|
|
59
|
+
Validates that a gender with the given name exists.
|
|
60
|
+
|
|
61
|
+
Raises a validation error if no matching Gender is found.
|
|
62
|
+
"""
|
|
63
|
+
if value:
|
|
64
|
+
try:
|
|
65
|
+
Gender.objects.get(name=value)
|
|
66
|
+
return value
|
|
67
|
+
except Gender.DoesNotExist:
|
|
68
|
+
raise serializers.ValidationError(f"Gender '{value}' does not exist.")
|
|
69
|
+
return value
|
|
70
|
+
|
|
71
|
+
def validate(self, data):
|
|
72
|
+
"""
|
|
73
|
+
Validate that patient first and last names, if provided, are not empty strings.
|
|
74
|
+
|
|
75
|
+
Raises a validation error if either `patient_first_name` or `patient_last_name` is present but empty.
|
|
76
|
+
"""
|
|
77
|
+
# Ensure names are not empty if provided
|
|
78
|
+
first_name = data.get("patient_first_name")
|
|
79
|
+
if first_name is not None and not first_name.strip():
|
|
80
|
+
raise serializers.ValidationError(
|
|
81
|
+
{"patient_first_name": "First name cannot be empty."}
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
last_name = data.get("patient_last_name")
|
|
85
|
+
if last_name is not None and not last_name.strip():
|
|
86
|
+
raise serializers.ValidationError(
|
|
87
|
+
{"patient_last_name": "Last name cannot be empty."}
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
return data
|
|
91
|
+
|
|
92
|
+
@transaction.atomic
|
|
93
|
+
def update(self, instance, validated_data):
|
|
94
|
+
"""
|
|
95
|
+
Updates a SensitiveMeta instance with provided data, including related center, gender, and verification state fields.
|
|
96
|
+
|
|
97
|
+
Handles assignment of related Center and Gender objects by name, updates model fields, and manages verification state flags (`dob_verified`, `names_verified`) in the associated state object if provided.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
SensitiveMeta: The updated SensitiveMeta instance.
|
|
101
|
+
"""
|
|
102
|
+
# Extract verification state data
|
|
103
|
+
dob_verified = validated_data.pop("dob_verified", None)
|
|
104
|
+
names_verified = validated_data.pop("names_verified", None)
|
|
105
|
+
|
|
106
|
+
# Extract and handle center update
|
|
107
|
+
center_name = validated_data.pop("center_name", None)
|
|
108
|
+
if center_name:
|
|
109
|
+
try:
|
|
110
|
+
center = Center.objects.get_by_natural_key(center_name)
|
|
111
|
+
instance.center = center
|
|
112
|
+
except Center.DoesNotExist:
|
|
113
|
+
logger.error(f"Center '{center_name}' not found during update")
|
|
114
|
+
raise serializers.ValidationError(
|
|
115
|
+
f"Center '{center_name}' does not exist."
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Extract and handle gender update
|
|
119
|
+
patient_gender_name = validated_data.pop("patient_gender_name", None)
|
|
120
|
+
if patient_gender_name:
|
|
121
|
+
try:
|
|
122
|
+
gender = Gender.objects.get(name=patient_gender_name)
|
|
123
|
+
instance.patient_gender = gender
|
|
124
|
+
except Gender.DoesNotExist:
|
|
125
|
+
logger.error(f"Gender '{patient_gender_name}' not found during update")
|
|
126
|
+
raise serializers.ValidationError(
|
|
127
|
+
f"Gender '{patient_gender_name}' does not exist."
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
# Update regular fields using the model's update_from_dict method
|
|
131
|
+
if validated_data:
|
|
132
|
+
instance.update_from_dict(validated_data)
|
|
133
|
+
|
|
134
|
+
# Update verification state if provided
|
|
135
|
+
if dob_verified is not None or names_verified is not None:
|
|
136
|
+
# Ensure state exists
|
|
137
|
+
state = instance.get_or_create_state()
|
|
138
|
+
|
|
139
|
+
if dob_verified is not None:
|
|
140
|
+
state.dob_verified = dob_verified
|
|
141
|
+
logger.info(
|
|
142
|
+
f"Updated DOB verification for SensitiveMeta {instance.pk}: {dob_verified}"
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
if names_verified is not None:
|
|
146
|
+
state.names_verified = names_verified
|
|
147
|
+
logger.info(
|
|
148
|
+
f"Updated names verification for SensitiveMeta {instance.pk}: {names_verified}"
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
state.save()
|
|
152
|
+
|
|
153
|
+
return instance
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from ...models import SensitiveMeta
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SensitiveMetaVerificationSerializer(serializers.Serializer):
|
|
10
|
+
"""
|
|
11
|
+
Simple serializer for bulk verification state updates.
|
|
12
|
+
Used when only updating verification flags.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
sensitive_meta_id = serializers.IntegerField()
|
|
16
|
+
dob_verified = serializers.BooleanField(required=False)
|
|
17
|
+
names_verified = serializers.BooleanField(required=False)
|
|
18
|
+
|
|
19
|
+
def validate_sensitive_meta_id(self, value):
|
|
20
|
+
"""
|
|
21
|
+
Validates that a SensitiveMeta object with the given ID exists and caches it.
|
|
22
|
+
|
|
23
|
+
Raises:
|
|
24
|
+
ValidationError: If no SensitiveMeta object is found with the specified ID.
|
|
25
|
+
"""
|
|
26
|
+
try:
|
|
27
|
+
# Retrieve and cache the SensitiveMeta instance to avoid a second query in the save method.
|
|
28
|
+
self._cached_sensitive_meta = SensitiveMeta.objects.get(id=value)
|
|
29
|
+
return value
|
|
30
|
+
except SensitiveMeta.DoesNotExist:
|
|
31
|
+
raise serializers.ValidationError(
|
|
32
|
+
f"SensitiveMeta with ID {value} does not exist."
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def save(self):
|
|
36
|
+
"""
|
|
37
|
+
Updates the verification state for a specified SensitiveMeta instance.
|
|
38
|
+
|
|
39
|
+
Uses the cached SensitiveMeta object from validation, obtains or creates its verification state,
|
|
40
|
+
updates the `dob_verified` and `names_verified` fields if provided, and saves the changes.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
The updated verification state object.
|
|
44
|
+
"""
|
|
45
|
+
sensitive_meta_id = self.validated_data["sensitive_meta_id"]
|
|
46
|
+
dob_verified = self.validated_data.get("dob_verified")
|
|
47
|
+
names_verified = self.validated_data.get("names_verified")
|
|
48
|
+
|
|
49
|
+
# Use the cached instance from the validation step, avoiding a redundant query.
|
|
50
|
+
sensitive_meta = self._cached_sensitive_meta
|
|
51
|
+
state = sensitive_meta.get_or_create_state()
|
|
52
|
+
|
|
53
|
+
if dob_verified is not None:
|
|
54
|
+
state.dob_verified = dob_verified
|
|
55
|
+
|
|
56
|
+
if names_verified is not None:
|
|
57
|
+
state.names_verified = names_verified
|
|
58
|
+
|
|
59
|
+
state.save()
|
|
60
|
+
|
|
61
|
+
logger.info(f"Updated verification state for SensitiveMeta {sensitive_meta_id}")
|
|
62
|
+
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,72 @@
|
|
|
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.anonymization import AnonymizationState
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
class FileOverviewSerializer(serializers.Serializer):
|
|
12
|
+
id = serializers.IntegerField(read_only=True)
|
|
13
|
+
filename = serializers.CharField(read_only=True)
|
|
14
|
+
mediaType = serializers.CharField(read_only=True)
|
|
15
|
+
anonymizationStatus = serializers.CharField(read_only=True)
|
|
16
|
+
annotationStatus = serializers.CharField(read_only=True)
|
|
17
|
+
createdAt = serializers.DateTimeField(read_only=True)
|
|
18
|
+
sensitiveMetaId = serializers.IntegerField(read_only=True, allow_null=True)
|
|
19
|
+
fileSize = serializers.IntegerField(read_only=True, required=False)
|
|
20
|
+
|
|
21
|
+
def to_representation(self, instance):
|
|
22
|
+
# 1. Extract Type-Specific Data
|
|
23
|
+
if isinstance(instance, VideoFile):
|
|
24
|
+
media_type = "video"
|
|
25
|
+
filename = instance.original_file_name or (
|
|
26
|
+
instance.raw_file.name.split("/")[-1] if instance.raw_file else "unknown_video"
|
|
27
|
+
)
|
|
28
|
+
created_at = instance.uploaded_at
|
|
29
|
+
# Use the state relation optimized in the View
|
|
30
|
+
state_obj = instance.state
|
|
31
|
+
sensitive_meta = instance.sensitive_meta
|
|
32
|
+
try:
|
|
33
|
+
file_size = instance.raw_file.size if instance.raw_file else 0
|
|
34
|
+
except:
|
|
35
|
+
file_size = 0
|
|
36
|
+
|
|
37
|
+
elif isinstance(instance, RawPdfFile):
|
|
38
|
+
media_type = "pdf"
|
|
39
|
+
filename = instance.file.name.split("/")[-1] if instance.file else "unknown_report"
|
|
40
|
+
created_at = instance.date_created
|
|
41
|
+
state_obj = instance.state
|
|
42
|
+
sensitive_meta = instance.sensitive_meta
|
|
43
|
+
try:
|
|
44
|
+
file_size = instance.file.size if instance.file else 0
|
|
45
|
+
except:
|
|
46
|
+
file_size = 0
|
|
47
|
+
|
|
48
|
+
else:
|
|
49
|
+
raise TypeError(f"Unexpected object type: {type(instance)}")
|
|
50
|
+
|
|
51
|
+
# 2. Determine Status (Single Source of Truth: The State Model)
|
|
52
|
+
# This uses the @property .anonymization_status from VideoState/RawPdfState
|
|
53
|
+
raw_status = state_obj.anonymization_status if state_obj else AnonymizationState.NOT_STARTED
|
|
54
|
+
|
|
55
|
+
# 3. Map to Frontend 'annotationStatus'
|
|
56
|
+
annot_status = "not_started"
|
|
57
|
+
|
|
58
|
+
# FIX: Explicitly check against the Enum value
|
|
59
|
+
if raw_status == AnonymizationState.VALIDATED:
|
|
60
|
+
annot_status = "validated"
|
|
61
|
+
|
|
62
|
+
# 4. Return Payload
|
|
63
|
+
return {
|
|
64
|
+
"id": instance.pk,
|
|
65
|
+
"filename": filename,
|
|
66
|
+
"mediaType": media_type,
|
|
67
|
+
"anonymizationStatus": raw_status,
|
|
68
|
+
"annotationStatus": annot_status,
|
|
69
|
+
"createdAt": created_at,
|
|
70
|
+
"sensitiveMetaId": sensitive_meta.pk if sensitive_meta else None,
|
|
71
|
+
"fileSize": file_size,
|
|
72
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
|
|
3
|
+
from endoreg_db.models.media import RawPdfFile, VideoFile
|
|
4
|
+
|
|
5
|
+
# TODO add this "naming convention" to the documentation
|
|
6
|
+
# VoP: Video or Pdf
|
|
7
|
+
|
|
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(
|
|
66
|
+
sm.patient_first_name, "[FIRST_NAME]"
|
|
67
|
+
)
|
|
68
|
+
if sm.patient_last_name:
|
|
69
|
+
anonym_text = anonym_text.replace(
|
|
70
|
+
sm.patient_last_name, "[LAST_NAME]"
|
|
71
|
+
)
|
|
72
|
+
if sm.patient_dob:
|
|
73
|
+
anonym_text = anonym_text.replace(
|
|
74
|
+
str(sm.patient_dob.date()), "[DOB]"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
"id": instance.pk,
|
|
79
|
+
"sensitiveMetaId": instance.sensitive_meta.pk
|
|
80
|
+
if instance.sensitive_meta
|
|
81
|
+
else None,
|
|
82
|
+
"text": text,
|
|
83
|
+
"anonymizedText": anonym_text,
|
|
84
|
+
"reportMeta": self._serialize_sensitive_meta(instance.sensitive_meta)
|
|
85
|
+
if instance.sensitive_meta
|
|
86
|
+
else None,
|
|
87
|
+
"status": "processing"
|
|
88
|
+
if instance.state and instance.state.frames_extracted
|
|
89
|
+
else "not_started",
|
|
90
|
+
"error": False,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
elif isinstance(instance, RawPdfFile):
|
|
94
|
+
# Generate report streaming URL using pdf_id (RawPdfFile.id)
|
|
95
|
+
report_stream_url = f"/api/media/pdfs/{instance.pk}/stream/"
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
"id": instance.pk,
|
|
99
|
+
"sensitiveMetaId": instance.sensitive_meta.pk
|
|
100
|
+
if instance.sensitive_meta
|
|
101
|
+
else None,
|
|
102
|
+
"text": instance.text or "",
|
|
103
|
+
"anonymizedText": instance.anonymized_text or "",
|
|
104
|
+
"reportMeta": self._serialize_sensitive_meta(instance.sensitive_meta)
|
|
105
|
+
if instance.sensitive_meta
|
|
106
|
+
else None,
|
|
107
|
+
"status": "done" if instance.anonymized_text else "not_started",
|
|
108
|
+
"error": False,
|
|
109
|
+
"pdfStreamUrl": report_stream_url,
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
else:
|
|
113
|
+
raise TypeError(
|
|
114
|
+
f"Unsupported instance for VoPPatientDataSerializer: {type(instance)}"
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
def _serialize_sensitive_meta(self, sensitive_meta):
|
|
118
|
+
"""
|
|
119
|
+
Serialize a SensitiveMeta object into a dictionary with patient and examination details.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
dict or None: A dictionary containing patient and examination metadata fields, or None if sensitive_meta is not provided.
|
|
123
|
+
"""
|
|
124
|
+
if not sensitive_meta:
|
|
125
|
+
return None
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
"id": sensitive_meta.pk,
|
|
129
|
+
"patientFirstName": sensitive_meta.patient_first_name or "",
|
|
130
|
+
"patientLastName": sensitive_meta.patient_last_name or "",
|
|
131
|
+
"patientDob": sensitive_meta.patient_dob.isoformat()
|
|
132
|
+
if sensitive_meta.patient_dob
|
|
133
|
+
else "",
|
|
134
|
+
"patientGender": str(sensitive_meta.patient_gender)
|
|
135
|
+
if sensitive_meta.patient_gender
|
|
136
|
+
else "",
|
|
137
|
+
"examinationDate": sensitive_meta.examination_date.isoformat()
|
|
138
|
+
if sensitive_meta.examination_date
|
|
139
|
+
else "",
|
|
140
|
+
"centerName": sensitive_meta.center.name if sensitive_meta.center else "",
|
|
141
|
+
"endoscopeType": sensitive_meta.endoscope_type or "",
|
|
142
|
+
"endoscopeSn": sensitive_meta.endoscope_sn or "",
|
|
143
|
+
"isVerified": getattr(sensitive_meta, "is_verified", False),
|
|
144
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class StatsSerializer(serializers.Serializer):
|
|
5
|
+
"""
|
|
6
|
+
Serializer for statistics data from AuditLedger.
|
|
7
|
+
|
|
8
|
+
This serializer defines the structure of statistics data and ensures
|
|
9
|
+
consistent API responses.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
totalCases = serializers.IntegerField()
|
|
13
|
+
totalVideos = serializers.IntegerField()
|
|
14
|
+
totalAnnotations = serializers.IntegerField()
|
|
15
|
+
totalAnonymizations = serializers.IntegerField()
|
|
16
|
+
totalImages = serializers.IntegerField()
|
|
17
|
+
videosCompleted = serializers.IntegerField()
|
|
18
|
+
videosAnonym = serializers.IntegerField()
|
|
19
|
+
|
|
20
|
+
# You can add additional fields or methods here as needed
|
|
21
|
+
# For example, to calculate derived statistics:
|
|
22
|
+
# TODO
|
|
23
|
+
def get_completion_percentage(self, obj):
|
|
24
|
+
"""
|
|
25
|
+
Calculates the percentage of completed videos out of the total videos.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
obj: A dictionary containing 'videosCompleted' and 'totalVideos' keys.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
The completion percentage as a float rounded to two decimal places, or 0 if totalVideos is zero or less.
|
|
32
|
+
"""
|
|
33
|
+
if obj["totalVideos"] > 0:
|
|
34
|
+
return round((obj["videosCompleted"] / obj["totalVideos"]) * 100, 2)
|
|
35
|
+
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,74 @@
|
|
|
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(
|
|
21
|
+
read_only=True, required=False, allow_blank=True
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
class Meta:
|
|
25
|
+
model = UploadJob
|
|
26
|
+
fields = [
|
|
27
|
+
"status",
|
|
28
|
+
"error_detail",
|
|
29
|
+
"sensitive_meta_id",
|
|
30
|
+
"id",
|
|
31
|
+
"text",
|
|
32
|
+
"anonymized_text",
|
|
33
|
+
]
|
|
34
|
+
read_only_fields = fields
|
|
35
|
+
|
|
36
|
+
def to_representation(self, instance):
|
|
37
|
+
"""
|
|
38
|
+
Customize the representation to only include relevant fields based on status.
|
|
39
|
+
"""
|
|
40
|
+
data = super().to_representation(instance)
|
|
41
|
+
|
|
42
|
+
# Only include error_detail if status is error
|
|
43
|
+
if instance.status != UploadJob.Status.ERROR:
|
|
44
|
+
data.pop("error_detail", None)
|
|
45
|
+
|
|
46
|
+
# Only include sensitive_meta_id if status is anonymized and we have a meta record
|
|
47
|
+
if (
|
|
48
|
+
instance.status != UploadJob.Status.ANONYMIZED
|
|
49
|
+
or not instance.sensitive_meta
|
|
50
|
+
):
|
|
51
|
+
data.pop("sensitive_meta_id", None)
|
|
52
|
+
|
|
53
|
+
# Remove empty optional fields
|
|
54
|
+
if not data.get("text"):
|
|
55
|
+
data.pop("text", None)
|
|
56
|
+
if not data.get("anonymized_text"):
|
|
57
|
+
data.pop("anonymized_text", None)
|
|
58
|
+
|
|
59
|
+
return data
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class UploadCreateResponseSerializer(serializers.Serializer):
|
|
63
|
+
"""
|
|
64
|
+
Serializer for the initial upload response.
|
|
65
|
+
Returns upload_id and status_url for polling.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
upload_id = serializers.UUIDField(
|
|
69
|
+
read_only=True, help_text="UUID of the created upload job"
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
status_url = serializers.CharField(
|
|
73
|
+
read_only=True, help_text="URL to poll for upload status updates"
|
|
74
|
+
)
|