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,50 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from django.db import models
|
|
3
|
+
|
|
4
|
+
from .base_value_distribution import BaseValueDistribution
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class MultipleCategoricalValueDistributionManager(models.Manager):
|
|
8
|
+
def get_by_natural_key(self, name):
|
|
9
|
+
return self.get(name=name)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class MultipleCategoricalValueDistribution(BaseValueDistribution):
|
|
13
|
+
"""
|
|
14
|
+
Multiple categorical value distribution model.
|
|
15
|
+
Assigns a specific number or varying number of values based on probabilities.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
objects = MultipleCategoricalValueDistributionManager()
|
|
19
|
+
categories = models.JSONField() # { "category": "probability", ... }
|
|
20
|
+
min_count = models.IntegerField()
|
|
21
|
+
max_count = models.IntegerField()
|
|
22
|
+
count_distribution_type = models.CharField(
|
|
23
|
+
max_length=20, choices=[("uniform", "Uniform"), ("normal", "Normal")]
|
|
24
|
+
)
|
|
25
|
+
count_mean = models.FloatField(null=True, blank=True)
|
|
26
|
+
count_std_dev = models.FloatField(null=True, blank=True)
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def count_mean_safe(self):
|
|
30
|
+
if self.count_mean is None:
|
|
31
|
+
raise ValueError("count_mean is not set")
|
|
32
|
+
return self.count_mean
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def count_std_dev_safe(self):
|
|
36
|
+
if self.count_std_dev is None:
|
|
37
|
+
raise ValueError("count_std_dev is not set")
|
|
38
|
+
return self.count_std_dev
|
|
39
|
+
|
|
40
|
+
def generate_value(self):
|
|
41
|
+
if self.count_distribution_type == "uniform":
|
|
42
|
+
count = np.random.randint(self.min_count, self.max_count + 1)
|
|
43
|
+
elif self.count_distribution_type == "normal":
|
|
44
|
+
count = int(np.random.normal(self.count_mean_safe, self.count_std_dev_safe))
|
|
45
|
+
count = np.clip(count, self.min_count, self.max_count)
|
|
46
|
+
else:
|
|
47
|
+
raise ValueError("Unsupported count distribution type")
|
|
48
|
+
|
|
49
|
+
categories, probabilities = zip(*self.categories.items())
|
|
50
|
+
return list(np.random.choice(categories, size=count, p=probabilities))
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"""Model for numeric value distribution"""
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from django.db import models
|
|
5
|
+
from scipy.stats import skewnorm
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from .base_value_distribution import BaseValueDistribution
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from endoreg_db.models import LabValue, Patient
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class NumericValueDistributionManager(models.Manager):
|
|
15
|
+
"""Object manager for NumericValueDistribution"""
|
|
16
|
+
|
|
17
|
+
def get_by_natural_key(self, name):
|
|
18
|
+
"""Retrieve a NumericValueDistribution by its natural key."""
|
|
19
|
+
return self.get(name=name)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class NumericValueDistribution(BaseValueDistribution):
|
|
23
|
+
"""
|
|
24
|
+
Numeric value distribution model.
|
|
25
|
+
Supports uniform, normal, and skewed normal distributions with hard limits.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
objects = NumericValueDistributionManager()
|
|
29
|
+
DISTRIBUTION_CHOICES = [
|
|
30
|
+
("uniform", "Uniform"),
|
|
31
|
+
("normal", "Normal"),
|
|
32
|
+
("skewed_normal", "Skewed Normal"),
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
distribution_type = models.CharField(max_length=20, choices=DISTRIBUTION_CHOICES)
|
|
36
|
+
min_descriptor = models.CharField(max_length=20)
|
|
37
|
+
max_descriptor = models.CharField(max_length=20)
|
|
38
|
+
min_value = models.FloatField(
|
|
39
|
+
blank=True, null=True, help_text="Lower hard limit for generated values"
|
|
40
|
+
)
|
|
41
|
+
max_value = models.FloatField(
|
|
42
|
+
blank=True, null=True, help_text="Upper hard limit for generated values"
|
|
43
|
+
)
|
|
44
|
+
mean = models.FloatField(
|
|
45
|
+
blank=True,
|
|
46
|
+
null=True,
|
|
47
|
+
help_text="Mean used for normal or skewed normal distributions",
|
|
48
|
+
)
|
|
49
|
+
std_dev = models.FloatField(
|
|
50
|
+
blank=True,
|
|
51
|
+
null=True,
|
|
52
|
+
help_text="Standard deviation for bell-shaped distributions",
|
|
53
|
+
)
|
|
54
|
+
skewness = models.FloatField(
|
|
55
|
+
blank=True,
|
|
56
|
+
null=True,
|
|
57
|
+
help_text="Shape parameter for skewed normal distributions",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def min_value_safe(self):
|
|
62
|
+
if self.min_value is None:
|
|
63
|
+
raise ValueError("min_value is not set")
|
|
64
|
+
return self.min_value
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def max_value_safe(self):
|
|
68
|
+
if self.max_value is None:
|
|
69
|
+
raise ValueError("max_value is not set")
|
|
70
|
+
return self.max_value
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def mean_safe(self):
|
|
74
|
+
if self.mean is None:
|
|
75
|
+
raise ValueError("mean is not set")
|
|
76
|
+
return self.mean
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def std_dev_safe(self):
|
|
80
|
+
if self.std_dev is None:
|
|
81
|
+
raise ValueError("std_dev is not set")
|
|
82
|
+
return self.std_dev
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def skewness_safe(self):
|
|
86
|
+
if self.skewness is None:
|
|
87
|
+
raise ValueError("skewness is not set")
|
|
88
|
+
return self.skewness
|
|
89
|
+
|
|
90
|
+
def generate_value(self, lab_value: "LabValue", patient: "Patient"):
|
|
91
|
+
"""Generate a value based on the distribution rules."""
|
|
92
|
+
|
|
93
|
+
default_normal_range_dict = lab_value.get_normal_range(
|
|
94
|
+
patient.age_safe, patient.gender
|
|
95
|
+
)
|
|
96
|
+
assert isinstance(default_normal_range_dict, dict)
|
|
97
|
+
|
|
98
|
+
if self.distribution_type == "uniform":
|
|
99
|
+
assert self.min_descriptor and self.max_descriptor
|
|
100
|
+
|
|
101
|
+
min_key_needed = self.min_descriptor.split("_")[0]
|
|
102
|
+
max_key_needed = self.max_descriptor.split("_")[0]
|
|
103
|
+
|
|
104
|
+
min_val_from_range = default_normal_range_dict.get(min_key_needed)
|
|
105
|
+
max_val_from_range = default_normal_range_dict.get(max_key_needed)
|
|
106
|
+
|
|
107
|
+
if min_val_from_range is None:
|
|
108
|
+
raise ValueError(
|
|
109
|
+
f"Cannot generate value for LabValue '{lab_value.name}' using distribution "
|
|
110
|
+
f"'{getattr(self, 'name', self.pk)}'. "
|
|
111
|
+
f"Required normal range component '{min_key_needed}' derived from min_descriptor "
|
|
112
|
+
f"'{self.min_descriptor}' is None. "
|
|
113
|
+
f"Patient context: age={patient.age()}, gender='{patient.gender.name if patient.gender else None}'. "
|
|
114
|
+
f"LabValue '{lab_value.name}' is gender-dependent: {lab_value.normal_range_gender_dependent}. "
|
|
115
|
+
f"Check LabValue's default_normal_range definition for this patient context."
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
if max_val_from_range is None:
|
|
119
|
+
raise ValueError(
|
|
120
|
+
f"Cannot generate value for LabValue '{lab_value.name}' using distribution "
|
|
121
|
+
f"'{getattr(self, 'name', self.pk)}'. "
|
|
122
|
+
f"Required normal range component '{max_key_needed}' derived from max_descriptor "
|
|
123
|
+
f"'{self.max_descriptor}' is None. "
|
|
124
|
+
f"Patient context: age={patient.age()}, gender='{patient.gender.name if patient.gender else None}'. "
|
|
125
|
+
f"LabValue '{lab_value.name}' is gender-dependent: {lab_value.normal_range_gender_dependent}. "
|
|
126
|
+
f"Check LabValue's default_normal_range definition for this patient context."
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
value = self._generate_value_uniform(default_normal_range_dict)
|
|
130
|
+
|
|
131
|
+
return value
|
|
132
|
+
|
|
133
|
+
elif self.distribution_type == "normal":
|
|
134
|
+
self._validate_normal_parameters()
|
|
135
|
+
assert self.mean is not None
|
|
136
|
+
assert self.std_dev is not None
|
|
137
|
+
value = np.random.normal(self.mean, self.std_dev)
|
|
138
|
+
return self._clip_to_bounds(value)
|
|
139
|
+
elif self.distribution_type == "skewed_normal":
|
|
140
|
+
self._validate_skewed_normal_parameters()
|
|
141
|
+
assert self.mean is not None
|
|
142
|
+
assert self.std_dev is not None
|
|
143
|
+
assert self.skewness is not None
|
|
144
|
+
value = skewnorm.rvs(a=self.skewness, loc=self.mean, scale=self.std_dev)
|
|
145
|
+
return self._clip_to_bounds(value)
|
|
146
|
+
else:
|
|
147
|
+
raise ValueError("Unsupported distribution type")
|
|
148
|
+
|
|
149
|
+
def parse_value_descriptor(self, value_descriptor: str):
|
|
150
|
+
"""Parse the value descriptor string into a dict with a lambda function."""
|
|
151
|
+
# strings of shape f"{value_key}_{operator}_{value}"
|
|
152
|
+
# extract value_key, operator, value
|
|
153
|
+
value_key, operator, value = value_descriptor.split("_")
|
|
154
|
+
value = float(value)
|
|
155
|
+
|
|
156
|
+
operator_functions = {
|
|
157
|
+
"+": lambda x: x + value,
|
|
158
|
+
"-": lambda x: x - value,
|
|
159
|
+
"x": lambda x: x * value,
|
|
160
|
+
"/": lambda x: x / value,
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return {value_key: operator_functions[operator]}
|
|
164
|
+
|
|
165
|
+
# create dict with {value_key: lambda x: x operator value}
|
|
166
|
+
|
|
167
|
+
def _generate_value_uniform(self, default_normal_range_dict: dict):
|
|
168
|
+
value_function_dict = self.parse_value_descriptor(self.min_descriptor)
|
|
169
|
+
value_function_dict.update(self.parse_value_descriptor(self.max_descriptor))
|
|
170
|
+
|
|
171
|
+
result_dict = {
|
|
172
|
+
key: value_function(default_normal_range_dict[key])
|
|
173
|
+
for key, value_function in value_function_dict.items()
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
# generate value
|
|
177
|
+
return float(np.random.uniform(result_dict["min"], result_dict["max"]))
|
|
178
|
+
|
|
179
|
+
@property
|
|
180
|
+
def stddev(self):
|
|
181
|
+
"""Alias to std_dev for backwards compatibility."""
|
|
182
|
+
return self.std_dev
|
|
183
|
+
|
|
184
|
+
@stddev.setter
|
|
185
|
+
def stddev(self, value):
|
|
186
|
+
self.std_dev = value
|
|
187
|
+
|
|
188
|
+
def _clip_to_bounds(self, value: float) -> float:
|
|
189
|
+
"""Clip the provided value to the configured hard bounds if available."""
|
|
190
|
+
lower = self.min_value
|
|
191
|
+
upper = self.max_value
|
|
192
|
+
|
|
193
|
+
if lower is not None and upper is not None:
|
|
194
|
+
return float(np.clip(value, lower, upper))
|
|
195
|
+
if lower is not None:
|
|
196
|
+
return float(max(value, lower))
|
|
197
|
+
if upper is not None:
|
|
198
|
+
return float(min(value, upper))
|
|
199
|
+
return float(value)
|
|
200
|
+
|
|
201
|
+
def _validate_normal_parameters(self) -> None:
|
|
202
|
+
if self.mean is None or self.std_dev is None:
|
|
203
|
+
raise ValueError(
|
|
204
|
+
f"Normal distribution '{getattr(self, 'name', self.pk)}' requires both mean and std_dev."
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
def _validate_skewed_normal_parameters(self) -> None:
|
|
208
|
+
if self.mean is None or self.std_dev is None or self.skewness is None:
|
|
209
|
+
raise ValueError(
|
|
210
|
+
f"Skewed normal distribution '{getattr(self, 'name', self.pk)}' requires mean, std_dev, and skewness."
|
|
211
|
+
)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from django.db import models
|
|
3
|
+
|
|
4
|
+
from .base_value_distribution import BaseValueDistribution
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SingleCategoricalValueDistributionManager(models.Manager):
|
|
8
|
+
def get_by_natural_key(self, name):
|
|
9
|
+
return self.get(name=name)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SingleCategoricalValueDistribution(BaseValueDistribution):
|
|
13
|
+
"""
|
|
14
|
+
Single categorical value distribution model.
|
|
15
|
+
Assigns a single value based on specified probabilities.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
objects = SingleCategoricalValueDistributionManager()
|
|
19
|
+
categories = models.JSONField() # { "category": "probability", ... }
|
|
20
|
+
|
|
21
|
+
def generate_value(self):
|
|
22
|
+
categories, probabilities = zip(*self.categories.items())
|
|
23
|
+
return np.random.choice(categories, p=probabilities)
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, List
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...administration import ReferenceProduct
|
|
7
|
+
from ..unit import Unit
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EmissionFactorManager(models.Manager):
|
|
11
|
+
"""
|
|
12
|
+
Manager for EmissionFactor with custom query methods.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def get_by_natural_key(self, name: str) -> "EmissionFactor":
|
|
16
|
+
return self.get(name=name)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# get debug from settings
|
|
20
|
+
# from django.conf import settings
|
|
21
|
+
# DEBUG = settings.DEBUG
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class EmissionFactor(models.Model):
|
|
25
|
+
"""
|
|
26
|
+
Represents an emission factor with associated unit and value.
|
|
27
|
+
|
|
28
|
+
Attributes:
|
|
29
|
+
name (str): The name of the emission factor.
|
|
30
|
+
unit (ForeignKey): The unit associated with the emission factor.
|
|
31
|
+
value (float): The value of the emission factor.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
objects = EmissionFactorManager()
|
|
35
|
+
|
|
36
|
+
name = models.CharField(max_length=255)
|
|
37
|
+
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
38
|
+
value = models.FloatField()
|
|
39
|
+
|
|
40
|
+
if TYPE_CHECKING:
|
|
41
|
+
unit: models.ForeignKey["Unit|None"]
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def reference_products(self) -> models.QuerySet["ReferenceProduct"]: ...
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def reference_product_package(self) -> models.QuerySet["ReferenceProduct"]: ...
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def reference_product_product(self) -> models.QuerySet["ReferenceProduct"]: ...
|
|
51
|
+
|
|
52
|
+
def natural_key(self) -> tuple:
|
|
53
|
+
"""
|
|
54
|
+
Returns the natural key for the emission factor.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
tuple: The natural key consisting of the name.
|
|
58
|
+
"""
|
|
59
|
+
return (self.name,)
|
|
60
|
+
|
|
61
|
+
def __str__(self, verbose: bool = False) -> str:
|
|
62
|
+
"""
|
|
63
|
+
String representation of the emission factor.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
verbose (bool): If True, includes additional details.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
str: The string representation of the emission factor.
|
|
70
|
+
"""
|
|
71
|
+
result = f"{self.name}: {self.value} per {self.unit}"
|
|
72
|
+
if verbose:
|
|
73
|
+
result += "\n\tSources:"
|
|
74
|
+
for source in self.sources():
|
|
75
|
+
result += f"\n\t\t{source}"
|
|
76
|
+
|
|
77
|
+
return result
|
|
78
|
+
|
|
79
|
+
def get_reference_products(self) -> List["ReferenceProduct"]:
|
|
80
|
+
"""
|
|
81
|
+
Retrieves all reference products associated with the emission factor.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
list: A list of ReferenceProduct instances associated with this emission factor.
|
|
85
|
+
"""
|
|
86
|
+
from ...administration.product import ReferenceProduct
|
|
87
|
+
|
|
88
|
+
reference_products = []
|
|
89
|
+
reference_products += ReferenceProduct.objects.filter(
|
|
90
|
+
emission_factor_total=self
|
|
91
|
+
)
|
|
92
|
+
reference_products += ReferenceProduct.objects.filter(
|
|
93
|
+
emission_factor_package=self
|
|
94
|
+
)
|
|
95
|
+
reference_products += ReferenceProduct.objects.filter(
|
|
96
|
+
emission_factor_product=self
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
return reference_products
|
|
100
|
+
|
|
101
|
+
def sources(self) -> List:
|
|
102
|
+
"""
|
|
103
|
+
Retrieves all sources related to the emission factor.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
list: A list of sources related to the emission factor.
|
|
107
|
+
"""
|
|
108
|
+
sources = []
|
|
109
|
+
sources.extend(self.get_reference_products())
|
|
110
|
+
return sources
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ..administration import Patient
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class GenderManager(models.Manager):
|
|
10
|
+
def get_by_natural_key(self, name):
|
|
11
|
+
return self.get(name=name)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Gender(models.Model):
|
|
15
|
+
"""A class representing gender."""
|
|
16
|
+
|
|
17
|
+
objects = GenderManager()
|
|
18
|
+
|
|
19
|
+
name = models.CharField(max_length=255)
|
|
20
|
+
abbreviation = models.CharField(max_length=255, null=True)
|
|
21
|
+
description = models.TextField(blank=True, null=True)
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def patients(self) -> models.QuerySet["Patient"]: ...
|
|
27
|
+
|
|
28
|
+
def natural_key(self):
|
|
29
|
+
return (self.name,)
|
|
30
|
+
|
|
31
|
+
def __str__(self):
|
|
32
|
+
return str(self.name)
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def get_prediction_information_source():
|
|
7
|
+
"""
|
|
8
|
+
Returns the InformationSource instance with the name "prediction".
|
|
9
|
+
|
|
10
|
+
Raises:
|
|
11
|
+
AssertionError: If no InformationSource with the name "prediction" exists.
|
|
12
|
+
"""
|
|
13
|
+
_source = InformationSource.objects.get(name="prediction")
|
|
14
|
+
|
|
15
|
+
# make sure to return only one object
|
|
16
|
+
assert _source, "No prediction information source found"
|
|
17
|
+
return _source
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class InformationSourceManager(models.Manager):
|
|
21
|
+
def get_by_natural_key(self, name):
|
|
22
|
+
"""
|
|
23
|
+
Retrieves a model instance using its natural key.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
name: The natural key value corresponding to the model's 'name' field.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
The model instance that matches the provided natural key.
|
|
30
|
+
"""
|
|
31
|
+
return self.get(name=name)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class InformationSource(models.Model):
|
|
35
|
+
objects = InformationSourceManager()
|
|
36
|
+
|
|
37
|
+
name = models.CharField(max_length=100)
|
|
38
|
+
|
|
39
|
+
url = models.URLField(blank=True, null=True)
|
|
40
|
+
description = models.TextField(blank=True, null=True)
|
|
41
|
+
date = models.DateField(blank=True, null=True)
|
|
42
|
+
date_created = models.DateField(auto_now_add=True)
|
|
43
|
+
date_modified = models.DateField(auto_now=True)
|
|
44
|
+
abbreviation = models.CharField(max_length=100, blank=True, null=True, unique=True)
|
|
45
|
+
|
|
46
|
+
if TYPE_CHECKING:
|
|
47
|
+
from endoreg_db.models import (
|
|
48
|
+
Examination,
|
|
49
|
+
ExaminationIndication,
|
|
50
|
+
ExaminationTime,
|
|
51
|
+
Finding,
|
|
52
|
+
FindingClassification,
|
|
53
|
+
FindingIntervention,
|
|
54
|
+
InformationSourceType,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def examinations(self) -> "models.manager.RelatedManager[Examination]": ...
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def examination_indications(
|
|
62
|
+
self,
|
|
63
|
+
) -> "models.manager.RelatedManager[ExaminationIndication]": ...
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def examination_times(
|
|
67
|
+
self,
|
|
68
|
+
) -> "models.manager.RelatedManager[ExaminationTime]": ...
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def findings(self) -> "models.manager.RelatedManager[Finding]": ...
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def finding_interventions(
|
|
75
|
+
self,
|
|
76
|
+
) -> "models.manager.RelatedManager[FindingIntervention]": ...
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def finding_classifications(
|
|
80
|
+
self,
|
|
81
|
+
) -> "models.manager.RelatedManager[FindingClassification]": ...
|
|
82
|
+
|
|
83
|
+
class Meta:
|
|
84
|
+
verbose_name = "Information Source"
|
|
85
|
+
verbose_name_plural = "Information Sources"
|
|
86
|
+
|
|
87
|
+
# add name and abbreviation as index
|
|
88
|
+
indexes = [
|
|
89
|
+
models.Index(fields=["name"]),
|
|
90
|
+
models.Index(fields=["abbreviation"]),
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
def natural_key(self):
|
|
94
|
+
"""
|
|
95
|
+
Returns the natural key tuple for the information source.
|
|
96
|
+
|
|
97
|
+
The tuple contains the object's name, which uniquely identifies it for
|
|
98
|
+
serialization and natural key lookup.
|
|
99
|
+
"""
|
|
100
|
+
return (self.name,)
|
|
101
|
+
|
|
102
|
+
def __str__(self):
|
|
103
|
+
"""
|
|
104
|
+
Return the name of the InformationSource as its string representation.
|
|
105
|
+
"""
|
|
106
|
+
return str(self.name)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class InformationSourceTypeManager(models.Manager):
|
|
110
|
+
def get_by_natural_key(self, name):
|
|
111
|
+
"""
|
|
112
|
+
Retrieve an instance of the model by its natural key, which is the 'name' field.
|
|
113
|
+
|
|
114
|
+
Parameters:
|
|
115
|
+
name (str): The value of the 'name' field to look up.
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
The model instance with the specified name.
|
|
119
|
+
"""
|
|
120
|
+
return self.get(name=name)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class InformationSourceType(models.Model):
|
|
124
|
+
objects = InformationSourceTypeManager()
|
|
125
|
+
|
|
126
|
+
name = models.CharField(max_length=100, unique=True)
|
|
127
|
+
description = models.TextField(blank=True, null=True)
|
|
128
|
+
|
|
129
|
+
information_sources = models.ManyToManyField(
|
|
130
|
+
InformationSource,
|
|
131
|
+
related_name="information_source_types",
|
|
132
|
+
blank=True,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
class Meta:
|
|
136
|
+
verbose_name = "Information Source Type"
|
|
137
|
+
verbose_name_plural = "Information Source Types"
|
|
138
|
+
|
|
139
|
+
# information_sources: models.QuerySet["InformationSource"]
|
|
140
|
+
|
|
141
|
+
@classmethod
|
|
142
|
+
def get_prediction_type(cls) -> "InformationSourceType":
|
|
143
|
+
"""
|
|
144
|
+
Return the InformationSourceType instance with the name "prediction".
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
InformationSourceType: The instance representing the "prediction" information source type.
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
InformationSourceType.DoesNotExist: If no such instance exists.
|
|
151
|
+
|
|
152
|
+
"""
|
|
153
|
+
try:
|
|
154
|
+
return cls.objects.get(name="prediction")
|
|
155
|
+
except cls.DoesNotExist as e:
|
|
156
|
+
raise cls.DoesNotExist(
|
|
157
|
+
"The 'prediction' InformationSourceType was not found. Please check your data fixtures or initial data migrations."
|
|
158
|
+
) from e
|
|
159
|
+
|
|
160
|
+
@classmethod
|
|
161
|
+
def get_manual_annotation_type(cls) -> "InformationSourceType":
|
|
162
|
+
"""
|
|
163
|
+
|
|
164
|
+
Return the InformationSourceType instance representing manual annotation.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
InformationSourceType: The instance with name "annotation".
|
|
168
|
+
|
|
169
|
+
Raises:
|
|
170
|
+
AssertionError: If no InformationSourceType with name "annotation" exists.
|
|
171
|
+
|
|
172
|
+
"""
|
|
173
|
+
try:
|
|
174
|
+
return cls.objects.get(name="manual_annotation")
|
|
175
|
+
except cls.DoesNotExist as e:
|
|
176
|
+
raise cls.DoesNotExist(
|
|
177
|
+
"The 'manual_annotation' InformationSourceType was not found. Please check your data fixtures or initial data migrations."
|
|
178
|
+
) from e
|
|
179
|
+
|
|
180
|
+
def natural_key(self):
|
|
181
|
+
"""
|
|
182
|
+
Return a tuple containing the name of the information source type for natural key serialization.
|
|
183
|
+
"""
|
|
184
|
+
return (self.name,)
|
|
185
|
+
|
|
186
|
+
def __str__(self):
|
|
187
|
+
"""
|
|
188
|
+
Return the name of the InformationSourceType as its string representation.
|
|
189
|
+
"""
|
|
190
|
+
return str(self.name)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ..administration.product.product_material import ProductMaterial
|
|
7
|
+
from .emission import EmissionFactor
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MaterialManager(models.Manager):
|
|
11
|
+
def get_by_natural_key(self, name):
|
|
12
|
+
return self.get(name=name)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Material(models.Model):
|
|
16
|
+
objects = MaterialManager()
|
|
17
|
+
|
|
18
|
+
name = models.CharField(max_length=255)
|
|
19
|
+
emission_factor = models.ForeignKey(
|
|
20
|
+
"EmissionFactor", on_delete=models.SET_NULL, null=True
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
emission_factor: models.ForeignKey["EmissionFactor|None"]
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def material_product_materials(self) -> models.QuerySet["ProductMaterial"]: ...
|
|
28
|
+
|
|
29
|
+
def natural_key(self):
|
|
30
|
+
return (self.name,)
|
|
31
|
+
|
|
32
|
+
def __str__(self):
|
|
33
|
+
result = f"{self.name} - EmissionFactor: {self.emission_factor}"
|
|
34
|
+
return result
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ResourceManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Resource(models.Model):
|
|
10
|
+
objects = ResourceManager()
|
|
11
|
+
|
|
12
|
+
name = models.CharField(max_length=255)
|
|
13
|
+
|
|
14
|
+
def natural_key(self):
|
|
15
|
+
"""
|
|
16
|
+
Return a tuple representing the natural key for this resource instance.
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
tuple: A one-element tuple containing the resource's name.
|
|
20
|
+
"""
|
|
21
|
+
return (self.name,)
|
|
22
|
+
|
|
23
|
+
def __str__(self):
|
|
24
|
+
return self.name
|