endoreg-db 0.5.3__py3-none-any.whl → 0.6.1__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/admin.py +90 -1
- 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 +50 -4
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/{label → ai_model_label}/label/data.yaml +27 -1
- endoreg_db/data/ai_model_label/label-set/data.yaml +21 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +5 -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/center/data.yaml +35 -5
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/endoscope/data.yaml +93 -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 +17 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +7 -1
- endoreg_db/data/lab_value/coagulation.yaml +6 -1
- endoreg_db/data/lab_value/electrolytes.yaml +39 -1
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +12 -0
- endoreg_db/data/lab_value/hematology.yaml +17 -2
- endoreg_db/data/lab_value/hormones.yaml +6 -0
- endoreg_db/data/lab_value/lipids.yaml +12 -3
- endoreg_db/data/lab_value/misc.yaml +5 -2
- endoreg_db/data/lab_value/renal_function.yaml +2 -1
- 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/medication_indication/anticoagulation.yaml +44 -49
- 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 +30 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/pdf_type/data.yaml +2 -1
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +4 -0
- endoreg_db/forms/__init__.py +3 -1
- 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/management/commands/__init__.py +0 -0
- endoreg_db/management/commands/load_ai_model_data.py +57 -23
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +160 -118
- endoreg_db/management/commands/{load_endoscope_type_data.py → load_contraindication_data.py} +3 -7
- endoreg_db/management/commands/load_disease_data.py +29 -7
- endoreg_db/management/commands/load_endoscope_data.py +68 -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_lab_value_data.py +3 -3
- endoreg_db/management/commands/load_lx_data.py +64 -0
- endoreg_db/management/commands/load_medication_data.py +83 -21
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/{load_endoscopy_processor_data.py → load_organ_data.py} +7 -9
- endoreg_db/migrations/0001_initial.py +1206 -728
- 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/models/__init__.py +331 -28
- endoreg_db/models/ai_model/__init__.py +1 -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 +232 -6
- endoreg_db/models/ai_model/model_type.py +13 -3
- endoreg_db/models/annotation/__init__.py +31 -2
- endoreg_db/models/annotation/anonymized_image_annotation.py +73 -18
- endoreg_db/models/annotation/binary_classification_annotation_task.py +94 -57
- endoreg_db/models/annotation/image_classification.py +73 -14
- 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/{persons/patient/case → case}/case.py +4 -0
- endoreg_db/models/case_template/__init__.py +10 -1
- endoreg_db/models/case_template/case_template.py +57 -13
- endoreg_db/models/case_template/case_template_rule.py +5 -5
- endoreg_db/models/case_template/case_template_rule_value.py +19 -4
- endoreg_db/models/center/__init__.py +7 -0
- endoreg_db/models/center/center.py +31 -5
- endoreg_db/models/center/center_product.py +0 -1
- endoreg_db/models/center/center_resource.py +16 -2
- endoreg_db/models/center/center_waste.py +6 -1
- endoreg_db/models/contraindication/__init__.py +21 -0
- endoreg_db/models/data_file/__init__.py +38 -5
- endoreg_db/models/data_file/base_classes/__init__.py +6 -1
- endoreg_db/models/data_file/base_classes/abstract_frame.py +64 -15
- endoreg_db/models/data_file/base_classes/abstract_pdf.py +136 -0
- endoreg_db/models/data_file/base_classes/abstract_video.py +744 -138
- 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 +22 -38
- endoreg_db/models/data_file/import_classes/__init__.py +4 -18
- endoreg_db/models/data_file/import_classes/raw_pdf.py +162 -90
- endoreg_db/models/data_file/import_classes/raw_video.py +239 -294
- endoreg_db/models/data_file/metadata/__init__.py +10 -0
- endoreg_db/models/data_file/metadata/pdf_meta.py +4 -0
- endoreg_db/models/data_file/metadata/sensitive_meta.py +265 -6
- endoreg_db/models/data_file/metadata/video_meta.py +116 -50
- endoreg_db/models/data_file/report_file.py +30 -63
- endoreg_db/models/data_file/video/__init__.py +6 -2
- endoreg_db/models/data_file/video/video.py +187 -16
- endoreg_db/models/data_file/video_segment.py +162 -55
- endoreg_db/models/disease.py +25 -2
- endoreg_db/models/emission/__init__.py +5 -1
- endoreg_db/models/emission/emission_factor.py +71 -6
- endoreg_db/models/event.py +51 -0
- endoreg_db/models/examination/__init__.py +6 -1
- endoreg_db/models/examination/examination.py +53 -12
- endoreg_db/models/examination/examination_indication.py +170 -0
- endoreg_db/models/examination/examination_time.py +31 -5
- endoreg_db/models/examination/examination_time_type.py +28 -4
- endoreg_db/models/examination/examination_type.py +28 -6
- 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/endoscope.py +16 -0
- endoreg_db/models/hardware/endoscopy_processor.py +31 -19
- endoreg_db/models/label/label.py +35 -7
- endoreg_db/models/laboratory/lab_value.py +12 -3
- endoreg_db/models/logging/__init__.py +8 -1
- 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 -1
- endoreg_db/models/medication/medication.py +7 -122
- 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 +7 -1
- endoreg_db/models/network/network_device.py +13 -8
- endoreg_db/models/organ/__init__.py +38 -0
- endoreg_db/models/other/__init__.py +19 -1
- 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 +1 -211
- endoreg_db/models/other/material.py +4 -0
- endoreg_db/models/other/transport_route.py +2 -1
- 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/persons/__init__.py +29 -2
- endoreg_db/models/persons/examiner/examiner.py +48 -4
- endoreg_db/models/persons/patient/__init__.py +1 -1
- endoreg_db/models/persons/patient/patient.py +227 -54
- endoreg_db/models/persons/patient/patient_disease.py +6 -0
- endoreg_db/models/persons/patient/patient_event.py +31 -1
- endoreg_db/models/persons/patient/patient_examination_indication.py +32 -0
- endoreg_db/models/persons/patient/patient_lab_sample.py +4 -2
- endoreg_db/models/persons/patient/patient_lab_value.py +37 -16
- endoreg_db/models/persons/patient/patient_medication.py +27 -12
- endoreg_db/models/persons/patient/patient_medication_schedule.py +62 -2
- endoreg_db/models/prediction/__init__.py +7 -1
- endoreg_db/models/prediction/image_classification.py +20 -6
- endoreg_db/models/prediction/video_prediction_meta.py +151 -89
- endoreg_db/models/product/__init__.py +10 -1
- endoreg_db/models/product/product.py +15 -2
- endoreg_db/models/product/product_group.py +8 -0
- endoreg_db/models/product/product_material.py +4 -0
- endoreg_db/models/product/product_weight.py +12 -0
- endoreg_db/models/product/reference_product.py +19 -3
- endoreg_db/models/quiz/__init__.py +8 -1
- endoreg_db/models/report_reader/__init__.py +6 -1
- endoreg_db/serializers/__init__.py +1 -1
- endoreg_db/serializers/annotation.py +2 -5
- endoreg_db/serializers/frame.py +1 -5
- endoreg_db/serializers/patient.py +26 -3
- endoreg_db/serializers/prediction.py +2 -7
- endoreg_db/serializers/raw_video_meta_validation.py +13 -0
- endoreg_db/serializers/video.py +6 -13
- 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/urls.py +173 -0
- endoreg_db/utils/__init__.py +36 -1
- endoreg_db/utils/dataloader.py +45 -19
- endoreg_db/utils/dates.py +39 -0
- endoreg_db/utils/hashs.py +122 -4
- endoreg_db/utils/names.py +74 -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/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/views.py +0 -3
- endoreg_db-0.6.1.dist-info/METADATA +151 -0
- endoreg_db-0.6.1.dist-info/RECORD +420 -0
- {endoreg_db-0.5.3.dist-info → endoreg_db-0.6.1.dist-info}/WHEEL +1 -1
- endoreg_db/data/active_model/data.yaml +0 -3
- endoreg_db/data/label/label-set/data.yaml +0 -18
- endoreg_db/management/commands/delete_legacy_images.py +0 -19
- endoreg_db/management/commands/delete_legacy_videos.py +0 -17
- endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
- endoreg_db/management/commands/import_legacy_images.py +0 -94
- endoreg_db/management/commands/import_legacy_videos.py +0 -76
- endoreg_db/management/commands/load_label_data.py +0 -67
- endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
- endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
- endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
- endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
- endoreg_db/migrations/0008_networkdevicelogentry_aglnet_ip_and_more.py +0 -28
- endoreg_db/migrations/0009_alter_networkdevicelogentry_vpn_service_status.py +0 -18
- endoreg_db/migrations/0010_remove_networkdevicelogentry_hostname.py +0 -17
- endoreg_db/models/legacy_data/__init__.py +0 -3
- endoreg_db/models/legacy_data/image.py +0 -34
- endoreg_db/models/patient_examination/__init__.py +0 -35
- endoreg_db/utils/video_metadata.py +0 -87
- endoreg_db-0.5.3.dist-info/METADATA +0 -28
- endoreg_db-0.5.3.dist-info/RECORD +0 -319
- /endoreg_db/{models/persons/patient/case → case_generator}/__init__.py +0 -0
- /endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +0 -0
- /endoreg_db/data/{model_type → ai_model_type}/data.yaml +0 -0
- /endoreg_db/{data/distribution/numeric/.init → management/__init__.py} +0 -0
- /endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +0 -0
- {endoreg_db-0.5.3.dist-info → endoreg_db-0.6.1.dist-info}/licenses/LICENSE +0 -0
endoreg_db/models/event.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
+
from typing import List
|
|
2
3
|
|
|
3
4
|
class Event(models.Model):
|
|
4
5
|
"""
|
|
@@ -14,9 +15,59 @@ class Event(models.Model):
|
|
|
14
15
|
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
15
16
|
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
16
17
|
description = models.TextField(blank=True, null=True)
|
|
18
|
+
event_classification = models.ForeignKey(
|
|
19
|
+
'EventClassification', on_delete=models.CASCADE, related_name='events',
|
|
20
|
+
null=True, blank=True
|
|
21
|
+
)
|
|
17
22
|
|
|
18
23
|
def natural_key(self):
|
|
19
24
|
return (self.name,)
|
|
20
25
|
|
|
26
|
+
def __str__(self):
|
|
27
|
+
return self.name
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class EventClassificationManager(models.Manager):
|
|
31
|
+
def get_by_natural_key(self, name):
|
|
32
|
+
return self.get(name=name)
|
|
33
|
+
|
|
34
|
+
class EventClassification(models.Model):
|
|
35
|
+
name = models.CharField(max_length=255, unique=True)
|
|
36
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
37
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
38
|
+
|
|
39
|
+
objects = EventClassificationManager()
|
|
40
|
+
|
|
41
|
+
def natural_key(self):
|
|
42
|
+
return (self.name,)
|
|
43
|
+
|
|
44
|
+
def __str__(self):
|
|
45
|
+
return self.name
|
|
46
|
+
|
|
47
|
+
def get_choices(self)->List['EventClassificationChoice']:
|
|
48
|
+
choices:List[EventClassificationChoice] = [_ for _ in self.event_classification_choices.all()]
|
|
49
|
+
return choices
|
|
50
|
+
|
|
51
|
+
class EventClassificationChoiceManager(models.Manager):
|
|
52
|
+
def get_by_natural_key(self, name):
|
|
53
|
+
return self.get(name=name)
|
|
54
|
+
|
|
55
|
+
class EventClassificationChoice(models.Model):
|
|
56
|
+
name = models.CharField(max_length=255, unique=True)
|
|
57
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
58
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
59
|
+
subcategories = models.JSONField(default=dict)
|
|
60
|
+
numerical_descriptors = models.JSONField(default=dict)
|
|
61
|
+
|
|
62
|
+
event_classification = models.ForeignKey(
|
|
63
|
+
EventClassification, on_delete=models.CASCADE,
|
|
64
|
+
related_name='event_classification_choices'
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
objects = EventClassificationChoiceManager()
|
|
68
|
+
|
|
69
|
+
def natural_key(self):
|
|
70
|
+
return (self.name,)
|
|
71
|
+
|
|
21
72
|
def __str__(self):
|
|
22
73
|
return self.name
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
from .examination import Examination
|
|
2
2
|
from .examination_type import ExaminationType
|
|
3
3
|
from .examination_time import ExaminationTime
|
|
4
|
-
from .examination_time_type import ExaminationTimeType
|
|
4
|
+
from .examination_time_type import ExaminationTimeType
|
|
5
|
+
from .examination_indication import(
|
|
6
|
+
ExaminationIndication,
|
|
7
|
+
ExaminationIndicationClassification,
|
|
8
|
+
ExaminationIndicationClassificationChoice
|
|
9
|
+
)
|
|
@@ -1,26 +1,67 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
2
4
|
|
|
3
5
|
class ExaminationManager(models.Manager):
|
|
4
|
-
|
|
6
|
+
"""
|
|
7
|
+
Manager for Examination with custom query methods.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
def get_by_natural_key(self, name: str) -> "Examination":
|
|
5
11
|
return self.get(name=name)
|
|
6
|
-
|
|
12
|
+
|
|
13
|
+
|
|
7
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
|
+
|
|
8
27
|
name = models.CharField(max_length=100, unique=True)
|
|
9
28
|
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
10
29
|
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
11
|
-
examination_types = models.ManyToManyField(
|
|
30
|
+
examination_types = models.ManyToManyField("ExaminationType", blank=True)
|
|
31
|
+
|
|
12
32
|
objects = ExaminationManager()
|
|
13
|
-
date = models.DateField(blank=True, null=True)
|
|
14
|
-
time = models.TimeField(blank=True, null=True)
|
|
15
33
|
|
|
16
|
-
def __str__(self):
|
|
34
|
+
def __str__(self) -> str:
|
|
35
|
+
"""
|
|
36
|
+
String representation of the examination.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
str: The name of the examination.
|
|
40
|
+
"""
|
|
17
41
|
return self.name
|
|
18
|
-
|
|
19
|
-
def natural_key(self):
|
|
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
|
+
"""
|
|
20
50
|
return (self.name,)
|
|
21
51
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
ordering = ['name']
|
|
52
|
+
def get_available_findings(self) -> List["Finding"]:
|
|
53
|
+
"""
|
|
54
|
+
Retrieves all findings associated with the examination.
|
|
26
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
|
|
@@ -2,10 +2,24 @@ from django.db import models
|
|
|
2
2
|
from rest_framework import serializers
|
|
3
3
|
|
|
4
4
|
class ExaminationTimeManager(models.Manager):
|
|
5
|
-
|
|
5
|
+
"""
|
|
6
|
+
Manager for ExaminationTime with custom query methods.
|
|
7
|
+
"""
|
|
8
|
+
def get_by_natural_key(self, name: str) -> "ExaminationTime":
|
|
6
9
|
return self.get(name=name)
|
|
7
|
-
|
|
10
|
+
|
|
8
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
|
+
"""
|
|
9
23
|
name = models.CharField(max_length=100, unique=True)
|
|
10
24
|
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
11
25
|
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
@@ -14,10 +28,22 @@ class ExaminationTime(models.Model):
|
|
|
14
28
|
end_time = models.TimeField(blank=True, null=True)
|
|
15
29
|
objects = ExaminationTimeManager()
|
|
16
30
|
|
|
17
|
-
def __str__(self):
|
|
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
|
+
"""
|
|
18
38
|
return self.name
|
|
19
|
-
|
|
20
|
-
def natural_key(self):
|
|
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
|
+
"""
|
|
21
47
|
return (self.name,)
|
|
22
48
|
|
|
23
49
|
class Meta:
|
|
@@ -1,20 +1,44 @@
|
|
|
1
1
|
from django.db import models
|
|
2
2
|
|
|
3
3
|
class ExaminationTimeTypeManager(models.Manager):
|
|
4
|
-
|
|
4
|
+
"""
|
|
5
|
+
Manager for ExaminationTimeType with custom query methods.
|
|
6
|
+
"""
|
|
7
|
+
def get_by_natural_key(self, name: str) -> "ExaminationTimeType":
|
|
5
8
|
return self.get(name=name)
|
|
6
9
|
|
|
7
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
|
+
"""
|
|
8
20
|
objects = ExaminationTimeTypeManager()
|
|
9
21
|
name = models.CharField(max_length=100, unique=True)
|
|
10
22
|
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
11
23
|
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
12
24
|
examinations = models.ManyToManyField('Examination', blank=True)
|
|
13
25
|
|
|
14
|
-
def __str__(self):
|
|
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
|
+
"""
|
|
15
33
|
return self.name
|
|
16
|
-
|
|
17
|
-
def natural_key(self):
|
|
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
|
+
"""
|
|
18
42
|
return (self.name,)
|
|
19
43
|
|
|
20
44
|
class Meta:
|
|
@@ -1,18 +1,40 @@
|
|
|
1
1
|
from django.db import models
|
|
2
2
|
|
|
3
3
|
class ExaminationTypeManager(models.Manager):
|
|
4
|
-
|
|
4
|
+
"""
|
|
5
|
+
Manager for ExaminationType with custom query methods.
|
|
6
|
+
"""
|
|
7
|
+
def get_by_natural_key(self, name: str) -> "ExaminationType":
|
|
5
8
|
return self.get(name=name)
|
|
6
9
|
|
|
7
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
|
+
"""
|
|
8
19
|
objects = ExaminationTypeManager()
|
|
9
20
|
name = models.CharField(max_length=100, unique=True)
|
|
10
21
|
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
11
22
|
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
12
23
|
|
|
13
|
-
def __str__(self):
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
+
"""
|
|
17
40
|
return (self.name,)
|
|
18
|
-
|
|
@@ -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
|