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,156 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django model for AI models.
|
|
3
|
+
"""
|
|
4
|
+
from importlib import metadata
|
|
5
|
+
from django.db import models
|
|
6
|
+
from icecream import ic
|
|
7
|
+
from typing import TYPE_CHECKING, Optional, Union
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from .model_type import ModelType
|
|
11
|
+
from ...metadata import ModelMeta
|
|
12
|
+
from ...label import VideoSegmentationLabelSet
|
|
13
|
+
# Forward reference AiModel for use in type hints within the class itself
|
|
14
|
+
from typing import ForwardRef
|
|
15
|
+
AiModelRef = ForwardRef("'AiModel'")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AiModelManager(models.Manager):
|
|
19
|
+
"""
|
|
20
|
+
Manager for AI models with custom query methods.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def get_by_natural_key(self, name: str):
|
|
24
|
+
"""
|
|
25
|
+
Retrieves the AiModel instance with the specified unique name.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
name: The unique identifier of the AiModel to retrieve.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
The AiModel instance matching the given name.
|
|
32
|
+
|
|
33
|
+
Raises:
|
|
34
|
+
AiModel.DoesNotExist: If no AiModel with the specified name exists.
|
|
35
|
+
"""
|
|
36
|
+
return self.get(name=name)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class AiModel(models.Model):
|
|
40
|
+
"""
|
|
41
|
+
Represents a generic AI model that encapsulates high-level metadata about the model,
|
|
42
|
+
including names (default, German, and English), a description, categorization details,
|
|
43
|
+
and associated label sets and meta information.
|
|
44
|
+
|
|
45
|
+
name (str): Unique name of the AI model.
|
|
46
|
+
description (str): Optional detailed description of the AI model.
|
|
47
|
+
model_type (str): Optional type/category of the AI model.
|
|
48
|
+
model_subtype (str): Optional subtype within the broader model type.
|
|
49
|
+
video_segmentation_labelset (VideoSegmentationLabelSet): Optional associated label set for video segmentation tasks.
|
|
50
|
+
active_meta (ModelMeta): Optional reference to the currently active ModelMeta instance associated with the model.
|
|
51
|
+
"""
|
|
52
|
+
objects = AiModelManager()
|
|
53
|
+
|
|
54
|
+
name = models.CharField(max_length=255, unique=True)
|
|
55
|
+
|
|
56
|
+
description = models.TextField(blank=True, null=True)
|
|
57
|
+
model_type:Optional[models.ForeignKey[Union["ModelType", None]]] = models.ForeignKey(
|
|
58
|
+
"ModelType",
|
|
59
|
+
on_delete=models.CASCADE,
|
|
60
|
+
related_name="ai_models",
|
|
61
|
+
blank=True,
|
|
62
|
+
null=True,
|
|
63
|
+
)
|
|
64
|
+
model_subtype = models.CharField(max_length=255, blank=True, null=True)
|
|
65
|
+
video_segmentation_labelset:Optional[models.ForeignKey[Union["VideoSegmentationLabelSet", None]]] = models.ForeignKey(
|
|
66
|
+
"VideoSegmentationLabelSet",
|
|
67
|
+
on_delete=models.CASCADE,
|
|
68
|
+
related_name="ai_models",
|
|
69
|
+
blank=True,
|
|
70
|
+
null=True,
|
|
71
|
+
)
|
|
72
|
+
active_meta:Optional[models.ForeignKey[Union["ModelMeta", None]]] = models.ForeignKey(
|
|
73
|
+
"ModelMeta",
|
|
74
|
+
on_delete=models.SET_NULL,
|
|
75
|
+
related_name="active_model",
|
|
76
|
+
blank=True,
|
|
77
|
+
null=True,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
if TYPE_CHECKING:
|
|
81
|
+
metadata_versions: models.QuerySet["ModelMeta"]
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def get_version(self, version: int) -> "ModelMeta":
|
|
85
|
+
"""
|
|
86
|
+
Retrieves the ModelMeta instance for the specified version.
|
|
87
|
+
|
|
88
|
+
If the active_meta matches the requested version, it is returned. Otherwise, searches related metadata_versions for a matching version. Raises ValueError if no matching metadata is found.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
version: The version number of the desired ModelMeta.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
The ModelMeta instance corresponding to the specified version.
|
|
95
|
+
|
|
96
|
+
Raises:
|
|
97
|
+
ValueError: If no ModelMeta with the given version exists.
|
|
98
|
+
"""
|
|
99
|
+
if self.active_meta is not None and self.active_meta.version == version:
|
|
100
|
+
return self.active_meta
|
|
101
|
+
|
|
102
|
+
# Get the model metadata with the given version
|
|
103
|
+
model_meta = self.metadata_versions.filter(version=version).first()
|
|
104
|
+
if model_meta is not None:
|
|
105
|
+
return model_meta
|
|
106
|
+
|
|
107
|
+
raise ValueError(f"No model metadata found for version {version}.")
|
|
108
|
+
|
|
109
|
+
def get_latest_version(self) -> "ModelMeta":
|
|
110
|
+
"""
|
|
111
|
+
Get the model_metadata object from metadata_versions with the highest version number.
|
|
112
|
+
"""
|
|
113
|
+
if self.active_meta is not None:
|
|
114
|
+
return self.active_meta
|
|
115
|
+
|
|
116
|
+
# Get the latest version of the model metadata
|
|
117
|
+
latest_version = self.metadata_versions.order_by("-version").first()
|
|
118
|
+
if latest_version is not None:
|
|
119
|
+
return latest_version
|
|
120
|
+
|
|
121
|
+
raise ValueError("No model metadata found for this model.")
|
|
122
|
+
|
|
123
|
+
@classmethod
|
|
124
|
+
def set_active_model_meta(cls, model_name: str, meta_name: str, meta_version: int):
|
|
125
|
+
"""
|
|
126
|
+
Sets the active metadata version for the specified AI model.
|
|
127
|
+
|
|
128
|
+
Updates the `active_meta` field of the AiModel identified by `model_name` to the ModelMeta instance matching `meta_name` and `meta_version`.
|
|
129
|
+
"""
|
|
130
|
+
from ...metadata import ModelMeta
|
|
131
|
+
|
|
132
|
+
model = cls.objects.get(name=model_name)
|
|
133
|
+
assert model is not None, "Model not found"
|
|
134
|
+
|
|
135
|
+
ic(f"Getting model meta for {model_name} {meta_name} {meta_version}")
|
|
136
|
+
|
|
137
|
+
model_meta = ModelMeta.objects.get(
|
|
138
|
+
name=meta_name, model=model, version=meta_version
|
|
139
|
+
)
|
|
140
|
+
assert model_meta is not None, "ModelMeta not found"
|
|
141
|
+
|
|
142
|
+
model.active_meta = model_meta
|
|
143
|
+
model.save()
|
|
144
|
+
|
|
145
|
+
ic(
|
|
146
|
+
f"Set active model meta for {model_name} to {meta_name} version {meta_version}"
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
def natural_key(self):
|
|
150
|
+
"""
|
|
151
|
+
Return the natural key for this model.
|
|
152
|
+
"""
|
|
153
|
+
return (self.name,)
|
|
154
|
+
|
|
155
|
+
def __str__(self):
|
|
156
|
+
return str(self.name)
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
-
from
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from .ai_model import AiModel
|
|
3
6
|
|
|
4
7
|
class ModelTypeManager(models.Manager):
|
|
5
|
-
|
|
8
|
+
"""
|
|
9
|
+
Custom manager for ModelType with additional query methods.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
def get_by_natural_key(self, name: str) -> "ModelType":
|
|
13
|
+
"""Get the model type by its natural key"""
|
|
6
14
|
return self.get(name=name)
|
|
7
|
-
|
|
15
|
+
|
|
16
|
+
|
|
8
17
|
class ModelType(models.Model):
|
|
9
18
|
"""
|
|
10
19
|
A class representing a model type.
|
|
@@ -14,13 +23,19 @@ class ModelType(models.Model):
|
|
|
14
23
|
description (str): A description of the model type.
|
|
15
24
|
|
|
16
25
|
"""
|
|
26
|
+
|
|
17
27
|
name = models.CharField(max_length=255)
|
|
18
28
|
description = models.TextField(blank=True, null=True)
|
|
19
29
|
|
|
20
30
|
objects = ModelTypeManager()
|
|
21
31
|
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
ai_models: models.QuerySet["AiModel"]
|
|
34
|
+
|
|
22
35
|
def natural_key(self):
|
|
36
|
+
"""Return the natural key for this model type"""
|
|
23
37
|
return (self.name,)
|
|
24
38
|
|
|
25
39
|
def __str__(self):
|
|
26
|
-
|
|
40
|
+
"""Return the name of the model type"""
|
|
41
|
+
return str(self.name)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from .case import Case
|
|
2
|
+
from .case_template import (
|
|
3
|
+
CaseTemplate,
|
|
4
|
+
CaseTemplateRule,
|
|
5
|
+
CaseTemplateRuleType,
|
|
6
|
+
CaseTemplateRuleValue,
|
|
7
|
+
CaseTemplateRuleValueType,
|
|
8
|
+
CaseTemplateType,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"Case",
|
|
13
|
+
"CaseTemplate",
|
|
14
|
+
"CaseTemplateRule",
|
|
15
|
+
"CaseTemplateRuleType",
|
|
16
|
+
"CaseTemplateRuleValue",
|
|
17
|
+
"CaseTemplateRuleValueType",
|
|
18
|
+
"CaseTemplateType",
|
|
19
|
+
]
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from ..person import Patient
|
|
6
|
+
from ...medical.patient.patient_examination import PatientExamination
|
|
7
|
+
from django.utils import timezone
|
|
8
|
+
|
|
9
|
+
class Case(models.Model):
|
|
10
|
+
"""
|
|
11
|
+
Represents a clinical case, linking a patient to one or more examinations over a specific period.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
patient (Patient): The patient associated with this case.
|
|
15
|
+
patient_examinations (QuerySet[PatientExamination]): Examinations included in this case.
|
|
16
|
+
hash (str): An optional hash value for the case.
|
|
17
|
+
start_date (datetime): The start date and time of the case.
|
|
18
|
+
end_date (datetime): The end date and time of the case (optional).
|
|
19
|
+
is_active (bool): Indicates if the case is currently active.
|
|
20
|
+
is_closed (bool): Indicates if the case has been closed.
|
|
21
|
+
is_deleted (bool): Indicates if the case is marked as deleted.
|
|
22
|
+
created_at (datetime): Timestamp of case creation.
|
|
23
|
+
updated_at (datetime): Timestamp of last case update.
|
|
24
|
+
"""
|
|
25
|
+
patient = models.ForeignKey(
|
|
26
|
+
'Patient',
|
|
27
|
+
on_delete=models.CASCADE,
|
|
28
|
+
related_name='cases',
|
|
29
|
+
help_text="The patient associated with this case.",
|
|
30
|
+
db_index=True
|
|
31
|
+
)
|
|
32
|
+
patient_examinations = models.ManyToManyField(
|
|
33
|
+
'PatientExamination',
|
|
34
|
+
related_name='cases',
|
|
35
|
+
help_text="The examinations included in this case."
|
|
36
|
+
)
|
|
37
|
+
hash = models.CharField(
|
|
38
|
+
max_length=255,
|
|
39
|
+
blank=True,
|
|
40
|
+
null=True,
|
|
41
|
+
help_text="An optional hash value associated with the case."
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
start_date = models.DateTimeField(
|
|
45
|
+
help_text="The start date and time of the case.",
|
|
46
|
+
db_index=True
|
|
47
|
+
)
|
|
48
|
+
end_date = models.DateTimeField(
|
|
49
|
+
null=True,
|
|
50
|
+
blank=True,
|
|
51
|
+
help_text="The end date and time of the case (optional)."
|
|
52
|
+
)
|
|
53
|
+
is_active = models.BooleanField(
|
|
54
|
+
default=True,
|
|
55
|
+
help_text="Flag indicating if the case is currently active.",
|
|
56
|
+
db_index=True
|
|
57
|
+
)
|
|
58
|
+
is_closed = models.BooleanField(
|
|
59
|
+
default=False,
|
|
60
|
+
help_text="Flag indicating if the case has been closed.",
|
|
61
|
+
db_index=True
|
|
62
|
+
)
|
|
63
|
+
is_deleted = models.BooleanField(
|
|
64
|
+
default=False,
|
|
65
|
+
help_text="Flag indicating if the case is marked as deleted.",
|
|
66
|
+
db_index=True
|
|
67
|
+
)
|
|
68
|
+
created_at = models.DateTimeField(
|
|
69
|
+
auto_now_add=True,
|
|
70
|
+
help_text="The date and time the case was created."
|
|
71
|
+
)
|
|
72
|
+
updated_at = models.DateTimeField(
|
|
73
|
+
auto_now=True,
|
|
74
|
+
help_text="The date and time the case was last updated."
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if TYPE_CHECKING:
|
|
78
|
+
patient: "Patient"
|
|
79
|
+
patient_examinations: models.QuerySet["PatientExamination"]
|
|
80
|
+
|
|
81
|
+
class Meta:
|
|
82
|
+
ordering = ['-start_date', 'patient']
|
|
83
|
+
verbose_name = "Case"
|
|
84
|
+
verbose_name_plural = "Cases"
|
|
85
|
+
|
|
86
|
+
def __str__(self):
|
|
87
|
+
string_representation = f"Case {self.pk} ({self.patient})"
|
|
88
|
+
if self.start_date:
|
|
89
|
+
string_representation += f" - {self.start_date.strftime('%Y-%m-%d')}"
|
|
90
|
+
if self.end_date:
|
|
91
|
+
string_representation += f" - {self.end_date.strftime('%Y-%m-%d')}"
|
|
92
|
+
return string_representation
|
|
93
|
+
|
|
94
|
+
def close(self, end_date=None):
|
|
95
|
+
"""Close this case with optional end date."""
|
|
96
|
+
self.is_closed = True
|
|
97
|
+
self.is_active = False
|
|
98
|
+
if end_date:
|
|
99
|
+
self.end_date = end_date
|
|
100
|
+
elif not self.end_date:
|
|
101
|
+
self.end_date = timezone.now()
|
|
102
|
+
self.save()
|
|
103
|
+
|
|
104
|
+
def reopen(self):
|
|
105
|
+
"""Reopen this case if it was closed."""
|
|
106
|
+
self.is_closed = False
|
|
107
|
+
self.is_active = True
|
|
108
|
+
self.save()
|
|
109
|
+
|
|
110
|
+
def mark_as_deleted(self):
|
|
111
|
+
"""Mark this case as deleted."""
|
|
112
|
+
self.is_deleted = True
|
|
113
|
+
self.is_active = False
|
|
114
|
+
self.save()
|
|
@@ -3,4 +3,13 @@
|
|
|
3
3
|
from .case_template_rule import CaseTemplateRule, CaseTemplateRuleType
|
|
4
4
|
from .case_template_rule_value import CaseTemplateRuleValue, CaseTemplateRuleValueType
|
|
5
5
|
from .case_template_type import CaseTemplateType
|
|
6
|
-
from .case_template import CaseTemplate
|
|
6
|
+
from .case_template import CaseTemplate
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"CaseTemplateRule",
|
|
10
|
+
"CaseTemplateRuleType",
|
|
11
|
+
"CaseTemplateRuleValue",
|
|
12
|
+
"CaseTemplateRuleValueType",
|
|
13
|
+
"CaseTemplateType",
|
|
14
|
+
"CaseTemplate",
|
|
15
|
+
]
|
|
@@ -6,13 +6,14 @@ class CaseTemplateManager(models.Manager):
|
|
|
6
6
|
|
|
7
7
|
class CaseTemplate(models.Model):
|
|
8
8
|
"""
|
|
9
|
-
|
|
9
|
+
Represents a case template.
|
|
10
10
|
|
|
11
11
|
Attributes:
|
|
12
|
-
name (str): The name of the case template.
|
|
13
|
-
|
|
12
|
+
name (str): The unique name of the case template.
|
|
13
|
+
template_type (ForeignKey): The type of the case template.
|
|
14
14
|
description (str): A description of the case template.
|
|
15
|
-
|
|
15
|
+
rules: The primary rules associated with the case template.
|
|
16
|
+
secondary_rules: Secondary rules associated with the case template.
|
|
16
17
|
"""
|
|
17
18
|
name = models.CharField(max_length=255, unique=True)
|
|
18
19
|
template_type = models.ForeignKey("CaseTemplateType", on_delete=models.CASCADE, related_name="case_templates")
|
|
@@ -30,35 +31,72 @@ class CaseTemplate(models.Model):
|
|
|
30
31
|
objects = CaseTemplateManager()
|
|
31
32
|
|
|
32
33
|
def natural_key(self):
|
|
34
|
+
"""
|
|
35
|
+
Returns the natural key for the case template.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
tuple: The natural key consisting of the name.
|
|
39
|
+
"""
|
|
33
40
|
return (self.name,)
|
|
34
41
|
|
|
35
42
|
def __str__(self):
|
|
36
|
-
|
|
43
|
+
"""
|
|
44
|
+
String representation of the case template.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
str: The name of the case template.
|
|
48
|
+
"""
|
|
49
|
+
return str(self.name)
|
|
37
50
|
|
|
38
51
|
def get_rules(self):
|
|
39
|
-
|
|
40
|
-
|
|
52
|
+
"""
|
|
53
|
+
Retrieves all primary rules associated with the case template.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
A queryset of primary rules.
|
|
57
|
+
"""
|
|
58
|
+
return self.rules.all()
|
|
59
|
+
|
|
41
60
|
|
|
42
61
|
def get_secondary_rules(self):
|
|
62
|
+
"""
|
|
63
|
+
Retrieves all secondary rules associated with the case template.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
QuerySet: A queryset of secondary rules.
|
|
67
|
+
"""
|
|
43
68
|
rules = self.secondary_rules.all()
|
|
44
69
|
return rules
|
|
45
70
|
|
|
46
71
|
def _assert_max_one_create_patient_rule(self):
|
|
47
|
-
"""
|
|
72
|
+
"""
|
|
73
|
+
Ensures that there is at most one rule with rule_type "create-object" and target_model "Patient".
|
|
74
|
+
|
|
75
|
+
Raises:
|
|
76
|
+
ValueError: If more than one rule of the specified type exists.
|
|
77
|
+
"""
|
|
48
78
|
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model__name="Patient")
|
|
49
79
|
if len(create_patient_rules) > 1:
|
|
50
|
-
raise ValueError(
|
|
51
|
-
|
|
80
|
+
raise ValueError(
|
|
81
|
+
"There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'."
|
|
82
|
+
)
|
|
83
|
+
|
|
52
84
|
# custom save method which runs the _assert_max_one_create_patient_rule method and others
|
|
53
85
|
def save(self, *args, **kwargs):
|
|
54
86
|
# self._assert_max_one_create_patient_rule() #TODO Fails on first save since many to many can only be used if object has an id
|
|
55
87
|
super().save(*args, **kwargs)
|
|
56
88
|
|
|
57
89
|
def get_create_patient_rule(self):
|
|
58
|
-
"""Filter the rules for the rule which has the rule_type__name "create-object" and target_model__name "Patient".
|
|
59
|
-
Also makes sure, that only 1 is returned. If there is no such rule, get default create patient rule.
|
|
60
90
|
"""
|
|
61
|
-
|
|
91
|
+
Retrieves the "create-patient" rule.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
CaseTemplateRule: The rule that creates a patient.
|
|
95
|
+
|
|
96
|
+
Raises:
|
|
97
|
+
ValueError: If multiple such rules exist.
|
|
98
|
+
"""
|
|
99
|
+
from .case_template_rule import CaseTemplateRule
|
|
62
100
|
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model="Patient")
|
|
63
101
|
if len(create_patient_rules) > 1:
|
|
64
102
|
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'.")
|
|
@@ -67,10 +105,16 @@ class CaseTemplate(models.Model):
|
|
|
67
105
|
return create_patient_rules[0]
|
|
68
106
|
|
|
69
107
|
def get_create_patient_medication_schedule_rule(self):
|
|
70
|
-
"""Filter the rules for the rule which has the rule_type__name "create-object" and target_model__name "PatientMedicationSchedule".
|
|
71
|
-
Also makes sure, that only 1 is returned. If there is no such rule, get default create patient medication schedule rule.
|
|
72
108
|
"""
|
|
73
|
-
|
|
109
|
+
Retrieves the "create-patient_medication_schedule" rule.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
CaseTemplateRule: The rule for creating a patient medication schedule.
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
ValueError: If multiple such rules exist.
|
|
116
|
+
"""
|
|
117
|
+
from .case_template_rule import CaseTemplateRule
|
|
74
118
|
create_patient_medication_schedule_rules = self.rules.filter(rule_type__name="create-object", target_model="PatientMedicationSchedule")
|
|
75
119
|
if len(create_patient_medication_schedule_rules) > 1:
|
|
76
120
|
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'PatientMedicationSchedule'.")
|
|
@@ -6,16 +6,13 @@ class CaseTemplateRuleTypeManager(models.Manager):
|
|
|
6
6
|
|
|
7
7
|
class CaseTemplateRuleType(models.Model):
|
|
8
8
|
"""
|
|
9
|
-
|
|
9
|
+
Represents a type of rule for a case template.
|
|
10
10
|
|
|
11
11
|
Attributes:
|
|
12
|
-
name (str): The name of the
|
|
13
|
-
description (str): A description of the
|
|
14
|
-
|
|
12
|
+
name (str): The name of the rule type.
|
|
13
|
+
description (str): A description of the rule type.
|
|
15
14
|
"""
|
|
16
15
|
name = models.CharField(max_length=255)
|
|
17
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
18
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
19
16
|
description = models.TextField(blank=True, null=True)
|
|
20
17
|
|
|
21
18
|
objects = CaseTemplateRuleTypeManager()
|
|
@@ -24,7 +21,7 @@ class CaseTemplateRuleType(models.Model):
|
|
|
24
21
|
return (self.name,)
|
|
25
22
|
|
|
26
23
|
def __str__(self):
|
|
27
|
-
return self.name
|
|
24
|
+
return str(self.name)
|
|
28
25
|
|
|
29
26
|
class CaseTemplateRuleManager(models.Manager):
|
|
30
27
|
def get_by_natural_key(self, name):
|
|
@@ -50,10 +47,7 @@ class CaseTemplateRule(models.Model):
|
|
|
50
47
|
|
|
51
48
|
Attributes:
|
|
52
49
|
name (str): The name of the case template rule.
|
|
53
|
-
case_template (CaseTemplate): The case template to which the rule belongs.
|
|
54
50
|
description (str): A description of the case template rule.
|
|
55
|
-
name_de (str): The name of the case template rule in German.
|
|
56
|
-
name_en (str): The name of the case template rule in English.
|
|
57
51
|
rule_type (CaseTemplateRuleType): The type of the rule.
|
|
58
52
|
parent_model (str): The model on which the rule is applied.
|
|
59
53
|
target_field (str): The field of the parent model on which the rule is applied.
|
|
@@ -79,8 +73,6 @@ class CaseTemplateRule(models.Model):
|
|
|
79
73
|
|
|
80
74
|
"""
|
|
81
75
|
name = models.CharField(max_length=255)
|
|
82
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
83
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
84
76
|
description = models.TextField(blank=True, null=True)
|
|
85
77
|
rule_type = models.ForeignKey(
|
|
86
78
|
"CaseTemplateRuleType", on_delete=models.CASCADE
|
|
@@ -124,7 +116,7 @@ class CaseTemplateRule(models.Model):
|
|
|
124
116
|
|
|
125
117
|
:return: A string representation of the rule.
|
|
126
118
|
"""
|
|
127
|
-
return self.name
|
|
119
|
+
return str(self.name)
|
|
128
120
|
|
|
129
121
|
def get_rule_type(self):
|
|
130
122
|
"""
|
|
@@ -193,6 +185,7 @@ class CaseTemplateRule(models.Model):
|
|
|
193
185
|
|
|
194
186
|
def chained_rules_has_self_reference(self):
|
|
195
187
|
"""
|
|
188
|
+
:noindex:
|
|
196
189
|
Check if any directly or indirectly chained rules reference this rule, creating a non-terminating loop.
|
|
197
190
|
Return a list containing a tuple (first_rule, self_referencing_rule) for each self-reference.
|
|
198
191
|
first_rule is the most upward rule in the chain that references the rule.
|
endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py
RENAMED
|
@@ -21,8 +21,6 @@ class CaseTemplateRuleValueType(models.Model):
|
|
|
21
21
|
objects = CaseTemplateRuleValueTypeManager()
|
|
22
22
|
|
|
23
23
|
name = models.CharField(max_length=255)
|
|
24
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
25
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
26
24
|
description = models.TextField(blank=True, null=True)
|
|
27
25
|
|
|
28
26
|
distribution_type = models.CharField(max_length=255, choices=DISTRIBUTION_TYPES)
|
|
@@ -32,7 +30,7 @@ class CaseTemplateRuleValueType(models.Model):
|
|
|
32
30
|
return (self.name,)
|
|
33
31
|
|
|
34
32
|
def __str__(self):
|
|
35
|
-
return self.name
|
|
33
|
+
return str(self.name)
|
|
36
34
|
|
|
37
35
|
class CaseTemplateRuleValueManager(models.Manager):
|
|
38
36
|
def get_by_natural_key(self, name):
|
|
@@ -40,12 +38,14 @@ class CaseTemplateRuleValueManager(models.Manager):
|
|
|
40
38
|
|
|
41
39
|
class CaseTemplateRuleValue(models.Model):
|
|
42
40
|
"""
|
|
43
|
-
|
|
41
|
+
Represents a case template rule value.
|
|
44
42
|
|
|
45
43
|
Attributes:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
name (str): The name of the rule value.
|
|
45
|
+
description (str): A description of the rule value.
|
|
46
|
+
fk_value (str): Foreign key value stored as a string.
|
|
47
|
+
numeric_value (float): Numeric value for the rule.
|
|
48
|
+
text_value (str): Text value for the rule.
|
|
49
49
|
"""
|
|
50
50
|
objects = CaseTemplateRuleValueManager()
|
|
51
51
|
|
|
@@ -57,12 +57,25 @@ class CaseTemplateRuleValue(models.Model):
|
|
|
57
57
|
text_value = models.CharField(max_length=255, null=True, blank=True)
|
|
58
58
|
|
|
59
59
|
def natural_key(self):
|
|
60
|
+
"""
|
|
61
|
+
Returns the natural key for the object.
|
|
62
|
+
"""
|
|
60
63
|
return (self.name,)
|
|
61
64
|
|
|
62
65
|
def __str__(self):
|
|
63
|
-
|
|
66
|
+
"""
|
|
67
|
+
String representation of the object.
|
|
68
|
+
"""
|
|
69
|
+
return str(self.name)
|
|
64
70
|
|
|
65
71
|
def get_value(self):
|
|
72
|
+
"""
|
|
73
|
+
Retrieves the value based on priority:
|
|
74
|
+
- fk_value > numeric_value > text_value > None.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
str | float | None: The value based on the type hierarchy.
|
|
78
|
+
"""
|
|
66
79
|
if self.fk_value:
|
|
67
80
|
return self.fk_value
|
|
68
81
|
elif self.numeric_value:
|
|
@@ -15,8 +15,6 @@ class CaseTemplateType(models.Model):
|
|
|
15
15
|
|
|
16
16
|
"""
|
|
17
17
|
name = models.CharField(max_length=255)
|
|
18
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
19
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
20
18
|
description = models.TextField(blank=True, null=True)
|
|
21
19
|
|
|
22
20
|
objects = CaseTemplateTypeManager()
|
|
@@ -25,4 +23,4 @@ class CaseTemplateType(models.Model):
|
|
|
25
23
|
return (self.name,)
|
|
26
24
|
|
|
27
25
|
def __str__(self):
|
|
28
|
-
return self.name
|
|
26
|
+
return str(self.name)
|
|
@@ -2,3 +2,12 @@ from .center import Center
|
|
|
2
2
|
from .center_product import CenterProduct
|
|
3
3
|
from .center_resource import CenterResource
|
|
4
4
|
from .center_waste import CenterWaste
|
|
5
|
+
from .center_shift import CenterShift
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
'Center',
|
|
9
|
+
'CenterProduct',
|
|
10
|
+
'CenterResource',
|
|
11
|
+
'CenterWaste',
|
|
12
|
+
'CenterShift',
|
|
13
|
+
]
|