endoreg-db 0.8.4.4__py3-none-any.whl → 0.8.8.0__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 +8 -31
- endoreg_db/data/_examples/disease.yaml +55 -0
- endoreg_db/data/_examples/disease_classification.yaml +13 -0
- endoreg_db/data/_examples/disease_classification_choice.yaml +62 -0
- endoreg_db/data/_examples/event.yaml +64 -0
- endoreg_db/data/_examples/examination.yaml +72 -0
- endoreg_db/data/_examples/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/_examples/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/_examples/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/_examples/finding/complication.yaml +16 -0
- endoreg_db/data/_examples/finding/data.yaml +105 -0
- endoreg_db/data/_examples/finding/examination_setting.yaml +16 -0
- endoreg_db/data/_examples/finding/medication_related.yaml +18 -0
- endoreg_db/data/_examples/finding/outcome.yaml +12 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_bowel_preparation.yaml +68 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/_examples/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/_examples/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/_examples/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/_examples/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/_examples/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/_examples/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/_examples/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/_examples/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/_examples/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/_examples/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/_examples/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/_examples/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/_examples/finding_type/data.yaml +43 -0
- endoreg_db/data/_examples/requirement/age.yaml +26 -0
- endoreg_db/data/_examples/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/_examples/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/_examples/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/_examples/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/_examples/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/_examples/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/_examples/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/_examples/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/_examples/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/_examples/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/_examples/requirement/gender.yaml +25 -0
- endoreg_db/data/_examples/requirement/lab_value.yaml +441 -0
- endoreg_db/data/_examples/requirement/medication.yaml +93 -0
- endoreg_db/data/_examples/requirement_operator/age.yaml +13 -0
- endoreg_db/data/_examples/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/_examples/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/_examples/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/_examples/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/_examples/yaml_examples.xlsx +0 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +4 -3
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +43 -70
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +22 -52
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +31 -62
- endoreg_db/data/finding_classification/histology_colo.yaml +28 -36
- endoreg_db/data/requirement/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +31 -12
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
- endoreg_db/data/requirement_set/90_coloreg.yaml +178 -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 +5 -2
- endoreg_db/helpers/data_loader.py +1 -1
- 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_video.py +9 -10
- endoreg_db/management/commands/import_video_with_classification.py +1 -1
- endoreg_db/management/commands/init_default_ai_model.py +1 -1
- endoreg_db/management/commands/list_routes.py +18 -0
- endoreg_db/management/commands/load_ai_model_data.py +2 -1
- endoreg_db/management/commands/load_center_data.py +12 -12
- endoreg_db/management/commands/load_requirement_data.py +60 -31
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/setup_endoreg_db.py +14 -10
- endoreg_db/management/commands/storage_management.py +271 -203
- endoreg_db/migrations/0001_initial.py +1799 -1300
- endoreg_db/migrations/0002_requirementset_depends_on.py +18 -0
- endoreg_db/migrations/_old/0001_initial.py +1857 -0
- endoreg_db/migrations/_old/0004_employee_city_employee_post_code_employee_street_and_more.py +68 -0
- endoreg_db/migrations/_old/0004_remove_casetemplate_rules_and_more.py +77 -0
- endoreg_db/migrations/_old/0005_merge_20251111_1003.py +14 -0
- endoreg_db/migrations/_old/0006_sensitivemeta_anonymized_text_and_more.py +68 -0
- endoreg_db/migrations/_old/0007_remove_rule_attribute_dtype_remove_rule_rule_type_and_more.py +89 -0
- endoreg_db/migrations/_old/0008_remove_event_event_classification_and_more.py +27 -0
- endoreg_db/migrations/_old/0009_alter_modelmeta_options_and_more.py +21 -0
- 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 +103 -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 +7 -8
- endoreg_db/models/label/annotation/image_classification.py +10 -9
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +8 -5
- 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 +76 -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 +249 -177
- endoreg_db/models/media/pdf/report_file.py +25 -29
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +30 -46
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
- endoreg_db/models/media/video/__init__.py +1 -0
- endoreg_db/models/media/video/create_from_file.py +48 -56
- endoreg_db/models/media/video/pipe_1.py +30 -33
- endoreg_db/models/media/video/pipe_2.py +8 -9
- endoreg_db/models/media/video/video_file.py +359 -204
- 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 +109 -62
- 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/__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 +17 -18
- endoreg_db/models/medical/examination/examination_indication.py +26 -25
- endoreg_db/models/medical/examination/examination_time.py +16 -6
- 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 +38 -39
- endoreg_db/models/medical/finding/finding_classification.py +37 -48
- endoreg_db/models/medical/finding/finding_intervention.py +27 -22
- endoreg_db/models/medical/finding/finding_type.py +13 -12
- endoreg_db/models/medical/hardware/endoscope.py +20 -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 +1 -5
- 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 +139 -18
- endoreg_db/models/metadata/pdf_meta.py +19 -24
- endoreg_db/models/metadata/sensitive_meta.py +102 -85
- endoreg_db/models/metadata/sensitive_meta_logic.py +383 -43
- 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 +25 -25
- 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/requirement/requirement.py +580 -272
- 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 +36 -33
- 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 +46 -47
- endoreg_db/models/state/label_video_segment.py +9 -0
- endoreg_db/models/state/raw_pdf.py +40 -46
- endoreg_db/models/state/sensitive_meta.py +6 -2
- endoreg_db/models/state/video.py +58 -53
- endoreg_db/models/upload_job.py +32 -55
- endoreg_db/models/utils.py +1 -2
- endoreg_db/root_urls.py +21 -2
- endoreg_db/serializers/__init__.py +26 -57
- endoreg_db/serializers/anonymization.py +18 -10
- endoreg_db/serializers/meta/report_meta.py +1 -1
- endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
- endoreg_db/serializers/misc/__init__.py +1 -1
- endoreg_db/serializers/misc/file_overview.py +33 -91
- endoreg_db/serializers/misc/{vop_patient_data.py → sensitive_patient_data.py} +1 -1
- endoreg_db/serializers/requirements/requirement_sets.py +92 -22
- endoreg_db/serializers/video/segmentation.py +2 -1
- endoreg_db/serializers/video/video_processing_history.py +20 -5
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/anonymization.py +75 -73
- endoreg_db/services/lookup_service.py +256 -73
- endoreg_db/services/lookup_store.py +174 -30
- endoreg_db/services/pdf_import.py +711 -310
- endoreg_db/services/storage_aware_video_processor.py +140 -114
- endoreg_db/services/video_import.py +266 -117
- endoreg_db/urls/__init__.py +27 -27
- endoreg_db/urls/label_video_segments.py +2 -0
- endoreg_db/urls/media.py +108 -66
- 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 +88 -16
- endoreg_db/utils/defaults/set_default_center.py +32 -0
- endoreg_db/utils/names.py +22 -16
- endoreg_db/utils/permissions.py +2 -1
- endoreg_db/utils/pipelines/process_video_dir.py +1 -1
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +414 -127
- 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 +5 -12
- endoreg_db/views/anonymization/media_management.py +198 -163
- endoreg_db/views/anonymization/overview.py +4 -1
- endoreg_db/views/anonymization/validate.py +174 -40
- endoreg_db/views/media/__init__.py +2 -0
- endoreg_db/views/media/pdf_media.py +131 -150
- endoreg_db/views/media/sensitive_metadata.py +46 -6
- endoreg_db/views/media/video_media.py +89 -82
- endoreg_db/views/media/video_segments.py +187 -260
- endoreg_db/views/meta/sensitive_meta_detail.py +0 -63
- endoreg_db/views/patient/patient.py +5 -4
- endoreg_db/views/pdf/__init__.py +5 -8
- endoreg_db/views/pdf/pdf_stream.py +186 -0
- endoreg_db/views/pdf/pdf_stream_views.py +0 -127
- endoreg_db/views/pdf/reimport.py +86 -91
- endoreg_db/views/requirement/evaluate.py +188 -187
- endoreg_db/views/requirement/lookup.py +186 -288
- endoreg_db/views/requirement/requirement_utils.py +89 -0
- endoreg_db/views/video/__init__.py +0 -4
- endoreg_db/views/video/correction.py +2 -2
- endoreg_db/views/video/video_examination_viewset.py +202 -289
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/METADATA +7 -3
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/RECORD +350 -255
- endoreg_db/models/administration/permissions/__init__.py +0 -44
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- 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/serializers/video/video_metadata.py +0 -105
- 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/views/pdf/pdf_media.py +0 -239
- endoreg_db/views/report/__init__.py +0 -9
- 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/video_media.py +0 -158
- endoreg_db/views.py +0 -0
- /endoreg_db/data/{requirement_set → _examples/requirement_set}/endoscopy_bleeding_risk.yaml +0 -0
- /endoreg_db/migrations/{0002_add_video_correction_models.py → _old/0002_add_video_correction_models.py} +0 -0
- /endoreg_db/migrations/{0003_add_center_display_name.py → _old/0003_add_center_display_name.py} +0 -0
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import TYPE_CHECKING,
|
|
2
|
+
from typing import TYPE_CHECKING, Dict, List, Optional, Tuple
|
|
3
|
+
|
|
3
4
|
from django.db import transaction
|
|
5
|
+
|
|
4
6
|
from endoreg_db.helpers.download_segmentation_model import download_segmentation_model
|
|
5
7
|
|
|
6
8
|
# Added imports
|
|
7
9
|
|
|
8
10
|
# Configure logging
|
|
9
|
-
logger = logging.getLogger(__name__)
|
|
11
|
+
logger = logging.getLogger(__name__) # Changed from "video_file"
|
|
10
12
|
|
|
11
13
|
if TYPE_CHECKING:
|
|
12
14
|
from endoreg_db.models import VideoFile
|
|
13
15
|
|
|
14
|
-
|
|
15
16
|
# --- Pipeline 1 ---
|
|
17
|
+
|
|
18
|
+
|
|
16
19
|
def _pipe_1(
|
|
17
|
-
video_file:"VideoFile",
|
|
20
|
+
video_file: "VideoFile",
|
|
18
21
|
model_name: str,
|
|
19
22
|
model_meta_version: Optional[int] = None,
|
|
20
23
|
delete_frames_after: bool = False,
|
|
@@ -28,11 +31,12 @@ def _pipe_1(
|
|
|
28
31
|
"""
|
|
29
32
|
Pipeline 1: Extract frames, text, predict, create segments, optionally delete frames.
|
|
30
33
|
"""
|
|
31
|
-
success = False
|
|
32
|
-
from .video_file_segments import _convert_sequences_to_db_segments # Added import
|
|
33
|
-
from ...metadata import ModelMeta, VideoPredictionMeta
|
|
34
|
+
success = False # Initialize success flag
|
|
34
35
|
from endoreg_db.models import AiModel, LabelVideoSegment
|
|
35
36
|
|
|
37
|
+
from ...metadata import ModelMeta, VideoPredictionMeta
|
|
38
|
+
from .video_file_segments import _convert_sequences_to_db_segments # Added import
|
|
39
|
+
|
|
36
40
|
video_file.refresh_from_db()
|
|
37
41
|
video_file.update_video_meta()
|
|
38
42
|
|
|
@@ -43,16 +47,12 @@ def _pipe_1(
|
|
|
43
47
|
video_file.extract_frames(overwrite=False) # Avoid overwriting if already extracted
|
|
44
48
|
|
|
45
49
|
logger.info("Pipe 1: Extracting text metadata...")
|
|
46
|
-
video_file.update_text_metadata(
|
|
47
|
-
ocr_frame_fraction=ocr_frame_fraction, cap=ocr_cap, overwrite=False
|
|
48
|
-
)
|
|
50
|
+
video_file.update_text_metadata(ocr_frame_fraction=ocr_frame_fraction, cap=ocr_cap, overwrite=False)
|
|
49
51
|
with transaction.atomic():
|
|
50
52
|
state = video_file.get_or_create_state()
|
|
51
53
|
if not state.frames_extracted:
|
|
52
54
|
logger.error("Pipe 1 failed: Frame extraction did not complete successfully.")
|
|
53
55
|
return False
|
|
54
|
-
|
|
55
|
-
|
|
56
56
|
|
|
57
57
|
# 3. Perform Initial Prediction
|
|
58
58
|
logger.info(f"Pipe 1: Performing prediction with model '{model_name}'...")
|
|
@@ -74,7 +74,7 @@ def _pipe_1(
|
|
|
74
74
|
except AiModel.DoesNotExist:
|
|
75
75
|
logger.error(f"Pipe 1 failed: Model '{model_name}' not found.")
|
|
76
76
|
return False
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
except ModelMeta.DoesNotExist:
|
|
79
79
|
try:
|
|
80
80
|
model_name = download_segmentation_model()
|
|
@@ -82,11 +82,9 @@ def _pipe_1(
|
|
|
82
82
|
if model_meta_version is not None:
|
|
83
83
|
model_meta = ai_model_obj.metadata_versions.get(version=model_meta_version)
|
|
84
84
|
else:
|
|
85
|
-
model_meta =
|
|
85
|
+
model_meta = ai_model_obj.get_latest_version()
|
|
86
86
|
except ModelMeta.DoesNotExist:
|
|
87
|
-
logger.error(
|
|
88
|
-
f"Pipe 1 failed: ModelMeta version {model_meta_version} for model '{model_name}' not found."
|
|
89
|
-
)
|
|
87
|
+
logger.error(f"Pipe 1 failed: ModelMeta version {model_meta_version} for model '{model_name}' not found.")
|
|
90
88
|
return False
|
|
91
89
|
try:
|
|
92
90
|
sequences: Optional[Dict[str, List[Tuple[int, int]]]] = video_file.predict_video(
|
|
@@ -107,7 +105,7 @@ def _pipe_1(
|
|
|
107
105
|
|
|
108
106
|
# --- Set and Save State ---
|
|
109
107
|
state.initial_prediction_completed = True
|
|
110
|
-
state.save(update_fields=[
|
|
108
|
+
state.save(update_fields=["initial_prediction_completed"])
|
|
111
109
|
logger.info("Pipe 1: Set initial_prediction_completed state to True.")
|
|
112
110
|
|
|
113
111
|
logger.info(f"Pipe 1: Sequences returned from prediction: {sequences}")
|
|
@@ -117,9 +115,7 @@ def _pipe_1(
|
|
|
117
115
|
# 4. Create LabelVideoSegments
|
|
118
116
|
logger.info("Pipe 1: Creating LabelVideoSegments from predictions...")
|
|
119
117
|
try:
|
|
120
|
-
video_prediction_meta = VideoPredictionMeta.objects.get(
|
|
121
|
-
video_file=video_file, model_meta=model_meta
|
|
122
|
-
)
|
|
118
|
+
video_prediction_meta = VideoPredictionMeta.objects.get(video_file=video_file, model_meta=model_meta)
|
|
123
119
|
logger.info(f"Pipe 1: Calling _convert_sequences_to_db_segments for video {video_file.uuid} with prediction meta {video_prediction_meta.pk}")
|
|
124
120
|
_convert_sequences_to_db_segments(
|
|
125
121
|
video=video_file,
|
|
@@ -127,9 +123,9 @@ def _pipe_1(
|
|
|
127
123
|
video_prediction_meta=video_prediction_meta,
|
|
128
124
|
)
|
|
129
125
|
video_file.sequences = sequences
|
|
130
|
-
video_file.save(update_fields=[
|
|
126
|
+
video_file.save(update_fields=["sequences"])
|
|
131
127
|
state.lvs_created = True
|
|
132
|
-
state.save(update_fields=[
|
|
128
|
+
state.save(update_fields=["lvs_created"])
|
|
133
129
|
logger.info("Pipe 1: Set lvs_created state to True.")
|
|
134
130
|
logger.info("Pipe 1: LabelVideoSegment creation complete.")
|
|
135
131
|
lvs_count_after = LabelVideoSegment.objects.filter(video_file=video_file).count()
|
|
@@ -139,7 +135,7 @@ def _pipe_1(
|
|
|
139
135
|
raise
|
|
140
136
|
|
|
141
137
|
logger.info(f"Pipe 1 completed successfully for video {video_file.uuid}")
|
|
142
|
-
success = True
|
|
138
|
+
success = True # Set success flag
|
|
143
139
|
return True
|
|
144
140
|
|
|
145
141
|
except Exception as e:
|
|
@@ -147,7 +143,7 @@ def _pipe_1(
|
|
|
147
143
|
return False
|
|
148
144
|
finally:
|
|
149
145
|
# 5. Optionally delete frames
|
|
150
|
-
if delete_frames_after and success:
|
|
146
|
+
if delete_frames_after and success: # Check success flag
|
|
151
147
|
logger.info("Pipe 1: Deleting frames after processing...")
|
|
152
148
|
try:
|
|
153
149
|
video_file.delete_frames()
|
|
@@ -156,15 +152,16 @@ def _pipe_1(
|
|
|
156
152
|
logger.error(f"Pipe 1 failed during frame deletion: {e}", exc_info=True)
|
|
157
153
|
else:
|
|
158
154
|
logger.info("Pipe 1: Frame deletion skipped.")
|
|
159
|
-
|
|
155
|
+
|
|
156
|
+
|
|
160
157
|
# --- Test after Pipe 1 ---
|
|
161
|
-
def _test_after_pipe_1(video_file:"VideoFile", start_frame: int = 0, end_frame: int = 100) -> bool:
|
|
158
|
+
def _test_after_pipe_1(video_file: "VideoFile", start_frame: int = 0, end_frame: int = 100) -> bool:
|
|
162
159
|
"""
|
|
163
160
|
Simulates human annotation validation after Pipe 1.
|
|
164
161
|
Creates 'outside' segments and marks sensitive meta as verified.
|
|
165
162
|
"""
|
|
166
|
-
from ...label import
|
|
167
|
-
|
|
163
|
+
from ...label import Label, LabelVideoSegment
|
|
164
|
+
|
|
168
165
|
logger.info(f"Starting _test_after_pipe_1 for video {video_file.uuid}")
|
|
169
166
|
try:
|
|
170
167
|
# 1. Create 'outside' LabelVideoSegments
|
|
@@ -172,15 +169,15 @@ def _test_after_pipe_1(video_file:"VideoFile", start_frame: int = 0, end_frame:
|
|
|
172
169
|
outside_label = Label.objects.get(name__iexact="outside")
|
|
173
170
|
logger.info(f"Creating 'outside' annotation segment [{start_frame}-{end_frame}]")
|
|
174
171
|
# Create a segment - assuming custom_create handles saving
|
|
175
|
-
outside_segment = LabelVideoSegment.objects.create(
|
|
172
|
+
outside_segment = LabelVideoSegment.objects.create( # Assign to variable
|
|
176
173
|
video_file=video_file,
|
|
177
174
|
label=outside_label,
|
|
178
175
|
start_frame_number=start_frame,
|
|
179
176
|
end_frame_number=end_frame,
|
|
180
|
-
prediction_meta=None,
|
|
177
|
+
prediction_meta=None,
|
|
181
178
|
)
|
|
182
179
|
# Ensure the segment has a state and mark it as validated
|
|
183
|
-
segment_state, created = outside_segment.get_or_create_state()
|
|
180
|
+
segment_state, created = outside_segment.get_or_create_state() # Unpack the tuple
|
|
184
181
|
segment_state.is_validated = True
|
|
185
182
|
segment_state.save()
|
|
186
183
|
logger.info(f"Marked 'outside' segment {outside_segment.pk} as validated. Created: {created}")
|
|
@@ -202,7 +199,7 @@ def _test_after_pipe_1(video_file:"VideoFile", start_frame: int = 0, end_frame:
|
|
|
202
199
|
# Example: using a boolean field
|
|
203
200
|
video_file.sensitive_meta.state.dob_verified = True
|
|
204
201
|
video_file.sensitive_meta.state.names_verified = True
|
|
205
|
-
video_file.sensitive_meta.state.save()
|
|
202
|
+
video_file.sensitive_meta.state.save() # Save the SensitiveMeta instance
|
|
206
203
|
logger.info("Sensitive meta state updated.")
|
|
207
204
|
|
|
208
205
|
else:
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
from itertools import filterfalse
|
|
2
1
|
import logging
|
|
3
2
|
from typing import TYPE_CHECKING
|
|
4
|
-
from django.db import transaction
|
|
5
3
|
|
|
4
|
+
from django.db import transaction
|
|
6
5
|
|
|
7
6
|
# Configure logging
|
|
8
|
-
logger = logging.getLogger(__name__)
|
|
7
|
+
logger = logging.getLogger(__name__) # Changed from "video_file"
|
|
9
8
|
|
|
10
9
|
if TYPE_CHECKING:
|
|
11
10
|
from endoreg_db.models import VideoFile, VideoState
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
|
|
13
|
+
def _pipe_2(video_file: "VideoFile") -> bool:
|
|
14
14
|
"""
|
|
15
15
|
Process the given video file through pipeline 2 operations which include frame extraction,
|
|
16
16
|
anonymization of the video, and deletion of sensitive meta data.
|
|
@@ -70,11 +70,10 @@ def _pipe_2(video_file:"VideoFile") -> bool:
|
|
|
70
70
|
logger.info("Pipe 2: Anonymization complete.")
|
|
71
71
|
else:
|
|
72
72
|
logger.info("Pipe 2: Video already anonymized.")
|
|
73
|
-
|
|
74
73
|
|
|
75
74
|
# --- Part 3: Final DB operations (now in its own atomic transaction) ---
|
|
76
75
|
with transaction.atomic():
|
|
77
|
-
video_file.refresh_from_db()
|
|
76
|
+
video_file.refresh_from_db() # Ensure we have the latest video_file state for these ops
|
|
78
77
|
|
|
79
78
|
# Set sensitive_meta_processed True atomically
|
|
80
79
|
state: "VideoState" = video_file.get_or_create_state()
|
|
@@ -86,8 +85,8 @@ def _pipe_2(video_file:"VideoFile") -> bool:
|
|
|
86
85
|
try:
|
|
87
86
|
sm_pk = video_file.sensitive_meta.pk
|
|
88
87
|
video_file.sensitive_meta.delete()
|
|
89
|
-
video_file.sensitive_meta = None
|
|
90
|
-
video_file.save(update_fields=[
|
|
88
|
+
video_file.sensitive_meta = None # Important after SET_NULL
|
|
89
|
+
video_file.save(update_fields=["sensitive_meta"]) # Persist the null relation
|
|
91
90
|
logger.info("Pipe 2: Deleted sensitive meta object (PK: %s).", sm_pk)
|
|
92
91
|
except Exception as e:
|
|
93
92
|
logger.error("Pipe 2: Failed to delete sensitive meta object: %s", e, exc_info=True)
|
|
@@ -102,4 +101,4 @@ def _pipe_2(video_file:"VideoFile") -> bool:
|
|
|
102
101
|
# This will catch exceptions from I/O operations if they raise,
|
|
103
102
|
# or from the final transaction block, or any other unhandled error.
|
|
104
103
|
logger.error(f"Pipe 2 failed for video {video_file.uuid} with unhandled exception: {e}", exc_info=True)
|
|
105
|
-
return False
|
|
104
|
+
return False
|