endoreg-db 0.8.9.32__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/_version.py +34 -0
- endoreg_db/admin.py +97 -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 +17 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/authz/auth.py +78 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +20 -0
- endoreg_db/authz/middleware.py +84 -0
- endoreg_db/authz/permissions.py +138 -0
- endoreg_db/authz/policy.py +224 -0
- endoreg_db/authz/settings.py +64 -0
- endoreg_db/authz/views_auth.py +70 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +99 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +106 -0
- endoreg_db/config/settings/__init__.py +6 -0
- endoreg_db/config/settings/base.py +148 -0
- endoreg_db/config/settings/case_gen.py +32 -0
- endoreg_db/config/settings/dev.py +108 -0
- endoreg_db/config/settings/keycloak.py +177 -0
- endoreg_db/config/settings/prod.py +66 -0
- endoreg_db/config/settings/test.py +72 -0
- endoreg_db/data/__init__.py +135 -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 +99 -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/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +172 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +5 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +359 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +90 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +97 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/00_generic.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_baseline.yaml +23 -0
- endoreg_db/data/finding_classification_choice/00_generic_complication.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_histology.yaml +21 -0
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_bowel_preparation.yaml +49 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_generic.yaml +19 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_histology.yaml +20 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_location.yaml +248 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_morphology.yaml +75 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/00_generic.yaml +53 -0
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_type/data.yaml +39 -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/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement/old/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/old/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/old/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/old/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/old/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/old/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/old/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/old/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/old/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/old/gender.yaml +0 -0
- endoreg_db/data/requirement/old/lab_value.yaml +441 -0
- endoreg_db/data/requirement/old/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/_old/age.yaml +13 -0
- endoreg_db/data/requirement_operator/_old/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/_old/model_operators.yaml +96 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +65 -0
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set_type/data.yaml +41 -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 +32 -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 +24 -0
- endoreg_db/export/frames/export.py +6 -0
- endoreg_db/export/frames/export_frames_with_labels.py +616 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +4 -0
- endoreg_db/forms/examination_form.py +12 -0
- endoreg_db/forms/patient_finding_intervention_form.py +40 -0
- endoreg_db/forms/patient_form.py +23 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +11 -0
- endoreg_db/forms/unit.py +7 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +48 -0
- endoreg_db/helpers/data_loader.py +280 -0
- endoreg_db/helpers/default_objects.py +414 -0
- endoreg_db/helpers/download_segmentation_model.py +32 -0
- endoreg_db/helpers/interact.py +1 -0
- endoreg_db/helpers/test_video_helper.py +127 -0
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +83 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +42 -0
- endoreg_db/import_files/context/validate_directories.py +57 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +99 -0
- endoreg_db/import_files/file_storage/create_video_file.py +104 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +42 -0
- endoreg_db/import_files/file_storage/state_management.py +463 -0
- endoreg_db/import_files/file_storage/storage.py +42 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +99 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/pseudonymization/__init__.py +0 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +181 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +139 -0
- endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
- endoreg_db/import_files/report_import_service.py +147 -0
- endoreg_db/import_files/video_import_service.py +154 -0
- endoreg_db/logger_conf.py +156 -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 +132 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +177 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +419 -0
- endoreg_db/management/commands/export_frame_annot.py +196 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +206 -0
- endoreg_db/management/commands/fix_video_paths.py +186 -0
- endoreg_db/management/commands/import_report.py +361 -0
- endoreg_db/management/commands/list_routes.py +20 -0
- endoreg_db/management/commands/load_ai_model_data.py +83 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +60 -0
- endoreg_db/management/commands/load_base_db_data.py +63 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +39 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +38 -0
- endoreg_db/management/commands/load_disease_classification_data.py +38 -0
- endoreg_db/management/commands/load_disease_data.py +59 -0
- endoreg_db/management/commands/load_distribution_data.py +63 -0
- endoreg_db/management/commands/load_endoscope_data.py +58 -0
- endoreg_db/management/commands/load_event_data.py +39 -0
- endoreg_db/management/commands/load_examination_data.py +78 -0
- endoreg_db/management/commands/load_examination_indication_data.py +85 -0
- endoreg_db/management/commands/load_finding_data.py +115 -0
- endoreg_db/management/commands/load_gender_data.py +37 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +142 -0
- endoreg_db/management/commands/load_information_source.py +46 -0
- endoreg_db/management/commands/load_lab_value_data.py +52 -0
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_medication_data.py +104 -0
- endoreg_db/management/commands/load_name_data.py +36 -0
- endoreg_db/management/commands/load_organ_data.py +39 -0
- endoreg_db/management/commands/load_pdf_type_data.py +58 -0
- endoreg_db/management/commands/load_profession_data.py +40 -0
- endoreg_db/management/commands/load_qualification_data.py +56 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +40 -0
- endoreg_db/management/commands/load_requirement_data.py +207 -0
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +57 -0
- endoreg_db/management/commands/load_shift_data.py +57 -0
- endoreg_db/management/commands/load_tag_data.py +54 -0
- endoreg_db/management/commands/load_unit_data.py +40 -0
- endoreg_db/management/commands/load_user_groups.py +26 -0
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +70 -0
- endoreg_db/management/commands/setup_endoreg_db.py +459 -0
- endoreg_db/management/commands/start_filewatcher.py +115 -0
- endoreg_db/management/commands/storage_management.py +622 -0
- endoreg_db/management/commands/summarize_db_content.py +280 -0
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +189 -0
- endoreg_db/management/commands/video_validation.py +20 -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 +1953 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +322 -0
- endoreg_db/models/administration/__init__.py +95 -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 +180 -0
- endoreg_db/models/administration/ai/model_type.py +42 -0
- endoreg_db/models/administration/case/__init__.py +5 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +3 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +85 -0
- endoreg_db/models/administration/center/center_product.py +67 -0
- endoreg_db/models/administration/center/center_resource.py +69 -0
- endoreg_db/models/administration/center/center_shift.py +94 -0
- endoreg_db/models/administration/center/center_waste.py +42 -0
- endoreg_db/models/administration/person/__init__.py +26 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +40 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +44 -0
- endoreg_db/models/administration/person/employee/employee_type.py +50 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +64 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +20 -0
- endoreg_db/models/administration/person/names/last_name.py +20 -0
- endoreg_db/models/administration/person/patient/__init__.py +7 -0
- endoreg_db/models/administration/person/patient/patient.py +488 -0
- endoreg_db/models/administration/person/patient/patient_external_id.py +36 -0
- endoreg_db/models/administration/person/person.py +35 -0
- endoreg_db/models/administration/person/profession/__init__.py +28 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +41 -0
- endoreg_db/models/administration/product/__init__.py +15 -0
- endoreg_db/models/administration/product/product.py +106 -0
- endoreg_db/models/administration/product/product_group.py +41 -0
- endoreg_db/models/administration/product/product_material.py +60 -0
- endoreg_db/models/administration/product/product_weight.py +51 -0
- endoreg_db/models/administration/product/reference_product.py +147 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +43 -0
- endoreg_db/models/administration/qualification/qualification_type.py +39 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +72 -0
- endoreg_db/models/administration/shift/shift.py +57 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +23 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +85 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +61 -0
- endoreg_db/models/label/label.py +91 -0
- endoreg_db/models/label/label_set.py +68 -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 +42 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +611 -0
- endoreg_db/models/label/video_segmentation_label.py +35 -0
- endoreg_db/models/label/video_segmentation_labelset.py +28 -0
- endoreg_db/models/media/__init__.py +23 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +137 -0
- endoreg_db/models/media/pdf/__init__.py +12 -0
- endoreg_db/models/media/pdf/raw_pdf.py +764 -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 +85 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +46 -0
- endoreg_db/models/media/video/__init__.py +9 -0
- endoreg_db/models/media/video/create_from_file.py +402 -0
- endoreg_db/models/media/video/pipe_1.py +258 -0
- endoreg_db/models/media/video/pipe_2.py +129 -0
- endoreg_db/models/media/video/video_file.py +907 -0
- endoreg_db/models/media/video/video_file_ai.py +828 -0
- endoreg_db/models/media/video/video_file_anonymize.py +524 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +49 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +25 -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 +126 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +233 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +36 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +13 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +24 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +40 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +44 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +30 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +205 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +228 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +107 -0
- endoreg_db/models/media/video/video_file_io.py +272 -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 +58 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +62 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +183 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +198 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +178 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +105 -0
- endoreg_db/models/media/video/video_file_segments.py +317 -0
- endoreg_db/models/media/video/video_metadata.py +67 -0
- endoreg_db/models/media/video/video_processing.py +192 -0
- endoreg_db/models/medical/__init__.py +136 -0
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +29 -0
- endoreg_db/models/medical/disease.py +174 -0
- endoreg_db/models/medical/event.py +154 -0
- endoreg_db/models/medical/examination/__init__.py +20 -0
- endoreg_db/models/medical/examination/examination.py +183 -0
- endoreg_db/models/medical/examination/examination_indication.py +229 -0
- endoreg_db/models/medical/examination/examination_time.py +68 -0
- endoreg_db/models/medical/examination/examination_time_type.py +44 -0
- endoreg_db/models/medical/examination/examination_type.py +47 -0
- endoreg_db/models/medical/finding/__init__.py +20 -0
- endoreg_db/models/medical/finding/finding.py +113 -0
- endoreg_db/models/medical/finding/finding_classification.py +131 -0
- endoreg_db/models/medical/finding/finding_intervention.py +68 -0
- endoreg_db/models/medical/finding/finding_type.py +38 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +77 -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 +490 -0
- endoreg_db/models/medical/medication/__init__.py +23 -0
- endoreg_db/models/medical/medication/medication.py +45 -0
- endoreg_db/models/medical/medication/medication_indication.py +78 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +58 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +58 -0
- endoreg_db/models/medical/medication/medication_schedule.py +58 -0
- endoreg_db/models/medical/organ/__init__.py +38 -0
- endoreg_db/models/medical/patient/__init__.py +48 -0
- endoreg_db/models/medical/patient/medication_examples.py +56 -0
- endoreg_db/models/medical/patient/patient_disease.py +72 -0
- endoreg_db/models/medical/patient/patient_event.py +80 -0
- endoreg_db/models/medical/patient/patient_examination.py +280 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +57 -0
- endoreg_db/models/medical/patient/patient_finding.py +416 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +231 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +37 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +157 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +247 -0
- endoreg_db/models/medical/patient/patient_medication.py +111 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +152 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +73 -0
- endoreg_db/models/medical/risk/risk_type.py +54 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/model_meta.py +266 -0
- endoreg_db/models/metadata/model_meta_logic.py +485 -0
- endoreg_db/models/metadata/pdf_meta.py +96 -0
- endoreg_db/models/metadata/sensitive_meta.py +345 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1161 -0
- endoreg_db/models/metadata/video_meta.py +459 -0
- endoreg_db/models/metadata/video_prediction_logic.py +232 -0
- endoreg_db/models/metadata/video_prediction_meta.py +319 -0
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +46 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +22 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +163 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +50 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +211 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +23 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +110 -0
- endoreg_db/models/other/gender.py +32 -0
- endoreg_db/models/other/information_source.py +190 -0
- endoreg_db/models/other/material.py +34 -0
- endoreg_db/models/other/resource.py +24 -0
- endoreg_db/models/other/tag.py +32 -0
- endoreg_db/models/other/transport_route.py +40 -0
- endoreg_db/models/other/unit.py +40 -0
- endoreg_db/models/other/waste.py +28 -0
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +5 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +792 -0
- endoreg_db/models/requirement/requirement_error.py +84 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +137 -0
- endoreg_db/models/requirement/requirement_operator.py +187 -0
- endoreg_db/models/requirement/requirement_set.py +327 -0
- endoreg_db/models/state/__init__.py +13 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/anonymization.py +30 -0
- endoreg_db/models/state/audit_ledger.py +155 -0
- endoreg_db/models/state/label_video_segment.py +31 -0
- endoreg_db/models/state/processing_history/__init__.py +3 -0
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +219 -0
- endoreg_db/models/state/sensitive_meta.py +50 -0
- endoreg_db/models/state/video.py +251 -0
- endoreg_db/models/upload_job.py +100 -0
- endoreg_db/models/utils.py +138 -0
- endoreg_db/queries/__init__.py +3 -0
- endoreg_db/queries/annotations/__init__.py +1 -0
- endoreg_db/queries/annotations/legacy.py +169 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/root_urls.py +27 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +30 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +861 -0
- endoreg_db/serializers/__init__.py +104 -0
- endoreg_db/serializers/administration/__init__.py +13 -0
- endoreg_db/serializers/administration/ai/__init__.py +9 -0
- endoreg_db/serializers/administration/ai/active_model.py +12 -0
- endoreg_db/serializers/administration/ai/ai_model.py +20 -0
- endoreg_db/serializers/administration/ai/model_type.py +12 -0
- endoreg_db/serializers/administration/center.py +14 -0
- endoreg_db/serializers/administration/gender.py +11 -0
- endoreg_db/serializers/anonymization.py +77 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +45 -0
- endoreg_db/serializers/examination/dropdown.py +20 -0
- endoreg_db/serializers/examination_serializer.py +9 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +61 -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 +11 -0
- endoreg_db/serializers/label_video_segment/__init__.py +9 -0
- endoreg_db/serializers/label_video_segment/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/label_video_segment/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +427 -0
- endoreg_db/serializers/meta/__init__.py +13 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +122 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +153 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +62 -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 +72 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +144 -0
- endoreg_db/serializers/misc/stats.py +35 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +74 -0
- endoreg_db/serializers/patient/__init__.py +12 -0
- endoreg_db/serializers/patient/patient.py +103 -0
- endoreg_db/serializers/patient/patient_dropdown.py +35 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +168 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +32 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +47 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +62 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +28 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +40 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +135 -0
- endoreg_db/serializers/pdf/__init__.py +3 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +101 -0
- endoreg_db/serializers/requirements/requirement_schema.py +20 -0
- endoreg_db/serializers/requirements/requirement_sets.py +99 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +301 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/video_file.py +283 -0
- endoreg_db/serializers/video/video_file_brief.py +14 -0
- endoreg_db/serializers/video/video_file_detail.py +96 -0
- endoreg_db/serializers/video/video_file_list.py +100 -0
- endoreg_db/serializers/video/video_processing_history.py +172 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +274 -0
- endoreg_db/services/examination_evaluation.py +172 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +424 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/pdf_import.py +0 -0
- endoreg_db/services/polling_coordinator.py +319 -0
- endoreg_db/services/pseudonym_service.py +94 -0
- endoreg_db/services/report_import.py +13 -0
- endoreg_db/services/segment_sync.py +171 -0
- endoreg_db/services/video_import.py +9 -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 +56 -0
- endoreg_db/urls/ai.py +14 -0
- endoreg_db/urls/anonymization.py +78 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +34 -0
- endoreg_db/urls/examination.py +63 -0
- endoreg_db/urls/media.py +251 -0
- endoreg_db/urls/patient.py +23 -0
- endoreg_db/urls/requirements.py +15 -0
- endoreg_db/urls/root_urls.py +28 -0
- endoreg_db/urls/stats.py +54 -0
- endoreg_db/urls/upload.py +12 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +97 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
- endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
- endoreg_db/utils/ai/get.py +6 -0
- endoreg_db/utils/ai/inference_dataset.py +51 -0
- endoreg_db/utils/ai/model_training/config.py +117 -0
- endoreg_db/utils/ai/model_training/dataset.py +74 -0
- endoreg_db/utils/ai/model_training/losses.py +68 -0
- endoreg_db/utils/ai/model_training/metrics.py +78 -0
- endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
- endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
- endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +270 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +293 -0
- endoreg_db/utils/ai/preprocess.py +76 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +32 -0
- endoreg_db/utils/check_video_files.py +175 -0
- endoreg_db/utils/cropping.py +30 -0
- endoreg_db/utils/dataloader.py +285 -0
- endoreg_db/utils/dates.py +59 -0
- endoreg_db/utils/defaults/set_default_center.py +33 -0
- endoreg_db/utils/env.py +37 -0
- endoreg_db/utils/extract_specific_frames.py +87 -0
- endoreg_db/utils/file_operations.py +70 -0
- endoreg_db/utils/fix_video_path_direct.py +157 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +138 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +237 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +82 -0
- endoreg_db/utils/ocr.py +195 -0
- endoreg_db/utils/operation_log.py +87 -0
- endoreg_db/utils/parse_and_generate_yaml.py +45 -0
- endoreg_db/utils/paths.py +159 -0
- endoreg_db/utils/permissions.py +160 -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 +144 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +22 -0
- endoreg_db/utils/product/sum_weights.py +20 -0
- endoreg_db/utils/pydantic_models/__init__.py +5 -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/_old/lab_value_operators.py +678 -0
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +842 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +114 -0
- endoreg_db/utils/setup_config.py +196 -0
- endoreg_db/utils/storage.py +117 -0
- endoreg_db/utils/translation.py +31 -0
- endoreg_db/utils/uuid.py +5 -0
- endoreg_db/utils/validate_endo_roi.py +33 -0
- endoreg_db/utils/validate_subcategory_dict.py +93 -0
- endoreg_db/utils/validate_video_detailed.py +415 -0
- endoreg_db/utils/video/__init__.py +30 -0
- endoreg_db/utils/video/extract_frames.py +100 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +996 -0
- endoreg_db/utils/video/names.py +47 -0
- endoreg_db/utils/video/streaming_processor.py +386 -0
- endoreg_db/utils/video/video_splitter.py +105 -0
- endoreg_db/versioning.md +79 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +247 -0
- endoreg_db/views/__init__.py +157 -0
- endoreg_db/views/anonymization/__init__.py +31 -0
- endoreg_db/views/anonymization/media_management.py +486 -0
- endoreg_db/views/anonymization/overview.py +307 -0
- endoreg_db/views/anonymization/validate.py +310 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +146 -0
- endoreg_db/views/examination/__init__.py +30 -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 +62 -0
- endoreg_db/views/examination/get_finding_classifications.py +38 -0
- endoreg_db/views/examination/get_findings.py +39 -0
- endoreg_db/views/examination/get_instruments.py +19 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +116 -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 +41 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +54 -0
- endoreg_db/views/media/__init__.py +32 -0
- endoreg_db/views/media/pdf_media.py +411 -0
- endoreg_db/views/media/sensitive_metadata.py +372 -0
- endoreg_db/views/media/video_media.py +275 -0
- endoreg_db/views/meta/__init__.py +7 -0
- endoreg_db/views/meta/sensitive_meta_list.py +102 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +74 -0
- endoreg_db/views/misc/__init__.py +29 -0
- endoreg_db/views/misc/center.py +14 -0
- endoreg_db/views/misc/csrf.py +8 -0
- endoreg_db/views/misc/gender.py +15 -0
- endoreg_db/views/misc/stats.py +255 -0
- endoreg_db/views/misc/upload_views.py +241 -0
- endoreg_db/views/patient/__init__.py +3 -0
- endoreg_db/views/patient/patient.py +253 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +141 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +58 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +72 -0
- endoreg_db/views/patient_examination/video.py +228 -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 +71 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +291 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +75 -0
- endoreg_db/views/report/__init__.py +7 -0
- endoreg_db/views/report/reimport.py +177 -0
- endoreg_db/views/report/report_stream.py +191 -0
- endoreg_db/views/requirement/__init__.py +11 -0
- endoreg_db/views/requirement/evaluate.py +278 -0
- endoreg_db/views/requirement/lookup.py +380 -0
- endoreg_db/views/requirement/lookup_store.py +183 -0
- endoreg_db/views/requirement/requirement_utils.py +87 -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 +266 -0
- endoreg_db/views/video/__init__.py +49 -0
- endoreg_db/views/video/ai/__init__.py +8 -0
- endoreg_db/views/video/ai/label.py +159 -0
- endoreg_db/views/video/correction.py +529 -0
- endoreg_db/views/video/reimport.py +230 -0
- endoreg_db/views/video/segments_crud.py +709 -0
- endoreg_db/views/video/video_apply_mask.py +49 -0
- endoreg_db/views/video/video_correction.py +22 -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_metadata.py +101 -0
- endoreg_db/views/video/video_processing_history.py +25 -0
- endoreg_db/views/video/video_remove_frames.py +49 -0
- endoreg_db/views/video/video_stream.py +334 -0
- endoreg_db-0.8.9.32.dist-info/METADATA +404 -0
- endoreg_db-0.8.9.32.dist-info/RECORD +787 -0
- endoreg_db-0.8.9.32.dist-info/WHEEL +4 -0
- endoreg_db-0.8.9.32.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
from endoreg_db.utils import create_mock_examiner_name, get_examiner_hash
|
|
6
|
+
|
|
7
|
+
from ....utils import DJANGO_NAME_SALT
|
|
8
|
+
from ..person import Person
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from endoreg_db.models import administration
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Examiner(Person):
|
|
15
|
+
center = models.ForeignKey(
|
|
16
|
+
"Center", on_delete=models.CASCADE, blank=True, null=True
|
|
17
|
+
)
|
|
18
|
+
hash = models.CharField(max_length=255, unique=True)
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
center: models.ForeignKey["administration.Center|None"]
|
|
22
|
+
portal_user_info: models.OneToOneField["administration.PortalUserInfo"]
|
|
23
|
+
|
|
24
|
+
def __str__(self):
|
|
25
|
+
return self.first_name + " " + self.last_name
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def custom_get_or_create(
|
|
29
|
+
cls,
|
|
30
|
+
first_name: str,
|
|
31
|
+
last_name: str,
|
|
32
|
+
center: "administration.Center",
|
|
33
|
+
substitute_names: bool = True,
|
|
34
|
+
):
|
|
35
|
+
from endoreg_db.models import (
|
|
36
|
+
FirstName,
|
|
37
|
+
LastName,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
if isinstance(first_name, FirstName):
|
|
41
|
+
first_name = str(first_name.name)
|
|
42
|
+
|
|
43
|
+
if isinstance(last_name, LastName):
|
|
44
|
+
last_name = str(last_name.name)
|
|
45
|
+
|
|
46
|
+
real_hash = get_examiner_hash(
|
|
47
|
+
first_name=first_name,
|
|
48
|
+
last_name=last_name,
|
|
49
|
+
center_name=center.name,
|
|
50
|
+
salt=DJANGO_NAME_SALT,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
if substitute_names:
|
|
54
|
+
name_tuple = create_mock_examiner_name()
|
|
55
|
+
|
|
56
|
+
else:
|
|
57
|
+
name_tuple = (first_name, last_name)
|
|
58
|
+
defaults = dict(
|
|
59
|
+
first_name=name_tuple[0],
|
|
60
|
+
last_name=name_tuple[1],
|
|
61
|
+
center=center,
|
|
62
|
+
)
|
|
63
|
+
examiner, created = cls.objects.get_or_create(hash=real_hash, defaults=defaults)
|
|
64
|
+
return examiner, created
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# class to represent unique first-names
|
|
2
|
+
# name attribute is natural key
|
|
3
|
+
|
|
4
|
+
from django.db import models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class FirstNameManager(models.Manager):
|
|
8
|
+
def get_by_natural_key(self, name):
|
|
9
|
+
return self.get(name=name)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class FirstName(models.Model):
|
|
13
|
+
objects = FirstNameManager()
|
|
14
|
+
name = models.CharField(max_length=255, unique=True)
|
|
15
|
+
|
|
16
|
+
def natural_key(self):
|
|
17
|
+
return (self.name,)
|
|
18
|
+
|
|
19
|
+
def __str__(self):
|
|
20
|
+
return str(self.name)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class LastNameManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class LastName(models.Model):
|
|
10
|
+
objects = LastNameManager()
|
|
11
|
+
name = models.CharField(max_length=255, unique=True)
|
|
12
|
+
|
|
13
|
+
def natural_key(self):
|
|
14
|
+
return (self.name,)
|
|
15
|
+
|
|
16
|
+
def __str__(self):
|
|
17
|
+
return str(self.name)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# Path: endoreg_db/models/persons/first_name.py
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import random
|
|
3
|
+
from datetime import date, datetime
|
|
4
|
+
from typing import TYPE_CHECKING, List, Optional # Added List
|
|
5
|
+
|
|
6
|
+
from django.db import models
|
|
7
|
+
from django.utils import timezone # Add this import
|
|
8
|
+
from faker import Faker
|
|
9
|
+
|
|
10
|
+
from ..person import Person
|
|
11
|
+
|
|
12
|
+
# Import RequirementLinks and Disease for the links property
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger("patient")
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from endoreg_db.models import (
|
|
18
|
+
AnonymExaminationReport,
|
|
19
|
+
AnonymHistologyReport,
|
|
20
|
+
Center,
|
|
21
|
+
Gender,
|
|
22
|
+
PatientDisease,
|
|
23
|
+
PatientEvent,
|
|
24
|
+
PatientExamination,
|
|
25
|
+
PatientExternalID,
|
|
26
|
+
PatientLabValue,
|
|
27
|
+
PatientMedication,
|
|
28
|
+
RawPdfFile,
|
|
29
|
+
)
|
|
30
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
31
|
+
|
|
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
|
+
first_name = models.CharField(max_length=100)
|
|
48
|
+
last_name = models.CharField(max_length=100)
|
|
49
|
+
dob = models.DateField(null=True, blank=True)
|
|
50
|
+
gender = models.ForeignKey(
|
|
51
|
+
"Gender", on_delete=models.SET_NULL, null=True, blank=True
|
|
52
|
+
)
|
|
53
|
+
center = models.ForeignKey(
|
|
54
|
+
"Center", on_delete=models.SET_NULL, null=True, blank=True
|
|
55
|
+
)
|
|
56
|
+
patient_hash = models.CharField(max_length=255, blank=True, null=True)
|
|
57
|
+
|
|
58
|
+
objects = models.Manager() # Default manager
|
|
59
|
+
|
|
60
|
+
if TYPE_CHECKING:
|
|
61
|
+
from django.db.models.manager import RelatedManager
|
|
62
|
+
|
|
63
|
+
first_name: models.CharField[str]
|
|
64
|
+
last_name: models.CharField[str]
|
|
65
|
+
dob: models.DateField[date | None]
|
|
66
|
+
gender: models.ForeignKey["Gender | None"]
|
|
67
|
+
center: models.ForeignKey["Center | None"]
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def events(self) -> RelatedManager[PatientEvent]: ...
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def diseases(self) -> RelatedManager[PatientDisease]: ...
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def patient_examinations(self) -> RelatedManager[PatientExamination]: ...
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def anonymexaminationreport_set(
|
|
80
|
+
self,
|
|
81
|
+
) -> RelatedManager[AnonymExaminationReport]: ...
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def anonymhistologyreport_set(
|
|
85
|
+
self,
|
|
86
|
+
) -> RelatedManager[AnonymHistologyReport]: ...
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def external_ids(self) -> RelatedManager[PatientExternalID]: ...
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def patientmedication_set(self) -> RelatedManager[PatientMedication]: ...
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def lab_values(self) -> RelatedManager[PatientLabValue]: ...
|
|
96
|
+
|
|
97
|
+
def __str__(self):
|
|
98
|
+
return f"{self.first_name} {self.last_name} ({self.dob})"
|
|
99
|
+
|
|
100
|
+
@classmethod
|
|
101
|
+
def get_or_create_pseudo_patient_by_hash(
|
|
102
|
+
cls,
|
|
103
|
+
patient_hash: str,
|
|
104
|
+
center: Optional["Center"] = None,
|
|
105
|
+
gender: Optional["Gender | str"] = None, # Allow string type hint
|
|
106
|
+
birth_month: Optional[int] = None,
|
|
107
|
+
birth_year: Optional[int] = None,
|
|
108
|
+
):
|
|
109
|
+
from endoreg_db.utils import create_mock_patient_name, random_day_by_year
|
|
110
|
+
|
|
111
|
+
from ....other import Gender # Import Gender model
|
|
112
|
+
|
|
113
|
+
created = False
|
|
114
|
+
|
|
115
|
+
existing_patient = cls.objects.filter(patient_hash=patient_hash).first()
|
|
116
|
+
if existing_patient:
|
|
117
|
+
logger.info(f"Patient with hash {patient_hash} already exists")
|
|
118
|
+
logger.info(f"Returning existing patient: {existing_patient}")
|
|
119
|
+
return existing_patient, created
|
|
120
|
+
|
|
121
|
+
# If no patient with the given hash exists, create a new pseudo patient
|
|
122
|
+
assert center, "Center must be provided to create a new pseudo patient"
|
|
123
|
+
assert gender, "Gender must be provided to create a new pseudo patient"
|
|
124
|
+
assert birth_month, (
|
|
125
|
+
"Birth month must be provided to create a new pseudo patient"
|
|
126
|
+
)
|
|
127
|
+
assert birth_year, "Birth year must be provided to create a new pseudo patient"
|
|
128
|
+
|
|
129
|
+
# Ensure gender is a Gender object
|
|
130
|
+
if isinstance(gender, str):
|
|
131
|
+
gender_obj = Gender.objects.get(name=gender)
|
|
132
|
+
elif isinstance(gender, Gender):
|
|
133
|
+
gender_obj = gender
|
|
134
|
+
else:
|
|
135
|
+
raise ValueError("Gender must be a string name or a Gender object.")
|
|
136
|
+
|
|
137
|
+
pseudo_dob = random_day_by_year(birth_year)
|
|
138
|
+
gender_name = gender_obj.name
|
|
139
|
+
first_name, last_name = create_mock_patient_name(gender_name)
|
|
140
|
+
|
|
141
|
+
logger.info(f"Creating pseudo patient with hash {patient_hash}")
|
|
142
|
+
logger.info(f"Generated name: {first_name} {last_name}")
|
|
143
|
+
|
|
144
|
+
patient = cls.objects.create(
|
|
145
|
+
first_name=first_name,
|
|
146
|
+
last_name=last_name,
|
|
147
|
+
dob=pseudo_dob,
|
|
148
|
+
gender=gender_obj, # Use the fetched/validated Gender object
|
|
149
|
+
patient_hash=patient_hash,
|
|
150
|
+
is_real_person=False,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
patient.save()
|
|
154
|
+
created = True
|
|
155
|
+
|
|
156
|
+
return patient, created
|
|
157
|
+
|
|
158
|
+
def get_dob(self) -> date | None:
|
|
159
|
+
return self.dob
|
|
160
|
+
|
|
161
|
+
def get_patient_examinations(self): # field: self.patient_examinations
|
|
162
|
+
"""Returns all patient examinations for this patient ordered by date (most recent is first)."""
|
|
163
|
+
return self.patient_examinations.order_by("-date_start")
|
|
164
|
+
|
|
165
|
+
def create_examination(
|
|
166
|
+
self,
|
|
167
|
+
examination_name_str: Optional[str] = None,
|
|
168
|
+
date_start: Optional[datetime] = None,
|
|
169
|
+
date_end: Optional[datetime] = None,
|
|
170
|
+
save: bool = True,
|
|
171
|
+
) -> "PatientExamination":
|
|
172
|
+
"""Creates a patient examination for this patient."""
|
|
173
|
+
from ....medical import Examination, PatientExamination
|
|
174
|
+
|
|
175
|
+
if examination_name_str:
|
|
176
|
+
examination = Examination.objects.get(name=examination_name_str)
|
|
177
|
+
patient_examination = PatientExamination(
|
|
178
|
+
patient=self,
|
|
179
|
+
examination=examination,
|
|
180
|
+
date_start=date_start,
|
|
181
|
+
date_end=date_end,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
else:
|
|
185
|
+
patient_examination = PatientExamination(
|
|
186
|
+
patient=self, date_start=date_start, date_end=date_end
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
if save:
|
|
190
|
+
patient_examination.save()
|
|
191
|
+
|
|
192
|
+
return patient_examination
|
|
193
|
+
|
|
194
|
+
def create_event(
|
|
195
|
+
self,
|
|
196
|
+
event_name_str: str,
|
|
197
|
+
date_start: Optional[datetime] = None,
|
|
198
|
+
date_end: Optional[datetime] = None,
|
|
199
|
+
description: Optional[str] = None,
|
|
200
|
+
):
|
|
201
|
+
"""
|
|
202
|
+
Creates a patient event with the specified event name and start date.
|
|
203
|
+
|
|
204
|
+
If no start date is provided, the current datetime is used. Returns the created PatientEvent instance.
|
|
205
|
+
"""
|
|
206
|
+
from ....medical import Event, PatientEvent
|
|
207
|
+
|
|
208
|
+
event = Event.objects.get(name=event_name_str)
|
|
209
|
+
|
|
210
|
+
if not date_start:
|
|
211
|
+
date_start = datetime.now()
|
|
212
|
+
|
|
213
|
+
patient_event = PatientEvent.objects.create(
|
|
214
|
+
patient=self,
|
|
215
|
+
event=event,
|
|
216
|
+
date_start=date_start,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
return patient_event
|
|
220
|
+
|
|
221
|
+
def create_examination_by_pdf(self, pdf: "RawPdfFile"):
|
|
222
|
+
"""
|
|
223
|
+
Creates a patient examination and associates it with the provided report report file.
|
|
224
|
+
|
|
225
|
+
The examination is created for this patient, saved, and linked to the given RawPdfFile instance. The report's examination field is updated and saved. Returns the created examination instance.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
pdf: The RawPdfFile to associate with the new examination.
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
The created PatientExamination instance.
|
|
232
|
+
"""
|
|
233
|
+
from ....medical import PatientExamination
|
|
234
|
+
|
|
235
|
+
patient_examination = PatientExamination(patient=self)
|
|
236
|
+
patient_examination.save()
|
|
237
|
+
pdf.examination = patient_examination
|
|
238
|
+
pdf.save()
|
|
239
|
+
|
|
240
|
+
return patient_examination
|
|
241
|
+
|
|
242
|
+
@classmethod
|
|
243
|
+
def get_random_gender(cls, p_male=0.5, p_female=0.5):
|
|
244
|
+
"""
|
|
245
|
+
Get a Gender object by name (male, female) from the database with given probability.
|
|
246
|
+
|
|
247
|
+
:param p_male: Probability of selecting 'male' gender.
|
|
248
|
+
:param p_female: Probability of selecting 'female' gender.
|
|
249
|
+
:return: Gender object selected based on given probabilities.
|
|
250
|
+
"""
|
|
251
|
+
from ....other import Gender
|
|
252
|
+
|
|
253
|
+
# Extract names and probabilities
|
|
254
|
+
gender_names = ["male", "female"]
|
|
255
|
+
probabilities = [p_male, p_female]
|
|
256
|
+
|
|
257
|
+
selected_gender = random.choices(gender_names, probabilities)[0]
|
|
258
|
+
|
|
259
|
+
# Fetch the corresponding Gender object from the database
|
|
260
|
+
gender_obj = Gender.objects.get(name=selected_gender)
|
|
261
|
+
|
|
262
|
+
return gender_obj
|
|
263
|
+
|
|
264
|
+
@classmethod
|
|
265
|
+
def get_random_age(
|
|
266
|
+
cls, min_age=55, max_age=90, mean_age=65, std_age=10, distribution="normal"
|
|
267
|
+
):
|
|
268
|
+
"""
|
|
269
|
+
Get a random age based on the given distribution.
|
|
270
|
+
|
|
271
|
+
:param min_age: Minimum age.
|
|
272
|
+
:param max_age: Maximum age.
|
|
273
|
+
:param mean_age: Mean age.
|
|
274
|
+
:param std_age: Standard deviation of the age.
|
|
275
|
+
:param distribution: Distribution of the age.
|
|
276
|
+
:return: Random age based on the given distribution.
|
|
277
|
+
"""
|
|
278
|
+
if distribution == "normal":
|
|
279
|
+
age = int(random.normalvariate(mean_age, std_age))
|
|
280
|
+
else:
|
|
281
|
+
age = int(random.uniform(min_age, max_age))
|
|
282
|
+
|
|
283
|
+
return age
|
|
284
|
+
|
|
285
|
+
@classmethod
|
|
286
|
+
def get_dob_from_age(cls, age, current_date=None):
|
|
287
|
+
"""
|
|
288
|
+
Get a date of birth based on the given age and current date.
|
|
289
|
+
|
|
290
|
+
:param age: Age of the patient.
|
|
291
|
+
:param current_date: Current date.
|
|
292
|
+
:return: Date of birth based on the given age and current date.
|
|
293
|
+
"""
|
|
294
|
+
if current_date is None:
|
|
295
|
+
current_date = datetime.now()
|
|
296
|
+
dob = current_date.replace(year=current_date.year - age).date()
|
|
297
|
+
|
|
298
|
+
# TODO
|
|
299
|
+
# randomize the day and month by adding a random number of days (0-364) to the date
|
|
300
|
+
|
|
301
|
+
return dob
|
|
302
|
+
|
|
303
|
+
@classmethod
|
|
304
|
+
def get_random_name_for_gender(cls, gender_obj, locale="de_DE"):
|
|
305
|
+
gender = gender_obj.name
|
|
306
|
+
fake = Faker(locale)
|
|
307
|
+
|
|
308
|
+
if gender == "male":
|
|
309
|
+
first_name = fake.first_name_male()
|
|
310
|
+
last_name = fake.last_name_male()
|
|
311
|
+
|
|
312
|
+
else:
|
|
313
|
+
first_name = fake.first_name_female()
|
|
314
|
+
last_name = fake.last_name_female()
|
|
315
|
+
|
|
316
|
+
return last_name, first_name
|
|
317
|
+
|
|
318
|
+
@classmethod
|
|
319
|
+
def create_generic(cls, center="gplay_case_generator"):
|
|
320
|
+
"""
|
|
321
|
+
Create a generic patient with random attributes.
|
|
322
|
+
|
|
323
|
+
:param center: The center name or Center object of the patient.
|
|
324
|
+
:return: The created patient.
|
|
325
|
+
"""
|
|
326
|
+
from ....administration import Center
|
|
327
|
+
|
|
328
|
+
gender = Patient.get_random_gender()
|
|
329
|
+
last_name, first_name = Patient.get_random_name_for_gender(gender)
|
|
330
|
+
|
|
331
|
+
age = Patient.get_random_age()
|
|
332
|
+
dob = Patient.get_dob_from_age(age)
|
|
333
|
+
|
|
334
|
+
# Fetch the center object if a name is provided
|
|
335
|
+
if isinstance(center, str):
|
|
336
|
+
center_obj = Center.objects.get(name=center)
|
|
337
|
+
elif isinstance(center, Center):
|
|
338
|
+
center_obj = center
|
|
339
|
+
else:
|
|
340
|
+
raise ValueError("Center must be a string name or a Center object.")
|
|
341
|
+
|
|
342
|
+
patient = Patient.objects.create(
|
|
343
|
+
first_name=first_name,
|
|
344
|
+
last_name=last_name,
|
|
345
|
+
dob=dob,
|
|
346
|
+
gender=gender,
|
|
347
|
+
center=center_obj, # Assign the center object
|
|
348
|
+
)
|
|
349
|
+
# No need to call save() again after create()
|
|
350
|
+
return patient
|
|
351
|
+
|
|
352
|
+
@property
|
|
353
|
+
def age_safe(self) -> int:
|
|
354
|
+
age = self.age()
|
|
355
|
+
assert age is not None, "Patient age is not set."
|
|
356
|
+
return age
|
|
357
|
+
|
|
358
|
+
def age(self) -> int | None:
|
|
359
|
+
"""
|
|
360
|
+
Get the age of the patient.
|
|
361
|
+
|
|
362
|
+
:return: The age of the patient.
|
|
363
|
+
"""
|
|
364
|
+
# calculate correct age based on current date including day and month
|
|
365
|
+
current_date = (
|
|
366
|
+
timezone.now().date()
|
|
367
|
+
) # Use timezone.now() here too for consistency
|
|
368
|
+
dob = self.dob
|
|
369
|
+
# Ensure dob is not None before calculation
|
|
370
|
+
if dob:
|
|
371
|
+
age = (
|
|
372
|
+
current_date.year
|
|
373
|
+
- dob.year
|
|
374
|
+
- ((current_date.month, current_date.day) < (dob.month, dob.day))
|
|
375
|
+
)
|
|
376
|
+
return age
|
|
377
|
+
return None # Or handle the case where dob is None appropriately
|
|
378
|
+
|
|
379
|
+
def create_lab_sample(self, sample_type="generic", date=None, save=True):
|
|
380
|
+
"""
|
|
381
|
+
Create a lab sample for this patient.
|
|
382
|
+
|
|
383
|
+
:param sample_type: The sample type. Should be either string of the sample types
|
|
384
|
+
name or the sample type object. If not set, the default sample type ("generic") is used.
|
|
385
|
+
:param date: The date of the lab sample. Must be timezone-aware if provided.
|
|
386
|
+
:return: The created lab sample.
|
|
387
|
+
"""
|
|
388
|
+
from ....medical import PatientLabSample, PatientLabSampleType
|
|
389
|
+
|
|
390
|
+
if date is None:
|
|
391
|
+
date = timezone.now() # Use timezone.now() instead of datetime.now()
|
|
392
|
+
# Ensure the provided date is timezone-aware if it's not None
|
|
393
|
+
elif timezone.is_naive(date):
|
|
394
|
+
logger.warning(
|
|
395
|
+
f"Received naive datetime {date} for PatientLabSample. Making it timezone-aware using current timezone."
|
|
396
|
+
)
|
|
397
|
+
date = timezone.make_aware(date, timezone.get_current_timezone())
|
|
398
|
+
|
|
399
|
+
if isinstance(sample_type, str):
|
|
400
|
+
sample_type = PatientLabSampleType.objects.get(name=sample_type)
|
|
401
|
+
assert sample_type is not None, (
|
|
402
|
+
f"Sample type with name '{sample_type}' not found."
|
|
403
|
+
)
|
|
404
|
+
elif not isinstance(sample_type, PatientLabSampleType):
|
|
405
|
+
raise ValueError(
|
|
406
|
+
"Sample type must be either a string or a PatientLabSampleType object."
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
patient_lab_sample = PatientLabSample.objects.create(
|
|
410
|
+
patient=self, sample_type=sample_type, date=date
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
return patient_lab_sample
|
|
414
|
+
|
|
415
|
+
@property
|
|
416
|
+
def links(self) -> "RequirementLinks":
|
|
417
|
+
"""
|
|
418
|
+
Aggregates and returns all related model instances relevant for requirement evaluation
|
|
419
|
+
as a RequirementLinks object. For a Patient, this includes their diseases, associated classification choices,
|
|
420
|
+
all their lab values, and medication information.
|
|
421
|
+
"""
|
|
422
|
+
from endoreg_db.models.medical.disease import (
|
|
423
|
+
Disease,
|
|
424
|
+
DiseaseClassificationChoice,
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
# Imports for medication related models
|
|
428
|
+
from endoreg_db.models.medical.medication.medication import Medication
|
|
429
|
+
from endoreg_db.models.medical.medication.medication_indication import (
|
|
430
|
+
MedicationIndication,
|
|
431
|
+
)
|
|
432
|
+
from endoreg_db.models.medical.medication.medication_intake_time import (
|
|
433
|
+
MedicationIntakeTime,
|
|
434
|
+
)
|
|
435
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
436
|
+
|
|
437
|
+
# PatientMedication objects are retrieved via self.patientmedication_set
|
|
438
|
+
# PatientLabValue objects are retrieved via self.lab_values
|
|
439
|
+
|
|
440
|
+
patient_disease_instances = list(
|
|
441
|
+
self.diseases.all()
|
|
442
|
+
) # These are PatientDisease model instances
|
|
443
|
+
actual_diseases: List[Disease] = []
|
|
444
|
+
all_classification_choices: List[DiseaseClassificationChoice] = []
|
|
445
|
+
|
|
446
|
+
for pd_instance in patient_disease_instances:
|
|
447
|
+
if pd_instance.disease: # pd_instance.disease is a Disease instance
|
|
448
|
+
actual_diseases.append(pd_instance.disease)
|
|
449
|
+
all_classification_choices.extend(
|
|
450
|
+
list(pd_instance.classification_choices.all())
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
# Assuming self.lab_values is a related manager for PatientLabValue instances
|
|
454
|
+
patient_lab_value_instances = list(
|
|
455
|
+
self.lab_values.all()
|
|
456
|
+
) # These are PatientLabValue model instances
|
|
457
|
+
|
|
458
|
+
# Medication information
|
|
459
|
+
# self.patientmedication_set gives a QuerySet of PatientMedication
|
|
460
|
+
patient_medication_instances = list(self.patientmedication_set.all())
|
|
461
|
+
|
|
462
|
+
actual_medications: List[Medication] = []
|
|
463
|
+
med_indications: List[MedicationIndication] = []
|
|
464
|
+
med_intake_times: List[MedicationIntakeTime] = []
|
|
465
|
+
|
|
466
|
+
for pm_instance in patient_medication_instances:
|
|
467
|
+
if (
|
|
468
|
+
pm_instance.medication
|
|
469
|
+
): # pm_instance.medication is a Medication instance
|
|
470
|
+
actual_medications.append(pm_instance.medication)
|
|
471
|
+
if (
|
|
472
|
+
pm_instance.medication_indication
|
|
473
|
+
): # pm_instance.medication_indication is a MedicationIndication instance
|
|
474
|
+
med_indications.append(pm_instance.medication_indication)
|
|
475
|
+
med_intake_times.extend(
|
|
476
|
+
list(pm_instance.intake_times.all())
|
|
477
|
+
) # pm_instance.intake_times is a ManyRelatedManager for MedicationIntakeTime
|
|
478
|
+
|
|
479
|
+
return RequirementLinks(
|
|
480
|
+
diseases=list(set(actual_diseases)),
|
|
481
|
+
patient_diseases=patient_disease_instances,
|
|
482
|
+
disease_classification_choices=list(set(all_classification_choices)),
|
|
483
|
+
patient_lab_values=patient_lab_value_instances,
|
|
484
|
+
medications=list(set(actual_medications)),
|
|
485
|
+
patient_medications=patient_medication_instances,
|
|
486
|
+
medication_indications=list(set(med_indications)),
|
|
487
|
+
medication_intake_times=list(set(med_intake_times)),
|
|
488
|
+
)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models # Add this import
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from endoreg_db.models import (
|
|
7
|
+
Patient,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PatientExternalID(models.Model):
|
|
12
|
+
"""
|
|
13
|
+
A class representing the identifier of external datasources.
|
|
14
|
+
Attributes:
|
|
15
|
+
external_id (str): The external ID value.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
external_id: models.CharField = models.CharField(max_length=255)
|
|
19
|
+
patient = models.ForeignKey(
|
|
20
|
+
"Patient",
|
|
21
|
+
on_delete=models.CASCADE,
|
|
22
|
+
related_name="external_ids",
|
|
23
|
+
)
|
|
24
|
+
origin = models.CharField(max_length=255)
|
|
25
|
+
|
|
26
|
+
class Meta:
|
|
27
|
+
constraints = [
|
|
28
|
+
models.UniqueConstraint(
|
|
29
|
+
fields=("origin", "external_id"),
|
|
30
|
+
name="uniq_patient_external_id_per_origin",
|
|
31
|
+
)
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
if TYPE_CHECKING:
|
|
35
|
+
patient: models.ForeignKey["Patient"]
|
|
36
|
+
origin: models.CharField[str]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
from django.db import models
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class Person(models.Model):
|
|
6
|
+
"""
|
|
7
|
+
Abstract base class for a person.
|
|
8
|
+
|
|
9
|
+
Attributes:
|
|
10
|
+
first_name (str): The first name of the person.
|
|
11
|
+
last_name (str): The last name of the person.
|
|
12
|
+
dob (date): The date of birth of the person.
|
|
13
|
+
gender (str): The gender of the person.
|
|
14
|
+
email (str): The email address of the person.
|
|
15
|
+
phone (str): The phone number of the person.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
first_name = models.CharField(max_length=255)
|
|
19
|
+
last_name = models.CharField(max_length=255)
|
|
20
|
+
dob = models.DateField("Date of Birth", blank=True, null=True)
|
|
21
|
+
gender = models.ForeignKey("Gender", on_delete=models.SET_NULL, null=True)
|
|
22
|
+
email = models.EmailField(max_length=255, blank=True, null=True)
|
|
23
|
+
phone = models.CharField(max_length=255, blank=True, null=True)
|
|
24
|
+
is_real_person = models.BooleanField(default=True)
|
|
25
|
+
|
|
26
|
+
post_code = models.CharField(max_length=20, blank=True, null=True)
|
|
27
|
+
city = models.CharField(max_length=255, blank=True, null=True)
|
|
28
|
+
street = models.CharField(max_length=255, blank=True, null=True)
|
|
29
|
+
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def __str__(self):
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
class Meta:
|
|
35
|
+
abstract = True
|