endoreg-db 0.6.4__py3-none-any.whl → 0.8.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/admin.py +26 -26
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +12 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +12 -0
- endoreg_db/data/ai_model/data.yaml +1 -1
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +20 -1
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/center/data.yaml +13 -12
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/misc.yaml +1 -2
- endoreg_db/data/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +14 -9
- endoreg_db/data/examination_indication/endoscopy.yaml +30 -30
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +11 -11
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +3 -46
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_circularity_default.yaml +0 -2
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_nice.yaml +4 -7
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_paris.yaml +0 -8
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_planarity_default.yaml +6 -13
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_surface_intact_default.yaml +3 -6
- endoreg_db/data/{finding_location_classification_choice/colonoscopy.yaml → finding_classification_choice/colonoscopy_location.yaml} +11 -22
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +8 -3
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +6 -6
- endoreg_db/data/finding_type/data.yaml +23 -10
- endoreg_db/data/gender/data.yaml +8 -1
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/misc.yaml +43 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- endoreg_db/data/names_first/first_names.yaml +3 -0
- endoreg_db/data/pdf_type/data.yaml +26 -2
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +6 -6
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +9 -6
- endoreg_db/data/requirement/disease_hepatology.yaml +1 -1
- endoreg_db/data/requirement/disease_misc.yaml +3 -3
- endoreg_db/data/requirement/disease_renal.yaml +18 -2
- endoreg_db/data/requirement/{colonoscopy_indications.yaml → endoscopy_bleeding_risk.yaml} +6 -3
- endoreg_db/data/requirement/event_cardiology.yaml +17 -17
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +352 -31
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +36 -35
- endoreg_db/data/requirement_operator/model_operators.yaml +13 -7
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +42 -2
- endoreg_db/data/requirement_type/requirement_types.yaml +82 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/unit/concentration.yaml +23 -0
- endoreg_db/exceptions.py +19 -0
- endoreg_db/forms/patient_finding_intervention_form.py +4 -5
- endoreg_db/forms/patient_form.py +7 -6
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +359 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +422 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +2 -7
- endoreg_db/management/commands/load_base_db_data.py +1 -0
- endoreg_db/management/commands/load_endoscope_data.py +2 -2
- endoreg_db/management/commands/load_examination_indication_data.py +2 -3
- endoreg_db/management/commands/load_finding_data.py +49 -92
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
- endoreg_db/management/commands/load_information_source.py +13 -7
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_requirement_data.py +30 -6
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/register_ai_model.py +1 -1
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/migrations/0001_initial.py +625 -813
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/models/__init__.py +270 -307
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/{ai_model → administration/ai}/__init__.py +6 -1
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/{ai_model → administration/ai}/model_type.py +6 -1
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +3 -3
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +3 -10
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +2 -4
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +3 -1
- endoreg_db/models/administration/center/center.py +61 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/{center → administration/center}/center_resource.py +19 -3
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
- endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/{product → administration/product}/product_weight.py +9 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +26 -11
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -1
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +45 -74
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/{annotation → label}/video_segmentation_labelset.py +7 -0
- endoreg_db/models/media/__init__.py +14 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +608 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/video/__init__.py +4 -0
- endoreg_db/models/media/video/create_from_file.py +336 -0
- endoreg_db/models/media/video/pipe_1.py +195 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +680 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +348 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +166 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_meta.py +11 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/{contraindication → medical/contraindication}/__init__.py +1 -5
- endoreg_db/models/{disease.py → medical/disease.py} +60 -52
- endoreg_db/models/{event.py → medical/event.py} +31 -54
- endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/{examination → medical/examination}/examination_indication.py +64 -35
- endoreg_db/models/{examination → medical/examination}/examination_time.py +0 -4
- endoreg_db/models/{examination → medical/examination}/examination_time_type.py +1 -8
- endoreg_db/models/{examination → medical/examination}/examination_type.py +1 -7
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/{finding → medical/finding}/finding_intervention.py +2 -10
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscope.py +28 -23
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/{medication → medical/medication}/medication.py +1 -3
- endoreg_db/models/{medication → medical/medication}/medication_indication_type.py +8 -3
- endoreg_db/models/{medication → medical/medication}/medication_intake_time.py +21 -3
- endoreg_db/models/{medication → medical/medication}/medication_schedule.py +13 -5
- endoreg_db/models/{organ → medical/organ}/__init__.py +3 -6
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/{persons → medical}/patient/patient_examination_indication.py +21 -9
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/{patient → medical/patient}/patient_finding_intervention.py +15 -1
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +40 -15
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/{risk → medical/risk}/risk_type.py +0 -4
- endoreg_db/models/{data_file/metadata → metadata}/__init__.py +6 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +193 -0
- endoreg_db/models/metadata/model_meta_logic.py +236 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +28 -13
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +643 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +17 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +0 -2
- endoreg_db/models/other/distribution/numeric_value_distribution.py +30 -2
- endoreg_db/models/{emission → other/emission}/emission_factor.py +15 -6
- endoreg_db/models/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +10 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +13 -2
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- endoreg_db/models/requirement/requirement.py +556 -114
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +4 -132
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +80 -87
- endoreg_db/models/requirement/requirement_operator.py +132 -14
- endoreg_db/models/requirement/requirement_set.py +181 -21
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/{rules → rule}/rule.py +6 -3
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
- endoreg_db/models/{rules → rule}/rule_type.py +0 -2
- endoreg_db/models/{rules → rule}/ruleset.py +0 -2
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/models/video_metadata.py +66 -0
- endoreg_db/models/video_processing.py +153 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +147 -10
- endoreg_db/serializers/{raw_pdf_meta_validation.py → _old/raw_pdf_meta_validation.py} +3 -3
- endoreg_db/serializers/{raw_video_meta_validation.py → _old/raw_video_meta_validation.py} +18 -14
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +66 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +152 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/misc/vop_patient_data.py +120 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +241 -0
- endoreg_db/services/lookup_store.py +122 -0
- endoreg_db/services/ollama_api_docs.py +1528 -0
- endoreg_db/services/pdf_import.py +993 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +915 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/urls/__init__.py +72 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +44 -0
- endoreg_db/urls/media.py +32 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/pdf.py +0 -0
- endoreg_db/urls/report.py +78 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +36 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +119 -0
- endoreg_db/urls.py +6 -283
- endoreg_db/utils/__init__.py +66 -57
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- endoreg_db/{models/ai_model/lightning → utils/ai}/inference_dataset.py +0 -1
- endoreg_db/{models/ai_model/lightning → utils/ai}/multilabel_classification_net.py +14 -10
- endoreg_db/{models/ai_model/lightning → utils/ai}/postprocess.py +15 -5
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/{models/ai_model/lightning → utils/ai}/preprocess.py +1 -1
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/dataloader.py +50 -12
- endoreg_db/utils/dates.py +21 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +29 -1
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +2 -0
- endoreg_db/utils/paths.py +100 -82
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/db_config.py +1 -1
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +19 -6
- endoreg_db/utils/video/extract_frames.py +37 -70
- endoreg_db/utils/video/ffmpeg_wrapper.py +772 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +282 -2
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +63 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/{views.py → auth/keycloak.py} +19 -13
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +9 -0
- endoreg_db/views/media/pdf_media.py +386 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +11 -0
- endoreg_db/views/pdf/pdf_media.py +239 -0
- endoreg_db/views/pdf/pdf_stream_views.py +127 -0
- endoreg_db/views/pdf/reimport.py +151 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +483 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +72 -0
- endoreg_db/views/video/correction.py +672 -0
- endoreg_db/views/video/media/__init__.py +23 -0
- endoreg_db/views/video/media/task_status.py +49 -0
- endoreg_db/views/video/media/video_analyze.py +52 -0
- endoreg_db/views/video/media/video_apply_mask.py +48 -0
- endoreg_db/views/video/media/video_correction.py +21 -0
- endoreg_db/views/video/media/video_download_processed.py +58 -0
- endoreg_db/views/video/media/video_media.py +158 -0
- endoreg_db/views/video/media/video_meta.py +29 -0
- endoreg_db/views/video/media/video_processing_history.py +24 -0
- endoreg_db/views/video/media/video_remove_frames.py +48 -0
- endoreg_db/views/video/media/video_reprocess.py +40 -0
- endoreg_db/views/video/reimport.py +192 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
- endoreg_db/views/video/video_examination_viewset.py +329 -0
- endoreg_db/views/video/video_stream.py +188 -0
- endoreg_db-0.8.1.dist-info/METADATA +384 -0
- endoreg_db-0.8.1.dist-info/RECORD +789 -0
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/finding_location_classification/colonoscopy.yaml +0 -46
- endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +0 -48
- endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +0 -57
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
- endoreg_db/management/commands/fix_auth_permission.py +0 -20
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_logging_data.py +0 -39
- endoreg_db/management/commands/load_lx_data.py +0 -64
- endoreg_db/management/commands/load_medication_indication_data.py +0 -63
- endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
- endoreg_db/management/commands/load_medication_intake_time_data.py +0 -41
- endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
- endoreg_db/management/commands/load_network_data.py +0 -57
- endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +0 -25
- endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +0 -33
- endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +0 -23
- endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +0 -24
- endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +0 -48
- endoreg_db/migrations/0009_requirementoperator_requirementsettype_and_more.py +0 -154
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/ai_model.py +0 -90
- endoreg_db/models/ai_model/lightning/__init__.py +0 -3
- endoreg_db/models/ai_model/lightning/predict.py +0 -172
- endoreg_db/models/ai_model/lightning/prediction_visualizer.py +0 -55
- endoreg_db/models/ai_model/lightning/run_visualizer.py +0 -21
- endoreg_db/models/ai_model/model_meta.py +0 -240
- endoreg_db/models/annotation/__init__.py +0 -32
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -115
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -117
- endoreg_db/models/annotation/image_classification.py +0 -86
- endoreg_db/models/annotation/video_segmentation_annotation.py +0 -52
- endoreg_db/models/case/__init__.py +0 -1
- endoreg_db/models/case/case.py +0 -34
- endoreg_db/models/center/center.py +0 -51
- endoreg_db/models/center/center_product.py +0 -33
- endoreg_db/models/center/center_waste.py +0 -16
- endoreg_db/models/data_file/__init__.py +0 -39
- endoreg_db/models/data_file/base_classes/__init__.py +0 -7
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -98
- endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -127
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -806
- endoreg_db/models/data_file/base_classes/frame_helpers.py +0 -17
- endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +0 -19
- endoreg_db/models/data_file/base_classes/utils.py +0 -58
- endoreg_db/models/data_file/frame.py +0 -29
- endoreg_db/models/data_file/import_classes/__init__.py +0 -18
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -254
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -290
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -290
- endoreg_db/models/data_file/metadata/video_meta.py +0 -199
- endoreg_db/models/data_file/report_file.py +0 -56
- endoreg_db/models/data_file/video/__init__.py +0 -11
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -196
- endoreg_db/models/data_file/video_segment.py +0 -214
- endoreg_db/models/examination/examination.py +0 -67
- endoreg_db/models/finding/__init__.py +0 -11
- endoreg_db/models/finding/finding.py +0 -75
- endoreg_db/models/finding/finding_location_classification.py +0 -94
- endoreg_db/models/finding/finding_morphology_classification.py +0 -89
- endoreg_db/models/finding/finding_type.py +0 -22
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/information_source.py +0 -65
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -162
- endoreg_db/models/logging/__init__.py +0 -11
- endoreg_db/models/logging/agl_service.py +0 -19
- endoreg_db/models/logging/base.py +0 -22
- endoreg_db/models/logging/log_type.py +0 -23
- endoreg_db/models/logging/network_device.py +0 -27
- endoreg_db/models/lx/__init__.py +0 -4
- endoreg_db/models/lx/client.py +0 -57
- endoreg_db/models/lx/identity.py +0 -34
- endoreg_db/models/lx/permission.py +0 -18
- endoreg_db/models/lx/user.py +0 -16
- endoreg_db/models/network/__init__.py +0 -9
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -58
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -5
- endoreg_db/models/patient/__init__.py +0 -24
- endoreg_db/models/patient/patient_examination.py +0 -182
- endoreg_db/models/patient/patient_finding.py +0 -143
- endoreg_db/models/patient/patient_finding_location.py +0 -120
- endoreg_db/models/patient/patient_finding_morphology.py +0 -166
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -34
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -60
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/patient.py +0 -389
- endoreg_db/models/persons/patient/patient_disease.py +0 -22
- endoreg_db/models/persons/patient/patient_event.py +0 -52
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -108
- endoreg_db/models/persons/patient/patient_medication.py +0 -59
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -88
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -8
- endoreg_db/models/prediction/image_classification.py +0 -51
- endoreg_db/models/prediction/video_prediction_meta.py +0 -306
- endoreg_db/models/product/product.py +0 -110
- endoreg_db/models/product/product_group.py +0 -27
- endoreg_db/models/product/product_material.py +0 -28
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -9
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/report_reader_config.py +0 -53
- endoreg_db/models/rules/__init__.py +0 -5
- endoreg_db/queries/get/__init__.py +0 -6
- endoreg_db/queries/get/center.py +0 -42
- endoreg_db/queries/get/model.py +0 -13
- endoreg_db/queries/get/patient.py +0 -14
- endoreg_db/queries/get/patient_examination.py +0 -20
- endoreg_db/queries/get/report_file.py +0 -33
- endoreg_db/queries/get/video.py +0 -31
- endoreg_db/serializers/ai_model.py +0 -19
- endoreg_db/serializers/annotation.py +0 -14
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -9
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -33
- endoreg_db/serializers/prediction.py +0 -10
- endoreg_db/serializers/raw_pdf_anony_text_validation.py +0 -137
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -20
- endoreg_db/serializers/video_segmentation.py +0 -574
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video/transcode_videofile.py +0 -111
- endoreg_db/views/patient_views.py +0 -90
- endoreg_db/views/raw_pdf_anony_text_validation_views.py +0 -95
- endoreg_db/views/raw_pdf_meta_validation_views.py +0 -111
- endoreg_db/views/raw_video_meta_validation_views.py +0 -148
- endoreg_db/views/report_views.py +0 -96
- endoreg_db/views/video_segmentation_views.py +0 -166
- endoreg_db-0.6.4.dist-info/METADATA +0 -161
- endoreg_db-0.6.4.dist-info/RECORD +0 -470
- /endoreg_db/{case_generator/__init__.py → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
- /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
- /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
- /endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{product → administration/product}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/__init__.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/medication_indication.py +0 -0
- /endoreg_db/models/{risk → medical/risk}/__init__.py +0 -0
- /endoreg_db/models/{risk → medical/risk}/risk.py +0 -0
- /endoreg_db/models/{emission → other/emission}/__init__.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/case_generator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/lab_sample_factory.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/utils.py +0 -0
- /endoreg_db/views/{csrf.py → misc/csrf.py} +0 -0
- {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
- {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,134 +1,6 @@
|
|
|
1
|
-
from
|
|
2
|
-
from endoreg_db.models import (
|
|
3
|
-
Patient,
|
|
4
|
-
PatientExamination,
|
|
5
|
-
Finding,
|
|
6
|
-
FindingIntervention,
|
|
7
|
-
FindingLocationClassification,
|
|
8
|
-
Requirement,
|
|
9
|
-
)
|
|
1
|
+
# from .operator_functions import get_operator_function
|
|
10
2
|
|
|
11
3
|
|
|
12
|
-
|
|
13
|
-
""
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
This function inspects the provided requirement to determine which keyword arguments are relevant
|
|
17
|
-
for its evaluation. It constructs and returns a dictionary of arguments suitable for processing the
|
|
18
|
-
requirement with its associated operator.
|
|
19
|
-
|
|
20
|
-
Args:
|
|
21
|
-
requirement: The requirement instance used to identify the applicable parameters.
|
|
22
|
-
**kwargs: Additional keyword arguments that may include values required for evaluation.
|
|
23
|
-
|
|
24
|
-
Returns:
|
|
25
|
-
A dictionary mapping relevant parameter names to their corresponding values.
|
|
26
|
-
"""
|
|
27
|
-
pass
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def models_match_all(requirement: Requirement, **kwargs):
|
|
31
|
-
"""
|
|
32
|
-
Match all models for a given requirement.
|
|
33
|
-
|
|
34
|
-
Retrieves the models dictionary from the requirement by calling its get_models_dict() method.
|
|
35
|
-
Additional keyword arguments are accepted for future extensions. Note that this function
|
|
36
|
-
currently only extracts the models without performing any matching logic.
|
|
37
|
-
"""
|
|
38
|
-
models_dict = requirement.get_models_dict()
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
SUPPORTED_REQUIREMENT_TYPES = ["patient_examination", "patient"]
|
|
42
|
-
SUPPORTED_OPERATORS = {
|
|
43
|
-
"models_match_all": models_match_all,
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def get_operator_function(operator_name):
|
|
48
|
-
"""
|
|
49
|
-
Retrieves the operator function for the given operator name.
|
|
50
|
-
|
|
51
|
-
This function looks up the operator name in the supported operators mapping
|
|
52
|
-
and returns the corresponding operator function used for evaluating requirements.
|
|
53
|
-
If the operator name is not recognized, the behavior is undefined.
|
|
54
|
-
|
|
55
|
-
Args:
|
|
56
|
-
operator_name: The name of the operator to retrieve.
|
|
57
|
-
|
|
58
|
-
Returns:
|
|
59
|
-
The operator function associated with the operator name.
|
|
60
|
-
"""
|
|
61
|
-
pass
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def get_values_from_kwargs(
|
|
65
|
-
requirement: Requirement,
|
|
66
|
-
patient: Optional[Patient] = None,
|
|
67
|
-
patient_examination: Optional[PatientExamination] = None,
|
|
68
|
-
**kwargs,
|
|
69
|
-
) -> dict:
|
|
70
|
-
"""
|
|
71
|
-
Extracts and validates values for requirement evaluation.
|
|
72
|
-
|
|
73
|
-
This function aggregates values from keyword arguments along with
|
|
74
|
-
the 'patient' and 'patient_examination' inputs based on the requirement's types.
|
|
75
|
-
It verifies that all requirement types are supported—currently, only types like
|
|
76
|
-
'patient_examination' and 'patient' are allowed—and ensures that the corresponding
|
|
77
|
-
parameters are provided when required. A ValueError is raised if an unsupported
|
|
78
|
-
requirement type is encountered or if a required parameter is missing.
|
|
79
|
-
|
|
80
|
-
Args:
|
|
81
|
-
requirement (Requirement): The evaluation criterion containing requirement types.
|
|
82
|
-
patient (Optional[Patient]): Patient details, required if the requirement includes 'patient'.
|
|
83
|
-
patient_examination (Optional[PatientExamination]): Examination details, required if the requirement includes 'patient_examination'.
|
|
84
|
-
**kwargs: Additional keyword arguments for the evaluation.
|
|
85
|
-
|
|
86
|
-
Raises:
|
|
87
|
-
ValueError: If a requirement type is unsupported or a necessary parameter is missing.
|
|
88
|
-
|
|
89
|
-
Returns:
|
|
90
|
-
dict: A dictionary combining 'patient', 'patient_examination', and additional keyword arguments.
|
|
91
|
-
"""
|
|
92
|
-
requirement_types = [_.name for _ in requirement.requirement_types]
|
|
93
|
-
# operators = [_.name for _ in requirement.operators] # Uncomment when needed
|
|
94
|
-
|
|
95
|
-
for requirement_type in requirement_types:
|
|
96
|
-
if requirement_type not in SUPPORTED_REQUIREMENT_TYPES:
|
|
97
|
-
raise ValueError(f"Unsupported requirement type: {requirement_type}")
|
|
98
|
-
|
|
99
|
-
if "patient_examination" in requirement_types:
|
|
100
|
-
if patient_examination is None:
|
|
101
|
-
raise ValueError(
|
|
102
|
-
"patient_examination is required for this requirement type"
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
if "patient" in requirement_types:
|
|
106
|
-
if patient is None:
|
|
107
|
-
raise ValueError("patient is required for this requirement type")
|
|
108
|
-
|
|
109
|
-
# Prepare and return the extracted values
|
|
110
|
-
return {"patient": patient, "patient_examination": patient_examination, **kwargs}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def evaluate_requirement(
|
|
114
|
-
requirement: Requirement,
|
|
115
|
-
**kwargs,
|
|
116
|
-
):
|
|
117
|
-
"""
|
|
118
|
-
Evaluates the given requirement against provided parameters.
|
|
119
|
-
|
|
120
|
-
This function determines if the requirement is met based on its type and
|
|
121
|
-
the additional evaluation inputs supplied via keyword arguments. Evaluation
|
|
122
|
-
may depend on context-specific data, such as patient or examination details,
|
|
123
|
-
as required by the requirement.
|
|
124
|
-
|
|
125
|
-
Args:
|
|
126
|
-
requirement (Requirement): The requirement to evaluate.
|
|
127
|
-
**kwargs: Additional parameters that support the evaluation process.
|
|
128
|
-
|
|
129
|
-
Returns:
|
|
130
|
-
bool: True if the requirement is met, False otherwise.
|
|
131
|
-
"""
|
|
132
|
-
# Implement the logic to evaluate the requirement based on its type
|
|
133
|
-
# and the provided keyword arguments.
|
|
134
|
-
pass
|
|
4
|
+
__all__ = [
|
|
5
|
+
# "get_operator_function"
|
|
6
|
+
]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Optional
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from endoreg_db.models import (
|
|
6
|
+
Patient,
|
|
7
|
+
PatientExamination,
|
|
8
|
+
Requirement,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
def get_values_from_kwargs(
|
|
12
|
+
requirement: "Requirement",
|
|
13
|
+
patient: Optional["Patient"] = None,
|
|
14
|
+
patient_examination: Optional["PatientExamination"] = None,
|
|
15
|
+
**kwargs,
|
|
16
|
+
) -> dict:
|
|
17
|
+
"""
|
|
18
|
+
Aggregates and validates input values required for evaluating a requirement.
|
|
19
|
+
|
|
20
|
+
Checks the requirement's types to ensure that necessary parameters such as `patient` or `patient_examination` are provided when required. Raises a ValueError if a required parameter is missing. Returns a dictionary containing the validated inputs and any additional keyword arguments.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
A dictionary with keys for 'patient', 'patient_examination', and any extra keyword arguments.
|
|
24
|
+
"""
|
|
25
|
+
requirement_types = [_.name for _ in requirement.requirement_types]
|
|
26
|
+
# operators = [_.name for _ in requirement.operators] # Uncomment when needed
|
|
27
|
+
|
|
28
|
+
if "patient_examination" in requirement_types:
|
|
29
|
+
if patient_examination is None:
|
|
30
|
+
raise ValueError(
|
|
31
|
+
"patient_examination is required for this requirement type"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
if "patient" in requirement_types:
|
|
35
|
+
if patient is None:
|
|
36
|
+
raise ValueError("patient is required for this requirement type")
|
|
37
|
+
|
|
38
|
+
# Prepare and return the extracted values
|
|
39
|
+
return {"patient": patient, "patient_examination": patient_examination, **kwargs}
|
|
40
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from endoreg_db.models import (
|
|
2
|
+
PatientExamination
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
#TODO this should be a list of all models that are used in the requirement evaluation
|
|
6
|
+
#TODO All those models must have a "get_requirement_links" property
|
|
7
|
+
operator_evaluation_models = [
|
|
8
|
+
PatientExamination,
|
|
9
|
+
]
|
|
@@ -1,102 +1,95 @@
|
|
|
1
1
|
# Currently those strings MUST match the ones
|
|
2
2
|
# in the requirement_type data definitions
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
from typing import Dict, Union
|
|
4
5
|
from endoreg_db.models import (
|
|
5
|
-
Requirement,
|
|
6
|
-
RequirementType,
|
|
7
|
-
PatientExamination,
|
|
8
|
-
PatientFindingIntervention,
|
|
9
|
-
Examination,
|
|
10
|
-
ExaminationIndication,
|
|
11
6
|
Disease,
|
|
7
|
+
DiseaseClassification,
|
|
12
8
|
DiseaseClassificationChoice,
|
|
9
|
+
Event,
|
|
10
|
+
EventClassification,
|
|
11
|
+
EventClassificationChoice,
|
|
12
|
+
Examination,
|
|
13
|
+
ExaminationIndication,
|
|
14
|
+
Finding,
|
|
15
|
+
FindingIntervention,
|
|
16
|
+
FindingClassification,
|
|
17
|
+
FindingClassificationChoice,
|
|
18
|
+
LabValue,
|
|
19
|
+
PatientDisease,
|
|
13
20
|
PatientEvent,
|
|
21
|
+
PatientExamination,
|
|
14
22
|
PatientFinding,
|
|
15
|
-
|
|
23
|
+
PatientFindingClassification,
|
|
24
|
+
PatientFindingIntervention,
|
|
25
|
+
PatientLabValue,
|
|
26
|
+
PatientLabSample, # Assuming PatientLabSample is defined elsewhere,
|
|
27
|
+
Patient,
|
|
28
|
+
PatientMedication, # Added PatientMedication
|
|
29
|
+
PatientMedicationSchedule, # Added PatientMedicationSchedule
|
|
16
30
|
)
|
|
17
|
-
from
|
|
18
|
-
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
31
|
+
from endoreg_db.models.other.gender import Gender
|
|
32
|
+
# if TYPE_CHECKING:
|
|
33
|
+
# from endoreg_db.models import (
|
|
34
|
+
# RequirementOperator,
|
|
35
|
+
# Patient,
|
|
36
|
+
# )
|
|
23
37
|
|
|
24
|
-
OperatorTypeTuple = namedtuple("OperatorTypeTuple", ["operator", "requirement_type"])
|
|
25
38
|
|
|
26
39
|
|
|
27
|
-
data_model_dict
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
40
|
+
data_model_dict: Dict[str, Union[
|
|
41
|
+
Disease,
|
|
42
|
+
DiseaseClassification,
|
|
43
|
+
DiseaseClassificationChoice,
|
|
44
|
+
Event,
|
|
45
|
+
EventClassification,
|
|
46
|
+
EventClassificationChoice,
|
|
47
|
+
Examination,
|
|
48
|
+
ExaminationIndication,
|
|
49
|
+
Finding,
|
|
50
|
+
FindingIntervention,
|
|
51
|
+
FindingClassification,
|
|
52
|
+
FindingClassificationChoice,
|
|
53
|
+
LabValue,
|
|
54
|
+
PatientDisease,
|
|
55
|
+
PatientEvent,
|
|
56
|
+
PatientExamination,
|
|
57
|
+
PatientFinding,
|
|
58
|
+
PatientFindingIntervention,
|
|
59
|
+
PatientFindingClassification,
|
|
60
|
+
PatientLabValue,
|
|
61
|
+
PatientLabSample,
|
|
62
|
+
Patient,
|
|
63
|
+
PatientMedication, # Added PatientMedication
|
|
64
|
+
PatientMedicationSchedule, # Added PatientMedicationSchedule
|
|
65
|
+
]] = {
|
|
33
66
|
"disease": Disease,
|
|
34
67
|
"disease_classification_choice": DiseaseClassificationChoice,
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
68
|
+
"disease_classification": DiseaseClassification,
|
|
69
|
+
"event": Event,
|
|
70
|
+
"event_classification": EventClassification,
|
|
71
|
+
"event_classification_choice": EventClassificationChoice,
|
|
72
|
+
"examination": Examination,
|
|
73
|
+
"examination_indication": ExaminationIndication,
|
|
74
|
+
"finding": Finding,
|
|
75
|
+
"finding_intervention": FindingIntervention,
|
|
76
|
+
"finding_classification": FindingClassification,
|
|
77
|
+
"finding_classification_choice": FindingClassificationChoice,
|
|
78
|
+
"lab_value": LabValue,
|
|
79
|
+
"patient_disease": PatientDisease,
|
|
80
|
+
"patient_event": PatientEvent,
|
|
81
|
+
"patient_examination": PatientExamination,
|
|
82
|
+
"patient_finding": PatientFinding,
|
|
83
|
+
"patient_finding_intervention": PatientFindingIntervention,
|
|
84
|
+
"patient_finding_classification": PatientFindingClassification,
|
|
85
|
+
"patient_lab_value": PatientLabValue,
|
|
86
|
+
"patient_lab_sample": PatientLabSample, # Changed from string "PatientLabSample" to the class
|
|
87
|
+
"patient": Patient,
|
|
88
|
+
"patient_medication": PatientMedication, # Added PatientMedication mapping
|
|
89
|
+
"patient_medication_schedule": PatientMedicationSchedule, # Added PatientMedicationSchedule mapping
|
|
90
|
+
"gender": Gender,
|
|
39
91
|
}
|
|
40
92
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
):
|
|
45
|
-
"""
|
|
46
|
-
Evaluates the requirement type and operator tuple against the provided data.
|
|
47
|
-
|
|
48
|
-
Args:
|
|
49
|
-
operator_type_tuple (OperatorTypeTuple): Tuple containing requirement type and operator.
|
|
50
|
-
data (object): The data to evaluate.
|
|
51
|
-
**kwargs: Additional keyword arguments.
|
|
52
|
-
|
|
53
|
-
Returns:
|
|
54
|
-
bool: True if the evaluation is successful, False otherwise.
|
|
55
|
-
"""
|
|
56
|
-
# data = kwargs.get(name, None)
|
|
57
|
-
|
|
58
|
-
# # make sure data type matches the model for the req_type name
|
|
59
|
-
# if data is None:
|
|
60
|
-
# raise ValueError(f"No data found for requirement type: {name}")
|
|
61
|
-
# if name not in data_model_dict:
|
|
62
|
-
# raise ValueError(f"Unknown requirement type: {name}")
|
|
63
|
-
|
|
64
|
-
# model = data_model_dict[name]
|
|
65
|
-
# if not isinstance(data, model):
|
|
66
|
-
# raise TypeError(
|
|
67
|
-
# f"Data type mismatch for {name}: expected {model}, got {type(data)}"
|
|
68
|
-
# )
|
|
69
|
-
|
|
70
|
-
requirement_type = operator_type_tuple.requirement_type
|
|
71
|
-
operator = operator_type_tuple.operator
|
|
72
|
-
|
|
73
|
-
# Call the appropriate function based on the requirement type and operator
|
|
74
|
-
# This is a placeholder; actual implementation will depend on your logic
|
|
75
|
-
return True # Replace with actual evaluation logic
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def evaluate_requirement(requirement: Requirement, **kwargs):
|
|
79
|
-
requirement_types = requirement.requirement_types.all()
|
|
80
|
-
requirement_operators = requirement.operators.all()
|
|
81
|
-
operator_return_values = {}
|
|
82
|
-
operator_evaluation_results = {}
|
|
83
|
-
|
|
84
|
-
for requirement_operator in requirement_operators:
|
|
85
|
-
# Create tuples
|
|
86
|
-
requirement_type_operator_tuples = [
|
|
87
|
-
OperatorTypeTuple(requirement_operator, rt) for ro in requirement_types
|
|
88
|
-
]
|
|
89
|
-
|
|
90
|
-
eval_result = [
|
|
91
|
-
evaluate_operator_type_tuple(t, **kwargs)
|
|
92
|
-
for t in requirement_type_operator_tuples
|
|
93
|
-
]
|
|
94
|
-
|
|
95
|
-
operator_evaluation_results[requirement_operator.name] = eval_result
|
|
96
|
-
|
|
97
|
-
# TODO FIX
|
|
98
|
-
operator_return_values[requirement_operator.name] = (
|
|
99
|
-
requirement_operator.evaluate_return_values()
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
return operator_evaluation_results, operator_return_values
|
|
93
|
+
data_model_dict_reverse = {
|
|
94
|
+
v: k for k, v in data_model_dict.items()
|
|
95
|
+
}
|
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
-
from typing import TYPE_CHECKING
|
|
2
|
+
from typing import TYPE_CHECKING, List
|
|
3
|
+
from logging import getLogger # Added logger
|
|
3
4
|
|
|
5
|
+
# see how operator evaluation function is fetched, add to docs #TODO
|
|
6
|
+
# endoreg_db/utils/requirement_operator_logic/model_evaluators.py
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
10
|
+
from .requirement import Requirement # Added Requirement import for type hint
|
|
11
|
+
|
|
12
|
+
logger = getLogger(__name__) # Added logger instance
|
|
4
13
|
|
|
5
14
|
class RequirementOperatorManager(models.Manager):
|
|
6
15
|
def get_by_natural_key(self, name):
|
|
7
16
|
"""
|
|
8
|
-
|
|
17
|
+
Retrieves a RequirementOperator instance by its unique name.
|
|
9
18
|
|
|
10
19
|
Args:
|
|
11
|
-
name
|
|
20
|
+
name: The unique name of the RequirementOperator.
|
|
12
21
|
|
|
13
22
|
Returns:
|
|
14
|
-
|
|
23
|
+
The RequirementOperator instance with the specified name.
|
|
15
24
|
"""
|
|
16
25
|
return self.get(name=name)
|
|
17
26
|
|
|
@@ -22,15 +31,12 @@ class RequirementOperator(models.Model):
|
|
|
22
31
|
|
|
23
32
|
Attributes:
|
|
24
33
|
name (str): The name of the requirement operator.
|
|
25
|
-
name_de (str): The German name of the requirement operator.
|
|
26
|
-
name_en (str): The English name of the requirement operator.
|
|
27
34
|
description (str): A description of the requirement operator.
|
|
28
35
|
"""
|
|
29
36
|
|
|
30
37
|
name = models.CharField(max_length=100, unique=True)
|
|
31
|
-
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
32
|
-
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
33
38
|
description = models.TextField(blank=True, null=True)
|
|
39
|
+
evaluation_function_name = models.CharField(max_length=255, blank=True, null=True) # Added field
|
|
34
40
|
|
|
35
41
|
objects = RequirementOperatorManager()
|
|
36
42
|
|
|
@@ -39,20 +45,132 @@ class RequirementOperator(models.Model):
|
|
|
39
45
|
|
|
40
46
|
requirements: models.QuerySet[Requirement]
|
|
41
47
|
|
|
48
|
+
@property
|
|
49
|
+
def operator_evaluation_models(self):
|
|
50
|
+
"""
|
|
51
|
+
Returns a dictionary of operator evaluation models for this requirement operator.
|
|
52
|
+
|
|
53
|
+
This property dynamically imports and provides access to the available operator evaluation models.
|
|
54
|
+
"""
|
|
55
|
+
from .requirement_evaluation.operator_evaluation_models import operator_evaluation_models
|
|
56
|
+
return operator_evaluation_models
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def data_model_dict(self):
|
|
60
|
+
"""
|
|
61
|
+
Returns the dictionary of data models used for requirement evaluation.
|
|
62
|
+
|
|
63
|
+
This property dynamically imports and provides access to the data model dictionary relevant to requirement operators.
|
|
64
|
+
"""
|
|
65
|
+
from .requirement_evaluation.requirement_type_parser import data_model_dict
|
|
66
|
+
return data_model_dict
|
|
67
|
+
|
|
42
68
|
def natural_key(self):
|
|
43
69
|
"""
|
|
44
|
-
|
|
70
|
+
Returns a tuple containing the operator's name as its natural key.
|
|
45
71
|
|
|
46
|
-
|
|
47
|
-
natural key for serialization and unique identification within the system.
|
|
72
|
+
The natural key uniquely identifies the requirement operator for serialization and deserialization purposes.
|
|
48
73
|
"""
|
|
49
74
|
return (self.name,)
|
|
50
75
|
|
|
51
76
|
def __str__(self):
|
|
52
77
|
"""
|
|
53
|
-
|
|
78
|
+
Returns the name of the requirement operator as its string representation.
|
|
79
|
+
"""
|
|
80
|
+
return str(self.name)
|
|
81
|
+
|
|
82
|
+
def evaluate(self, requirement_links: "RequirementLinks", input_links: "RequirementLinks", **kwargs) -> bool: # Changed signature
|
|
83
|
+
|
|
84
|
+
"""
|
|
85
|
+
Evaluates the requirement operator against the provided requirement links and input_links.
|
|
54
86
|
|
|
87
|
+
Args:
|
|
88
|
+
requirement_links: The RequirementLinks object from the Requirement model.
|
|
89
|
+
input_links: The aggregated RequirementLinks object from the input arguments.
|
|
90
|
+
**kwargs: Additional keyword arguments for specific operator logic.
|
|
91
|
+
For lab value operators, this includes 'requirement' (the Requirement model instance).
|
|
92
|
+
The 'requirement' instance is now passed for all operators.
|
|
93
|
+
|
|
55
94
|
Returns:
|
|
56
|
-
|
|
95
|
+
True if the condition defined by the operator is met, False otherwise.
|
|
96
|
+
|
|
97
|
+
Raises:
|
|
98
|
+
NotImplementedError: If the evaluation logic for the operator's name is not implemented.
|
|
57
99
|
"""
|
|
58
|
-
|
|
100
|
+
# kwargs should contain 'requirement' (the Requirement instance) passed from Requirement.evaluate()
|
|
101
|
+
if self.evaluation_function_name:
|
|
102
|
+
eval_func = getattr(self, self.evaluation_function_name, None)
|
|
103
|
+
if eval_func and callable(eval_func):
|
|
104
|
+
return eval_func(requirement_links=requirement_links, input_links=input_links, **kwargs)
|
|
105
|
+
else:
|
|
106
|
+
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}'."
|
|
114
|
+
)
|
|
115
|
+
else:
|
|
116
|
+
# Fallback to the central dispatcher if no specific function name is provided
|
|
117
|
+
from endoreg_db.utils.requirement_operator_logic.model_evaluators import dispatch_operator_evaluation
|
|
118
|
+
return dispatch_operator_evaluation(
|
|
119
|
+
operator_name=self.name,
|
|
120
|
+
requirement_links=requirement_links,
|
|
121
|
+
input_links=input_links,
|
|
122
|
+
operator_instance=self, # Pass the operator instance
|
|
123
|
+
**kwargs
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
from ..medical.patient.patient_medication import PatientMedication # Added
|
|
127
|
+
from ..medical.medication import MedicationSchedule as MedicationScheduleTemplate # Added with alias
|
|
128
|
+
|
|
129
|
+
def _evaluate_patient_medication_schedule_matches_template(
|
|
130
|
+
self,
|
|
131
|
+
requirement_links: "RequirementLinks",
|
|
132
|
+
input_links: "RequirementLinks",
|
|
133
|
+
requirement: "Requirement", # Added requirement
|
|
134
|
+
**kwargs,
|
|
135
|
+
) -> bool:
|
|
136
|
+
"""
|
|
137
|
+
Checks if any PatientMedication in the input PatientMedicationSchedule
|
|
138
|
+
matches the profile (medication, dose, unit, intake times)
|
|
139
|
+
of any MedicationSchedule template linked to the requirement.
|
|
140
|
+
"""
|
|
141
|
+
# Get MedicationSchedule templates from the requirement
|
|
142
|
+
req_schedule_templates = requirement_links.medication_schedules
|
|
143
|
+
if not req_schedule_templates:
|
|
144
|
+
# If the requirement doesn't specify any templates to match against,
|
|
145
|
+
# it's ambiguous. Consider this a non-match.
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
# Get PatientMedication instances from the input (derived from PatientMedicationSchedule.links)
|
|
149
|
+
input_patient_medications = input_links.patient_medications
|
|
150
|
+
if not input_patient_medications:
|
|
151
|
+
# If the input schedule has no medications, it cannot match any template.
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
for pm_instance in input_patient_medications:
|
|
155
|
+
pm_intake_times_set = set(pm_instance.intake_times.all())
|
|
156
|
+
for schedule_template in req_schedule_templates:
|
|
157
|
+
template_intake_times_set = set(schedule_template.intake_times.all())
|
|
158
|
+
|
|
159
|
+
# Check for profile match
|
|
160
|
+
medication_match = pm_instance.medication == schedule_template.medication
|
|
161
|
+
dose_match = pm_instance.dosage == schedule_template.dose
|
|
162
|
+
unit_match = pm_instance.unit == schedule_template.unit
|
|
163
|
+
intake_times_match = pm_intake_times_set == template_intake_times_set
|
|
164
|
+
|
|
165
|
+
# Debugging output (optional, can be removed)
|
|
166
|
+
# print(f"Comparing PM ID {pm_instance.id} with Template {schedule_template.name}:")
|
|
167
|
+
# print(f" Medication: {pm_instance.medication} vs {schedule_template.medication} -> {medication_match}")
|
|
168
|
+
# print(f" Dose: {pm_instance.dosage} vs {schedule_template.dose} -> {dose_match}")
|
|
169
|
+
# print(f" Unit: {pm_instance.unit} vs {schedule_template.unit} -> {unit_match}")
|
|
170
|
+
# print(f" Intake Times: {pm_intake_times_set} vs {template_intake_times_set} -> {intake_times_match}")
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
if medication_match and dose_match and unit_match and intake_times_match:
|
|
174
|
+
return True # Found a match
|
|
175
|
+
|
|
176
|
+
return False # No PatientMedication matched any template
|