endoreg-db 0.6.0__py3-none-any.whl → 0.6.2__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/case_generator/__init__.py +0 -0
- endoreg_db/case_generator/case_generator.py +159 -0
- endoreg_db/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/case_generator/utils.py +30 -0
- endoreg_db/data/__init__.py +118 -0
- endoreg_db/data/agl_service/data.yaml +19 -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-set/data.yaml +21 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +5 -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 +90 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +6 -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 +47 -0
- endoreg_db/data/event/cardiology.yaml +28 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/examination/examinations/data.yaml +66 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +8 -0
- endoreg_db/data/examination/type/data.yaml +5 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +8 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +8 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- endoreg_db/data/finding/data.yaml +141 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +138 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_location_classification/colonoscopy.yaml +46 -0
- endoreg_db/data/finding_location_classification_choice/colonoscopy.yaml +240 -0
- endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +48 -0
- endoreg_db/data/finding_morphology_classification_choice/colon_lesion_circularity_default.yaml +34 -0
- endoreg_db/data/finding_morphology_classification_choice/colon_lesion_nice.yaml +20 -0
- endoreg_db/data/finding_morphology_classification_choice/colon_lesion_paris.yaml +65 -0
- endoreg_db/data/finding_morphology_classification_choice/colon_lesion_planarity_default.yaml +56 -0
- endoreg_db/data/finding_morphology_classification_choice/colon_lesion_surface_intact_default.yaml +39 -0
- endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +57 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +30 -0
- endoreg_db/data/gender/data.yaml +35 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/medication.yaml +6 -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 +33 -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 +51 -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 +29 -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/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -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 +92 -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 +13 -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/forms/__init__.py +5 -0
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +19 -0
- endoreg_db/forms/patient_form.py +26 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +8 -0
- endoreg_db/forms/unit.py +6 -0
- endoreg_db/management/__init__.py +0 -0
- endoreg_db/management/commands/__init__.py +0 -0
- endoreg_db/management/commands/_load_model_template.py +41 -0
- endoreg_db/management/commands/delete_all.py +18 -0
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -0
- endoreg_db/management/commands/fix_auth_permission.py +20 -0
- endoreg_db/management/commands/load_active_model_data.py +45 -0
- endoreg_db/management/commands/load_ai_model_data.py +79 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +178 -0
- endoreg_db/management/commands/load_center_data.py +43 -0
- endoreg_db/management/commands/load_contraindication_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +62 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_data.py +68 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +75 -0
- endoreg_db/management/commands/load_examination_indication_data.py +65 -0
- endoreg_db/management/commands/load_finding_data.py +171 -0
- endoreg_db/management/commands/load_g_play_data.py +113 -0
- endoreg_db/management/commands/load_gender_data.py +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +133 -0
- endoreg_db/management/commands/load_information_source.py +45 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_logging_data.py +39 -0
- endoreg_db/management/commands/load_lx_data.py +64 -0
- endoreg_db/management/commands/load_medication_data.py +103 -0
- endoreg_db/management/commands/load_medication_indication_data.py +63 -0
- endoreg_db/management/commands/load_medication_indication_type_data.py +41 -0
- endoreg_db/management/commands/load_medication_intake_time_data.py +41 -0
- endoreg_db/management/commands/load_medication_schedule_data.py +55 -0
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_network_data.py +57 -0
- endoreg_db/management/commands/load_organ_data.py +43 -0
- endoreg_db/management/commands/load_pdf_type_data.py +61 -0
- endoreg_db/management/commands/load_profession_data.py +44 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
- endoreg_db/management/commands/load_unit_data.py +46 -0
- endoreg_db/management/commands/load_user_groups.py +28 -0
- endoreg_db/management/commands/register_ai_model.py +64 -0
- endoreg_db/management/commands/reset_celery_schedule.py +9 -0
- endoreg_db/migrations/0001_initial.py +2045 -0
- endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +23 -0
- endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +23 -0
- endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +25 -0
- endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +33 -0
- endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +23 -0
- endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +24 -0
- endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +48 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +376 -0
- endoreg_db/models/ai_model/__init__.py +4 -0
- endoreg_db/models/ai_model/active_model.py +9 -0
- endoreg_db/models/ai_model/ai_model.py +103 -0
- endoreg_db/models/ai_model/lightning/__init__.py +3 -0
- endoreg_db/models/ai_model/lightning/inference_dataset.py +53 -0
- endoreg_db/models/ai_model/lightning/multilabel_classification_net.py +155 -0
- endoreg_db/models/ai_model/lightning/postprocess.py +53 -0
- endoreg_db/models/ai_model/lightning/predict.py +172 -0
- endoreg_db/models/ai_model/lightning/prediction_visualizer.py +55 -0
- endoreg_db/models/ai_model/lightning/preprocess.py +68 -0
- endoreg_db/models/ai_model/lightning/run_visualizer.py +21 -0
- endoreg_db/models/ai_model/model_meta.py +250 -0
- endoreg_db/models/ai_model/model_type.py +36 -0
- endoreg_db/models/ai_model/utils.py +8 -0
- endoreg_db/models/annotation/__init__.py +32 -0
- endoreg_db/models/annotation/anonymized_image_annotation.py +115 -0
- endoreg_db/models/annotation/binary_classification_annotation_task.py +117 -0
- endoreg_db/models/annotation/image_classification.py +86 -0
- endoreg_db/models/annotation/video_segmentation_annotation.py +52 -0
- endoreg_db/models/annotation/video_segmentation_labelset.py +20 -0
- endoreg_db/models/case/__init__.py +1 -0
- endoreg_db/models/case/case.py +34 -0
- endoreg_db/models/case_template/__init__.py +15 -0
- endoreg_db/models/case_template/case_template.py +125 -0
- endoreg_db/models/case_template/case_template_rule.py +276 -0
- endoreg_db/models/case_template/case_template_rule_value.py +88 -0
- endoreg_db/models/case_template/case_template_type.py +28 -0
- endoreg_db/models/center/__init__.py +11 -0
- endoreg_db/models/center/center.py +51 -0
- endoreg_db/models/center/center_product.py +33 -0
- endoreg_db/models/center/center_resource.py +33 -0
- endoreg_db/models/center/center_waste.py +16 -0
- endoreg_db/models/contraindication/__init__.py +21 -0
- endoreg_db/models/data_file/__init__.py +39 -0
- endoreg_db/models/data_file/base_classes/__init__.py +7 -0
- endoreg_db/models/data_file/base_classes/abstract_frame.py +100 -0
- endoreg_db/models/data_file/base_classes/abstract_pdf.py +136 -0
- endoreg_db/models/data_file/base_classes/abstract_video.py +807 -0
- endoreg_db/models/data_file/base_classes/frame_helpers.py +17 -0
- endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +19 -0
- endoreg_db/models/data_file/base_classes/utils.py +80 -0
- endoreg_db/models/data_file/frame.py +29 -0
- endoreg_db/models/data_file/import_classes/__init__.py +18 -0
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +35 -0
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -0
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -0
- endoreg_db/models/data_file/import_classes/raw_pdf.py +260 -0
- endoreg_db/models/data_file/import_classes/raw_video.py +288 -0
- endoreg_db/models/data_file/metadata/__init__.py +13 -0
- endoreg_db/models/data_file/metadata/pdf_meta.py +74 -0
- endoreg_db/models/data_file/metadata/sensitive_meta.py +290 -0
- endoreg_db/models/data_file/metadata/video_meta.py +199 -0
- endoreg_db/models/data_file/report_file.py +56 -0
- endoreg_db/models/data_file/video/__init__.py +11 -0
- endoreg_db/models/data_file/video/import_meta.py +25 -0
- endoreg_db/models/data_file/video/video.py +196 -0
- endoreg_db/models/data_file/video_segment.py +214 -0
- endoreg_db/models/disease.py +79 -0
- endoreg_db/models/emission/__init__.py +5 -0
- endoreg_db/models/emission/emission_factor.py +85 -0
- endoreg_db/models/event.py +73 -0
- endoreg_db/models/examination/__init__.py +9 -0
- endoreg_db/models/examination/examination.py +67 -0
- endoreg_db/models/examination/examination_indication.py +170 -0
- endoreg_db/models/examination/examination_time.py +53 -0
- endoreg_db/models/examination/examination_time_type.py +48 -0
- endoreg_db/models/examination/examination_type.py +40 -0
- endoreg_db/models/finding/__init__.py +11 -0
- endoreg_db/models/finding/finding.py +75 -0
- endoreg_db/models/finding/finding_intervention.py +60 -0
- endoreg_db/models/finding/finding_location_classification.py +94 -0
- endoreg_db/models/finding/finding_morphology_classification.py +89 -0
- endoreg_db/models/finding/finding_type.py +22 -0
- endoreg_db/models/hardware/__init__.py +2 -0
- endoreg_db/models/hardware/endoscope.py +60 -0
- endoreg_db/models/hardware/endoscopy_processor.py +155 -0
- endoreg_db/models/information_source.py +29 -0
- endoreg_db/models/label/__init__.py +1 -0
- endoreg_db/models/label/label.py +112 -0
- endoreg_db/models/laboratory/__init__.py +1 -0
- endoreg_db/models/laboratory/lab_value.py +111 -0
- endoreg_db/models/logging/__init__.py +11 -0
- endoreg_db/models/logging/agl_service.py +19 -0
- endoreg_db/models/logging/base.py +22 -0
- endoreg_db/models/logging/log_type.py +23 -0
- endoreg_db/models/logging/network_device.py +27 -0
- endoreg_db/models/lx/__init__.py +4 -0
- endoreg_db/models/lx/client.py +57 -0
- endoreg_db/models/lx/identity.py +34 -0
- endoreg_db/models/lx/permission.py +18 -0
- endoreg_db/models/lx/user.py +16 -0
- endoreg_db/models/medication/__init__.py +19 -0
- endoreg_db/models/medication/medication.py +33 -0
- endoreg_db/models/medication/medication_indication.py +50 -0
- endoreg_db/models/medication/medication_indication_type.py +34 -0
- endoreg_db/models/medication/medication_intake_time.py +26 -0
- endoreg_db/models/medication/medication_schedule.py +37 -0
- endoreg_db/models/network/__init__.py +9 -0
- endoreg_db/models/network/agl_service.py +38 -0
- endoreg_db/models/network/network_device.py +58 -0
- endoreg_db/models/network/network_device_type.py +23 -0
- endoreg_db/models/organ/__init__.py +38 -0
- endoreg_db/models/other/__init__.py +23 -0
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +91 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +97 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/distribution.py +5 -0
- endoreg_db/models/other/material.py +20 -0
- endoreg_db/models/other/resource.py +18 -0
- endoreg_db/models/other/transport_route.py +22 -0
- endoreg_db/models/other/waste.py +20 -0
- endoreg_db/models/patient/__init__.py +24 -0
- endoreg_db/models/patient/patient_examination.py +182 -0
- endoreg_db/models/patient/patient_finding.py +143 -0
- endoreg_db/models/patient/patient_finding_intervention.py +26 -0
- endoreg_db/models/patient/patient_finding_location.py +120 -0
- endoreg_db/models/patient/patient_finding_morphology.py +166 -0
- endoreg_db/models/permissions/__init__.py +44 -0
- endoreg_db/models/persons/__init__.py +34 -0
- endoreg_db/models/persons/examiner/__init__.py +2 -0
- endoreg_db/models/persons/examiner/examiner.py +60 -0
- endoreg_db/models/persons/examiner/examiner_type.py +2 -0
- endoreg_db/models/persons/first_name.py +18 -0
- endoreg_db/models/persons/gender.py +22 -0
- endoreg_db/models/persons/last_name.py +20 -0
- endoreg_db/models/persons/patient/__init__.py +8 -0
- endoreg_db/models/persons/patient/patient.py +389 -0
- endoreg_db/models/persons/patient/patient_disease.py +22 -0
- endoreg_db/models/persons/patient/patient_event.py +52 -0
- endoreg_db/models/persons/patient/patient_examination_indication.py +32 -0
- endoreg_db/models/persons/patient/patient_lab_sample.py +108 -0
- endoreg_db/models/persons/patient/patient_lab_value.py +197 -0
- endoreg_db/models/persons/patient/patient_medication.py +59 -0
- endoreg_db/models/persons/patient/patient_medication_schedule.py +88 -0
- endoreg_db/models/persons/person.py +31 -0
- endoreg_db/models/persons/portal_user_information.py +27 -0
- endoreg_db/models/prediction/__init__.py +8 -0
- endoreg_db/models/prediction/image_classification.py +51 -0
- endoreg_db/models/prediction/video_prediction_meta.py +306 -0
- endoreg_db/models/product/__init__.py +14 -0
- endoreg_db/models/product/product.py +110 -0
- endoreg_db/models/product/product_group.py +27 -0
- endoreg_db/models/product/product_material.py +28 -0
- endoreg_db/models/product/product_weight.py +38 -0
- endoreg_db/models/product/reference_product.py +115 -0
- endoreg_db/models/questionnaires/__init__.py +114 -0
- endoreg_db/models/quiz/__init__.py +9 -0
- endoreg_db/models/quiz/quiz_answer.py +41 -0
- endoreg_db/models/quiz/quiz_question.py +54 -0
- endoreg_db/models/report_reader/__init__.py +7 -0
- endoreg_db/models/report_reader/report_reader_config.py +53 -0
- endoreg_db/models/report_reader/report_reader_flag.py +20 -0
- endoreg_db/models/rules/__init__.py +5 -0
- endoreg_db/models/rules/rule.py +24 -0
- endoreg_db/models/rules/rule_applicator.py +224 -0
- endoreg_db/models/rules/rule_attribute_dtype.py +19 -0
- endoreg_db/models/rules/rule_type.py +22 -0
- endoreg_db/models/rules/ruleset.py +19 -0
- endoreg_db/models/unit.py +22 -0
- endoreg_db/queries/__init__.py +5 -0
- endoreg_db/queries/annotations/__init__.py +3 -0
- endoreg_db/queries/annotations/legacy.py +158 -0
- endoreg_db/queries/get/__init__.py +6 -0
- endoreg_db/queries/get/annotation.py +0 -0
- endoreg_db/queries/get/center.py +42 -0
- endoreg_db/queries/get/model.py +13 -0
- endoreg_db/queries/get/patient.py +14 -0
- endoreg_db/queries/get/patient_examination.py +20 -0
- endoreg_db/queries/get/prediction.py +0 -0
- endoreg_db/queries/get/report_file.py +33 -0
- endoreg_db/queries/get/video.py +31 -0
- endoreg_db/queries/get/video_import_meta.py +0 -0
- endoreg_db/queries/get/video_prediction_meta.py +0 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/serializers/__init__.py +10 -0
- endoreg_db/serializers/ai_model.py +19 -0
- endoreg_db/serializers/annotation.py +14 -0
- endoreg_db/serializers/center.py +11 -0
- endoreg_db/serializers/examination.py +33 -0
- endoreg_db/serializers/frame.py +9 -0
- endoreg_db/serializers/hardware.py +21 -0
- endoreg_db/serializers/label.py +22 -0
- endoreg_db/serializers/patient.py +33 -0
- endoreg_db/serializers/prediction.py +10 -0
- endoreg_db/serializers/raw_video_meta_validation.py +13 -0
- endoreg_db/serializers/report_file.py +7 -0
- endoreg_db/serializers/video.py +20 -0
- endoreg_db/serializers/video_segmentation.py +492 -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/utils/__init__.py +36 -0
- endoreg_db/utils/cropping.py +29 -0
- endoreg_db/utils/dataloader.py +118 -0
- endoreg_db/utils/dates.py +39 -0
- endoreg_db/utils/file_operations.py +30 -0
- endoreg_db/utils/hashs.py +152 -0
- endoreg_db/utils/legacy_ocr.py +201 -0
- endoreg_db/utils/names.py +74 -0
- endoreg_db/utils/ocr.py +190 -0
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/pydantic_models/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/uuid.py +4 -0
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/video/__init__.py +13 -0
- endoreg_db/utils/video/extract_frames.py +121 -0
- endoreg_db/utils/video/transcode_videofile.py +111 -0
- endoreg_db/views/__init__.py +2 -0
- endoreg_db/views/csrf.py +7 -0
- endoreg_db/views/patient_views.py +90 -0
- endoreg_db/views/raw_video_meta_validation_views.py +38 -0
- endoreg_db/views/report_views.py +96 -0
- endoreg_db/views/video_segmentation_views.py +149 -0
- endoreg_db/views/views_for_timeline.py +46 -0
- {endoreg_db-0.6.0.dist-info → endoreg_db-0.6.2.dist-info}/METADATA +14 -4
- endoreg_db-0.6.2.dist-info/RECORD +420 -0
- {endoreg_db-0.6.0.dist-info → endoreg_db-0.6.2.dist-info}/WHEEL +1 -2
- endoreg_db-0.6.0.dist-info/RECORD +0 -11
- endoreg_db-0.6.0.dist-info/top_level.txt +0 -1
- {endoreg_db-0.6.0.dist-info → endoreg_db-0.6.2.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
class FindingMorphologyClassificationTypeManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
class FindingMorphologyClassificationType(models.Model):
|
|
9
|
+
name = models.CharField(max_length=255, unique=True)
|
|
10
|
+
name_de = models.CharField(max_length=255, blank=True)
|
|
11
|
+
name_en = models.CharField(max_length=255, blank=True)
|
|
12
|
+
description = models.TextField(blank=True)
|
|
13
|
+
|
|
14
|
+
objects = FindingMorphologyClassificationTypeManager()
|
|
15
|
+
|
|
16
|
+
def natural_key(self):
|
|
17
|
+
return (self.name,)
|
|
18
|
+
|
|
19
|
+
def __str__(self):
|
|
20
|
+
return self.name
|
|
21
|
+
|
|
22
|
+
@classmethod
|
|
23
|
+
def get_required_classifications_for_finding(cls, finding):
|
|
24
|
+
"""
|
|
25
|
+
Returns all required morphology classification types for a given finding.
|
|
26
|
+
"""
|
|
27
|
+
from endoreg_db.models import FindingMorphologyClassificationType
|
|
28
|
+
required_classification_types:List[FindingMorphologyClassificationType] = [
|
|
29
|
+
_ for _ in finding.required_morphology_classification_types.all()
|
|
30
|
+
]
|
|
31
|
+
return required_classification_types
|
|
32
|
+
|
|
33
|
+
class FindingMorphologyClassificationManager(models.Manager):
|
|
34
|
+
def get_by_natural_key(self, name):
|
|
35
|
+
return self.get(name=name)
|
|
36
|
+
|
|
37
|
+
class FindingMorphologyClassification(models.Model):
|
|
38
|
+
name = models.CharField(max_length=255, unique=True)
|
|
39
|
+
name_de = models.CharField(max_length=255, blank=True)
|
|
40
|
+
name_en = models.CharField(max_length=255, blank=True)
|
|
41
|
+
description = models.TextField(blank=True)
|
|
42
|
+
classification_type = models.ForeignKey(FindingMorphologyClassificationType, on_delete=models.CASCADE)
|
|
43
|
+
|
|
44
|
+
objects = FindingMorphologyClassificationManager()
|
|
45
|
+
|
|
46
|
+
def natural_key(self):
|
|
47
|
+
return (self.name,)
|
|
48
|
+
|
|
49
|
+
def __str__(self):
|
|
50
|
+
return self.name
|
|
51
|
+
|
|
52
|
+
def get_choices(self):
|
|
53
|
+
choices: List[FindingMorphologyClassificationChoice] = [_ for _ in self.choices.all()]
|
|
54
|
+
return choices
|
|
55
|
+
|
|
56
|
+
class FindingMorphologyClassificationChoiceManager(models.Manager):
|
|
57
|
+
def get_by_natural_key(self, name):
|
|
58
|
+
return self.get(name=name)
|
|
59
|
+
|
|
60
|
+
class FindingMorphologyClassificationChoice(models.Model):
|
|
61
|
+
name = models.CharField(max_length=255, unique=True)
|
|
62
|
+
name_de = models.CharField(max_length=255, blank=True)
|
|
63
|
+
name_en = models.CharField(max_length=255, blank=True)
|
|
64
|
+
description = models.TextField(blank=True)
|
|
65
|
+
classification = models.ForeignKey(
|
|
66
|
+
FindingMorphologyClassification,
|
|
67
|
+
on_delete=models.CASCADE,
|
|
68
|
+
related_name='choices'
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
subcategories = models.JSONField(
|
|
72
|
+
default = dict
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
numerical_descriptors = models.JSONField(
|
|
76
|
+
default = dict
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
objects = FindingMorphologyClassificationChoiceManager()
|
|
80
|
+
|
|
81
|
+
def natural_key(self):
|
|
82
|
+
return (self.name,)
|
|
83
|
+
|
|
84
|
+
def __str__(self):
|
|
85
|
+
_str = f"{self.name} ({self.classification})"
|
|
86
|
+
return _str
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class FindingTypeManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
class FindingType(models.Model):
|
|
9
|
+
name = models.CharField(max_length=100, unique=True)
|
|
10
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
11
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
12
|
+
description = models.TextField(blank=True, null=True)
|
|
13
|
+
description_de = models.TextField(blank=True, null=True)
|
|
14
|
+
description_en = models.TextField(blank=True, null=True)
|
|
15
|
+
|
|
16
|
+
objects = FindingTypeManager()
|
|
17
|
+
|
|
18
|
+
def natural_key(self):
|
|
19
|
+
return (self.name,)
|
|
20
|
+
|
|
21
|
+
def __str__(self):
|
|
22
|
+
return self.name
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class EndoscopeManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name, sn):
|
|
5
|
+
return self.get(name=name, sn=sn)
|
|
6
|
+
|
|
7
|
+
class Endoscope(models.Model):
|
|
8
|
+
objects = EndoscopeManager()
|
|
9
|
+
|
|
10
|
+
name = models.CharField(max_length=255)
|
|
11
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
12
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
13
|
+
sn = models.CharField(max_length=255)
|
|
14
|
+
center = models.ForeignKey(
|
|
15
|
+
'Center',
|
|
16
|
+
blank=True,
|
|
17
|
+
null=True,
|
|
18
|
+
on_delete=models.CASCADE,
|
|
19
|
+
related_name='endoscopes'
|
|
20
|
+
)
|
|
21
|
+
endoscope_type = models.ForeignKey(
|
|
22
|
+
'EndoscopeType',
|
|
23
|
+
blank=True,
|
|
24
|
+
null=True,
|
|
25
|
+
on_delete=models.CASCADE,
|
|
26
|
+
related_name='endoscopes'
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def natural_key(self):
|
|
30
|
+
return (self.name, self.sn)
|
|
31
|
+
|
|
32
|
+
def __str__(self):
|
|
33
|
+
return self.name
|
|
34
|
+
|
|
35
|
+
class Meta:
|
|
36
|
+
ordering = ['name']
|
|
37
|
+
verbose_name = 'Endoscope'
|
|
38
|
+
verbose_name_plural = 'Endoscopes'
|
|
39
|
+
|
|
40
|
+
class EndoscopeTypeManager(models.Manager):
|
|
41
|
+
def get_by_natural_key(self, name):
|
|
42
|
+
return self.get(name=name)
|
|
43
|
+
|
|
44
|
+
class EndoscopeType(models.Model):
|
|
45
|
+
objects = EndoscopeTypeManager()
|
|
46
|
+
|
|
47
|
+
name = models.CharField(max_length=255)
|
|
48
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
49
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
50
|
+
|
|
51
|
+
def natural_key(self):
|
|
52
|
+
return (self.name,)
|
|
53
|
+
|
|
54
|
+
def __str__(self):
|
|
55
|
+
return self.name
|
|
56
|
+
|
|
57
|
+
class Meta:
|
|
58
|
+
ordering = ['name']
|
|
59
|
+
verbose_name = 'Endoscope Type'
|
|
60
|
+
verbose_name_plural = 'Endoscope Types'
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class EndoscopyProcessorManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class EndoscopyProcessor(models.Model):
|
|
10
|
+
objects = EndoscopyProcessorManager()
|
|
11
|
+
|
|
12
|
+
centers = models.ManyToManyField(
|
|
13
|
+
"Center",
|
|
14
|
+
blank=True,
|
|
15
|
+
related_name="endoscopy_processors",
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
name = models.CharField(max_length=255)
|
|
19
|
+
image_width = models.IntegerField()
|
|
20
|
+
image_height = models.IntegerField()
|
|
21
|
+
# image_fps = models.IntegerField()
|
|
22
|
+
|
|
23
|
+
# Roi for endoscope image
|
|
24
|
+
endoscope_image_x = models.IntegerField()
|
|
25
|
+
endoscope_image_y = models.IntegerField()
|
|
26
|
+
endoscope_image_width = models.IntegerField()
|
|
27
|
+
endoscope_image_height = models.IntegerField()
|
|
28
|
+
|
|
29
|
+
# Roi for examination date
|
|
30
|
+
examination_date_x = models.IntegerField()
|
|
31
|
+
examination_date_y = models.IntegerField()
|
|
32
|
+
examination_date_width = models.IntegerField()
|
|
33
|
+
examination_date_height = models.IntegerField()
|
|
34
|
+
|
|
35
|
+
# Roi for examination time
|
|
36
|
+
examination_time_x = models.IntegerField(blank=True, null=True)
|
|
37
|
+
examination_time_y = models.IntegerField(blank=True, null=True)
|
|
38
|
+
examination_time_width = models.IntegerField(blank=True, null=True)
|
|
39
|
+
examination_time_height = models.IntegerField(blank=True, null=True)
|
|
40
|
+
|
|
41
|
+
# Roi for patient first name
|
|
42
|
+
patient_first_name_x = models.IntegerField()
|
|
43
|
+
patient_first_name_y = models.IntegerField()
|
|
44
|
+
patient_first_name_width = models.IntegerField()
|
|
45
|
+
patient_first_name_height = models.IntegerField()
|
|
46
|
+
|
|
47
|
+
# Roi for patient name
|
|
48
|
+
patient_last_name_x = models.IntegerField()
|
|
49
|
+
patient_last_name_y = models.IntegerField()
|
|
50
|
+
patient_last_name_width = models.IntegerField()
|
|
51
|
+
patient_last_name_height = models.IntegerField()
|
|
52
|
+
|
|
53
|
+
# Roi for patient dob
|
|
54
|
+
patient_dob_x = models.IntegerField()
|
|
55
|
+
patient_dob_y = models.IntegerField()
|
|
56
|
+
patient_dob_width = models.IntegerField()
|
|
57
|
+
patient_dob_height = models.IntegerField()
|
|
58
|
+
|
|
59
|
+
# Roi for endoscope type
|
|
60
|
+
endoscope_type_x = models.IntegerField(blank=True, null=True)
|
|
61
|
+
endoscope_type_y = models.IntegerField(blank=True, null=True)
|
|
62
|
+
endoscope_type_width = models.IntegerField(blank=True, null=True)
|
|
63
|
+
endoscope_type_height = models.IntegerField(blank=True, null=True)
|
|
64
|
+
|
|
65
|
+
# Roi for endoscopy sn
|
|
66
|
+
endoscope_sn_x = models.IntegerField(blank=True, null=True)
|
|
67
|
+
endoscope_sn_y = models.IntegerField(blank=True, null=True)
|
|
68
|
+
endoscope_sn_width = models.IntegerField(blank=True, null=True)
|
|
69
|
+
endoscope_sn_height = models.IntegerField(blank=True, null=True)
|
|
70
|
+
|
|
71
|
+
def natural_key(self):
|
|
72
|
+
return (self.name,)
|
|
73
|
+
|
|
74
|
+
@classmethod
|
|
75
|
+
def get_by_name(self, name):
|
|
76
|
+
return self.objects.get(name=name)
|
|
77
|
+
|
|
78
|
+
def __str__(self):
|
|
79
|
+
return self.name
|
|
80
|
+
|
|
81
|
+
def get_roi_endoscope_image(self):
|
|
82
|
+
return {
|
|
83
|
+
"x": self.endoscope_image_x,
|
|
84
|
+
"y": self.endoscope_image_y,
|
|
85
|
+
"width": self.endoscope_image_width,
|
|
86
|
+
"height": self.endoscope_image_height,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
def get_roi_examination_date(self):
|
|
90
|
+
return {
|
|
91
|
+
"x": self.examination_date_x,
|
|
92
|
+
"y": self.examination_date_y,
|
|
93
|
+
"width": self.examination_date_width,
|
|
94
|
+
"height": self.examination_date_height,
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
def get_roi_examination_time(self):
|
|
98
|
+
return {
|
|
99
|
+
"x": self.examination_time_x,
|
|
100
|
+
"y": self.examination_time_y,
|
|
101
|
+
"width": self.examination_time_width,
|
|
102
|
+
"height": self.examination_time_height,
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
def get_roi_patient_last_name(self):
|
|
106
|
+
return {
|
|
107
|
+
"x": self.patient_last_name_x,
|
|
108
|
+
"y": self.patient_last_name_y,
|
|
109
|
+
"width": self.patient_last_name_width,
|
|
110
|
+
"height": self.patient_last_name_height,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
def get_roi_patient_first_name(self):
|
|
114
|
+
return {
|
|
115
|
+
"x": self.patient_first_name_x,
|
|
116
|
+
"y": self.patient_first_name_y,
|
|
117
|
+
"width": self.patient_first_name_width,
|
|
118
|
+
"height": self.patient_first_name_height,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
def get_roi_patient_dob(self):
|
|
122
|
+
return {
|
|
123
|
+
"x": self.patient_dob_x,
|
|
124
|
+
"y": self.patient_dob_y,
|
|
125
|
+
"width": self.patient_dob_width,
|
|
126
|
+
"height": self.patient_dob_height,
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
def get_roi_endoscope_type(self):
|
|
130
|
+
return {
|
|
131
|
+
"x": self.endoscope_type_x,
|
|
132
|
+
"y": self.endoscope_type_y,
|
|
133
|
+
"width": self.endoscope_type_width,
|
|
134
|
+
"height": self.endoscope_type_height,
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
def get_roi_endoscopy_sn(self):
|
|
138
|
+
return {
|
|
139
|
+
"x": self.endoscope_sn_x,
|
|
140
|
+
"y": self.endoscope_sn_y,
|
|
141
|
+
"width": self.endoscope_sn_width,
|
|
142
|
+
"height": self.endoscope_sn_height,
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
def get_rois(self):
|
|
146
|
+
return {
|
|
147
|
+
"endoscope_image": self.get_roi_endoscope_image(),
|
|
148
|
+
"examination_date": self.get_roi_examination_date(),
|
|
149
|
+
"examination_time": self.get_roi_examination_time(),
|
|
150
|
+
"patient_first_name": self.get_roi_patient_first_name(),
|
|
151
|
+
"patient_last_name": self.get_roi_patient_last_name(),
|
|
152
|
+
"patient_dob": self.get_roi_patient_dob(),
|
|
153
|
+
"endoscope_type": self.get_roi_endoscope_type(),
|
|
154
|
+
"endoscope_sn": self.get_roi_endoscopy_sn(),
|
|
155
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
def get_prediction_information_source():
|
|
4
|
+
_source = InformationSource.objects.get(name="prediction")
|
|
5
|
+
|
|
6
|
+
# make sure to return only one object
|
|
7
|
+
assert _source, "No prediction information source found"
|
|
8
|
+
return _source
|
|
9
|
+
|
|
10
|
+
class InformationSourceManager(models.Manager):
|
|
11
|
+
def get_by_natural_key(self, name):
|
|
12
|
+
return self.get(name=name)
|
|
13
|
+
|
|
14
|
+
class InformationSource(models.Model):
|
|
15
|
+
objects = InformationSourceManager()
|
|
16
|
+
|
|
17
|
+
name = models.CharField(max_length=100)
|
|
18
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
19
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
20
|
+
|
|
21
|
+
url = models.URLField(blank=True, null=True)
|
|
22
|
+
description = models.TextField(blank=True, null=True)
|
|
23
|
+
date = models.DateField(blank=True, null=True)
|
|
24
|
+
|
|
25
|
+
def natural_key(self):
|
|
26
|
+
return (self.name,)
|
|
27
|
+
|
|
28
|
+
def __str__(self):
|
|
29
|
+
return self.name
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .label import Label, LabelType, LabelSet
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class LabelTypeManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class LabelType(models.Model):
|
|
10
|
+
"""
|
|
11
|
+
A class representing a label type.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
name (str): The name of the label type.
|
|
15
|
+
description (str): A description of the label type.
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
name = models.CharField(max_length=255)
|
|
20
|
+
description = models.TextField(blank=True, null=True)
|
|
21
|
+
|
|
22
|
+
objects = LabelTypeManager()
|
|
23
|
+
|
|
24
|
+
def natural_key(self):
|
|
25
|
+
"""Return the natural key of this label type"""
|
|
26
|
+
return (self.name,)
|
|
27
|
+
|
|
28
|
+
def __str__(self):
|
|
29
|
+
return str(self.name)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class LabelManager(models.Manager):
|
|
33
|
+
"""Manager class for handling Label model operations."""
|
|
34
|
+
|
|
35
|
+
def get_by_natural_key(self, name):
|
|
36
|
+
"""Retrieves a Label instance by its natural key (name)."""
|
|
37
|
+
return self.get(name=name)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class Label(models.Model):
|
|
41
|
+
"""
|
|
42
|
+
A class representing a label.
|
|
43
|
+
|
|
44
|
+
Attributes:
|
|
45
|
+
name (str): The name of the label.
|
|
46
|
+
label_type (LabelType): The type of the label.
|
|
47
|
+
description (str): A description of the label.
|
|
48
|
+
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
name = models.CharField(max_length=255)
|
|
52
|
+
label_type = models.ForeignKey(
|
|
53
|
+
"LabelType", on_delete=models.CASCADE, related_name="labels"
|
|
54
|
+
)
|
|
55
|
+
description = models.TextField(blank=True, null=True)
|
|
56
|
+
|
|
57
|
+
objects = LabelManager()
|
|
58
|
+
|
|
59
|
+
def natural_key(self):
|
|
60
|
+
"""Return the natural key of this label"""
|
|
61
|
+
return (self.name,)
|
|
62
|
+
|
|
63
|
+
def __str__(self):
|
|
64
|
+
return str(self.name)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class LabelSetManager(models.Manager):
|
|
68
|
+
"""
|
|
69
|
+
Manager class for handling LabelSet model operations.
|
|
70
|
+
Methods
|
|
71
|
+
-------
|
|
72
|
+
get_by_natural_key(name)
|
|
73
|
+
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
def get_by_natural_key(self, name):
|
|
77
|
+
"""Retrieves a LabelSet instance by its natural key (name)."""
|
|
78
|
+
return self.get(name=name)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class LabelSet(models.Model):
|
|
82
|
+
"""
|
|
83
|
+
A class representing a label set.
|
|
84
|
+
|
|
85
|
+
Attributes:
|
|
86
|
+
name (str): The name of the label set.
|
|
87
|
+
description (str): A description of the label set.
|
|
88
|
+
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
name = models.CharField(max_length=255)
|
|
92
|
+
description = models.TextField(blank=True, null=True)
|
|
93
|
+
version = models.IntegerField()
|
|
94
|
+
labels = models.ManyToManyField("Label", related_name="labels")
|
|
95
|
+
|
|
96
|
+
objects = LabelSetManager()
|
|
97
|
+
|
|
98
|
+
def natural_key(self):
|
|
99
|
+
"""Return the natural key of this label set"""
|
|
100
|
+
return (self.name,)
|
|
101
|
+
|
|
102
|
+
def __str__(self):
|
|
103
|
+
return str(self.name)
|
|
104
|
+
|
|
105
|
+
def get_labels_in_order(self):
|
|
106
|
+
"""
|
|
107
|
+
Get all labels in this label set as list in the correct order.
|
|
108
|
+
Ordered by string representation (a is first).
|
|
109
|
+
"""
|
|
110
|
+
labels = list(self.labels.all())
|
|
111
|
+
labels.sort(key=lambda x: x.name)
|
|
112
|
+
return labels
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .lab_value import LabValue
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
import warnings
|
|
3
|
+
|
|
4
|
+
LANG = "de"
|
|
5
|
+
|
|
6
|
+
class LabValueManager(models.Manager):
|
|
7
|
+
def get_by_natural_key(self, name):
|
|
8
|
+
return self.get(name=name)
|
|
9
|
+
|
|
10
|
+
class LabValue(models.Model):
|
|
11
|
+
name = models.CharField(max_length=255, unique=True)
|
|
12
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
13
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
14
|
+
abbreviation = models.CharField(max_length=10, blank=True, null=True)
|
|
15
|
+
default_unit = models.ForeignKey('Unit', on_delete=models.CASCADE, blank=True, null=True)
|
|
16
|
+
numeric_precision = models.IntegerField(default=3)
|
|
17
|
+
default_single_categorical_value_distribution = models.ForeignKey(
|
|
18
|
+
'SingleCategoricalValueDistribution',
|
|
19
|
+
on_delete=models.CASCADE,
|
|
20
|
+
blank=True, null=True,
|
|
21
|
+
related_name='default_single_categorical_value_distribution'
|
|
22
|
+
)
|
|
23
|
+
default_numerical_value_distribution = models.ForeignKey(
|
|
24
|
+
'NumericValueDistribution',
|
|
25
|
+
on_delete=models.CASCADE,
|
|
26
|
+
blank=True, null=True,
|
|
27
|
+
related_name='default_numerical_value_distribution'
|
|
28
|
+
)
|
|
29
|
+
default_multiple_categorical_value_distribution = models.ForeignKey(
|
|
30
|
+
'MultipleCategoricalValueDistribution',
|
|
31
|
+
on_delete=models.CASCADE,
|
|
32
|
+
blank=True, null=True,
|
|
33
|
+
related_name='default_multiple_categorical_value_distribution'
|
|
34
|
+
)
|
|
35
|
+
default_date_value_distribution = models.ForeignKey(
|
|
36
|
+
'DateValueDistribution',
|
|
37
|
+
on_delete=models.CASCADE,
|
|
38
|
+
blank=True, null=True,
|
|
39
|
+
related_name='default_date_value_distribution'
|
|
40
|
+
)
|
|
41
|
+
default_normal_range = models.JSONField(blank=True, null=True)
|
|
42
|
+
normal_range_age_dependent = models.BooleanField(default=False)
|
|
43
|
+
normal_range_gender_dependent = models.BooleanField(default=False)
|
|
44
|
+
normal_range_special_case = models.BooleanField(default=False)
|
|
45
|
+
objects = LabValueManager()
|
|
46
|
+
|
|
47
|
+
def natural_key(self):
|
|
48
|
+
return (self.name,)
|
|
49
|
+
|
|
50
|
+
def __str__(self):
|
|
51
|
+
return self.name
|
|
52
|
+
|
|
53
|
+
def get_default_default_distribution(self):
|
|
54
|
+
if self.default_single_categorical_value_distribution:
|
|
55
|
+
return self.default_single_categorical_value_distribution
|
|
56
|
+
elif self.default_numerical_value_distribution:
|
|
57
|
+
return self.default_numerical_value_distribution
|
|
58
|
+
elif self.default_multiple_categorical_value_distribution:
|
|
59
|
+
return self.default_multiple_categorical_value_distribution
|
|
60
|
+
elif self.default_date_value_distribution:
|
|
61
|
+
return self.default_date_value_distribution
|
|
62
|
+
else:
|
|
63
|
+
warnings.warn("No default distribution set for lab value")
|
|
64
|
+
return None
|
|
65
|
+
|
|
66
|
+
def get_normal_range(self, age:int=None, gender=None):
|
|
67
|
+
from endoreg_db.models import Gender
|
|
68
|
+
assert isinstance(age, int) or age is None
|
|
69
|
+
assert isinstance(gender, Gender) or gender is None
|
|
70
|
+
|
|
71
|
+
age_dependent = self.normal_range_age_dependent
|
|
72
|
+
gender_dependent = self.normal_range_gender_dependent
|
|
73
|
+
special_case = self.normal_range_special_case
|
|
74
|
+
|
|
75
|
+
min_value = None
|
|
76
|
+
max_value = None
|
|
77
|
+
|
|
78
|
+
if not age_dependent and \
|
|
79
|
+
not gender_dependent and \
|
|
80
|
+
not special_case:
|
|
81
|
+
min_value = self.default_normal_range.get('min', None)
|
|
82
|
+
max_value = self.default_normal_range.get('max', None)
|
|
83
|
+
|
|
84
|
+
if age_dependent:
|
|
85
|
+
# get normal range for age)
|
|
86
|
+
warnings.warn("Age dependent normal range not implemented yet")
|
|
87
|
+
pass
|
|
88
|
+
|
|
89
|
+
if gender_dependent:
|
|
90
|
+
if not gender:
|
|
91
|
+
warnings.warn("Calling get_normal_range with gender_dependent=True requires gender to be set, choosing by random")
|
|
92
|
+
# set gender to either "male" or "female"
|
|
93
|
+
from random import choice
|
|
94
|
+
choices = ["male", "female"]
|
|
95
|
+
gender = choice(choices)
|
|
96
|
+
|
|
97
|
+
default_range_dict = self.default_normal_range.get(gender.name, {})
|
|
98
|
+
min_value = default_range_dict.get('min', None)
|
|
99
|
+
max_value = default_range_dict.get('max', None)
|
|
100
|
+
|
|
101
|
+
if special_case:
|
|
102
|
+
# get normal range for special case
|
|
103
|
+
warnings.warn("Special case normal range not implemented yet")
|
|
104
|
+
|
|
105
|
+
normal_range_dict = {
|
|
106
|
+
"min": min_value,
|
|
107
|
+
"max": max_value
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return normal_range_dict
|
|
111
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from .base import AbstractLogEntry
|
|
2
|
+
from .network_device import NetworkDeviceLogEntry
|
|
3
|
+
from .log_type import LogType
|
|
4
|
+
from .agl_service import AglServiceLogEntry
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"AbstractLogEntry",
|
|
8
|
+
"NetworkDeviceLogEntry",
|
|
9
|
+
"LogType",
|
|
10
|
+
"AglServiceLogEntry",
|
|
11
|
+
]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from .base import AbstractLogEntry
|
|
3
|
+
|
|
4
|
+
class AglServiceLogEntry(AbstractLogEntry):
|
|
5
|
+
"""
|
|
6
|
+
Model for log entries related to AGL services.
|
|
7
|
+
"""
|
|
8
|
+
service = models.ForeignKey("AglService", on_delete=models.CASCADE)
|
|
9
|
+
device = models.ForeignKey(
|
|
10
|
+
"NetworkDevice", on_delete=models.CASCADE, null=True, blank=True
|
|
11
|
+
)
|
|
12
|
+
log_type = models.ForeignKey("LogType", on_delete=models.CASCADE, null=True, blank=True)
|
|
13
|
+
|
|
14
|
+
class Meta:
|
|
15
|
+
verbose_name = "AGL Service Log Entry"
|
|
16
|
+
verbose_name_plural = "AGL Service Log Entries"
|
|
17
|
+
|
|
18
|
+
def __str__(self):
|
|
19
|
+
return f"{self.timestamp} - {self.user} - {self.ip_address} - {self.service} - {self.message}"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# django model for logging, first define an abstract base model
|
|
2
|
+
from django.db import models
|
|
3
|
+
from django.conf import settings
|
|
4
|
+
|
|
5
|
+
class AbstractLogEntry(models.Model):
|
|
6
|
+
"""
|
|
7
|
+
Abstract base model for log entries.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
class Meta:
|
|
11
|
+
abstract = True
|
|
12
|
+
|
|
13
|
+
timestamp = models.DateTimeField(auto_now_add=True)
|
|
14
|
+
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True)
|
|
15
|
+
ip_address = models.GenericIPAddressField(null=True, blank=True)
|
|
16
|
+
user_agent = models.CharField(max_length=256, null=True, blank=True)
|
|
17
|
+
message = models.TextField()
|
|
18
|
+
json_content = models.JSONField(null=True, blank=True)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def __str__(self):
|
|
22
|
+
return f"{self.timestamp} - {self.user} - {self.ip_address} - {self.message}"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class LogTypeManager(models.Manager):
|
|
4
|
+
# Custom manager for LogType; defines name as natural key
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class LogType(models.Model):
|
|
10
|
+
name = models.CharField(max_length=255)
|
|
11
|
+
description = models.CharField(max_length=255)
|
|
12
|
+
created = models.DateTimeField(auto_now_add=True)
|
|
13
|
+
updated = models.DateTimeField(auto_now=True)
|
|
14
|
+
objects = LogTypeManager()
|
|
15
|
+
|
|
16
|
+
def __str__(self):
|
|
17
|
+
return self.name
|
|
18
|
+
|
|
19
|
+
class Meta:
|
|
20
|
+
ordering = ['name']
|
|
21
|
+
|
|
22
|
+
def natural_key(self):
|
|
23
|
+
return (self.name,)
|