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
|
@@ -75,7 +75,7 @@ class Command(BaseCommand):
|
|
|
75
75
|
self.stdout.write("Creating default model metadata...")
|
|
76
76
|
|
|
77
77
|
# Use a dummy weights file path for now - in production this should point to actual model weights
|
|
78
|
-
dummy_weights_path = Path(__file__).parent.parent.parent / "assets" / "dummy_model.
|
|
78
|
+
dummy_weights_path = Path(__file__).parent.parent.parent / "assets" / "dummy_model.safetensors"
|
|
79
79
|
|
|
80
80
|
# Create the dummy weights file if it doesn't exist
|
|
81
81
|
dummy_weights_path.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
from django.urls import get_resolver, URLPattern, URLResolver
|
|
3
|
+
|
|
4
|
+
def iter_patterns(prefix, patterns):
|
|
5
|
+
for p in patterns:
|
|
6
|
+
if isinstance(p, URLPattern):
|
|
7
|
+
yield p
|
|
8
|
+
elif isinstance(p, URLResolver):
|
|
9
|
+
yield from iter_patterns(prefix, p.url_patterns)
|
|
10
|
+
|
|
11
|
+
class Command(BaseCommand):
|
|
12
|
+
help = "List all URL names (useful to fill policy.py)"
|
|
13
|
+
|
|
14
|
+
def handle(self, *args, **options):
|
|
15
|
+
resolver = get_resolver()
|
|
16
|
+
for p in iter_patterns("", resolver.url_patterns):
|
|
17
|
+
if p.name:
|
|
18
|
+
self.stdout.write(p.name)
|
|
@@ -9,6 +9,7 @@ from ...data import (
|
|
|
9
9
|
)
|
|
10
10
|
from ...models import (
|
|
11
11
|
AiModel,
|
|
12
|
+
LabelSet, # Add LabelSet import
|
|
12
13
|
ModelMeta, # Add ModelMeta back to imports
|
|
13
14
|
ModelType,
|
|
14
15
|
VideoSegmentationLabel,
|
|
@@ -35,7 +36,7 @@ IMPORT_METADATA = {
|
|
|
35
36
|
"dir": AI_MODEL_META_DATA_DIR, # e.g. "ai_model_meta"
|
|
36
37
|
"model": ModelMeta, # e.g. ModelMeta
|
|
37
38
|
"foreign_keys": ["labelset", "model"], # Foreign key relationships
|
|
38
|
-
"foreign_key_models": [
|
|
39
|
+
"foreign_key_models": [LabelSet, AiModel], # Actual model classes
|
|
39
40
|
},
|
|
40
41
|
VideoSegmentationLabel.__name__: {
|
|
41
42
|
"dir": VIDEO_SEGMENTATION_LABEL_DATA_DIR, # e.g. "interventions"
|
|
@@ -14,22 +14,22 @@ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
|
|
|
14
14
|
|
|
15
15
|
IMPORT_METADATA = {
|
|
16
16
|
FirstName.__name__: {
|
|
17
|
-
"dir": NAMES_FIRST_DATA_DIR, # e.g. "
|
|
18
|
-
"model": FirstName, # e.g.
|
|
19
|
-
"foreign_keys": [],
|
|
20
|
-
"foreign_key_models": [],
|
|
17
|
+
"dir": NAMES_FIRST_DATA_DIR, # e.g. "first names"
|
|
18
|
+
"model": FirstName, # e.g. first name
|
|
19
|
+
"foreign_keys": [],
|
|
20
|
+
"foreign_key_models": [],
|
|
21
21
|
},
|
|
22
22
|
LastName.__name__: {
|
|
23
|
-
"dir": NAMES_LAST_DATA_DIR, # e.g. "
|
|
24
|
-
"model": LastName, # e.g.
|
|
25
|
-
"foreign_keys": [], # e.g. ["
|
|
26
|
-
"foreign_key_models": [], # e.g. [
|
|
23
|
+
"dir": NAMES_LAST_DATA_DIR, # e.g. "last names"
|
|
24
|
+
"model": LastName, # e.g. last name
|
|
25
|
+
"foreign_keys": [], # e.g. ["last name_types"]
|
|
26
|
+
"foreign_key_models": [], # e.g. [last nameType]
|
|
27
27
|
},
|
|
28
28
|
Center.__name__: {
|
|
29
|
-
"dir": SOURCE_DIR, # e.g. "
|
|
30
|
-
"model": Center, # e.g.
|
|
31
|
-
"foreign_keys": ["first_names", "last_names"],
|
|
32
|
-
"foreign_key_models": [FirstName, LastName],
|
|
29
|
+
"dir": SOURCE_DIR, # e.g. "centers"
|
|
30
|
+
"model": Center, # e.g. center
|
|
31
|
+
"foreign_keys": ["first_names", "last_names"],
|
|
32
|
+
"foreign_key_models": [FirstName, LastName],
|
|
33
33
|
},
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -1,43 +1,44 @@
|
|
|
1
1
|
from django.core.management.base import BaseCommand
|
|
2
|
+
|
|
2
3
|
from endoreg_db.models import (
|
|
3
|
-
RequirementType,
|
|
4
|
-
RequirementOperator,
|
|
5
|
-
Requirement,
|
|
6
|
-
RequirementSetType,
|
|
7
|
-
RequirementSet,
|
|
8
|
-
Examination,
|
|
9
|
-
ExaminationIndication,
|
|
10
4
|
Disease,
|
|
11
5
|
DiseaseClassificationChoice,
|
|
12
6
|
Event,
|
|
13
|
-
|
|
7
|
+
Examination,
|
|
8
|
+
ExaminationIndication,
|
|
9
|
+
ExaminationRequirementSet, # Added to avoid circular import issues
|
|
14
10
|
Finding,
|
|
15
11
|
FindingClassification,
|
|
16
12
|
FindingClassificationChoice,
|
|
17
13
|
FindingIntervention,
|
|
18
14
|
InformationSource,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
RiskType,
|
|
15
|
+
LabValue,
|
|
16
|
+
Medication, # Added Medication model
|
|
22
17
|
MedicationIndication,
|
|
23
18
|
MedicationIndicationType,
|
|
24
|
-
MedicationSchedule,
|
|
25
|
-
Medication, # Added Medication model
|
|
26
19
|
MedicationIntakeTime,
|
|
20
|
+
MedicationSchedule,
|
|
21
|
+
Requirement,
|
|
22
|
+
RequirementOperator,
|
|
23
|
+
RequirementSet,
|
|
24
|
+
RequirementSetType,
|
|
25
|
+
RequirementType,
|
|
26
|
+
Risk,
|
|
27
|
+
RiskType,
|
|
27
28
|
Tag,
|
|
28
|
-
|
|
29
|
+
Unit,
|
|
29
30
|
)
|
|
30
31
|
from endoreg_db.models.other.gender import Gender
|
|
31
|
-
|
|
32
|
+
|
|
32
33
|
from ...data import (
|
|
33
|
-
|
|
34
|
-
REQUIREMENT_OPERATOR_DATA_DIR,
|
|
34
|
+
EXAMINATION_REQUIREMENT_SET_DATA_DIR,
|
|
35
35
|
REQUIREMENT_DATA_DIR,
|
|
36
|
-
|
|
36
|
+
REQUIREMENT_OPERATOR_DATA_DIR,
|
|
37
37
|
REQUIREMENT_SET_DATA_DIR,
|
|
38
|
-
|
|
38
|
+
REQUIREMENT_SET_TYPE_DATA_DIR,
|
|
39
|
+
REQUIREMENT_TYPE_DATA_DIR,
|
|
39
40
|
)
|
|
40
|
-
|
|
41
|
+
from ...utils import load_model_data_from_yaml
|
|
41
42
|
|
|
42
43
|
IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
|
|
43
44
|
RequirementType.__name__,
|
|
@@ -48,6 +49,29 @@ IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
|
|
|
48
49
|
RequirementSet.__name__,
|
|
49
50
|
]
|
|
50
51
|
|
|
52
|
+
|
|
53
|
+
def _validate_requirement_configuration(fields: dict, *, entry: dict, model):
|
|
54
|
+
"""Ensures requirement fixtures declare both requirement_types and operators."""
|
|
55
|
+
name = fields.get("name") or entry.get("pk") or "<unnamed>"
|
|
56
|
+
|
|
57
|
+
def _values_missing(key: str) -> bool:
|
|
58
|
+
value = fields.get(key)
|
|
59
|
+
if not isinstance(value, list):
|
|
60
|
+
return True
|
|
61
|
+
if not value:
|
|
62
|
+
return True
|
|
63
|
+
return any(not item for item in value)
|
|
64
|
+
|
|
65
|
+
missing = [
|
|
66
|
+
key for key in ("requirement_types", "operators") if _values_missing(key)
|
|
67
|
+
]
|
|
68
|
+
if missing:
|
|
69
|
+
missing_display = ", ".join(missing)
|
|
70
|
+
raise ValueError(
|
|
71
|
+
f"{model.__name__} '{name}' is missing required configuration for: {missing_display}."
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
51
75
|
IMPORT_METADATA = {
|
|
52
76
|
RequirementType.__name__: {
|
|
53
77
|
"dir": REQUIREMENT_TYPE_DATA_DIR, # e.g. "interventions"
|
|
@@ -64,8 +88,12 @@ IMPORT_METADATA = {
|
|
|
64
88
|
ExaminationRequirementSet.__name__: {
|
|
65
89
|
"dir": EXAMINATION_REQUIREMENT_SET_DATA_DIR, # e.g. "interventions"
|
|
66
90
|
"model": ExaminationRequirementSet, # e.g. Intervention
|
|
67
|
-
"foreign_keys": [
|
|
68
|
-
|
|
91
|
+
"foreign_keys": [
|
|
92
|
+
"examinations",
|
|
93
|
+
], # Through model uses foreign keys of both models
|
|
94
|
+
"foreign_key_models": [
|
|
95
|
+
Examination,
|
|
96
|
+
],
|
|
69
97
|
},
|
|
70
98
|
# ExaminationRequirementSet.__name__,
|
|
71
99
|
Requirement.__name__: {
|
|
@@ -92,7 +120,7 @@ IMPORT_METADATA = {
|
|
|
92
120
|
"medication_schedules",
|
|
93
121
|
"medications", # Added medications
|
|
94
122
|
"medication_intake_times",
|
|
95
|
-
"genders"
|
|
123
|
+
"genders",
|
|
96
124
|
],
|
|
97
125
|
"foreign_key_models": [
|
|
98
126
|
RequirementType,
|
|
@@ -115,8 +143,9 @@ IMPORT_METADATA = {
|
|
|
115
143
|
MedicationSchedule,
|
|
116
144
|
Medication, # Added Medication model
|
|
117
145
|
MedicationIntakeTime,
|
|
118
|
-
Gender
|
|
146
|
+
Gender,
|
|
119
147
|
],
|
|
148
|
+
# "validators": [_validate_requirement_configuration],
|
|
120
149
|
},
|
|
121
150
|
RequirementSetType.__name__: {
|
|
122
151
|
"dir": REQUIREMENT_SET_TYPE_DATA_DIR, # e.g. "interventions"
|
|
@@ -133,7 +162,7 @@ IMPORT_METADATA = {
|
|
|
133
162
|
"links_to_sets",
|
|
134
163
|
"information_sources",
|
|
135
164
|
"tags",
|
|
136
|
-
"reqset_exam_links"
|
|
165
|
+
"reqset_exam_links",
|
|
137
166
|
], # e.g. ["intervention_types"]
|
|
138
167
|
"foreign_key_models": [
|
|
139
168
|
RequirementSetType,
|
|
@@ -141,7 +170,7 @@ IMPORT_METADATA = {
|
|
|
141
170
|
RequirementSet,
|
|
142
171
|
InformationSource,
|
|
143
172
|
Tag,
|
|
144
|
-
ExaminationRequirementSet
|
|
173
|
+
ExaminationRequirementSet,
|
|
145
174
|
], # e.g. [InterventionType]
|
|
146
175
|
},
|
|
147
176
|
}
|
|
@@ -155,7 +184,7 @@ class Command(BaseCommand):
|
|
|
155
184
|
def add_arguments(self, parser):
|
|
156
185
|
"""
|
|
157
186
|
Add command-line arguments to enable verbose output.
|
|
158
|
-
|
|
187
|
+
|
|
159
188
|
Adds an optional '--verbose' flag to the command parser. When specified,
|
|
160
189
|
this flag causes the command to display detailed output during execution.
|
|
161
190
|
"""
|
|
@@ -168,10 +197,10 @@ class Command(BaseCommand):
|
|
|
168
197
|
def handle(self, *args, **options):
|
|
169
198
|
"""
|
|
170
199
|
Executes data import for requirement models from YAML files.
|
|
171
|
-
|
|
172
|
-
Retrieves the verbosity setting from the command options and iterates over each model
|
|
173
|
-
listed in IMPORT_MODELS. For each model, it obtains the corresponding metadata from
|
|
174
|
-
IMPORT_METADATA and calls a helper to load the YAML data into the database. Verbose mode
|
|
200
|
+
|
|
201
|
+
Retrieves the verbosity setting from the command options and iterates over each model
|
|
202
|
+
listed in IMPORT_MODELS. For each model, it obtains the corresponding metadata from
|
|
203
|
+
IMPORT_METADATA and calls a helper to load the YAML data into the database. Verbose mode
|
|
175
204
|
enables detailed output during the process.
|
|
176
205
|
"""
|
|
177
206
|
verbose = options["verbose"]
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Management command to load default requirement set tags for role-based filtering.
|
|
3
|
+
|
|
4
|
+
⚠️ DEPRECATED: This command is deprecated. Please use 'load_tag_data' instead.
|
|
5
|
+
|
|
6
|
+
The new method loads tags from YAML configuration files, making it easier to
|
|
7
|
+
add, modify, or remove tags without changing Python code.
|
|
8
|
+
|
|
9
|
+
New Usage:
|
|
10
|
+
uv run python manage.py load_tag_data --verbose
|
|
11
|
+
|
|
12
|
+
Tags are now managed in: endoreg_db/data/tag/requirement_set_tags.yaml
|
|
13
|
+
|
|
14
|
+
This command is kept for backward compatibility but may be removed in future versions.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import logging
|
|
18
|
+
|
|
19
|
+
from django.core.management.base import BaseCommand
|
|
20
|
+
|
|
21
|
+
from endoreg_db.models import Tag
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Command(BaseCommand):
|
|
27
|
+
"""
|
|
28
|
+
⚠️ DEPRECATED: Load default requirement set tags for role-based filtering.
|
|
29
|
+
|
|
30
|
+
Please use 'load_tag_data' instead:
|
|
31
|
+
uv run python manage.py load_tag_data --verbose
|
|
32
|
+
|
|
33
|
+
This command creates or verifies the existence of default tags used
|
|
34
|
+
for filtering requirement sets by user role/expertise level.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
help = "Load default requirement set tags for role-based filtering"
|
|
38
|
+
|
|
39
|
+
def handle(self, *args, **options):
|
|
40
|
+
"""
|
|
41
|
+
Create or verify default tags for requirement set filtering.
|
|
42
|
+
|
|
43
|
+
Tags created:
|
|
44
|
+
- Gastroenterologist: For specialist-level requirements
|
|
45
|
+
- Student: For educational/basic requirements
|
|
46
|
+
- Professor: For academic/research requirements
|
|
47
|
+
- Terminology Expert: For terminology standardization
|
|
48
|
+
- Default Prototype: For baseline/reference requirements
|
|
49
|
+
"""
|
|
50
|
+
default_tags = [
|
|
51
|
+
("Gastroenterologist", "Specialist-level endoscopy requirements"),
|
|
52
|
+
("Student", "Educational and basic learning requirements"),
|
|
53
|
+
("Professor", "Academic and research-focused requirements"),
|
|
54
|
+
("Terminology Expert", "Terminology standardization requirements"),
|
|
55
|
+
("Default Prototype", "Baseline reference requirements"),
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
created_count = 0
|
|
59
|
+
updated_count = 0
|
|
60
|
+
|
|
61
|
+
for tag_name, description in default_tags:
|
|
62
|
+
tag, created = Tag.objects.get_or_create(
|
|
63
|
+
name=tag_name,
|
|
64
|
+
defaults={"description": description}
|
|
65
|
+
if hasattr(Tag, "description")
|
|
66
|
+
else {},
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
if created:
|
|
70
|
+
created_count += 1
|
|
71
|
+
self.stdout.write(self.style.SUCCESS(f"✓ Created tag: {tag_name}"))
|
|
72
|
+
logger.info(f"Created requirement set tag: {tag_name}")
|
|
73
|
+
else:
|
|
74
|
+
updated_count += 1
|
|
75
|
+
self.stdout.write(f" Tag already exists: {tag_name}")
|
|
76
|
+
|
|
77
|
+
# Summary
|
|
78
|
+
total_tags = len(default_tags)
|
|
79
|
+
self.stdout.write(
|
|
80
|
+
self.style.SUCCESS(
|
|
81
|
+
f"\n{'=' * 60}\n"
|
|
82
|
+
f"Tag Loading Complete\n"
|
|
83
|
+
f"{'=' * 60}\n"
|
|
84
|
+
f" New tags created: {created_count}\n"
|
|
85
|
+
f" Existing tags found: {updated_count}\n"
|
|
86
|
+
f" Total tags verified: {total_tags}\n"
|
|
87
|
+
f"{'=' * 60}"
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
logger.info(
|
|
92
|
+
f"Requirement set tag loading complete: "
|
|
93
|
+
f"{created_count} created, {updated_count} existing, "
|
|
94
|
+
f"{total_tags} total"
|
|
95
|
+
)
|
|
@@ -119,13 +119,17 @@ class Command(BaseCommand):
|
|
|
119
119
|
# Try to create model metadata using configurable approach
|
|
120
120
|
model_path = self._find_model_weights_file()
|
|
121
121
|
if model_path:
|
|
122
|
-
|
|
123
|
-
"
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
122
|
+
call_command_kwargs = {
|
|
123
|
+
"model_name": default_model_name,
|
|
124
|
+
"model_meta_version": 1,
|
|
125
|
+
"image_classification_labelset_name": primary_labelset,
|
|
126
|
+
"model_path": str(model_path),
|
|
127
|
+
}
|
|
128
|
+
# Add bump_version flag if force_recreate is enabled
|
|
129
|
+
if force_recreate:
|
|
130
|
+
call_command_kwargs["bump_version"] = True
|
|
131
|
+
|
|
132
|
+
call_command("create_multilabel_model_meta", **call_command_kwargs)
|
|
129
133
|
self.stdout.write(self.style.SUCCESS("✅ AI model metadata created successfully"))
|
|
130
134
|
else:
|
|
131
135
|
self.stdout.write(self.style.WARNING("⚠️ Model weights file not found. AI features may not work properly."))
|
|
@@ -154,9 +158,9 @@ class Command(BaseCommand):
|
|
|
154
158
|
|
|
155
159
|
self.stdout.write(self.style.SUCCESS("\n🎉 EndoReg DB embedded app setup completed successfully!"))
|
|
156
160
|
self.stdout.write("\nNext steps:")
|
|
157
|
-
self.stdout.write("1. Run migrations: python manage.py migrate")
|
|
158
|
-
self.stdout.write("
|
|
159
|
-
self.stdout.write("
|
|
161
|
+
# self.stdout.write("1. Run migrations: python manage.py migrate")
|
|
162
|
+
self.stdout.write("1. Create superuser: python manage.py createsuperuser")
|
|
163
|
+
self.stdout.write("2. Start development server: python manage.py runserver")
|
|
160
164
|
|
|
161
165
|
def _find_model_weights_file(self):
|
|
162
166
|
"""Find the model weights file using configurable search patterns and directories."""
|