endoreg-db 0.8.6.4__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/__init__.py +0 -0
- endoreg_db/admin.py +92 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +18 -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/__init__.py +0 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +144 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- 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_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -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/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +91 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -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/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/examination/examinations/data.yaml +72 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +8 -0
- endoreg_db/data/examination/type/data.yaml +17 -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 +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- 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/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- 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 +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- 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/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -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/resource/green_endoscopy_dashboard_Resource.yaml +15 -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/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -0
- 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 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +8 -0
- endoreg_db/forms/unit.py +6 -0
- endoreg_db/helpers/__init__.py +0 -0
- 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 +77 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +62 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_data.py +68 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +75 -0
- 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_gender_data.py +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
- endoreg_db/management/commands/load_information_source.py +51 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_medication_data.py +103 -0
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_organ_data.py +43 -0
- endoreg_db/management/commands/load_pdf_type_data.py +61 -0
- endoreg_db/management/commands/load_profession_data.py +44 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +46 -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/load_unit_data.py +46 -0
- endoreg_db/management/commands/load_user_groups.py +28 -0
- endoreg_db/management/commands/register_ai_model.py +64 -0
- endoreg_db/management/commands/reset_celery_schedule.py +9 -0
- 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 +1857 -0
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +359 -0
- 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/administration/ai/model_type.py +41 -0
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +15 -0
- endoreg_db/models/administration/case/case_template/case_template.py +125 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
- endoreg_db/models/administration/center/__init__.py +13 -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/administration/person/names/first_name.py +18 -0
- endoreg_db/models/administration/person/names/last_name.py +19 -0
- 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/person.py +31 -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/administration/product/product_weight.py +47 -0
- endoreg_db/models/administration/product/reference_product.py +130 -0
- 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 -0
- 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 +83 -0
- 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/pdf/report_reader/report_reader_flag.py +20 -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/medical/hardware/endoscopy_processor.py +182 -0
- 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/medical/patient/patient_lab_value.py +222 -0
- 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/metadata/pdf_meta.py +89 -0
- 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 +40 -0
- 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/other/gender.py +27 -0
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -0
- endoreg_db/models/other/resource.py +22 -0
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -0
- endoreg_db/models/other/unit.py +32 -0
- endoreg_db/models/other/waste.py +27 -0
- 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/rule/rule.py +27 -0
- endoreg_db/models/rule/rule_applicator.py +224 -0
- endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
- endoreg_db/models/rule/rule_type.py +20 -0
- endoreg_db/models/rule/ruleset.py +17 -0
- 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/queries/__init__.py +5 -0
- endoreg_db/queries/annotations/__init__.py +3 -0
- endoreg_db/queries/annotations/legacy.py +158 -0
- endoreg_db/queries/sanity/__init_.py +0 -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 -0
- 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 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/get.py +5 -0
- 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/cropping.py +29 -0
- endoreg_db/utils/dataloader.py +175 -0
- 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 +58 -0
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +153 -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 +76 -0
- endoreg_db/utils/ocr.py +190 -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/uuid.py +4 -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 +186 -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 -0
- endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
- endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
- endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
from ..person import Person
|
|
2
|
+
from django.db import models
|
|
3
|
+
from faker import Faker
|
|
4
|
+
import random
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from typing import TYPE_CHECKING, List, Optional # Added List
|
|
7
|
+
import logging
|
|
8
|
+
from django.utils import timezone # Add this import
|
|
9
|
+
|
|
10
|
+
# Import RequirementLinks and Disease for the links property
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger("patient")
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from endoreg_db.models import (
|
|
16
|
+
ExaminationIndication,
|
|
17
|
+
PatientEvent, PatientDisease,
|
|
18
|
+
Gender,
|
|
19
|
+
PatientExamination,
|
|
20
|
+
Center,
|
|
21
|
+
AnonymExaminationReport,
|
|
22
|
+
AnonymHistologyReport, RawPdfFile,
|
|
23
|
+
# Added for links property
|
|
24
|
+
Medication,
|
|
25
|
+
PatientMedication,
|
|
26
|
+
MedicationIndication,
|
|
27
|
+
MedicationIntakeTime,
|
|
28
|
+
PatientLabValue, # Assuming self.lab_values are PatientLabValue instances
|
|
29
|
+
LabValue # If RequirementLinks expects actual LabValue instances
|
|
30
|
+
)
|
|
31
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
32
|
+
|
|
33
|
+
class Patient(Person):
|
|
34
|
+
"""
|
|
35
|
+
A class representing a patient.
|
|
36
|
+
|
|
37
|
+
Attributes inhereted from Person:
|
|
38
|
+
first_name (str): The first name of the patient.
|
|
39
|
+
last_name (str): The last name of the patient.
|
|
40
|
+
dob (datetime.date): The date of birth of the patient.
|
|
41
|
+
gender (Foreign Key): The gender of the patient.
|
|
42
|
+
email (str): The email address of the patient.
|
|
43
|
+
phone (str): The phone number of the patient.
|
|
44
|
+
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
# -----gc-08-dev--changings---
|
|
48
|
+
first_name = models.CharField(max_length=100) # type: ignore[assignment]
|
|
49
|
+
last_name = models.CharField(max_length=100) # type: ignore[assignment]
|
|
50
|
+
dob = models.DateField(null=True, blank=True) # type: ignore[assignment]
|
|
51
|
+
gender = models.ForeignKey( # type: ignore[assignment]
|
|
52
|
+
"Gender", on_delete=models.SET_NULL, null=True, blank=True
|
|
53
|
+
)
|
|
54
|
+
center = models.ForeignKey( # type: ignore[assignment]
|
|
55
|
+
"Center", on_delete=models.SET_NULL, null=True, blank=True
|
|
56
|
+
)
|
|
57
|
+
patient_hash = models.CharField(max_length=255, blank=True, null=True)
|
|
58
|
+
|
|
59
|
+
objects = models.Manager() # Default manager
|
|
60
|
+
|
|
61
|
+
if TYPE_CHECKING:
|
|
62
|
+
first_name: str
|
|
63
|
+
last_name: str
|
|
64
|
+
dob: datetime.date
|
|
65
|
+
gender: "Gender"
|
|
66
|
+
center: "Center"
|
|
67
|
+
events: models.QuerySet["PatientEvent"]
|
|
68
|
+
diseases: models.QuerySet["PatientDisease"]
|
|
69
|
+
patient_examinations: models.QuerySet["PatientExamination"]
|
|
70
|
+
anonymexaminationreport_set: models.QuerySet["AnonymExaminationReport"]
|
|
71
|
+
anonymhistologyreport_set: models.QuerySet["AnonymHistologyReport"]
|
|
72
|
+
|
|
73
|
+
def __str__(self):
|
|
74
|
+
return f"{self.first_name} {self.last_name} ({self.dob})"
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def get_or_create_pseudo_patient_by_hash(
|
|
78
|
+
cls,
|
|
79
|
+
patient_hash: str,
|
|
80
|
+
center: "Center" = None,
|
|
81
|
+
gender: "Gender | str" = None, # Allow string type hint
|
|
82
|
+
birth_month: int = None,
|
|
83
|
+
birth_year: int = None,
|
|
84
|
+
):
|
|
85
|
+
from endoreg_db.utils import random_day_by_year, create_mock_patient_name
|
|
86
|
+
from ....other import Gender # Import Gender model
|
|
87
|
+
|
|
88
|
+
created = False
|
|
89
|
+
|
|
90
|
+
existing_patient = cls.objects.filter(patient_hash=patient_hash).first()
|
|
91
|
+
if existing_patient:
|
|
92
|
+
logger.info(f"Patient with hash {patient_hash} already exists")
|
|
93
|
+
logger.info(f"Returning existing patient: {existing_patient}")
|
|
94
|
+
return existing_patient, created
|
|
95
|
+
|
|
96
|
+
# If no patient with the given hash exists, create a new pseudo patient
|
|
97
|
+
assert center, "Center must be provided to create a new pseudo patient"
|
|
98
|
+
assert gender, "Gender must be provided to create a new pseudo patient"
|
|
99
|
+
assert birth_month, (
|
|
100
|
+
"Birth month must be provided to create a new pseudo patient"
|
|
101
|
+
)
|
|
102
|
+
assert birth_year, "Birth year must be provided to create a new pseudo patient"
|
|
103
|
+
|
|
104
|
+
# Ensure gender is a Gender object
|
|
105
|
+
if isinstance(gender, str):
|
|
106
|
+
gender_obj = Gender.objects.get(name=gender)
|
|
107
|
+
elif isinstance(gender, Gender):
|
|
108
|
+
gender_obj = gender
|
|
109
|
+
else:
|
|
110
|
+
raise ValueError("Gender must be a string name or a Gender object.")
|
|
111
|
+
|
|
112
|
+
pseudo_dob = random_day_by_year(birth_year)
|
|
113
|
+
gender_name = gender_obj.name
|
|
114
|
+
first_name, last_name = create_mock_patient_name(gender_name)
|
|
115
|
+
|
|
116
|
+
logger.info(f"Creating pseudo patient with hash {patient_hash}")
|
|
117
|
+
logger.info(f"Generated name: {first_name} {last_name}")
|
|
118
|
+
|
|
119
|
+
patient = cls.objects.create(
|
|
120
|
+
first_name=first_name,
|
|
121
|
+
last_name=last_name,
|
|
122
|
+
dob=pseudo_dob,
|
|
123
|
+
gender=gender_obj, # Use the fetched/validated Gender object
|
|
124
|
+
patient_hash=patient_hash,
|
|
125
|
+
is_real_person=False,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
patient.save()
|
|
129
|
+
created = True
|
|
130
|
+
|
|
131
|
+
return patient, created
|
|
132
|
+
|
|
133
|
+
def get_dob(self) -> datetime.date:
|
|
134
|
+
dob: datetime.date = self.dob
|
|
135
|
+
return dob
|
|
136
|
+
|
|
137
|
+
def get_patient_examinations(self): # field: self.patient_examinations
|
|
138
|
+
"""Returns all patient examinations for this patient ordered by date (most recent is first)."""
|
|
139
|
+
return self.patient_examinations.order_by("-date_start")
|
|
140
|
+
|
|
141
|
+
def create_examination(
|
|
142
|
+
self,
|
|
143
|
+
examination_name_str: Optional[str] = None,
|
|
144
|
+
date_start: Optional[datetime] = None,
|
|
145
|
+
date_end: Optional[datetime] = None,
|
|
146
|
+
save: bool = True,
|
|
147
|
+
) -> "PatientExamination":
|
|
148
|
+
"""Creates a patient examination for this patient."""
|
|
149
|
+
|
|
150
|
+
if examination_name_str:
|
|
151
|
+
from ....medical import Examination, PatientExamination
|
|
152
|
+
|
|
153
|
+
examination = Examination.objects.get(name=examination_name_str)
|
|
154
|
+
patient_examination = PatientExamination(
|
|
155
|
+
patient=self,
|
|
156
|
+
examination=examination,
|
|
157
|
+
date_start=date_start,
|
|
158
|
+
date_end=date_end,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
else:
|
|
162
|
+
patient_examination = PatientExamination(
|
|
163
|
+
patient=self, date_start=date_start, date_end=date_end
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
if save:
|
|
167
|
+
patient_examination.save()
|
|
168
|
+
|
|
169
|
+
return patient_examination
|
|
170
|
+
|
|
171
|
+
def create_examination_by_indication(
|
|
172
|
+
self, indication: "ExaminationIndication", date_start: datetime = None, date_end: datetime = None
|
|
173
|
+
):
|
|
174
|
+
from ....medical import (
|
|
175
|
+
PatientExaminationIndication,
|
|
176
|
+
PatientExamination,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
examination = indication.get_examination()
|
|
180
|
+
|
|
181
|
+
patient_examination = PatientExamination.objects.create(
|
|
182
|
+
patient=self,
|
|
183
|
+
examination=examination,
|
|
184
|
+
date_start=date_start,
|
|
185
|
+
date_end=date_end,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
patient_examination.save()
|
|
189
|
+
|
|
190
|
+
patient_examination_indication = PatientExaminationIndication.objects.create(
|
|
191
|
+
patient_examination=patient_examination, examination_indication=indication
|
|
192
|
+
)
|
|
193
|
+
patient_examination_indication.save()
|
|
194
|
+
|
|
195
|
+
return patient_examination, patient_examination_indication
|
|
196
|
+
|
|
197
|
+
def create_event(
|
|
198
|
+
self,
|
|
199
|
+
event_name_str: str,
|
|
200
|
+
date_start: datetime = None,
|
|
201
|
+
date_end: datetime = None,
|
|
202
|
+
description: str = None,
|
|
203
|
+
):
|
|
204
|
+
"""
|
|
205
|
+
Creates a patient event with the specified event name and start date.
|
|
206
|
+
|
|
207
|
+
If no start date is provided, the current datetime is used. Returns the created PatientEvent instance.
|
|
208
|
+
"""
|
|
209
|
+
from ....medical import Event, PatientEvent
|
|
210
|
+
|
|
211
|
+
event = Event.objects.get(name=event_name_str)
|
|
212
|
+
|
|
213
|
+
if not date_start:
|
|
214
|
+
date_start = datetime.now()
|
|
215
|
+
|
|
216
|
+
patient_event = PatientEvent.objects.create(
|
|
217
|
+
patient=self,
|
|
218
|
+
event=event,
|
|
219
|
+
date_start=date_start,
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
return patient_event
|
|
223
|
+
|
|
224
|
+
def create_examination_by_pdf(self, pdf: "RawPdfFile"):
|
|
225
|
+
"""
|
|
226
|
+
Creates a patient examination and associates it with the provided PDF report file.
|
|
227
|
+
|
|
228
|
+
The examination is created for this patient, saved, and linked to the given RawPdfFile instance. The PDF's examination field is updated and saved. Returns the created examination instance.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
pdf: The RawPdfFile to associate with the new examination.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
The created PatientExamination instance.
|
|
235
|
+
"""
|
|
236
|
+
from ....medical import PatientExamination
|
|
237
|
+
patient_examination = PatientExamination(patient=self)
|
|
238
|
+
patient_examination.save()
|
|
239
|
+
pdf.examination = patient_examination
|
|
240
|
+
pdf.save()
|
|
241
|
+
|
|
242
|
+
return patient_examination
|
|
243
|
+
|
|
244
|
+
@classmethod
|
|
245
|
+
def get_random_gender(cls, p_male=0.5, p_female=0.5):
|
|
246
|
+
"""
|
|
247
|
+
Get a Gender object by name (male, female) from the database with given probability.
|
|
248
|
+
|
|
249
|
+
:param p_male: Probability of selecting 'male' gender.
|
|
250
|
+
:param p_female: Probability of selecting 'female' gender.
|
|
251
|
+
:return: Gender object selected based on given probabilities.
|
|
252
|
+
"""
|
|
253
|
+
from ....other import Gender
|
|
254
|
+
|
|
255
|
+
# Extract names and probabilities
|
|
256
|
+
gender_names = ["male", "female"]
|
|
257
|
+
probabilities = [p_male, p_female]
|
|
258
|
+
|
|
259
|
+
selected_gender = random.choices(gender_names, probabilities)[0]
|
|
260
|
+
|
|
261
|
+
# Fetch the corresponding Gender object from the database
|
|
262
|
+
gender_obj = Gender.objects.get(name=selected_gender)
|
|
263
|
+
|
|
264
|
+
return gender_obj
|
|
265
|
+
|
|
266
|
+
@classmethod
|
|
267
|
+
def get_random_age(
|
|
268
|
+
cls, min_age=55, max_age=90, mean_age=65, std_age=10, distribution="normal"
|
|
269
|
+
):
|
|
270
|
+
"""
|
|
271
|
+
Get a random age based on the given distribution.
|
|
272
|
+
|
|
273
|
+
:param min_age: Minimum age.
|
|
274
|
+
:param max_age: Maximum age.
|
|
275
|
+
:param mean_age: Mean age.
|
|
276
|
+
:param std_age: Standard deviation of the age.
|
|
277
|
+
:param distribution: Distribution of the age.
|
|
278
|
+
:return: Random age based on the given distribution.
|
|
279
|
+
"""
|
|
280
|
+
if distribution == "normal":
|
|
281
|
+
age = int(random.normalvariate(mean_age, std_age))
|
|
282
|
+
else:
|
|
283
|
+
age = int(random.uniform(min_age, max_age))
|
|
284
|
+
|
|
285
|
+
return age
|
|
286
|
+
|
|
287
|
+
@classmethod
|
|
288
|
+
def get_dob_from_age(cls, age, current_date=None):
|
|
289
|
+
"""
|
|
290
|
+
Get a date of birth based on the given age and current date.
|
|
291
|
+
|
|
292
|
+
:param age: Age of the patient.
|
|
293
|
+
:param current_date: Current date.
|
|
294
|
+
:return: Date of birth based on the given age and current date.
|
|
295
|
+
"""
|
|
296
|
+
if current_date is None:
|
|
297
|
+
current_date = datetime.now()
|
|
298
|
+
dob = current_date.replace(year=current_date.year - age).date()
|
|
299
|
+
|
|
300
|
+
# TODO
|
|
301
|
+
# randomize the day and month by adding a random number of days (0-364) to the date
|
|
302
|
+
|
|
303
|
+
return dob
|
|
304
|
+
|
|
305
|
+
@classmethod
|
|
306
|
+
def get_random_name_for_gender(cls, gender_obj, locale="de_DE"):
|
|
307
|
+
gender = gender_obj.name
|
|
308
|
+
fake = Faker(locale)
|
|
309
|
+
|
|
310
|
+
if gender == "male":
|
|
311
|
+
first_name = fake.first_name_male()
|
|
312
|
+
last_name = fake.last_name_male()
|
|
313
|
+
|
|
314
|
+
else:
|
|
315
|
+
first_name = fake.first_name_female()
|
|
316
|
+
last_name = fake.last_name_female()
|
|
317
|
+
|
|
318
|
+
return last_name, first_name
|
|
319
|
+
|
|
320
|
+
@classmethod
|
|
321
|
+
def create_generic(cls, center="gplay_case_generator"):
|
|
322
|
+
"""
|
|
323
|
+
Create a generic patient with random attributes.
|
|
324
|
+
|
|
325
|
+
:param center: The center name or Center object of the patient.
|
|
326
|
+
:return: The created patient.
|
|
327
|
+
"""
|
|
328
|
+
from ....administration import Center
|
|
329
|
+
|
|
330
|
+
gender = Patient.get_random_gender()
|
|
331
|
+
last_name, first_name = Patient.get_random_name_for_gender(gender)
|
|
332
|
+
|
|
333
|
+
age = Patient.get_random_age()
|
|
334
|
+
dob = Patient.get_dob_from_age(age)
|
|
335
|
+
|
|
336
|
+
# Fetch the center object if a name is provided
|
|
337
|
+
if isinstance(center, str):
|
|
338
|
+
center_obj = Center.objects.get(name=center)
|
|
339
|
+
elif isinstance(center, Center):
|
|
340
|
+
center_obj = center
|
|
341
|
+
else:
|
|
342
|
+
raise ValueError("Center must be a string name or a Center object.")
|
|
343
|
+
|
|
344
|
+
patient = Patient.objects.create(
|
|
345
|
+
first_name=first_name,
|
|
346
|
+
last_name=last_name,
|
|
347
|
+
dob=dob,
|
|
348
|
+
gender=gender,
|
|
349
|
+
center=center_obj, # Assign the center object
|
|
350
|
+
)
|
|
351
|
+
# No need to call save() again after create()
|
|
352
|
+
return patient
|
|
353
|
+
|
|
354
|
+
def age(self) -> int | None:
|
|
355
|
+
"""
|
|
356
|
+
Get the age of the patient.
|
|
357
|
+
|
|
358
|
+
:return: The age of the patient.
|
|
359
|
+
"""
|
|
360
|
+
# calculate correct age based on current date including day and month
|
|
361
|
+
current_date = timezone.now().date() # Use timezone.now() here too for consistency
|
|
362
|
+
dob = self.dob
|
|
363
|
+
# Ensure dob is not None before calculation
|
|
364
|
+
if dob:
|
|
365
|
+
age = (
|
|
366
|
+
current_date.year
|
|
367
|
+
- dob.year
|
|
368
|
+
- ((current_date.month, current_date.day) < (dob.month, dob.day))
|
|
369
|
+
)
|
|
370
|
+
return age
|
|
371
|
+
return None # Or handle the case where dob is None appropriately
|
|
372
|
+
|
|
373
|
+
def create_lab_sample(self, sample_type="generic", date=None, save=True):
|
|
374
|
+
"""
|
|
375
|
+
Create a lab sample for this patient.
|
|
376
|
+
|
|
377
|
+
:param sample_type: The sample type. Should be either string of the sample types
|
|
378
|
+
name or the sample type object. If not set, the default sample type ("generic") is used.
|
|
379
|
+
:param date: The date of the lab sample. Must be timezone-aware if provided.
|
|
380
|
+
:return: The created lab sample.
|
|
381
|
+
"""
|
|
382
|
+
from ....medical import PatientLabSample, PatientLabSampleType
|
|
383
|
+
|
|
384
|
+
if date is None:
|
|
385
|
+
date = timezone.now() # Use timezone.now() instead of datetime.now()
|
|
386
|
+
# Ensure the provided date is timezone-aware if it's not None
|
|
387
|
+
elif timezone.is_naive(date):
|
|
388
|
+
logger.warning(f"Received naive datetime {date} for PatientLabSample. Making it timezone-aware using current timezone.")
|
|
389
|
+
date = timezone.make_aware(date, timezone.get_current_timezone())
|
|
390
|
+
|
|
391
|
+
if isinstance(sample_type, str):
|
|
392
|
+
sample_type = PatientLabSampleType.objects.get(name=sample_type)
|
|
393
|
+
assert sample_type is not None, (
|
|
394
|
+
f"Sample type with name '{sample_type}' not found."
|
|
395
|
+
)
|
|
396
|
+
elif not isinstance(sample_type, PatientLabSampleType):
|
|
397
|
+
raise ValueError(
|
|
398
|
+
"Sample type must be either a string or a PatientLabSampleType object."
|
|
399
|
+
)
|
|
400
|
+
|
|
401
|
+
patient_lab_sample = PatientLabSample.objects.create(
|
|
402
|
+
patient=self, sample_type=sample_type, date=date
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
return patient_lab_sample
|
|
406
|
+
|
|
407
|
+
@property
|
|
408
|
+
def links(self) -> "RequirementLinks":
|
|
409
|
+
"""
|
|
410
|
+
Aggregates and returns all related model instances relevant for requirement evaluation
|
|
411
|
+
as a RequirementLinks object. For a Patient, this includes their diseases, associated classification choices,
|
|
412
|
+
all their lab values, and medication information.
|
|
413
|
+
"""
|
|
414
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
415
|
+
from endoreg_db.models.medical.disease import Disease, DiseaseClassificationChoice
|
|
416
|
+
|
|
417
|
+
# Imports for medication related models
|
|
418
|
+
from endoreg_db.models.medical.medication.medication import Medication
|
|
419
|
+
from endoreg_db.models.medical.medication.medication_indication import MedicationIndication
|
|
420
|
+
from endoreg_db.models.medical.medication.medication_intake_time import MedicationIntakeTime
|
|
421
|
+
# PatientMedication objects are retrieved via self.patientmedication_set
|
|
422
|
+
# PatientLabValue objects are retrieved via self.lab_values
|
|
423
|
+
|
|
424
|
+
patient_disease_instances = list(self.diseases.all()) # These are PatientDisease model instances
|
|
425
|
+
actual_diseases: List[Disease] = []
|
|
426
|
+
all_classification_choices: List[DiseaseClassificationChoice] = []
|
|
427
|
+
|
|
428
|
+
for pd_instance in patient_disease_instances:
|
|
429
|
+
if pd_instance.disease: # pd_instance.disease is a Disease instance
|
|
430
|
+
actual_diseases.append(pd_instance.disease)
|
|
431
|
+
all_classification_choices.extend(list(pd_instance.classification_choices.all()))
|
|
432
|
+
|
|
433
|
+
# Assuming self.lab_values is a related manager for PatientLabValue instances
|
|
434
|
+
patient_lab_value_instances = list(self.lab_values.all()) # These are PatientLabValue model instances
|
|
435
|
+
|
|
436
|
+
# Medication information
|
|
437
|
+
# self.patientmedication_set gives a QuerySet of PatientMedication
|
|
438
|
+
patient_medication_instances = list(self.patientmedication_set.all())
|
|
439
|
+
|
|
440
|
+
actual_medications: List[Medication] = []
|
|
441
|
+
med_indications: List[MedicationIndication] = []
|
|
442
|
+
med_intake_times: List[MedicationIntakeTime] = []
|
|
443
|
+
|
|
444
|
+
for pm_instance in patient_medication_instances:
|
|
445
|
+
if pm_instance.medication: # pm_instance.medication is a Medication instance
|
|
446
|
+
actual_medications.append(pm_instance.medication)
|
|
447
|
+
if pm_instance.medication_indication: # pm_instance.medication_indication is a MedicationIndication instance
|
|
448
|
+
med_indications.append(pm_instance.medication_indication)
|
|
449
|
+
med_intake_times.extend(list(pm_instance.intake_times.all())) # pm_instance.intake_times is a ManyRelatedManager for MedicationIntakeTime
|
|
450
|
+
|
|
451
|
+
return RequirementLinks(
|
|
452
|
+
diseases=list(set(actual_diseases)),
|
|
453
|
+
patient_diseases=patient_disease_instances,
|
|
454
|
+
disease_classification_choices=list(set(all_classification_choices)),
|
|
455
|
+
patient_lab_values=patient_lab_value_instances,
|
|
456
|
+
medications=list(set(actual_medications)),
|
|
457
|
+
patient_medications=patient_medication_instances,
|
|
458
|
+
medication_indications=list(set(med_indications)),
|
|
459
|
+
medication_intake_times=list(set(med_intake_times))
|
|
460
|
+
)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
from django.db import models
|
|
3
|
+
|
|
4
|
+
class Person(models.Model):
|
|
5
|
+
"""
|
|
6
|
+
Abstract base class for a person.
|
|
7
|
+
|
|
8
|
+
Attributes:
|
|
9
|
+
first_name (str): The first name of the person.
|
|
10
|
+
last_name (str): The last name of the person.
|
|
11
|
+
dob (date): The date of birth of the person.
|
|
12
|
+
gender (str): The gender of the person.
|
|
13
|
+
email (str): The email address of the person.
|
|
14
|
+
phone (str): The phone number of the person.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
first_name = models.CharField(max_length=255)
|
|
18
|
+
last_name = models.CharField(max_length=255)
|
|
19
|
+
dob = models.DateField("Date of Birth", blank=True, null=True)
|
|
20
|
+
gender = models.ForeignKey("Gender", on_delete=models.SET_NULL, null=True)
|
|
21
|
+
email = models.EmailField(max_length=255, blank=True, null=True)
|
|
22
|
+
phone = models.CharField(max_length=255, blank=True, null=True)
|
|
23
|
+
is_real_person = models.BooleanField(default=True)
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
def __str__(self):
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
class Meta:
|
|
30
|
+
abstract = True
|
|
31
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from endoreg_db.models import PortalUserInfo
|
|
6
|
+
|
|
7
|
+
class ProfessionManager(models.Manager):
|
|
8
|
+
def get_by_natural_key(self, name):
|
|
9
|
+
return self.get(name=name)
|
|
10
|
+
|
|
11
|
+
class Profession(models.Model):
|
|
12
|
+
objects = ProfessionManager()
|
|
13
|
+
name = models.CharField(max_length=100)
|
|
14
|
+
description = models.TextField(blank=True, null=True)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
portal_user_infos: models.QuerySet["PortalUserInfo"]
|
|
19
|
+
|
|
20
|
+
def __str__(self):
|
|
21
|
+
"""
|
|
22
|
+
Return the profession's name as its string representation.
|
|
23
|
+
"""
|
|
24
|
+
return str(self.name)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
# models.py in your main app
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ..profession import Profession
|
|
7
|
+
from endoreg_db.models import Examiner
|
|
8
|
+
from django.contrib.auth.models import User
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PortalUserInfo(models.Model):
|
|
12
|
+
user = models.OneToOneField("auth.User", on_delete=models.CASCADE)
|
|
13
|
+
profession = models.ForeignKey(
|
|
14
|
+
'endoreg_db.Profession',
|
|
15
|
+
on_delete=models.CASCADE,
|
|
16
|
+
blank=True,
|
|
17
|
+
null=True,
|
|
18
|
+
related_name="portal_user_infos",
|
|
19
|
+
)
|
|
20
|
+
works_in_endoscopy = models.BooleanField(blank=True, null=True)
|
|
21
|
+
# Add other fields as needed
|
|
22
|
+
|
|
23
|
+
examiner = models.OneToOneField(
|
|
24
|
+
"endoreg_db.Examiner",
|
|
25
|
+
on_delete=models.CASCADE,
|
|
26
|
+
blank=True,
|
|
27
|
+
null=True,
|
|
28
|
+
related_name="portal_user_info",
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
user: "User"
|
|
33
|
+
profession: "Profession"
|
|
34
|
+
examiner: "Examiner"
|
|
35
|
+
|
|
36
|
+
def __str__(self):
|
|
37
|
+
return self.user.username
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'''Module for product models'''
|
|
2
|
+
from .product import Product
|
|
3
|
+
from .product_material import ProductMaterial
|
|
4
|
+
from .product_group import ProductGroup
|
|
5
|
+
from .reference_product import ReferenceProduct
|
|
6
|
+
from .product_weight import ProductWeight
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
'Product',
|
|
10
|
+
'ProductMaterial',
|
|
11
|
+
'ProductGroup',
|
|
12
|
+
'ReferenceProduct',
|
|
13
|
+
'ProductWeight',
|
|
14
|
+
]
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
from endoreg_db.utils.product.sum_emissions import sum_emissions
|
|
5
|
+
from endoreg_db.utils.product.sum_weights import sum_weights
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from ...other.transport_route import TransportRoute
|
|
9
|
+
from .product_group import ProductGroup
|
|
10
|
+
from .reference_product import ReferenceProduct
|
|
11
|
+
from .product_material import ProductMaterial
|
|
12
|
+
# from .product_weight import ProductWeight
|
|
13
|
+
|
|
14
|
+
class ProductManager(models.Manager):
|
|
15
|
+
def get_by_natural_key(self, name):
|
|
16
|
+
return self.get(name=name)
|
|
17
|
+
|
|
18
|
+
class Product(models.Model):
|
|
19
|
+
objects = ProductManager()
|
|
20
|
+
|
|
21
|
+
name = models.CharField(max_length=255)
|
|
22
|
+
|
|
23
|
+
transport_route = models.ForeignKey("TransportRoute", on_delete=models.SET_NULL, null=True)
|
|
24
|
+
product_group = models.ForeignKey(
|
|
25
|
+
"ProductGroup",
|
|
26
|
+
on_delete=models.SET_NULL,
|
|
27
|
+
null=True,
|
|
28
|
+
related_name="products",
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
transport_route: "TransportRoute"
|
|
33
|
+
product_group: "ProductGroup"
|
|
34
|
+
reference_products: models.QuerySet["ReferenceProduct"]
|
|
35
|
+
product_product_materials: models.QuerySet["ProductMaterial"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def natural_key(self):
|
|
39
|
+
return (self.name,)
|
|
40
|
+
|
|
41
|
+
def __str__(self):
|
|
42
|
+
result = f"{self.name}"
|
|
43
|
+
if self.product_group:
|
|
44
|
+
result += f" ({self.product_group}, "
|
|
45
|
+
else:
|
|
46
|
+
result += " (no product group, "
|
|
47
|
+
|
|
48
|
+
if self.transport_route:
|
|
49
|
+
result += f"{self.transport_route})"
|
|
50
|
+
else:
|
|
51
|
+
result += "no transport route)"
|
|
52
|
+
|
|
53
|
+
return result
|
|
54
|
+
|
|
55
|
+
def _calculate_material_metric(self, component: str, calculation_func):
|
|
56
|
+
"""Helper method to calculate weight or emission for materials of a specific component."""
|
|
57
|
+
from .product_material import ProductMaterial # Import locally to avoid circular dependency issues at module level
|
|
58
|
+
materials = ProductMaterial.objects.filter(product=self, component=component)
|
|
59
|
+
return calculation_func(materials)
|
|
60
|
+
|
|
61
|
+
def get_product_weight(self):
|
|
62
|
+
"""Get the product weight, prioritizing material definitions."""
|
|
63
|
+
from .product_material import ProductMaterial
|
|
64
|
+
# Check if there are specific material definitions for the product component
|
|
65
|
+
if ProductMaterial.objects.filter(product=self, component="product").exists():
|
|
66
|
+
return self.get_product_material_weight()
|
|
67
|
+
|
|
68
|
+
# Fallback: check if there is a direct product weight defined (Not implemented yet)
|
|
69
|
+
# TODO: Implement logic for ProductWeight lookup
|
|
70
|
+
return None # Or appropriate default/error
|
|
71
|
+
|
|
72
|
+
def get_package_weight(self):
|
|
73
|
+
"""Get the package weight, prioritizing material definitions."""
|
|
74
|
+
from .product_material import ProductMaterial
|
|
75
|
+
# Check if there are specific material definitions for the package component
|
|
76
|
+
if ProductMaterial.objects.filter(product=self, component="package").exists():
|
|
77
|
+
return self.get_package_material_weight()
|
|
78
|
+
|
|
79
|
+
# Fallback: check if there is a direct package weight defined (Not implemented yet)
|
|
80
|
+
# TODO: Implement logic for PackageWeight lookup (if different from ProductWeight)
|
|
81
|
+
return None # Or appropriate default/error
|
|
82
|
+
|
|
83
|
+
def get_product_material_weight(self):
|
|
84
|
+
"""Calculate the total weight based on defined product materials."""
|
|
85
|
+
return self._calculate_material_metric("product", sum_weights)
|
|
86
|
+
|
|
87
|
+
def get_package_material_weight(self):
|
|
88
|
+
"""Calculate the total weight based on defined package materials."""
|
|
89
|
+
return self._calculate_material_metric("package", sum_weights)
|
|
90
|
+
|
|
91
|
+
def get_product_material_emission(self):
|
|
92
|
+
"""Calculate the total emissions based on defined product materials."""
|
|
93
|
+
return self._calculate_material_metric("product", sum_emissions)
|
|
94
|
+
|
|
95
|
+
def get_package_material_emission(self):
|
|
96
|
+
"""Calculate the total emissions based on defined package materials."""
|
|
97
|
+
return self._calculate_material_metric("package", sum_emissions)
|