endoreg-db 0.4.5__py3-none-any.whl → 0.8.6.3__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.
- endoreg_db/admin.py +90 -1
- 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 +76 -4
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/{label → ai_model_label}/label/data.yaml +27 -1
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/center/data.yaml +40 -9
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -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/disease_classification/chronic_kidney_disease.yaml +2 -2
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +34 -28
- endoreg_db/data/examination/type/data.yaml +12 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- 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 +105 -0
- 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_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- 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_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- 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.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -0
- endoreg_db/data/gender/data.yaml +24 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -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/cardiac_enzymes.yaml +7 -1
- endoreg_db/data/lab_value/coagulation.yaml +6 -1
- endoreg_db/data/lab_value/electrolytes.yaml +39 -1
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +12 -0
- endoreg_db/data/lab_value/hematology.yaml +17 -2
- endoreg_db/data/lab_value/hormones.yaml +6 -0
- endoreg_db/data/lab_value/lipids.yaml +12 -3
- endoreg_db/data/lab_value/misc.yaml +48 -2
- endoreg_db/data/lab_value/renal_function.yaml +2 -1
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_indication/anticoagulation.yaml +48 -53
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +30 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/pdf_type/data.yaml +27 -9
- 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-examination-generic.yaml +4 -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 +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- 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 +441 -0
- 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 +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- 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 +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -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/data/unit/time.yaml +36 -1
- endoreg_db/exceptions.py +19 -0
- endoreg_db/forms/__init__.py +3 -1
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- 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 +378 -0
- endoreg_db/helpers/download_segmentation_model.py +31 -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_model_meta_from_huggingface.py +115 -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 +423 -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 +58 -26
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +174 -118
- endoreg_db/management/commands/load_center_data.py +46 -21
- endoreg_db/management/commands/{load_logging_data.py → load_contraindication_data.py} +4 -2
- endoreg_db/management/commands/load_disease_data.py +29 -7
- endoreg_db/management/commands/{load_endoscope_type_data.py → load_endoscope_data.py} +30 -7
- endoreg_db/management/commands/load_examination_indication_data.py +86 -0
- endoreg_db/management/commands/load_finding_data.py +128 -0
- 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_lab_value_data.py +3 -3
- endoreg_db/management/commands/load_medication_data.py +83 -21
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/{load_medication_intake_time_data.py → load_organ_data.py} +7 -5
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- 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/setup_endoreg_db.py +381 -0
- 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/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1234 -944
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/models/__init__.py +339 -53
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- 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 +19 -4
- 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}/__init__.py +10 -1
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +60 -16
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +6 -13
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +21 -8
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +9 -0
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- 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/__init__.py +14 -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 +21 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +44 -13
- 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 +53 -54
- 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/label/video_segmentation_labelset.py +27 -0
- endoreg_db/models/media/__init__.py +16 -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 +757 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -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 +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -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 +141 -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 +168 -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_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- 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/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +68 -29
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- 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/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +68 -22
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +32 -13
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -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 +36 -1
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +14 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +15 -3
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- 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 +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- 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/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 +118 -10
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- 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 +69 -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 +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -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/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/serializers/video_examination.py +198 -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 +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -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 +1259 -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/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +83 -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 +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -1
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- endoreg_db/utils/ai/inference_dataset.py +52 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/utils/ai/preprocess.py +68 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/case_generator/case_generator.py +159 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/utils/case_generator/utils.py +30 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/dataloader.py +118 -35
- endoreg_db/utils/dates.py +60 -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/hashs.py +123 -4
- 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 +76 -0
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- 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/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- 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/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -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 +274 -0
- 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 +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- 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 +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -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/csrf.py +7 -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 +8 -0
- endoreg_db/views/pdf/pdf_stream.py +187 -0
- endoreg_db/views/pdf/reimport.py +177 -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 +367 -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 +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -3
- endoreg_db-0.8.6.3.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.3.dist-info/RECORD +793 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info}/WHEEL +1 -1
- endoreg_db/data/active_model/data.yaml +0 -3
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/label/label-set/data.yaml +0 -18
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/delete_legacy_images.py +0 -19
- endoreg_db/management/commands/delete_legacy_videos.py +0 -17
- endoreg_db/management/commands/extract_legacy_video_frames.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/import_legacy_images.py +0 -94
- endoreg_db/management/commands/import_legacy_videos.py +0 -76
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_label_data.py +0 -67
- 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_schedule_data.py +0 -55
- endoreg_db/management/commands/load_network_data.py +0 -57
- endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
- endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
- endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
- endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
- endoreg_db/models/ai_model/__init__.py +0 -3
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/model_meta.py +0 -24
- endoreg_db/models/annotation/__init__.py +0 -3
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -60
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
- endoreg_db/models/annotation/image_classification.py +0 -27
- endoreg_db/models/center/center.py +0 -25
- endoreg_db/models/center/center_product.py +0 -34
- endoreg_db/models/center/center_resource.py +0 -19
- endoreg_db/models/center/center_waste.py +0 -11
- endoreg_db/models/data_file/__init__.py +0 -6
- endoreg_db/models/data_file/base_classes/__init__.py +0 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
- endoreg_db/models/data_file/frame.py +0 -45
- endoreg_db/models/data_file/import_classes/__init__.py +0 -32
- 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 -188
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
- endoreg_db/models/data_file/metadata/__init__.py +0 -3
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
- endoreg_db/models/data_file/metadata/video_meta.py +0 -133
- endoreg_db/models/data_file/report_file.py +0 -89
- endoreg_db/models/data_file/video/__init__.py +0 -7
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -25
- endoreg_db/models/data_file/video_segment.py +0 -107
- endoreg_db/models/disease.py +0 -56
- endoreg_db/models/emission/__init__.py +0 -1
- endoreg_db/models/emission/emission_factor.py +0 -20
- endoreg_db/models/event.py +0 -22
- endoreg_db/models/examination/__init__.py +0 -4
- endoreg_db/models/examination/examination.py +0 -26
- endoreg_db/models/examination/examination_time.py +0 -27
- endoreg_db/models/examination/examination_time_type.py +0 -24
- endoreg_db/models/examination/examination_type.py +0 -18
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/hardware/endoscope.py +0 -44
- endoreg_db/models/information_source.py +0 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -102
- endoreg_db/models/legacy_data/__init__.py +0 -3
- endoreg_db/models/legacy_data/image.py +0 -34
- endoreg_db/models/logging/__init__.py +0 -4
- 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 -24
- endoreg_db/models/medication/__init__.py +0 -1
- endoreg_db/models/medication/medication.py +0 -148
- endoreg_db/models/network/__init__.py +0 -3
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -53
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -215
- endoreg_db/models/patient_examination/__init__.py +0 -35
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -7
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -16
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/case/case.py +0 -30
- endoreg_db/models/persons/patient/patient.py +0 -216
- endoreg_db/models/persons/patient/patient_disease.py +0 -16
- endoreg_db/models/persons/patient/patient_event.py +0 -22
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
- endoreg_db/models/persons/patient/patient_medication.py +0 -44
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -2
- endoreg_db/models/prediction/image_classification.py +0 -37
- endoreg_db/models/prediction/video_prediction_meta.py +0 -244
- endoreg_db/models/product/__init__.py +0 -5
- endoreg_db/models/product/product.py +0 -97
- endoreg_db/models/product/product_group.py +0 -19
- endoreg_db/models/product/product_material.py +0 -24
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -2
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/__init__.py +0 -2
- 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 -17
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -13
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -10
- endoreg_db/serializers/prediction.py +0 -15
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -27
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video_metadata.py +0 -87
- endoreg_db-0.4.5.dist-info/METADATA +0 -34
- endoreg_db-0.4.5.dist-info/RECORD +0 -316
- /endoreg_db/{data/distribution/numeric/.init → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{models/persons/patient/case/__init__.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → config/__init__.py} +0 -0
- /endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +0 -0
- /endoreg_db/data/{model_type → ai_model_type}/data.yaml +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/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
from datetime import datetime as dt, timezone
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from endoreg_db.models import Patient, LabValue, PatientLabValue
|
|
7
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks # Added import
|
|
8
|
+
|
|
9
|
+
DEFAULT_PATIENT_LAB_SAMPLE_TYPE_NAME = "generic"
|
|
10
|
+
|
|
11
|
+
class PatientLabSampleTypeManager(models.Manager):
|
|
12
|
+
"""Manager for PatientLabSampleType with natural key support."""
|
|
13
|
+
def get_by_natural_key(self, name):
|
|
14
|
+
"""Retrieves a PatientLabSampleType instance by its natural key (name)."""
|
|
15
|
+
return self.get(name=name)
|
|
16
|
+
|
|
17
|
+
class PatientLabSampleType(models.Model):
|
|
18
|
+
"""
|
|
19
|
+
Represents the type of a patient lab sample (e.g., Blood, Urine).
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
name (str): The name of the patient lab sample type.
|
|
23
|
+
description (str): A description of the patient lab sample type.
|
|
24
|
+
"""
|
|
25
|
+
name = models.CharField(max_length=255)
|
|
26
|
+
description = models.TextField(blank=True, null=True)
|
|
27
|
+
|
|
28
|
+
objects = PatientLabSampleTypeManager()
|
|
29
|
+
|
|
30
|
+
def natural_key(self):
|
|
31
|
+
"""Returns the natural key (name) as a tuple."""
|
|
32
|
+
return (self.name,)
|
|
33
|
+
|
|
34
|
+
def __str__(self):
|
|
35
|
+
"""Returns the name of the sample type."""
|
|
36
|
+
return str(self.name)
|
|
37
|
+
|
|
38
|
+
@classmethod
|
|
39
|
+
def get_default_sample_type(cls):
|
|
40
|
+
"""Gets or creates the default patient lab sample type ('default')."""
|
|
41
|
+
return cls.objects.get_or_create(name="default")[0]
|
|
42
|
+
|
|
43
|
+
class PatientLabSample(models.Model):
|
|
44
|
+
"""
|
|
45
|
+
Represents a specific lab sample taken from a patient at a certain date and time.
|
|
46
|
+
|
|
47
|
+
Links to the patient, sample type, and associated lab values.
|
|
48
|
+
|
|
49
|
+
Attributes:
|
|
50
|
+
patient (Patient): The patient to which the lab sample belongs.
|
|
51
|
+
sample_type (PatientLabSampleType): The type of the lab sample.
|
|
52
|
+
date (datetime): The date of the lab sample.
|
|
53
|
+
values (PatientLabValue; One2Many): The value of the lab sample.
|
|
54
|
+
"""
|
|
55
|
+
patient = models.ForeignKey("Patient", on_delete=models.CASCADE, related_name="lab_samples")
|
|
56
|
+
sample_type = models.ForeignKey("PatientLabSampleType", on_delete=models.CASCADE)
|
|
57
|
+
date = models.DateTimeField()
|
|
58
|
+
|
|
59
|
+
if TYPE_CHECKING:
|
|
60
|
+
patient: "Patient"
|
|
61
|
+
sample_type: "PatientLabSampleType"
|
|
62
|
+
values: models.QuerySet["PatientLabValue"]
|
|
63
|
+
|
|
64
|
+
def __str__(self):
|
|
65
|
+
"""Returns a string representation including patient, type, and date."""
|
|
66
|
+
formatted_datetime = self.date.strftime('%Y-%m-%d %H:%M')
|
|
67
|
+
return f"{self.patient} - {self.sample_type} - {formatted_datetime} ()"
|
|
68
|
+
|
|
69
|
+
def get_values(self):
|
|
70
|
+
"""Returns all PatientLabValue instances associated with this sample."""
|
|
71
|
+
return self.values.all()
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def links(self) -> "RequirementLinks":
|
|
75
|
+
"""
|
|
76
|
+
Aggregates and returns all related model instances relevant for requirement evaluation
|
|
77
|
+
as a RequirementLinks object.
|
|
78
|
+
"""
|
|
79
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
80
|
+
# Assuming PatientLabValue is already imported or accessible
|
|
81
|
+
# from .patient_lab_value import PatientLabValue # If direct import needed and not circular
|
|
82
|
+
|
|
83
|
+
patient_lab_values = list(self.values.all())
|
|
84
|
+
|
|
85
|
+
return RequirementLinks(
|
|
86
|
+
patient_lab_values=patient_lab_values,
|
|
87
|
+
patient_lab_samples=[self] # Include the sample itself
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
@classmethod
|
|
91
|
+
def create_by_patient(cls, patient=None, sample_type=None, date=None, save = True):
|
|
92
|
+
"""
|
|
93
|
+
Creates a new patient lab sample for a given patient.
|
|
94
|
+
|
|
95
|
+
Uses default type and current time if not provided.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
patient (Patient): The patient to which the lab sample belongs.
|
|
99
|
+
sample_type (PatientLabSampleType): The type of the lab sample.
|
|
100
|
+
date (datetime): The date of the lab sample.
|
|
101
|
+
save (bool): Whether to save the instance after creation.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
PatientLabSample: The new patient lab sample.
|
|
105
|
+
"""
|
|
106
|
+
from warnings import warn
|
|
107
|
+
|
|
108
|
+
if not patient:
|
|
109
|
+
warn("No patient given. Cannot create patient lab sample.")
|
|
110
|
+
return None
|
|
111
|
+
if not sample_type:
|
|
112
|
+
sample_type = PatientLabSampleType.get_default_sample_type()
|
|
113
|
+
else:
|
|
114
|
+
sample_type = PatientLabSampleType.objects.get(name=sample_type)
|
|
115
|
+
if not date:
|
|
116
|
+
date = dt.now(timezone.utc)
|
|
117
|
+
|
|
118
|
+
patient_lab_sample = cls.objects.create(
|
|
119
|
+
patient=patient,
|
|
120
|
+
sample_type=sample_type,
|
|
121
|
+
date=date
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
if save:
|
|
125
|
+
patient_lab_sample.save()
|
|
126
|
+
|
|
127
|
+
return patient_lab_sample
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def add_empty_value(self, lab_value:"LabValue"):
|
|
131
|
+
"""
|
|
132
|
+
Adds an empty PatientLabValue for the given lab value to this sample.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
lab_value (LabValue): The lab value to add.
|
|
136
|
+
"""
|
|
137
|
+
from endoreg_db.models import PatientLabValue, LabValue
|
|
138
|
+
if not isinstance(lab_value, LabValue):
|
|
139
|
+
raise ValueError("lab_value must be an instance of LabValue.")
|
|
140
|
+
patient_lab_value = PatientLabValue.create_lab_value_by_sample(
|
|
141
|
+
sample=self,
|
|
142
|
+
lab_value_name=lab_value.name,
|
|
143
|
+
value=None, # Empty value
|
|
144
|
+
value_str=None, # Empty string
|
|
145
|
+
unit=lab_value.default_unit # Use the unit from the lab value
|
|
146
|
+
)
|
|
147
|
+
return patient_lab_value
|
|
148
|
+
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING, Optional
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from ...administration.person.patient import Patient
|
|
6
|
+
from ..laboratory import LabValue
|
|
7
|
+
from ...other.unit import Unit
|
|
8
|
+
from .patient_lab_sample import PatientLabSample
|
|
9
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks # Added import
|
|
2
10
|
|
|
3
11
|
class PatientLabValue(models.Model):
|
|
4
12
|
"""
|
|
@@ -16,7 +24,7 @@ class PatientLabValue(models.Model):
|
|
|
16
24
|
lab_value = models.ForeignKey('LabValue', on_delete=models.CASCADE)
|
|
17
25
|
value = models.FloatField(blank=True, null=True)
|
|
18
26
|
value_str = models.CharField(max_length=255, blank=True, null=True)
|
|
19
|
-
sample = models.ForeignKey(
|
|
27
|
+
sample: models.ForeignKey["PatientLabSample"] = models.ForeignKey(
|
|
20
28
|
'PatientLabSample', on_delete=models.CASCADE,
|
|
21
29
|
blank=True, null=True,
|
|
22
30
|
related_name='values'
|
|
@@ -29,13 +37,23 @@ class PatientLabValue(models.Model):
|
|
|
29
37
|
)
|
|
30
38
|
unit = models.ForeignKey('Unit', on_delete=models.CASCADE, blank=True, null=True)
|
|
31
39
|
|
|
40
|
+
if TYPE_CHECKING:
|
|
41
|
+
|
|
42
|
+
patient: "Patient"
|
|
43
|
+
lab_value: "LabValue"
|
|
44
|
+
unit: "Unit"
|
|
45
|
+
sample: "PatientLabSample"
|
|
46
|
+
|
|
32
47
|
@classmethod
|
|
33
|
-
def create_lab_value_by_sample(
|
|
34
|
-
|
|
48
|
+
def create_lab_value_by_sample(
|
|
49
|
+
cls, sample:"PatientLabSample", lab_value_name:str,
|
|
50
|
+
value:Optional[float]=None, value_str:Optional[str]=None,
|
|
51
|
+
unit:Optional["Unit"]=None
|
|
52
|
+
):
|
|
53
|
+
from ..laboratory import LabValue
|
|
35
54
|
patient = sample.patient
|
|
36
55
|
lab_value = LabValue.objects.get(name=lab_value_name)
|
|
37
|
-
|
|
38
|
-
value_str = value_str
|
|
56
|
+
|
|
39
57
|
|
|
40
58
|
pat_lab_val = cls.objects.create(
|
|
41
59
|
patient = patient,
|
|
@@ -51,10 +69,25 @@ class PatientLabValue(models.Model):
|
|
|
51
69
|
return pat_lab_val
|
|
52
70
|
|
|
53
71
|
def __str__(self):
|
|
54
|
-
|
|
55
|
-
|
|
72
|
+
formatted_datetime = self.datetime.strftime('%Y-%m-%d %H:%M')
|
|
73
|
+
# normal_range = self.get_normal_range()
|
|
74
|
+
norm_range_string = f'[{self.normal_range.get("min", "")} - {self.normal_range.get("max", "")}]'
|
|
75
|
+
_str = f'{self.lab_value} - {self.value} {self.unit} - {norm_range_string} ({formatted_datetime})'
|
|
56
76
|
return _str
|
|
57
77
|
|
|
78
|
+
def get_normal_range(self):
|
|
79
|
+
lab_value = self.lab_value
|
|
80
|
+
patient = self.patient
|
|
81
|
+
|
|
82
|
+
age = patient.age()
|
|
83
|
+
gender = patient.gender
|
|
84
|
+
|
|
85
|
+
normal_range_dict = lab_value.get_normal_range(
|
|
86
|
+
age,gender
|
|
87
|
+
)
|
|
88
|
+
return normal_range_dict
|
|
89
|
+
|
|
90
|
+
|
|
58
91
|
def set_min_norm_value(self, value, save = True):
|
|
59
92
|
self.normal_range["min"] = value
|
|
60
93
|
if save:
|
|
@@ -66,13 +99,11 @@ class PatientLabValue(models.Model):
|
|
|
66
99
|
self.save()
|
|
67
100
|
|
|
68
101
|
def set_norm_values_from_default(self):
|
|
69
|
-
age = self.patient.age()
|
|
70
|
-
gender = self.patient.gender
|
|
71
|
-
min_value, max_value = self.lab_value.get_normal_range(age=age, gender=gender)
|
|
72
|
-
self.set_min_norm_value(min_value, save = False)
|
|
73
|
-
self.set_max_norm_value(max_value, save = False)
|
|
74
|
-
self.save()
|
|
75
102
|
|
|
103
|
+
normal_range_dict = self.get_normal_range()
|
|
104
|
+
self.set_min_norm_value(normal_range_dict["min"], save = False)
|
|
105
|
+
self.set_max_norm_value(normal_range_dict["max"], save = False)
|
|
106
|
+
self.save()
|
|
76
107
|
|
|
77
108
|
def set_unit_from_default(self):
|
|
78
109
|
self.unit = self.lab_value.default_unit
|
|
@@ -98,8 +129,9 @@ class PatientLabValue(models.Model):
|
|
|
98
129
|
super().save(*args, **kwargs)
|
|
99
130
|
|
|
100
131
|
def set_value_by_distribution(self, distribution=None, save = True):
|
|
101
|
-
from
|
|
102
|
-
|
|
132
|
+
from ...administration.person.patient import Patient
|
|
133
|
+
from ..laboratory import LabValue
|
|
134
|
+
from ...other.distribution import (
|
|
103
135
|
DateValueDistribution,
|
|
104
136
|
SingleCategoricalValueDistribution,
|
|
105
137
|
NumericValueDistribution,
|
|
@@ -109,8 +141,6 @@ class PatientLabValue(models.Model):
|
|
|
109
141
|
|
|
110
142
|
patient:Patient = self.patient
|
|
111
143
|
|
|
112
|
-
dob = patient.dob
|
|
113
|
-
gender:Gender = patient.gender
|
|
114
144
|
lab_value:LabValue = self.lab_value
|
|
115
145
|
|
|
116
146
|
assert self.lab_value, "Lab value must be set to set value by distribution"
|
|
@@ -121,7 +151,7 @@ class PatientLabValue(models.Model):
|
|
|
121
151
|
|
|
122
152
|
if not distribution:
|
|
123
153
|
warnings.warn(
|
|
124
|
-
"No distribution set for lab value, assuming uniform numeric distribution based on normal values"
|
|
154
|
+
f"No distribution set for lab value {lab_value}, assuming uniform numeric distribution based on normal values"
|
|
125
155
|
)
|
|
126
156
|
|
|
127
157
|
if not self.normal_range.get("min", None) or not self.normal_range.get("max", None):
|
|
@@ -133,12 +163,12 @@ class PatientLabValue(models.Model):
|
|
|
133
163
|
_name = "auto-" + self.lab_value.name + "-distribution-default-uniform"
|
|
134
164
|
distribution = NumericValueDistribution(
|
|
135
165
|
name = _name,
|
|
136
|
-
|
|
137
|
-
|
|
166
|
+
min_descriptor = _min,
|
|
167
|
+
max_max_desciptor = _max,
|
|
138
168
|
distribution_type = "uniform"
|
|
139
169
|
)
|
|
140
170
|
|
|
141
|
-
value = distribution.generate_value()
|
|
171
|
+
value = distribution.generate_value(lab_value=lab_value, patient=patient)
|
|
142
172
|
self.value = value
|
|
143
173
|
if save:
|
|
144
174
|
self.save()
|
|
@@ -153,7 +183,10 @@ class PatientLabValue(models.Model):
|
|
|
153
183
|
return value
|
|
154
184
|
|
|
155
185
|
elif isinstance(distribution, NumericValueDistribution):
|
|
156
|
-
value = distribution.generate_value(
|
|
186
|
+
value = distribution.generate_value(
|
|
187
|
+
lab_value=lab_value,
|
|
188
|
+
patient=patient
|
|
189
|
+
)
|
|
157
190
|
self.value = value
|
|
158
191
|
if save:
|
|
159
192
|
self.save()
|
|
@@ -172,5 +205,18 @@ class PatientLabValue(models.Model):
|
|
|
172
205
|
self.value = value
|
|
173
206
|
if save:
|
|
174
207
|
self.save()
|
|
208
|
+
return value
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def links(self) -> "RequirementLinks":
|
|
212
|
+
"""
|
|
213
|
+
Aggregates and returns all related model instances relevant for requirement evaluation
|
|
214
|
+
as a RequirementLinks object.
|
|
215
|
+
"""
|
|
216
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
217
|
+
|
|
218
|
+
return RequirementLinks(
|
|
219
|
+
patient_lab_values=[self] # Include the lab value itself
|
|
220
|
+
)
|
|
175
221
|
|
|
176
222
|
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING, Optional, List # Added List
|
|
3
|
+
|
|
4
|
+
# Added imports for type hints
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...administration.person.patient import Patient
|
|
7
|
+
from ..medication import MedicationIndication, Medication, MedicationIntakeTime
|
|
8
|
+
from ...other.unit import Unit
|
|
9
|
+
from ....utils.links.requirement_link import RequirementLinks # Added RequirementLinks
|
|
10
|
+
|
|
11
|
+
class PatientMedication(models.Model):
|
|
12
|
+
"""
|
|
13
|
+
Represents a specific medication prescribed or taken by a patient.
|
|
14
|
+
|
|
15
|
+
Links a patient to a medication, its indication, dosage, intake times, and unit.
|
|
16
|
+
"""
|
|
17
|
+
patient = models.ForeignKey("Patient", on_delete=models.CASCADE)
|
|
18
|
+
medication_indication = models.ForeignKey(
|
|
19
|
+
"MedicationIndication", on_delete=models.CASCADE,
|
|
20
|
+
related_name="indication_patient_medications", null=True
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
medication = models.ForeignKey(
|
|
24
|
+
'Medication', on_delete=models.CASCADE,
|
|
25
|
+
blank=True,
|
|
26
|
+
related_name='medication_patient_medications'
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
intake_times = models.ManyToManyField(
|
|
30
|
+
'MedicationIntakeTime',
|
|
31
|
+
related_name='intake_time_patient_medications',
|
|
32
|
+
blank=True,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
unit = models.ForeignKey(
|
|
36
|
+
'Unit', on_delete=models.CASCADE,
|
|
37
|
+
null=True, blank=True
|
|
38
|
+
)
|
|
39
|
+
dosage = models.JSONField(
|
|
40
|
+
null=True, blank=True
|
|
41
|
+
)
|
|
42
|
+
active = models.BooleanField(default=True)
|
|
43
|
+
|
|
44
|
+
objects = models.Manager()
|
|
45
|
+
|
|
46
|
+
if TYPE_CHECKING: # Added type hints block
|
|
47
|
+
patient: "Patient"
|
|
48
|
+
medication_indication: Optional["MedicationIndication"]
|
|
49
|
+
medication: Optional["Medication"]
|
|
50
|
+
intake_times: models.QuerySet["MedicationIntakeTime"]
|
|
51
|
+
unit: Optional["Unit"]
|
|
52
|
+
dosage: Optional[dict]
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def links(self) -> "RequirementLinks":
|
|
56
|
+
"""
|
|
57
|
+
Returns a RequirementLinks object for this PatientMedication instance.
|
|
58
|
+
This is used during requirement evaluation.
|
|
59
|
+
"""
|
|
60
|
+
from ....utils.links.requirement_link import RequirementLinks
|
|
61
|
+
|
|
62
|
+
meds: List["Medication"] = []
|
|
63
|
+
if self.medication:
|
|
64
|
+
meds.append(self.medication)
|
|
65
|
+
|
|
66
|
+
indications: List["MedicationIndication"] = []
|
|
67
|
+
if self.medication_indication:
|
|
68
|
+
indications.append(self.medication_indication)
|
|
69
|
+
|
|
70
|
+
intake_times_list: List["MedicationIntakeTime"] = list(self.intake_times.all())
|
|
71
|
+
|
|
72
|
+
return RequirementLinks(
|
|
73
|
+
medications=meds,
|
|
74
|
+
medication_indications=indications,
|
|
75
|
+
medication_intake_times=intake_times_list,
|
|
76
|
+
patient_medications=[self] # Include self in patient_medications
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
class Meta:
|
|
80
|
+
verbose_name = 'Patient Medication'
|
|
81
|
+
verbose_name_plural = 'Patient Medications'
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def create_by_patient_and_indication(cls, patient, medication_indication):
|
|
85
|
+
"""Creates a PatientMedication instance linking a patient and an indication."""
|
|
86
|
+
from ..medication import MedicationIndication
|
|
87
|
+
medication_indication: MedicationIndication
|
|
88
|
+
patient_medication = cls.objects.create(patient=patient, medication_indication=medication_indication)
|
|
89
|
+
patient_medication.save()
|
|
90
|
+
|
|
91
|
+
return patient_medication
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def __str__(self):
|
|
95
|
+
"""Returns a string representation including medication, indication, dosage, and intake times."""
|
|
96
|
+
intake_times = self.intake_times.all()
|
|
97
|
+
out = f"{self.medication} (Indication {self.medication_indication}) - "
|
|
98
|
+
out += f"{self.dosage} - {self.unit} - "
|
|
99
|
+
|
|
100
|
+
for intake_time in intake_times:
|
|
101
|
+
out += f"{intake_time} - "
|
|
102
|
+
|
|
103
|
+
return out
|
|
104
|
+
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING, List # Added List
|
|
3
|
+
from datetime import datetime as dt
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...administration.person.patient import Patient
|
|
7
|
+
from .patient_medication import PatientMedication
|
|
8
|
+
from ..medication import MedicationSchedule
|
|
9
|
+
from ....utils.links.requirement_link import RequirementLinks # Added
|
|
10
|
+
from ..medication import Medication, MedicationIndication, MedicationIntakeTime # Added
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PatientMedicationSchedule(models.Model):
|
|
14
|
+
"""
|
|
15
|
+
Represents a collection of medications associated with a patient, forming their schedule.
|
|
16
|
+
"""
|
|
17
|
+
patient = models.ForeignKey("Patient", on_delete= models.CASCADE)
|
|
18
|
+
medication = models.ManyToManyField(
|
|
19
|
+
'PatientMedication',
|
|
20
|
+
related_name='patient_medication_schedules',
|
|
21
|
+
blank=True
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
created_at = models.DateTimeField(auto_now_add=True)
|
|
25
|
+
updated_at = models.DateTimeField(auto_now=True)
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
patient: "Patient"
|
|
29
|
+
medication: models.QuerySet["PatientMedication"]
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def links(self) -> "RequirementLinks":
|
|
33
|
+
"""
|
|
34
|
+
Aggregates RequirementLinks from all PatientMedication instances in this schedule.
|
|
35
|
+
"""
|
|
36
|
+
from ....utils.links.requirement_link import RequirementLinks
|
|
37
|
+
|
|
38
|
+
aggregated_medications: List["Medication"] = []
|
|
39
|
+
aggregated_medication_indications: List["MedicationIndication"] = []
|
|
40
|
+
aggregated_medication_intake_times: List["MedicationIntakeTime"] = []
|
|
41
|
+
|
|
42
|
+
patient_meds_in_schedule: List["PatientMedication"] = list(self.medication.all())
|
|
43
|
+
|
|
44
|
+
for pm_instance in patient_meds_in_schedule:
|
|
45
|
+
pm_links_obj = pm_instance.links
|
|
46
|
+
|
|
47
|
+
aggregated_medications.extend(pm_links_obj.medications)
|
|
48
|
+
aggregated_medication_indications.extend(pm_links_obj.medication_indications)
|
|
49
|
+
aggregated_medication_intake_times.extend(pm_links_obj.medication_intake_times)
|
|
50
|
+
|
|
51
|
+
return RequirementLinks(
|
|
52
|
+
medications=list(set(aggregated_medications)),
|
|
53
|
+
medication_indications=list(set(aggregated_medication_indications)),
|
|
54
|
+
medication_intake_times=list(set(aggregated_medication_intake_times)),
|
|
55
|
+
patient_medications=patient_meds_in_schedule,
|
|
56
|
+
patient_medication_schedules=[self]
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
def __str__(self):
|
|
60
|
+
"""Returns a string representation including the patient and associated medications."""
|
|
61
|
+
return f'{self.patient} - {self.medication.all()}'
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def create_by_patient_and_indication_type(cls, patient, indication_type):
|
|
65
|
+
"""Creates a schedule and adds a medication based on a random indication of a given type."""
|
|
66
|
+
from ..medication import MedicationIndicationType
|
|
67
|
+
from .patient_medication import PatientMedication
|
|
68
|
+
|
|
69
|
+
medication_indication = MedicationIndicationType.get_random_indication_by_type(name=indication_type)
|
|
70
|
+
|
|
71
|
+
patient_medication_schedule = cls.objects.create(patient=patient)
|
|
72
|
+
patient_medication_schedule.save()
|
|
73
|
+
|
|
74
|
+
patient_medication = PatientMedication.create_by_patient_and_indication(patient, medication_indication)
|
|
75
|
+
patient_medication_schedule.medication.add(patient_medication)
|
|
76
|
+
patient_medication_schedule.save()
|
|
77
|
+
|
|
78
|
+
return patient_medication_schedule
|
|
79
|
+
|
|
80
|
+
@classmethod
|
|
81
|
+
def create_by_patient_and_indication(cls, patient, medication_indication):
|
|
82
|
+
"""Creates a schedule and adds a medication based on a specific indication."""
|
|
83
|
+
from ..medication import MedicationIndication
|
|
84
|
+
from .patient_medication import PatientMedication
|
|
85
|
+
from ...administration.person.patient import Patient
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
assert isinstance(medication_indication, MedicationIndication)
|
|
89
|
+
assert isinstance(patient, Patient)
|
|
90
|
+
patient_medication_schedule = cls.objects.create(patient=patient)
|
|
91
|
+
patient_medication_schedule.save()
|
|
92
|
+
|
|
93
|
+
patient_medication = PatientMedication.create_by_patient_and_indication(patient, medication_indication)
|
|
94
|
+
patient_medication_schedule.medication.add(patient_medication)
|
|
95
|
+
patient_medication_schedule.save()
|
|
96
|
+
|
|
97
|
+
return patient_medication_schedule
|
|
98
|
+
|
|
99
|
+
def create_patient_medication_from_medication_schedule(
|
|
100
|
+
self,
|
|
101
|
+
medication_schedule: "MedicationSchedule",
|
|
102
|
+
medication_indication=None,
|
|
103
|
+
start_date=None,
|
|
104
|
+
):
|
|
105
|
+
"""Creates and adds a PatientMedication based on a generic MedicationSchedule template."""
|
|
106
|
+
|
|
107
|
+
from .patient_medication import PatientMedication
|
|
108
|
+
|
|
109
|
+
if not start_date:
|
|
110
|
+
start_date = dt.now()
|
|
111
|
+
|
|
112
|
+
drug = medication_schedule.medication
|
|
113
|
+
unit = medication_schedule.unit
|
|
114
|
+
dosage = medication_schedule.dose
|
|
115
|
+
intake_times = medication_schedule.get_intake_times()
|
|
116
|
+
|
|
117
|
+
patient_medication = PatientMedication.objects.create(
|
|
118
|
+
patient=self.patient,
|
|
119
|
+
medication=drug,
|
|
120
|
+
medication_indication=medication_indication,
|
|
121
|
+
unit=unit,
|
|
122
|
+
dosage=dosage
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
patient_medication.intake_times.set(intake_times)
|
|
126
|
+
patient_medication.save()
|
|
127
|
+
|
|
128
|
+
self.medication.add(patient_medication)
|
|
129
|
+
self.save()
|
|
130
|
+
|
|
131
|
+
return patient_medication
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def get_patient_medication(self):
|
|
135
|
+
"""Returns all PatientMedication instances associated with this schedule."""
|
|
136
|
+
return self.medication.all()
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import List, TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class RiskManager(models.Manager):
|
|
6
|
+
def get_by_natural_key(self, name):
|
|
7
|
+
"""
|
|
8
|
+
Retrieve a risk instance using its natural key.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
name: The unique name identifying the risk instance.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
The risk instance with the matching name.
|
|
15
|
+
"""
|
|
16
|
+
return self.get(name=name)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class Risk(models.Model):
|
|
20
|
+
"""
|
|
21
|
+
A class representing a risk.
|
|
22
|
+
|
|
23
|
+
Attributes:
|
|
24
|
+
name (str): The name of the risk.
|
|
25
|
+
name_de (str): The German name of the risk.
|
|
26
|
+
name_en (str): The English name of the risk.
|
|
27
|
+
description (str): A description of the risk.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
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
|
+
description = models.TextField(blank=True, null=True)
|
|
34
|
+
|
|
35
|
+
risk_value = models.FloatField(
|
|
36
|
+
blank=True,
|
|
37
|
+
null=True,
|
|
38
|
+
help_text="Risk value for the risk. If not set, the risk is not used in calculations.",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
risk_type = models.ForeignKey(
|
|
42
|
+
"RiskType",
|
|
43
|
+
on_delete=models.CASCADE,
|
|
44
|
+
related_name="risks",
|
|
45
|
+
blank=True,
|
|
46
|
+
null=True,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
objects = RiskManager()
|
|
50
|
+
|
|
51
|
+
if TYPE_CHECKING:
|
|
52
|
+
from endoreg_db.models.risk.risk_type import RiskType
|
|
53
|
+
|
|
54
|
+
risk_types: RiskType
|
|
55
|
+
|
|
56
|
+
def natural_key(self):
|
|
57
|
+
"""
|
|
58
|
+
Return a tuple containing the natural key of the risk instance.
|
|
59
|
+
|
|
60
|
+
The tuple consists of the unique 'name' attribute, which enables natural key lookups
|
|
61
|
+
and serialization within Django.
|
|
62
|
+
"""
|
|
63
|
+
return (self.name,)
|
|
64
|
+
|
|
65
|
+
def __str__(self):
|
|
66
|
+
"""
|
|
67
|
+
Return the string representation of the risk.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
str: The risk's name.
|
|
71
|
+
"""
|
|
72
|
+
return str(self.name)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class RiskTypeManager(models.Manager):
|
|
6
|
+
def get_by_natural_key(self, name):
|
|
7
|
+
"""
|
|
8
|
+
Retrieves a RiskType instance using its natural key.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
name (str): The unique name identifying the RiskType instance.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
RiskType: The matching instance with the provided name.
|
|
15
|
+
"""
|
|
16
|
+
return self.get(name=name)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RiskType(models.Model):
|
|
20
|
+
"""
|
|
21
|
+
A class representing a risk type.
|
|
22
|
+
|
|
23
|
+
Attributes:
|
|
24
|
+
name (str): The name of the risk type.
|
|
25
|
+
description (str): A description of the risk type.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
name = models.CharField(max_length=100, unique=True)
|
|
29
|
+
description = models.TextField(blank=True, null=True)
|
|
30
|
+
|
|
31
|
+
objects = RiskTypeManager()
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from endoreg_db.models.risk.risk import Risk
|
|
35
|
+
|
|
36
|
+
risks: models.QuerySet[Risk]
|
|
37
|
+
|
|
38
|
+
def natural_key(self):
|
|
39
|
+
"""
|
|
40
|
+
Return the natural key for this risk type.
|
|
41
|
+
|
|
42
|
+
This method returns a tuple containing only the risk type's unique name, which is used
|
|
43
|
+
to identify the instance naturally.
|
|
44
|
+
"""
|
|
45
|
+
return (self.name,)
|
|
46
|
+
|
|
47
|
+
def __str__(self):
|
|
48
|
+
"""
|
|
49
|
+
Return the risk type's name as its string representation.
|
|
50
|
+
"""
|
|
51
|
+
return str(self.name)
|