endoreg-db 0.8.6.1__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/authz/auth.py +74 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +18 -0
- endoreg_db/authz/middleware.py +83 -0
- endoreg_db/authz/permissions.py +127 -0
- endoreg_db/authz/policy.py +218 -0
- endoreg_db/authz/views_auth.py +66 -0
- endoreg_db/config/env.py +13 -8
- endoreg_db/data/__init__.py +2 -11
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +3 -3
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +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/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/{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/finding_classification_choice/{colonoscopy_not_complete_reason.yaml → 02_colonoscopy_generic.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{colonoscopy_location.yaml → 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/finding_classification_choice/{colon_lesion_paris.yaml → 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/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +29 -12
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/{endoscopy_bleeding_risk.yaml → 02_endoscopy_bleeding_risk.yaml} +0 -6
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set_type/data.yaml +21 -0
- endoreg_db/data/setup_config.yaml +4 -4
- endoreg_db/data/tag/requirement_set_tags.yaml +21 -0
- endoreg_db/exceptions.py +4 -2
- endoreg_db/forms/examination_form.py +1 -1
- endoreg_db/helpers/data_loader.py +125 -53
- 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/create_model_meta_from_huggingface.py +21 -10
- endoreg_db/management/commands/create_multilabel_model_meta.py +299 -129
- endoreg_db/management/commands/import_report.py +130 -65
- endoreg_db/management/commands/import_video.py +9 -10
- endoreg_db/management/commands/import_video_with_classification.py +2 -2
- endoreg_db/management/commands/list_routes.py +18 -0
- 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_center_data.py +12 -12
- 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 +62 -39
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- 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/setup_endoreg_db.py +3 -3
- endoreg_db/management/commands/start_filewatcher.py +46 -37
- endoreg_db/management/commands/storage_management.py +271 -203
- endoreg_db/management/commands/validate_video_files.py +1 -5
- endoreg_db/migrations/0001_initial.py +297 -250
- endoreg_db/models/__init__.py +78 -123
- endoreg_db/models/administration/__init__.py +21 -42
- endoreg_db/models/administration/ai/active_model.py +2 -2
- endoreg_db/models/administration/ai/ai_model.py +7 -6
- endoreg_db/models/administration/case/__init__.py +1 -15
- endoreg_db/models/administration/case/case.py +3 -3
- endoreg_db/models/administration/case/case_template/__init__.py +2 -14
- endoreg_db/models/administration/case/case_template/case_template.py +2 -124
- endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
- endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
- endoreg_db/models/administration/center/center.py +33 -19
- endoreg_db/models/administration/center/center_product.py +12 -9
- endoreg_db/models/administration/center/center_resource.py +25 -19
- endoreg_db/models/administration/center/center_shift.py +21 -17
- endoreg_db/models/administration/center/center_waste.py +16 -8
- endoreg_db/models/administration/person/__init__.py +2 -0
- endoreg_db/models/administration/person/employee/employee.py +10 -5
- endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
- endoreg_db/models/administration/person/employee/employee_type.py +12 -6
- endoreg_db/models/administration/person/examiner/examiner.py +13 -11
- endoreg_db/models/administration/person/patient/__init__.py +2 -0
- endoreg_db/models/administration/person/patient/patient.py +129 -100
- endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
- endoreg_db/models/administration/person/person.py +4 -0
- endoreg_db/models/administration/person/profession/__init__.py +8 -4
- endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
- endoreg_db/models/administration/product/product.py +20 -15
- endoreg_db/models/administration/product/product_material.py +17 -18
- endoreg_db/models/administration/product/product_weight.py +12 -8
- endoreg_db/models/administration/product/reference_product.py +23 -55
- endoreg_db/models/administration/qualification/qualification.py +7 -3
- endoreg_db/models/administration/qualification/qualification_type.py +7 -3
- endoreg_db/models/administration/shift/scheduled_days.py +8 -5
- endoreg_db/models/administration/shift/shift.py +16 -12
- endoreg_db/models/administration/shift/shift_type.py +23 -31
- endoreg_db/models/label/__init__.py +8 -9
- endoreg_db/models/label/annotation/image_classification.py +10 -9
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +23 -28
- endoreg_db/models/label/label.py +15 -15
- endoreg_db/models/label/label_set.py +19 -6
- endoreg_db/models/label/label_type.py +1 -1
- endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
- endoreg_db/models/label/label_video_segment/label_video_segment.py +98 -102
- endoreg_db/models/label/video_segmentation_label.py +4 -0
- endoreg_db/models/label/video_segmentation_labelset.py +4 -3
- endoreg_db/models/media/frame/frame.py +22 -22
- endoreg_db/models/media/pdf/raw_pdf.py +194 -194
- endoreg_db/models/media/pdf/report_file.py +25 -29
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +55 -47
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
- 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/__init__.py +1 -0
- endoreg_db/models/media/video/create_from_file.py +139 -77
- endoreg_db/models/media/video/pipe_2.py +8 -9
- endoreg_db/models/media/video/video_file.py +174 -112
- endoreg_db/models/media/video/video_file_ai.py +288 -74
- endoreg_db/models/media/video/video_file_anonymize.py +38 -38
- endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
- endoreg_db/models/media/video/video_file_io.py +113 -61
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
- endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
- endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
- endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
- endoreg_db/models/media/video/video_file_segments.py +24 -17
- endoreg_db/models/media/video/video_metadata.py +19 -35
- endoreg_db/models/media/video/video_processing.py +96 -95
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +13 -3
- endoreg_db/models/medical/disease.py +22 -16
- endoreg_db/models/medical/event.py +31 -18
- endoreg_db/models/medical/examination/__init__.py +13 -6
- endoreg_db/models/medical/examination/examination.py +39 -20
- endoreg_db/models/medical/examination/examination_indication.py +30 -95
- endoreg_db/models/medical/examination/examination_time.py +23 -8
- endoreg_db/models/medical/examination/examination_time_type.py +9 -6
- endoreg_db/models/medical/examination/examination_type.py +3 -4
- endoreg_db/models/medical/finding/finding.py +32 -40
- endoreg_db/models/medical/finding/finding_classification.py +42 -72
- endoreg_db/models/medical/finding/finding_intervention.py +25 -22
- endoreg_db/models/medical/finding/finding_type.py +13 -12
- endoreg_db/models/medical/hardware/endoscope.py +26 -26
- endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
- endoreg_db/models/medical/laboratory/lab_value.py +62 -91
- endoreg_db/models/medical/medication/medication.py +22 -10
- endoreg_db/models/medical/medication/medication_indication.py +29 -3
- endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
- endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
- endoreg_db/models/medical/medication/medication_schedule.py +27 -16
- endoreg_db/models/medical/organ/__init__.py +15 -12
- endoreg_db/models/medical/patient/medication_examples.py +6 -6
- endoreg_db/models/medical/patient/patient_disease.py +20 -23
- endoreg_db/models/medical/patient/patient_event.py +19 -22
- endoreg_db/models/medical/patient/patient_examination.py +48 -54
- endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
- endoreg_db/models/medical/patient/patient_finding.py +122 -139
- endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
- endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
- endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
- endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
- endoreg_db/models/medical/patient/patient_medication.py +27 -38
- endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
- endoreg_db/models/medical/risk/risk.py +7 -6
- endoreg_db/models/medical/risk/risk_type.py +8 -5
- endoreg_db/models/metadata/model_meta.py +60 -29
- endoreg_db/models/metadata/model_meta_logic.py +125 -18
- endoreg_db/models/metadata/pdf_meta.py +31 -24
- endoreg_db/models/metadata/sensitive_meta.py +105 -85
- endoreg_db/models/metadata/sensitive_meta_logic.py +198 -103
- endoreg_db/models/metadata/video_meta.py +51 -31
- endoreg_db/models/metadata/video_prediction_logic.py +16 -23
- endoreg_db/models/metadata/video_prediction_meta.py +29 -33
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
- endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
- endoreg_db/models/other/emission/emission_factor.py +18 -8
- endoreg_db/models/other/gender.py +10 -5
- endoreg_db/models/other/information_source.py +50 -29
- endoreg_db/models/other/material.py +9 -5
- endoreg_db/models/other/resource.py +6 -4
- endoreg_db/models/other/tag.py +10 -5
- endoreg_db/models/other/transport_route.py +13 -8
- endoreg_db/models/other/unit.py +10 -6
- endoreg_db/models/other/waste.py +6 -5
- endoreg_db/models/report/report.py +6 -0
- endoreg_db/models/requirement/requirement.py +329 -361
- endoreg_db/models/requirement/requirement_error.py +85 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
- endoreg_db/models/requirement/requirement_operator.py +103 -112
- endoreg_db/models/requirement/requirement_set.py +74 -57
- endoreg_db/models/state/__init__.py +4 -4
- endoreg_db/models/state/abstract.py +2 -2
- endoreg_db/models/state/anonymization.py +12 -0
- endoreg_db/models/state/audit_ledger.py +49 -51
- endoreg_db/models/state/label_video_segment.py +9 -0
- endoreg_db/models/state/raw_pdf.py +101 -68
- endoreg_db/models/state/sensitive_meta.py +6 -2
- endoreg_db/models/state/video.py +110 -90
- endoreg_db/models/upload_job.py +35 -34
- endoreg_db/models/utils.py +28 -25
- endoreg_db/queries/__init__.py +3 -1
- endoreg_db/root_urls.py +21 -2
- endoreg_db/schemas/examination_evaluation.py +1 -1
- endoreg_db/serializers/__init__.py +2 -10
- endoreg_db/serializers/anonymization.py +18 -10
- endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
- endoreg_db/serializers/meta/__init__.py +1 -6
- endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
- endoreg_db/serializers/misc/file_overview.py +11 -99
- 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/requirements/requirement_sets.py +92 -22
- endoreg_db/serializers/video/segmentation.py +2 -1
- endoreg_db/serializers/video/video_file_list.py +65 -34
- endoreg_db/serializers/video/video_processing_history.py +20 -5
- endoreg_db/services/__old/pdf_import.py +1487 -0
- endoreg_db/services/__old/video_import.py +1306 -0
- endoreg_db/services/anonymization.py +128 -89
- endoreg_db/services/lookup_service.py +65 -52
- endoreg_db/services/lookup_store.py +2 -2
- endoreg_db/services/pdf_import.py +0 -1382
- endoreg_db/services/report_import.py +10 -0
- endoreg_db/services/video_import.py +6 -1255
- endoreg_db/tasks/upload_tasks.py +79 -70
- endoreg_db/tasks/video_ingest.py +8 -4
- endoreg_db/urls/__init__.py +5 -32
- endoreg_db/urls/ai.py +32 -0
- endoreg_db/urls/media.py +121 -83
- endoreg_db/urls/root_urls.py +29 -0
- endoreg_db/utils/__init__.py +15 -5
- endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/dataloader.py +142 -40
- endoreg_db/utils/defaults/set_default_center.py +32 -0
- endoreg_db/utils/names.py +22 -16
- endoreg_db/utils/paths.py +110 -46
- endoreg_db/utils/permissions.py +2 -1
- endoreg_db/utils/pipelines/Readme.md +1 -1
- endoreg_db/utils/pipelines/process_video_dir.py +1 -1
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +655 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
- endoreg_db/utils/setup_config.py +8 -5
- endoreg_db/utils/storage.py +115 -0
- endoreg_db/utils/validate_endo_roi.py +8 -2
- endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
- endoreg_db/views/__init__.py +85 -183
- endoreg_db/views/ai/__init__.py +8 -0
- endoreg_db/views/ai/label.py +155 -0
- endoreg_db/views/anonymization/media_management.py +202 -166
- endoreg_db/views/anonymization/overview.py +99 -67
- endoreg_db/views/anonymization/validate.py +182 -44
- endoreg_db/views/media/__init__.py +7 -20
- endoreg_db/views/media/pdf_media.py +197 -174
- endoreg_db/views/media/sensitive_metadata.py +193 -138
- endoreg_db/views/media/video_media.py +89 -82
- 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/patient/patient.py +5 -4
- endoreg_db/views/report/__init__.py +5 -7
- endoreg_db/views/{pdf → report}/reimport.py +22 -22
- endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +46 -39
- endoreg_db/views/requirement/evaluate.py +188 -187
- endoreg_db/views/requirement/lookup.py +17 -3
- endoreg_db/views/requirement/lookup_store.py +22 -90
- endoreg_db/views/requirement/requirement_utils.py +89 -0
- endoreg_db/views/video/__init__.py +23 -24
- 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} +77 -40
- 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.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/METADATA +7 -3
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/RECORD +391 -413
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/WHEEL +1 -1
- 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_bowel_preparation.yaml +0 -95
- 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 -68
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -80
- 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 -51
- 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_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_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/gender.yaml +0 -25
- 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_add_video_correction_models.py +0 -52
- endoreg_db/migrations/0003_add_center_display_name.py +0 -30
- endoreg_db/models/administration/permissions/__init__.py +0 -44
- endoreg_db/models/rule/__init__.py +0 -13
- endoreg_db/models/rule/rule.py +0 -27
- endoreg_db/models/rule/rule_applicator.py +0 -224
- endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
- endoreg_db/models/rule/rule_type.py +0 -20
- endoreg_db/models/rule/ruleset.py +0 -17
- 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/serializers/video/video_metadata.py +0 -105
- endoreg_db/services/requirements_object.py +0 -147
- endoreg_db/services/storage_aware_video_processor.py +0 -344
- 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/urls/report.py +0 -48
- endoreg_db/urls/video.py +0 -61
- endoreg_db/utils/case_generator/case_generator.py +0 -159
- endoreg_db/utils/case_generator/utils.py +0 -30
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +0 -368
- 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 -148
- 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/report/report_list.py +0 -112
- endoreg_db/views/report/report_with_secure_url.py +0 -28
- endoreg_db/views/report/start_examination.py +0 -7
- 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/views.py +0 -0
- /endoreg_db/data/requirement/{colonoscopy_baseline_austria.yaml → old/colonoscopy_baseline_austria.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_cardiovascular.yaml → old/disease_cardiovascular.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_classification_choice_cardiovascular.yaml → old/disease_classification_choice_cardiovascular.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_hepatology.yaml → old/disease_hepatology.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_misc.yaml → old/disease_misc.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_renal.yaml → old/disease_renal.yaml} +0 -0
- /endoreg_db/data/requirement/{endoscopy_bleeding_risk.yaml → old/endoscopy_bleeding_risk.yaml} +0 -0
- /endoreg_db/data/requirement/{event_cardiology.yaml → old/event_cardiology.yaml} +0 -0
- /endoreg_db/data/requirement/{event_requirements.yaml → old/event_requirements.yaml} +0 -0
- /endoreg_db/data/requirement/{finding_colon_polyp.yaml → old/finding_colon_polyp.yaml} +0 -0
- /endoreg_db/{migrations/__init__.py → data/requirement/old/gender.yaml} +0 -0
- /endoreg_db/data/requirement/{lab_value.yaml → old/lab_value.yaml} +0 -0
- /endoreg_db/data/requirement/{medication.yaml → old/medication.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{age.yaml → _old/age.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{lab_operators.yaml → _old/lab_operators.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{model_operators.yaml → _old/model_operators.yaml} +0 -0
- /endoreg_db/{models/media/video/refactor_plan.md → import_files/pseudonymization/__init__.py} +0 -0
- /endoreg_db/{models/media/video/video_file_frames.py → import_files/pseudonymization/pseudonymize.py} +0 -0
- /endoreg_db/models/{metadata/frame_ocr_result.py → report/__init__.py} +0 -0
- /endoreg_db/{urls/sensitive_meta.py → models/report/images.py} +0 -0
- /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/licenses/LICENSE +0 -0
endoreg_db/tasks/upload_tasks.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import logging
|
|
2
|
+
import os
|
|
3
3
|
from typing import Optional
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
from django.core.files.storage import default_storage
|
|
6
6
|
|
|
7
|
-
from
|
|
7
|
+
from celery_app import shared_task
|
|
8
8
|
from endoreg_db.models import SensitiveMeta, VideoFile
|
|
9
|
-
|
|
9
|
+
from endoreg_db.models.upload_job import UploadJob
|
|
10
10
|
|
|
11
11
|
logger = logging.getLogger(__name__)
|
|
12
12
|
|
|
@@ -14,8 +14,8 @@ logger = logging.getLogger(__name__)
|
|
|
14
14
|
@shared_task(bind=True)
|
|
15
15
|
def process_upload_job(self, job_id: str) -> dict:
|
|
16
16
|
"""
|
|
17
|
-
Process an uploaded file (
|
|
18
|
-
|
|
17
|
+
Process an uploaded file (report or video) asynchronously.
|
|
18
|
+
|
|
19
19
|
This task:
|
|
20
20
|
1. Updates job status to 'processing'
|
|
21
21
|
2. Determines file type and routes to appropriate processor
|
|
@@ -23,10 +23,10 @@ def process_upload_job(self, job_id: str) -> dict:
|
|
|
23
23
|
4. For videos: Uses VideoFile.create_from_file_initialized() and processing pipeline
|
|
24
24
|
5. Links the created SensitiveMeta to the job and marks as 'anonymized'
|
|
25
25
|
6. On error: marks job as 'error' with details
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
Args:
|
|
28
28
|
job_id: UUID string of the UploadJob to process
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
Returns:
|
|
31
31
|
dict: Processing result with status and details
|
|
32
32
|
"""
|
|
@@ -37,69 +37,71 @@ def process_upload_job(self, job_id: str) -> dict:
|
|
|
37
37
|
except UploadJob.DoesNotExist:
|
|
38
38
|
error_msg = f"UploadJob with id {job_id} not found"
|
|
39
39
|
logger.error(error_msg)
|
|
40
|
-
return {
|
|
41
|
-
|
|
40
|
+
return {"status": "error", "error": error_msg}
|
|
41
|
+
|
|
42
42
|
# Mark as processing
|
|
43
43
|
upload_job.mark_processing()
|
|
44
44
|
logger.info(f"Started processing upload job {job_id}")
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
# Get file path
|
|
47
47
|
file_path = upload_job.file.path
|
|
48
48
|
if not os.path.exists(file_path):
|
|
49
49
|
error_msg = f"Uploaded file not found at {file_path}"
|
|
50
50
|
upload_job.mark_error(error_msg)
|
|
51
51
|
logger.error(error_msg)
|
|
52
|
-
return {
|
|
53
|
-
|
|
52
|
+
return {"status": "error", "error": error_msg}
|
|
53
|
+
|
|
54
54
|
# Route to appropriate processor based on content type
|
|
55
55
|
sensitive_meta = None
|
|
56
|
-
|
|
57
|
-
if upload_job.content_type ==
|
|
56
|
+
|
|
57
|
+
if upload_job.content_type == "application/pdf":
|
|
58
58
|
sensitive_meta = _process_pdf_file(upload_job, file_path)
|
|
59
|
-
elif upload_job.content_type.startswith(
|
|
59
|
+
elif upload_job.content_type.startswith("video/"):
|
|
60
60
|
sensitive_meta = _process_video_file(upload_job, file_path)
|
|
61
61
|
else:
|
|
62
62
|
error_msg = f"Unsupported content type: {upload_job.content_type}"
|
|
63
63
|
upload_job.mark_error(error_msg)
|
|
64
64
|
logger.error(error_msg)
|
|
65
|
-
return {
|
|
66
|
-
|
|
65
|
+
return {"status": "error", "error": error_msg}
|
|
66
|
+
|
|
67
67
|
if sensitive_meta:
|
|
68
68
|
# Mark job as completed with the created SensitiveMeta
|
|
69
69
|
upload_job.mark_completed(sensitive_meta)
|
|
70
|
-
logger.info(
|
|
70
|
+
logger.info(
|
|
71
|
+
f"Successfully processed upload job {job_id}, created SensitiveMeta {sensitive_meta.id}"
|
|
72
|
+
)
|
|
71
73
|
return {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
"status": "anonymized",
|
|
75
|
+
"sensitive_meta_id": sensitive_meta.id,
|
|
76
|
+
"job_id": job_id,
|
|
75
77
|
}
|
|
76
78
|
else:
|
|
77
79
|
error_msg = "Processing completed but no SensitiveMeta was created"
|
|
78
80
|
upload_job.mark_error(error_msg)
|
|
79
81
|
logger.error(f"Upload job {job_id}: {error_msg}")
|
|
80
|
-
return {
|
|
81
|
-
|
|
82
|
+
return {"status": "error", "error": error_msg}
|
|
83
|
+
|
|
82
84
|
except Exception as e:
|
|
83
85
|
error_msg = f"Unexpected error processing upload job {job_id}: {str(e)}"
|
|
84
86
|
logger.exception(error_msg)
|
|
85
|
-
|
|
87
|
+
|
|
86
88
|
try:
|
|
87
89
|
upload_job = UploadJob.objects.get(id=job_id)
|
|
88
90
|
upload_job.mark_error(error_msg)
|
|
89
91
|
except Exception as inner_e:
|
|
90
92
|
logger.error(f"Failed to update job status after error: {inner_e}")
|
|
91
|
-
|
|
92
|
-
return {
|
|
93
|
+
|
|
94
|
+
return {"status": "error", "error": error_msg}
|
|
93
95
|
|
|
94
96
|
|
|
95
97
|
def _process_pdf_file(upload_job: UploadJob, file_path: str) -> Optional[SensitiveMeta]:
|
|
96
98
|
"""
|
|
97
|
-
Process a
|
|
98
|
-
|
|
99
|
+
Process a report file using ReportReader.
|
|
100
|
+
|
|
99
101
|
Args:
|
|
100
102
|
upload_job: The UploadJob instance
|
|
101
|
-
file_path: Path to the uploaded
|
|
102
|
-
|
|
103
|
+
file_path: Path to the uploaded report file
|
|
104
|
+
|
|
103
105
|
Returns:
|
|
104
106
|
SensitiveMeta instance if successful, None otherwise
|
|
105
107
|
"""
|
|
@@ -108,100 +110,107 @@ def _process_pdf_file(upload_job: UploadJob, file_path: str) -> Optional[Sensiti
|
|
|
108
110
|
try:
|
|
109
111
|
from lx_anonymizer.report_reader import ReportReader
|
|
110
112
|
except ImportError as e:
|
|
111
|
-
raise ImportError(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
raise ImportError(
|
|
114
|
+
f"Could not import ReportReader: {e}. Make sure lx-anonymizer is available."
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
logger.info(f"Processing report file: {file_path}")
|
|
118
|
+
|
|
115
119
|
# Create ReportReader instance
|
|
116
|
-
reader = ReportReader(
|
|
117
|
-
|
|
118
|
-
text_date_format="%d.%m.%Y"
|
|
119
|
-
)
|
|
120
|
-
|
|
120
|
+
reader = ReportReader(locale="de_DE", text_date_format="%d.%m.%Y")
|
|
121
|
+
|
|
121
122
|
# Process the report
|
|
122
123
|
original_text, anonymized_text, metadata = reader.process_report(
|
|
123
124
|
pdf_path=file_path,
|
|
124
125
|
use_ensemble=False, # Can be made configurable
|
|
125
126
|
verbose=False,
|
|
126
|
-
use_llm_extractor=None # Use default extractor
|
|
127
|
+
use_llm_extractor=None, # Use default extractor
|
|
127
128
|
)
|
|
128
|
-
|
|
129
|
+
|
|
129
130
|
if not metadata:
|
|
130
|
-
raise ValueError("No metadata extracted from
|
|
131
|
-
|
|
131
|
+
raise ValueError("No metadata extracted from report")
|
|
132
|
+
|
|
132
133
|
# Create SensitiveMeta from extracted metadata
|
|
133
134
|
sensitive_meta = SensitiveMeta.create_from_dict(metadata)
|
|
134
135
|
sensitive_meta.save()
|
|
135
|
-
|
|
136
|
-
logger.info(f"Created SensitiveMeta {sensitive_meta.id} from
|
|
136
|
+
|
|
137
|
+
logger.info(f"Created SensitiveMeta {sensitive_meta.id} from report processing")
|
|
137
138
|
return sensitive_meta
|
|
138
|
-
|
|
139
|
+
|
|
139
140
|
except Exception as e:
|
|
140
|
-
logger.exception(f"Error processing
|
|
141
|
+
logger.exception(f"Error processing report file {file_path}: {e}")
|
|
141
142
|
raise
|
|
142
143
|
|
|
143
144
|
|
|
144
|
-
def _process_video_file(
|
|
145
|
+
def _process_video_file(
|
|
146
|
+
upload_job: UploadJob, file_path: str
|
|
147
|
+
) -> Optional[SensitiveMeta]:
|
|
145
148
|
"""
|
|
146
149
|
Process a video file using VideoFile creation and processing pipeline.
|
|
147
|
-
|
|
150
|
+
|
|
148
151
|
Args:
|
|
149
152
|
upload_job: The UploadJob instance
|
|
150
153
|
file_path: Path to the uploaded video file
|
|
151
|
-
|
|
154
|
+
|
|
152
155
|
Returns:
|
|
153
156
|
SensitiveMeta instance if successful, None otherwise
|
|
154
157
|
"""
|
|
155
158
|
try:
|
|
156
159
|
logger.info(f"Processing video file: {file_path}")
|
|
157
|
-
|
|
160
|
+
|
|
158
161
|
# Get the relative path for storage
|
|
159
162
|
relative_path = os.path.relpath(file_path, default_storage.location)
|
|
160
|
-
|
|
163
|
+
|
|
161
164
|
# Create VideoFile instance using the existing method
|
|
162
165
|
video_file = VideoFile.create_from_file_initialized(
|
|
163
166
|
file_path=relative_path,
|
|
164
167
|
skip_frame_extraction=False, # Extract frames for processing
|
|
165
|
-
skip_meta_extraction=False,
|
|
168
|
+
skip_meta_extraction=False, # Extract metadata
|
|
166
169
|
)
|
|
167
|
-
|
|
170
|
+
|
|
168
171
|
if not video_file:
|
|
169
172
|
raise ValueError("Failed to create VideoFile instance")
|
|
170
|
-
|
|
173
|
+
|
|
171
174
|
# Run the video processing pipeline (pipe_1)
|
|
172
175
|
try:
|
|
173
176
|
# Import the processing function
|
|
174
177
|
from endoreg_db.management.commands.import_video import pipe_1
|
|
175
|
-
|
|
178
|
+
|
|
176
179
|
# Run processing pipeline
|
|
177
180
|
pipe_1(
|
|
178
181
|
video_file=video_file,
|
|
179
182
|
skip_frame_extraction=False,
|
|
180
183
|
skip_meta_extraction=False,
|
|
181
|
-
skip_anonymization=False
|
|
184
|
+
skip_anonymization=False,
|
|
182
185
|
)
|
|
183
|
-
|
|
186
|
+
|
|
184
187
|
except Exception as e:
|
|
185
|
-
logger.warning(
|
|
188
|
+
logger.warning(
|
|
189
|
+
f"Video processing pipeline failed, but VideoFile was created: {e}"
|
|
190
|
+
)
|
|
186
191
|
# Continue anyway - we might still have usable metadata
|
|
187
|
-
|
|
192
|
+
|
|
188
193
|
# Get the associated SensitiveMeta
|
|
189
|
-
if hasattr(video_file,
|
|
194
|
+
if hasattr(video_file, "sensitive_meta") and video_file.sensitive_meta:
|
|
190
195
|
sensitive_meta = video_file.sensitive_meta
|
|
191
|
-
logger.info(
|
|
196
|
+
logger.info(
|
|
197
|
+
f"Found SensitiveMeta {sensitive_meta.id} from video processing"
|
|
198
|
+
)
|
|
192
199
|
return sensitive_meta
|
|
193
200
|
else:
|
|
194
201
|
# Create a basic SensitiveMeta if none exists
|
|
195
202
|
sensitive_meta = SensitiveMeta.objects.create()
|
|
196
|
-
|
|
203
|
+
|
|
197
204
|
# Link it to the video if possible
|
|
198
|
-
if hasattr(video_file,
|
|
205
|
+
if hasattr(video_file, "sensitive_meta"):
|
|
199
206
|
video_file.sensitive_meta = sensitive_meta
|
|
200
|
-
video_file.save(update_fields=[
|
|
201
|
-
|
|
202
|
-
logger.info(
|
|
207
|
+
video_file.save(update_fields=["sensitive_meta"])
|
|
208
|
+
|
|
209
|
+
logger.info(
|
|
210
|
+
f"Created basic SensitiveMeta {sensitive_meta.id} for video file"
|
|
211
|
+
)
|
|
203
212
|
return sensitive_meta
|
|
204
|
-
|
|
213
|
+
|
|
205
214
|
except Exception as e:
|
|
206
215
|
logger.exception(f"Error processing video file {file_path}: {e}")
|
|
207
|
-
raise
|
|
216
|
+
raise
|
endoreg_db/tasks/video_ingest.py
CHANGED
|
@@ -63,15 +63,19 @@ def run_import_video(file_path: str, center_name: Optional[str] = None,
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
# Use settings defaults if not provided
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
if not isinstance(center_name, str):
|
|
67
|
+
getattr(settings, 'DEFAULT_CENTER', 'university_hospital_wuerzburg')
|
|
68
|
+
assert(center_name is str)
|
|
69
|
+
if not isinstance(processor_name, str):
|
|
70
|
+
assert(processor_name is str)
|
|
71
|
+
getattr(settings, 'DEFAULT_PROCESSOR', 'olympus_cv_1500')
|
|
72
|
+
|
|
69
73
|
logger.info(f"Starting import for video: {file_path}")
|
|
70
74
|
logger.info(f"Using center: {center_name}, processor: {processor_name}")
|
|
71
75
|
|
|
72
76
|
# Try to use the service first
|
|
73
77
|
try:
|
|
74
|
-
from endoreg_db.services import video_import
|
|
78
|
+
from endoreg_db.services.__old import video_import
|
|
75
79
|
|
|
76
80
|
video_file_obj = video_import.import_and_anonymize(
|
|
77
81
|
file_path=file_path,
|
endoreg_db/urls/__init__.py
CHANGED
|
@@ -3,61 +3,39 @@ from django.conf.urls.static import static
|
|
|
3
3
|
from django.urls import include, path
|
|
4
4
|
from rest_framework.routers import DefaultRouter
|
|
5
5
|
|
|
6
|
+
from endoreg_db.authz.views_auth import auth_bootstrap
|
|
7
|
+
|
|
6
8
|
from endoreg_db.views import (
|
|
7
9
|
ExaminationViewSet,
|
|
8
10
|
FindingClassificationViewSet,
|
|
9
11
|
FindingViewSet,
|
|
10
12
|
PatientExaminationViewSet,
|
|
11
13
|
PatientFindingViewSet,
|
|
12
|
-
VideoExaminationViewSet,
|
|
13
|
-
VideoViewSet,
|
|
14
14
|
)
|
|
15
15
|
|
|
16
16
|
from .anonymization import url_patterns as anonymization_url_patterns
|
|
17
17
|
from .auth import urlpatterns as auth_url_patterns
|
|
18
18
|
from .classification import url_patterns as classification_url_patterns
|
|
19
19
|
from .examination import urlpatterns as examination_url_patterns
|
|
20
|
-
from .files import urlpatterns as files_url_patterns
|
|
21
|
-
from .label_video_segment_validate import (
|
|
22
|
-
url_patterns as label_video_segment_validate_url_patterns,
|
|
23
|
-
)
|
|
24
|
-
from .label_video_segments import url_patterns as label_video_segments_url_patterns
|
|
25
|
-
|
|
26
|
-
# Phase 1.2: Media Management URLs ✅ IMPLEMENTED
|
|
27
20
|
from .media import urlpatterns as media_url_patterns
|
|
28
21
|
from .patient import urlpatterns as patient_url_patterns
|
|
29
|
-
|
|
30
|
-
# TODO Phase 1.2: Implement VideoMediaView and PDFMediaView before enabling
|
|
31
|
-
# from .media import urlpatterns as media_url_patterns
|
|
32
|
-
from .report import url_patterns as report_url_patterns
|
|
33
22
|
from .requirements import urlpatterns as requirements_url_patterns
|
|
34
23
|
from .stats import url_patterns as stats_url_patterns
|
|
35
24
|
from .upload import urlpatterns as upload_url_patterns
|
|
36
|
-
from .video import url_patterns as video_url_patterns
|
|
37
25
|
|
|
38
26
|
api_urls = []
|
|
39
27
|
api_urls += classification_url_patterns
|
|
40
28
|
api_urls += anonymization_url_patterns
|
|
41
29
|
api_urls += auth_url_patterns
|
|
42
30
|
api_urls += examination_url_patterns
|
|
43
|
-
api_urls += files_url_patterns
|
|
44
|
-
api_urls += label_video_segments_url_patterns
|
|
45
|
-
api_urls += label_video_segment_validate_url_patterns # Neue Validierungs-Endpunkte
|
|
46
|
-
# Phase 1.2: Enable media_url_patterns ✅ IMPLEMENTED
|
|
47
31
|
api_urls += media_url_patterns
|
|
48
|
-
api_urls += report_url_patterns
|
|
49
32
|
api_urls += upload_url_patterns
|
|
50
|
-
api_urls += video_url_patterns
|
|
51
33
|
api_urls += requirements_url_patterns
|
|
52
34
|
api_urls += patient_url_patterns
|
|
53
35
|
api_urls += stats_url_patterns
|
|
54
36
|
|
|
55
37
|
router = DefaultRouter()
|
|
56
|
-
router.register(r"videos", VideoViewSet, basename="videos")
|
|
57
38
|
router.register(r"examinations", ExaminationViewSet)
|
|
58
|
-
router.register(
|
|
59
|
-
r"video-examinations", VideoExaminationViewSet, basename="video-examinations"
|
|
60
|
-
)
|
|
61
39
|
router.register(r"findings", FindingViewSet)
|
|
62
40
|
router.register(r"classifications", FindingClassificationViewSet)
|
|
63
41
|
router.register(r"patient-findings", PatientFindingViewSet)
|
|
@@ -65,17 +43,12 @@ router.register(r"patient-examinations", PatientExaminationViewSet)
|
|
|
65
43
|
|
|
66
44
|
# Additional custom video examination routes
|
|
67
45
|
# Frontend expects: GET /api/video/{id}/examinations/
|
|
68
|
-
video_examinations_list = VideoExaminationViewSet.as_view({"get": "by_video"})
|
|
69
46
|
|
|
70
47
|
# Export raw API urlpatterns (no prefix). The project-level endoreg_db/urls.py mounts these under /api/.
|
|
71
48
|
urlpatterns = [
|
|
72
|
-
path(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
name="video-examinations-by-video",
|
|
76
|
-
),
|
|
77
|
-
path("", include(api_urls)), # Specific routes first
|
|
78
|
-
path("", include(router.urls)), # Generic router routes second
|
|
49
|
+
path("auth/bootstrap", auth_bootstrap, name="auth-bootstrap"),
|
|
50
|
+
path('', include(router.urls)),
|
|
51
|
+
path('', include(api_urls)),
|
|
79
52
|
]
|
|
80
53
|
|
|
81
54
|
if settings.DEBUG:
|
endoreg_db/urls/ai.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from django.urls import path
|
|
2
|
+
from endoreg_db.views.ai import (label_list, add_label, delete_label, update_label)
|
|
3
|
+
|
|
4
|
+
url_patterns=[
|
|
5
|
+
# Label interface
|
|
6
|
+
# GET, Returns list of labels
|
|
7
|
+
path(
|
|
8
|
+
"ai/label-list",
|
|
9
|
+
label_list,
|
|
10
|
+
name="label-list"
|
|
11
|
+
),
|
|
12
|
+
# POST, updates label by deleting old one and adding new one
|
|
13
|
+
path(
|
|
14
|
+
"ai/label-update",
|
|
15
|
+
update_label,
|
|
16
|
+
name="label-update"
|
|
17
|
+
),
|
|
18
|
+
# DELETE, deletes a label
|
|
19
|
+
path(
|
|
20
|
+
"ai/label-delete",
|
|
21
|
+
delete_label,
|
|
22
|
+
name="label-delete"
|
|
23
|
+
),
|
|
24
|
+
# POST, allows adding a new label
|
|
25
|
+
path(
|
|
26
|
+
"ai/label-add",
|
|
27
|
+
add_label,
|
|
28
|
+
name="label-add"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
]
|