endoreg-db 0.8.9.2__py3-none-any.whl → 0.8.9.10__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/admin.py +10 -5
- endoreg_db/apps.py +4 -7
- endoreg_db/authz/auth.py +1 -0
- endoreg_db/authz/backends.py +1 -1
- endoreg_db/authz/management/commands/list_routes.py +2 -0
- endoreg_db/authz/middleware.py +8 -7
- endoreg_db/authz/permissions.py +21 -10
- endoreg_db/authz/policy.py +14 -19
- endoreg_db/authz/views_auth.py +14 -10
- endoreg_db/codemods/rename_datetime_fields.py +8 -1
- endoreg_db/exceptions.py +5 -2
- endoreg_db/forms/__init__.py +0 -1
- endoreg_db/forms/examination_form.py +4 -3
- endoreg_db/forms/patient_finding_intervention_form.py +30 -8
- endoreg_db/forms/patient_form.py +9 -13
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/settings/__init__.py +4 -1
- endoreg_db/forms/unit.py +2 -1
- endoreg_db/helpers/count_db.py +17 -14
- endoreg_db/helpers/default_objects.py +2 -1
- endoreg_db/helpers/download_segmentation_model.py +4 -3
- endoreg_db/helpers/interact.py +0 -5
- endoreg_db/helpers/test_video_helper.py +33 -25
- endoreg_db/import_files/__init__.py +1 -1
- endoreg_db/import_files/context/__init__.py +1 -1
- endoreg_db/import_files/context/default_sensitive_meta.py +11 -9
- endoreg_db/import_files/context/ensure_center.py +4 -4
- endoreg_db/import_files/context/file_lock.py +3 -3
- endoreg_db/import_files/context/import_context.py +11 -12
- endoreg_db/import_files/context/validate_directories.py +1 -0
- endoreg_db/import_files/file_storage/create_report_file.py +57 -34
- endoreg_db/import_files/file_storage/create_video_file.py +64 -35
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +5 -2
- endoreg_db/import_files/file_storage/state_management.py +89 -122
- endoreg_db/import_files/file_storage/storage.py +5 -1
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +24 -19
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +3 -3
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +18 -18
- endoreg_db/import_files/pseudonymization/k_anonymity.py +8 -9
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +16 -5
- endoreg_db/import_files/report_import_service.py +36 -30
- endoreg_db/import_files/video_import_service.py +27 -23
- endoreg_db/logger_conf.py +56 -40
- endoreg_db/management/__init__.py +1 -1
- endoreg_db/management/commands/__init__.py +1 -1
- endoreg_db/management/commands/check_auth.py +45 -38
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +53 -2
- endoreg_db/management/commands/create_multilabel_model_meta.py +54 -19
- endoreg_db/management/commands/fix_missing_patient_data.py +105 -71
- endoreg_db/management/commands/fix_video_paths.py +75 -54
- endoreg_db/management/commands/import_report.py +1 -3
- endoreg_db/management/commands/list_routes.py +2 -0
- endoreg_db/management/commands/load_ai_model_data.py +8 -2
- endoreg_db/management/commands/load_ai_model_label_data.py +0 -1
- endoreg_db/management/commands/load_center_data.py +3 -3
- endoreg_db/management/commands/load_distribution_data.py +35 -38
- endoreg_db/management/commands/load_endoscope_data.py +0 -3
- endoreg_db/management/commands/load_examination_data.py +20 -4
- endoreg_db/management/commands/load_finding_data.py +18 -3
- endoreg_db/management/commands/load_gender_data.py +17 -24
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +95 -85
- endoreg_db/management/commands/load_information_source.py +0 -3
- endoreg_db/management/commands/load_lab_value_data.py +14 -3
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_name_data.py +1 -2
- endoreg_db/management/commands/load_pdf_type_data.py +4 -8
- endoreg_db/management/commands/load_profession_data.py +0 -1
- endoreg_db/management/commands/load_report_reader_flag_data.py +0 -4
- endoreg_db/management/commands/load_requirement_data.py +6 -2
- endoreg_db/management/commands/load_unit_data.py +0 -4
- endoreg_db/management/commands/load_user_groups.py +5 -7
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +22 -16
- endoreg_db/management/commands/setup_endoreg_db.py +110 -32
- endoreg_db/management/commands/storage_management.py +14 -8
- endoreg_db/management/commands/summarize_db_content.py +154 -63
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +82 -50
- endoreg_db/management/commands/video_validation.py +4 -6
- endoreg_db/migrations/0001_initial.py +112 -63
- endoreg_db/models/__init__.py +8 -0
- endoreg_db/models/administration/ai/active_model.py +5 -5
- endoreg_db/models/administration/ai/ai_model.py +41 -18
- endoreg_db/models/administration/ai/model_type.py +1 -0
- endoreg_db/models/administration/case/case.py +22 -22
- endoreg_db/models/administration/center/__init__.py +5 -5
- endoreg_db/models/administration/center/center.py +6 -2
- endoreg_db/models/administration/center/center_resource.py +18 -4
- endoreg_db/models/administration/center/center_shift.py +3 -1
- endoreg_db/models/administration/center/center_waste.py +6 -2
- endoreg_db/models/administration/person/__init__.py +1 -1
- endoreg_db/models/administration/person/employee/__init__.py +1 -1
- endoreg_db/models/administration/person/employee/employee_type.py +3 -1
- endoreg_db/models/administration/person/examiner/__init__.py +1 -1
- endoreg_db/models/administration/person/examiner/examiner.py +10 -2
- endoreg_db/models/administration/person/names/first_name.py +6 -4
- endoreg_db/models/administration/person/names/last_name.py +4 -3
- endoreg_db/models/administration/person/patient/__init__.py +1 -1
- endoreg_db/models/administration/person/patient/patient.py +0 -1
- endoreg_db/models/administration/person/patient/patient_external_id.py +0 -1
- endoreg_db/models/administration/person/person.py +1 -1
- endoreg_db/models/administration/product/__init__.py +7 -6
- endoreg_db/models/administration/product/product.py +6 -2
- endoreg_db/models/administration/product/product_group.py +9 -7
- endoreg_db/models/administration/product/product_material.py +9 -2
- endoreg_db/models/administration/product/reference_product.py +64 -15
- endoreg_db/models/administration/qualification/qualification.py +3 -1
- endoreg_db/models/administration/shift/shift.py +3 -1
- endoreg_db/models/administration/shift/shift_type.py +12 -4
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +1 -1
- endoreg_db/models/label/label.py +10 -2
- endoreg_db/models/label/label_set.py +3 -1
- endoreg_db/models/label/label_video_segment/_create_from_video.py +6 -2
- endoreg_db/models/label/label_video_segment/label_video_segment.py +148 -44
- endoreg_db/models/media/__init__.py +12 -5
- endoreg_db/models/media/frame/__init__.py +1 -1
- endoreg_db/models/media/frame/frame.py +34 -8
- endoreg_db/models/media/pdf/__init__.py +2 -1
- endoreg_db/models/media/pdf/raw_pdf.py +11 -4
- endoreg_db/models/media/pdf/report_file.py +6 -2
- endoreg_db/models/media/pdf/report_reader/__init__.py +3 -3
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +15 -5
- endoreg_db/models/media/video/create_from_file.py +20 -41
- endoreg_db/models/media/video/pipe_1.py +75 -30
- endoreg_db/models/media/video/pipe_2.py +37 -12
- endoreg_db/models/media/video/video_file.py +36 -24
- endoreg_db/models/media/video/video_file_ai.py +235 -70
- endoreg_db/models/media/video/video_file_anonymize.py +240 -65
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -1
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +3 -1
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +30 -9
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +95 -29
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +13 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -1
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +15 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +15 -3
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +7 -2
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +109 -23
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +111 -27
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +46 -13
- endoreg_db/models/media/video/video_file_io.py +85 -33
- endoreg_db/models/media/video/video_file_meta/__init__.py +6 -6
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +17 -4
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +28 -7
- endoreg_db/models/media/video/video_file_meta/get_fps.py +46 -13
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +81 -20
- endoreg_db/models/media/video/video_file_meta/text_meta.py +61 -20
- endoreg_db/models/media/video/video_file_meta/video_meta.py +40 -12
- endoreg_db/models/media/video/video_file_segments.py +118 -27
- endoreg_db/models/media/video/video_metadata.py +25 -6
- endoreg_db/models/media/video/video_processing.py +54 -15
- endoreg_db/models/medical/__init__.py +3 -13
- endoreg_db/models/medical/contraindication/__init__.py +3 -1
- endoreg_db/models/medical/disease.py +18 -6
- endoreg_db/models/medical/event.py +6 -2
- endoreg_db/models/medical/examination/__init__.py +5 -1
- endoreg_db/models/medical/examination/examination.py +22 -6
- endoreg_db/models/medical/examination/examination_indication.py +23 -7
- endoreg_db/models/medical/examination/examination_time.py +6 -2
- endoreg_db/models/medical/finding/__init__.py +3 -1
- endoreg_db/models/medical/finding/finding.py +37 -12
- endoreg_db/models/medical/finding/finding_classification.py +27 -8
- endoreg_db/models/medical/finding/finding_intervention.py +19 -6
- endoreg_db/models/medical/finding/finding_type.py +3 -1
- endoreg_db/models/medical/hardware/__init__.py +1 -1
- endoreg_db/models/medical/hardware/endoscope.py +14 -2
- endoreg_db/models/medical/laboratory/__init__.py +1 -1
- endoreg_db/models/medical/laboratory/lab_value.py +139 -39
- endoreg_db/models/medical/medication/__init__.py +7 -3
- endoreg_db/models/medical/medication/medication.py +3 -1
- endoreg_db/models/medical/medication/medication_indication.py +3 -1
- endoreg_db/models/medical/medication/medication_indication_type.py +11 -3
- endoreg_db/models/medical/medication/medication_intake_time.py +3 -1
- endoreg_db/models/medical/medication/medication_schedule.py +3 -1
- endoreg_db/models/medical/patient/__init__.py +2 -10
- endoreg_db/models/medical/patient/medication_examples.py +3 -14
- endoreg_db/models/medical/patient/patient_disease.py +17 -5
- endoreg_db/models/medical/patient/patient_event.py +12 -4
- endoreg_db/models/medical/patient/patient_examination.py +52 -15
- endoreg_db/models/medical/patient/patient_examination_indication.py +15 -4
- endoreg_db/models/medical/patient/patient_finding.py +105 -29
- endoreg_db/models/medical/patient/patient_finding_classification.py +41 -12
- endoreg_db/models/medical/patient/patient_finding_intervention.py +11 -3
- endoreg_db/models/medical/patient/patient_lab_sample.py +6 -2
- endoreg_db/models/medical/patient/patient_lab_value.py +42 -10
- endoreg_db/models/medical/patient/patient_medication.py +25 -7
- endoreg_db/models/medical/patient/patient_medication_schedule.py +34 -10
- endoreg_db/models/metadata/model_meta.py +40 -12
- endoreg_db/models/metadata/model_meta_logic.py +51 -16
- endoreg_db/models/metadata/sensitive_meta.py +65 -28
- endoreg_db/models/metadata/sensitive_meta_logic.py +28 -26
- endoreg_db/models/metadata/video_meta.py +146 -39
- endoreg_db/models/metadata/video_prediction_logic.py +70 -21
- endoreg_db/models/metadata/video_prediction_meta.py +80 -27
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +10 -10
- endoreg_db/models/other/distribution/__init__.py +9 -7
- endoreg_db/models/other/distribution/base_value_distribution.py +3 -1
- endoreg_db/models/other/distribution/date_value_distribution.py +19 -5
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +3 -1
- endoreg_db/models/other/distribution/numeric_value_distribution.py +34 -9
- endoreg_db/models/other/emission/__init__.py +1 -1
- endoreg_db/models/other/emission/emission_factor.py +9 -3
- endoreg_db/models/other/information_source.py +15 -5
- endoreg_db/models/other/material.py +3 -1
- endoreg_db/models/other/transport_route.py +3 -1
- endoreg_db/models/other/unit.py +6 -2
- endoreg_db/models/report/report.py +0 -1
- endoreg_db/models/requirement/requirement.py +84 -27
- endoreg_db/models/requirement/requirement_error.py +5 -6
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +1 -1
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +8 -8
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +3 -3
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +24 -8
- endoreg_db/models/requirement/requirement_operator.py +28 -8
- endoreg_db/models/requirement/requirement_set.py +34 -11
- endoreg_db/models/state/__init__.py +1 -0
- endoreg_db/models/state/audit_ledger.py +9 -2
- endoreg_db/models/{media → state}/processing_history/__init__.py +1 -3
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +0 -1
- endoreg_db/models/state/video.py +2 -4
- endoreg_db/models/utils.py +4 -2
- endoreg_db/queries/__init__.py +2 -6
- endoreg_db/queries/annotations/__init__.py +1 -3
- endoreg_db/queries/annotations/legacy.py +37 -26
- endoreg_db/root_urls.py +3 -4
- endoreg_db/schemas/examination_evaluation.py +3 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +249 -163
- endoreg_db/serializers/__init__.py +2 -8
- endoreg_db/serializers/administration/__init__.py +1 -2
- endoreg_db/serializers/administration/ai/__init__.py +0 -1
- endoreg_db/serializers/administration/ai/active_model.py +3 -1
- endoreg_db/serializers/administration/ai/ai_model.py +5 -3
- endoreg_db/serializers/administration/ai/model_type.py +3 -1
- endoreg_db/serializers/administration/center.py +7 -2
- endoreg_db/serializers/administration/gender.py +4 -2
- endoreg_db/serializers/anonymization.py +13 -13
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -1
- endoreg_db/serializers/examination/__init__.py +1 -1
- endoreg_db/serializers/examination/base.py +12 -13
- endoreg_db/serializers/examination/dropdown.py +6 -7
- endoreg_db/serializers/examination_serializer.py +3 -6
- endoreg_db/serializers/finding/__init__.py +1 -1
- endoreg_db/serializers/finding/finding.py +14 -7
- endoreg_db/serializers/finding_classification/__init__.py +3 -3
- endoreg_db/serializers/finding_classification/choice.py +3 -3
- endoreg_db/serializers/finding_classification/classification.py +2 -4
- endoreg_db/serializers/label_video_segment/__init__.py +5 -3
- endoreg_db/serializers/{label → label_video_segment}/image_classification_annotation.py +5 -5
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/{label → label_video_segment/label}/label.py +1 -1
- endoreg_db/serializers/label_video_segment/label_video_segment.py +338 -228
- endoreg_db/serializers/meta/__init__.py +1 -2
- endoreg_db/serializers/meta/sensitive_meta_detail.py +28 -13
- endoreg_db/serializers/meta/sensitive_meta_update.py +51 -46
- endoreg_db/serializers/meta/sensitive_meta_verification.py +19 -16
- endoreg_db/serializers/misc/__init__.py +2 -2
- endoreg_db/serializers/misc/file_overview.py +11 -7
- endoreg_db/serializers/misc/stats.py +10 -8
- endoreg_db/serializers/misc/translatable_field_mix_in.py +6 -6
- endoreg_db/serializers/misc/upload_job.py +32 -29
- endoreg_db/serializers/patient/__init__.py +2 -1
- endoreg_db/serializers/patient/patient.py +32 -15
- endoreg_db/serializers/patient/patient_dropdown.py +11 -3
- endoreg_db/serializers/patient_examination/__init__.py +1 -1
- endoreg_db/serializers/patient_examination/patient_examination.py +67 -40
- endoreg_db/serializers/patient_finding/__init__.py +1 -1
- endoreg_db/serializers/patient_finding/patient_finding.py +2 -1
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +17 -9
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +26 -17
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +7 -5
- endoreg_db/serializers/patient_finding/patient_finding_list.py +10 -11
- endoreg_db/serializers/patient_finding/patient_finding_write.py +36 -27
- endoreg_db/serializers/pdf/__init__.py +1 -3
- endoreg_db/serializers/requirements/requirement_schema.py +1 -6
- endoreg_db/serializers/sensitive_meta_serializer.py +100 -81
- endoreg_db/serializers/video/__init__.py +2 -2
- endoreg_db/serializers/video/{segmentation.py → video_file.py} +66 -47
- endoreg_db/serializers/video/video_file_brief.py +6 -2
- endoreg_db/serializers/video/video_file_detail.py +36 -23
- endoreg_db/serializers/video/video_file_list.py +4 -2
- endoreg_db/serializers/video/video_processing_history.py +54 -50
- endoreg_db/services/__init__.py +1 -1
- endoreg_db/services/anonymization.py +2 -2
- endoreg_db/services/examination_evaluation.py +40 -17
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/polling_coordinator.py +101 -70
- endoreg_db/services/pseudonym_service.py +27 -22
- endoreg_db/services/report_import.py +6 -3
- endoreg_db/services/segment_sync.py +75 -59
- endoreg_db/services/video_import.py +6 -7
- endoreg_db/urls/__init__.py +2 -2
- endoreg_db/urls/ai.py +7 -25
- endoreg_db/urls/anonymization.py +61 -15
- endoreg_db/urls/auth.py +4 -4
- endoreg_db/urls/classification.py +4 -9
- endoreg_db/urls/examination.py +27 -18
- endoreg_db/urls/media.py +27 -34
- endoreg_db/urls/patient.py +11 -7
- endoreg_db/urls/requirements.py +3 -1
- endoreg_db/urls/root_urls.py +2 -3
- endoreg_db/urls/stats.py +24 -16
- endoreg_db/urls/upload.py +3 -11
- endoreg_db/utils/__init__.py +14 -15
- endoreg_db/utils/ai/__init__.py +1 -1
- 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 +2 -1
- endoreg_db/utils/ai/inference_dataset.py +14 -15
- 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 +21 -6
- endoreg_db/utils/ai/predict.py +4 -4
- endoreg_db/utils/ai/preprocess.py +19 -11
- endoreg_db/utils/calc_duration_seconds.py +4 -4
- endoreg_db/utils/case_generator/lab_sample_factory.py +3 -4
- endoreg_db/utils/check_video_files.py +74 -47
- endoreg_db/utils/cropping.py +10 -9
- endoreg_db/utils/dataloader.py +11 -3
- endoreg_db/utils/dates.py +3 -4
- endoreg_db/utils/defaults/set_default_center.py +7 -6
- endoreg_db/utils/env.py +6 -2
- endoreg_db/utils/extract_specific_frames.py +24 -9
- endoreg_db/utils/file_operations.py +30 -18
- endoreg_db/utils/fix_video_path_direct.py +57 -41
- endoreg_db/utils/frame_anonymization_utils.py +157 -157
- endoreg_db/utils/hashs.py +3 -18
- endoreg_db/utils/links/requirement_link.py +96 -52
- endoreg_db/utils/ocr.py +30 -25
- endoreg_db/utils/operation_log.py +61 -0
- endoreg_db/utils/parse_and_generate_yaml.py +12 -13
- endoreg_db/utils/paths.py +6 -6
- endoreg_db/utils/permissions.py +40 -24
- endoreg_db/utils/pipelines/process_video_dir.py +50 -26
- endoreg_db/utils/product/sum_emissions.py +5 -3
- endoreg_db/utils/product/sum_weights.py +4 -2
- endoreg_db/utils/pydantic_models/__init__.py +3 -4
- endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +207 -107
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +252 -65
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +27 -10
- endoreg_db/utils/setup_config.py +21 -5
- endoreg_db/utils/storage.py +3 -1
- endoreg_db/utils/translation.py +19 -15
- endoreg_db/utils/uuid.py +1 -0
- endoreg_db/utils/validate_endo_roi.py +12 -4
- endoreg_db/utils/validate_subcategory_dict.py +26 -24
- endoreg_db/utils/validate_video_detailed.py +207 -149
- endoreg_db/utils/video/__init__.py +7 -3
- endoreg_db/utils/video/extract_frames.py +30 -18
- endoreg_db/utils/video/names.py +11 -6
- endoreg_db/utils/video/streaming_processor.py +175 -101
- endoreg_db/utils/video/video_splitter.py +30 -19
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +59 -50
- endoreg_db/views/__init__.py +0 -20
- endoreg_db/views/anonymization/__init__.py +6 -2
- endoreg_db/views/anonymization/media_management.py +2 -6
- endoreg_db/views/anonymization/overview.py +34 -1
- endoreg_db/views/anonymization/validate.py +79 -18
- endoreg_db/views/auth/__init__.py +1 -1
- endoreg_db/views/auth/keycloak.py +16 -14
- endoreg_db/views/examination/__init__.py +12 -15
- endoreg_db/views/examination/examination.py +5 -5
- endoreg_db/views/examination/examination_manifest_cache.py +5 -5
- endoreg_db/views/examination/get_finding_classification_choices.py +8 -5
- endoreg_db/views/examination/get_finding_classifications.py +9 -7
- endoreg_db/views/examination/get_findings.py +8 -10
- endoreg_db/views/examination/get_instruments.py +3 -2
- endoreg_db/views/examination/get_interventions.py +1 -1
- endoreg_db/views/finding/__init__.py +2 -2
- endoreg_db/views/finding/finding.py +58 -54
- endoreg_db/views/finding/get_classifications.py +1 -1
- endoreg_db/views/finding/get_interventions.py +1 -1
- endoreg_db/views/finding_classification/__init__.py +5 -5
- endoreg_db/views/finding_classification/finding_classification.py +5 -6
- endoreg_db/views/finding_classification/get_classification_choices.py +3 -4
- endoreg_db/views/media/__init__.py +13 -13
- endoreg_db/views/media/pdf_media.py +9 -9
- endoreg_db/views/media/sensitive_metadata.py +10 -7
- endoreg_db/views/media/video_media.py +4 -4
- endoreg_db/views/meta/__init__.py +1 -1
- endoreg_db/views/meta/sensitive_meta_list.py +20 -22
- endoreg_db/views/meta/sensitive_meta_verification.py +14 -11
- endoreg_db/views/misc/__init__.py +6 -34
- endoreg_db/views/misc/center.py +2 -1
- endoreg_db/views/misc/csrf.py +2 -1
- endoreg_db/views/misc/gender.py +2 -1
- endoreg_db/views/misc/stats.py +141 -106
- endoreg_db/views/patient/__init__.py +1 -3
- endoreg_db/views/patient/patient.py +141 -99
- endoreg_db/views/patient_examination/__init__.py +5 -5
- endoreg_db/views/patient_examination/patient_examination.py +43 -42
- endoreg_db/views/patient_examination/patient_examination_create.py +10 -15
- endoreg_db/views/patient_examination/patient_examination_detail.py +12 -15
- endoreg_db/views/patient_examination/patient_examination_list.py +21 -17
- endoreg_db/views/patient_examination/video.py +114 -80
- endoreg_db/views/patient_finding/__init__.py +1 -1
- endoreg_db/views/patient_finding/patient_finding.py +17 -10
- endoreg_db/views/patient_finding/patient_finding_optimized.py +127 -95
- endoreg_db/views/patient_finding_classification/__init__.py +1 -1
- endoreg_db/views/patient_finding_classification/pfc_create.py +35 -27
- endoreg_db/views/report/reimport.py +1 -1
- endoreg_db/views/report/report_stream.py +5 -8
- endoreg_db/views/requirement/__init__.py +2 -1
- endoreg_db/views/requirement/evaluate.py +7 -9
- endoreg_db/views/requirement/lookup.py +2 -3
- endoreg_db/views/requirement/lookup_store.py +0 -1
- endoreg_db/views/requirement/requirement_utils.py +2 -4
- endoreg_db/views/stats/__init__.py +4 -4
- endoreg_db/views/stats/stats_views.py +152 -115
- endoreg_db/views/video/__init__.py +18 -27
- endoreg_db/views/{ai → video/ai}/__init__.py +2 -2
- endoreg_db/views/{ai → video/ai}/label.py +20 -16
- endoreg_db/views/video/correction.py +5 -6
- endoreg_db/views/video/reimport.py +134 -99
- endoreg_db/views/video/segments_crud.py +134 -44
- endoreg_db/views/video/video_apply_mask.py +13 -12
- endoreg_db/views/video/video_correction.py +2 -1
- endoreg_db/views/video/video_download_processed.py +15 -15
- endoreg_db/views/video/video_meta_stats.py +7 -6
- endoreg_db/views/video/video_processing_history.py +3 -2
- endoreg_db/views/video/video_remove_frames.py +13 -12
- endoreg_db/views/video/video_stream.py +110 -82
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/METADATA +9 -3
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/RECORD +434 -431
- endoreg_db/management/commands/import_fallback_video.py +0 -203
- endoreg_db/management/commands/import_video.py +0 -422
- endoreg_db/management/commands/import_video_with_classification.py +0 -367
- endoreg_db/models/media/processing_history/processing_history.py +0 -96
- endoreg_db/serializers/label/__init__.py +0 -7
- endoreg_db/serializers/label_video_segment/_lvs_create.py +0 -149
- endoreg_db/serializers/label_video_segment/_lvs_update.py +0 -138
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +0 -149
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +0 -99
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +0 -163
- endoreg_db/services/__old/pdf_import.py +0 -1487
- endoreg_db/services/__old/video_import.py +0 -1306
- endoreg_db/tasks/upload_tasks.py +0 -216
- endoreg_db/tasks/video_ingest.py +0 -161
- endoreg_db/tasks/video_processing_tasks.py +0 -327
- endoreg_db/views/misc/translation.py +0 -182
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/licenses/LICENSE +0 -0
|
@@ -2,27 +2,39 @@ from rest_framework import serializers
|
|
|
2
2
|
from endoreg_db.models import Patient, Gender, Center
|
|
3
3
|
from datetime import date
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
class PatientSerializer(serializers.ModelSerializer):
|
|
6
7
|
# Use the slug field "name" so that the gender is represented by its string value
|
|
7
8
|
gender = serializers.SlugRelatedField(
|
|
8
|
-
slug_field=
|
|
9
|
+
slug_field="name",
|
|
9
10
|
queryset=Gender.objects.all(),
|
|
10
11
|
required=False,
|
|
11
|
-
allow_null=True
|
|
12
|
+
allow_null=True,
|
|
12
13
|
)
|
|
13
14
|
center = serializers.SlugRelatedField(
|
|
14
|
-
slug_field=
|
|
15
|
+
slug_field="name",
|
|
15
16
|
queryset=Center.objects.all(),
|
|
16
17
|
required=False,
|
|
17
|
-
allow_null=True
|
|
18
|
+
allow_null=True,
|
|
18
19
|
)
|
|
19
20
|
age = serializers.SerializerMethodField()
|
|
20
21
|
|
|
21
22
|
class Meta:
|
|
22
23
|
model = Patient
|
|
23
|
-
fields = [
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
fields = [
|
|
25
|
+
"id",
|
|
26
|
+
"first_name",
|
|
27
|
+
"last_name",
|
|
28
|
+
"dob",
|
|
29
|
+
"gender",
|
|
30
|
+
"center",
|
|
31
|
+
"email",
|
|
32
|
+
"phone",
|
|
33
|
+
"patient_hash",
|
|
34
|
+
"is_real_person",
|
|
35
|
+
"age",
|
|
36
|
+
]
|
|
37
|
+
read_only_fields = ["id", "age"]
|
|
26
38
|
|
|
27
39
|
def get_age(self, obj):
|
|
28
40
|
"""Berechnet das Alter des Patienten"""
|
|
@@ -45,12 +57,14 @@ class PatientSerializer(serializers.ModelSerializer):
|
|
|
45
57
|
def validate_dob(self, value):
|
|
46
58
|
"""Validiert das Geburtsdatum"""
|
|
47
59
|
if value and value > date.today():
|
|
48
|
-
raise serializers.ValidationError(
|
|
60
|
+
raise serializers.ValidationError(
|
|
61
|
+
"Geburtsdatum kann nicht in der Zukunft liegen"
|
|
62
|
+
)
|
|
49
63
|
return value
|
|
50
64
|
|
|
51
65
|
def validate_email(self, value):
|
|
52
66
|
"""Validiert die E-Mail-Adresse"""
|
|
53
|
-
if value and
|
|
67
|
+
if value and "@" not in value:
|
|
54
68
|
raise serializers.ValidationError("Ungültige E-Mail-Adresse")
|
|
55
69
|
return value
|
|
56
70
|
|
|
@@ -60,19 +74,21 @@ class PatientSerializer(serializers.ModelSerializer):
|
|
|
60
74
|
patient = Patient.objects.create(**validated_data)
|
|
61
75
|
return patient
|
|
62
76
|
except Exception as e:
|
|
63
|
-
raise serializers.ValidationError(
|
|
77
|
+
raise serializers.ValidationError(
|
|
78
|
+
f"Fehler beim Erstellen des Patienten: {str(e)}"
|
|
79
|
+
)
|
|
64
80
|
|
|
65
81
|
def update(self, instance, validated_data):
|
|
66
82
|
"""
|
|
67
83
|
Update an existing Patient instance with validated data.
|
|
68
|
-
|
|
84
|
+
|
|
69
85
|
Parameters:
|
|
70
86
|
instance (Patient): The Patient instance to update.
|
|
71
87
|
validated_data (dict): Dictionary of validated data to update the instance with.
|
|
72
|
-
|
|
88
|
+
|
|
73
89
|
Returns:
|
|
74
90
|
Patient: The updated Patient instance.
|
|
75
|
-
|
|
91
|
+
|
|
76
92
|
Raises:
|
|
77
93
|
ValidationError: If an error occurs during the update process.
|
|
78
94
|
"""
|
|
@@ -82,5 +98,6 @@ class PatientSerializer(serializers.ModelSerializer):
|
|
|
82
98
|
instance.save()
|
|
83
99
|
return instance
|
|
84
100
|
except Exception as e:
|
|
85
|
-
raise serializers.ValidationError(
|
|
86
|
-
|
|
101
|
+
raise serializers.ValidationError(
|
|
102
|
+
f"Fehler beim Aktualisieren des Patienten: {str(e)}"
|
|
103
|
+
)
|
|
@@ -6,19 +6,27 @@ from rest_framework import serializers
|
|
|
6
6
|
|
|
7
7
|
class PatientDropdownSerializer(serializers.ModelSerializer):
|
|
8
8
|
"""Serializer für Patient-Dropdown"""
|
|
9
|
+
|
|
9
10
|
display_name = serializers.SerializerMethodField()
|
|
10
11
|
|
|
11
12
|
class Meta:
|
|
12
13
|
model = Patient
|
|
13
|
-
fields = [
|
|
14
|
+
fields = [
|
|
15
|
+
"id",
|
|
16
|
+
"patient_hash",
|
|
17
|
+
"first_name",
|
|
18
|
+
"last_name",
|
|
19
|
+
"display_name",
|
|
20
|
+
"dob",
|
|
21
|
+
]
|
|
14
22
|
|
|
15
23
|
def get_display_name(self, obj):
|
|
16
24
|
"""
|
|
17
25
|
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
|
-
|
|
26
|
+
|
|
19
27
|
Parameters:
|
|
20
28
|
obj: The patient instance being serialized.
|
|
21
|
-
|
|
29
|
+
|
|
22
30
|
Returns:
|
|
23
31
|
str: The formatted display name for the patient.
|
|
24
32
|
"""
|
|
@@ -2,44 +2,58 @@ from rest_framework import serializers
|
|
|
2
2
|
from endoreg_db.models import PatientExamination, Patient, Examination
|
|
3
3
|
from datetime import date
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
class PatientExaminationSerializer(serializers.ModelSerializer):
|
|
6
7
|
# Verwende CharField für patient, um patient_hash zu empfangen
|
|
7
8
|
patient = serializers.CharField(
|
|
8
9
|
write_only=True, # Nur für Eingabe verwenden
|
|
9
10
|
required=True,
|
|
10
|
-
help_text="Patient Hash (z.B. 'patient_2')"
|
|
11
|
+
help_text="Patient Hash (z.B. 'patient_2')",
|
|
11
12
|
)
|
|
12
|
-
|
|
13
|
+
|
|
13
14
|
# Für die Ausgabe verwenden wir ein schreibgeschütztes Feld
|
|
14
15
|
patient_data = serializers.SerializerMethodField(read_only=True)
|
|
15
|
-
|
|
16
|
+
|
|
16
17
|
examination = serializers.SlugRelatedField(
|
|
17
|
-
slug_field=
|
|
18
|
+
slug_field="name",
|
|
18
19
|
queryset=Examination.objects.all(),
|
|
19
20
|
required=False,
|
|
20
|
-
allow_null=True
|
|
21
|
+
allow_null=True,
|
|
21
22
|
)
|
|
22
|
-
|
|
23
|
+
|
|
23
24
|
# Zusätzliche schreibgeschützte Felder für bessere API-Antworten
|
|
24
25
|
patient_name = serializers.SerializerMethodField()
|
|
25
26
|
examination_name = serializers.SerializerMethodField()
|
|
26
|
-
|
|
27
|
+
|
|
27
28
|
class Meta:
|
|
28
29
|
model = PatientExamination
|
|
29
30
|
fields = [
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
"id",
|
|
32
|
+
"patient",
|
|
33
|
+
"patient_data",
|
|
34
|
+
"examination",
|
|
35
|
+
"date_start",
|
|
36
|
+
"date_end",
|
|
37
|
+
"hash",
|
|
38
|
+
"patient_name",
|
|
39
|
+
"examination_name",
|
|
40
|
+
]
|
|
41
|
+
read_only_fields = [
|
|
42
|
+
"id",
|
|
43
|
+
"hash",
|
|
44
|
+
"patient_name",
|
|
45
|
+
"examination_name",
|
|
46
|
+
"patient_data",
|
|
32
47
|
]
|
|
33
|
-
read_only_fields = ['id', 'hash', 'patient_name', 'examination_name', 'patient_data']
|
|
34
48
|
|
|
35
49
|
def get_patient_data(self, obj):
|
|
36
50
|
"""Gibt die Patient-Daten für die Ausgabe zurück"""
|
|
37
51
|
if obj.patient:
|
|
38
52
|
return {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
53
|
+
"id": obj.patient.id,
|
|
54
|
+
"patient_hash": obj.patient.patient_hash,
|
|
55
|
+
"first_name": obj.patient.first_name,
|
|
56
|
+
"last_name": obj.patient.last_name,
|
|
43
57
|
}
|
|
44
58
|
return None
|
|
45
59
|
|
|
@@ -48,7 +62,7 @@ class PatientExaminationSerializer(serializers.ModelSerializer):
|
|
|
48
62
|
if obj.patient:
|
|
49
63
|
return f"{obj.patient.first_name} {obj.patient.last_name}"
|
|
50
64
|
return None
|
|
51
|
-
|
|
65
|
+
|
|
52
66
|
def get_examination_name(self, obj):
|
|
53
67
|
"""Gibt den Namen der Untersuchung zurück"""
|
|
54
68
|
if obj.examination:
|
|
@@ -59,7 +73,7 @@ class PatientExaminationSerializer(serializers.ModelSerializer):
|
|
|
59
73
|
"""Validiert und erstellt Patient falls nötig"""
|
|
60
74
|
if not value:
|
|
61
75
|
raise serializers.ValidationError("Patient Hash ist erforderlich")
|
|
62
|
-
|
|
76
|
+
|
|
63
77
|
# Versuche Patient zu finden
|
|
64
78
|
try:
|
|
65
79
|
patient = Patient.objects.get(patient_hash=value)
|
|
@@ -70,72 +84,85 @@ class PatientExaminationSerializer(serializers.ModelSerializer):
|
|
|
70
84
|
patient_hash=value,
|
|
71
85
|
first_name="Patient",
|
|
72
86
|
last_name=value,
|
|
73
|
-
is_real_person=False # Markiere als Pseudo-Patient
|
|
87
|
+
is_real_person=False, # Markiere als Pseudo-Patient
|
|
74
88
|
)
|
|
75
89
|
return patient
|
|
76
90
|
|
|
77
91
|
def validate_date_start(self, value):
|
|
78
92
|
"""Validiert das Startdatum"""
|
|
79
93
|
if value and value > date.today():
|
|
80
|
-
raise serializers.ValidationError(
|
|
94
|
+
raise serializers.ValidationError(
|
|
95
|
+
"Startdatum kann nicht in der Zukunft liegen"
|
|
96
|
+
)
|
|
81
97
|
return value
|
|
82
98
|
|
|
83
99
|
def validate_date_end(self, value):
|
|
84
100
|
"""Validiert das Enddatum"""
|
|
85
101
|
if value and value > date.today():
|
|
86
|
-
raise serializers.ValidationError(
|
|
102
|
+
raise serializers.ValidationError(
|
|
103
|
+
"Enddatum kann nicht in der Zukunft liegen"
|
|
104
|
+
)
|
|
87
105
|
return value
|
|
88
106
|
|
|
89
107
|
def validate(self, data):
|
|
90
108
|
"""Validiert die gesamten Daten"""
|
|
91
|
-
date_start = data.get(
|
|
92
|
-
date_end = data.get(
|
|
93
|
-
|
|
109
|
+
date_start = data.get("date_start")
|
|
110
|
+
date_end = data.get("date_end")
|
|
111
|
+
|
|
94
112
|
if date_start and date_end and date_end < date_start:
|
|
95
|
-
raise serializers.ValidationError(
|
|
96
|
-
|
|
113
|
+
raise serializers.ValidationError(
|
|
114
|
+
"Enddatum muss nach dem Startdatum liegen"
|
|
115
|
+
)
|
|
116
|
+
|
|
97
117
|
return data
|
|
98
118
|
|
|
99
119
|
def create(self, validated_data):
|
|
100
120
|
"""Erstellt eine neue PatientExamination mit verbesserter Fehlerbehandlung"""
|
|
101
121
|
try:
|
|
102
122
|
# Patient wurde bereits in validate_patient erstellt/gefunden
|
|
103
|
-
patient = validated_data.pop(
|
|
104
|
-
|
|
105
|
-
|
|
123
|
+
patient = validated_data.pop(
|
|
124
|
+
"patient"
|
|
125
|
+
) # Entferne patient aus validated_data
|
|
126
|
+
validated_data["patient"] = patient # Füge das Patient-Objekt hinzu
|
|
127
|
+
|
|
106
128
|
patient_examination = PatientExamination.objects.create(**validated_data)
|
|
107
129
|
return patient_examination
|
|
108
130
|
except Exception as e:
|
|
109
|
-
raise serializers.ValidationError(
|
|
131
|
+
raise serializers.ValidationError(
|
|
132
|
+
f"Fehler beim Erstellen der Patientenuntersuchung: {str(e)}"
|
|
133
|
+
)
|
|
110
134
|
|
|
111
135
|
def update(self, instance, validated_data):
|
|
112
136
|
"""
|
|
113
137
|
Update an existing PatientExamination instance with validated data.
|
|
114
|
-
|
|
138
|
+
|
|
115
139
|
If a new patient is provided, updates the patient reference. Applies all other validated fields to the instance and saves changes.
|
|
116
|
-
|
|
140
|
+
|
|
117
141
|
Returns:
|
|
118
142
|
PatientExamination: The updated PatientExamination instance.
|
|
119
|
-
|
|
143
|
+
|
|
120
144
|
Raises:
|
|
121
145
|
ValidationError: If an error occurs during the update process.
|
|
122
146
|
"""
|
|
123
147
|
try:
|
|
124
148
|
# Falls Patient geändert wird
|
|
125
|
-
if
|
|
126
|
-
patient = validated_data.pop(
|
|
127
|
-
validated_data[
|
|
128
|
-
|
|
149
|
+
if "patient" in validated_data:
|
|
150
|
+
patient = validated_data.pop("patient")
|
|
151
|
+
validated_data["patient"] = patient
|
|
152
|
+
|
|
129
153
|
for attr, value in validated_data.items():
|
|
130
154
|
setattr(instance, attr, value)
|
|
131
155
|
instance.save()
|
|
132
156
|
return instance
|
|
133
157
|
except Exception as e:
|
|
134
|
-
raise serializers.ValidationError(
|
|
135
|
-
|
|
158
|
+
raise serializers.ValidationError(
|
|
159
|
+
f"Fehler beim Aktualisieren der Patientenuntersuchung: {str(e)}"
|
|
160
|
+
)
|
|
161
|
+
|
|
136
162
|
def get_findings(self, patient_examination_id):
|
|
137
163
|
"""Gibt die zugehörigen Befunde zurück"""
|
|
138
|
-
|
|
139
|
-
obj
|
|
164
|
+
obj = PatientExamination.objects.filter(pk=patient_examination_id).first()
|
|
165
|
+
if obj is None:
|
|
166
|
+
return []
|
|
140
167
|
self.instance = obj
|
|
141
|
-
return self.instance.get_available_findings()
|
|
168
|
+
return self.instance.get_available_findings()
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
from endoreg_db.models import PatientFinding
|
|
2
2
|
from rest_framework import serializers
|
|
3
3
|
|
|
4
|
+
|
|
4
5
|
class PatientFindingSerializer(serializers.ModelSerializer):
|
|
5
6
|
class Meta:
|
|
6
7
|
model = PatientFinding
|
|
7
|
-
#fields = '__all__'
|
|
8
|
+
# fields = '__all__'
|
|
8
9
|
fields = [
|
|
9
10
|
"id",
|
|
10
11
|
"patient_examination",
|
|
@@ -5,35 +5,43 @@ from endoreg_db.serializers.misc.translatable_field_mix_in import TranslatableFi
|
|
|
5
5
|
from rest_framework import serializers
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class PatientFindingClassificationSerializer(
|
|
8
|
+
class PatientFindingClassificationSerializer(
|
|
9
|
+
serializers.ModelSerializer, TranslatableFieldMixin
|
|
10
|
+
):
|
|
9
11
|
"""Serializer für PatientFinding-Klassifikationen"""
|
|
10
12
|
|
|
11
13
|
classification_name = serializers.SerializerMethodField()
|
|
12
14
|
classification_choice_name = serializers.SerializerMethodField()
|
|
15
|
+
|
|
13
16
|
class Meta:
|
|
14
17
|
model = PatientFindingClassification
|
|
15
|
-
fields = [
|
|
18
|
+
fields = [
|
|
19
|
+
"id",
|
|
20
|
+
"classification",
|
|
21
|
+
"classification_name",
|
|
22
|
+
"classification_choice_name",
|
|
23
|
+
]
|
|
16
24
|
|
|
17
|
-
def get_classification_name(self, obj:PatientFindingClassification):
|
|
25
|
+
def get_classification_name(self, obj: PatientFindingClassification):
|
|
18
26
|
"""
|
|
19
27
|
Return the localized name for the classification attribute of a PatientFindingClassification instance.
|
|
20
|
-
|
|
28
|
+
|
|
21
29
|
Parameters:
|
|
22
30
|
obj (PatientFindingClassification): The instance whose classification name is to be localized.
|
|
23
|
-
|
|
31
|
+
|
|
24
32
|
Returns:
|
|
25
33
|
str: The localized classification name.
|
|
26
34
|
"""
|
|
27
35
|
return self.get_localized_name(obj.classification)
|
|
28
36
|
|
|
29
|
-
def get_classification_choice_name(self, obj:PatientFindingClassification):
|
|
37
|
+
def get_classification_choice_name(self, obj: PatientFindingClassification):
|
|
30
38
|
"""
|
|
31
39
|
Return the localized name for the classification choice of a patient finding classification instance.
|
|
32
|
-
|
|
40
|
+
|
|
33
41
|
Parameters:
|
|
34
42
|
obj (PatientFindingClassification): The patient finding classification instance.
|
|
35
|
-
|
|
43
|
+
|
|
36
44
|
Returns:
|
|
37
45
|
str: Localized name of the classification choice.
|
|
38
46
|
"""
|
|
39
|
-
return self.get_localized_name(obj.classification_choice)
|
|
47
|
+
return self.get_localized_name(obj.classification_choice)
|
|
@@ -3,51 +3,60 @@ from endoreg_db.models import (
|
|
|
3
3
|
PatientFinding,
|
|
4
4
|
)
|
|
5
5
|
from endoreg_db.serializers.misc.translatable_field_mix_in import TranslatableFieldMixin
|
|
6
|
-
from endoreg_db.serializers.patient_finding.patient_finding_intervention import
|
|
6
|
+
from endoreg_db.serializers.patient_finding.patient_finding_intervention import (
|
|
7
|
+
PatientFindingInterventionSerializer,
|
|
8
|
+
)
|
|
7
9
|
from .patient_finding_classification import PatientFindingClassificationSerializer
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
|
|
12
|
+
class PatientFindingDetailSerializer(
|
|
13
|
+
serializers.ModelSerializer, TranslatableFieldMixin
|
|
14
|
+
):
|
|
10
15
|
"""Vollständiger Serializer mit allen verschachtelten Daten - optimiert für N+1 Vermeidung"""
|
|
11
|
-
|
|
12
|
-
|
|
16
|
+
|
|
13
17
|
classifications = PatientFindingClassificationSerializer(many=True, read_only=True)
|
|
14
18
|
interventions = PatientFindingInterventionSerializer(many=True, read_only=True)
|
|
15
|
-
|
|
19
|
+
|
|
16
20
|
# Meta-Informationen für das Frontend
|
|
17
|
-
patient_id = serializers.CharField(
|
|
21
|
+
patient_id = serializers.CharField(
|
|
22
|
+
source="patient_examination.patient.id", read_only=True
|
|
23
|
+
)
|
|
18
24
|
examination_name = serializers.SerializerMethodField()
|
|
19
25
|
finding_name = serializers.SerializerMethodField()
|
|
20
26
|
|
|
21
27
|
class Meta:
|
|
22
28
|
model = PatientFinding
|
|
23
29
|
fields = [
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
"id",
|
|
31
|
+
"patient_examination",
|
|
32
|
+
"finding",
|
|
33
|
+
"finding_name",
|
|
34
|
+
"patient_id",
|
|
35
|
+
"examination_name",
|
|
36
|
+
"classifications",
|
|
37
|
+
"interventions",
|
|
27
38
|
]
|
|
28
|
-
|
|
39
|
+
|
|
29
40
|
def get_finding_name(self, obj):
|
|
30
41
|
"""
|
|
31
42
|
Return the localized name of the finding associated with the given PatientFinding instance.
|
|
32
|
-
|
|
43
|
+
|
|
33
44
|
Parameters:
|
|
34
45
|
obj: The PatientFinding instance being serialized.
|
|
35
|
-
|
|
46
|
+
|
|
36
47
|
Returns:
|
|
37
48
|
str: The localized name of the related finding.
|
|
38
49
|
"""
|
|
39
50
|
return self.get_localized_name(obj.finding)
|
|
40
|
-
|
|
51
|
+
|
|
41
52
|
def get_examination_name(self, obj):
|
|
42
53
|
"""
|
|
43
54
|
Return the localized name of the examination associated with the given PatientFinding instance.
|
|
44
|
-
|
|
55
|
+
|
|
45
56
|
Parameters:
|
|
46
57
|
obj: The PatientFinding instance being serialized.
|
|
47
|
-
|
|
58
|
+
|
|
48
59
|
Returns:
|
|
49
60
|
str: The localized name of the related examination.
|
|
50
61
|
"""
|
|
51
62
|
return self.get_localized_name(obj.patient_examination.examination)
|
|
52
|
-
|
|
53
|
-
|
|
@@ -4,23 +4,25 @@ from endoreg_db.models import PatientFindingIntervention
|
|
|
4
4
|
from rest_framework import serializers
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
class PatientFindingInterventionSerializer(
|
|
7
|
+
class PatientFindingInterventionSerializer(
|
|
8
|
+
serializers.ModelSerializer, TranslatableFieldMixin
|
|
9
|
+
):
|
|
8
10
|
"""Optimierter Serializer für PatientFindingIntervention"""
|
|
9
11
|
|
|
10
12
|
intervention_name = serializers.SerializerMethodField()
|
|
11
13
|
|
|
12
14
|
class Meta:
|
|
13
15
|
model = PatientFindingIntervention
|
|
14
|
-
fields = [
|
|
16
|
+
fields = ["id", "intervention", "intervention_name", "state"]
|
|
15
17
|
|
|
16
18
|
def get_intervention_name(self, obj):
|
|
17
19
|
"""
|
|
18
20
|
Return the localized name of the intervention associated with the given object.
|
|
19
|
-
|
|
21
|
+
|
|
20
22
|
Parameters:
|
|
21
23
|
obj: The object containing the intervention to be localized.
|
|
22
|
-
|
|
24
|
+
|
|
23
25
|
Returns:
|
|
24
26
|
str: The localized name of the intervention.
|
|
25
27
|
"""
|
|
26
|
-
return self.get_localized_name(obj.intervention)
|
|
28
|
+
return self.get_localized_name(obj.intervention)
|
|
@@ -10,32 +10,31 @@ class PatientFindingListSerializer(serializers.ModelSerializer, TranslatableFiel
|
|
|
10
10
|
|
|
11
11
|
finding_name = serializers.SerializerMethodField()
|
|
12
12
|
patient_name = serializers.CharField(
|
|
13
|
-
source=
|
|
14
|
-
read_only=True
|
|
13
|
+
source="patient_examination.patient.get_full_name", read_only=True
|
|
15
14
|
)
|
|
16
15
|
examination_date = serializers.DateTimeField(
|
|
17
|
-
source=
|
|
18
|
-
read_only=True
|
|
16
|
+
source="patient_examination.date_start", read_only=True
|
|
19
17
|
)
|
|
20
18
|
|
|
21
19
|
class Meta:
|
|
22
20
|
model = PatientFinding
|
|
23
21
|
fields = [
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
"id",
|
|
23
|
+
"finding_name",
|
|
24
|
+
"patient_name",
|
|
25
|
+
"examination_date",
|
|
26
|
+
"patient_examination",
|
|
27
|
+
"finding",
|
|
26
28
|
]
|
|
27
29
|
|
|
28
30
|
def get_finding_name(self, obj):
|
|
29
31
|
"""
|
|
30
32
|
Return the localized name of the finding associated with the given PatientFinding instance.
|
|
31
|
-
|
|
33
|
+
|
|
32
34
|
Parameters:
|
|
33
35
|
obj: The PatientFinding instance for which to retrieve the localized finding name.
|
|
34
|
-
|
|
36
|
+
|
|
35
37
|
Returns:
|
|
36
38
|
str: The localized name of the related finding.
|
|
37
39
|
"""
|
|
38
40
|
return self.get_localized_name(obj.finding)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|