endoreg-db 0.8.8.0__py3-none-any.whl → 0.8.9.2__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/data/__init__.py +22 -8
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +0 -1
- endoreg_db/data/examination/examinations/data.yaml +114 -14
- endoreg_db/data/examination/time-type/data.yaml +0 -3
- endoreg_db/data/examination_indication/endoscopy.yaml +108 -173
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +0 -70
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +33 -37
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/{colonoscopy_bowel_preparation.yaml → 02_colonoscopy_baseline.yaml} +35 -20
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/{yes_no_na.yaml → 00_generic.yaml} +5 -1
- endoreg_db/data/finding_classification_choice/{examination_setting_generic_types.yaml → 00_generic_baseline.yaml} +10 -2
- endoreg_db/data/finding_classification_choice/{complication_generic_types.yaml → 00_generic_complication.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology.yaml → 00_generic_histology.yaml} +1 -4
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/{bowel_preparation.yaml → 02_colonoscopy_bowel_preparation.yaml} +1 -30
- endoreg_db/data/{_examples/finding_classification_choice/colonoscopy_not_complete_reason.yaml → finding_classification_choice/02_colonoscopy_generic.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
- endoreg_db/data/{_examples/finding_classification_choice/colonoscopy_location.yaml → finding_classification_choice/02_colonoscopy_location.yaml} +23 -4
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/{_examples/finding_classification_choice/colon_lesion_paris.yaml → finding_classification_choice/02_colonoscopy_polyp_morphology.yaml} +26 -8
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/{colonoscopy_basic.yaml → 00_generic.yaml} +18 -13
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_type/data.yaml +8 -12
- endoreg_db/data/requirement/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +0 -2
- endoreg_db/data/requirement_set/90_coloreg.yaml +20 -8
- endoreg_db/exceptions.py +0 -1
- endoreg_db/forms/examination_form.py +1 -1
- endoreg_db/helpers/data_loader.py +124 -52
- endoreg_db/helpers/default_objects.py +116 -81
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +81 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +43 -0
- endoreg_db/import_files/context/validate_directories.py +56 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +76 -0
- endoreg_db/import_files/file_storage/create_video_file.py +75 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +39 -0
- endoreg_db/import_files/file_storage/state_management.py +496 -0
- endoreg_db/import_files/file_storage/storage.py +36 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +94 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +182 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +128 -0
- endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
- endoreg_db/import_files/report_import_service.py +141 -0
- endoreg_db/import_files/video_import_service.py +150 -0
- endoreg_db/management/commands/import_report.py +130 -65
- endoreg_db/management/commands/import_video_with_classification.py +1 -1
- endoreg_db/management/commands/load_ai_model_data.py +5 -5
- endoreg_db/management/commands/load_ai_model_label_data.py +9 -7
- endoreg_db/management/commands/load_base_db_data.py +5 -134
- endoreg_db/management/commands/load_contraindication_data.py +14 -16
- endoreg_db/management/commands/load_disease_classification_choices_data.py +15 -18
- endoreg_db/management/commands/load_disease_classification_data.py +15 -18
- endoreg_db/management/commands/load_disease_data.py +25 -28
- endoreg_db/management/commands/load_endoscope_data.py +20 -27
- endoreg_db/management/commands/load_event_data.py +14 -16
- endoreg_db/management/commands/load_examination_data.py +31 -44
- endoreg_db/management/commands/load_examination_indication_data.py +20 -21
- endoreg_db/management/commands/load_finding_data.py +52 -80
- endoreg_db/management/commands/load_information_source.py +21 -23
- endoreg_db/management/commands/load_lab_value_data.py +17 -26
- endoreg_db/management/commands/load_medication_data.py +13 -12
- endoreg_db/management/commands/load_organ_data.py +15 -19
- endoreg_db/management/commands/load_pdf_type_data.py +19 -18
- endoreg_db/management/commands/load_profession_data.py +14 -17
- endoreg_db/management/commands/load_qualification_data.py +20 -23
- endoreg_db/management/commands/load_report_reader_flag_data.py +17 -19
- endoreg_db/management/commands/load_requirement_data.py +14 -20
- endoreg_db/management/commands/load_risk_data.py +7 -6
- endoreg_db/management/commands/load_shift_data.py +20 -23
- endoreg_db/management/commands/load_tag_data.py +8 -11
- endoreg_db/management/commands/load_unit_data.py +17 -19
- endoreg_db/management/commands/start_filewatcher.py +46 -37
- endoreg_db/management/commands/validate_video_files.py +1 -5
- endoreg_db/migrations/0001_initial.py +1360 -1812
- endoreg_db/models/administration/person/patient/patient.py +72 -46
- endoreg_db/models/label/__init__.py +2 -2
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +18 -26
- endoreg_db/models/label/label_video_segment/label_video_segment.py +23 -1
- endoreg_db/models/media/pdf/raw_pdf.py +136 -64
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +34 -10
- endoreg_db/models/media/processing_history/__init__.py +5 -0
- endoreg_db/models/media/processing_history/processing_history.py +96 -0
- endoreg_db/models/media/video/create_from_file.py +101 -31
- endoreg_db/models/media/video/video_file.py +125 -105
- endoreg_db/models/media/video/video_file_io.py +31 -26
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/examination/examination.py +28 -8
- endoreg_db/models/medical/examination/examination_indication.py +13 -79
- endoreg_db/models/medical/examination/examination_time.py +8 -3
- endoreg_db/models/medical/finding/finding.py +5 -12
- endoreg_db/models/medical/finding/finding_classification.py +18 -37
- endoreg_db/models/medical/finding/finding_intervention.py +7 -9
- endoreg_db/models/medical/hardware/endoscope.py +6 -0
- endoreg_db/models/medical/patient/medication_examples.py +5 -1
- endoreg_db/models/medical/patient/patient_finding.py +1 -1
- endoreg_db/models/metadata/pdf_meta.py +22 -10
- endoreg_db/models/metadata/sensitive_meta.py +3 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +200 -124
- endoreg_db/models/other/information_source.py +27 -6
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +6 -0
- endoreg_db/models/requirement/requirement.py +59 -399
- endoreg_db/models/requirement/requirement_operator.py +86 -98
- endoreg_db/models/state/audit_ledger.py +4 -5
- endoreg_db/models/state/raw_pdf.py +69 -30
- endoreg_db/models/state/video.py +65 -49
- endoreg_db/models/upload_job.py +33 -9
- endoreg_db/models/utils.py +27 -23
- endoreg_db/queries/__init__.py +3 -1
- endoreg_db/schemas/examination_evaluation.py +1 -1
- endoreg_db/serializers/__init__.py +2 -8
- endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
- endoreg_db/serializers/meta/__init__.py +1 -6
- endoreg_db/serializers/misc/sensitive_patient_data.py +50 -26
- endoreg_db/serializers/patient_examination/patient_examination.py +3 -3
- endoreg_db/serializers/pdf/anony_text_validation.py +39 -23
- endoreg_db/serializers/video/video_file_list.py +65 -34
- endoreg_db/services/__old/pdf_import.py +1487 -0
- endoreg_db/services/__old/video_import.py +1306 -0
- endoreg_db/services/anonymization.py +63 -26
- endoreg_db/services/lookup_service.py +28 -28
- endoreg_db/services/lookup_store.py +2 -2
- endoreg_db/services/pdf_import.py +0 -1480
- endoreg_db/services/report_import.py +10 -0
- endoreg_db/services/video_import.py +6 -1165
- endoreg_db/tasks/upload_tasks.py +79 -70
- endoreg_db/tasks/video_ingest.py +8 -4
- endoreg_db/urls/__init__.py +0 -14
- endoreg_db/urls/ai.py +32 -0
- endoreg_db/urls/media.py +21 -24
- endoreg_db/utils/dataloader.py +87 -57
- endoreg_db/utils/paths.py +110 -46
- endoreg_db/utils/pipelines/Readme.md +1 -1
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +217 -52
- endoreg_db/views/__init__.py +85 -173
- endoreg_db/views/ai/__init__.py +8 -0
- endoreg_db/views/ai/label.py +155 -0
- endoreg_db/views/anonymization/media_management.py +8 -7
- endoreg_db/views/anonymization/overview.py +97 -68
- endoreg_db/views/anonymization/validate.py +25 -21
- endoreg_db/views/media/__init__.py +5 -20
- endoreg_db/views/media/pdf_media.py +109 -65
- endoreg_db/views/media/sensitive_metadata.py +163 -148
- endoreg_db/views/meta/__init__.py +0 -8
- endoreg_db/views/misc/__init__.py +1 -7
- endoreg_db/views/misc/upload_views.py +94 -93
- endoreg_db/views/report/__init__.py +7 -0
- endoreg_db/views/{pdf → report}/reimport.py +45 -24
- endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +40 -32
- endoreg_db/views/requirement/lookup_store.py +22 -90
- endoreg_db/views/video/__init__.py +23 -22
- endoreg_db/views/video/correction.py +201 -172
- endoreg_db/views/video/reimport.py +1 -1
- endoreg_db/views/{media/video_segments.py → video/segments_crud.py} +75 -37
- endoreg_db/views/video/{video_meta.py → video_meta_stats.py} +2 -2
- endoreg_db/views/video/video_stream.py +7 -8
- {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/METADATA +2 -2
- {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/RECORD +217 -335
- {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/WHEEL +1 -1
- endoreg_db/data/_examples/disease.yaml +0 -55
- endoreg_db/data/_examples/disease_classification.yaml +0 -13
- endoreg_db/data/_examples/disease_classification_choice.yaml +0 -62
- endoreg_db/data/_examples/event.yaml +0 -64
- endoreg_db/data/_examples/examination.yaml +0 -72
- endoreg_db/data/_examples/finding/anatomy_colon.yaml +0 -128
- endoreg_db/data/_examples/finding/colonoscopy.yaml +0 -40
- endoreg_db/data/_examples/finding/colonoscopy_bowel_prep.yaml +0 -56
- endoreg_db/data/_examples/finding/complication.yaml +0 -16
- endoreg_db/data/_examples/finding/data.yaml +0 -105
- endoreg_db/data/_examples/finding/examination_setting.yaml +0 -16
- endoreg_db/data/_examples/finding/medication_related.yaml +0 -18
- endoreg_db/data/_examples/finding/outcome.yaml +0 -12
- endoreg_db/data/_examples/finding_classification/colonoscopy_bowel_preparation.yaml +0 -68
- endoreg_db/data/_examples/finding_classification/colonoscopy_jnet.yaml +0 -22
- endoreg_db/data/_examples/finding_classification/colonoscopy_kudo.yaml +0 -25
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_size.yaml +0 -68
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
- endoreg_db/data/_examples/finding_classification/colonoscopy_location.yaml +0 -80
- endoreg_db/data/_examples/finding_classification/colonoscopy_lst.yaml +0 -21
- endoreg_db/data/_examples/finding_classification/colonoscopy_nice.yaml +0 -20
- endoreg_db/data/_examples/finding_classification/colonoscopy_paris.yaml +0 -26
- endoreg_db/data/_examples/finding_classification/colonoscopy_sano.yaml +0 -22
- endoreg_db/data/_examples/finding_classification/colonoscopy_summary.yaml +0 -53
- endoreg_db/data/_examples/finding_classification/complication_generic.yaml +0 -25
- endoreg_db/data/_examples/finding_classification/examination_setting_generic.yaml +0 -40
- endoreg_db/data/_examples/finding_classification/histology_colo.yaml +0 -51
- endoreg_db/data/_examples/finding_classification/intervention_required.yaml +0 -26
- endoreg_db/data/_examples/finding_classification/medication_related.yaml +0 -23
- endoreg_db/data/_examples/finding_classification/visualized.yaml +0 -33
- endoreg_db/data/_examples/finding_classification_choice/bowel_preparation.yaml +0 -78
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_lst.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_nice.yaml +0 -17
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_sano.yaml +0 -14
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_size.yaml +0 -82
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/complication_generic_types.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/examination_setting_generic_types.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/histology.yaml +0 -24
- endoreg_db/data/_examples/finding_classification_choice/histology_polyp.yaml +0 -20
- endoreg_db/data/_examples/finding_classification_choice/outcome.yaml +0 -19
- endoreg_db/data/_examples/finding_classification_choice/yes_no_na.yaml +0 -11
- endoreg_db/data/_examples/finding_classification_type/colonoscopy_basic.yaml +0 -48
- endoreg_db/data/_examples/finding_intervention/endoscopy.yaml +0 -43
- endoreg_db/data/_examples/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
- endoreg_db/data/_examples/finding_intervention/endoscopy_egd.yaml +0 -128
- endoreg_db/data/_examples/finding_intervention/endoscopy_ercp.yaml +0 -32
- endoreg_db/data/_examples/finding_intervention/endoscopy_eus_lower.yaml +0 -9
- endoreg_db/data/_examples/finding_intervention/endoscopy_eus_upper.yaml +0 -36
- endoreg_db/data/_examples/finding_intervention_type/endoscopy.yaml +0 -15
- endoreg_db/data/_examples/finding_type/data.yaml +0 -43
- endoreg_db/data/_examples/requirement/age.yaml +0 -26
- endoreg_db/data/_examples/requirement/gender.yaml +0 -25
- endoreg_db/data/_examples/requirement_set/01_endoscopy_generic.yaml +0 -48
- endoreg_db/data/_examples/requirement_set/colonoscopy_austria_screening.yaml +0 -57
- endoreg_db/data/_examples/requirement_set/endoscopy_bleeding_risk.yaml +0 -52
- endoreg_db/data/_examples/yaml_examples.xlsx +0 -0
- endoreg_db/data/finding/anatomy_colon.yaml +0 -128
- endoreg_db/data/finding/colonoscopy.yaml +0 -40
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +0 -56
- endoreg_db/data/finding/complication.yaml +0 -16
- endoreg_db/data/finding/data.yaml +0 -105
- endoreg_db/data/finding/examination_setting.yaml +0 -16
- endoreg_db/data/finding/medication_related.yaml +0 -18
- endoreg_db/data/finding/outcome.yaml +0 -12
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +0 -22
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +0 -25
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +0 -38
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -49
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +0 -21
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +0 -26
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +0 -22
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +0 -53
- endoreg_db/data/finding_classification/complication_generic.yaml +0 -25
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +0 -40
- endoreg_db/data/finding_classification/histology_colo.yaml +0 -43
- endoreg_db/data/finding_classification/intervention_required.yaml +0 -26
- endoreg_db/data/finding_classification/medication_related.yaml +0 -23
- endoreg_db/data/finding_classification/visualized.yaml +0 -33
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +0 -15
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +0 -17
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +0 -57
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +0 -14
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +0 -229
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +0 -19
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +0 -82
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
- endoreg_db/data/finding_classification_choice/outcome.yaml +0 -19
- endoreg_db/data/finding_intervention/endoscopy.yaml +0 -43
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +0 -128
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +0 -32
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +0 -9
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +0 -36
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +0 -79
- endoreg_db/data/requirement/age.yaml +0 -26
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +0 -45
- endoreg_db/data/requirement/disease_cardiovascular.yaml +0 -79
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +0 -41
- endoreg_db/data/requirement/disease_hepatology.yaml +0 -12
- endoreg_db/data/requirement/disease_misc.yaml +0 -12
- endoreg_db/data/requirement/disease_renal.yaml +0 -96
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +0 -59
- endoreg_db/data/requirement/event_cardiology.yaml +0 -251
- endoreg_db/data/requirement/event_requirements.yaml +0 -145
- endoreg_db/data/requirement/finding_colon_polyp.yaml +0 -50
- endoreg_db/data/requirement/gender.yaml +0 -25
- endoreg_db/data/requirement/lab_value.yaml +0 -441
- endoreg_db/data/requirement/medication.yaml +0 -93
- endoreg_db/data/requirement_operator/age.yaml +0 -13
- endoreg_db/data/requirement_operator/lab_operators.yaml +0 -129
- endoreg_db/data/requirement_operator/model_operators.yaml +0 -96
- endoreg_db/management/commands/init_default_ai_model.py +0 -112
- endoreg_db/management/commands/reset_celery_schedule.py +0 -9
- endoreg_db/management/commands/validate_video.py +0 -204
- endoreg_db/migrations/0002_requirementset_depends_on.py +0 -18
- endoreg_db/migrations/_old/0001_initial.py +0 -1857
- endoreg_db/migrations/_old/0002_add_video_correction_models.py +0 -52
- endoreg_db/migrations/_old/0003_add_center_display_name.py +0 -30
- endoreg_db/migrations/_old/0004_employee_city_employee_post_code_employee_street_and_more.py +0 -68
- endoreg_db/migrations/_old/0004_remove_casetemplate_rules_and_more.py +0 -77
- endoreg_db/migrations/_old/0005_merge_20251111_1003.py +0 -14
- endoreg_db/migrations/_old/0006_sensitivemeta_anonymized_text_and_more.py +0 -68
- endoreg_db/migrations/_old/0007_remove_rule_attribute_dtype_remove_rule_rule_type_and_more.py +0 -89
- endoreg_db/migrations/_old/0008_remove_event_event_classification_and_more.py +0 -27
- endoreg_db/migrations/_old/0009_alter_modelmeta_options_and_more.py +0 -21
- endoreg_db/renames.yml +0 -8
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +0 -223
- endoreg_db/serializers/_old/raw_video_meta_validation.py +0 -179
- endoreg_db/serializers/_old/video.py +0 -71
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +0 -115
- endoreg_db/serializers/meta/report_meta.py +0 -53
- endoreg_db/serializers/report/__init__.py +0 -9
- endoreg_db/serializers/report/mixins.py +0 -45
- endoreg_db/serializers/report/report.py +0 -105
- endoreg_db/serializers/report/report_list.py +0 -22
- endoreg_db/serializers/report/secure_file_url.py +0 -26
- endoreg_db/services/requirements_object.py +0 -147
- endoreg_db/services/storage_aware_video_processor.py +0 -370
- endoreg_db/urls/files.py +0 -6
- endoreg_db/urls/label_video_segment_validate.py +0 -33
- endoreg_db/urls/label_video_segments.py +0 -46
- endoreg_db/views/label/__init__.py +0 -5
- endoreg_db/views/label/label.py +0 -15
- endoreg_db/views/label_video_segment/__init__.py +0 -16
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +0 -44
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +0 -50
- endoreg_db/views/label_video_segment/label_video_segment.py +0 -77
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +0 -174
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +0 -73
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +0 -46
- endoreg_db/views/label_video_segment/validate.py +0 -226
- endoreg_db/views/media/segments.py +0 -71
- endoreg_db/views/meta/available_files_list.py +0 -146
- endoreg_db/views/meta/report_meta.py +0 -53
- endoreg_db/views/meta/sensitive_meta_detail.py +0 -85
- endoreg_db/views/misc/secure_file_serving_view.py +0 -80
- endoreg_db/views/misc/secure_file_url_view.py +0 -84
- endoreg_db/views/misc/secure_url_validate.py +0 -79
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +0 -164
- endoreg_db/views/patient_finding_location/__init__.py +0 -5
- endoreg_db/views/patient_finding_location/pfl_create.py +0 -70
- endoreg_db/views/patient_finding_morphology/__init__.py +0 -5
- endoreg_db/views/patient_finding_morphology/pfm_create.py +0 -70
- endoreg_db/views/pdf/__init__.py +0 -8
- endoreg_db/views/video/segmentation.py +0 -274
- endoreg_db/views/video/task_status.py +0 -49
- endoreg_db/views/video/timeline.py +0 -46
- endoreg_db/views/video/video_analyze.py +0 -52
- /endoreg_db/data/requirement/{colon_polyp_intervention.yaml → old/colon_polyp_intervention.yaml} +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/colonoscopy_baseline_austria.yaml +0 -0
- /endoreg_db/data/requirement/{coloreg_colon_polyp.yaml → old/coloreg_colon_polyp.yaml} +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_cardiovascular.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_classification_choice_cardiovascular.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_hepatology.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_misc.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_renal.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/endoscopy_bleeding_risk.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/event_cardiology.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/event_requirements.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/finding_colon_polyp.yaml +0 -0
- /endoreg_db/{urls/sensitive_meta.py → data/requirement/old/gender.yaml} +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/lab_value.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/medication.yaml +0 -0
- /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/age.yaml +0 -0
- /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/lab_operators.yaml +0 -0
- /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/model_operators.yaml +0 -0
- /endoreg_db/{views/pdf/pdf_stream_views.py → import_files/pseudonymization/__init__.py} +0 -0
- /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
- /endoreg_db/utils/requirement_operator_logic/{model_evaluators.py → _old/model_evaluators.py} +0 -0
- {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,21 +1,28 @@
|
|
|
1
1
|
# endoreg_db/api/views/anonymization_overview.py
|
|
2
2
|
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from django.http import JsonResponse
|
|
3
6
|
from rest_framework import status
|
|
4
7
|
from rest_framework.decorators import api_view, permission_classes
|
|
5
|
-
from rest_framework.response import Response
|
|
6
|
-
from endoreg_db.utils.permissions import DEBUG_PERMISSIONS
|
|
7
|
-
from endoreg_db.services.anonymization import AnonymizationService
|
|
8
|
-
from endoreg_db.services.polling_coordinator import PollingCoordinator, ProcessingLockContext
|
|
9
8
|
from rest_framework.generics import ListAPIView
|
|
10
9
|
from rest_framework.pagination import PageNumberPagination
|
|
11
|
-
from
|
|
10
|
+
from rest_framework.response import Response
|
|
11
|
+
|
|
12
|
+
from endoreg_db.authz.permissions import PolicyPermission # import RBAC
|
|
13
|
+
from endoreg_db.models import RawPdfFile, VideoFile
|
|
14
|
+
from endoreg_db.services.anonymization import AnonymizationService
|
|
15
|
+
from endoreg_db.services.polling_coordinator import (
|
|
16
|
+
PollingCoordinator,
|
|
17
|
+
ProcessingLockContext,
|
|
18
|
+
)
|
|
19
|
+
from endoreg_db.utils.permissions import DEBUG_PERMISSIONS
|
|
20
|
+
|
|
12
21
|
from ...serializers import FileOverviewSerializer, VoPPatientDataSerializer
|
|
13
|
-
from django.http import JsonResponse
|
|
14
22
|
|
|
15
|
-
from endoreg_db.authz.permissions import PolicyPermission # import RBAC
|
|
16
|
-
import logging
|
|
17
23
|
logger = logging.getLogger(__name__)
|
|
18
|
-
PERMS = DEBUG_PERMISSIONS
|
|
24
|
+
PERMS = DEBUG_PERMISSIONS # shorten
|
|
25
|
+
|
|
19
26
|
|
|
20
27
|
# ---------- overview ----------------------------------------------------
|
|
21
28
|
class NoPagination(PageNumberPagination):
|
|
@@ -26,10 +33,11 @@ class AnonymizationOverviewView(ListAPIView):
|
|
|
26
33
|
"""
|
|
27
34
|
GET /api/anonymization/items/overview/
|
|
28
35
|
--------------------------------------
|
|
29
|
-
Returns a flat list (Video +
|
|
36
|
+
Returns a flat list (Video + report) ordered by newest upload first.
|
|
30
37
|
"""
|
|
38
|
+
|
|
31
39
|
serializer_class = FileOverviewSerializer
|
|
32
|
-
#permission_classes = DEBUG_PERMISSIONS
|
|
40
|
+
# permission_classes = DEBUG_PERMISSIONS
|
|
33
41
|
permission_classes = [PolicyPermission]
|
|
34
42
|
pagination_class = NoPagination
|
|
35
43
|
|
|
@@ -39,23 +47,25 @@ class AnonymizationOverviewView(ListAPIView):
|
|
|
39
47
|
"""
|
|
40
48
|
# 1) VideoFile queryset - only fields that exist on VideoFile
|
|
41
49
|
qs_video = (
|
|
42
|
-
VideoFile.objects
|
|
43
|
-
.select_related("state", "sensitive_meta")
|
|
50
|
+
VideoFile.objects.select_related("state", "sensitive_meta")
|
|
44
51
|
.prefetch_related("label_video_segments__state")
|
|
45
|
-
.only(
|
|
52
|
+
.only(
|
|
53
|
+
"id",
|
|
54
|
+
"original_file_name",
|
|
55
|
+
"raw_file",
|
|
56
|
+
"uploaded_at",
|
|
57
|
+
"state",
|
|
58
|
+
"sensitive_meta",
|
|
59
|
+
)
|
|
46
60
|
)
|
|
47
61
|
# 2) RawPdfFile queryset - only fields that exist on RawPdfFile
|
|
48
|
-
qs_pdf = (
|
|
49
|
-
|
|
50
|
-
.select_related("sensitive_meta")
|
|
51
|
-
.only("id", "file", "date_created",
|
|
52
|
-
"text", "anonymized_text",
|
|
53
|
-
"sensitive_meta")
|
|
54
|
-
|
|
62
|
+
qs_pdf = RawPdfFile.objects.select_related("sensitive_meta").only(
|
|
63
|
+
"id", "file", "date_created", "text", "anonymized_text", "sensitive_meta"
|
|
55
64
|
)
|
|
56
65
|
|
|
57
66
|
return list(qs_video) + list(qs_pdf)
|
|
58
|
-
|
|
67
|
+
|
|
68
|
+
|
|
59
69
|
# ---------- status with polling protection ------------------------------
|
|
60
70
|
@api_view(["GET"])
|
|
61
71
|
@permission_classes(PERMS)
|
|
@@ -72,12 +82,14 @@ def anonymization_status(request, file_id: int):
|
|
|
72
82
|
|
|
73
83
|
# Wende Rate-Limiting auf den echten Typ an (nicht auf einen evtl. falschen request-Parameter)
|
|
74
84
|
if not PollingCoordinator.can_check_status(file_id, file_type):
|
|
75
|
-
remaining_seconds = PollingCoordinator.get_remaining_cooldown_seconds(
|
|
85
|
+
remaining_seconds = PollingCoordinator.get_remaining_cooldown_seconds(
|
|
86
|
+
file_id, file_type
|
|
87
|
+
)
|
|
76
88
|
response_data = {
|
|
77
89
|
"detail": "Status check rate limited. Please wait before checking again.",
|
|
78
90
|
"file_id": file_id,
|
|
79
91
|
"cooldown_active": True,
|
|
80
|
-
"retry_after": remaining_seconds
|
|
92
|
+
"retry_after": remaining_seconds,
|
|
81
93
|
}
|
|
82
94
|
response = Response(response_data, status=status.HTTP_429_TOO_MANY_REQUESTS)
|
|
83
95
|
response["Retry-After"] = str(remaining_seconds)
|
|
@@ -86,15 +98,22 @@ def anonymization_status(request, file_id: int):
|
|
|
86
98
|
status_val = info.get("anonymizationStatus") or info.get("status") or "not_started"
|
|
87
99
|
|
|
88
100
|
# processing_locked als Ableitung des Status interpretieren
|
|
89
|
-
processing_statuses = {
|
|
101
|
+
processing_statuses = {
|
|
102
|
+
"processing_anonymization",
|
|
103
|
+
"extracting_frames",
|
|
104
|
+
"predicting_segments",
|
|
105
|
+
}
|
|
90
106
|
processing_locked_derived = status_val in processing_statuses
|
|
91
107
|
|
|
92
|
-
return Response(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
108
|
+
return Response(
|
|
109
|
+
{
|
|
110
|
+
"file_id": file_id,
|
|
111
|
+
"file_type": file_type,
|
|
112
|
+
"anonymizationStatus": status_val,
|
|
113
|
+
"processing_locked": processing_locked_derived,
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
|
|
98
117
|
|
|
99
118
|
# ---------- start with processing lock ----------------------------------
|
|
100
119
|
@api_view(["POST"])
|
|
@@ -107,9 +126,9 @@ def start_anonymization(request, file_id: int):
|
|
|
107
126
|
info = AnonymizationService.get_status(file_id)
|
|
108
127
|
if not info:
|
|
109
128
|
return Response({"detail": "File not found"}, status=status.HTTP_404_NOT_FOUND)
|
|
110
|
-
|
|
129
|
+
|
|
111
130
|
file_type = info["mediaType"]
|
|
112
|
-
|
|
131
|
+
|
|
113
132
|
# Use processing lock context to prevent duplicate processing
|
|
114
133
|
with ProcessingLockContext(file_id, file_type) as lock:
|
|
115
134
|
if not lock.acquired:
|
|
@@ -118,27 +137,32 @@ def start_anonymization(request, file_id: int):
|
|
|
118
137
|
"detail": "File is already being processed by another request",
|
|
119
138
|
"file_id": file_id,
|
|
120
139
|
"file_type": file_type,
|
|
121
|
-
"processing_locked": True
|
|
122
|
-
},
|
|
123
|
-
status=status.HTTP_409_CONFLICT
|
|
140
|
+
"processing_locked": True,
|
|
141
|
+
},
|
|
142
|
+
status=status.HTTP_409_CONFLICT,
|
|
124
143
|
)
|
|
125
|
-
|
|
144
|
+
|
|
126
145
|
# Proceed with starting anonymization
|
|
127
146
|
service = AnonymizationService()
|
|
128
147
|
kind = service.start(file_id)
|
|
129
148
|
if not kind:
|
|
130
|
-
return Response(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
149
|
+
return Response(
|
|
150
|
+
{"detail": "Failed to start anonymization"},
|
|
151
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
return Response(
|
|
155
|
+
{
|
|
156
|
+
"detail": f"Anonymization started for {kind} file",
|
|
157
|
+
"file_id": file_id,
|
|
158
|
+
"file_type": kind,
|
|
159
|
+
"processing_locked": True,
|
|
160
|
+
}
|
|
161
|
+
)
|
|
138
162
|
|
|
139
163
|
|
|
140
164
|
# ---------- current with coordination ------------------------------------
|
|
141
|
-
@api_view([
|
|
165
|
+
@api_view(["GET", "POST", "PUT"])
|
|
142
166
|
@permission_classes(DEBUG_PERMISSIONS)
|
|
143
167
|
def anonymization_current(request, file_id):
|
|
144
168
|
"""
|
|
@@ -146,15 +170,15 @@ def anonymization_current(request, file_id):
|
|
|
146
170
|
"""
|
|
147
171
|
# Try to find the file in VideoFile first
|
|
148
172
|
try:
|
|
149
|
-
video_file = VideoFile.objects.select_related(
|
|
150
|
-
serializer = VoPPatientDataSerializer(video_file, context={
|
|
173
|
+
video_file = VideoFile.objects.select_related("sensitive_meta").get(id=file_id)
|
|
174
|
+
serializer = VoPPatientDataSerializer(video_file, context={"request": request})
|
|
151
175
|
return Response(serializer.data)
|
|
152
176
|
except VideoFile.DoesNotExist:
|
|
153
177
|
pass
|
|
154
178
|
# Try to find the file in RawPdfFile
|
|
155
179
|
try:
|
|
156
|
-
pdf_file = RawPdfFile.objects.select_related(
|
|
157
|
-
serializer = VoPPatientDataSerializer(pdf_file, context={
|
|
180
|
+
pdf_file = RawPdfFile.objects.select_related("sensitive_meta").get(id=file_id)
|
|
181
|
+
serializer = VoPPatientDataSerializer(pdf_file, context={"request": request})
|
|
158
182
|
return Response(serializer.data)
|
|
159
183
|
|
|
160
184
|
except RawPdfFile.DoesNotExist:
|
|
@@ -162,12 +186,13 @@ def anonymization_current(request, file_id):
|
|
|
162
186
|
|
|
163
187
|
except (ValueError, TypeError, AttributeError) as e:
|
|
164
188
|
logger.error(f"Error in set_current_for_validation: {e}")
|
|
165
|
-
return JsonResponse({
|
|
189
|
+
return JsonResponse({"status": "error", "message": str(e)}, status=500)
|
|
190
|
+
|
|
191
|
+
return JsonResponse({"status": "error", "message": "File not found"}, status=404)
|
|
166
192
|
|
|
167
|
-
return JsonResponse({'status': 'error', 'message': 'File not found'}, status=404)
|
|
168
193
|
|
|
169
194
|
# ---------- polling coordinator info ------------------------------------
|
|
170
|
-
@api_view([
|
|
195
|
+
@api_view(["GET"])
|
|
171
196
|
@permission_classes(DEBUG_PERMISSIONS)
|
|
172
197
|
def polling_coordinator_info(request):
|
|
173
198
|
"""
|
|
@@ -180,12 +205,13 @@ def polling_coordinator_info(request):
|
|
|
180
205
|
except Exception as e:
|
|
181
206
|
logger.error(f"Error getting polling coordinator info: {e}")
|
|
182
207
|
return Response(
|
|
183
|
-
{"error": "Failed to get coordinator info"},
|
|
184
|
-
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
208
|
+
{"error": "Failed to get coordinator info"},
|
|
209
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
185
210
|
)
|
|
186
211
|
|
|
212
|
+
|
|
187
213
|
# ---------- emergency lock management -----------------------------------
|
|
188
|
-
@api_view([
|
|
214
|
+
@api_view(["DELETE"])
|
|
189
215
|
@permission_classes(DEBUG_PERMISSIONS)
|
|
190
216
|
def clear_processing_locks(request):
|
|
191
217
|
"""
|
|
@@ -193,22 +219,25 @@ def clear_processing_locks(request):
|
|
|
193
219
|
Emergency endpoint to clear all processing locks
|
|
194
220
|
"""
|
|
195
221
|
try:
|
|
196
|
-
file_type = request.query_params.get(
|
|
222
|
+
file_type = request.query_params.get("type", None)
|
|
197
223
|
cleared_count = PollingCoordinator.clear_all_locks(file_type)
|
|
198
|
-
|
|
199
|
-
return Response(
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
224
|
+
|
|
225
|
+
return Response(
|
|
226
|
+
{
|
|
227
|
+
"detail": "Processing locks cleared",
|
|
228
|
+
"cleared_count": cleared_count,
|
|
229
|
+
"file_type_filter": file_type,
|
|
230
|
+
}
|
|
231
|
+
)
|
|
204
232
|
except Exception as e:
|
|
205
233
|
logger.error(f"Error clearing processing locks: {e}")
|
|
206
234
|
return Response(
|
|
207
|
-
{"error": "Failed to clear locks"},
|
|
208
|
-
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
235
|
+
{"error": "Failed to clear locks"},
|
|
236
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
209
237
|
)
|
|
210
|
-
|
|
211
|
-
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
@api_view(["GET"])
|
|
212
241
|
@permission_classes(DEBUG_PERMISSIONS)
|
|
213
242
|
def has_raw_video_file(request, file_id):
|
|
214
243
|
"""
|
|
@@ -216,4 +245,4 @@ def has_raw_video_file(request, file_id):
|
|
|
216
245
|
Check if a raw video file exists for the given file ID
|
|
217
246
|
"""
|
|
218
247
|
exists = VideoFile.objects.filter(id=file_id, raw_file__isnull=False).exists()
|
|
219
|
-
return Response({"file_id": file_id, "has_raw_file": exists})
|
|
248
|
+
return Response({"file_id": file_id, "has_raw_file": exists})
|
|
@@ -16,11 +16,11 @@ logger = logging.getLogger(__name__)
|
|
|
16
16
|
class AnonymizationValidateView(APIView):
|
|
17
17
|
"""
|
|
18
18
|
POST /api/anonymization/<int:file_id>/validate/
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
Validiert und aktualisiert SensitiveMeta-Felder für Videos oder PDFs.
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
DATA HERE IS COMING FROM THE ANONYIZATION VALIDATION COMPONENT
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
Body (Datumsfelder bevorzugt in deutschem Format DD.MM.YYYY; ISO YYYY-MM-DD ebenfalls akzeptiert):
|
|
25
25
|
{
|
|
26
26
|
"patient_first_name": "Max",
|
|
@@ -32,12 +32,12 @@ class AnonymizationValidateView(APIView):
|
|
|
32
32
|
"casenumber": "12345",
|
|
33
33
|
"anonymized_text": "...", // nur für PDFs; Videos ignorieren
|
|
34
34
|
"is_verified": true // optional; default true
|
|
35
|
-
"file_type": "video" // optional; "video" oder "pdf"; wenn nicht angegeben, wird zuerst Video, dann
|
|
35
|
+
"file_type": "video" // optional; "video" oder "pdf"; wenn nicht angegeben, wird zuerst Video, dann report versucht
|
|
36
36
|
"center_name": editedPatient.value.centerName || '',
|
|
37
37
|
"external_id": editedPatient.value.externalId || '',
|
|
38
|
-
"external_id_origin":editedPatient.value.externalIdOrigin || '',
|
|
38
|
+
"external_id_origin":editedPatient.value.externalIdOrigin || '',
|
|
39
39
|
}
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
Rückwärtskompatibilität: ISO-Format (YYYY-MM-DD) wird ebenfalls akzeptiert.
|
|
42
42
|
"""
|
|
43
43
|
|
|
@@ -56,10 +56,12 @@ class AnonymizationValidateView(APIView):
|
|
|
56
56
|
file_type = payload.get("file_type")
|
|
57
57
|
|
|
58
58
|
with transaction.atomic():
|
|
59
|
-
# Try Video first (unless explicitly requesting
|
|
59
|
+
# Try Video first (unless explicitly requesting report)
|
|
60
60
|
if file_type in (None, "video"):
|
|
61
61
|
video = (
|
|
62
|
-
VideoFile.objects.select_related(
|
|
62
|
+
VideoFile.objects.select_related(
|
|
63
|
+
"center", "sensitive_meta", "state"
|
|
64
|
+
)
|
|
63
65
|
.filter(pk=file_id)
|
|
64
66
|
.first()
|
|
65
67
|
)
|
|
@@ -96,14 +98,13 @@ class AnonymizationValidateView(APIView):
|
|
|
96
98
|
video.sensitive_meta.create_anonymized_record()
|
|
97
99
|
else:
|
|
98
100
|
return Response(
|
|
99
|
-
{
|
|
100
|
-
"message": "Video not validated, failed to create State."
|
|
101
|
-
},
|
|
101
|
+
{"message": "Video not validated, failed to create State."},
|
|
102
102
|
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
103
103
|
)
|
|
104
104
|
|
|
105
105
|
if video.state is not None:
|
|
106
|
-
video.state.
|
|
106
|
+
video.state.state.anonymization_status.mark_anonymized()
|
|
107
|
+
video.state.save(update_fields=["anonymized"])
|
|
107
108
|
video.sensitive_meta.state.save()
|
|
108
109
|
|
|
109
110
|
return Response(
|
|
@@ -117,10 +118,12 @@ class AnonymizationValidateView(APIView):
|
|
|
117
118
|
status=status.HTTP_404_NOT_FOUND,
|
|
118
119
|
)
|
|
119
120
|
|
|
120
|
-
# Then
|
|
121
|
+
# Then report (unless explicitly requesting Video)
|
|
121
122
|
if file_type in (None, "pdf"):
|
|
122
123
|
pdf = (
|
|
123
|
-
RawPdfFile.objects.select_related(
|
|
124
|
+
RawPdfFile.objects.select_related(
|
|
125
|
+
"center", "sensitive_meta", "state"
|
|
126
|
+
)
|
|
124
127
|
.filter(pk=file_id)
|
|
125
128
|
.first()
|
|
126
129
|
)
|
|
@@ -129,10 +132,10 @@ class AnonymizationValidateView(APIView):
|
|
|
129
132
|
try:
|
|
130
133
|
ok = pdf.validate_metadata_annotation(prepared_payload)
|
|
131
134
|
except Exception: # pragma: no cover - defensive safety net
|
|
132
|
-
logger.exception("
|
|
135
|
+
logger.exception("report validation crashed for id=%s", file_id)
|
|
133
136
|
return Response(
|
|
134
137
|
{
|
|
135
|
-
"error": "
|
|
138
|
+
"error": "report validation encountered an unexpected error."
|
|
136
139
|
},
|
|
137
140
|
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
138
141
|
)
|
|
@@ -146,7 +149,7 @@ class AnonymizationValidateView(APIView):
|
|
|
146
149
|
|
|
147
150
|
if not ok:
|
|
148
151
|
return Response(
|
|
149
|
-
{"error": "
|
|
152
|
+
{"error": "report validation failed."},
|
|
150
153
|
status=status.HTTP_400_BAD_REQUEST,
|
|
151
154
|
)
|
|
152
155
|
else:
|
|
@@ -166,24 +169,25 @@ class AnonymizationValidateView(APIView):
|
|
|
166
169
|
pdf.sensitive_meta.state.mark_dob_verified()
|
|
167
170
|
pdf.sensitive_meta.state.mark_names_verified()
|
|
168
171
|
pdf.sensitive_meta.create_anonymized_record()
|
|
169
|
-
pdf.state.
|
|
172
|
+
pdf.state.state.anonymization_status.mark_anonymized()
|
|
173
|
+
pdf.state.save(update_fields=["anonymized"])
|
|
170
174
|
pdf.sensitive_meta.state.save()
|
|
171
175
|
else:
|
|
172
176
|
return Response(
|
|
173
177
|
{
|
|
174
|
-
"message": "
|
|
178
|
+
"message": "report not validated, failed to create State."
|
|
175
179
|
},
|
|
176
180
|
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
177
181
|
)
|
|
178
182
|
|
|
179
183
|
return Response(
|
|
180
|
-
{"message": "
|
|
184
|
+
{"message": "report validated."},
|
|
181
185
|
status=status.HTTP_200_OK,
|
|
182
186
|
)
|
|
183
187
|
|
|
184
188
|
if file_type == "pdf":
|
|
185
189
|
return Response(
|
|
186
|
-
{"error": f"
|
|
190
|
+
{"error": f"report {file_id} not found."},
|
|
187
191
|
status=status.HTTP_404_NOT_FOUND,
|
|
188
192
|
)
|
|
189
193
|
|
|
@@ -3,17 +3,9 @@
|
|
|
3
3
|
from .video_media import VideoMediaView
|
|
4
4
|
from .pdf_media import PdfMediaView
|
|
5
5
|
from ..video.reimport import VideoReimportView
|
|
6
|
-
from ..
|
|
7
|
-
from .
|
|
8
|
-
|
|
9
|
-
video_segments_collection,
|
|
10
|
-
video_segments_by_video,
|
|
11
|
-
video_segment_detail,
|
|
12
|
-
video_segments_stats,
|
|
13
|
-
video_segment_validate,
|
|
14
|
-
video_segments_validate_bulk,
|
|
15
|
-
video_segments_validation_status,
|
|
16
|
-
)
|
|
6
|
+
from ..report.reimport import ReportReimportView
|
|
7
|
+
from ..ai.label import label_list
|
|
8
|
+
|
|
17
9
|
from .sensitive_metadata import (
|
|
18
10
|
get_sensitive_metadata_pk,
|
|
19
11
|
video_sensitive_metadata,
|
|
@@ -28,20 +20,13 @@ __all__ = [
|
|
|
28
20
|
'VideoMediaView',
|
|
29
21
|
'PdfMediaView',
|
|
30
22
|
'VideoReimportView',
|
|
31
|
-
'
|
|
23
|
+
'ReportReimportView',
|
|
32
24
|
'get_sensitive_metadata_pk',
|
|
33
|
-
'video_segments_by_pk',
|
|
34
|
-
'video_segments_collection',
|
|
35
|
-
'video_segments_by_video',
|
|
36
|
-
'video_segment_detail',
|
|
37
|
-
'video_segments_stats',
|
|
38
|
-
'video_segment_validate',
|
|
39
|
-
'video_segments_validate_bulk',
|
|
40
|
-
'video_segments_validation_status',
|
|
41
25
|
'video_sensitive_metadata',
|
|
42
26
|
'video_sensitive_metadata_verify',
|
|
43
27
|
'pdf_sensitive_metadata',
|
|
44
28
|
'pdf_sensitive_metadata_verify',
|
|
45
29
|
'sensitive_metadata_list',
|
|
46
30
|
'pdf_sensitive_metadata_list',
|
|
31
|
+
'label_list',
|
|
47
32
|
]
|