endoreg-db 0.4.5__py3-none-any.whl → 0.8.6.3__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.
- endoreg_db/admin.py +90 -1
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +12 -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/env.py +101 -0
- endoreg_db/data/__init__.py +76 -4
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/{label → ai_model_label}/label/data.yaml +27 -1
- 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_meta/default_multilabel_classification.yaml +27 -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/center/data.yaml +40 -9
- endoreg_db/data/center_shift/ukw.yaml +9 -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/misc.yaml +1 -2
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +2 -2
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +34 -28
- endoreg_db/data/examination/type/data.yaml +12 -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 +24 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -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 +7 -1
- endoreg_db/data/lab_value/coagulation.yaml +6 -1
- endoreg_db/data/lab_value/electrolytes.yaml +39 -1
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +12 -0
- endoreg_db/data/lab_value/hematology.yaml +17 -2
- endoreg_db/data/lab_value/hormones.yaml +6 -0
- endoreg_db/data/lab_value/lipids.yaml +12 -3
- endoreg_db/data/lab_value/misc.yaml +48 -2
- endoreg_db/data/lab_value/renal_function.yaml +2 -1
- 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/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_indication/anticoagulation.yaml +48 -53
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- 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 +30 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/pdf_type/data.yaml +27 -9
- 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/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +4 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -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/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_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/unit/concentration.yaml +23 -0
- endoreg_db/data/unit/time.yaml +36 -1
- endoreg_db/exceptions.py +19 -0
- endoreg_db/forms/__init__.py +3 -1
- 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 -1
- endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
- 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 +58 -26
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +174 -118
- endoreg_db/management/commands/load_center_data.py +46 -21
- endoreg_db/management/commands/{load_logging_data.py → load_contraindication_data.py} +4 -2
- endoreg_db/management/commands/load_disease_data.py +29 -7
- endoreg_db/management/commands/{load_endoscope_type_data.py → load_endoscope_data.py} +30 -7
- 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_green_endoscopy_wuerzburg_data.py +0 -1
- endoreg_db/management/commands/load_information_source.py +13 -7
- endoreg_db/management/commands/load_lab_value_data.py +3 -3
- endoreg_db/management/commands/load_medication_data.py +83 -21
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/{load_medication_intake_time_data.py → load_organ_data.py} +7 -5
- endoreg_db/management/commands/load_qualification_data.py +59 -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/register_ai_model.py +1 -1
- 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 +1234 -944
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/models/__init__.py +339 -53
- 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/{ai_model → administration/ai}/model_type.py +19 -4
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +10 -1
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +60 -16
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +6 -13
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +21 -8
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +9 -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/{persons → administration/person/names}/first_name.py +1 -1
- endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
- 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/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/{product → administration/product}/product_weight.py +21 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +44 -13
- 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 -1
- 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 +53 -54
- 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/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/{hardware → medical/hardware}/endoscopy_processor.py +68 -29
- 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/{persons → medical}/patient/patient_lab_value.py +68 -22
- 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/{data_file/metadata → metadata}/pdf_meta.py +32 -13
- 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 +36 -1
- 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/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +14 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +15 -3
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- 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/{rules → rule}/rule.py +6 -3
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
- endoreg_db/models/{rules → rule}/rule_type.py +0 -2
- endoreg_db/models/{rules → rule}/ruleset.py +0 -2
- 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/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 -10
- 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 -1
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- 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/dataloader.py +118 -35
- 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 +29 -1
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +123 -4
- 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/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/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 +187 -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 -3
- endoreg_db-0.8.6.3.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.3.dist-info/RECORD +793 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info}/WHEEL +1 -1
- endoreg_db/data/active_model/data.yaml +0 -3
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/label/label-set/data.yaml +0 -18
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/delete_legacy_images.py +0 -19
- endoreg_db/management/commands/delete_legacy_videos.py +0 -17
- endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
- endoreg_db/management/commands/fix_auth_permission.py +0 -20
- endoreg_db/management/commands/import_legacy_images.py +0 -94
- endoreg_db/management/commands/import_legacy_videos.py +0 -76
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_label_data.py +0 -67
- endoreg_db/management/commands/load_medication_indication_data.py +0 -63
- endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
- endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
- endoreg_db/management/commands/load_network_data.py +0 -57
- endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
- endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
- endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
- endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
- endoreg_db/models/ai_model/__init__.py +0 -3
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/model_meta.py +0 -24
- endoreg_db/models/annotation/__init__.py +0 -3
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -60
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
- endoreg_db/models/annotation/image_classification.py +0 -27
- endoreg_db/models/center/center.py +0 -25
- endoreg_db/models/center/center_product.py +0 -34
- endoreg_db/models/center/center_resource.py +0 -19
- endoreg_db/models/center/center_waste.py +0 -11
- endoreg_db/models/data_file/__init__.py +0 -6
- endoreg_db/models/data_file/base_classes/__init__.py +0 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
- endoreg_db/models/data_file/frame.py +0 -45
- endoreg_db/models/data_file/import_classes/__init__.py +0 -32
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -188
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
- endoreg_db/models/data_file/metadata/__init__.py +0 -3
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
- endoreg_db/models/data_file/metadata/video_meta.py +0 -133
- endoreg_db/models/data_file/report_file.py +0 -89
- endoreg_db/models/data_file/video/__init__.py +0 -7
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -25
- endoreg_db/models/data_file/video_segment.py +0 -107
- endoreg_db/models/disease.py +0 -56
- endoreg_db/models/emission/__init__.py +0 -1
- endoreg_db/models/emission/emission_factor.py +0 -20
- endoreg_db/models/event.py +0 -22
- endoreg_db/models/examination/__init__.py +0 -4
- endoreg_db/models/examination/examination.py +0 -26
- endoreg_db/models/examination/examination_time.py +0 -27
- endoreg_db/models/examination/examination_time_type.py +0 -24
- endoreg_db/models/examination/examination_type.py +0 -18
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/hardware/endoscope.py +0 -44
- endoreg_db/models/information_source.py +0 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -102
- endoreg_db/models/legacy_data/__init__.py +0 -3
- endoreg_db/models/legacy_data/image.py +0 -34
- endoreg_db/models/logging/__init__.py +0 -4
- endoreg_db/models/logging/agl_service.py +0 -19
- endoreg_db/models/logging/base.py +0 -22
- endoreg_db/models/logging/log_type.py +0 -23
- endoreg_db/models/logging/network_device.py +0 -24
- endoreg_db/models/medication/__init__.py +0 -1
- endoreg_db/models/medication/medication.py +0 -148
- endoreg_db/models/network/__init__.py +0 -3
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -53
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -215
- endoreg_db/models/patient_examination/__init__.py +0 -35
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -7
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -16
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/case/case.py +0 -30
- endoreg_db/models/persons/patient/patient.py +0 -216
- endoreg_db/models/persons/patient/patient_disease.py +0 -16
- endoreg_db/models/persons/patient/patient_event.py +0 -22
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
- endoreg_db/models/persons/patient/patient_medication.py +0 -44
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -2
- endoreg_db/models/prediction/image_classification.py +0 -37
- endoreg_db/models/prediction/video_prediction_meta.py +0 -244
- endoreg_db/models/product/__init__.py +0 -5
- endoreg_db/models/product/product.py +0 -97
- endoreg_db/models/product/product_group.py +0 -19
- endoreg_db/models/product/product_material.py +0 -24
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -2
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/__init__.py +0 -2
- endoreg_db/models/report_reader/report_reader_config.py +0 -53
- endoreg_db/models/rules/__init__.py +0 -5
- endoreg_db/queries/get/__init__.py +0 -6
- endoreg_db/queries/get/center.py +0 -42
- endoreg_db/queries/get/model.py +0 -13
- endoreg_db/queries/get/patient.py +0 -14
- endoreg_db/queries/get/patient_examination.py +0 -20
- endoreg_db/queries/get/report_file.py +0 -33
- endoreg_db/queries/get/video.py +0 -31
- endoreg_db/serializers/ai_model.py +0 -19
- endoreg_db/serializers/annotation.py +0 -17
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -13
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -10
- endoreg_db/serializers/prediction.py +0 -15
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -27
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video_metadata.py +0 -87
- endoreg_db-0.4.5.dist-info/METADATA +0 -34
- endoreg_db-0.4.5.dist-info/RECORD +0 -316
- /endoreg_db/{data/distribution/numeric/.init → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{models/persons/patient/case/__init__.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → config/__init__.py} +0 -0
- /endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +0 -0
- /endoreg_db/data/{model_type → ai_model_type}/data.yaml +0 -0
- /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
- /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
- /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
- /endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from endoreg_db.models import Patient
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from rest_framework import serializers
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class PatientDropdownSerializer(serializers.ModelSerializer):
|
|
8
|
+
"""Serializer für Patient-Dropdown"""
|
|
9
|
+
display_name = serializers.SerializerMethodField()
|
|
10
|
+
|
|
11
|
+
class Meta:
|
|
12
|
+
model = Patient
|
|
13
|
+
fields = ['id', 'patient_hash', 'first_name', 'last_name', 'display_name', 'dob']
|
|
14
|
+
|
|
15
|
+
def get_display_name(self, obj):
|
|
16
|
+
"""
|
|
17
|
+
Returns a user-friendly display string for a patient, combining their first and last name with a shortened patient hash or a placeholder if the hash is missing.
|
|
18
|
+
|
|
19
|
+
Parameters:
|
|
20
|
+
obj: The patient instance being serialized.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
str: The formatted display name for the patient.
|
|
24
|
+
"""
|
|
25
|
+
patient_hash = obj.patient_hash
|
|
26
|
+
hash_display = f"({patient_hash[:8]}...)" if patient_hash else "(No Hash)"
|
|
27
|
+
return f"{obj.first_name} {obj.last_name} {hash_display}"
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
from endoreg_db.models import PatientExamination, Patient, Examination
|
|
3
|
+
from datetime import date
|
|
4
|
+
|
|
5
|
+
class PatientExaminationSerializer(serializers.ModelSerializer):
|
|
6
|
+
# Verwende CharField für patient, um patient_hash zu empfangen
|
|
7
|
+
patient = serializers.CharField(
|
|
8
|
+
write_only=True, # Nur für Eingabe verwenden
|
|
9
|
+
required=True,
|
|
10
|
+
help_text="Patient Hash (z.B. 'patient_2')"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
# Für die Ausgabe verwenden wir ein schreibgeschütztes Feld
|
|
14
|
+
patient_data = serializers.SerializerMethodField(read_only=True)
|
|
15
|
+
|
|
16
|
+
examination = serializers.SlugRelatedField(
|
|
17
|
+
slug_field='name',
|
|
18
|
+
queryset=Examination.objects.all(),
|
|
19
|
+
required=False,
|
|
20
|
+
allow_null=True
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
# Zusätzliche schreibgeschützte Felder für bessere API-Antworten
|
|
24
|
+
patient_name = serializers.SerializerMethodField()
|
|
25
|
+
examination_name = serializers.SerializerMethodField()
|
|
26
|
+
|
|
27
|
+
class Meta:
|
|
28
|
+
model = PatientExamination
|
|
29
|
+
fields = [
|
|
30
|
+
'id', 'patient', 'patient_data', 'examination', 'date_start', 'date_end',
|
|
31
|
+
'hash', 'patient_name', 'examination_name'
|
|
32
|
+
]
|
|
33
|
+
read_only_fields = ['id', 'hash', 'patient_name', 'examination_name', 'patient_data']
|
|
34
|
+
|
|
35
|
+
def get_patient_data(self, obj):
|
|
36
|
+
"""Gibt die Patient-Daten für die Ausgabe zurück"""
|
|
37
|
+
if obj.patient:
|
|
38
|
+
return {
|
|
39
|
+
'id': obj.patient.id,
|
|
40
|
+
'patient_hash': obj.patient.patient_hash,
|
|
41
|
+
'first_name': obj.patient.first_name,
|
|
42
|
+
'last_name': obj.patient.last_name
|
|
43
|
+
}
|
|
44
|
+
return None
|
|
45
|
+
|
|
46
|
+
def get_patient_name(self, obj):
|
|
47
|
+
"""Gibt den vollständigen Namen des Patienten zurück"""
|
|
48
|
+
if obj.patient:
|
|
49
|
+
return f"{obj.patient.first_name} {obj.patient.last_name}"
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
def get_examination_name(self, obj):
|
|
53
|
+
"""Gibt den Namen der Untersuchung zurück"""
|
|
54
|
+
if obj.examination:
|
|
55
|
+
return obj.examination.name
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
def validate_patient(self, value):
|
|
59
|
+
"""Validiert und erstellt Patient falls nötig"""
|
|
60
|
+
if not value:
|
|
61
|
+
raise serializers.ValidationError("Patient Hash ist erforderlich")
|
|
62
|
+
|
|
63
|
+
# Versuche Patient zu finden
|
|
64
|
+
try:
|
|
65
|
+
patient = Patient.objects.get(patient_hash=value)
|
|
66
|
+
return patient
|
|
67
|
+
except Patient.DoesNotExist:
|
|
68
|
+
# Erstelle automatisch einen Pseudo-Patienten
|
|
69
|
+
patient = Patient.objects.create(
|
|
70
|
+
patient_hash=value,
|
|
71
|
+
first_name="Patient",
|
|
72
|
+
last_name=value,
|
|
73
|
+
is_real_person=False # Markiere als Pseudo-Patient
|
|
74
|
+
)
|
|
75
|
+
return patient
|
|
76
|
+
|
|
77
|
+
def validate_date_start(self, value):
|
|
78
|
+
"""Validiert das Startdatum"""
|
|
79
|
+
if value and value > date.today():
|
|
80
|
+
raise serializers.ValidationError("Startdatum kann nicht in der Zukunft liegen")
|
|
81
|
+
return value
|
|
82
|
+
|
|
83
|
+
def validate_date_end(self, value):
|
|
84
|
+
"""Validiert das Enddatum"""
|
|
85
|
+
if value and value > date.today():
|
|
86
|
+
raise serializers.ValidationError("Enddatum kann nicht in der Zukunft liegen")
|
|
87
|
+
return value
|
|
88
|
+
|
|
89
|
+
def validate(self, data):
|
|
90
|
+
"""Validiert die gesamten Daten"""
|
|
91
|
+
date_start = data.get('date_start')
|
|
92
|
+
date_end = data.get('date_end')
|
|
93
|
+
|
|
94
|
+
if date_start and date_end and date_end < date_start:
|
|
95
|
+
raise serializers.ValidationError("Enddatum muss nach dem Startdatum liegen")
|
|
96
|
+
|
|
97
|
+
return data
|
|
98
|
+
|
|
99
|
+
def create(self, validated_data):
|
|
100
|
+
"""Erstellt eine neue PatientExamination mit verbesserter Fehlerbehandlung"""
|
|
101
|
+
try:
|
|
102
|
+
# Patient wurde bereits in validate_patient erstellt/gefunden
|
|
103
|
+
patient = validated_data.pop('patient') # Entferne patient aus validated_data
|
|
104
|
+
validated_data['patient'] = patient # Füge das Patient-Objekt hinzu
|
|
105
|
+
|
|
106
|
+
patient_examination = PatientExamination.objects.create(**validated_data)
|
|
107
|
+
return patient_examination
|
|
108
|
+
except Exception as e:
|
|
109
|
+
raise serializers.ValidationError(f"Fehler beim Erstellen der Patientenuntersuchung: {str(e)}")
|
|
110
|
+
|
|
111
|
+
def update(self, instance, validated_data):
|
|
112
|
+
"""
|
|
113
|
+
Update an existing PatientExamination instance with validated data.
|
|
114
|
+
|
|
115
|
+
If a new patient is provided, updates the patient reference. Applies all other validated fields to the instance and saves changes.
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
PatientExamination: The updated PatientExamination instance.
|
|
119
|
+
|
|
120
|
+
Raises:
|
|
121
|
+
ValidationError: If an error occurs during the update process.
|
|
122
|
+
"""
|
|
123
|
+
try:
|
|
124
|
+
# Falls Patient geändert wird
|
|
125
|
+
if 'patient' in validated_data:
|
|
126
|
+
patient = validated_data.pop('patient')
|
|
127
|
+
validated_data['patient'] = patient
|
|
128
|
+
|
|
129
|
+
for attr, value in validated_data.items():
|
|
130
|
+
setattr(instance, attr, value)
|
|
131
|
+
instance.save()
|
|
132
|
+
return instance
|
|
133
|
+
except Exception as e:
|
|
134
|
+
raise serializers.ValidationError(f"Fehler beim Aktualisieren der Patientenuntersuchung: {str(e)}")
|
|
135
|
+
|
|
136
|
+
def get_findings(self, patient_examination_id):
|
|
137
|
+
"""Gibt die zugehörigen Befunde zurück"""
|
|
138
|
+
obj = PatientExamination.get_or_create_patient_examination_by_id(PatientExamination, patient_examination_id)
|
|
139
|
+
self.instance = obj
|
|
140
|
+
response = PatientExaminationSerializer()
|
|
141
|
+
return self.instance.patient_findings.all() if self.instance else []
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from .patient_finding_classification import PatientFindingClassificationSerializer
|
|
2
|
+
from .patient_finding_detail import PatientFindingDetailSerializer
|
|
3
|
+
from .patient_finding_intervention import PatientFindingInterventionSerializer
|
|
4
|
+
from .patient_finding_list import PatientFindingListSerializer
|
|
5
|
+
from .patient_finding_write import PatientFindingWriteSerializer
|
|
6
|
+
from .patient_finding import PatientFindingSerializer
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"PatientFindingSerializer",
|
|
10
|
+
"PatientFindingClassificationSerializer",
|
|
11
|
+
"PatientFindingDetailSerializer",
|
|
12
|
+
"PatientFindingInterventionSerializer",
|
|
13
|
+
"PatientFindingListSerializer",
|
|
14
|
+
"PatientFindingWriteSerializer",
|
|
15
|
+
]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from endoreg_db.models import PatientFinding
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
|
|
4
|
+
class PatientFindingSerializer(serializers.ModelSerializer):
|
|
5
|
+
class Meta:
|
|
6
|
+
model = PatientFinding
|
|
7
|
+
#fields = '__all__'
|
|
8
|
+
fields = [
|
|
9
|
+
"id",
|
|
10
|
+
"patient_examination",
|
|
11
|
+
"finding",
|
|
12
|
+
# relationships (kept for backward compatibility)
|
|
13
|
+
"video_segments",
|
|
14
|
+
"interventions",
|
|
15
|
+
"classifications",
|
|
16
|
+
# timestamps are generally safe/expected by clients
|
|
17
|
+
"created_at",
|
|
18
|
+
"updated_at",
|
|
19
|
+
# expose active state, but NOT who/when deactivated
|
|
20
|
+
"is_active",
|
|
21
|
+
]
|
|
22
|
+
read_only_fields = [
|
|
23
|
+
"id",
|
|
24
|
+
"created_at",
|
|
25
|
+
"updated_at",
|
|
26
|
+
"is_active",
|
|
27
|
+
# relationships are usually read-only here
|
|
28
|
+
"video_segments",
|
|
29
|
+
"interventions",
|
|
30
|
+
"classifications",
|
|
31
|
+
]
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from endoreg_db.models import PatientFindingClassification
|
|
2
|
+
from endoreg_db.serializers.misc.translatable_field_mix_in import TranslatableFieldMixin
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
from rest_framework import serializers
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PatientFindingClassificationSerializer(serializers.ModelSerializer, TranslatableFieldMixin):
|
|
9
|
+
"""Serializer für PatientFinding-Klassifikationen"""
|
|
10
|
+
|
|
11
|
+
classification_name = serializers.SerializerMethodField()
|
|
12
|
+
classification_choice_name = serializers.SerializerMethodField()
|
|
13
|
+
class Meta:
|
|
14
|
+
model = PatientFindingClassification
|
|
15
|
+
fields = ['id', 'classification', 'classification_name', 'classification_choice_name']
|
|
16
|
+
|
|
17
|
+
def get_classification_name(self, obj:PatientFindingClassification):
|
|
18
|
+
"""
|
|
19
|
+
Return the localized name for the classification attribute of a PatientFindingClassification instance.
|
|
20
|
+
|
|
21
|
+
Parameters:
|
|
22
|
+
obj (PatientFindingClassification): The instance whose classification name is to be localized.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
str: The localized classification name.
|
|
26
|
+
"""
|
|
27
|
+
return self.get_localized_name(obj.classification)
|
|
28
|
+
|
|
29
|
+
def get_classification_choice_name(self, obj:PatientFindingClassification):
|
|
30
|
+
"""
|
|
31
|
+
Return the localized name for the classification choice of a patient finding classification instance.
|
|
32
|
+
|
|
33
|
+
Parameters:
|
|
34
|
+
obj (PatientFindingClassification): The patient finding classification instance.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
str: Localized name of the classification choice.
|
|
38
|
+
"""
|
|
39
|
+
return self.get_localized_name(obj.classification_choice)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
from endoreg_db.models import (
|
|
3
|
+
PatientFinding,
|
|
4
|
+
)
|
|
5
|
+
from endoreg_db.serializers.misc.translatable_field_mix_in import TranslatableFieldMixin
|
|
6
|
+
from endoreg_db.serializers.patient_finding.patient_finding_intervention import PatientFindingInterventionSerializer
|
|
7
|
+
from .patient_finding_classification import PatientFindingClassificationSerializer
|
|
8
|
+
|
|
9
|
+
class PatientFindingDetailSerializer(serializers.ModelSerializer, TranslatableFieldMixin):
|
|
10
|
+
"""Vollständiger Serializer mit allen verschachtelten Daten - optimiert für N+1 Vermeidung"""
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
classifications = PatientFindingClassificationSerializer(many=True, read_only=True)
|
|
14
|
+
interventions = PatientFindingInterventionSerializer(many=True, read_only=True)
|
|
15
|
+
|
|
16
|
+
# Meta-Informationen für das Frontend
|
|
17
|
+
patient_id = serializers.CharField(source='patient_examination.patient.id', read_only=True)
|
|
18
|
+
examination_name = serializers.SerializerMethodField()
|
|
19
|
+
finding_name = serializers.SerializerMethodField()
|
|
20
|
+
|
|
21
|
+
class Meta:
|
|
22
|
+
model = PatientFinding
|
|
23
|
+
fields = [
|
|
24
|
+
'id', 'patient_examination', 'finding', 'finding_name',
|
|
25
|
+
'patient_id', 'examination_name',
|
|
26
|
+
'classifications', 'interventions'
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
def get_finding_name(self, obj):
|
|
30
|
+
"""
|
|
31
|
+
Return the localized name of the finding associated with the given PatientFinding instance.
|
|
32
|
+
|
|
33
|
+
Parameters:
|
|
34
|
+
obj: The PatientFinding instance being serialized.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
str: The localized name of the related finding.
|
|
38
|
+
"""
|
|
39
|
+
return self.get_localized_name(obj.finding)
|
|
40
|
+
|
|
41
|
+
def get_examination_name(self, obj):
|
|
42
|
+
"""
|
|
43
|
+
Return the localized name of the examination associated with the given PatientFinding instance.
|
|
44
|
+
|
|
45
|
+
Parameters:
|
|
46
|
+
obj: The PatientFinding instance being serialized.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
str: The localized name of the related examination.
|
|
50
|
+
"""
|
|
51
|
+
return self.get_localized_name(obj.patient_examination.examination)
|
|
52
|
+
|
|
53
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from endoreg_db.serializers.misc.translatable_field_mix_in import TranslatableFieldMixin
|
|
2
|
+
from endoreg_db.models import PatientFindingIntervention
|
|
3
|
+
|
|
4
|
+
from rest_framework import serializers
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class PatientFindingInterventionSerializer(serializers.ModelSerializer, TranslatableFieldMixin):
|
|
8
|
+
"""Optimierter Serializer für PatientFindingIntervention"""
|
|
9
|
+
|
|
10
|
+
intervention_name = serializers.SerializerMethodField()
|
|
11
|
+
|
|
12
|
+
class Meta:
|
|
13
|
+
model = PatientFindingIntervention
|
|
14
|
+
fields = ['id', 'intervention', 'intervention_name', 'state']
|
|
15
|
+
|
|
16
|
+
def get_intervention_name(self, obj):
|
|
17
|
+
"""
|
|
18
|
+
Return the localized name of the intervention associated with the given object.
|
|
19
|
+
|
|
20
|
+
Parameters:
|
|
21
|
+
obj: The object containing the intervention to be localized.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
str: The localized name of the intervention.
|
|
25
|
+
"""
|
|
26
|
+
return self.get_localized_name(obj.intervention)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from endoreg_db.models import PatientFinding
|
|
2
|
+
from endoreg_db.serializers.misc.translatable_field_mix_in import TranslatableFieldMixin
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
from rest_framework import serializers
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PatientFindingListSerializer(serializers.ModelSerializer, TranslatableFieldMixin):
|
|
9
|
+
"""Leichtgewichtiger Serializer für Listen-Ansichten"""
|
|
10
|
+
|
|
11
|
+
finding_name = serializers.SerializerMethodField()
|
|
12
|
+
patient_name = serializers.CharField(
|
|
13
|
+
source='patient_examination.patient.get_full_name',
|
|
14
|
+
read_only=True
|
|
15
|
+
)
|
|
16
|
+
examination_date = serializers.DateTimeField(
|
|
17
|
+
source='patient_examination.date_start',
|
|
18
|
+
read_only=True
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
class Meta:
|
|
22
|
+
model = PatientFinding
|
|
23
|
+
fields = [
|
|
24
|
+
'id', 'finding_name', 'patient_name', 'examination_date',
|
|
25
|
+
'patient_examination', 'finding'
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
def get_finding_name(self, obj):
|
|
29
|
+
"""
|
|
30
|
+
Return the localized name of the finding associated with the given PatientFinding instance.
|
|
31
|
+
|
|
32
|
+
Parameters:
|
|
33
|
+
obj: The PatientFinding instance for which to retrieve the localized finding name.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
str: The localized name of the related finding.
|
|
37
|
+
"""
|
|
38
|
+
return self.get_localized_name(obj.finding)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
from endoreg_db.models import (
|
|
2
|
+
PatientFinding,
|
|
3
|
+
PatientFindingIntervention
|
|
4
|
+
)
|
|
5
|
+
from endoreg_db.serializers.patient_finding.patient_finding_classification import PatientFindingClassificationSerializer
|
|
6
|
+
from endoreg_db.serializers.patient_finding.patient_finding_intervention import PatientFindingInterventionSerializer
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
from rest_framework import serializers
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PatientFindingWriteSerializer(serializers.ModelSerializer):
|
|
13
|
+
"""Schreiboptimierter Serializer mit Nested Write Support"""
|
|
14
|
+
|
|
15
|
+
classifications = PatientFindingClassificationSerializer(many=True, required=False)
|
|
16
|
+
interventions = PatientFindingInterventionSerializer(many=True, required=False)
|
|
17
|
+
|
|
18
|
+
class Meta:
|
|
19
|
+
model = PatientFinding
|
|
20
|
+
fields = [
|
|
21
|
+
'id', 'patient_examination', 'finding',
|
|
22
|
+
'classifications', 'interventions'
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
def create(self, validated_data):
|
|
26
|
+
"""
|
|
27
|
+
Create a new PatientFinding instance along with any provided nested classifications and interventions.
|
|
28
|
+
|
|
29
|
+
Parameters:
|
|
30
|
+
validated_data (dict): Data validated by the serializer, potentially including nested classifications and interventions.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
PatientFinding: The newly created PatientFinding instance with related nested objects.
|
|
34
|
+
"""
|
|
35
|
+
classifications_data = validated_data.pop('classifications', [])
|
|
36
|
+
interventions_data = validated_data.pop('interventions', [])
|
|
37
|
+
|
|
38
|
+
patient_finding = PatientFinding.objects.create(**validated_data)
|
|
39
|
+
|
|
40
|
+
# Erstelle verschachtelte Objekte
|
|
41
|
+
self._create_nested_objects(patient_finding, classifications_data, interventions_data)
|
|
42
|
+
|
|
43
|
+
return patient_finding
|
|
44
|
+
|
|
45
|
+
def update(self, instance, validated_data):
|
|
46
|
+
"""
|
|
47
|
+
Update a PatientFinding instance and its nested classifications and interventions.
|
|
48
|
+
|
|
49
|
+
If new classification or intervention data is provided, existing related objects are deleted and replaced with the new data. Returns the updated PatientFinding instance.
|
|
50
|
+
"""
|
|
51
|
+
classifications_data = validated_data.pop('classifications', None)
|
|
52
|
+
interventions_data = validated_data.pop('interventions', None)
|
|
53
|
+
|
|
54
|
+
# Update Hauptobjekt
|
|
55
|
+
for attr, value in validated_data.items():
|
|
56
|
+
setattr(instance, attr, value)
|
|
57
|
+
instance.save()
|
|
58
|
+
|
|
59
|
+
# Update verschachtelte Objekte wenn bereitgestellt
|
|
60
|
+
if classifications_data is not None:
|
|
61
|
+
instance.classifications.all().delete()
|
|
62
|
+
self._create_classifications(instance, classifications_data)
|
|
63
|
+
|
|
64
|
+
if interventions_data is not None:
|
|
65
|
+
instance.interventions.all().delete()
|
|
66
|
+
self._create_interventions(instance, interventions_data)
|
|
67
|
+
|
|
68
|
+
return instance
|
|
69
|
+
|
|
70
|
+
def _create_nested_objects(self, patient_finding, classifications_data, interventions_data):
|
|
71
|
+
"""
|
|
72
|
+
Create nested classification and intervention objects linked to a PatientFinding instance.
|
|
73
|
+
|
|
74
|
+
This helper method delegates the creation of related classification and intervention objects using the provided data, associating them with the specified PatientFinding.
|
|
75
|
+
"""
|
|
76
|
+
self._create_classifications(patient_finding, classifications_data)
|
|
77
|
+
self._create_interventions(patient_finding, interventions_data)
|
|
78
|
+
|
|
79
|
+
def _create_classifications(self, patient_finding, classifications_data):
|
|
80
|
+
"""
|
|
81
|
+
Create and associate classification objects with a given PatientFinding instance using provided data.
|
|
82
|
+
|
|
83
|
+
Each classification in `classifications_data` is validated and saved as a related object to `patient_finding`. Validation errors are printed but do not interrupt processing.
|
|
84
|
+
"""
|
|
85
|
+
for classification_data in classifications_data:
|
|
86
|
+
serializer = PatientFindingClassificationSerializer(data=classification_data, context={'patient_finding': patient_finding})
|
|
87
|
+
if serializer.is_valid():
|
|
88
|
+
serializer.save(patient_finding=patient_finding)
|
|
89
|
+
else:
|
|
90
|
+
# Handle validation errors
|
|
91
|
+
print(serializer.errors) # Or raise an exception
|
|
92
|
+
|
|
93
|
+
def _create_interventions(self, patient_finding, interventions_data):
|
|
94
|
+
"""
|
|
95
|
+
Create and associate intervention objects with a given patient finding using provided intervention data.
|
|
96
|
+
|
|
97
|
+
Parameters:
|
|
98
|
+
patient_finding: The PatientFinding instance to associate interventions with.
|
|
99
|
+
interventions_data: Iterable of dictionaries containing intervention attributes.
|
|
100
|
+
"""
|
|
101
|
+
for intervention_data in interventions_data:
|
|
102
|
+
PatientFindingIntervention.objects.create(
|
|
103
|
+
finding=patient_finding,
|
|
104
|
+
**intervention_data
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def validate(self, data):
|
|
108
|
+
"""
|
|
109
|
+
Validate that the selected finding is permitted for the specified patient examination.
|
|
110
|
+
|
|
111
|
+
Raises a ValidationError if the finding is not among the allowed findings for the examination.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
dict: The validated data if the finding is permitted.
|
|
115
|
+
"""
|
|
116
|
+
patient_examination = data.get('patient_examination')
|
|
117
|
+
finding = data.get('finding')
|
|
118
|
+
|
|
119
|
+
# Prüfe ob Finding für diese Examination erlaubt ist
|
|
120
|
+
if finding and patient_examination:
|
|
121
|
+
if finding not in patient_examination.examination.get_available_findings():
|
|
122
|
+
raise serializers.ValidationError(
|
|
123
|
+
f"Finding '{finding.name}' ist nicht für Examination '{patient_examination.examination.name}' erlaubt."
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
return data
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
from django.conf import settings
|
|
4
|
+
from ...models import RawPdfFile
|
|
5
|
+
|
|
6
|
+
class RawPdfAnonyTextSerializer(serializers.ModelSerializer):
|
|
7
|
+
"""
|
|
8
|
+
Serializer to fetch PDF metadata along with `anonymized_text` from `RawPdfFile`.
|
|
9
|
+
Ensures Vue.js can process JSON efficiently.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
pdf_url = serializers.SerializerMethodField()
|
|
13
|
+
full_pdf_path = serializers.SerializerMethodField()
|
|
14
|
+
file = serializers.SerializerMethodField()
|
|
15
|
+
|
|
16
|
+
class Meta:
|
|
17
|
+
model = RawPdfFile
|
|
18
|
+
fields = ['id', 'file', 'pdf_url', 'full_pdf_path',
|
|
19
|
+
'sensitive_meta_id', 'anonymized_text']
|
|
20
|
+
|
|
21
|
+
@staticmethod
|
|
22
|
+
def get_next_pdf(last_id=None):
|
|
23
|
+
"""
|
|
24
|
+
Retrieves the first available PDF if `last_id` is NOT provided.
|
|
25
|
+
Otherwise, fetches the next available PDF where `id > last_id`.
|
|
26
|
+
"""
|
|
27
|
+
query_filter = {} if last_id is None else {"id__gt": int(last_id)}
|
|
28
|
+
pdf_entry = RawPdfFile.objects.filter(**query_filter).order_by('id').first()
|
|
29
|
+
return pdf_entry
|
|
30
|
+
|
|
31
|
+
def get_pdf_url(self, obj):
|
|
32
|
+
"""
|
|
33
|
+
Returns the absolute URL for accessing the anonymized text PDF endpoint for the given object.
|
|
34
|
+
|
|
35
|
+
If the request context or file is missing, returns None.
|
|
36
|
+
"""
|
|
37
|
+
request = self.context.get('request')
|
|
38
|
+
return request.build_absolute_uri(f"/pdf/anony_text/?id={obj.id}") if request and obj.file else None
|
|
39
|
+
|
|
40
|
+
def get_file(self, obj):
|
|
41
|
+
"""
|
|
42
|
+
Retrieves the relative file path of the PDF from the model instance.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
The relative file path as a string, or None if no file is associated.
|
|
46
|
+
"""
|
|
47
|
+
return str(obj.file.name).strip() if obj.file else None
|
|
48
|
+
|
|
49
|
+
def get_full_pdf_path(self, obj):
|
|
50
|
+
"""
|
|
51
|
+
Constructs the full absolute file path using `settings.MEDIA_ROOT`.
|
|
52
|
+
"""
|
|
53
|
+
if not obj.file:
|
|
54
|
+
return None
|
|
55
|
+
pdf_relative_path = str(obj.file.name)
|
|
56
|
+
full_path = Path(settings.MEDIA_ROOT) / pdf_relative_path
|
|
57
|
+
return str(full_path) if full_path.exists() else None
|
|
58
|
+
|
|
59
|
+
def validate_anonymized_text(self, value):
|
|
60
|
+
"""
|
|
61
|
+
Validates that the anonymized text is non-empty and does not exceed 5000 characters.
|
|
62
|
+
|
|
63
|
+
Raises:
|
|
64
|
+
serializers.ValidationError: If the text is empty or exceeds the length limit.
|
|
65
|
+
"""
|
|
66
|
+
if not value.strip():
|
|
67
|
+
raise serializers.ValidationError("Anonymized text cannot be empty.")
|
|
68
|
+
#FIXME move this to a settings variable @Hamzaukw @maxhild
|
|
69
|
+
if len(value) > 5000: # Arbitrary limit to prevent excessively long text
|
|
70
|
+
raise serializers.ValidationError("Anonymized text exceeds the maximum length of 5000 characters.")
|
|
71
|
+
return value
|
|
72
|
+
|
|
73
|
+
def update(self, instance, validated_data):
|
|
74
|
+
"""
|
|
75
|
+
Update the `anonymized_text` field of a RawPdfFile instance with validated data.
|
|
76
|
+
|
|
77
|
+
Only the `anonymized_text` field is modified; all other fields remain unchanged.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
The updated RawPdfFile instance.
|
|
81
|
+
"""
|
|
82
|
+
instance.anonymized_text = validated_data.get('anonymized_text', instance.anonymized_text)
|
|
83
|
+
instance.save()
|
|
84
|
+
return instance
|
|
85
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import TYPE_CHECKING, Literal
|
|
3
|
+
from django.utils import timezone
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from endoreg_db.models import RawPdfFile
|
|
7
|
+
|
|
8
|
+
class ReportStatusMixin:
|
|
9
|
+
"""
|
|
10
|
+
Mixin class for report serializers to provide status, updated_at, and file_type fields.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def get_status(self, obj:"RawPdfFile") -> Literal['approved'] | Literal['pending']:
|
|
14
|
+
"""
|
|
15
|
+
Return the report status as 'approved' if the report has been processed, otherwise 'pending'.
|
|
16
|
+
|
|
17
|
+
Parameters:
|
|
18
|
+
obj (RawPdfFile): The report file instance to check.
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
Literal['approved'] | Literal['pending']: The status of the report based on its processing state.
|
|
22
|
+
"""
|
|
23
|
+
if obj.state_report_processed:
|
|
24
|
+
return 'approved'
|
|
25
|
+
if obj.state_report_processing_required:
|
|
26
|
+
return 'pending'
|
|
27
|
+
return 'pending'
|
|
28
|
+
|
|
29
|
+
def get_updated_at(self, obj:"RawPdfFile") -> "timezone.datetime":
|
|
30
|
+
"""
|
|
31
|
+
Return the last update time for the given RawPdfFile object.
|
|
32
|
+
|
|
33
|
+
If the object's creation date is available, it is returned; otherwise, the current time is used.
|
|
34
|
+
"""
|
|
35
|
+
return obj.date_created if obj.date_created else timezone.now()
|
|
36
|
+
|
|
37
|
+
def get_file_type(self, obj:"RawPdfFile" ) -> "str":
|
|
38
|
+
"""
|
|
39
|
+
Return the file type of the associated file as a lowercase string without the leading dot.
|
|
40
|
+
|
|
41
|
+
If the object has no file, returns 'unknown'.
|
|
42
|
+
"""
|
|
43
|
+
if obj.file:
|
|
44
|
+
return Path(obj.file.name).suffix.lower().lstrip('.')
|
|
45
|
+
return 'unknown'
|