endoreg-db 0.8.8.9__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 +146 -83
- 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/migrations/__init__.py +0 -0
- 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 -3
- 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/ffmpeg_wrapper.py +217 -52
- 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.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/METADATA +9 -3
- {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/RECORD +436 -433
- endoreg_db/import_files/processing/video_processing/video_cleanup_on_error.py +0 -119
- 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.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
# endoreg_db/services/video_processing/video_cleanup_on_error.py
|
|
2
|
-
import logging
|
|
3
|
-
import shutil
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
from typing import Any, Dict, MutableSet, Optional
|
|
6
|
-
|
|
7
|
-
logger = logging.getLogger(__name__)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def cleanup_video_on_error(
|
|
11
|
-
*,
|
|
12
|
-
current_video: Any,
|
|
13
|
-
original_file_path: Optional[str | Path],
|
|
14
|
-
processing_context: Dict[str, Any],
|
|
15
|
-
) -> None:
|
|
16
|
-
"""
|
|
17
|
-
Cleanup processing context on error for video imports.
|
|
18
|
-
|
|
19
|
-
This is extracted from VideoImportService._cleanup_on_error and kept as
|
|
20
|
-
close as possible to the original behavior.
|
|
21
|
-
"""
|
|
22
|
-
try:
|
|
23
|
-
if not current_video or not hasattr(current_video, "state"):
|
|
24
|
-
# Nothing we can sensibly do here
|
|
25
|
-
return
|
|
26
|
-
|
|
27
|
-
# Ensure state exists
|
|
28
|
-
if current_video.state is None:
|
|
29
|
-
try:
|
|
30
|
-
current_video.get_or_create_state()
|
|
31
|
-
except Exception as e:
|
|
32
|
-
logger.warning(
|
|
33
|
-
"Video state not found for video %s during error cleanup: %s",
|
|
34
|
-
getattr(current_video, "uuid", None),
|
|
35
|
-
e,
|
|
36
|
-
)
|
|
37
|
-
return
|
|
38
|
-
|
|
39
|
-
current_video.state = current_video.get_or_create_state()
|
|
40
|
-
|
|
41
|
-
# Try to restore original raw file
|
|
42
|
-
try:
|
|
43
|
-
if original_file_path is not None:
|
|
44
|
-
original_path = Path(original_file_path)
|
|
45
|
-
if not original_path.exists():
|
|
46
|
-
raise AssertionError("Original file path does not exist")
|
|
47
|
-
|
|
48
|
-
logger.info("Marked video import as failed in state")
|
|
49
|
-
raw_file_path = getattr(getattr(current_video, "raw_file", None), "path", None)
|
|
50
|
-
if raw_file_path and original_file_path:
|
|
51
|
-
shutil.copy2(str(raw_file_path), str(original_file_path))
|
|
52
|
-
else:
|
|
53
|
-
logger.warning("Cannot restore original raw file: path is None")
|
|
54
|
-
else:
|
|
55
|
-
logger.warning("Original file path is None")
|
|
56
|
-
except AssertionError:
|
|
57
|
-
logger.warning("Original file path does not exist")
|
|
58
|
-
|
|
59
|
-
# Reset state flags if processing had started
|
|
60
|
-
try:
|
|
61
|
-
from endoreg_db.models.state import VideoState # local import to avoid cycles
|
|
62
|
-
|
|
63
|
-
if not isinstance(current_video.state, VideoState):
|
|
64
|
-
logger.error("Current video state is not a VideoState instance during cleanup")
|
|
65
|
-
raise AssertionError
|
|
66
|
-
|
|
67
|
-
if processing_context.get("processing_started"):
|
|
68
|
-
current_video.state.frames_extracted = False
|
|
69
|
-
current_video.state.frames_initialized = False
|
|
70
|
-
current_video.state.video_meta_extracted = False
|
|
71
|
-
current_video.state.text_meta_extracted = False
|
|
72
|
-
current_video.state.save()
|
|
73
|
-
except Exception as e:
|
|
74
|
-
logger.warning("Error during video error cleanup: %s", e)
|
|
75
|
-
except Exception as outer_exc:
|
|
76
|
-
logger.warning("Unexpected error in cleanup_video_on_error: %s", outer_exc)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def cleanup_video_processing_context(
|
|
80
|
-
*,
|
|
81
|
-
processing_context: Dict[str, Any],
|
|
82
|
-
processed_files: MutableSet[str],
|
|
83
|
-
) -> None:
|
|
84
|
-
"""
|
|
85
|
-
Cleanup processing context and release file lock for video imports.
|
|
86
|
-
|
|
87
|
-
Extracted from VideoImportService._cleanup_processing_context.
|
|
88
|
-
"""
|
|
89
|
-
# DEFENSIVE: ensure dict
|
|
90
|
-
if processing_context is None:
|
|
91
|
-
processing_context = {}
|
|
92
|
-
|
|
93
|
-
# Release file lock if it was acquired
|
|
94
|
-
try:
|
|
95
|
-
lock_context = processing_context.get("_lock_context")
|
|
96
|
-
if lock_context is not None:
|
|
97
|
-
try:
|
|
98
|
-
lock_context.__exit__(None, None, None)
|
|
99
|
-
logger.info("Released file lock")
|
|
100
|
-
except Exception as e:
|
|
101
|
-
logger.warning("Error releasing file lock during context cleanup: %s", e)
|
|
102
|
-
except Exception as e:
|
|
103
|
-
logger.warning("Error while handling lock release in context cleanup: %s", e)
|
|
104
|
-
|
|
105
|
-
# Remove file from processed_files set if processing failed
|
|
106
|
-
try:
|
|
107
|
-
file_path = processing_context.get("file_path")
|
|
108
|
-
anonymization_completed = processing_context.get("anonymization_completed")
|
|
109
|
-
|
|
110
|
-
if file_path and not anonymization_completed:
|
|
111
|
-
file_path_str = str(file_path)
|
|
112
|
-
if file_path_str in processed_files:
|
|
113
|
-
processed_files.remove(file_path_str)
|
|
114
|
-
logger.info(
|
|
115
|
-
"Removed %s from processed files (failed processing)",
|
|
116
|
-
file_path_str,
|
|
117
|
-
)
|
|
118
|
-
except Exception as e:
|
|
119
|
-
logger.warning("Error while cleaning processed_files set: %s", e)
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from django.core.management.base import BaseCommand
|
|
3
|
-
from django.db import transaction
|
|
4
|
-
from endoreg_db.models import (
|
|
5
|
-
VideoFile,
|
|
6
|
-
Center,
|
|
7
|
-
Label,
|
|
8
|
-
VideoSegmentationLabelSet,
|
|
9
|
-
VideoSegmentationLabel,
|
|
10
|
-
EndoscopyProcessor
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
class Command(BaseCommand):
|
|
14
|
-
help = 'Import fallback test video and create default labels'
|
|
15
|
-
|
|
16
|
-
def _ensure_default_objects(self):
|
|
17
|
-
"""
|
|
18
|
-
Ensures that default Center and EndoscopyProcessor objects exist, creating them if necessary.
|
|
19
|
-
|
|
20
|
-
Returns:
|
|
21
|
-
tuple: A tuple containing the Center and EndoscopyProcessor objects.
|
|
22
|
-
"""
|
|
23
|
-
center, created = Center.objects.get_or_create(
|
|
24
|
-
name="Default Center",
|
|
25
|
-
defaults={
|
|
26
|
-
'description': 'Fallback center for test videos',
|
|
27
|
-
'location': 'Test Location'
|
|
28
|
-
}
|
|
29
|
-
)
|
|
30
|
-
if created:
|
|
31
|
-
self.stdout.write(f"Created center: {center.name}")
|
|
32
|
-
|
|
33
|
-
processor, created = EndoscopyProcessor.objects.get_or_create(
|
|
34
|
-
name="Default Processor",
|
|
35
|
-
defaults={
|
|
36
|
-
'description': 'Fallback processor for test videos'
|
|
37
|
-
}
|
|
38
|
-
)
|
|
39
|
-
if created:
|
|
40
|
-
self.stdout.write(f"Created processor: {processor.name}")
|
|
41
|
-
|
|
42
|
-
return center, processor
|
|
43
|
-
|
|
44
|
-
def add_arguments(self, parser):
|
|
45
|
-
"""
|
|
46
|
-
Adds the --video-path argument to specify the path of the test video file.
|
|
47
|
-
|
|
48
|
-
This optional argument allows users to provide a custom path to the test video file to be imported. If not specified, a default path is used.
|
|
49
|
-
"""
|
|
50
|
-
parser.add_argument(
|
|
51
|
-
'--video-path',
|
|
52
|
-
type=str,
|
|
53
|
-
default='~/test-data/video/lux-gastro-video.mp4',
|
|
54
|
-
help='Path to the test video file'
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
def handle(self, *args, **options):
|
|
58
|
-
"""
|
|
59
|
-
Handles the import of a test video and setup of default labels for frontend testing.
|
|
60
|
-
|
|
61
|
-
Checks for the existence of the specified video file. If found, ensures default Center and EndoscopyProcessor objects exist, creates default annotation labels, and imports the video into the database. If the video file is missing or import fails, creates fallback database entries to enable frontend testing.
|
|
62
|
-
"""
|
|
63
|
-
video_path_str = options['video_path']
|
|
64
|
-
video_path = Path(video_path_str).expanduser()
|
|
65
|
-
|
|
66
|
-
self.stdout.write(f"Looking for video at: {video_path}")
|
|
67
|
-
|
|
68
|
-
if not video_path.exists():
|
|
69
|
-
self.stdout.write(
|
|
70
|
-
self.style.WARNING(f"Video file not found at {video_path}")
|
|
71
|
-
)
|
|
72
|
-
# Create a fallback entry anyway for frontend testing
|
|
73
|
-
self.create_fallback_entries()
|
|
74
|
-
return
|
|
75
|
-
|
|
76
|
-
# Create or get default center and processor
|
|
77
|
-
center, processor = self._ensure_default_objects()
|
|
78
|
-
|
|
79
|
-
# Create default labels
|
|
80
|
-
self.create_default_labels()
|
|
81
|
-
|
|
82
|
-
# Import the video if it exists
|
|
83
|
-
try:
|
|
84
|
-
video_file = VideoFile.create_from_file_initialized(
|
|
85
|
-
file_path=video_path,
|
|
86
|
-
center_name=center.name,
|
|
87
|
-
processor_name=processor.name
|
|
88
|
-
)
|
|
89
|
-
self.stdout.write(
|
|
90
|
-
self.style.SUCCESS(f"Successfully imported video: {video_file.uuid}")
|
|
91
|
-
)
|
|
92
|
-
except Exception as e:
|
|
93
|
-
self.stdout.write(
|
|
94
|
-
self.style.ERROR(f"Failed to import video: {e}")
|
|
95
|
-
)
|
|
96
|
-
# Create fallback entries for frontend testing
|
|
97
|
-
self.create_fallback_entries()
|
|
98
|
-
|
|
99
|
-
def create_default_labels(self):
|
|
100
|
-
"""
|
|
101
|
-
Creates a default set of video segmentation labels and associates them with a label set.
|
|
102
|
-
|
|
103
|
-
This method ensures that a predefined group of labels, each with multilingual names, colors, and order priorities, exists in the database for endoscopy video annotation. It creates or retrieves both specialized segmentation labels and general labels for compatibility, and links the segmentation labels to a default label set named "Default Endoscopy Labels."
|
|
104
|
-
"""
|
|
105
|
-
|
|
106
|
-
# Create default labelset
|
|
107
|
-
labelset, created = VideoSegmentationLabelSet.objects.get_or_create(
|
|
108
|
-
name="Default Endoscopy Labels",
|
|
109
|
-
defaults={
|
|
110
|
-
'description': 'Default labels for endoscopy video annotation'
|
|
111
|
-
}
|
|
112
|
-
)
|
|
113
|
-
if created:
|
|
114
|
-
self.stdout.write(f"Created labelset: {labelset.name}")
|
|
115
|
-
|
|
116
|
-
# Fetch existing labels in the labelset to avoid N+1 queries
|
|
117
|
-
existing_labels_in_set = set(labelset.labels.values_list('pk', flat=True))
|
|
118
|
-
|
|
119
|
-
# Default labels for endoscopy
|
|
120
|
-
default_labels = [
|
|
121
|
-
{'name': 'outside', 'name_de': 'Außerhalb', 'name_en': 'Outside', 'color': '#00bcd4', 'order_priority': 1},
|
|
122
|
-
{'name': 'appendix', 'name_de': 'Appendix', 'name_en': 'Appendix', 'color': '#ff9800', 'order_priority': 2},
|
|
123
|
-
{'name': 'blood', 'name_de': 'Blut', 'name_en': 'Blood', 'color': '#f44336', 'order_priority': 3},
|
|
124
|
-
{'name': 'diverticule', 'name_de': 'Divertikel', 'name_en': 'Diverticule', 'color': '#9c27b0', 'order_priority': 4},
|
|
125
|
-
{'name': 'grasper', 'name_de': 'Greifer', 'name_en': 'Grasper', 'color': '#CBEDCA', 'order_priority': 5},
|
|
126
|
-
{'name': 'ileocaecalvalve', 'name_de': 'Ileozäkalklappe', 'name_en': 'Ileocaecal Valve', 'color': '#3f51b5', 'order_priority': 6},
|
|
127
|
-
{'name': 'ileum', 'name_de': 'Ileum', 'name_en': 'Ileum', 'color': '#2196f3', 'order_priority': 7},
|
|
128
|
-
{'name': 'low_quality', 'name_de': 'Niedrige Bildqualität', 'name_en': 'Low Quality', 'color': '#9e9e9e', 'order_priority': 8},
|
|
129
|
-
{'name': 'nbi', 'name_de': 'Narrow Band Imaging', 'name_en': 'NBI', 'color': '#795548', 'order_priority': 9},
|
|
130
|
-
{'name': 'needle', 'name_de': 'Nadel', 'name_en': 'Needle', 'color': '#e91e63', 'order_priority': 10},
|
|
131
|
-
{'name': 'polyp', 'name_de': 'Polyp', 'name_en': 'Polyp', 'color': '#8bc34a', 'order_priority': 11},
|
|
132
|
-
{'name': 'snare', 'name_de': 'Snare', 'name_en': 'Snare', 'color': '#ff5722', 'order_priority': 12},
|
|
133
|
-
{'name': 'water_jet', 'name_de': 'Wasserstrahl', 'name_en': 'Water Jet', 'color': '#03a9f4', 'order_priority': 13},
|
|
134
|
-
{'name': 'wound', 'name_de': 'Wunde', 'name_en': 'Wound', 'color': '#607d8b', 'order_priority': 14},
|
|
135
|
-
]
|
|
136
|
-
|
|
137
|
-
for label_data in default_labels:
|
|
138
|
-
# Create VideoSegmentationLabel
|
|
139
|
-
vs_label, created = VideoSegmentationLabel.objects.get_or_create(
|
|
140
|
-
name=label_data['name'],
|
|
141
|
-
defaults={
|
|
142
|
-
'name_de': label_data['name_de'],
|
|
143
|
-
'name_en': label_data['name_en'],
|
|
144
|
-
'color': label_data['color'],
|
|
145
|
-
'order_priority': label_data['order_priority'],
|
|
146
|
-
'description': f"Default {label_data['name_en']} label"
|
|
147
|
-
}
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
# Create general Label (for compatibility)
|
|
151
|
-
general_label, created = Label.objects.get_or_create(
|
|
152
|
-
name=label_data['name'],
|
|
153
|
-
defaults={
|
|
154
|
-
'description': f"Default {label_data['name_en']} label"
|
|
155
|
-
}
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
if created:
|
|
159
|
-
self.stdout.write(f"Created label: {label_data['name']}")
|
|
160
|
-
|
|
161
|
-
# Link to labelset
|
|
162
|
-
if vs_label.pk not in existing_labels_in_set:
|
|
163
|
-
labelset.labels.add(vs_label)
|
|
164
|
-
existing_labels_in_set.add(vs_label.pk) # Keep the set in sync
|
|
165
|
-
|
|
166
|
-
labelset.save()
|
|
167
|
-
self.stdout.write(f"Labelset configured with {labelset.labels.count()} labels")
|
|
168
|
-
|
|
169
|
-
def create_fallback_entries(self):
|
|
170
|
-
"""
|
|
171
|
-
Creates fallback database entries for testing when the video file is unavailable.
|
|
172
|
-
|
|
173
|
-
This method ensures that default annotation labels, a default center, and a default endoscopy processor exist. If a fallback video entry named "lux-gastro-video.mp4" does not already exist, it creates a minimal `VideoFile` record with preset metadata and initializes its state and frame directory for frontend testing.
|
|
174
|
-
"""
|
|
175
|
-
with transaction.atomic():
|
|
176
|
-
# Create default labels anyway
|
|
177
|
-
self.create_default_labels()
|
|
178
|
-
|
|
179
|
-
# Create a placeholder VideoFile entry for frontend testing
|
|
180
|
-
center, processor = self._ensure_default_objects()
|
|
181
|
-
|
|
182
|
-
# Check if we already have a fallback video
|
|
183
|
-
if not VideoFile.objects.filter(original_file_name="lux-gastro-video.mp4").exists():
|
|
184
|
-
# Create a minimal VideoFile entry for frontend testing
|
|
185
|
-
video_file = VideoFile.objects.create(
|
|
186
|
-
original_file_name="lux-gastro-video.mp4",
|
|
187
|
-
video_hash="fallback_hash_12345",
|
|
188
|
-
center=center,
|
|
189
|
-
processor=processor,
|
|
190
|
-
fps=30.0,
|
|
191
|
-
duration=120.0, # 2 minutes fallback
|
|
192
|
-
frame_count=3600,
|
|
193
|
-
width=1920,
|
|
194
|
-
height=1080
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
# Initialize the video file
|
|
198
|
-
video_file.get_or_create_state()
|
|
199
|
-
video_file.set_frame_dir()
|
|
200
|
-
|
|
201
|
-
self.stdout.write(
|
|
202
|
-
self.style.SUCCESS(f"Created fallback video entry: {video_file.uuid}")
|
|
203
|
-
)
|