endoreg-db 0.8.8.0__py3-none-any.whl → 0.8.8.9__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 +400 -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/processing/video_processing/video_cleanup_on_error.py +119 -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/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 +64 -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/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.8.9.dist-info}/METADATA +2 -2
- {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.8.9.dist-info}/RECORD +217 -335
- {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.8.9.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/{migrations/__init__.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/{urls/sensitive_meta.py → import_files/pseudonymization/__init__.py} +0 -0
- /endoreg_db/{views/pdf/pdf_stream_views.py → import_files/pseudonymization/pseudonymize.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.8.9.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""
|
|
2
|
-
|
|
2
|
+
report Media Management View (Phase 1.2)
|
|
3
3
|
|
|
4
|
-
Provides standardized REST API for
|
|
4
|
+
Provides standardized REST API for report files including listing, detail retrieval,
|
|
5
5
|
and streaming for the media management system.
|
|
6
6
|
|
|
7
7
|
This is separate from the existing pdf.PDFMediaView which handles legacy workflows.
|
|
@@ -27,14 +27,14 @@ logger = logging.getLogger(__name__)
|
|
|
27
27
|
|
|
28
28
|
class PdfMediaView(APIView):
|
|
29
29
|
"""
|
|
30
|
-
|
|
30
|
+
report Media Management API for CRUD operations on report files.
|
|
31
31
|
|
|
32
32
|
Endpoints:
|
|
33
33
|
- GET /api/media/pdfs/ - List all PDFs with filtering
|
|
34
|
-
- GET /api/media/pdfs/{id}/ - Get
|
|
35
|
-
- GET /api/media/pdfs/{id}/stream/ - Stream
|
|
36
|
-
- PATCH /api/media/pdfs/{id}/ - Update
|
|
37
|
-
- DELETE /api/media/pdfs/{id}/ - Delete
|
|
34
|
+
- GET /api/media/pdfs/{id}/ - Get report details
|
|
35
|
+
- GET /api/media/pdfs/{id}/stream/ - Stream report file (same as detail for PDFs)
|
|
36
|
+
- PATCH /api/media/pdfs/{id}/ - Update report metadata (future)
|
|
37
|
+
- DELETE /api/media/pdfs/{id}/ - Delete report (future)
|
|
38
38
|
|
|
39
39
|
Query Parameters:
|
|
40
40
|
- status: Filter by processing status (not_started, done, validated)
|
|
@@ -49,7 +49,7 @@ class PdfMediaView(APIView):
|
|
|
49
49
|
|
|
50
50
|
Phase 1.2 Implementation:
|
|
51
51
|
- List and detail views implemented
|
|
52
|
-
-
|
|
52
|
+
- report streaming functionality
|
|
53
53
|
- Filtering and search functionality
|
|
54
54
|
- Pagination support
|
|
55
55
|
- Error handling with proper HTTP status codes
|
|
@@ -59,17 +59,17 @@ class PdfMediaView(APIView):
|
|
|
59
59
|
|
|
60
60
|
def get(self, request, pk=None):
|
|
61
61
|
"""
|
|
62
|
-
Handle GET requests for
|
|
62
|
+
Handle GET requests for report listing, detail retrieval, or streaming.
|
|
63
63
|
|
|
64
64
|
Args:
|
|
65
65
|
request: HTTP request object
|
|
66
|
-
pk: Optional
|
|
66
|
+
pk: Optional report ID for detail view or streaming
|
|
67
67
|
|
|
68
68
|
Returns:
|
|
69
|
-
Response or FileResponse: JSON response with
|
|
69
|
+
Response or FileResponse: JSON response with report data or report file stream
|
|
70
70
|
|
|
71
71
|
Raises:
|
|
72
|
-
Http404: If specific
|
|
72
|
+
Http404: If specific report not found
|
|
73
73
|
"""
|
|
74
74
|
if pk is not None:
|
|
75
75
|
# Check if this is a streaming request
|
|
@@ -84,38 +84,46 @@ class PdfMediaView(APIView):
|
|
|
84
84
|
|
|
85
85
|
def _get_pdf_detail(self, pk):
|
|
86
86
|
"""
|
|
87
|
-
Get detailed information for a specific
|
|
87
|
+
Get detailed information for a specific report.
|
|
88
88
|
|
|
89
89
|
Args:
|
|
90
|
-
pk:
|
|
90
|
+
pk: report primary key
|
|
91
91
|
|
|
92
92
|
Returns:
|
|
93
|
-
Response: JSON response with
|
|
93
|
+
Response: JSON response with report details
|
|
94
94
|
|
|
95
95
|
Raises:
|
|
96
|
-
Http404: If
|
|
96
|
+
Http404: If report not found
|
|
97
97
|
"""
|
|
98
98
|
try:
|
|
99
99
|
# Validate pdf_id is numeric
|
|
100
100
|
try:
|
|
101
101
|
pdf_id_int = int(pk)
|
|
102
102
|
except (ValueError, TypeError):
|
|
103
|
-
raise Http404("Invalid
|
|
103
|
+
raise Http404("Invalid report ID format")
|
|
104
104
|
|
|
105
|
-
# Fetch
|
|
105
|
+
# Fetch report with related data
|
|
106
106
|
pdf = RawPdfFile.objects.select_related("sensitive_meta").get(pk=pdf_id_int)
|
|
107
107
|
|
|
108
|
-
# Build
|
|
108
|
+
# Build report details
|
|
109
109
|
pdf_data = {
|
|
110
110
|
"id": pdf.pk,
|
|
111
111
|
"filename": getattr(pdf.file, "name", "Unknown"),
|
|
112
112
|
"file_size": getattr(pdf.file, "size", 0),
|
|
113
113
|
"pdf_hash": pdf.pdf_hash,
|
|
114
|
-
"uploaded_at": pdf.date_created.isoformat()
|
|
114
|
+
"uploaded_at": pdf.date_created.isoformat()
|
|
115
|
+
if getattr(pdf, "date_created", None)
|
|
116
|
+
else None,
|
|
115
117
|
"anonymized_text": pdf.anonymized_text,
|
|
116
|
-
"has_anonymized_text": bool(
|
|
117
|
-
|
|
118
|
-
|
|
118
|
+
"has_anonymized_text": bool(
|
|
119
|
+
pdf.anonymized_text and pdf.anonymized_text.strip()
|
|
120
|
+
),
|
|
121
|
+
"is_validated": getattr(pdf.sensitive_meta, "is_verified", False)
|
|
122
|
+
if pdf.sensitive_meta
|
|
123
|
+
else False,
|
|
124
|
+
"stream_url": self.request.build_absolute_uri(
|
|
125
|
+
f"/api/media/pdfs/{pdf.pk}/stream/"
|
|
126
|
+
),
|
|
119
127
|
}
|
|
120
128
|
|
|
121
129
|
# Add patient metadata if available
|
|
@@ -124,62 +132,71 @@ class PdfMediaView(APIView):
|
|
|
124
132
|
{
|
|
125
133
|
"patient_first_name": pdf.sensitive_meta.patient_first_name,
|
|
126
134
|
"patient_last_name": pdf.sensitive_meta.patient_last_name,
|
|
127
|
-
"patient_dob": pdf.sensitive_meta.patient_dob.strftime(
|
|
128
|
-
|
|
135
|
+
"patient_dob": pdf.sensitive_meta.patient_dob.strftime(
|
|
136
|
+
"%d.%m.%Y"
|
|
137
|
+
)
|
|
138
|
+
if pdf.sensitive_meta.patient_dob
|
|
139
|
+
else None,
|
|
140
|
+
"examination_date": pdf.sensitive_meta.examination_date.strftime(
|
|
141
|
+
"%d.%m.%Y"
|
|
142
|
+
)
|
|
143
|
+
if pdf.sensitive_meta.examination_date
|
|
144
|
+
else None,
|
|
129
145
|
}
|
|
130
146
|
)
|
|
131
147
|
|
|
132
148
|
return Response(pdf_data)
|
|
133
149
|
|
|
134
150
|
except RawPdfFile.DoesNotExist:
|
|
135
|
-
raise Http404(f"
|
|
151
|
+
raise Http404(f"report with ID {pk} not found")
|
|
136
152
|
|
|
137
153
|
except Exception as e:
|
|
138
|
-
logger.error(
|
|
139
|
-
|
|
154
|
+
logger.error(
|
|
155
|
+
f"Unexpected error in report detail view for ID {pk}: {str(e)}"
|
|
156
|
+
)
|
|
157
|
+
return Response(
|
|
158
|
+
{"error": "Failed to retrieve report details"},
|
|
159
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
160
|
+
)
|
|
140
161
|
|
|
141
162
|
@xframe_options_exempt
|
|
142
163
|
def _stream_pdf(self, pk):
|
|
143
164
|
"""
|
|
144
|
-
Stream
|
|
165
|
+
Stream report file content for viewing/download.
|
|
145
166
|
|
|
146
167
|
Args:
|
|
147
|
-
pk:
|
|
168
|
+
pk: report primary key
|
|
148
169
|
|
|
149
170
|
Returns:
|
|
150
|
-
FileResponse:
|
|
171
|
+
FileResponse: report file stream
|
|
151
172
|
|
|
152
173
|
Raises:
|
|
153
|
-
Http404: If
|
|
174
|
+
Http404: If report not found or file cannot be accessed
|
|
154
175
|
"""
|
|
155
176
|
try:
|
|
156
177
|
# Validate pdf_id is numeric
|
|
157
178
|
try:
|
|
158
179
|
pdf_id_int = int(pk)
|
|
159
180
|
except (ValueError, TypeError):
|
|
160
|
-
raise Http404("Invalid
|
|
181
|
+
raise Http404("Invalid report ID format")
|
|
161
182
|
|
|
162
|
-
# Fetch
|
|
183
|
+
# Fetch report
|
|
163
184
|
pdf = RawPdfFile.objects.get(pk=pdf_id_int)
|
|
164
185
|
|
|
165
186
|
file_field = pdf.file
|
|
187
|
+
file_path = file_field.path
|
|
166
188
|
|
|
167
189
|
if not file_field or not file_field.name:
|
|
168
|
-
raise Http404("
|
|
190
|
+
raise Http404("report file not found")
|
|
169
191
|
if not file_exists(file_field):
|
|
170
|
-
raise Http404("
|
|
192
|
+
raise Http404("report file does not exist in storage")
|
|
171
193
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
response = FileResponse(
|
|
179
|
-
file_field,
|
|
180
|
-
content_type="application/pdf",
|
|
181
|
-
as_attachment=False,
|
|
182
|
-
)
|
|
194
|
+
with open(file_path, "rb") as file_handle:
|
|
195
|
+
response = FileResponse(
|
|
196
|
+
file_handle,
|
|
197
|
+
content_type="application/pdf",
|
|
198
|
+
as_attachment=False,
|
|
199
|
+
)
|
|
183
200
|
|
|
184
201
|
filename = Path(file_field.name).name
|
|
185
202
|
response["Content-Disposition"] = f'inline; filename="{filename}"'
|
|
@@ -191,11 +208,11 @@ class PdfMediaView(APIView):
|
|
|
191
208
|
return response
|
|
192
209
|
|
|
193
210
|
except RawPdfFile.DoesNotExist:
|
|
194
|
-
raise Http404(f"
|
|
211
|
+
raise Http404(f"report with ID {pk} not found")
|
|
195
212
|
|
|
196
213
|
except Exception as e:
|
|
197
|
-
logger.error(f"Unexpected error in
|
|
198
|
-
raise Http404("
|
|
214
|
+
logger.error(f"Unexpected error in report streaming for ID {pk}: {str(e)}")
|
|
215
|
+
raise Http404("report file cannot be streamed")
|
|
199
216
|
|
|
200
217
|
def _list_pdfs(self, request):
|
|
201
218
|
"""
|
|
@@ -205,7 +222,7 @@ class PdfMediaView(APIView):
|
|
|
205
222
|
request: HTTP request with query parameters
|
|
206
223
|
|
|
207
224
|
Returns:
|
|
208
|
-
Response: JSON response with paginated
|
|
225
|
+
Response: JSON response with paginated report list
|
|
209
226
|
"""
|
|
210
227
|
try:
|
|
211
228
|
# Start with all PDFs
|
|
@@ -240,9 +257,15 @@ class PdfMediaView(APIView):
|
|
|
240
257
|
"filename": getattr(pdf.file, "name", "Unknown"),
|
|
241
258
|
"file_size": self._safe_get_file_size(pdf.file),
|
|
242
259
|
"pdf_hash": pdf.pdf_hash,
|
|
243
|
-
"has_anonymized_text": bool(
|
|
244
|
-
|
|
245
|
-
|
|
260
|
+
"has_anonymized_text": bool(
|
|
261
|
+
pdf.anonymized_text and pdf.anonymized_text.strip()
|
|
262
|
+
),
|
|
263
|
+
"is_validated": getattr(pdf.sensitive_meta, "is_verified", False)
|
|
264
|
+
if pdf.sensitive_meta
|
|
265
|
+
else False,
|
|
266
|
+
"stream_url": request.build_absolute_uri(
|
|
267
|
+
f"/api/media/pdfs/{pdf.pk}/stream/"
|
|
268
|
+
),
|
|
246
269
|
}
|
|
247
270
|
|
|
248
271
|
# Determine status based on anonymization and validation
|
|
@@ -265,11 +288,17 @@ class PdfMediaView(APIView):
|
|
|
265
288
|
)
|
|
266
289
|
|
|
267
290
|
except ValueError as e:
|
|
268
|
-
return Response(
|
|
291
|
+
return Response(
|
|
292
|
+
{"error": f"Invalid query parameter: {str(e)}"},
|
|
293
|
+
status=status.HTTP_400_BAD_REQUEST,
|
|
294
|
+
)
|
|
269
295
|
|
|
270
296
|
except Exception as e:
|
|
271
|
-
logger.error(f"Unexpected error in
|
|
272
|
-
return Response(
|
|
297
|
+
logger.error(f"Unexpected error in report list view: {str(e)}")
|
|
298
|
+
return Response(
|
|
299
|
+
{"error": "Failed to retrieve report list"},
|
|
300
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
301
|
+
)
|
|
273
302
|
|
|
274
303
|
def _safe_get_file_size(self, file_field):
|
|
275
304
|
"""
|
|
@@ -292,7 +321,7 @@ class PdfMediaView(APIView):
|
|
|
292
321
|
|
|
293
322
|
def _apply_filters(self, queryset, query_params):
|
|
294
323
|
"""
|
|
295
|
-
Apply status and other filters to
|
|
324
|
+
Apply status and other filters to report queryset.
|
|
296
325
|
|
|
297
326
|
Args:
|
|
298
327
|
queryset: Base queryset to filter
|
|
@@ -306,15 +335,24 @@ class PdfMediaView(APIView):
|
|
|
306
335
|
if status_filter:
|
|
307
336
|
if status_filter == "not_started":
|
|
308
337
|
# PDFs without anonymized text
|
|
309
|
-
queryset = queryset.filter(
|
|
338
|
+
queryset = queryset.filter(
|
|
339
|
+
Q(anonymized_text__isnull=True) | Q(anonymized_text__exact="")
|
|
340
|
+
)
|
|
310
341
|
elif status_filter == "done":
|
|
311
342
|
# PDFs with anonymized text but not validated
|
|
312
343
|
queryset = queryset.filter(
|
|
313
|
-
~Q(anonymized_text__isnull=True),
|
|
344
|
+
~Q(anonymized_text__isnull=True),
|
|
345
|
+
~Q(anonymized_text__exact=""),
|
|
346
|
+
Q(sensitive_meta__is_verified=False)
|
|
347
|
+
| Q(sensitive_meta__isnull=True),
|
|
314
348
|
)
|
|
315
349
|
elif status_filter == "validated":
|
|
316
350
|
# PDFs with anonymized text and validated
|
|
317
|
-
queryset = queryset.filter(
|
|
351
|
+
queryset = queryset.filter(
|
|
352
|
+
~Q(anonymized_text__isnull=True),
|
|
353
|
+
~Q(anonymized_text__exact=""),
|
|
354
|
+
sensitive_meta__is_verified=True,
|
|
355
|
+
)
|
|
318
356
|
|
|
319
357
|
return queryset
|
|
320
358
|
|
|
@@ -348,20 +386,26 @@ class PdfMediaView(APIView):
|
|
|
348
386
|
# Future implementation placeholders
|
|
349
387
|
def patch(self, request, pk):
|
|
350
388
|
"""
|
|
351
|
-
Update
|
|
389
|
+
Update report metadata (Phase 1.2+ future enhancement).
|
|
352
390
|
|
|
353
391
|
Currently returns 501 Not Implemented.
|
|
354
392
|
"""
|
|
355
|
-
return Response(
|
|
393
|
+
return Response(
|
|
394
|
+
{"error": "report metadata updates not yet implemented"},
|
|
395
|
+
status=status.HTTP_501_NOT_IMPLEMENTED,
|
|
396
|
+
)
|
|
356
397
|
|
|
357
398
|
def delete(self, request, pk):
|
|
358
399
|
"""
|
|
359
|
-
Delete
|
|
400
|
+
Delete report file (Phase 1.2+ future enhancement).
|
|
360
401
|
|
|
361
402
|
Currently returns 501 Not Implemented.
|
|
362
403
|
Use /api/media-management/force-remove/{id}/ instead.
|
|
363
404
|
"""
|
|
364
405
|
return Response(
|
|
365
|
-
{
|
|
406
|
+
{
|
|
407
|
+
"error": "report deletion not yet implemented",
|
|
408
|
+
"alternative": f"Use DELETE /api/media-management/force-remove/{pk}/ instead",
|
|
409
|
+
},
|
|
366
410
|
status=status.HTTP_501_NOT_IMPLEMENTED,
|
|
367
411
|
)
|