endoreg-db 0.8.9.2__py3-none-any.whl → 0.8.9.10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/admin.py +10 -5
- endoreg_db/apps.py +4 -7
- endoreg_db/authz/auth.py +1 -0
- endoreg_db/authz/backends.py +1 -1
- endoreg_db/authz/management/commands/list_routes.py +2 -0
- endoreg_db/authz/middleware.py +8 -7
- endoreg_db/authz/permissions.py +21 -10
- endoreg_db/authz/policy.py +14 -19
- endoreg_db/authz/views_auth.py +14 -10
- endoreg_db/codemods/rename_datetime_fields.py +8 -1
- endoreg_db/exceptions.py +5 -2
- endoreg_db/forms/__init__.py +0 -1
- endoreg_db/forms/examination_form.py +4 -3
- endoreg_db/forms/patient_finding_intervention_form.py +30 -8
- endoreg_db/forms/patient_form.py +9 -13
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/settings/__init__.py +4 -1
- endoreg_db/forms/unit.py +2 -1
- endoreg_db/helpers/count_db.py +17 -14
- endoreg_db/helpers/default_objects.py +2 -1
- endoreg_db/helpers/download_segmentation_model.py +4 -3
- endoreg_db/helpers/interact.py +0 -5
- endoreg_db/helpers/test_video_helper.py +33 -25
- endoreg_db/import_files/__init__.py +1 -1
- endoreg_db/import_files/context/__init__.py +1 -1
- endoreg_db/import_files/context/default_sensitive_meta.py +11 -9
- endoreg_db/import_files/context/ensure_center.py +4 -4
- endoreg_db/import_files/context/file_lock.py +3 -3
- endoreg_db/import_files/context/import_context.py +11 -12
- endoreg_db/import_files/context/validate_directories.py +1 -0
- endoreg_db/import_files/file_storage/create_report_file.py +57 -34
- endoreg_db/import_files/file_storage/create_video_file.py +64 -35
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +5 -2
- endoreg_db/import_files/file_storage/state_management.py +89 -122
- endoreg_db/import_files/file_storage/storage.py +5 -1
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +24 -19
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +3 -3
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +18 -18
- endoreg_db/import_files/pseudonymization/k_anonymity.py +8 -9
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +16 -5
- endoreg_db/import_files/report_import_service.py +36 -30
- endoreg_db/import_files/video_import_service.py +27 -23
- endoreg_db/logger_conf.py +56 -40
- endoreg_db/management/__init__.py +1 -1
- endoreg_db/management/commands/__init__.py +1 -1
- endoreg_db/management/commands/check_auth.py +45 -38
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +53 -2
- endoreg_db/management/commands/create_multilabel_model_meta.py +54 -19
- endoreg_db/management/commands/fix_missing_patient_data.py +105 -71
- endoreg_db/management/commands/fix_video_paths.py +75 -54
- endoreg_db/management/commands/import_report.py +1 -3
- endoreg_db/management/commands/list_routes.py +2 -0
- endoreg_db/management/commands/load_ai_model_data.py +8 -2
- endoreg_db/management/commands/load_ai_model_label_data.py +0 -1
- endoreg_db/management/commands/load_center_data.py +3 -3
- endoreg_db/management/commands/load_distribution_data.py +35 -38
- endoreg_db/management/commands/load_endoscope_data.py +0 -3
- endoreg_db/management/commands/load_examination_data.py +20 -4
- endoreg_db/management/commands/load_finding_data.py +18 -3
- endoreg_db/management/commands/load_gender_data.py +17 -24
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +95 -85
- endoreg_db/management/commands/load_information_source.py +0 -3
- endoreg_db/management/commands/load_lab_value_data.py +14 -3
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_name_data.py +1 -2
- endoreg_db/management/commands/load_pdf_type_data.py +4 -8
- endoreg_db/management/commands/load_profession_data.py +0 -1
- endoreg_db/management/commands/load_report_reader_flag_data.py +0 -4
- endoreg_db/management/commands/load_requirement_data.py +6 -2
- endoreg_db/management/commands/load_unit_data.py +0 -4
- endoreg_db/management/commands/load_user_groups.py +5 -7
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +22 -16
- endoreg_db/management/commands/setup_endoreg_db.py +110 -32
- endoreg_db/management/commands/storage_management.py +14 -8
- endoreg_db/management/commands/summarize_db_content.py +154 -63
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +82 -50
- endoreg_db/management/commands/video_validation.py +4 -6
- endoreg_db/migrations/0001_initial.py +112 -63
- endoreg_db/models/__init__.py +8 -0
- endoreg_db/models/administration/ai/active_model.py +5 -5
- endoreg_db/models/administration/ai/ai_model.py +41 -18
- endoreg_db/models/administration/ai/model_type.py +1 -0
- endoreg_db/models/administration/case/case.py +22 -22
- endoreg_db/models/administration/center/__init__.py +5 -5
- endoreg_db/models/administration/center/center.py +6 -2
- endoreg_db/models/administration/center/center_resource.py +18 -4
- endoreg_db/models/administration/center/center_shift.py +3 -1
- endoreg_db/models/administration/center/center_waste.py +6 -2
- endoreg_db/models/administration/person/__init__.py +1 -1
- endoreg_db/models/administration/person/employee/__init__.py +1 -1
- endoreg_db/models/administration/person/employee/employee_type.py +3 -1
- endoreg_db/models/administration/person/examiner/__init__.py +1 -1
- endoreg_db/models/administration/person/examiner/examiner.py +10 -2
- endoreg_db/models/administration/person/names/first_name.py +6 -4
- endoreg_db/models/administration/person/names/last_name.py +4 -3
- endoreg_db/models/administration/person/patient/__init__.py +1 -1
- endoreg_db/models/administration/person/patient/patient.py +0 -1
- endoreg_db/models/administration/person/patient/patient_external_id.py +0 -1
- endoreg_db/models/administration/person/person.py +1 -1
- endoreg_db/models/administration/product/__init__.py +7 -6
- endoreg_db/models/administration/product/product.py +6 -2
- endoreg_db/models/administration/product/product_group.py +9 -7
- endoreg_db/models/administration/product/product_material.py +9 -2
- endoreg_db/models/administration/product/reference_product.py +64 -15
- endoreg_db/models/administration/qualification/qualification.py +3 -1
- endoreg_db/models/administration/shift/shift.py +3 -1
- endoreg_db/models/administration/shift/shift_type.py +12 -4
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +1 -1
- endoreg_db/models/label/label.py +10 -2
- endoreg_db/models/label/label_set.py +3 -1
- endoreg_db/models/label/label_video_segment/_create_from_video.py +6 -2
- endoreg_db/models/label/label_video_segment/label_video_segment.py +148 -44
- endoreg_db/models/media/__init__.py +12 -5
- endoreg_db/models/media/frame/__init__.py +1 -1
- endoreg_db/models/media/frame/frame.py +34 -8
- endoreg_db/models/media/pdf/__init__.py +2 -1
- endoreg_db/models/media/pdf/raw_pdf.py +11 -4
- endoreg_db/models/media/pdf/report_file.py +6 -2
- endoreg_db/models/media/pdf/report_reader/__init__.py +3 -3
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +15 -5
- endoreg_db/models/media/video/create_from_file.py +20 -41
- endoreg_db/models/media/video/pipe_1.py +75 -30
- endoreg_db/models/media/video/pipe_2.py +37 -12
- endoreg_db/models/media/video/video_file.py +36 -24
- endoreg_db/models/media/video/video_file_ai.py +235 -70
- endoreg_db/models/media/video/video_file_anonymize.py +240 -65
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -1
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +3 -1
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +30 -9
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +95 -29
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +13 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -1
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +15 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +15 -3
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +7 -2
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +109 -23
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +111 -27
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +46 -13
- endoreg_db/models/media/video/video_file_io.py +85 -33
- endoreg_db/models/media/video/video_file_meta/__init__.py +6 -6
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +17 -4
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +28 -7
- endoreg_db/models/media/video/video_file_meta/get_fps.py +46 -13
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +81 -20
- endoreg_db/models/media/video/video_file_meta/text_meta.py +61 -20
- endoreg_db/models/media/video/video_file_meta/video_meta.py +40 -12
- endoreg_db/models/media/video/video_file_segments.py +118 -27
- endoreg_db/models/media/video/video_metadata.py +25 -6
- endoreg_db/models/media/video/video_processing.py +54 -15
- endoreg_db/models/medical/__init__.py +3 -13
- endoreg_db/models/medical/contraindication/__init__.py +3 -1
- endoreg_db/models/medical/disease.py +18 -6
- endoreg_db/models/medical/event.py +6 -2
- endoreg_db/models/medical/examination/__init__.py +5 -1
- endoreg_db/models/medical/examination/examination.py +22 -6
- endoreg_db/models/medical/examination/examination_indication.py +23 -7
- endoreg_db/models/medical/examination/examination_time.py +6 -2
- endoreg_db/models/medical/finding/__init__.py +3 -1
- endoreg_db/models/medical/finding/finding.py +37 -12
- endoreg_db/models/medical/finding/finding_classification.py +27 -8
- endoreg_db/models/medical/finding/finding_intervention.py +19 -6
- endoreg_db/models/medical/finding/finding_type.py +3 -1
- endoreg_db/models/medical/hardware/__init__.py +1 -1
- endoreg_db/models/medical/hardware/endoscope.py +14 -2
- endoreg_db/models/medical/laboratory/__init__.py +1 -1
- endoreg_db/models/medical/laboratory/lab_value.py +139 -39
- endoreg_db/models/medical/medication/__init__.py +7 -3
- endoreg_db/models/medical/medication/medication.py +3 -1
- endoreg_db/models/medical/medication/medication_indication.py +3 -1
- endoreg_db/models/medical/medication/medication_indication_type.py +11 -3
- endoreg_db/models/medical/medication/medication_intake_time.py +3 -1
- endoreg_db/models/medical/medication/medication_schedule.py +3 -1
- endoreg_db/models/medical/patient/__init__.py +2 -10
- endoreg_db/models/medical/patient/medication_examples.py +3 -14
- endoreg_db/models/medical/patient/patient_disease.py +17 -5
- endoreg_db/models/medical/patient/patient_event.py +12 -4
- endoreg_db/models/medical/patient/patient_examination.py +52 -15
- endoreg_db/models/medical/patient/patient_examination_indication.py +15 -4
- endoreg_db/models/medical/patient/patient_finding.py +105 -29
- endoreg_db/models/medical/patient/patient_finding_classification.py +41 -12
- endoreg_db/models/medical/patient/patient_finding_intervention.py +11 -3
- endoreg_db/models/medical/patient/patient_lab_sample.py +6 -2
- endoreg_db/models/medical/patient/patient_lab_value.py +42 -10
- endoreg_db/models/medical/patient/patient_medication.py +25 -7
- endoreg_db/models/medical/patient/patient_medication_schedule.py +34 -10
- endoreg_db/models/metadata/model_meta.py +40 -12
- endoreg_db/models/metadata/model_meta_logic.py +51 -16
- endoreg_db/models/metadata/sensitive_meta.py +65 -28
- endoreg_db/models/metadata/sensitive_meta_logic.py +28 -26
- endoreg_db/models/metadata/video_meta.py +146 -39
- endoreg_db/models/metadata/video_prediction_logic.py +70 -21
- endoreg_db/models/metadata/video_prediction_meta.py +80 -27
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +10 -10
- endoreg_db/models/other/distribution/__init__.py +9 -7
- endoreg_db/models/other/distribution/base_value_distribution.py +3 -1
- endoreg_db/models/other/distribution/date_value_distribution.py +19 -5
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +3 -1
- endoreg_db/models/other/distribution/numeric_value_distribution.py +34 -9
- endoreg_db/models/other/emission/__init__.py +1 -1
- endoreg_db/models/other/emission/emission_factor.py +9 -3
- endoreg_db/models/other/information_source.py +15 -5
- endoreg_db/models/other/material.py +3 -1
- endoreg_db/models/other/transport_route.py +3 -1
- endoreg_db/models/other/unit.py +6 -2
- endoreg_db/models/report/report.py +0 -1
- endoreg_db/models/requirement/requirement.py +84 -27
- endoreg_db/models/requirement/requirement_error.py +5 -6
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +1 -1
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +8 -8
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +3 -3
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +24 -8
- endoreg_db/models/requirement/requirement_operator.py +28 -8
- endoreg_db/models/requirement/requirement_set.py +34 -11
- endoreg_db/models/state/__init__.py +1 -0
- endoreg_db/models/state/audit_ledger.py +9 -2
- endoreg_db/models/{media → state}/processing_history/__init__.py +1 -3
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +0 -1
- endoreg_db/models/state/video.py +2 -4
- endoreg_db/models/utils.py +4 -2
- endoreg_db/queries/__init__.py +2 -6
- endoreg_db/queries/annotations/__init__.py +1 -3
- endoreg_db/queries/annotations/legacy.py +37 -26
- endoreg_db/root_urls.py +3 -4
- endoreg_db/schemas/examination_evaluation.py +3 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +249 -163
- endoreg_db/serializers/__init__.py +2 -8
- endoreg_db/serializers/administration/__init__.py +1 -2
- endoreg_db/serializers/administration/ai/__init__.py +0 -1
- endoreg_db/serializers/administration/ai/active_model.py +3 -1
- endoreg_db/serializers/administration/ai/ai_model.py +5 -3
- endoreg_db/serializers/administration/ai/model_type.py +3 -1
- endoreg_db/serializers/administration/center.py +7 -2
- endoreg_db/serializers/administration/gender.py +4 -2
- endoreg_db/serializers/anonymization.py +13 -13
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -1
- endoreg_db/serializers/examination/__init__.py +1 -1
- endoreg_db/serializers/examination/base.py +12 -13
- endoreg_db/serializers/examination/dropdown.py +6 -7
- endoreg_db/serializers/examination_serializer.py +3 -6
- endoreg_db/serializers/finding/__init__.py +1 -1
- endoreg_db/serializers/finding/finding.py +14 -7
- endoreg_db/serializers/finding_classification/__init__.py +3 -3
- endoreg_db/serializers/finding_classification/choice.py +3 -3
- endoreg_db/serializers/finding_classification/classification.py +2 -4
- endoreg_db/serializers/label_video_segment/__init__.py +5 -3
- endoreg_db/serializers/{label → label_video_segment}/image_classification_annotation.py +5 -5
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/{label → label_video_segment/label}/label.py +1 -1
- endoreg_db/serializers/label_video_segment/label_video_segment.py +338 -228
- endoreg_db/serializers/meta/__init__.py +1 -2
- endoreg_db/serializers/meta/sensitive_meta_detail.py +28 -13
- endoreg_db/serializers/meta/sensitive_meta_update.py +51 -46
- endoreg_db/serializers/meta/sensitive_meta_verification.py +19 -16
- endoreg_db/serializers/misc/__init__.py +2 -2
- endoreg_db/serializers/misc/file_overview.py +11 -7
- endoreg_db/serializers/misc/stats.py +10 -8
- endoreg_db/serializers/misc/translatable_field_mix_in.py +6 -6
- endoreg_db/serializers/misc/upload_job.py +32 -29
- endoreg_db/serializers/patient/__init__.py +2 -1
- endoreg_db/serializers/patient/patient.py +32 -15
- endoreg_db/serializers/patient/patient_dropdown.py +11 -3
- endoreg_db/serializers/patient_examination/__init__.py +1 -1
- endoreg_db/serializers/patient_examination/patient_examination.py +67 -40
- endoreg_db/serializers/patient_finding/__init__.py +1 -1
- endoreg_db/serializers/patient_finding/patient_finding.py +2 -1
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +17 -9
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +26 -17
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +7 -5
- endoreg_db/serializers/patient_finding/patient_finding_list.py +10 -11
- endoreg_db/serializers/patient_finding/patient_finding_write.py +36 -27
- endoreg_db/serializers/pdf/__init__.py +1 -3
- endoreg_db/serializers/requirements/requirement_schema.py +1 -6
- endoreg_db/serializers/sensitive_meta_serializer.py +100 -81
- endoreg_db/serializers/video/__init__.py +2 -2
- endoreg_db/serializers/video/{segmentation.py → video_file.py} +66 -47
- endoreg_db/serializers/video/video_file_brief.py +6 -2
- endoreg_db/serializers/video/video_file_detail.py +36 -23
- endoreg_db/serializers/video/video_file_list.py +4 -2
- endoreg_db/serializers/video/video_processing_history.py +54 -50
- endoreg_db/services/__init__.py +1 -1
- endoreg_db/services/anonymization.py +2 -2
- endoreg_db/services/examination_evaluation.py +40 -17
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/polling_coordinator.py +101 -70
- endoreg_db/services/pseudonym_service.py +27 -22
- endoreg_db/services/report_import.py +6 -3
- endoreg_db/services/segment_sync.py +75 -59
- endoreg_db/services/video_import.py +6 -7
- endoreg_db/urls/__init__.py +2 -2
- endoreg_db/urls/ai.py +7 -25
- endoreg_db/urls/anonymization.py +61 -15
- endoreg_db/urls/auth.py +4 -4
- endoreg_db/urls/classification.py +4 -9
- endoreg_db/urls/examination.py +27 -18
- endoreg_db/urls/media.py +27 -34
- endoreg_db/urls/patient.py +11 -7
- endoreg_db/urls/requirements.py +3 -1
- endoreg_db/urls/root_urls.py +2 -3
- endoreg_db/urls/stats.py +24 -16
- endoreg_db/urls/upload.py +3 -11
- endoreg_db/utils/__init__.py +14 -15
- endoreg_db/utils/ai/__init__.py +1 -1
- endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
- endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
- endoreg_db/utils/ai/get.py +2 -1
- endoreg_db/utils/ai/inference_dataset.py +14 -15
- endoreg_db/utils/ai/model_training/config.py +117 -0
- endoreg_db/utils/ai/model_training/dataset.py +74 -0
- endoreg_db/utils/ai/model_training/losses.py +68 -0
- endoreg_db/utils/ai/model_training/metrics.py +78 -0
- endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
- endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
- endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +21 -6
- endoreg_db/utils/ai/predict.py +4 -4
- endoreg_db/utils/ai/preprocess.py +19 -11
- endoreg_db/utils/calc_duration_seconds.py +4 -4
- endoreg_db/utils/case_generator/lab_sample_factory.py +3 -4
- endoreg_db/utils/check_video_files.py +74 -47
- endoreg_db/utils/cropping.py +10 -9
- endoreg_db/utils/dataloader.py +11 -3
- endoreg_db/utils/dates.py +3 -4
- endoreg_db/utils/defaults/set_default_center.py +7 -6
- endoreg_db/utils/env.py +6 -2
- endoreg_db/utils/extract_specific_frames.py +24 -9
- endoreg_db/utils/file_operations.py +30 -18
- endoreg_db/utils/fix_video_path_direct.py +57 -41
- endoreg_db/utils/frame_anonymization_utils.py +157 -157
- endoreg_db/utils/hashs.py +3 -18
- endoreg_db/utils/links/requirement_link.py +96 -52
- endoreg_db/utils/ocr.py +30 -25
- endoreg_db/utils/operation_log.py +61 -0
- endoreg_db/utils/parse_and_generate_yaml.py +12 -13
- endoreg_db/utils/paths.py +6 -6
- endoreg_db/utils/permissions.py +40 -24
- endoreg_db/utils/pipelines/process_video_dir.py +50 -26
- endoreg_db/utils/product/sum_emissions.py +5 -3
- endoreg_db/utils/product/sum_weights.py +4 -2
- endoreg_db/utils/pydantic_models/__init__.py +3 -4
- endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +207 -107
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +252 -65
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +27 -10
- endoreg_db/utils/setup_config.py +21 -5
- endoreg_db/utils/storage.py +3 -1
- endoreg_db/utils/translation.py +19 -15
- endoreg_db/utils/uuid.py +1 -0
- endoreg_db/utils/validate_endo_roi.py +12 -4
- endoreg_db/utils/validate_subcategory_dict.py +26 -24
- endoreg_db/utils/validate_video_detailed.py +207 -149
- endoreg_db/utils/video/__init__.py +7 -3
- endoreg_db/utils/video/extract_frames.py +30 -18
- endoreg_db/utils/video/names.py +11 -6
- endoreg_db/utils/video/streaming_processor.py +175 -101
- endoreg_db/utils/video/video_splitter.py +30 -19
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +59 -50
- endoreg_db/views/__init__.py +0 -20
- endoreg_db/views/anonymization/__init__.py +6 -2
- endoreg_db/views/anonymization/media_management.py +2 -6
- endoreg_db/views/anonymization/overview.py +34 -1
- endoreg_db/views/anonymization/validate.py +79 -18
- endoreg_db/views/auth/__init__.py +1 -1
- endoreg_db/views/auth/keycloak.py +16 -14
- endoreg_db/views/examination/__init__.py +12 -15
- endoreg_db/views/examination/examination.py +5 -5
- endoreg_db/views/examination/examination_manifest_cache.py +5 -5
- endoreg_db/views/examination/get_finding_classification_choices.py +8 -5
- endoreg_db/views/examination/get_finding_classifications.py +9 -7
- endoreg_db/views/examination/get_findings.py +8 -10
- endoreg_db/views/examination/get_instruments.py +3 -2
- endoreg_db/views/examination/get_interventions.py +1 -1
- endoreg_db/views/finding/__init__.py +2 -2
- endoreg_db/views/finding/finding.py +58 -54
- endoreg_db/views/finding/get_classifications.py +1 -1
- endoreg_db/views/finding/get_interventions.py +1 -1
- endoreg_db/views/finding_classification/__init__.py +5 -5
- endoreg_db/views/finding_classification/finding_classification.py +5 -6
- endoreg_db/views/finding_classification/get_classification_choices.py +3 -4
- endoreg_db/views/media/__init__.py +13 -13
- endoreg_db/views/media/pdf_media.py +9 -9
- endoreg_db/views/media/sensitive_metadata.py +10 -7
- endoreg_db/views/media/video_media.py +4 -4
- endoreg_db/views/meta/__init__.py +1 -1
- endoreg_db/views/meta/sensitive_meta_list.py +20 -22
- endoreg_db/views/meta/sensitive_meta_verification.py +14 -11
- endoreg_db/views/misc/__init__.py +6 -34
- endoreg_db/views/misc/center.py +2 -1
- endoreg_db/views/misc/csrf.py +2 -1
- endoreg_db/views/misc/gender.py +2 -1
- endoreg_db/views/misc/stats.py +141 -106
- endoreg_db/views/patient/__init__.py +1 -3
- endoreg_db/views/patient/patient.py +141 -99
- endoreg_db/views/patient_examination/__init__.py +5 -5
- endoreg_db/views/patient_examination/patient_examination.py +43 -42
- endoreg_db/views/patient_examination/patient_examination_create.py +10 -15
- endoreg_db/views/patient_examination/patient_examination_detail.py +12 -15
- endoreg_db/views/patient_examination/patient_examination_list.py +21 -17
- endoreg_db/views/patient_examination/video.py +114 -80
- endoreg_db/views/patient_finding/__init__.py +1 -1
- endoreg_db/views/patient_finding/patient_finding.py +17 -10
- endoreg_db/views/patient_finding/patient_finding_optimized.py +127 -95
- endoreg_db/views/patient_finding_classification/__init__.py +1 -1
- endoreg_db/views/patient_finding_classification/pfc_create.py +35 -27
- endoreg_db/views/report/reimport.py +1 -1
- endoreg_db/views/report/report_stream.py +5 -8
- endoreg_db/views/requirement/__init__.py +2 -1
- endoreg_db/views/requirement/evaluate.py +7 -9
- endoreg_db/views/requirement/lookup.py +2 -3
- endoreg_db/views/requirement/lookup_store.py +0 -1
- endoreg_db/views/requirement/requirement_utils.py +2 -4
- endoreg_db/views/stats/__init__.py +4 -4
- endoreg_db/views/stats/stats_views.py +152 -115
- endoreg_db/views/video/__init__.py +18 -27
- endoreg_db/views/{ai → video/ai}/__init__.py +2 -2
- endoreg_db/views/{ai → video/ai}/label.py +20 -16
- endoreg_db/views/video/correction.py +5 -6
- endoreg_db/views/video/reimport.py +134 -99
- endoreg_db/views/video/segments_crud.py +134 -44
- endoreg_db/views/video/video_apply_mask.py +13 -12
- endoreg_db/views/video/video_correction.py +2 -1
- endoreg_db/views/video/video_download_processed.py +15 -15
- endoreg_db/views/video/video_meta_stats.py +7 -6
- endoreg_db/views/video/video_processing_history.py +3 -2
- endoreg_db/views/video/video_remove_frames.py +13 -12
- endoreg_db/views/video/video_stream.py +110 -82
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/METADATA +9 -3
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/RECORD +434 -431
- endoreg_db/management/commands/import_fallback_video.py +0 -203
- endoreg_db/management/commands/import_video.py +0 -422
- endoreg_db/management/commands/import_video_with_classification.py +0 -367
- endoreg_db/models/media/processing_history/processing_history.py +0 -96
- endoreg_db/serializers/label/__init__.py +0 -7
- endoreg_db/serializers/label_video_segment/_lvs_create.py +0 -149
- endoreg_db/serializers/label_video_segment/_lvs_update.py +0 -138
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +0 -149
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +0 -99
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +0 -163
- endoreg_db/services/__old/pdf_import.py +0 -1487
- endoreg_db/services/__old/video_import.py +0 -1306
- endoreg_db/tasks/upload_tasks.py +0 -216
- endoreg_db/tasks/video_ingest.py +0 -161
- endoreg_db/tasks/video_processing_tasks.py +0 -327
- endoreg_db/views/misc/translation.py +0 -182
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/licenses/LICENSE +0 -0
endoreg_db/tasks/upload_tasks.py
DELETED
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import os
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
|
-
from django.core.files.storage import default_storage
|
|
6
|
-
|
|
7
|
-
from celery_app import shared_task
|
|
8
|
-
from endoreg_db.models import SensitiveMeta, VideoFile
|
|
9
|
-
from endoreg_db.models.upload_job import UploadJob
|
|
10
|
-
|
|
11
|
-
logger = logging.getLogger(__name__)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
@shared_task(bind=True)
|
|
15
|
-
def process_upload_job(self, job_id: str) -> dict:
|
|
16
|
-
"""
|
|
17
|
-
Process an uploaded file (report or video) asynchronously.
|
|
18
|
-
|
|
19
|
-
This task:
|
|
20
|
-
1. Updates job status to 'processing'
|
|
21
|
-
2. Determines file type and routes to appropriate processor
|
|
22
|
-
3. For PDFs: Uses ReportReader to extract metadata and create SensitiveMeta
|
|
23
|
-
4. For videos: Uses VideoFile.create_from_file_initialized() and processing pipeline
|
|
24
|
-
5. Links the created SensitiveMeta to the job and marks as 'anonymized'
|
|
25
|
-
6. On error: marks job as 'error' with details
|
|
26
|
-
|
|
27
|
-
Args:
|
|
28
|
-
job_id: UUID string of the UploadJob to process
|
|
29
|
-
|
|
30
|
-
Returns:
|
|
31
|
-
dict: Processing result with status and details
|
|
32
|
-
"""
|
|
33
|
-
try:
|
|
34
|
-
# Get the upload job
|
|
35
|
-
try:
|
|
36
|
-
upload_job = UploadJob.objects.get(id=job_id)
|
|
37
|
-
except UploadJob.DoesNotExist:
|
|
38
|
-
error_msg = f"UploadJob with id {job_id} not found"
|
|
39
|
-
logger.error(error_msg)
|
|
40
|
-
return {"status": "error", "error": error_msg}
|
|
41
|
-
|
|
42
|
-
# Mark as processing
|
|
43
|
-
upload_job.mark_processing()
|
|
44
|
-
logger.info(f"Started processing upload job {job_id}")
|
|
45
|
-
|
|
46
|
-
# Get file path
|
|
47
|
-
file_path = upload_job.file.path
|
|
48
|
-
if not os.path.exists(file_path):
|
|
49
|
-
error_msg = f"Uploaded file not found at {file_path}"
|
|
50
|
-
upload_job.mark_error(error_msg)
|
|
51
|
-
logger.error(error_msg)
|
|
52
|
-
return {"status": "error", "error": error_msg}
|
|
53
|
-
|
|
54
|
-
# Route to appropriate processor based on content type
|
|
55
|
-
sensitive_meta = None
|
|
56
|
-
|
|
57
|
-
if upload_job.content_type == "application/pdf":
|
|
58
|
-
sensitive_meta = _process_pdf_file(upload_job, file_path)
|
|
59
|
-
elif upload_job.content_type.startswith("video/"):
|
|
60
|
-
sensitive_meta = _process_video_file(upload_job, file_path)
|
|
61
|
-
else:
|
|
62
|
-
error_msg = f"Unsupported content type: {upload_job.content_type}"
|
|
63
|
-
upload_job.mark_error(error_msg)
|
|
64
|
-
logger.error(error_msg)
|
|
65
|
-
return {"status": "error", "error": error_msg}
|
|
66
|
-
|
|
67
|
-
if sensitive_meta:
|
|
68
|
-
# Mark job as completed with the created SensitiveMeta
|
|
69
|
-
upload_job.mark_completed(sensitive_meta)
|
|
70
|
-
logger.info(
|
|
71
|
-
f"Successfully processed upload job {job_id}, created SensitiveMeta {sensitive_meta.id}"
|
|
72
|
-
)
|
|
73
|
-
return {
|
|
74
|
-
"status": "anonymized",
|
|
75
|
-
"sensitive_meta_id": sensitive_meta.id,
|
|
76
|
-
"job_id": job_id,
|
|
77
|
-
}
|
|
78
|
-
else:
|
|
79
|
-
error_msg = "Processing completed but no SensitiveMeta was created"
|
|
80
|
-
upload_job.mark_error(error_msg)
|
|
81
|
-
logger.error(f"Upload job {job_id}: {error_msg}")
|
|
82
|
-
return {"status": "error", "error": error_msg}
|
|
83
|
-
|
|
84
|
-
except Exception as e:
|
|
85
|
-
error_msg = f"Unexpected error processing upload job {job_id}: {str(e)}"
|
|
86
|
-
logger.exception(error_msg)
|
|
87
|
-
|
|
88
|
-
try:
|
|
89
|
-
upload_job = UploadJob.objects.get(id=job_id)
|
|
90
|
-
upload_job.mark_error(error_msg)
|
|
91
|
-
except Exception as inner_e:
|
|
92
|
-
logger.error(f"Failed to update job status after error: {inner_e}")
|
|
93
|
-
|
|
94
|
-
return {"status": "error", "error": error_msg}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
def _process_pdf_file(upload_job: UploadJob, file_path: str) -> Optional[SensitiveMeta]:
|
|
98
|
-
"""
|
|
99
|
-
Process a report file using ReportReader.
|
|
100
|
-
|
|
101
|
-
Args:
|
|
102
|
-
upload_job: The UploadJob instance
|
|
103
|
-
file_path: Path to the uploaded report file
|
|
104
|
-
|
|
105
|
-
Returns:
|
|
106
|
-
SensitiveMeta instance if successful, None otherwise
|
|
107
|
-
"""
|
|
108
|
-
try:
|
|
109
|
-
# Import ReportReader (lazy import to avoid startup issues)
|
|
110
|
-
try:
|
|
111
|
-
from lx_anonymizer.report_reader import ReportReader
|
|
112
|
-
except ImportError as e:
|
|
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
|
-
|
|
119
|
-
# Create ReportReader instance
|
|
120
|
-
reader = ReportReader(locale="de_DE", text_date_format="%d.%m.%Y")
|
|
121
|
-
|
|
122
|
-
# Process the report
|
|
123
|
-
original_text, anonymized_text, metadata = reader.process_report(
|
|
124
|
-
pdf_path=file_path,
|
|
125
|
-
use_ensemble=False, # Can be made configurable
|
|
126
|
-
verbose=False,
|
|
127
|
-
use_llm_extractor=None, # Use default extractor
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
if not metadata:
|
|
131
|
-
raise ValueError("No metadata extracted from report")
|
|
132
|
-
|
|
133
|
-
# Create SensitiveMeta from extracted metadata
|
|
134
|
-
sensitive_meta = SensitiveMeta.create_from_dict(metadata)
|
|
135
|
-
sensitive_meta.save()
|
|
136
|
-
|
|
137
|
-
logger.info(f"Created SensitiveMeta {sensitive_meta.id} from report processing")
|
|
138
|
-
return sensitive_meta
|
|
139
|
-
|
|
140
|
-
except Exception as e:
|
|
141
|
-
logger.exception(f"Error processing report file {file_path}: {e}")
|
|
142
|
-
raise
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
def _process_video_file(
|
|
146
|
-
upload_job: UploadJob, file_path: str
|
|
147
|
-
) -> Optional[SensitiveMeta]:
|
|
148
|
-
"""
|
|
149
|
-
Process a video file using VideoFile creation and processing pipeline.
|
|
150
|
-
|
|
151
|
-
Args:
|
|
152
|
-
upload_job: The UploadJob instance
|
|
153
|
-
file_path: Path to the uploaded video file
|
|
154
|
-
|
|
155
|
-
Returns:
|
|
156
|
-
SensitiveMeta instance if successful, None otherwise
|
|
157
|
-
"""
|
|
158
|
-
try:
|
|
159
|
-
logger.info(f"Processing video file: {file_path}")
|
|
160
|
-
|
|
161
|
-
# Get the relative path for storage
|
|
162
|
-
relative_path = os.path.relpath(file_path, default_storage.location)
|
|
163
|
-
|
|
164
|
-
# Create VideoFile instance using the existing method
|
|
165
|
-
video_file = VideoFile.create_from_file_initialized(
|
|
166
|
-
file_path=relative_path,
|
|
167
|
-
skip_frame_extraction=False, # Extract frames for processing
|
|
168
|
-
skip_meta_extraction=False, # Extract metadata
|
|
169
|
-
)
|
|
170
|
-
|
|
171
|
-
if not video_file:
|
|
172
|
-
raise ValueError("Failed to create VideoFile instance")
|
|
173
|
-
|
|
174
|
-
# Run the video processing pipeline (pipe_1)
|
|
175
|
-
try:
|
|
176
|
-
# Import the processing function
|
|
177
|
-
from endoreg_db.management.commands.import_video import pipe_1
|
|
178
|
-
|
|
179
|
-
# Run processing pipeline
|
|
180
|
-
pipe_1(
|
|
181
|
-
video_file=video_file,
|
|
182
|
-
skip_frame_extraction=False,
|
|
183
|
-
skip_meta_extraction=False,
|
|
184
|
-
skip_anonymization=False,
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
except Exception as e:
|
|
188
|
-
logger.warning(
|
|
189
|
-
f"Video processing pipeline failed, but VideoFile was created: {e}"
|
|
190
|
-
)
|
|
191
|
-
# Continue anyway - we might still have usable metadata
|
|
192
|
-
|
|
193
|
-
# Get the associated SensitiveMeta
|
|
194
|
-
if hasattr(video_file, "sensitive_meta") and video_file.sensitive_meta:
|
|
195
|
-
sensitive_meta = video_file.sensitive_meta
|
|
196
|
-
logger.info(
|
|
197
|
-
f"Found SensitiveMeta {sensitive_meta.id} from video processing"
|
|
198
|
-
)
|
|
199
|
-
return sensitive_meta
|
|
200
|
-
else:
|
|
201
|
-
# Create a basic SensitiveMeta if none exists
|
|
202
|
-
sensitive_meta = SensitiveMeta.objects.create()
|
|
203
|
-
|
|
204
|
-
# Link it to the video if possible
|
|
205
|
-
if hasattr(video_file, "sensitive_meta"):
|
|
206
|
-
video_file.sensitive_meta = sensitive_meta
|
|
207
|
-
video_file.save(update_fields=["sensitive_meta"])
|
|
208
|
-
|
|
209
|
-
logger.info(
|
|
210
|
-
f"Created basic SensitiveMeta {sensitive_meta.id} for video file"
|
|
211
|
-
)
|
|
212
|
-
return sensitive_meta
|
|
213
|
-
|
|
214
|
-
except Exception as e:
|
|
215
|
-
logger.exception(f"Error processing video file {file_path}: {e}")
|
|
216
|
-
raise
|
endoreg_db/tasks/video_ingest.py
DELETED
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Video ingestion tasks using RQ (Redis Queue).
|
|
3
|
-
|
|
4
|
-
This module provides background task processing for video file imports,
|
|
5
|
-
allowing asynchronous processing of video files dropped into the inbox directory.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import logging
|
|
9
|
-
import os
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
from typing import Optional
|
|
12
|
-
|
|
13
|
-
import rq
|
|
14
|
-
import django
|
|
15
|
-
from django.conf import settings
|
|
16
|
-
from django.core.management import call_command
|
|
17
|
-
from redis import Redis
|
|
18
|
-
|
|
19
|
-
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
# Redis connection configuration
|
|
22
|
-
REDIS_URL = os.getenv('RQ_REDIS_URL', 'redis://localhost:6379/0')
|
|
23
|
-
|
|
24
|
-
def get_redis_connection():
|
|
25
|
-
"""Get Redis connection for RQ."""
|
|
26
|
-
try:
|
|
27
|
-
return Redis.from_url(REDIS_URL)
|
|
28
|
-
except Exception as e:
|
|
29
|
-
logger.error(f"Failed to connect to Redis at {REDIS_URL}: {e}")
|
|
30
|
-
raise
|
|
31
|
-
|
|
32
|
-
def get_queue():
|
|
33
|
-
"""Get the 'anonymize' RQ queue."""
|
|
34
|
-
redis_conn = get_redis_connection()
|
|
35
|
-
return rq.Queue('anonymize', connection=redis_conn)
|
|
36
|
-
|
|
37
|
-
def run_import_video(file_path: str, center_name: Optional[str] = None,
|
|
38
|
-
processor_name: Optional[str] = None) -> dict:
|
|
39
|
-
"""
|
|
40
|
-
RQ task to import a video file using the video import service.
|
|
41
|
-
|
|
42
|
-
Args:
|
|
43
|
-
file_path: Path to the video file to import
|
|
44
|
-
center_name: Optional center name (defaults to settings.DEFAULT_CENTER)
|
|
45
|
-
processor_name: Optional processor name (defaults to settings.DEFAULT_PROCESSOR)
|
|
46
|
-
|
|
47
|
-
Returns:
|
|
48
|
-
Dict containing task result status and metadata
|
|
49
|
-
"""
|
|
50
|
-
try:
|
|
51
|
-
# Ensure Django is properly set up
|
|
52
|
-
if not django.apps.apps.ready:
|
|
53
|
-
django.setup()
|
|
54
|
-
|
|
55
|
-
file_path = Path(file_path)
|
|
56
|
-
if not file_path.exists():
|
|
57
|
-
error_msg = f"Video file not found: {file_path}"
|
|
58
|
-
logger.error(error_msg)
|
|
59
|
-
return {
|
|
60
|
-
'status': 'error',
|
|
61
|
-
'message': error_msg,
|
|
62
|
-
'file_path': str(file_path)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
# Use settings defaults if not provided
|
|
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
|
-
|
|
73
|
-
logger.info(f"Starting import for video: {file_path}")
|
|
74
|
-
logger.info(f"Using center: {center_name}, processor: {processor_name}")
|
|
75
|
-
|
|
76
|
-
# Try to use the service first
|
|
77
|
-
try:
|
|
78
|
-
from endoreg_db.services.__old import video_import
|
|
79
|
-
|
|
80
|
-
video_file_obj = video_import.import_and_anonymize(
|
|
81
|
-
file_path=file_path,
|
|
82
|
-
center_name=center_name,
|
|
83
|
-
processor_name=processor_name,
|
|
84
|
-
save_video=True,
|
|
85
|
-
delete_source=True
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
success_msg = f"Successfully imported video: {file_path.name} (UUID: {video_file_obj.uuid})"
|
|
89
|
-
logger.info(success_msg)
|
|
90
|
-
|
|
91
|
-
return {
|
|
92
|
-
'status': 'success',
|
|
93
|
-
'message': success_msg,
|
|
94
|
-
'file_path': str(file_path),
|
|
95
|
-
'video_uuid': str(video_file_obj.uuid),
|
|
96
|
-
'center_name': center_name,
|
|
97
|
-
'processor_name': processor_name
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
except Exception as service_error:
|
|
101
|
-
logger.warning(f"Service import failed: {service_error}, falling back to management command")
|
|
102
|
-
|
|
103
|
-
# Fallback to Django management command
|
|
104
|
-
call_command(
|
|
105
|
-
"import_video",
|
|
106
|
-
str(file_path),
|
|
107
|
-
"--center_name", center_name,
|
|
108
|
-
"--processor_name", processor_name,
|
|
109
|
-
"--save_video_file",
|
|
110
|
-
"--delete_source"
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
success_msg = f"Successfully imported video via fallback: {file_path.name}"
|
|
114
|
-
logger.info(success_msg)
|
|
115
|
-
|
|
116
|
-
return {
|
|
117
|
-
'status': 'success',
|
|
118
|
-
'message': success_msg,
|
|
119
|
-
'file_path': str(file_path),
|
|
120
|
-
'center_name': center_name,
|
|
121
|
-
'processor_name': processor_name,
|
|
122
|
-
'method': 'fallback_command'
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
except Exception as e:
|
|
126
|
-
error_msg = f"Failed to import video {file_path}: {str(e)}"
|
|
127
|
-
logger.error(error_msg, exc_info=True)
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
'status': 'error',
|
|
131
|
-
'message': error_msg,
|
|
132
|
-
'file_path': str(file_path),
|
|
133
|
-
'exception': str(e)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
def enqueue_video_import(file_path: str, center_name: Optional[str] = None,
|
|
137
|
-
processor_name: Optional[str] = None) -> rq.Job:
|
|
138
|
-
"""
|
|
139
|
-
Enqueue a video import task.
|
|
140
|
-
|
|
141
|
-
Args:
|
|
142
|
-
file_path: Path to the video file to import
|
|
143
|
-
center_name: Optional center name
|
|
144
|
-
processor_name: Optional processor name
|
|
145
|
-
|
|
146
|
-
Returns:
|
|
147
|
-
RQ Job instance
|
|
148
|
-
"""
|
|
149
|
-
queue = get_queue()
|
|
150
|
-
|
|
151
|
-
job = queue.enqueue(
|
|
152
|
-
run_import_video,
|
|
153
|
-
file_path,
|
|
154
|
-
center_name,
|
|
155
|
-
processor_name,
|
|
156
|
-
job_timeout='30m', # 30 minute timeout for video processing
|
|
157
|
-
result_ttl=86400 # Keep results for 24 hours
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
logger.info(f"Enqueued video import job {job.id} for file: {file_path}")
|
|
161
|
-
return job
|