endoreg-db 0.8.6.1__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_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 +3 -3
- 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 +110 -182
- 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_2.py +8 -9
- endoreg_db/models/media/video/video_file.py +150 -108
- 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 +125 -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 +192 -173
- 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 +0 -2
- 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/file_overview.py +11 -99
- 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/services/anonymization.py +75 -73
- endoreg_db/services/lookup_service.py +37 -24
- endoreg_db/services/pdf_import.py +166 -68
- endoreg_db/services/storage_aware_video_processor.py +140 -114
- endoreg_db/services/video_import.py +193 -283
- endoreg_db/urls/__init__.py +7 -20
- endoreg_db/urls/media.py +108 -67
- 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 +0 -10
- 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 -152
- 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 +2 -3
- endoreg_db/views/meta/sensitive_meta_detail.py +0 -63
- endoreg_db/views/patient/patient.py +5 -4
- endoreg_db/views/pdf/pdf_stream.py +20 -21
- endoreg_db/views/pdf/reimport.py +11 -32
- endoreg_db/views/requirement/evaluate.py +188 -187
- endoreg_db/views/requirement/lookup.py +17 -3
- endoreg_db/views/requirement/requirement_utils.py +89 -0
- endoreg_db/views/video/__init__.py +0 -2
- endoreg_db/views/video/correction.py +2 -2
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/METADATA +7 -3
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/RECORD +341 -245
- endoreg_db/models/administration/permissions/__init__.py +0 -44
- 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/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.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/{models/media/video/refactor_plan.md → views/pdf/pdf_stream_views.py} +0 -0
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,24 +1,27 @@
|
|
|
1
|
+
from logging import getLogger # Added logger
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
1
4
|
from django.db import models
|
|
2
|
-
from typing import TYPE_CHECKING, List
|
|
3
|
-
from logging import getLogger # Added logger
|
|
4
5
|
|
|
5
6
|
# see how operator evaluation function is fetched, add to docs #TODO
|
|
6
7
|
# endoreg_db/utils/requirement_operator_logic/model_evaluators.py
|
|
7
8
|
|
|
8
9
|
if TYPE_CHECKING:
|
|
9
10
|
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
10
|
-
from .requirement import Requirement # Added Requirement import for type hint
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
from .requirement import Requirement # Added Requirement import for type hint
|
|
13
|
+
|
|
14
|
+
logger = getLogger(__name__) # Added logger instance
|
|
15
|
+
|
|
13
16
|
|
|
14
17
|
class RequirementOperatorManager(models.Manager):
|
|
15
18
|
def get_by_natural_key(self, name):
|
|
16
19
|
"""
|
|
17
20
|
Retrieves a RequirementOperator instance by its unique name.
|
|
18
|
-
|
|
21
|
+
|
|
19
22
|
Args:
|
|
20
23
|
name: The unique name of the RequirementOperator.
|
|
21
|
-
|
|
24
|
+
|
|
22
25
|
Returns:
|
|
23
26
|
The RequirementOperator instance with the specified name.
|
|
24
27
|
"""
|
|
@@ -36,7 +39,7 @@ class RequirementOperator(models.Model):
|
|
|
36
39
|
|
|
37
40
|
name = models.CharField(max_length=100, unique=True)
|
|
38
41
|
description = models.TextField(blank=True, null=True)
|
|
39
|
-
evaluation_function_name = models.CharField(max_length=255, blank=True, null=True)
|
|
42
|
+
evaluation_function_name = models.CharField(max_length=255, blank=True, null=True) # Added field
|
|
40
43
|
|
|
41
44
|
objects = RequirementOperatorManager()
|
|
42
45
|
|
|
@@ -49,26 +52,28 @@ class RequirementOperator(models.Model):
|
|
|
49
52
|
def operator_evaluation_models(self):
|
|
50
53
|
"""
|
|
51
54
|
Returns a dictionary of operator evaluation models for this requirement operator.
|
|
52
|
-
|
|
55
|
+
|
|
53
56
|
This property dynamically imports and provides access to the available operator evaluation models.
|
|
54
57
|
"""
|
|
55
58
|
from .requirement_evaluation.operator_evaluation_models import operator_evaluation_models
|
|
59
|
+
|
|
56
60
|
return operator_evaluation_models
|
|
57
|
-
|
|
61
|
+
|
|
58
62
|
@property
|
|
59
63
|
def data_model_dict(self):
|
|
60
64
|
"""
|
|
61
65
|
Returns the dictionary of data models used for requirement evaluation.
|
|
62
|
-
|
|
66
|
+
|
|
63
67
|
This property dynamically imports and provides access to the data model dictionary relevant to requirement operators.
|
|
64
68
|
"""
|
|
65
69
|
from .requirement_evaluation.requirement_type_parser import data_model_dict
|
|
70
|
+
|
|
66
71
|
return data_model_dict
|
|
67
72
|
|
|
68
73
|
def natural_key(self):
|
|
69
74
|
"""
|
|
70
75
|
Returns a tuple containing the operator's name as its natural key.
|
|
71
|
-
|
|
76
|
+
|
|
72
77
|
The natural key uniquely identifies the requirement operator for serialization and deserialization purposes.
|
|
73
78
|
"""
|
|
74
79
|
return (self.name,)
|
|
@@ -78,12 +83,11 @@ class RequirementOperator(models.Model):
|
|
|
78
83
|
Returns the name of the requirement operator as its string representation.
|
|
79
84
|
"""
|
|
80
85
|
return str(self.name)
|
|
81
|
-
|
|
82
|
-
def evaluate(self, requirement_links: "RequirementLinks", input_links: "RequirementLinks", **kwargs) -> bool:
|
|
83
|
-
|
|
86
|
+
|
|
87
|
+
def evaluate(self, requirement_links: "RequirementLinks", input_links: "RequirementLinks", **kwargs) -> bool: # Changed signature
|
|
84
88
|
"""
|
|
85
89
|
Evaluates the requirement operator against the provided requirement links and input_links.
|
|
86
|
-
|
|
90
|
+
|
|
87
91
|
Args:
|
|
88
92
|
requirement_links: The RequirementLinks object from the Requirement model.
|
|
89
93
|
input_links: The aggregated RequirementLinks object from the input arguments.
|
|
@@ -93,7 +97,7 @@ class RequirementOperator(models.Model):
|
|
|
93
97
|
|
|
94
98
|
Returns:
|
|
95
99
|
True if the condition defined by the operator is met, False otherwise.
|
|
96
|
-
|
|
100
|
+
|
|
97
101
|
Raises:
|
|
98
102
|
NotImplementedError: If the evaluation logic for the operator's name is not implemented.
|
|
99
103
|
"""
|
|
@@ -101,36 +105,36 @@ class RequirementOperator(models.Model):
|
|
|
101
105
|
if self.evaluation_function_name:
|
|
102
106
|
eval_func = getattr(self, self.evaluation_function_name, None)
|
|
103
107
|
if eval_func and callable(eval_func):
|
|
104
|
-
|
|
108
|
+
result = eval_func(requirement_links=requirement_links, input_links=input_links, **kwargs)
|
|
109
|
+
assert isinstance(result, bool), (
|
|
110
|
+
f"Evaluation function '{self.evaluation_function_name}' for operator '{self.name}' must return a boolean value."
|
|
111
|
+
)
|
|
112
|
+
return result
|
|
105
113
|
else:
|
|
106
114
|
logger.error(
|
|
107
|
-
f"Evaluation function '{self.evaluation_function_name}' "
|
|
108
|
-
f"not found or not callable on {self.__class__.__name__} "
|
|
109
|
-
f"for operator '{self.name}'."
|
|
110
|
-
)
|
|
111
|
-
raise NotImplementedError(
|
|
112
|
-
f"Evaluation function '{self.evaluation_function_name}' "
|
|
113
|
-
f"not implemented correctly for operator '{self.name}'."
|
|
115
|
+
f"Evaluation function '{self.evaluation_function_name}' not found or not callable on {self.__class__.__name__} for operator '{self.name}'."
|
|
114
116
|
)
|
|
117
|
+
raise NotImplementedError(f"Evaluation function '{self.evaluation_function_name}' not implemented correctly for operator '{self.name}'.")
|
|
115
118
|
else:
|
|
116
119
|
# Fallback to the central dispatcher if no specific function name is provided
|
|
117
120
|
from endoreg_db.utils.requirement_operator_logic.model_evaluators import dispatch_operator_evaluation
|
|
121
|
+
|
|
118
122
|
return dispatch_operator_evaluation(
|
|
119
123
|
operator_name=self.name,
|
|
120
124
|
requirement_links=requirement_links,
|
|
121
125
|
input_links=input_links,
|
|
122
126
|
operator_instance=self, # Pass the operator instance
|
|
123
|
-
**kwargs
|
|
127
|
+
**kwargs,
|
|
124
128
|
)
|
|
125
|
-
|
|
126
|
-
from ..medical.
|
|
127
|
-
from ..medical.
|
|
129
|
+
|
|
130
|
+
from ..medical.medication import MedicationSchedule as MedicationScheduleTemplate # Added with alias
|
|
131
|
+
from ..medical.patient.patient_medication import PatientMedication # Added
|
|
128
132
|
|
|
129
133
|
def _evaluate_patient_medication_schedule_matches_template(
|
|
130
134
|
self,
|
|
131
135
|
requirement_links: "RequirementLinks",
|
|
132
136
|
input_links: "RequirementLinks",
|
|
133
|
-
requirement: "Requirement",
|
|
137
|
+
requirement: "Requirement", # Added requirement
|
|
134
138
|
**kwargs,
|
|
135
139
|
) -> bool:
|
|
136
140
|
"""
|
|
@@ -158,10 +162,10 @@ class RequirementOperator(models.Model):
|
|
|
158
162
|
|
|
159
163
|
# Check for profile match
|
|
160
164
|
medication_match = pm_instance.medication == schedule_template.medication
|
|
161
|
-
dose_match = pm_instance.dosage == schedule_template.dose
|
|
165
|
+
dose_match = pm_instance.dosage == schedule_template.dose
|
|
162
166
|
unit_match = pm_instance.unit == schedule_template.unit
|
|
163
167
|
intake_times_match = pm_intake_times_set == template_intake_times_set
|
|
164
|
-
|
|
168
|
+
|
|
165
169
|
# Debugging output (optional, can be removed)
|
|
166
170
|
# print(f"Comparing PM ID {pm_instance.id} with Template {schedule_template.name}:")
|
|
167
171
|
# print(f" Medication: {pm_instance.medication} vs {schedule_template.medication} -> {medication_match}")
|
|
@@ -169,8 +173,7 @@ class RequirementOperator(models.Model):
|
|
|
169
173
|
# print(f" Unit: {pm_instance.unit} vs {schedule_template.unit} -> {unit_match}")
|
|
170
174
|
# print(f" Intake Times: {pm_intake_times_set} vs {template_intake_times_set} -> {intake_times_match}")
|
|
171
175
|
|
|
172
|
-
|
|
173
176
|
if medication_match and dose_match and unit_match and intake_times_match:
|
|
174
177
|
return True # Found a match
|
|
175
178
|
|
|
176
|
-
return False
|
|
179
|
+
return False # No PatientMedication matched any template
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
from django.db import models
|
|
2
1
|
from typing import TYPE_CHECKING, List
|
|
3
2
|
|
|
3
|
+
from django.db import models
|
|
4
4
|
|
|
5
5
|
REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP = {
|
|
6
6
|
"all": all,
|
|
@@ -11,6 +11,7 @@ REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP = {
|
|
|
11
11
|
"at_most_1": lambda x: sum(1 for item in x if item) <= 1,
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
|
|
14
15
|
class RequirementSetTypeManager(models.Manager):
|
|
15
16
|
"""
|
|
16
17
|
Manager for RequirementSetType with custom query methods.
|
|
@@ -19,10 +20,10 @@ class RequirementSetTypeManager(models.Manager):
|
|
|
19
20
|
def get_by_natural_key(self, name: str) -> "RequirementSetType":
|
|
20
21
|
"""
|
|
21
22
|
Retrieves a RequirementSetType instance using its natural key.
|
|
22
|
-
|
|
23
|
+
|
|
23
24
|
Args:
|
|
24
25
|
name (str): The unique name that serves as the natural key.
|
|
25
|
-
|
|
26
|
+
|
|
26
27
|
Returns:
|
|
27
28
|
RequirementSetType: The matching RequirementSetType instance.
|
|
28
29
|
"""
|
|
@@ -50,7 +51,7 @@ class RequirementSetType(models.Model):
|
|
|
50
51
|
def natural_key(self):
|
|
51
52
|
"""
|
|
52
53
|
Return the natural key tuple for the instance.
|
|
53
|
-
|
|
54
|
+
|
|
54
55
|
Returns:
|
|
55
56
|
tuple: A one-element tuple containing the instance's name, used as its natural key.
|
|
56
57
|
"""
|
|
@@ -61,10 +62,10 @@ class RequirementSetManager(models.Manager):
|
|
|
61
62
|
def get_by_natural_key(self, name):
|
|
62
63
|
"""
|
|
63
64
|
Retrieves a model instance by its natural key.
|
|
64
|
-
|
|
65
|
+
|
|
65
66
|
Args:
|
|
66
67
|
name: The natural key value, typically corresponding to the model's unique name.
|
|
67
|
-
|
|
68
|
+
|
|
68
69
|
Returns:
|
|
69
70
|
The model instance whose name matches the provided natural key.
|
|
70
71
|
"""
|
|
@@ -82,53 +83,69 @@ class RequirementSet(models.Model):
|
|
|
82
83
|
|
|
83
84
|
name = models.CharField(max_length=100, unique=True)
|
|
84
85
|
description = models.TextField(blank=True, null=True)
|
|
85
|
-
|
|
86
|
+
|
|
87
|
+
depends_on = models.ManyToManyField(
|
|
88
|
+
"self",
|
|
89
|
+
symmetrical=False,
|
|
90
|
+
related_name="dependents",
|
|
91
|
+
blank=True,
|
|
92
|
+
help_text=(
|
|
93
|
+
"Andere RequirementSets, die zuerst erfüllt sein müssen, "
|
|
94
|
+
"bevor dieses Set geprüft wird ('after')."
|
|
95
|
+
),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
requirements = models.ManyToManyField(
|
|
86
99
|
"Requirement",
|
|
87
100
|
blank=True,
|
|
88
101
|
related_name="requirement_sets",
|
|
89
102
|
)
|
|
90
|
-
links_to_sets = models.ManyToManyField(
|
|
103
|
+
links_to_sets = models.ManyToManyField(
|
|
91
104
|
"RequirementSet",
|
|
92
105
|
blank=True,
|
|
93
106
|
related_name="links_from_sets",
|
|
94
107
|
)
|
|
95
|
-
requirement_set_type = models.ForeignKey(
|
|
108
|
+
requirement_set_type = models.ForeignKey(
|
|
96
109
|
"RequirementSetType",
|
|
97
110
|
on_delete=models.CASCADE,
|
|
98
111
|
related_name="requirement_sets",
|
|
99
112
|
blank=True,
|
|
100
113
|
null=True,
|
|
101
114
|
)
|
|
102
|
-
information_sources = models.ManyToManyField(
|
|
115
|
+
information_sources = models.ManyToManyField(
|
|
103
116
|
"InformationSource",
|
|
104
117
|
related_name="requirement_sets",
|
|
105
118
|
blank=True,
|
|
106
119
|
)
|
|
107
|
-
|
|
108
|
-
reqset_exam_links = models.ManyToManyField(
|
|
120
|
+
|
|
121
|
+
reqset_exam_links = models.ManyToManyField(
|
|
109
122
|
"ExaminationRequirementSet",
|
|
110
123
|
related_name="requirement_set",
|
|
111
124
|
blank=True,
|
|
112
125
|
)
|
|
113
|
-
|
|
114
|
-
tags = models.ManyToManyField(
|
|
126
|
+
|
|
127
|
+
tags = models.ManyToManyField(
|
|
115
128
|
"Tag",
|
|
116
129
|
related_name="requirement_sets",
|
|
117
130
|
blank=True,
|
|
118
131
|
)
|
|
119
|
-
|
|
132
|
+
|
|
120
133
|
objects = RequirementSetManager()
|
|
121
134
|
|
|
122
135
|
if TYPE_CHECKING:
|
|
123
|
-
from
|
|
124
|
-
|
|
136
|
+
from typing import Optional, cast
|
|
137
|
+
|
|
138
|
+
from endoreg_db.models import ExaminationRequirementSet, InformationSource, Requirement, Tag
|
|
139
|
+
|
|
140
|
+
tags = cast(models.manager.RelatedManager["Tag"], tags)
|
|
141
|
+
requirements = cast(models.manager.RelatedManager["Requirement"], requirements)
|
|
142
|
+
links_to_sets = cast(models.manager.RelatedManager["RequirementSet"], links_to_sets)
|
|
143
|
+
reqset_exam_links = cast(models.manager.RelatedManager["ExaminationRequirementSet"], reqset_exam_links)
|
|
144
|
+
information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
|
|
145
|
+
requirement_set_type: models.ForeignKey["RequirementSetType | None"]
|
|
125
146
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
information_sources: "models.Manager[InformationSource]"
|
|
129
|
-
requirement_set_type: Optional[RequirementSetType]
|
|
130
|
-
links_to_sets: "models.Manager[RequirementSet]"
|
|
131
|
-
links_from_sets: "models.Manager[RequirementSet]"
|
|
147
|
+
@property
|
|
148
|
+
def links_from_sets(self) -> "models.manager.RelatedManager[RequirementSet]": ...
|
|
132
149
|
|
|
133
150
|
def natural_key(self):
|
|
134
151
|
"""Return the natural key as a tuple containing the instance's name."""
|
|
@@ -139,19 +156,19 @@ class RequirementSet(models.Model):
|
|
|
139
156
|
Returns the name of the requirement set as its string representation.
|
|
140
157
|
"""
|
|
141
158
|
return str(self.name)
|
|
142
|
-
|
|
159
|
+
|
|
143
160
|
def evaluate_requirements(self, input_object, mode="loose") -> List[bool]:
|
|
144
161
|
"""
|
|
145
162
|
Evaluates all requirements in the set against the provided input object.
|
|
146
|
-
|
|
163
|
+
|
|
147
164
|
Intelligently selects the appropriate input data for each requirement based on its expected model types.
|
|
148
|
-
For example, if a requirement expects PatientFinding but receives a PatientExamination,
|
|
165
|
+
For example, if a requirement expects PatientFinding but receives a PatientExamination,
|
|
149
166
|
it will use the examination's patient_findings instead.
|
|
150
|
-
|
|
167
|
+
|
|
151
168
|
Args:
|
|
152
169
|
input_object: The object to be evaluated by each requirement.
|
|
153
170
|
mode: Optional evaluation mode passed to each requirement (default is "loose").
|
|
154
|
-
|
|
171
|
+
|
|
155
172
|
Returns:
|
|
156
173
|
A list of boolean values indicating whether each requirement is satisfied.
|
|
157
174
|
"""
|
|
@@ -162,36 +179,39 @@ class RequirementSet(models.Model):
|
|
|
162
179
|
result = requirement.evaluate(evaluation_input, mode=mode)
|
|
163
180
|
results.append(result)
|
|
164
181
|
return results
|
|
165
|
-
|
|
182
|
+
|
|
166
183
|
def _get_evaluation_input_for_requirement(self, requirement, input_object):
|
|
167
184
|
"""
|
|
168
185
|
Determines the appropriate input object for evaluating a specific requirement.
|
|
169
|
-
|
|
186
|
+
|
|
170
187
|
Args:
|
|
171
188
|
requirement: The requirement to be evaluated
|
|
172
189
|
input_object: The original input object
|
|
173
|
-
|
|
190
|
+
|
|
174
191
|
Returns:
|
|
175
192
|
The most appropriate input object for the requirement evaluation
|
|
176
193
|
"""
|
|
177
194
|
expected_models = requirement.expected_models
|
|
178
|
-
|
|
195
|
+
|
|
179
196
|
# If the input object is already one of the expected models, use it directly
|
|
180
197
|
for expected_model in expected_models:
|
|
181
198
|
if isinstance(input_object, expected_model):
|
|
182
199
|
return input_object
|
|
183
|
-
|
|
200
|
+
|
|
184
201
|
# Import here to avoid circular imports
|
|
185
202
|
from endoreg_db.models.medical.patient.patient_examination import PatientExamination
|
|
186
203
|
from endoreg_db.models.medical.patient.patient_finding import PatientFinding
|
|
187
|
-
|
|
204
|
+
|
|
188
205
|
# Handle PatientExamination -> PatientFinding conversion
|
|
189
206
|
if isinstance(input_object, PatientExamination):
|
|
190
|
-
# If requirement expects PatientFinding,
|
|
207
|
+
# If the requirement expects PatientFinding instances, scope queryset to relevant findings
|
|
191
208
|
if PatientFinding in expected_models:
|
|
192
|
-
|
|
209
|
+
findings_qs = input_object.patient_findings.all()
|
|
210
|
+
required_findings = list(requirement.findings.all())
|
|
211
|
+
if required_findings:
|
|
212
|
+
findings_qs = findings_qs.filter(finding__in=required_findings)
|
|
213
|
+
return findings_qs
|
|
193
214
|
|
|
194
|
-
|
|
195
215
|
# Handle other model conversions as needed in the future
|
|
196
216
|
# For now, return the original input object as fallback
|
|
197
217
|
return input_object
|
|
@@ -199,7 +219,7 @@ class RequirementSet(models.Model):
|
|
|
199
219
|
def evaluate_requirement_sets(self, input_object) -> List[bool]:
|
|
200
220
|
"""
|
|
201
221
|
Evaluates all linked requirement sets against the provided input object.
|
|
202
|
-
|
|
222
|
+
|
|
203
223
|
Returns:
|
|
204
224
|
A list of boolean values indicating whether each linked requirement set is satisfied.
|
|
205
225
|
"""
|
|
@@ -211,12 +231,12 @@ class RequirementSet(models.Model):
|
|
|
211
231
|
result = linked_set.evaluate(input_object)
|
|
212
232
|
results.append(result)
|
|
213
233
|
return results
|
|
214
|
-
|
|
234
|
+
|
|
215
235
|
@property
|
|
216
236
|
def eval_function(self):
|
|
217
237
|
"""
|
|
218
238
|
Returns the evaluation function associated with this requirement set's type.
|
|
219
|
-
|
|
239
|
+
|
|
220
240
|
If the requirement set type is defined and matches a known type, returns the corresponding function from REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP. Returns None if no matching function is found.
|
|
221
241
|
"""
|
|
222
242
|
if self.requirement_set_type and self.requirement_set_type.name in REQUIREMENT_SET_TYPE_FUNCTION_LOOKUP:
|
|
@@ -226,12 +246,12 @@ class RequirementSet(models.Model):
|
|
|
226
246
|
def evaluate(self, input_object):
|
|
227
247
|
"""
|
|
228
248
|
Evaluates whether the input object satisfies this requirement set.
|
|
229
|
-
|
|
249
|
+
|
|
230
250
|
Combines the evaluation results of all direct requirements and linked requirement sets, then applies the set's evaluation function (such as all, any, none, etc.) to determine if the input object meets the overall criteria.
|
|
231
|
-
|
|
251
|
+
|
|
232
252
|
Args:
|
|
233
253
|
input_object: The object to be evaluated against the requirements and linked sets.
|
|
234
|
-
|
|
254
|
+
|
|
235
255
|
Returns:
|
|
236
256
|
True if the input object satisfies the requirement set according to its evaluation logic; otherwise, False.
|
|
237
257
|
"""
|
|
@@ -243,45 +263,42 @@ class RequirementSet(models.Model):
|
|
|
243
263
|
eval_result = self.eval_function(results) if self.eval_function else all(results)
|
|
244
264
|
|
|
245
265
|
return eval_result
|
|
246
|
-
|
|
266
|
+
|
|
247
267
|
@property
|
|
248
268
|
def all_linked_sets(self):
|
|
249
269
|
"""
|
|
250
270
|
Returns all linked requirement sets, including those linked to the current set and those linked to any of its linked sets.
|
|
251
|
-
|
|
271
|
+
|
|
252
272
|
Uses recursive traversal with cycle detection to safely handle circular relationships.
|
|
253
273
|
Eliminates duplicates by tracking visited sets.
|
|
254
|
-
|
|
274
|
+
|
|
255
275
|
Returns:
|
|
256
276
|
List[RequirementSet]: A list of all linked requirement sets.
|
|
257
277
|
"""
|
|
258
278
|
visited = set()
|
|
259
|
-
result:List["RequirementSet"] = []
|
|
260
|
-
|
|
261
|
-
def _collect_linked_sets(requirement_set:"RequirementSet"):
|
|
279
|
+
result: List["RequirementSet"] = []
|
|
280
|
+
|
|
281
|
+
def _collect_linked_sets(requirement_set: "RequirementSet"):
|
|
262
282
|
"""
|
|
263
283
|
Recursively collect linked sets while avoiding cycles and duplicates.
|
|
264
|
-
|
|
284
|
+
|
|
265
285
|
Args:
|
|
266
286
|
requirement_set: The RequirementSet to process
|
|
267
287
|
"""
|
|
268
288
|
# Use the primary key to track visited sets (avoids issues with object comparison)
|
|
269
289
|
if requirement_set.pk in visited:
|
|
270
290
|
return
|
|
271
|
-
|
|
291
|
+
|
|
272
292
|
visited.add(requirement_set.pk)
|
|
273
|
-
|
|
293
|
+
|
|
274
294
|
# Process all directly linked sets
|
|
275
295
|
for linked_set in requirement_set.links_to_sets.all():
|
|
276
296
|
if linked_set.pk not in visited:
|
|
277
297
|
result.append(linked_set)
|
|
278
298
|
# Recursively process the linked set's links
|
|
279
299
|
_collect_linked_sets(linked_set)
|
|
280
|
-
|
|
300
|
+
|
|
281
301
|
# Start the recursive collection from this instance
|
|
282
302
|
_collect_linked_sets(self)
|
|
283
|
-
|
|
284
|
-
return result
|
|
285
|
-
|
|
286
|
-
|
|
287
303
|
|
|
304
|
+
return result
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
from .sensitive_meta import SensitiveMetaState
|
|
2
|
-
from .video import VideoState, AnonymizationStatus
|
|
3
1
|
from .label_video_segment import LabelVideoSegmentState
|
|
4
2
|
from .raw_pdf import RawPdfState
|
|
5
|
-
|
|
3
|
+
from .sensitive_meta import SensitiveMetaState
|
|
4
|
+
from .video import VideoState
|
|
5
|
+
from .anonymization import AnonymizationState
|
|
6
6
|
__all__ = [
|
|
7
7
|
"SensitiveMetaState",
|
|
8
8
|
"VideoState",
|
|
9
9
|
"LabelVideoSegmentState",
|
|
10
|
-
"
|
|
10
|
+
"AnonymizationState",
|
|
11
11
|
"RawPdfState",
|
|
12
12
|
]
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from django.db import models
|
|
2
2
|
|
|
3
|
+
|
|
3
4
|
class AbstractState(models.Model):
|
|
4
5
|
"""Abstract base class for all states."""
|
|
5
6
|
|
|
6
7
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
7
8
|
updated_at = models.DateTimeField(auto_now=True)
|
|
8
9
|
|
|
9
|
-
|
|
10
10
|
class Meta:
|
|
11
|
-
abstract = True
|
|
11
|
+
abstract = True
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class AnonymizationState(str, Enum):
|
|
5
|
+
NOT_STARTED = "not_started"
|
|
6
|
+
EXTRACTING_FRAMES = "extracting_frames"
|
|
7
|
+
PROCESSING_ANONYMIZING = "processing_anonymization"
|
|
8
|
+
DONE_PROCESSING_ANONYMIZATION = "done_processing_anonymization"
|
|
9
|
+
VALIDATED = "validated"
|
|
10
|
+
FAILED = "failed"
|
|
11
|
+
STARTED = "started"
|
|
12
|
+
ANONYMIZED = "anonymized"
|