endoreg-db 0.6.3__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 +26 -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/disease_classification/chronic_kidney_disease.yaml +2 -2
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
- 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 +418 -2
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +157 -5
- 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 +8 -44
- 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.yaml +26 -121
- 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_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/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/misc.yaml +43 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_indication/anticoagulation.yaml +4 -4
- 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 +27 -10
- 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 +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/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/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 +15 -1
- endoreg_db/management/commands/load_center_data.py +46 -21
- endoreg_db/management/commands/load_endoscope_data.py +2 -2
- endoreg_db/management/commands/load_examination_indication_data.py +49 -28
- 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_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/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 +274 -291
- 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/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- 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 +18 -10
- 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/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/{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/__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/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 -269
- endoreg_db/utils/__init__.py +68 -16
- 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 +88 -31
- 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/hashs.py +1 -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 +104 -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/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/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 +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/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/ai_model.py +0 -103
- 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 -250
- 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 -100
- endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -136
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -807
- 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 -80
- 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 -260
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -288
- 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/disease.py +0 -79
- endoreg_db/models/event.py +0 -73
- endoreg_db/models/examination/examination.py +0 -67
- endoreg_db/models/examination/examination_indication.py +0 -170
- 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 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -111
- 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 -587
- 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.3.dist-info/METADATA +0 -161
- endoreg_db-0.6.3.dist-info/RECORD +0 -435
- /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/{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.3.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
- {endoreg_db-0.6.3.dist-info → endoreg_db-0.8.1.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,17 +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
48
|
def create_lab_value_by_sample(
|
|
34
|
-
cls, sample
|
|
35
|
-
value=None, value_str=None,
|
|
36
|
-
unit=None
|
|
49
|
+
cls, sample:"PatientLabSample", lab_value_name:str,
|
|
50
|
+
value:Optional[float]=None, value_str:Optional[str]=None,
|
|
51
|
+
unit:Optional["Unit"]=None
|
|
37
52
|
):
|
|
38
|
-
from
|
|
53
|
+
from ..laboratory import LabValue
|
|
39
54
|
patient = sample.patient
|
|
40
55
|
lab_value = LabValue.objects.get(name=lab_value_name)
|
|
41
|
-
|
|
42
|
-
value_str = value_str
|
|
56
|
+
|
|
43
57
|
|
|
44
58
|
pat_lab_val = cls.objects.create(
|
|
45
59
|
patient = patient,
|
|
@@ -62,9 +76,8 @@ class PatientLabValue(models.Model):
|
|
|
62
76
|
return _str
|
|
63
77
|
|
|
64
78
|
def get_normal_range(self):
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
patient:Patient = self.patient
|
|
79
|
+
lab_value = self.lab_value
|
|
80
|
+
patient = self.patient
|
|
68
81
|
|
|
69
82
|
age = patient.age()
|
|
70
83
|
gender = patient.gender
|
|
@@ -116,8 +129,9 @@ class PatientLabValue(models.Model):
|
|
|
116
129
|
super().save(*args, **kwargs)
|
|
117
130
|
|
|
118
131
|
def set_value_by_distribution(self, distribution=None, save = True):
|
|
119
|
-
from
|
|
120
|
-
|
|
132
|
+
from ...administration.person.patient import Patient
|
|
133
|
+
from ..laboratory import LabValue
|
|
134
|
+
from ...other.distribution import (
|
|
121
135
|
DateValueDistribution,
|
|
122
136
|
SingleCategoricalValueDistribution,
|
|
123
137
|
NumericValueDistribution,
|
|
@@ -127,8 +141,6 @@ class PatientLabValue(models.Model):
|
|
|
127
141
|
|
|
128
142
|
patient:Patient = self.patient
|
|
129
143
|
|
|
130
|
-
dob = patient.dob #TODO: age specific norm values
|
|
131
|
-
gender:Gender = patient.gender # TODO: gender specific norm values
|
|
132
144
|
lab_value:LabValue = self.lab_value
|
|
133
145
|
|
|
134
146
|
assert self.lab_value, "Lab value must be set to set value by distribution"
|
|
@@ -156,7 +168,7 @@ class PatientLabValue(models.Model):
|
|
|
156
168
|
distribution_type = "uniform"
|
|
157
169
|
)
|
|
158
170
|
|
|
159
|
-
value = distribution.generate_value(lab_value=lab_value)
|
|
171
|
+
value = distribution.generate_value(lab_value=lab_value, patient=patient)
|
|
160
172
|
self.value = value
|
|
161
173
|
if save:
|
|
162
174
|
self.save()
|
|
@@ -193,5 +205,18 @@ class PatientLabValue(models.Model):
|
|
|
193
205
|
self.value = value
|
|
194
206
|
if save:
|
|
195
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
|
+
)
|
|
196
221
|
|
|
197
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)
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
"""Models for storing metadata associated with other data entities."""
|
|
2
|
+
|
|
1
3
|
from .sensitive_meta import SensitiveMeta
|
|
2
4
|
from .pdf_meta import PdfMeta, PdfType
|
|
3
5
|
from .video_meta import VideoMeta, FFMpegMeta, VideoImportMeta
|
|
6
|
+
from .model_meta import ModelMeta
|
|
7
|
+
from .video_prediction_meta import VideoPredictionMeta
|
|
4
8
|
|
|
5
9
|
|
|
6
10
|
__all__ = [
|
|
@@ -10,4 +14,6 @@ __all__ = [
|
|
|
10
14
|
"VideoMeta",
|
|
11
15
|
"FFMpegMeta",
|
|
12
16
|
"VideoImportMeta",
|
|
17
|
+
"ModelMeta",
|
|
18
|
+
"VideoPredictionMeta",
|
|
13
19
|
]
|
|
File without changes
|