endoreg-db 0.8.6.1__py3-none-any.whl → 0.8.8.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/authz/auth.py +74 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +18 -0
- endoreg_db/authz/middleware.py +83 -0
- endoreg_db/authz/permissions.py +127 -0
- endoreg_db/authz/policy.py +218 -0
- endoreg_db/authz/views_auth.py +66 -0
- endoreg_db/config/env.py +13 -8
- endoreg_db/data/__init__.py +2 -11
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +3 -3
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +114 -14
- endoreg_db/data/examination/time-type/data.yaml +0 -3
- endoreg_db/data/examination_indication/endoscopy.yaml +108 -173
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +0 -70
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +33 -37
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/{yes_no_na.yaml → 00_generic.yaml} +5 -1
- endoreg_db/data/finding_classification_choice/{examination_setting_generic_types.yaml → 00_generic_baseline.yaml} +10 -2
- endoreg_db/data/finding_classification_choice/{complication_generic_types.yaml → 00_generic_complication.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology.yaml → 00_generic_histology.yaml} +1 -4
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/{bowel_preparation.yaml → 02_colonoscopy_bowel_preparation.yaml} +1 -30
- endoreg_db/data/finding_classification_choice/{colonoscopy_not_complete_reason.yaml → 02_colonoscopy_generic.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{colonoscopy_location.yaml → 02_colonoscopy_location.yaml} +23 -4
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/{colon_lesion_paris.yaml → 02_colonoscopy_polyp_morphology.yaml} +26 -8
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/{colonoscopy_basic.yaml → 00_generic.yaml} +18 -13
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_type/data.yaml +8 -12
- endoreg_db/data/requirement/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +29 -12
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/{endoscopy_bleeding_risk.yaml → 02_endoscopy_bleeding_risk.yaml} +0 -6
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set_type/data.yaml +21 -0
- endoreg_db/data/setup_config.yaml +4 -4
- endoreg_db/data/tag/requirement_set_tags.yaml +21 -0
- endoreg_db/exceptions.py +4 -2
- endoreg_db/forms/examination_form.py +1 -1
- endoreg_db/helpers/data_loader.py +125 -53
- endoreg_db/helpers/default_objects.py +116 -81
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +81 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +43 -0
- endoreg_db/import_files/context/validate_directories.py +56 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +76 -0
- endoreg_db/import_files/file_storage/create_video_file.py +75 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +39 -0
- endoreg_db/import_files/file_storage/state_management.py +400 -0
- endoreg_db/import_files/file_storage/storage.py +36 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +94 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/processing/video_processing/video_cleanup_on_error.py +119 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +182 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +128 -0
- endoreg_db/import_files/report_import_service.py +141 -0
- endoreg_db/import_files/video_import_service.py +150 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +21 -10
- endoreg_db/management/commands/create_multilabel_model_meta.py +299 -129
- endoreg_db/management/commands/import_report.py +130 -65
- endoreg_db/management/commands/import_video.py +9 -10
- endoreg_db/management/commands/import_video_with_classification.py +2 -2
- endoreg_db/management/commands/list_routes.py +18 -0
- endoreg_db/management/commands/load_ai_model_data.py +5 -5
- endoreg_db/management/commands/load_ai_model_label_data.py +9 -7
- endoreg_db/management/commands/load_base_db_data.py +5 -134
- endoreg_db/management/commands/load_center_data.py +12 -12
- endoreg_db/management/commands/load_contraindication_data.py +14 -16
- endoreg_db/management/commands/load_disease_classification_choices_data.py +15 -18
- endoreg_db/management/commands/load_disease_classification_data.py +15 -18
- endoreg_db/management/commands/load_disease_data.py +25 -28
- endoreg_db/management/commands/load_endoscope_data.py +20 -27
- endoreg_db/management/commands/load_event_data.py +14 -16
- endoreg_db/management/commands/load_examination_data.py +31 -44
- endoreg_db/management/commands/load_examination_indication_data.py +20 -21
- endoreg_db/management/commands/load_finding_data.py +52 -80
- endoreg_db/management/commands/load_information_source.py +21 -23
- endoreg_db/management/commands/load_lab_value_data.py +17 -26
- endoreg_db/management/commands/load_medication_data.py +13 -12
- endoreg_db/management/commands/load_organ_data.py +15 -19
- endoreg_db/management/commands/load_pdf_type_data.py +19 -18
- endoreg_db/management/commands/load_profession_data.py +14 -17
- endoreg_db/management/commands/load_qualification_data.py +20 -23
- endoreg_db/management/commands/load_report_reader_flag_data.py +17 -19
- endoreg_db/management/commands/load_requirement_data.py +62 -39
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +7 -6
- endoreg_db/management/commands/load_shift_data.py +20 -23
- endoreg_db/management/commands/load_tag_data.py +8 -11
- endoreg_db/management/commands/load_unit_data.py +17 -19
- endoreg_db/management/commands/setup_endoreg_db.py +3 -3
- endoreg_db/management/commands/start_filewatcher.py +46 -37
- endoreg_db/management/commands/storage_management.py +271 -203
- endoreg_db/management/commands/validate_video_files.py +1 -5
- endoreg_db/migrations/0001_initial.py +297 -250
- endoreg_db/models/__init__.py +78 -123
- endoreg_db/models/administration/__init__.py +21 -42
- endoreg_db/models/administration/ai/active_model.py +2 -2
- endoreg_db/models/administration/ai/ai_model.py +7 -6
- endoreg_db/models/administration/case/__init__.py +1 -15
- endoreg_db/models/administration/case/case.py +3 -3
- endoreg_db/models/administration/case/case_template/__init__.py +2 -14
- endoreg_db/models/administration/case/case_template/case_template.py +2 -124
- endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
- endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
- endoreg_db/models/administration/center/center.py +33 -19
- endoreg_db/models/administration/center/center_product.py +12 -9
- endoreg_db/models/administration/center/center_resource.py +25 -19
- endoreg_db/models/administration/center/center_shift.py +21 -17
- endoreg_db/models/administration/center/center_waste.py +16 -8
- endoreg_db/models/administration/person/__init__.py +2 -0
- endoreg_db/models/administration/person/employee/employee.py +10 -5
- endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
- endoreg_db/models/administration/person/employee/employee_type.py +12 -6
- endoreg_db/models/administration/person/examiner/examiner.py +13 -11
- endoreg_db/models/administration/person/patient/__init__.py +2 -0
- endoreg_db/models/administration/person/patient/patient.py +129 -100
- endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
- endoreg_db/models/administration/person/person.py +4 -0
- endoreg_db/models/administration/person/profession/__init__.py +8 -4
- endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
- endoreg_db/models/administration/product/product.py +20 -15
- endoreg_db/models/administration/product/product_material.py +17 -18
- endoreg_db/models/administration/product/product_weight.py +12 -8
- endoreg_db/models/administration/product/reference_product.py +23 -55
- endoreg_db/models/administration/qualification/qualification.py +7 -3
- endoreg_db/models/administration/qualification/qualification_type.py +7 -3
- endoreg_db/models/administration/shift/scheduled_days.py +8 -5
- endoreg_db/models/administration/shift/shift.py +16 -12
- endoreg_db/models/administration/shift/shift_type.py +23 -31
- endoreg_db/models/label/__init__.py +8 -9
- endoreg_db/models/label/annotation/image_classification.py +10 -9
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +23 -28
- endoreg_db/models/label/label.py +15 -15
- endoreg_db/models/label/label_set.py +19 -6
- endoreg_db/models/label/label_type.py +1 -1
- endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
- endoreg_db/models/label/label_video_segment/label_video_segment.py +98 -102
- endoreg_db/models/label/video_segmentation_label.py +4 -0
- endoreg_db/models/label/video_segmentation_labelset.py +4 -3
- endoreg_db/models/media/frame/frame.py +22 -22
- endoreg_db/models/media/pdf/raw_pdf.py +194 -194
- endoreg_db/models/media/pdf/report_file.py +25 -29
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +55 -47
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
- endoreg_db/models/media/processing_history/__init__.py +5 -0
- endoreg_db/models/media/processing_history/processing_history.py +96 -0
- endoreg_db/models/media/video/__init__.py +1 -0
- endoreg_db/models/media/video/create_from_file.py +139 -77
- endoreg_db/models/media/video/pipe_2.py +8 -9
- endoreg_db/models/media/video/video_file.py +174 -112
- endoreg_db/models/media/video/video_file_ai.py +288 -74
- endoreg_db/models/media/video/video_file_anonymize.py +38 -38
- endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
- endoreg_db/models/media/video/video_file_io.py +113 -61
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
- endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
- endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
- endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
- endoreg_db/models/media/video/video_file_segments.py +24 -17
- endoreg_db/models/media/video/video_metadata.py +19 -35
- endoreg_db/models/media/video/video_processing.py +96 -95
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +13 -3
- endoreg_db/models/medical/disease.py +22 -16
- endoreg_db/models/medical/event.py +31 -18
- endoreg_db/models/medical/examination/__init__.py +13 -6
- endoreg_db/models/medical/examination/examination.py +39 -20
- endoreg_db/models/medical/examination/examination_indication.py +30 -95
- endoreg_db/models/medical/examination/examination_time.py +23 -8
- endoreg_db/models/medical/examination/examination_time_type.py +9 -6
- endoreg_db/models/medical/examination/examination_type.py +3 -4
- endoreg_db/models/medical/finding/finding.py +32 -40
- endoreg_db/models/medical/finding/finding_classification.py +42 -72
- endoreg_db/models/medical/finding/finding_intervention.py +25 -22
- endoreg_db/models/medical/finding/finding_type.py +13 -12
- endoreg_db/models/medical/hardware/endoscope.py +26 -26
- endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
- endoreg_db/models/medical/laboratory/lab_value.py +62 -91
- endoreg_db/models/medical/medication/medication.py +22 -10
- endoreg_db/models/medical/medication/medication_indication.py +29 -3
- endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
- endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
- endoreg_db/models/medical/medication/medication_schedule.py +27 -16
- endoreg_db/models/medical/organ/__init__.py +15 -12
- endoreg_db/models/medical/patient/medication_examples.py +6 -6
- endoreg_db/models/medical/patient/patient_disease.py +20 -23
- endoreg_db/models/medical/patient/patient_event.py +19 -22
- endoreg_db/models/medical/patient/patient_examination.py +48 -54
- endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
- endoreg_db/models/medical/patient/patient_finding.py +122 -139
- endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
- endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
- endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
- endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
- endoreg_db/models/medical/patient/patient_medication.py +27 -38
- endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
- endoreg_db/models/medical/risk/risk.py +7 -6
- endoreg_db/models/medical/risk/risk_type.py +8 -5
- endoreg_db/models/metadata/model_meta.py +60 -29
- endoreg_db/models/metadata/model_meta_logic.py +125 -18
- endoreg_db/models/metadata/pdf_meta.py +31 -24
- endoreg_db/models/metadata/sensitive_meta.py +105 -85
- endoreg_db/models/metadata/sensitive_meta_logic.py +198 -103
- endoreg_db/models/metadata/video_meta.py +51 -31
- endoreg_db/models/metadata/video_prediction_logic.py +16 -23
- endoreg_db/models/metadata/video_prediction_meta.py +29 -33
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
- endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
- endoreg_db/models/other/emission/emission_factor.py +18 -8
- endoreg_db/models/other/gender.py +10 -5
- endoreg_db/models/other/information_source.py +50 -29
- endoreg_db/models/other/material.py +9 -5
- endoreg_db/models/other/resource.py +6 -4
- endoreg_db/models/other/tag.py +10 -5
- endoreg_db/models/other/transport_route.py +13 -8
- endoreg_db/models/other/unit.py +10 -6
- endoreg_db/models/other/waste.py +6 -5
- endoreg_db/models/report/report.py +6 -0
- endoreg_db/models/requirement/requirement.py +329 -361
- endoreg_db/models/requirement/requirement_error.py +85 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
- endoreg_db/models/requirement/requirement_operator.py +103 -112
- endoreg_db/models/requirement/requirement_set.py +74 -57
- endoreg_db/models/state/__init__.py +4 -4
- endoreg_db/models/state/abstract.py +2 -2
- endoreg_db/models/state/anonymization.py +12 -0
- endoreg_db/models/state/audit_ledger.py +49 -51
- endoreg_db/models/state/label_video_segment.py +9 -0
- endoreg_db/models/state/raw_pdf.py +101 -68
- endoreg_db/models/state/sensitive_meta.py +6 -2
- endoreg_db/models/state/video.py +110 -90
- endoreg_db/models/upload_job.py +35 -34
- endoreg_db/models/utils.py +28 -25
- endoreg_db/queries/__init__.py +3 -1
- endoreg_db/root_urls.py +21 -2
- endoreg_db/schemas/examination_evaluation.py +1 -1
- endoreg_db/serializers/__init__.py +2 -10
- endoreg_db/serializers/anonymization.py +18 -10
- endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
- endoreg_db/serializers/meta/__init__.py +1 -6
- endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
- endoreg_db/serializers/misc/file_overview.py +11 -99
- endoreg_db/serializers/misc/sensitive_patient_data.py +50 -26
- endoreg_db/serializers/patient_examination/patient_examination.py +3 -3
- endoreg_db/serializers/pdf/anony_text_validation.py +39 -23
- endoreg_db/serializers/requirements/requirement_sets.py +92 -22
- endoreg_db/serializers/video/segmentation.py +2 -1
- endoreg_db/serializers/video/video_file_list.py +65 -34
- endoreg_db/serializers/video/video_processing_history.py +20 -5
- endoreg_db/services/__old/pdf_import.py +1487 -0
- endoreg_db/services/__old/video_import.py +1306 -0
- endoreg_db/services/anonymization.py +128 -89
- endoreg_db/services/lookup_service.py +65 -52
- endoreg_db/services/lookup_store.py +2 -2
- endoreg_db/services/pdf_import.py +0 -1382
- endoreg_db/services/report_import.py +10 -0
- endoreg_db/services/video_import.py +6 -1255
- endoreg_db/tasks/upload_tasks.py +79 -70
- endoreg_db/tasks/video_ingest.py +8 -4
- endoreg_db/urls/__init__.py +5 -32
- endoreg_db/urls/ai.py +32 -0
- endoreg_db/urls/media.py +121 -83
- endoreg_db/urls/root_urls.py +29 -0
- endoreg_db/utils/__init__.py +15 -5
- endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/dataloader.py +142 -40
- endoreg_db/utils/defaults/set_default_center.py +32 -0
- endoreg_db/utils/names.py +22 -16
- endoreg_db/utils/paths.py +110 -46
- endoreg_db/utils/permissions.py +2 -1
- endoreg_db/utils/pipelines/Readme.md +1 -1
- endoreg_db/utils/pipelines/process_video_dir.py +1 -1
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +655 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
- endoreg_db/utils/setup_config.py +8 -5
- endoreg_db/utils/storage.py +115 -0
- endoreg_db/utils/validate_endo_roi.py +8 -2
- endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
- endoreg_db/views/__init__.py +85 -183
- endoreg_db/views/ai/__init__.py +8 -0
- endoreg_db/views/ai/label.py +155 -0
- endoreg_db/views/anonymization/media_management.py +202 -166
- endoreg_db/views/anonymization/overview.py +99 -67
- endoreg_db/views/anonymization/validate.py +182 -44
- endoreg_db/views/media/__init__.py +7 -20
- endoreg_db/views/media/pdf_media.py +197 -174
- endoreg_db/views/media/sensitive_metadata.py +193 -138
- endoreg_db/views/media/video_media.py +89 -82
- endoreg_db/views/meta/__init__.py +0 -8
- endoreg_db/views/misc/__init__.py +1 -7
- endoreg_db/views/misc/upload_views.py +94 -93
- endoreg_db/views/patient/patient.py +5 -4
- endoreg_db/views/report/__init__.py +5 -7
- endoreg_db/views/{pdf → report}/reimport.py +22 -22
- endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +46 -39
- endoreg_db/views/requirement/evaluate.py +188 -187
- endoreg_db/views/requirement/lookup.py +17 -3
- endoreg_db/views/requirement/lookup_store.py +22 -90
- endoreg_db/views/requirement/requirement_utils.py +89 -0
- endoreg_db/views/video/__init__.py +23 -24
- endoreg_db/views/video/correction.py +201 -172
- endoreg_db/views/video/reimport.py +1 -1
- endoreg_db/views/{media/video_segments.py → video/segments_crud.py} +77 -40
- endoreg_db/views/video/{video_meta.py → video_meta_stats.py} +2 -2
- endoreg_db/views/video/video_stream.py +7 -8
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/METADATA +7 -3
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/RECORD +391 -413
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/WHEEL +1 -1
- endoreg_db/data/finding/anatomy_colon.yaml +0 -128
- endoreg_db/data/finding/colonoscopy.yaml +0 -40
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +0 -56
- endoreg_db/data/finding/complication.yaml +0 -16
- endoreg_db/data/finding/data.yaml +0 -105
- endoreg_db/data/finding/examination_setting.yaml +0 -16
- endoreg_db/data/finding/medication_related.yaml +0 -18
- endoreg_db/data/finding/outcome.yaml +0 -12
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +0 -95
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +0 -22
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +0 -25
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +0 -68
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -80
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +0 -21
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +0 -26
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +0 -22
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +0 -53
- endoreg_db/data/finding_classification/complication_generic.yaml +0 -25
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +0 -40
- endoreg_db/data/finding_classification/histology_colo.yaml +0 -51
- endoreg_db/data/finding_classification/intervention_required.yaml +0 -26
- endoreg_db/data/finding_classification/medication_related.yaml +0 -23
- endoreg_db/data/finding_classification/visualized.yaml +0 -33
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +0 -15
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +0 -17
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +0 -14
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +0 -82
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
- endoreg_db/data/finding_classification_choice/outcome.yaml +0 -19
- endoreg_db/data/finding_intervention/endoscopy.yaml +0 -43
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +0 -128
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +0 -32
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +0 -9
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +0 -36
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +0 -79
- endoreg_db/data/requirement/age.yaml +0 -26
- endoreg_db/data/requirement/gender.yaml +0 -25
- endoreg_db/management/commands/init_default_ai_model.py +0 -112
- endoreg_db/management/commands/reset_celery_schedule.py +0 -9
- endoreg_db/management/commands/validate_video.py +0 -204
- endoreg_db/migrations/0002_add_video_correction_models.py +0 -52
- endoreg_db/migrations/0003_add_center_display_name.py +0 -30
- endoreg_db/models/administration/permissions/__init__.py +0 -44
- endoreg_db/models/rule/__init__.py +0 -13
- endoreg_db/models/rule/rule.py +0 -27
- endoreg_db/models/rule/rule_applicator.py +0 -224
- endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
- endoreg_db/models/rule/rule_type.py +0 -20
- endoreg_db/models/rule/ruleset.py +0 -17
- endoreg_db/renames.yml +0 -8
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +0 -223
- endoreg_db/serializers/_old/raw_video_meta_validation.py +0 -179
- endoreg_db/serializers/_old/video.py +0 -71
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +0 -115
- endoreg_db/serializers/meta/report_meta.py +0 -53
- endoreg_db/serializers/report/__init__.py +0 -9
- endoreg_db/serializers/report/mixins.py +0 -45
- endoreg_db/serializers/report/report.py +0 -105
- endoreg_db/serializers/report/report_list.py +0 -22
- endoreg_db/serializers/report/secure_file_url.py +0 -26
- endoreg_db/serializers/video/video_metadata.py +0 -105
- endoreg_db/services/requirements_object.py +0 -147
- endoreg_db/services/storage_aware_video_processor.py +0 -344
- endoreg_db/urls/files.py +0 -6
- endoreg_db/urls/label_video_segment_validate.py +0 -33
- endoreg_db/urls/label_video_segments.py +0 -46
- endoreg_db/urls/report.py +0 -48
- endoreg_db/urls/video.py +0 -61
- endoreg_db/utils/case_generator/case_generator.py +0 -159
- endoreg_db/utils/case_generator/utils.py +0 -30
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +0 -368
- endoreg_db/views/label/__init__.py +0 -5
- endoreg_db/views/label/label.py +0 -15
- endoreg_db/views/label_video_segment/__init__.py +0 -16
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +0 -44
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +0 -50
- endoreg_db/views/label_video_segment/label_video_segment.py +0 -77
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +0 -174
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +0 -73
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +0 -46
- endoreg_db/views/label_video_segment/validate.py +0 -226
- endoreg_db/views/media/segments.py +0 -71
- endoreg_db/views/meta/available_files_list.py +0 -146
- endoreg_db/views/meta/report_meta.py +0 -53
- endoreg_db/views/meta/sensitive_meta_detail.py +0 -148
- endoreg_db/views/misc/secure_file_serving_view.py +0 -80
- endoreg_db/views/misc/secure_file_url_view.py +0 -84
- endoreg_db/views/misc/secure_url_validate.py +0 -79
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +0 -164
- endoreg_db/views/patient_finding_location/__init__.py +0 -5
- endoreg_db/views/patient_finding_location/pfl_create.py +0 -70
- endoreg_db/views/patient_finding_morphology/__init__.py +0 -5
- endoreg_db/views/patient_finding_morphology/pfm_create.py +0 -70
- endoreg_db/views/pdf/__init__.py +0 -8
- endoreg_db/views/report/report_list.py +0 -112
- endoreg_db/views/report/report_with_secure_url.py +0 -28
- endoreg_db/views/report/start_examination.py +0 -7
- endoreg_db/views/video/segmentation.py +0 -274
- endoreg_db/views/video/task_status.py +0 -49
- endoreg_db/views/video/timeline.py +0 -46
- endoreg_db/views/video/video_analyze.py +0 -52
- endoreg_db/views.py +0 -0
- /endoreg_db/data/requirement/{colonoscopy_baseline_austria.yaml → old/colonoscopy_baseline_austria.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_cardiovascular.yaml → old/disease_cardiovascular.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_classification_choice_cardiovascular.yaml → old/disease_classification_choice_cardiovascular.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_hepatology.yaml → old/disease_hepatology.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_misc.yaml → old/disease_misc.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_renal.yaml → old/disease_renal.yaml} +0 -0
- /endoreg_db/data/requirement/{endoscopy_bleeding_risk.yaml → old/endoscopy_bleeding_risk.yaml} +0 -0
- /endoreg_db/data/requirement/{event_cardiology.yaml → old/event_cardiology.yaml} +0 -0
- /endoreg_db/data/requirement/{event_requirements.yaml → old/event_requirements.yaml} +0 -0
- /endoreg_db/data/requirement/{finding_colon_polyp.yaml → old/finding_colon_polyp.yaml} +0 -0
- /endoreg_db/{migrations/__init__.py → data/requirement/old/gender.yaml} +0 -0
- /endoreg_db/data/requirement/{lab_value.yaml → old/lab_value.yaml} +0 -0
- /endoreg_db/data/requirement/{medication.yaml → old/medication.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{age.yaml → _old/age.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{lab_operators.yaml → _old/lab_operators.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{model_operators.yaml → _old/model_operators.yaml} +0 -0
- /endoreg_db/{models/media/video/refactor_plan.md → import_files/pseudonymization/__init__.py} +0 -0
- /endoreg_db/{models/media/video/video_file_frames.py → import_files/pseudonymization/pseudonymize.py} +0 -0
- /endoreg_db/models/{metadata/frame_ocr_result.py → report/__init__.py} +0 -0
- /endoreg_db/{urls/sensitive_meta.py → models/report/images.py} +0 -0
- /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
# stats/models.py
|
|
2
|
-
import hashlib
|
|
2
|
+
import hashlib
|
|
3
|
+
import json
|
|
4
|
+
import uuid
|
|
5
|
+
|
|
6
|
+
from django.conf import settings
|
|
3
7
|
from django.db import models
|
|
4
8
|
from django.utils import timezone
|
|
5
|
-
from django.conf import settings
|
|
6
9
|
|
|
7
10
|
"""
|
|
8
11
|
|
|
@@ -31,33 +34,35 @@ Returns:
|
|
|
31
34
|
_type_: _description_
|
|
32
35
|
"""
|
|
33
36
|
|
|
37
|
+
# TODO implement later on
|
|
38
|
+
|
|
34
39
|
|
|
35
40
|
class AuditLedger(models.Model):
|
|
36
|
-
id
|
|
37
|
-
ts
|
|
38
|
-
user
|
|
39
|
-
object_type
|
|
40
|
-
object_pk
|
|
41
|
-
action
|
|
42
|
-
data
|
|
43
|
-
prev_hash
|
|
44
|
-
hash
|
|
41
|
+
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
42
|
+
ts = models.DateTimeField(default=timezone.now, editable=False)
|
|
43
|
+
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
|
|
44
|
+
object_type = models.CharField(max_length=80) # e.g. 'VideoFile'
|
|
45
|
+
object_pk = models.CharField(max_length=40) # UUID or int
|
|
46
|
+
action = models.CharField(max_length=40) # 'created' | 'validated' | …
|
|
47
|
+
data = models.JSONField() # snapshot / diff / metadata
|
|
48
|
+
prev_hash = models.CharField(max_length=64, editable=False)
|
|
49
|
+
hash = models.CharField(max_length=64, editable=False)
|
|
45
50
|
|
|
46
51
|
class Meta:
|
|
47
|
-
ordering = [
|
|
48
|
-
indexes
|
|
52
|
+
ordering = ["ts"]
|
|
53
|
+
indexes = [models.Index(fields=["object_type", "object_pk"])]
|
|
49
54
|
|
|
50
55
|
# ------------------------------------------------------
|
|
51
56
|
def save(self, *args, **kw):
|
|
52
57
|
"""
|
|
53
58
|
Saves a new immutable audit record, computing and linking cryptographic hashes.
|
|
54
|
-
|
|
59
|
+
|
|
55
60
|
Raises:
|
|
56
61
|
RuntimeError: If an attempt is made to modify an existing audit record.
|
|
57
62
|
"""
|
|
58
|
-
if self._state.adding:
|
|
63
|
+
if self._state.adding: # only on INSERT
|
|
59
64
|
self.prev_hash = self._last_hash()
|
|
60
|
-
self.hash
|
|
65
|
+
self.hash = self._compute_hash()
|
|
61
66
|
else:
|
|
62
67
|
raise RuntimeError("AuditLedger rows are immutable")
|
|
63
68
|
super().save(*args, **kw)
|
|
@@ -66,36 +71,36 @@ class AuditLedger(models.Model):
|
|
|
66
71
|
def _last_hash(self) -> str:
|
|
67
72
|
"""
|
|
68
73
|
Retrieves the hash of the most recent audit record.
|
|
69
|
-
|
|
74
|
+
|
|
70
75
|
Returns:
|
|
71
76
|
The SHA-256 hash of the latest `AuditLedger` entry by timestamp, or a string of 64 zeros if no records exist.
|
|
72
77
|
"""
|
|
73
|
-
last = AuditLedger.objects.order_by(
|
|
74
|
-
return last.hash if last else
|
|
78
|
+
last = AuditLedger.objects.order_by("-ts").first()
|
|
79
|
+
return last.hash if last else "0" * 64
|
|
75
80
|
|
|
76
81
|
def _compute_hash(self) -> str:
|
|
77
82
|
"""
|
|
78
83
|
Computes the SHA-256 hash of the current audit record's data.
|
|
79
|
-
|
|
84
|
+
|
|
80
85
|
The hash is generated from a JSON-serialized payload containing the timestamp, user ID, object type and primary key, action, associated data, and the previous record's hash. This ensures the integrity and immutability of the audit trail.
|
|
81
|
-
|
|
86
|
+
|
|
82
87
|
Returns:
|
|
83
88
|
The hexadecimal SHA-256 hash string representing the current audit record.
|
|
84
89
|
"""
|
|
85
90
|
payload = {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
"ts": self.ts.isoformat(),
|
|
92
|
+
"uid": str(self.id),
|
|
93
|
+
"obj": f"{self.object_type}:{self.object_pk}",
|
|
94
|
+
"act": self.action,
|
|
95
|
+
"data": self.data,
|
|
96
|
+
"prev": self.prev_hash,
|
|
92
97
|
}
|
|
93
98
|
return hashlib.sha256(json.dumps(payload, sort_keys=True).encode()).hexdigest()
|
|
94
|
-
|
|
95
|
-
def log_validation(user, instance, action: str, extra=None):
|
|
99
|
+
|
|
100
|
+
def log_validation(self, user, instance, action: str, extra=None):
|
|
96
101
|
"""
|
|
97
102
|
Creates an audit record for a validation action performed by a user on a specific model instance.
|
|
98
|
-
|
|
103
|
+
|
|
99
104
|
Args:
|
|
100
105
|
user: The user performing the action.
|
|
101
106
|
instance: The model instance being validated.
|
|
@@ -110,41 +115,34 @@ class AuditLedger(models.Model):
|
|
|
110
115
|
data=extra or {},
|
|
111
116
|
)
|
|
112
117
|
|
|
113
|
-
|
|
118
|
+
@classmethod
|
|
119
|
+
def _distinct(self, object_type: str, action: str):
|
|
114
120
|
"""
|
|
115
121
|
Returns the number of distinct objects of a given type that have a specific audit action recorded.
|
|
116
|
-
|
|
122
|
+
|
|
117
123
|
Args:
|
|
118
124
|
object_type: The type of object to filter by (e.g., 'VideoFile').
|
|
119
125
|
action: The audit action to filter by (e.g., 'validated').
|
|
120
|
-
|
|
126
|
+
|
|
121
127
|
Returns:
|
|
122
128
|
The count of unique object primary keys matching the specified type and action.
|
|
123
129
|
"""
|
|
124
|
-
return (
|
|
125
|
-
AuditLedger.objects
|
|
126
|
-
.filter(object_type=object_type, action=action)
|
|
127
|
-
.values('object_pk')
|
|
128
|
-
.distinct()
|
|
129
|
-
.count()
|
|
130
|
-
)
|
|
130
|
+
return AuditLedger.objects.filter(object_type=object_type, action=action).values("object_pk").distinct().count()
|
|
131
131
|
|
|
132
|
-
def collect_counters():
|
|
132
|
+
def collect_counters(self):
|
|
133
133
|
"""
|
|
134
134
|
Aggregates and returns summary statistics for audit actions and object types.
|
|
135
|
-
|
|
135
|
+
|
|
136
136
|
Returns:
|
|
137
137
|
dict: A dictionary containing counts of distinct cases, videos, annotations,
|
|
138
138
|
anonymizations, images, and breakdowns of video statuses based on audit records.
|
|
139
139
|
"""
|
|
140
140
|
return {
|
|
141
|
-
"totalCases":
|
|
142
|
-
"totalVideos":
|
|
143
|
-
"totalAnnotations":
|
|
144
|
-
"totalAnonymizations":
|
|
145
|
-
"totalImages":
|
|
146
|
-
|
|
147
|
-
"
|
|
148
|
-
"videosAnonym": AuditLedger._distinct("VideoFile", "anonymized"),
|
|
149
|
-
# add more as needed …
|
|
141
|
+
"totalCases": AuditLedger._distinct("VideoFile", "created"),
|
|
142
|
+
"totalVideos": AuditLedger._distinct("VideoFile", "created"),
|
|
143
|
+
"totalAnnotations": AuditLedger.objects.filter(action="annotation_added").count(),
|
|
144
|
+
"totalAnonymizations": AuditLedger._distinct("VideoFile", "anonymized"),
|
|
145
|
+
"totalImages": AuditLedger._distinct("Image", "created"),
|
|
146
|
+
"videosCompleted": AuditLedger._distinct("VideoFile", "validated"),
|
|
147
|
+
"videosAnonym": AuditLedger._distinct("VideoFile", "anonymized"),
|
|
150
148
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
1
3
|
from django.db import models
|
|
4
|
+
|
|
2
5
|
from .abstract import AbstractState
|
|
3
6
|
|
|
7
|
+
|
|
4
8
|
class LabelVideoSegmentState(AbstractState):
|
|
5
9
|
"""State for label video segment data."""
|
|
6
10
|
|
|
@@ -20,3 +24,8 @@ class LabelVideoSegmentState(AbstractState):
|
|
|
20
24
|
class Meta:
|
|
21
25
|
verbose_name = "Label Video Segment State"
|
|
22
26
|
verbose_name_plural = "Label Video Segment States"
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from endoreg_db.models import LabelVideoSegment
|
|
30
|
+
|
|
31
|
+
origin: models.OneToOneField["LabelVideoSegment|None"]
|
|
@@ -1,24 +1,19 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Defines state tracking models related to
|
|
2
|
+
Defines state tracking models related to report processing, including extraction of text and metadata, AI predictions, and anonymization status for RawPdfFile instances.
|
|
3
3
|
"""
|
|
4
|
-
|
|
5
|
-
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
6
5
|
import logging
|
|
7
6
|
from enum import Enum
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
from django.db import models, transaction
|
|
10
|
+
|
|
11
|
+
from endoreg_db.models.state.anonymization import AnonymizationState
|
|
8
12
|
|
|
9
13
|
logger = logging.getLogger(__name__)
|
|
10
14
|
|
|
11
15
|
if TYPE_CHECKING:
|
|
12
16
|
from ..media import RawPdfFile
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class AnonymizationStatus(str, Enum):
|
|
16
|
-
NOT_STARTED = "not_started"
|
|
17
|
-
PROCESSING_ANONYMIZING = "processing_anonymization"
|
|
18
|
-
DONE = "done"
|
|
19
|
-
VALIDATED = "validated"
|
|
20
|
-
FAILED = "failed"
|
|
21
|
-
STARTED = "started"
|
|
22
17
|
|
|
23
18
|
|
|
24
19
|
class RawPdfState(models.Model):
|
|
@@ -26,40 +21,62 @@ class RawPdfState(models.Model):
|
|
|
26
21
|
Tracks the processing state of a RawPdfFile instance.
|
|
27
22
|
Uses BooleanFields for clear, distinct states.
|
|
28
23
|
"""
|
|
29
|
-
|
|
24
|
+
|
|
25
|
+
text_meta_extracted = models.BooleanField(
|
|
26
|
+
default=False, help_text="True if text metadata (OCR) has been extracted."
|
|
27
|
+
)
|
|
30
28
|
|
|
31
29
|
# AI / Annotation related states
|
|
32
|
-
initial_prediction_completed = models.BooleanField(
|
|
30
|
+
initial_prediction_completed = models.BooleanField(
|
|
31
|
+
default=False, help_text="True if initial AI prediction has run."
|
|
32
|
+
)
|
|
33
33
|
|
|
34
34
|
# Processing state
|
|
35
|
-
sensitive_meta_processed = models.BooleanField(
|
|
35
|
+
sensitive_meta_processed = models.BooleanField(
|
|
36
|
+
default=False,
|
|
37
|
+
help_text="True if the video has been fully processed, meaning a anonymized person was created.",
|
|
38
|
+
)
|
|
36
39
|
|
|
37
40
|
# Anonymization state
|
|
38
|
-
anonymized = models.BooleanField(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
anonymized = models.BooleanField(
|
|
42
|
+
default=False, help_text="True if the anonymized video file has been created."
|
|
43
|
+
)
|
|
44
|
+
anonymization_validated = models.BooleanField(
|
|
45
|
+
default=False,
|
|
46
|
+
help_text="True if the anonymization process has been validated and confirmed.",
|
|
47
|
+
)
|
|
48
|
+
|
|
41
49
|
# Processing state
|
|
42
|
-
processing_started = models.BooleanField(
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
processing_started = models.BooleanField(
|
|
51
|
+
default=False,
|
|
52
|
+
help_text="True if the processing has started, but not yet completed.",
|
|
53
|
+
)
|
|
54
|
+
processing_error = models.BooleanField(
|
|
55
|
+
default=False, help_text="True if an error occurred during processing."
|
|
56
|
+
)
|
|
57
|
+
|
|
45
58
|
# Timestamps
|
|
46
59
|
date_created = models.DateTimeField(auto_now_add=True)
|
|
47
60
|
date_modified = models.DateTimeField(auto_now=True)
|
|
48
|
-
|
|
49
|
-
was_created = models.BooleanField(default=True, help_text="True if this state was created for the first time.")
|
|
50
61
|
|
|
51
|
-
|
|
52
|
-
|
|
62
|
+
was_created = models.BooleanField(
|
|
63
|
+
default=True, help_text="True if this state was created for the first time."
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# report metadata extraction state
|
|
67
|
+
pdf_meta_extracted = models.BooleanField(
|
|
68
|
+
default=False, help_text="True if report metadata has been extracted."
|
|
69
|
+
)
|
|
53
70
|
|
|
54
71
|
if TYPE_CHECKING:
|
|
55
72
|
raw_pdf_file: "RawPdfFile"
|
|
56
73
|
|
|
57
74
|
def __str__(self):
|
|
58
75
|
"""
|
|
59
|
-
Return a string summarizing the RawPdfState instance, including the related
|
|
76
|
+
Return a string summarizing the RawPdfState instance, including the related report file UUID and key processing state flags with timestamps.
|
|
60
77
|
"""
|
|
61
78
|
try:
|
|
62
|
-
uuid = self.raw_pdf_file.
|
|
79
|
+
uuid = self.raw_pdf_file.pk
|
|
63
80
|
except Exception:
|
|
64
81
|
uuid = None
|
|
65
82
|
|
|
@@ -70,52 +87,72 @@ class RawPdfState(models.Model):
|
|
|
70
87
|
f"AnonymizationValidated={self.anonymization_validated}",
|
|
71
88
|
f"SensitiveMetaProcessed={self.sensitive_meta_processed}",
|
|
72
89
|
f"DateCreated={self.date_created.isoformat()}",
|
|
73
|
-
f"DateModified={self.date_modified.isoformat()}"
|
|
90
|
+
f"DateModified={self.date_modified.isoformat()}",
|
|
74
91
|
]
|
|
75
92
|
return f"RawPdfState(Pdf:{uuid}): {', '.join(states)}"
|
|
76
93
|
|
|
77
94
|
@property
|
|
78
|
-
def anonymization_status(self) ->
|
|
95
|
+
def anonymization_status(self) -> AnonymizationState:
|
|
79
96
|
"""
|
|
80
|
-
Determines the current anonymization workflow status for the
|
|
81
|
-
|
|
97
|
+
Determines the current anonymization workflow status for the report processing state.
|
|
98
|
+
|
|
82
99
|
Returns:
|
|
83
100
|
AnonymizationStatus: The current status, reflecting progress or failure in the anonymization process.
|
|
84
101
|
"""
|
|
85
|
-
if getattr(self, "processing_error", False):
|
|
86
|
-
return AnonymizationStatus.FAILED
|
|
87
102
|
if self.anonymization_validated:
|
|
88
|
-
return
|
|
103
|
+
return AnonymizationState.VALIDATED # Validation in Frontend completed -> Views related to this /home/admin/endoreg-db/endoreg_db/views/anonymization/validate.py
|
|
89
104
|
if self.sensitive_meta_processed:
|
|
90
|
-
return
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
105
|
+
return (
|
|
106
|
+
AnonymizationState.DONE_PROCESSING_ANONYMIZATION
|
|
107
|
+
) # /home/admin/endoreg-db/endoreg_db/services/pdf_import.py
|
|
108
|
+
if (
|
|
109
|
+
self.processing_started
|
|
110
|
+
and not self.processing_error
|
|
111
|
+
and not self.anonymized
|
|
112
|
+
):
|
|
113
|
+
return AnonymizationState.PROCESSING_ANONYMIZING
|
|
114
|
+
if getattr(self, "processing_error", False):
|
|
115
|
+
return (
|
|
116
|
+
AnonymizationState.FAILED
|
|
117
|
+
) # /home/admin/endoreg-db/endoreg_db/services/pdf_import.py
|
|
97
118
|
if self.processing_started:
|
|
98
|
-
return
|
|
99
|
-
|
|
100
|
-
|
|
119
|
+
return (
|
|
120
|
+
AnonymizationState.STARTED
|
|
121
|
+
) # /home/admin/endoreg-db/endoreg_db/services/pdf_import.py
|
|
122
|
+
if self.anonymized:
|
|
123
|
+
return AnonymizationState.ANONYMIZED
|
|
124
|
+
return AnonymizationState.NOT_STARTED
|
|
125
|
+
|
|
126
|
+
def mark_processing_not_started(self) -> None:
|
|
127
|
+
"""
|
|
128
|
+
Mark the processing as not started and optionally save the updated state.
|
|
129
|
+
|
|
130
|
+
Parameters:
|
|
131
|
+
save (bool): If True, persist the change to the database immediately. Defaults to True.
|
|
132
|
+
"""
|
|
133
|
+
with transaction.atomic():
|
|
134
|
+
self.processing_started = False
|
|
135
|
+
self.anonymized = False
|
|
136
|
+
self.was_created = False
|
|
137
|
+
self.sensitive_meta_processed = False
|
|
138
|
+
self.anonymization_validated = False
|
|
139
|
+
self.save()
|
|
101
140
|
|
|
102
|
-
|
|
103
141
|
def mark_processing_started(self, *, save: bool = True) -> None:
|
|
104
142
|
"""
|
|
105
143
|
Mark the processing as started and optionally save the updated state.
|
|
106
|
-
|
|
144
|
+
|
|
107
145
|
Parameters:
|
|
108
146
|
save (bool): If True, persist the change to the database immediately. Defaults to True.
|
|
109
147
|
"""
|
|
110
148
|
self.processing_started = True
|
|
111
|
-
|
|
112
|
-
self.save(update_fields=["processing_started", "date_modified"])
|
|
149
|
+
self.save(update_fields=["processing_started", "date_modified"])
|
|
113
150
|
|
|
114
151
|
# ---- Single‑responsibility mutators ---------------------------------
|
|
115
152
|
def mark_sensitive_meta_processed(self, *, save: bool = True) -> None:
|
|
116
153
|
"""
|
|
117
|
-
Mark the sensitive metadata processing step as completed for this
|
|
118
|
-
|
|
154
|
+
Mark the sensitive metadata processing step as completed for this report state.
|
|
155
|
+
|
|
119
156
|
Parameters:
|
|
120
157
|
save (bool): If True, immediately saves the updated state to the database.
|
|
121
158
|
"""
|
|
@@ -125,8 +162,8 @@ class RawPdfState(models.Model):
|
|
|
125
162
|
|
|
126
163
|
def mark_anonymization_validated(self, *, save: bool = True) -> None:
|
|
127
164
|
"""
|
|
128
|
-
Mark the anonymization as validated for this
|
|
129
|
-
|
|
165
|
+
Mark the anonymization as validated for this report processing state.
|
|
166
|
+
|
|
130
167
|
Parameters:
|
|
131
168
|
save (bool): If True, immediately saves the updated state to the database.
|
|
132
169
|
"""
|
|
@@ -136,19 +173,19 @@ class RawPdfState(models.Model):
|
|
|
136
173
|
|
|
137
174
|
def mark_anonymized(self, *, save: bool = True) -> None:
|
|
138
175
|
"""
|
|
139
|
-
Mark the
|
|
140
|
-
|
|
176
|
+
Mark the report as anonymized and optionally save the updated state.
|
|
177
|
+
|
|
141
178
|
Parameters:
|
|
142
179
|
save (bool): If True, persist the change to the database immediately. Defaults to True.
|
|
143
180
|
"""
|
|
144
|
-
|
|
145
|
-
|
|
181
|
+
with transaction.atomic():
|
|
182
|
+
self.anonymized = True
|
|
146
183
|
self.save(update_fields=["anonymized", "date_modified"])
|
|
147
184
|
|
|
148
185
|
def mark_initial_prediction_completed(self, *, save: bool = True) -> None:
|
|
149
186
|
"""
|
|
150
|
-
Mark the initial AI prediction step as completed for this
|
|
151
|
-
|
|
187
|
+
Mark the initial AI prediction step as completed for this report processing state.
|
|
188
|
+
|
|
152
189
|
Parameters:
|
|
153
190
|
save (bool): If True, immediately saves the updated state to the database.
|
|
154
191
|
"""
|
|
@@ -158,8 +195,8 @@ class RawPdfState(models.Model):
|
|
|
158
195
|
|
|
159
196
|
def mark_pdf_meta_extracted(self, *, save: bool = True) -> None:
|
|
160
197
|
"""
|
|
161
|
-
Mark the
|
|
162
|
-
|
|
198
|
+
Mark the report metadata extraction step as completed for this state.
|
|
199
|
+
|
|
163
200
|
Parameters:
|
|
164
201
|
save (bool): If True, immediately saves the updated state to the database.
|
|
165
202
|
"""
|
|
@@ -169,19 +206,15 @@ class RawPdfState(models.Model):
|
|
|
169
206
|
|
|
170
207
|
def mark_text_meta_extracted(self, *, save: bool = True) -> None:
|
|
171
208
|
"""
|
|
172
|
-
Mark the text metadata extraction step as completed for this
|
|
173
|
-
|
|
209
|
+
Mark the text metadata extraction step as completed for this report processing state.
|
|
210
|
+
|
|
174
211
|
Parameters:
|
|
175
212
|
save (bool): If True, immediately saves the updated state to the database.
|
|
176
213
|
"""
|
|
177
214
|
self.text_meta_extracted = True
|
|
178
215
|
if save:
|
|
179
216
|
self.save(update_fields=["text_meta_extracted", "date_modified"])
|
|
180
|
-
|
|
181
|
-
|
|
182
217
|
|
|
183
218
|
class Meta:
|
|
184
|
-
verbose_name = "Raw
|
|
185
|
-
verbose_name_plural = "Raw
|
|
186
|
-
|
|
187
|
-
|
|
219
|
+
verbose_name = "Raw report Processing State"
|
|
220
|
+
verbose_name_plural = "Raw report Processing States"
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
1
3
|
from django.db import models
|
|
4
|
+
|
|
2
5
|
from .abstract import AbstractState
|
|
3
|
-
|
|
6
|
+
|
|
4
7
|
|
|
5
8
|
class SensitiveMetaState(AbstractState):
|
|
6
9
|
"""State for sensitive meta data."""
|
|
@@ -19,7 +22,7 @@ class SensitiveMetaState(AbstractState):
|
|
|
19
22
|
if TYPE_CHECKING:
|
|
20
23
|
from endoreg_db.models import SensitiveMeta
|
|
21
24
|
|
|
22
|
-
origin: "SensitiveMeta"
|
|
25
|
+
origin: models.OneToOneField["SensitiveMeta|None"]
|
|
23
26
|
|
|
24
27
|
@property
|
|
25
28
|
def is_verified(self) -> bool:
|
|
@@ -41,6 +44,7 @@ class SensitiveMetaState(AbstractState):
|
|
|
41
44
|
"""
|
|
42
45
|
self.names_verified = True
|
|
43
46
|
self.save(update_fields=["names_verified"])
|
|
47
|
+
|
|
44
48
|
class Meta:
|
|
45
49
|
verbose_name = "Sensitive Meta State"
|
|
46
50
|
verbose_name_plural = "Sensitive Meta States"
|