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,67 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ExaminationManager(models.Manager):
|
|
6
|
+
"""
|
|
7
|
+
Manager for Examination with custom query methods.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
def get_by_natural_key(self, name: str) -> "Examination":
|
|
11
|
+
return self.get(name=name)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Examination(models.Model):
|
|
15
|
+
"""
|
|
16
|
+
Represents an examination with associated details.
|
|
17
|
+
|
|
18
|
+
Attributes:
|
|
19
|
+
name (str): The unique name of the examination.
|
|
20
|
+
name_de (str): The German name of the examination.
|
|
21
|
+
name_en (str): The English name of the examination.
|
|
22
|
+
examination_types (ManyToManyField): The types associated with the examination.
|
|
23
|
+
date (DateField): The date of the examination.
|
|
24
|
+
time (TimeField): The time of the examination.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
name = models.CharField(max_length=100, unique=True)
|
|
28
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
29
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
30
|
+
examination_types = models.ManyToManyField("ExaminationType", blank=True)
|
|
31
|
+
|
|
32
|
+
objects = ExaminationManager()
|
|
33
|
+
|
|
34
|
+
def __str__(self) -> str:
|
|
35
|
+
"""
|
|
36
|
+
String representation of the examination.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
str: The name of the examination.
|
|
40
|
+
"""
|
|
41
|
+
return self.name
|
|
42
|
+
|
|
43
|
+
def natural_key(self) -> tuple:
|
|
44
|
+
"""
|
|
45
|
+
Returns the natural key for the examination.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
tuple: The natural key consisting of the name.
|
|
49
|
+
"""
|
|
50
|
+
return (self.name,)
|
|
51
|
+
|
|
52
|
+
def get_available_findings(self) -> List["Finding"]:
|
|
53
|
+
"""
|
|
54
|
+
Retrieves all findings associated with the examination.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
list: A list of findings related to the examination.
|
|
58
|
+
"""
|
|
59
|
+
from endoreg_db.models import Finding
|
|
60
|
+
|
|
61
|
+
findings: List[Finding] = [_ for _ in self.findings.all()]
|
|
62
|
+
return findings
|
|
63
|
+
|
|
64
|
+
class Meta:
|
|
65
|
+
verbose_name = "Examination"
|
|
66
|
+
verbose_name_plural = "Examinations"
|
|
67
|
+
ordering = ["name"]
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
class ExaminationIndicationManager(models.Manager):
|
|
5
|
+
"""
|
|
6
|
+
Manager for ExaminationIndication with custom query methods.
|
|
7
|
+
"""
|
|
8
|
+
def get_by_natural_key(self, name: str) -> "ExaminationIndication":
|
|
9
|
+
return self.get(name=name)
|
|
10
|
+
|
|
11
|
+
class ExaminationIndication(models.Model):
|
|
12
|
+
"""
|
|
13
|
+
Represents an indication for an examination.
|
|
14
|
+
|
|
15
|
+
Attributes:
|
|
16
|
+
name (str): The unique name of the indication.
|
|
17
|
+
name_de (str): The German name of the indication.
|
|
18
|
+
name_en (str): The English name of the indication.
|
|
19
|
+
classification (ForeignKey): The classification associated with the indication.
|
|
20
|
+
examination (ForeignKey): The examination associated with the indication.
|
|
21
|
+
"""
|
|
22
|
+
name = models.CharField(max_length=255, unique=True)
|
|
23
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
24
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
25
|
+
classification = models.ForeignKey(
|
|
26
|
+
'ExaminationIndicationClassification', on_delete=models.CASCADE,
|
|
27
|
+
related_name='indications',
|
|
28
|
+
blank=True, null=True
|
|
29
|
+
)
|
|
30
|
+
examination = models.ForeignKey(
|
|
31
|
+
'Examination', on_delete=models.CASCADE,
|
|
32
|
+
related_name='indications',
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
objects = ExaminationIndicationManager()
|
|
36
|
+
|
|
37
|
+
def natural_key(self) -> tuple:
|
|
38
|
+
"""
|
|
39
|
+
Returns the natural key for the indication.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
tuple: The natural key consisting of the name.
|
|
43
|
+
"""
|
|
44
|
+
return (self.name,)
|
|
45
|
+
|
|
46
|
+
def __str__(self) -> str:
|
|
47
|
+
"""
|
|
48
|
+
String representation of the indication.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
str: The name of the indication.
|
|
52
|
+
"""
|
|
53
|
+
return self.name
|
|
54
|
+
|
|
55
|
+
def get_choices(self) -> List['ExaminationIndicationClassificationChoice']:
|
|
56
|
+
"""
|
|
57
|
+
Retrieves all choices associated with the classification.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
list: A list of classification choices.
|
|
61
|
+
"""
|
|
62
|
+
return list(self.classification.choices.all()) if self.classification else []
|
|
63
|
+
|
|
64
|
+
def get_examination(self) -> 'Examination':
|
|
65
|
+
"""
|
|
66
|
+
Retrieves the associated examination.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Examination: The associated examination.
|
|
70
|
+
"""
|
|
71
|
+
return self.examination
|
|
72
|
+
|
|
73
|
+
class ExaminationIndicationClassificationManager(models.Manager):
|
|
74
|
+
"""
|
|
75
|
+
Manager for ExaminationIndicationClassification with custom query methods.
|
|
76
|
+
"""
|
|
77
|
+
def get_by_natural_key(self, name: str) -> "ExaminationIndicationClassification":
|
|
78
|
+
return self.get(name=name)
|
|
79
|
+
|
|
80
|
+
class ExaminationIndicationClassification(models.Model):
|
|
81
|
+
"""
|
|
82
|
+
Represents a classification for examination indications.
|
|
83
|
+
|
|
84
|
+
Attributes:
|
|
85
|
+
name (str): The unique name of the classification.
|
|
86
|
+
name_de (str): The German name of the classification.
|
|
87
|
+
name_en (str): The English name of the classification.
|
|
88
|
+
"""
|
|
89
|
+
name = models.CharField(max_length=255, unique=True)
|
|
90
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
91
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
objects = ExaminationIndicationClassificationManager()
|
|
95
|
+
|
|
96
|
+
def natural_key(self) -> tuple:
|
|
97
|
+
"""
|
|
98
|
+
Returns the natural key for the classification.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
tuple: The natural key consisting of the name.
|
|
102
|
+
"""
|
|
103
|
+
return (self.name,)
|
|
104
|
+
|
|
105
|
+
def __str__(self) -> str:
|
|
106
|
+
"""
|
|
107
|
+
String representation of the classification.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
str: The name of the classification.
|
|
111
|
+
"""
|
|
112
|
+
return self.name
|
|
113
|
+
|
|
114
|
+
def get_choices(self) -> List['ExaminationIndicationClassificationChoice']:
|
|
115
|
+
"""
|
|
116
|
+
Retrieves all choices associated with this classification.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
list: A list of classification choices.
|
|
120
|
+
"""
|
|
121
|
+
return list(self.choices.all())
|
|
122
|
+
|
|
123
|
+
class ExaminationIndicationClassificationChoiceManager(models.Manager):
|
|
124
|
+
"""
|
|
125
|
+
Manager for ExaminationIndicationClassificationChoice with custom query methods.
|
|
126
|
+
"""
|
|
127
|
+
def get_by_natural_key(self, name: str) -> "ExaminationIndicationClassificationChoice":
|
|
128
|
+
return self.get(name=name)
|
|
129
|
+
|
|
130
|
+
class ExaminationIndicationClassificationChoice(models.Model):
|
|
131
|
+
"""
|
|
132
|
+
Represents a choice within an examination indication classification.
|
|
133
|
+
|
|
134
|
+
Attributes:
|
|
135
|
+
name (str): The unique name of the choice.
|
|
136
|
+
name_de (str): The German name of the choice.
|
|
137
|
+
name_en (str): The English name of the choice.
|
|
138
|
+
subcategories (JSONField): Subcategories associated with the choice.
|
|
139
|
+
numerical_descriptors (JSONField): Numerical descriptors for the choice.
|
|
140
|
+
classification (ForeignKey): The classification to which this choice belongs.
|
|
141
|
+
"""
|
|
142
|
+
name = models.CharField(max_length=255, unique=True)
|
|
143
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
144
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
145
|
+
subcategories = models.JSONField(default=dict)
|
|
146
|
+
numerical_descriptors = models.JSONField(default=dict)
|
|
147
|
+
classification = models.ForeignKey(
|
|
148
|
+
ExaminationIndicationClassification, on_delete=models.CASCADE,
|
|
149
|
+
related_name='choices'
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
objects = ExaminationIndicationClassificationChoiceManager()
|
|
153
|
+
|
|
154
|
+
def natural_key(self) -> tuple:
|
|
155
|
+
"""
|
|
156
|
+
Returns the natural key for the classification choice.
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
tuple: The natural key consisting of the name.
|
|
160
|
+
"""
|
|
161
|
+
return (self.name,)
|
|
162
|
+
|
|
163
|
+
def __str__(self) -> str:
|
|
164
|
+
"""
|
|
165
|
+
String representation of the classification choice.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
str: The name of the classification choice.
|
|
169
|
+
"""
|
|
170
|
+
return self.name
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
|
|
4
|
+
class ExaminationTimeManager(models.Manager):
|
|
5
|
+
"""
|
|
6
|
+
Manager for ExaminationTime with custom query methods.
|
|
7
|
+
"""
|
|
8
|
+
def get_by_natural_key(self, name: str) -> "ExaminationTime":
|
|
9
|
+
return self.get(name=name)
|
|
10
|
+
|
|
11
|
+
class ExaminationTime(models.Model):
|
|
12
|
+
"""
|
|
13
|
+
Represents a specific time configuration for examinations.
|
|
14
|
+
|
|
15
|
+
Attributes:
|
|
16
|
+
name (str): The unique name of the examination time.
|
|
17
|
+
name_de (str): The German name of the examination time.
|
|
18
|
+
name_en (str): The English name of the examination time.
|
|
19
|
+
start_time (TimeField): The starting time for the examination.
|
|
20
|
+
end_time (TimeField): The ending time for the examination.
|
|
21
|
+
time_types (ManyToManyField): The types associated with this examination time.
|
|
22
|
+
"""
|
|
23
|
+
name = models.CharField(max_length=100, unique=True)
|
|
24
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
25
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
26
|
+
start_time = models.TimeField(blank=True, null=True)
|
|
27
|
+
time_types = models.ManyToManyField('ExaminationTimeType', blank=True)
|
|
28
|
+
end_time = models.TimeField(blank=True, null=True)
|
|
29
|
+
objects = ExaminationTimeManager()
|
|
30
|
+
|
|
31
|
+
def __str__(self) -> str:
|
|
32
|
+
"""
|
|
33
|
+
String representation of the examination time.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
str: The name of the examination time.
|
|
37
|
+
"""
|
|
38
|
+
return self.name
|
|
39
|
+
|
|
40
|
+
def natural_key(self) -> tuple:
|
|
41
|
+
"""
|
|
42
|
+
Returns the natural key for the examination time.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
tuple: The natural key consisting of the name.
|
|
46
|
+
"""
|
|
47
|
+
return (self.name,)
|
|
48
|
+
|
|
49
|
+
class Meta:
|
|
50
|
+
verbose_name = 'Examination Time'
|
|
51
|
+
verbose_name_plural = 'Examination Times'
|
|
52
|
+
ordering = ['name']
|
|
53
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class ExaminationTimeTypeManager(models.Manager):
|
|
4
|
+
"""
|
|
5
|
+
Manager for ExaminationTimeType with custom query methods.
|
|
6
|
+
"""
|
|
7
|
+
def get_by_natural_key(self, name: str) -> "ExaminationTimeType":
|
|
8
|
+
return self.get(name=name)
|
|
9
|
+
|
|
10
|
+
class ExaminationTimeType(models.Model):
|
|
11
|
+
"""
|
|
12
|
+
Represents a type of examination time.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
name (str): The unique name of the examination time type.
|
|
16
|
+
name_de (str): The German name of the examination time type.
|
|
17
|
+
name_en (str): The English name of the examination time type.
|
|
18
|
+
examinations: The examinations associated with this type.
|
|
19
|
+
"""
|
|
20
|
+
objects = ExaminationTimeTypeManager()
|
|
21
|
+
name = models.CharField(max_length=100, unique=True)
|
|
22
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
23
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
24
|
+
examinations = models.ManyToManyField('Examination', blank=True)
|
|
25
|
+
|
|
26
|
+
def __str__(self) -> str:
|
|
27
|
+
"""
|
|
28
|
+
String representation of the examination time type.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
str: The name of the examination time type.
|
|
32
|
+
"""
|
|
33
|
+
return self.name
|
|
34
|
+
|
|
35
|
+
def natural_key(self) -> tuple:
|
|
36
|
+
"""
|
|
37
|
+
Returns the natural key for the examination time type.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
tuple: The natural key consisting of the name.
|
|
41
|
+
"""
|
|
42
|
+
return (self.name,)
|
|
43
|
+
|
|
44
|
+
class Meta:
|
|
45
|
+
verbose_name = 'Examination Time Type'
|
|
46
|
+
verbose_name_plural = 'Examination Time Types'
|
|
47
|
+
ordering = ['name']
|
|
48
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class ExaminationTypeManager(models.Manager):
|
|
4
|
+
"""
|
|
5
|
+
Manager for ExaminationType with custom query methods.
|
|
6
|
+
"""
|
|
7
|
+
def get_by_natural_key(self, name: str) -> "ExaminationType":
|
|
8
|
+
return self.get(name=name)
|
|
9
|
+
|
|
10
|
+
class ExaminationType(models.Model):
|
|
11
|
+
"""
|
|
12
|
+
Represents a type of examination.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
name (str): The unique name of the examination type.
|
|
16
|
+
name_de (str): The German name of the examination type.
|
|
17
|
+
name_en (str): The English name of the examination type.
|
|
18
|
+
"""
|
|
19
|
+
objects = ExaminationTypeManager()
|
|
20
|
+
name = models.CharField(max_length=100, unique=True)
|
|
21
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
22
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
23
|
+
|
|
24
|
+
def __str__(self) -> str:
|
|
25
|
+
"""
|
|
26
|
+
String representation of the examination type.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
str: The name of the examination type.
|
|
30
|
+
"""
|
|
31
|
+
return self.name_en or self.name
|
|
32
|
+
|
|
33
|
+
def natural_key(self) -> tuple:
|
|
34
|
+
"""
|
|
35
|
+
Returns the natural key for the examination type.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
tuple: The natural key consisting of the name.
|
|
39
|
+
"""
|
|
40
|
+
return (self.name,)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from .finding import Finding
|
|
2
|
+
from .finding_type import FindingType
|
|
3
|
+
from .finding_location_classification import (
|
|
4
|
+
FindingLocationClassification, FindingLocationClassificationChoice
|
|
5
|
+
)
|
|
6
|
+
from .finding_morphology_classification import (
|
|
7
|
+
FindingMorphologyClassificationType, FindingMorphologyClassificationChoice,
|
|
8
|
+
FindingMorphologyClassification
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
from .finding_intervention import FindingIntervention, FindingInterventionType
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Class to represent findings of examinations
|
|
2
|
+
from django.db import models
|
|
3
|
+
from typing import List
|
|
4
|
+
|
|
5
|
+
class FindingManager(models.Manager):
|
|
6
|
+
def get_by_natural_key(self, name):
|
|
7
|
+
return self.get(name=name)
|
|
8
|
+
|
|
9
|
+
class Finding(models.Model):
|
|
10
|
+
name = models.CharField(max_length=100, unique=True)
|
|
11
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
12
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
13
|
+
description = models.TextField(blank=True, null=True)
|
|
14
|
+
description_de = models.TextField(blank=True, null=True)
|
|
15
|
+
description_en = models.TextField(blank=True, null=True)
|
|
16
|
+
examinations = models.ManyToManyField('Examination', blank=True, related_name='findings')
|
|
17
|
+
finding_types = models.ManyToManyField('FindingType', blank=True, related_name='findings')
|
|
18
|
+
|
|
19
|
+
finding_interventions = models.ManyToManyField(
|
|
20
|
+
'FindingIntervention',
|
|
21
|
+
blank=True,
|
|
22
|
+
related_name='findings'
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
causing_finding_interventions = models.ManyToManyField(
|
|
26
|
+
'FindingIntervention',
|
|
27
|
+
blank=True,
|
|
28
|
+
related_name='causing_findings'
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
opt_causing_finding_interventions = models.ManyToManyField(
|
|
32
|
+
'FindingIntervention',
|
|
33
|
+
blank=True,
|
|
34
|
+
related_name='opt_causing_findings'
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
required_morphology_classification_types = models.ManyToManyField(
|
|
38
|
+
'FindingMorphologyClassificationType',
|
|
39
|
+
blank=True,
|
|
40
|
+
related_name='required_by_findings'
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
optional_morphology_classification_types = models.ManyToManyField(
|
|
44
|
+
'FindingMorphologyClassificationType',
|
|
45
|
+
blank=True,
|
|
46
|
+
related_name='optional_for_findings'
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
objects = FindingManager()
|
|
50
|
+
|
|
51
|
+
def natural_key(self):
|
|
52
|
+
return (self.name,)
|
|
53
|
+
|
|
54
|
+
def __str__(self):
|
|
55
|
+
return self.name
|
|
56
|
+
|
|
57
|
+
def get_finding_types(self):
|
|
58
|
+
return self.finding_types.all()
|
|
59
|
+
|
|
60
|
+
def get_location_classifications(self):
|
|
61
|
+
from endoreg_db.models import FindingLocationClassification
|
|
62
|
+
# FindingLocationClassification is a class with a many-to-many relationship to Finding
|
|
63
|
+
# related name is location_classifications
|
|
64
|
+
|
|
65
|
+
location_classifications:FindingLocationClassification = self.location_classifications.all()
|
|
66
|
+
|
|
67
|
+
return location_classifications
|
|
68
|
+
|
|
69
|
+
def get_required_morphology_classification_types(self):
|
|
70
|
+
from endoreg_db.models import FindingMorphologyClassificationType
|
|
71
|
+
finding_morphology_classification_types:List[FindingMorphologyClassificationType] = [
|
|
72
|
+
_ for _ in self.required_morphology_classification_types.all()
|
|
73
|
+
]
|
|
74
|
+
return finding_morphology_classification_types
|
|
75
|
+
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class FindingInterventionManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class FindingIntervention(models.Model):
|
|
8
|
+
name = models.CharField(max_length=100, unique=True)
|
|
9
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
10
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
11
|
+
description = models.TextField(blank=True, null=True)
|
|
12
|
+
description_de = models.TextField(blank=True, null=True)
|
|
13
|
+
description_en = models.TextField(blank=True, null=True)
|
|
14
|
+
|
|
15
|
+
intervention_types = models.ManyToManyField(
|
|
16
|
+
'FindingInterventionType',
|
|
17
|
+
blank=True,
|
|
18
|
+
related_name='interventions'
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
required_lab_values = models.ManyToManyField(
|
|
22
|
+
'LabValue',
|
|
23
|
+
blank=True,
|
|
24
|
+
related_name='required_by_finding_interventions'
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
contraindications = models.ManyToManyField(
|
|
28
|
+
'Contraindication',
|
|
29
|
+
blank=True,
|
|
30
|
+
related_name='contraindicating_finding_interventions'
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
objects = FindingInterventionManager()
|
|
34
|
+
|
|
35
|
+
def natural_key(self):
|
|
36
|
+
return (self.name,)
|
|
37
|
+
|
|
38
|
+
def __str__(self):
|
|
39
|
+
return self.name
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class FindingInterventionTypeManager(models.Manager):
|
|
43
|
+
def get_by_natural_key(self, name):
|
|
44
|
+
return self.get(name=name)
|
|
45
|
+
|
|
46
|
+
class FindingInterventionType(models.Model):
|
|
47
|
+
name = models.CharField(max_length=100, unique=True)
|
|
48
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
49
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
50
|
+
description = models.TextField(blank=True, null=True)
|
|
51
|
+
description_de = models.TextField(blank=True, null=True)
|
|
52
|
+
description_en = models.TextField(blank=True, null=True)
|
|
53
|
+
|
|
54
|
+
objects = FindingInterventionTypeManager()
|
|
55
|
+
|
|
56
|
+
def natural_key(self):
|
|
57
|
+
return (self.name,)
|
|
58
|
+
|
|
59
|
+
def __str__(self):
|
|
60
|
+
return self.name
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import List
|
|
3
|
+
# Class to represent the LocationClassifications of a Finding
|
|
4
|
+
|
|
5
|
+
class FindingLocationClassificationManager(models.Manager):
|
|
6
|
+
def get_by_natural_key(self, name):
|
|
7
|
+
return self.get(name=name)
|
|
8
|
+
|
|
9
|
+
class FindingLocationClassification(models.Model):
|
|
10
|
+
name = models.CharField(max_length=100, unique=True)
|
|
11
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
12
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
13
|
+
description = models.TextField(blank=True, null=True)
|
|
14
|
+
description_de = models.TextField(blank=True, null=True)
|
|
15
|
+
description_en = models.TextField(blank=True, null=True)
|
|
16
|
+
|
|
17
|
+
# Many to many relationships:
|
|
18
|
+
findings = models.ManyToManyField('Finding', blank=True, related_name='location_classifications')
|
|
19
|
+
examinations = models.ManyToManyField('Examination', blank=True, related_name='location_classifications')
|
|
20
|
+
finding_types = models.ManyToManyField('FindingType', blank=True, related_name='location_classifications')
|
|
21
|
+
choices = models.ManyToManyField('FindingLocationClassificationChoice', blank=True, related_name='location_classifications')
|
|
22
|
+
|
|
23
|
+
objects = FindingLocationClassificationManager()
|
|
24
|
+
|
|
25
|
+
def natural_key(self):
|
|
26
|
+
return (self.name,)
|
|
27
|
+
|
|
28
|
+
def __str__(self):
|
|
29
|
+
return self.name
|
|
30
|
+
|
|
31
|
+
def get_available_findings(self):
|
|
32
|
+
from endoreg_db.models import Finding
|
|
33
|
+
available_findings:List[Finding] = [_ for _ in self.findings.all()]
|
|
34
|
+
return available_findings
|
|
35
|
+
|
|
36
|
+
def remove_unavailable_findings(
|
|
37
|
+
self,
|
|
38
|
+
findings
|
|
39
|
+
):
|
|
40
|
+
"""
|
|
41
|
+
Returns a list of findings that are in the input list but not available for this location classification.
|
|
42
|
+
"""
|
|
43
|
+
from endoreg_db.models import Finding
|
|
44
|
+
for _ in findings:
|
|
45
|
+
assert isinstance(_, Finding)
|
|
46
|
+
available_findings:List['Finding'] = self.get_available_findings()
|
|
47
|
+
available_finding_names = [
|
|
48
|
+
finding.name for finding in available_findings
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
filtered_findings = []
|
|
52
|
+
|
|
53
|
+
for finding in findings:
|
|
54
|
+
if finding.name in available_finding_names:
|
|
55
|
+
filtered_findings.append(finding)
|
|
56
|
+
|
|
57
|
+
return filtered_findings
|
|
58
|
+
|
|
59
|
+
def get_choices(self):
|
|
60
|
+
return self.choices.all()
|
|
61
|
+
|
|
62
|
+
class FindingLocationClassificationChoiceManager(models.Manager):
|
|
63
|
+
def get_by_natural_key(self, name):
|
|
64
|
+
return self.get(name=name)
|
|
65
|
+
|
|
66
|
+
class FindingLocationClassificationChoice(models.Model):
|
|
67
|
+
name = models.CharField(max_length=100, unique=True)
|
|
68
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
69
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
70
|
+
description = models.TextField(blank=True, null=True)
|
|
71
|
+
description_de = models.TextField(blank=True, null=True)
|
|
72
|
+
description_en = models.TextField(blank=True, null=True)
|
|
73
|
+
|
|
74
|
+
# Foreign key relationships: # migrated to organs
|
|
75
|
+
# organs = models.ManyToManyField('Organ', blank=True, related_name='location_choices')
|
|
76
|
+
|
|
77
|
+
# Optional Descriptors:
|
|
78
|
+
# subcategories_str is a List of strings with names of categorical descriptors
|
|
79
|
+
subcategories = models.JSONField(blank=True, null=True)
|
|
80
|
+
numerical_descriptors = models.JSONField(blank=True, null=True)
|
|
81
|
+
|
|
82
|
+
objects = FindingLocationClassificationChoiceManager()
|
|
83
|
+
|
|
84
|
+
def natural_key(self):
|
|
85
|
+
return (self.name,)
|
|
86
|
+
|
|
87
|
+
def __str__(self):
|
|
88
|
+
return self.name
|
|
89
|
+
|
|
90
|
+
def get_subcategories(self)->dict:
|
|
91
|
+
return self.subcategories
|
|
92
|
+
|
|
93
|
+
def get_numerical_descriptors(self)->dict:
|
|
94
|
+
return self.numerical_descriptors
|