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
|
@@ -4,20 +4,21 @@ Statistics views for the endoreg_db API.
|
|
|
4
4
|
Provides dashboard statistics for the frontend including examination stats,
|
|
5
5
|
video segment stats, sensitive meta stats, and general overview stats.
|
|
6
6
|
"""
|
|
7
|
+
|
|
7
8
|
from rest_framework.views import APIView
|
|
8
9
|
from rest_framework.response import Response
|
|
9
10
|
from rest_framework import status
|
|
10
|
-
from django.db.models import Count
|
|
11
|
+
from django.db.models import Count
|
|
11
12
|
from django.utils import timezone
|
|
12
13
|
from datetime import timedelta
|
|
13
14
|
|
|
14
15
|
from ...models import (
|
|
15
|
-
VideoFile,
|
|
16
|
-
LabelVideoSegment,
|
|
17
|
-
SensitiveMeta,
|
|
16
|
+
VideoFile,
|
|
17
|
+
LabelVideoSegment,
|
|
18
|
+
SensitiveMeta,
|
|
18
19
|
Examination,
|
|
19
20
|
PatientExamination,
|
|
20
|
-
Label
|
|
21
|
+
Label,
|
|
21
22
|
)
|
|
22
23
|
from ...utils.permissions import EnvironmentAwarePermission
|
|
23
24
|
|
|
@@ -25,11 +26,12 @@ from ...utils.permissions import EnvironmentAwarePermission
|
|
|
25
26
|
class ExaminationStatsView(APIView):
|
|
26
27
|
"""
|
|
27
28
|
Statistics about examinations and patient examinations.
|
|
28
|
-
|
|
29
|
+
|
|
29
30
|
GET /api/examinations/stats/
|
|
30
31
|
"""
|
|
32
|
+
|
|
31
33
|
permission_classes = [EnvironmentAwarePermission]
|
|
32
|
-
|
|
34
|
+
|
|
33
35
|
def get(self, request):
|
|
34
36
|
"""
|
|
35
37
|
Returns statistics about examinations including total counts,
|
|
@@ -39,40 +41,51 @@ class ExaminationStatsView(APIView):
|
|
|
39
41
|
# Total examination counts
|
|
40
42
|
total_examinations = Examination.objects.count()
|
|
41
43
|
total_patient_examinations = PatientExamination.objects.count()
|
|
42
|
-
|
|
44
|
+
|
|
43
45
|
# Recent activity (last 30 days)
|
|
44
46
|
thirty_days_ago = timezone.now() - timedelta(days=30)
|
|
45
|
-
recent_examinations =
|
|
46
|
-
created_at__gte=thirty_days_ago
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
recent_examinations = (
|
|
48
|
+
Examination.objects.filter(created_at__gte=thirty_days_ago).count()
|
|
49
|
+
if hasattr(Examination, "created_at")
|
|
50
|
+
else 0
|
|
51
|
+
)
|
|
52
|
+
|
|
49
53
|
# Status distribution for patient examinations
|
|
50
|
-
status_distribution =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
54
|
+
status_distribution = (
|
|
55
|
+
PatientExamination.objects.values("status")
|
|
56
|
+
.annotate(count=Count("id"))
|
|
57
|
+
.order_by("status")
|
|
58
|
+
if hasattr(PatientExamination, "status")
|
|
59
|
+
else []
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
return Response(
|
|
63
|
+
{
|
|
64
|
+
"total_examinations": total_examinations,
|
|
65
|
+
"total_patient_examinations": total_patient_examinations,
|
|
66
|
+
"recent_examinations": recent_examinations,
|
|
67
|
+
"status_distribution": list(status_distribution),
|
|
68
|
+
},
|
|
69
|
+
status=status.HTTP_200_OK,
|
|
70
|
+
)
|
|
71
|
+
|
|
61
72
|
except Exception as e:
|
|
62
|
-
return Response(
|
|
63
|
-
|
|
64
|
-
|
|
73
|
+
return Response(
|
|
74
|
+
{"error": f"Failed to retrieve examination stats: {str(e)}"},
|
|
75
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
76
|
+
)
|
|
65
77
|
|
|
66
78
|
|
|
67
79
|
class VideoSegmentStatsView(APIView):
|
|
68
80
|
"""
|
|
69
81
|
Statistics about video segments and label distribution.
|
|
70
|
-
|
|
82
|
+
|
|
71
83
|
GET /api/video-segment/stats/
|
|
72
84
|
GET /api/video-segments/stats/
|
|
73
85
|
"""
|
|
86
|
+
|
|
74
87
|
permission_classes = [EnvironmentAwarePermission]
|
|
75
|
-
|
|
88
|
+
|
|
76
89
|
def get(self, request):
|
|
77
90
|
"""
|
|
78
91
|
Returns statistics about video segments including total counts,
|
|
@@ -81,49 +94,58 @@ class VideoSegmentStatsView(APIView):
|
|
|
81
94
|
try:
|
|
82
95
|
# Total segment counts
|
|
83
96
|
total_segments = LabelVideoSegment.objects.count()
|
|
84
|
-
total_videos_with_segments =
|
|
85
|
-
labelvideosegment__isnull=False
|
|
86
|
-
|
|
87
|
-
|
|
97
|
+
total_videos_with_segments = (
|
|
98
|
+
VideoFile.objects.filter(labelvideosegment__isnull=False)
|
|
99
|
+
.distinct()
|
|
100
|
+
.count()
|
|
101
|
+
)
|
|
102
|
+
|
|
88
103
|
# Label distribution
|
|
89
|
-
label_distribution =
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
count
|
|
93
|
-
)
|
|
94
|
-
|
|
104
|
+
label_distribution = (
|
|
105
|
+
LabelVideoSegment.objects.values("label__name")
|
|
106
|
+
.annotate(count=Count("id"))
|
|
107
|
+
.order_by("-count")
|
|
108
|
+
)
|
|
109
|
+
|
|
95
110
|
# Videos without segments
|
|
96
111
|
videos_without_segments = VideoFile.objects.filter(
|
|
97
112
|
labelvideosegment__isnull=True
|
|
98
113
|
).count()
|
|
99
|
-
|
|
114
|
+
|
|
100
115
|
# Average segments per video
|
|
101
116
|
avg_segments_per_video = 0
|
|
102
117
|
if total_videos_with_segments > 0:
|
|
103
|
-
avg_segments_per_video = round(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
118
|
+
avg_segments_per_video = round(
|
|
119
|
+
total_segments / total_videos_with_segments, 2
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
return Response(
|
|
123
|
+
{
|
|
124
|
+
"total_segments": total_segments,
|
|
125
|
+
"total_videos_with_segments": total_videos_with_segments,
|
|
126
|
+
"videos_without_segments": videos_without_segments,
|
|
127
|
+
"avg_segments_per_video": avg_segments_per_video,
|
|
128
|
+
"label_distribution": list(label_distribution),
|
|
129
|
+
},
|
|
130
|
+
status=status.HTTP_200_OK,
|
|
131
|
+
)
|
|
132
|
+
|
|
113
133
|
except Exception as e:
|
|
114
|
-
return Response(
|
|
115
|
-
|
|
116
|
-
|
|
134
|
+
return Response(
|
|
135
|
+
{"error": f"Failed to retrieve video segment stats: {str(e)}"},
|
|
136
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
137
|
+
)
|
|
117
138
|
|
|
118
139
|
|
|
119
140
|
class SensitiveMetaStatsView(APIView):
|
|
120
141
|
"""
|
|
121
142
|
Statistics about sensitive metadata entries and verification status.
|
|
122
|
-
|
|
143
|
+
|
|
123
144
|
GET /api/video/sensitivemeta/stats/
|
|
124
145
|
"""
|
|
146
|
+
|
|
125
147
|
permission_classes = [EnvironmentAwarePermission]
|
|
126
|
-
|
|
148
|
+
|
|
127
149
|
def get(self, request):
|
|
128
150
|
"""
|
|
129
151
|
Returns statistics about sensitive metadata including verification status,
|
|
@@ -132,50 +154,57 @@ class SensitiveMetaStatsView(APIView):
|
|
|
132
154
|
try:
|
|
133
155
|
# Total sensitive meta entries
|
|
134
156
|
total_sensitive_meta = SensitiveMeta.objects.count()
|
|
135
|
-
|
|
157
|
+
|
|
136
158
|
# Verification status distribution
|
|
137
|
-
verified_count =
|
|
138
|
-
verified=True
|
|
139
|
-
|
|
140
|
-
|
|
159
|
+
verified_count = (
|
|
160
|
+
SensitiveMeta.objects.filter(verified=True).count()
|
|
161
|
+
if hasattr(SensitiveMeta, "verified")
|
|
162
|
+
else 0
|
|
163
|
+
)
|
|
164
|
+
|
|
141
165
|
unverified_count = total_sensitive_meta - verified_count
|
|
142
|
-
|
|
166
|
+
|
|
143
167
|
# Videos with sensitive data
|
|
144
|
-
videos_with_sensitive_data =
|
|
145
|
-
sensitivemeta__isnull=False
|
|
146
|
-
)
|
|
147
|
-
|
|
168
|
+
videos_with_sensitive_data = (
|
|
169
|
+
VideoFile.objects.filter(sensitivemeta__isnull=False).distinct().count()
|
|
170
|
+
)
|
|
171
|
+
|
|
148
172
|
# Type distribution (if available)
|
|
149
173
|
type_distribution = []
|
|
150
|
-
if hasattr(SensitiveMeta,
|
|
151
|
-
type_distribution =
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
count
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
return Response(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
174
|
+
if hasattr(SensitiveMeta, "meta_type"):
|
|
175
|
+
type_distribution = (
|
|
176
|
+
SensitiveMeta.objects.values("meta_type")
|
|
177
|
+
.annotate(count=Count("id"))
|
|
178
|
+
.order_by("-count")
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
return Response(
|
|
182
|
+
{
|
|
183
|
+
"total_sensitive_meta": total_sensitive_meta,
|
|
184
|
+
"verified_count": verified_count,
|
|
185
|
+
"unverified_count": unverified_count,
|
|
186
|
+
"videos_with_sensitive_data": videos_with_sensitive_data,
|
|
187
|
+
"type_distribution": list(type_distribution),
|
|
188
|
+
},
|
|
189
|
+
status=status.HTTP_200_OK,
|
|
190
|
+
)
|
|
191
|
+
|
|
165
192
|
except Exception as e:
|
|
166
|
-
return Response(
|
|
167
|
-
|
|
168
|
-
|
|
193
|
+
return Response(
|
|
194
|
+
{"error": f"Failed to retrieve sensitive meta stats: {str(e)}"},
|
|
195
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
196
|
+
)
|
|
169
197
|
|
|
170
198
|
|
|
171
199
|
class GeneralStatsView(APIView):
|
|
172
200
|
"""
|
|
173
201
|
General dashboard statistics providing an overview of the system.
|
|
174
|
-
|
|
202
|
+
|
|
175
203
|
GET /api/stats/
|
|
176
204
|
"""
|
|
205
|
+
|
|
177
206
|
permission_classes = [EnvironmentAwarePermission]
|
|
178
|
-
|
|
207
|
+
|
|
179
208
|
def get(self, request):
|
|
180
209
|
"""
|
|
181
210
|
Returns general overview statistics for the dashboard including
|
|
@@ -188,42 +217,50 @@ class GeneralStatsView(APIView):
|
|
|
188
217
|
total_segments = LabelVideoSegment.objects.count()
|
|
189
218
|
total_examinations = Examination.objects.count()
|
|
190
219
|
total_sensitive_meta = SensitiveMeta.objects.count()
|
|
191
|
-
|
|
220
|
+
|
|
192
221
|
# Processing status
|
|
193
|
-
videos_with_segments =
|
|
194
|
-
labelvideosegment__isnull=False
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
222
|
+
videos_with_segments = (
|
|
223
|
+
VideoFile.objects.filter(labelvideosegment__isnull=False)
|
|
224
|
+
.distinct()
|
|
225
|
+
.count()
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
videos_with_sensitive_data = (
|
|
229
|
+
VideoFile.objects.filter(sensitivemeta__isnull=False).distinct().count()
|
|
230
|
+
)
|
|
231
|
+
|
|
201
232
|
# Calculate percentages
|
|
202
233
|
segment_coverage = 0
|
|
203
234
|
sensitive_data_coverage = 0
|
|
204
235
|
if total_videos > 0:
|
|
205
236
|
segment_coverage = round((videos_with_segments / total_videos) * 100, 1)
|
|
206
|
-
sensitive_data_coverage = round(
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
237
|
+
sensitive_data_coverage = round(
|
|
238
|
+
(videos_with_sensitive_data / total_videos) * 100, 1
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
return Response(
|
|
242
|
+
{
|
|
243
|
+
"totals": {
|
|
244
|
+
"videos": total_videos,
|
|
245
|
+
"labels": total_labels,
|
|
246
|
+
"segments": total_segments,
|
|
247
|
+
"examinations": total_examinations,
|
|
248
|
+
"sensitive_meta": total_sensitive_meta,
|
|
249
|
+
},
|
|
250
|
+
"coverage": {
|
|
251
|
+
"segment_coverage_percent": segment_coverage,
|
|
252
|
+
"sensitive_data_coverage_percent": sensitive_data_coverage,
|
|
253
|
+
},
|
|
254
|
+
"processing_status": {
|
|
255
|
+
"videos_with_segments": videos_with_segments,
|
|
256
|
+
"videos_with_sensitive_data": videos_with_sensitive_data,
|
|
257
|
+
},
|
|
219
258
|
},
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
}, status=status.HTTP_200_OK)
|
|
225
|
-
|
|
259
|
+
status=status.HTTP_200_OK,
|
|
260
|
+
)
|
|
261
|
+
|
|
226
262
|
except Exception as e:
|
|
227
|
-
return Response(
|
|
228
|
-
|
|
229
|
-
|
|
263
|
+
return Response(
|
|
264
|
+
{"error": f"Failed to retrieve general stats: {str(e)}"},
|
|
265
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
266
|
+
)
|
|
@@ -7,9 +7,7 @@ from .correction import (
|
|
|
7
7
|
|
|
8
8
|
from ..media.video_media import VideoMediaView
|
|
9
9
|
|
|
10
|
-
from .reimport import
|
|
11
|
-
VideoReimportView
|
|
12
|
-
)
|
|
10
|
+
from .reimport import VideoReimportView
|
|
13
11
|
from .video_stream import VideoStreamView
|
|
14
12
|
from .video_examination_viewset import VideoExaminationViewSet
|
|
15
13
|
from .video_meta_stats import VideoMetadataStatsView
|
|
@@ -24,35 +22,28 @@ from .segments_crud import (
|
|
|
24
22
|
video_segments_validate_bulk,
|
|
25
23
|
video_segments_validation_status,
|
|
26
24
|
)
|
|
27
|
-
from
|
|
25
|
+
from .ai.label import label_list
|
|
28
26
|
|
|
29
27
|
__all__ = [
|
|
30
28
|
# Video Correction (Phase 1.1) - Implemented
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
'VideoCorrectionView',
|
|
39
|
-
|
|
29
|
+
"VideoProcessingHistoryView",
|
|
30
|
+
"VideoApplyMaskView",
|
|
31
|
+
"VideoRemoveFramesView",
|
|
32
|
+
"VideoMetadataStatsView",
|
|
33
|
+
"VideoMediaView",
|
|
34
|
+
"VideoCorrectionView",
|
|
40
35
|
# Reimport views
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
"VideoReimportView",
|
|
43
37
|
# Segmentation views
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
"VideoStreamView",
|
|
46
39
|
# Video Examination ViewSet
|
|
47
40
|
"VideoExaminationViewSet",
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
'label_list',
|
|
41
|
+
"video_segments_collection",
|
|
42
|
+
"video_segments_by_video",
|
|
43
|
+
"video_segment_detail",
|
|
44
|
+
"video_segments_stats",
|
|
45
|
+
"video_segment_validate",
|
|
46
|
+
"video_segments_validate_bulk",
|
|
47
|
+
"video_segments_validation_status",
|
|
48
|
+
"label_list",
|
|
58
49
|
]
|
|
@@ -5,7 +5,7 @@ from rest_framework.response import Response
|
|
|
5
5
|
from rest_framework import status
|
|
6
6
|
|
|
7
7
|
from endoreg_db.models import Label
|
|
8
|
-
from endoreg_db.serializers.
|
|
8
|
+
from endoreg_db.serializers.label_video_segment.label import LabelSerializer
|
|
9
9
|
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
10
10
|
# from rest_framework.permissions import IsAuthenticated
|
|
11
11
|
# from endoreg_db.authz.permissions import PolicyPermission
|
|
@@ -38,6 +38,7 @@ def label_list(request) -> Response:
|
|
|
38
38
|
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
39
39
|
)
|
|
40
40
|
|
|
41
|
+
|
|
41
42
|
@api_view(["POST"])
|
|
42
43
|
@permission_classes([EnvironmentAwarePermission])
|
|
43
44
|
def add_label(request) -> Response:
|
|
@@ -53,7 +54,9 @@ def add_label(request) -> Response:
|
|
|
53
54
|
|
|
54
55
|
return Response(
|
|
55
56
|
{
|
|
56
|
-
"success": "label added to database"
|
|
57
|
+
"success": "label added to database"
|
|
58
|
+
if created
|
|
59
|
+
else "label already existed",
|
|
57
60
|
"id": label.id,
|
|
58
61
|
"name": label.name,
|
|
59
62
|
},
|
|
@@ -80,12 +83,11 @@ def delete_label(request) -> Response:
|
|
|
80
83
|
if isinstance(Label.get_or_create_from_name(name), Label):
|
|
81
84
|
return Response(
|
|
82
85
|
{"error": "Field not deleted"},
|
|
83
|
-
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
86
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
84
87
|
)
|
|
85
88
|
else:
|
|
86
89
|
return Response(
|
|
87
|
-
{"success": f"label {name} deleted"},
|
|
88
|
-
status=status.HTTP_200_OK
|
|
90
|
+
{"success": f"label {name} deleted"}, status=status.HTTP_200_OK
|
|
89
91
|
)
|
|
90
92
|
except Exception as e:
|
|
91
93
|
logger.error(f"Error creating label: {e}")
|
|
@@ -111,16 +113,16 @@ def update_label(request) -> Response:
|
|
|
111
113
|
new_name = request.data.get("name")
|
|
112
114
|
|
|
113
115
|
if not name_old:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
return Response(
|
|
117
|
+
{"error": "Field 'name_old' is required"},
|
|
118
|
+
status=status.HTTP_400_BAD_REQUEST,
|
|
119
|
+
)
|
|
118
120
|
|
|
119
121
|
if not new_name:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
return Response(
|
|
123
|
+
{"error": "Field 'name' is required"},
|
|
124
|
+
status=status.HTTP_400_BAD_REQUEST,
|
|
125
|
+
)
|
|
124
126
|
|
|
125
127
|
try:
|
|
126
128
|
try:
|
|
@@ -142,9 +144,11 @@ def update_label(request) -> Response:
|
|
|
142
144
|
label.save()
|
|
143
145
|
|
|
144
146
|
return Response(
|
|
145
|
-
{
|
|
146
|
-
|
|
147
|
-
|
|
147
|
+
{
|
|
148
|
+
"success": f"Label '{name_old}' renamed to '{new_name}'",
|
|
149
|
+
"id": label.id,
|
|
150
|
+
"name": label.name,
|
|
151
|
+
},
|
|
148
152
|
status=status.HTTP_200_OK,
|
|
149
153
|
)
|
|
150
154
|
except Exception as e:
|
|
@@ -31,7 +31,7 @@ from endoreg_db.models import (
|
|
|
31
31
|
)
|
|
32
32
|
from endoreg_db.serializers import VideoMetaSerializer, VideoProcessingHistorySerializer
|
|
33
33
|
from endoreg_db.serializers.video.video_file_detail import VideoDetailSerializer
|
|
34
|
-
from endoreg_db.utils.paths import ANONYM_VIDEO_DIR
|
|
34
|
+
from endoreg_db.utils.paths import ANONYM_VIDEO_DIR
|
|
35
35
|
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
36
36
|
|
|
37
37
|
logger = logging.getLogger(__name__)
|
|
@@ -123,7 +123,7 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
|
|
|
123
123
|
# Delete segment if all frames were removed
|
|
124
124
|
if new_start >= new_end:
|
|
125
125
|
logger.info(
|
|
126
|
-
f"Deleting segment {segment.
|
|
126
|
+
f"Deleting segment {segment.pk} (original: {original_start}-{original_end}) "
|
|
127
127
|
f"- all {frames_within} frames removed"
|
|
128
128
|
)
|
|
129
129
|
segment.delete()
|
|
@@ -131,7 +131,7 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
|
|
|
131
131
|
elif new_start != original_start or new_end != original_end:
|
|
132
132
|
# Update segment boundaries
|
|
133
133
|
logger.info(
|
|
134
|
-
f"Updating segment {segment.
|
|
134
|
+
f"Updating segment {segment.pk}: "
|
|
135
135
|
f"{original_start}-{original_end} → {new_start}-{new_end} "
|
|
136
136
|
f"(before: {frames_before}, within: {frames_within})"
|
|
137
137
|
)
|
|
@@ -144,7 +144,7 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
|
|
|
144
144
|
segments_unchanged += 1
|
|
145
145
|
|
|
146
146
|
logger.info(
|
|
147
|
-
f"Segment update complete for video {video.
|
|
147
|
+
f"Segment update complete for video {video.pk}: "
|
|
148
148
|
f"{segments_updated} updated, {segments_deleted} deleted, {segments_unchanged} unchanged"
|
|
149
149
|
)
|
|
150
150
|
|
|
@@ -336,7 +336,6 @@ class VideoApplyMaskView(APIView):
|
|
|
336
336
|
|
|
337
337
|
if success:
|
|
338
338
|
# Update video record with anonymized file
|
|
339
|
-
from django.core.files import File
|
|
340
339
|
|
|
341
340
|
processed_file_path = output_path
|
|
342
341
|
update_processed_file(video, processed_file_path)
|
|
@@ -472,7 +471,7 @@ class VideoRemoveFramesView(APIView):
|
|
|
472
471
|
output_path = (
|
|
473
472
|
Path(settings.MEDIA_ROOT)
|
|
474
473
|
/ "anonym_videos"
|
|
475
|
-
/ f"{video.
|
|
474
|
+
/ f"{video.video_hash}_cleaned.mp4"
|
|
476
475
|
)
|
|
477
476
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
478
477
|
|