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
|
@@ -1,27 +1,86 @@
|
|
|
1
1
|
from django.db import models
|
|
2
2
|
|
|
3
|
+
from typing import TYPE_CHECKING, Union
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from endoreg_db.models import Frame, RawFrame, Label
|
|
7
|
+
|
|
8
|
+
|
|
3
9
|
class ImageClassificationAnnotation(models.Model):
|
|
4
10
|
"""
|
|
5
|
-
|
|
11
|
+
Represents an image classification annotation.
|
|
6
12
|
|
|
7
13
|
Attributes:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
frame (ForeignKey): The frame associated with the annotation.
|
|
15
|
+
legacy_frame (ForeignKey): The legacy frame associated with the annotation.
|
|
16
|
+
legacy_image (ForeignKey): The legacy image associated with the annotation.
|
|
17
|
+
label (ForeignKey): The label assigned to the annotation.
|
|
18
|
+
value (bool): Indicates if the classification is valid.
|
|
19
|
+
annotator (str): The user who created the annotation.
|
|
20
|
+
date_created (datetime): The creation date of the annotation.
|
|
21
|
+
date_modified (datetime): The last modification date of the annotation.
|
|
13
22
|
"""
|
|
23
|
+
|
|
14
24
|
# Foreign keys to Frame, LegacyFrame, and LegacyImage (only one of these should be set)
|
|
15
|
-
frame = models.ForeignKey(
|
|
16
|
-
|
|
17
|
-
|
|
25
|
+
frame = models.ForeignKey(
|
|
26
|
+
"Frame",
|
|
27
|
+
on_delete=models.CASCADE,
|
|
28
|
+
blank=True,
|
|
29
|
+
null=True,
|
|
30
|
+
related_name="image_classification_annotations",
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
raw_frame = models.ForeignKey(
|
|
34
|
+
"RawFrame",
|
|
35
|
+
on_delete=models.CASCADE,
|
|
36
|
+
blank=True,
|
|
37
|
+
null=True,
|
|
38
|
+
related_name="image_classification_annotations",
|
|
39
|
+
)
|
|
18
40
|
|
|
19
|
-
label = models.ForeignKey(
|
|
41
|
+
label = models.ForeignKey(
|
|
42
|
+
"Label",
|
|
43
|
+
on_delete=models.CASCADE,
|
|
44
|
+
related_name="image_classification_annotations",
|
|
45
|
+
)
|
|
20
46
|
value = models.BooleanField()
|
|
21
|
-
|
|
47
|
+
float_value = models.FloatField(blank=True, null=True)
|
|
48
|
+
annotator = models.CharField(max_length=255, blank=True, null=True)
|
|
49
|
+
model_meta = models.ForeignKey(
|
|
50
|
+
"ModelMeta",
|
|
51
|
+
on_delete=models.SET_NULL,
|
|
52
|
+
related_name="image_classification_annotations",
|
|
53
|
+
default=None,
|
|
54
|
+
null=True,
|
|
55
|
+
blank=True,
|
|
56
|
+
)
|
|
22
57
|
date_created = models.DateTimeField(auto_now_add=True)
|
|
23
58
|
date_modified = models.DateTimeField(auto_now=True)
|
|
59
|
+
information_source = models.ForeignKey(
|
|
60
|
+
"InformationSource",
|
|
61
|
+
on_delete=models.SET_NULL,
|
|
62
|
+
related_name="image_classification_annotations",
|
|
63
|
+
default=None,
|
|
64
|
+
null=True,
|
|
65
|
+
blank=True,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
if TYPE_CHECKING:
|
|
69
|
+
frame: "Frame"
|
|
70
|
+
raw_frame: "RawFrame"
|
|
71
|
+
label: "Label"
|
|
72
|
+
|
|
73
|
+
def __str__(self) -> str:
|
|
74
|
+
"""
|
|
75
|
+
String representation of the annotation.
|
|
76
|
+
"""
|
|
77
|
+
return f"{self.label.name} - {self.value}"
|
|
24
78
|
|
|
25
|
-
def
|
|
26
|
-
|
|
27
|
-
|
|
79
|
+
def get_frame(self):
|
|
80
|
+
"""
|
|
81
|
+
Get the frame associated with the annotation.
|
|
82
|
+
"""
|
|
83
|
+
if self.frame:
|
|
84
|
+
return self.frame
|
|
85
|
+
else:
|
|
86
|
+
return self.raw_frame
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class VideoSegmentationLabelManager(models.Manager):
|
|
4
|
+
"""
|
|
5
|
+
Manager for VideoSegmentationLabel with custom query methods.
|
|
6
|
+
"""
|
|
7
|
+
def get_by_natural_key(self, name: str) -> "VideoSegmentationLabel":
|
|
8
|
+
return self.get(name=name)
|
|
9
|
+
|
|
10
|
+
class VideoSegmentationLabel(models.Model):
|
|
11
|
+
"""
|
|
12
|
+
Represents a label for video segmentation annotations.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
name (str): The name of the label.
|
|
16
|
+
name_de (str): The German name of the label.
|
|
17
|
+
name_en (str): The English name of the label.
|
|
18
|
+
description (str): A description of the label.
|
|
19
|
+
color (str): The color associated with the label.
|
|
20
|
+
order_priority (int): The priority for ordering labels.
|
|
21
|
+
"""
|
|
22
|
+
objects = VideoSegmentationLabelManager()
|
|
23
|
+
|
|
24
|
+
name = models.CharField(max_length=255)
|
|
25
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
26
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
27
|
+
description = models.TextField(blank=True, null=True)
|
|
28
|
+
color = models.CharField(max_length=255, blank=True, null=True)
|
|
29
|
+
order_priority = models.IntegerField(default=0)
|
|
30
|
+
|
|
31
|
+
def natural_key(self):
|
|
32
|
+
return (self.name,)
|
|
33
|
+
|
|
34
|
+
def __str__(self):
|
|
35
|
+
return self.name
|
|
36
|
+
|
|
37
|
+
class VideoSegmentationAnnotation(models.Model):
|
|
38
|
+
"""
|
|
39
|
+
Represents a video segmentation annotation.
|
|
40
|
+
|
|
41
|
+
Attributes:
|
|
42
|
+
video (ForeignKey): The associated video file.
|
|
43
|
+
label (ForeignKey): The label for the annotation.
|
|
44
|
+
start_time (float): The start time of the annotation in seconds.
|
|
45
|
+
stop_time (float): The stop time of the annotation in seconds.
|
|
46
|
+
is_true (bool): Indicates if the annotation is valid.
|
|
47
|
+
"""
|
|
48
|
+
video = models.ForeignKey("RawVideoFile", on_delete=models.CASCADE)
|
|
49
|
+
label = models.ForeignKey(VideoSegmentationLabel, on_delete=models.CASCADE)
|
|
50
|
+
start_time = models.FloatField() # in seconds
|
|
51
|
+
stop_time = models.FloatField() # in seconds
|
|
52
|
+
is_true = models.BooleanField(default=True)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class VideoSegmentationLabelSetManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class VideoSegmentationLabelSet(models.Model):
|
|
10
|
+
name = models.CharField(max_length=255)
|
|
11
|
+
description = models.TextField(blank=True, null=True)
|
|
12
|
+
labels = models.ManyToManyField("VideoSegmentationLabel", related_name="labelsets")
|
|
13
|
+
|
|
14
|
+
objects = VideoSegmentationLabelSetManager()
|
|
15
|
+
|
|
16
|
+
def natural_key(self):
|
|
17
|
+
return (self.name,)
|
|
18
|
+
|
|
19
|
+
def __str__(self):
|
|
20
|
+
return str(self.name)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .case import Case
|
|
@@ -18,6 +18,10 @@ class Case(models.Model):
|
|
|
18
18
|
updated_at (datetime): The last update date of the case.
|
|
19
19
|
|
|
20
20
|
"""
|
|
21
|
+
patient = models.ForeignKey('Patient', on_delete=models.CASCADE, related_name='cases')
|
|
22
|
+
patient_examinations = models.ManyToManyField('PatientExamination', related_name='cases')
|
|
23
|
+
hash = models.CharField(max_length=255, blank=True, null=True)
|
|
24
|
+
|
|
21
25
|
start_date = models.DateTimeField()
|
|
22
26
|
end_date = models.DateTimeField(null=True)
|
|
23
27
|
is_active = models.BooleanField(default=True)
|
|
@@ -3,4 +3,13 @@
|
|
|
3
3
|
from .case_template_rule import CaseTemplateRule, CaseTemplateRuleType
|
|
4
4
|
from .case_template_rule_value import CaseTemplateRuleValue, CaseTemplateRuleValueType
|
|
5
5
|
from .case_template_type import CaseTemplateType
|
|
6
|
-
from .case_template import CaseTemplate
|
|
6
|
+
from .case_template import CaseTemplate
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"CaseTemplateRule",
|
|
10
|
+
"CaseTemplateRuleType",
|
|
11
|
+
"CaseTemplateRuleValue",
|
|
12
|
+
"CaseTemplateRuleValueType",
|
|
13
|
+
"CaseTemplateType",
|
|
14
|
+
"CaseTemplate",
|
|
15
|
+
]
|
|
@@ -6,13 +6,14 @@ class CaseTemplateManager(models.Manager):
|
|
|
6
6
|
|
|
7
7
|
class CaseTemplate(models.Model):
|
|
8
8
|
"""
|
|
9
|
-
|
|
9
|
+
Represents a case template.
|
|
10
10
|
|
|
11
11
|
Attributes:
|
|
12
|
-
name (str): The name of the case template.
|
|
13
|
-
|
|
12
|
+
name (str): The unique name of the case template.
|
|
13
|
+
template_type (ForeignKey): The type of the case template.
|
|
14
14
|
description (str): A description of the case template.
|
|
15
|
-
|
|
15
|
+
rules: The primary rules associated with the case template.
|
|
16
|
+
secondary_rules: Secondary rules associated with the case template.
|
|
16
17
|
"""
|
|
17
18
|
name = models.CharField(max_length=255, unique=True)
|
|
18
19
|
template_type = models.ForeignKey("CaseTemplateType", on_delete=models.CASCADE, related_name="case_templates")
|
|
@@ -30,33 +31,70 @@ class CaseTemplate(models.Model):
|
|
|
30
31
|
objects = CaseTemplateManager()
|
|
31
32
|
|
|
32
33
|
def natural_key(self):
|
|
34
|
+
"""
|
|
35
|
+
Returns the natural key for the case template.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
tuple: The natural key consisting of the name.
|
|
39
|
+
"""
|
|
33
40
|
return (self.name,)
|
|
34
41
|
|
|
35
42
|
def __str__(self):
|
|
43
|
+
"""
|
|
44
|
+
String representation of the case template.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
str: The name of the case template.
|
|
48
|
+
"""
|
|
36
49
|
return self.name
|
|
37
50
|
|
|
38
51
|
def get_rules(self):
|
|
39
|
-
|
|
40
|
-
|
|
52
|
+
"""
|
|
53
|
+
Retrieves all primary rules associated with the case template.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
A queryset of primary rules.
|
|
57
|
+
"""
|
|
58
|
+
return self.rules.all()
|
|
59
|
+
|
|
41
60
|
|
|
42
61
|
def get_secondary_rules(self):
|
|
62
|
+
"""
|
|
63
|
+
Retrieves all secondary rules associated with the case template.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
QuerySet: A queryset of secondary rules.
|
|
67
|
+
"""
|
|
43
68
|
rules = self.secondary_rules.all()
|
|
44
69
|
return rules
|
|
45
70
|
|
|
46
71
|
def _assert_max_one_create_patient_rule(self):
|
|
47
|
-
"""
|
|
72
|
+
"""
|
|
73
|
+
Ensures that there is at most one rule with rule_type "create-object" and target_model "Patient".
|
|
74
|
+
|
|
75
|
+
Raises:
|
|
76
|
+
ValueError: If more than one rule of the specified type exists.
|
|
77
|
+
"""
|
|
48
78
|
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model__name="Patient")
|
|
49
79
|
if len(create_patient_rules) > 1:
|
|
50
|
-
raise ValueError(
|
|
51
|
-
|
|
80
|
+
raise ValueError(
|
|
81
|
+
"There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'."
|
|
82
|
+
)
|
|
83
|
+
|
|
52
84
|
# custom save method which runs the _assert_max_one_create_patient_rule method and others
|
|
53
85
|
def save(self, *args, **kwargs):
|
|
54
86
|
# self._assert_max_one_create_patient_rule() #TODO Fails on first save since many to many can only be used if object has an id
|
|
55
87
|
super().save(*args, **kwargs)
|
|
56
88
|
|
|
57
89
|
def get_create_patient_rule(self):
|
|
58
|
-
"""
|
|
59
|
-
|
|
90
|
+
"""
|
|
91
|
+
Retrieves the "create-patient" rule.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
CaseTemplateRule: The rule that creates a patient.
|
|
95
|
+
|
|
96
|
+
Raises:
|
|
97
|
+
ValueError: If multiple such rules exist.
|
|
60
98
|
"""
|
|
61
99
|
from endoreg_db.models.case_template.case_template_rule import CaseTemplateRule
|
|
62
100
|
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model="Patient")
|
|
@@ -67,8 +105,14 @@ class CaseTemplate(models.Model):
|
|
|
67
105
|
return create_patient_rules[0]
|
|
68
106
|
|
|
69
107
|
def get_create_patient_medication_schedule_rule(self):
|
|
70
|
-
"""
|
|
71
|
-
|
|
108
|
+
"""
|
|
109
|
+
Retrieves the "create-patient_medication_schedule" rule.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
CaseTemplateRule: The rule for creating a patient medication schedule.
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
ValueError: If multiple such rules exist.
|
|
72
116
|
"""
|
|
73
117
|
from endoreg_db.models.case_template.case_template_rule import CaseTemplateRule
|
|
74
118
|
create_patient_medication_schedule_rules = self.rules.filter(rule_type__name="create-object", target_model="PatientMedicationSchedule")
|
|
@@ -6,12 +6,13 @@ class CaseTemplateRuleTypeManager(models.Manager):
|
|
|
6
6
|
|
|
7
7
|
class CaseTemplateRuleType(models.Model):
|
|
8
8
|
"""
|
|
9
|
-
|
|
9
|
+
Represents a type of rule for a case template.
|
|
10
10
|
|
|
11
11
|
Attributes:
|
|
12
|
-
name (str): The name of the
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
name (str): The name of the rule type.
|
|
13
|
+
name_de (str): The German name of the rule type.
|
|
14
|
+
name_en (str): The English name of the rule type.
|
|
15
|
+
description (str): A description of the rule type.
|
|
15
16
|
"""
|
|
16
17
|
name = models.CharField(max_length=255)
|
|
17
18
|
name_de = models.CharField(max_length=255, null=True)
|
|
@@ -50,7 +51,6 @@ class CaseTemplateRule(models.Model):
|
|
|
50
51
|
|
|
51
52
|
Attributes:
|
|
52
53
|
name (str): The name of the case template rule.
|
|
53
|
-
case_template (CaseTemplate): The case template to which the rule belongs.
|
|
54
54
|
description (str): A description of the case template rule.
|
|
55
55
|
name_de (str): The name of the case template rule in German.
|
|
56
56
|
name_en (str): The name of the case template rule in English.
|
|
@@ -40,12 +40,14 @@ class CaseTemplateRuleValueManager(models.Manager):
|
|
|
40
40
|
|
|
41
41
|
class CaseTemplateRuleValue(models.Model):
|
|
42
42
|
"""
|
|
43
|
-
|
|
43
|
+
Represents a case template rule value.
|
|
44
44
|
|
|
45
45
|
Attributes:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
name (str): The name of the rule value.
|
|
47
|
+
description (str): A description of the rule value.
|
|
48
|
+
fk_value (str): Foreign key value stored as a string.
|
|
49
|
+
numeric_value (float): Numeric value for the rule.
|
|
50
|
+
text_value (str): Text value for the rule.
|
|
49
51
|
"""
|
|
50
52
|
objects = CaseTemplateRuleValueManager()
|
|
51
53
|
|
|
@@ -57,12 +59,25 @@ class CaseTemplateRuleValue(models.Model):
|
|
|
57
59
|
text_value = models.CharField(max_length=255, null=True, blank=True)
|
|
58
60
|
|
|
59
61
|
def natural_key(self):
|
|
62
|
+
"""
|
|
63
|
+
Returns the natural key for the object.
|
|
64
|
+
"""
|
|
60
65
|
return (self.name,)
|
|
61
66
|
|
|
62
67
|
def __str__(self):
|
|
68
|
+
"""
|
|
69
|
+
String representation of the object.
|
|
70
|
+
"""
|
|
63
71
|
return self.name
|
|
64
72
|
|
|
65
73
|
def get_value(self):
|
|
74
|
+
"""
|
|
75
|
+
Retrieves the value based on priority:
|
|
76
|
+
- fk_value > numeric_value > text_value > None.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
str | float | None: The value based on the type hierarchy.
|
|
80
|
+
"""
|
|
66
81
|
if self.fk_value:
|
|
67
82
|
return self.fk_value
|
|
68
83
|
elif self.numeric_value:
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
from django.db import models
|
|
2
2
|
|
|
3
|
+
|
|
3
4
|
class CenterManager(models.Manager):
|
|
4
5
|
def get_by_natural_key(self, name):
|
|
5
6
|
return self.get(name=name)
|
|
6
7
|
|
|
8
|
+
|
|
7
9
|
class Center(models.Model):
|
|
8
10
|
objects = CenterManager()
|
|
9
11
|
|
|
@@ -13,13 +15,37 @@ class Center(models.Model):
|
|
|
13
15
|
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
14
16
|
|
|
15
17
|
first_names = models.ManyToManyField(
|
|
16
|
-
|
|
17
|
-
related_name=
|
|
18
|
+
"FirstName",
|
|
19
|
+
related_name="centers",
|
|
18
20
|
)
|
|
19
|
-
last_names = models.ManyToManyField(
|
|
21
|
+
last_names = models.ManyToManyField("LastName", related_name="centers")
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def get_by_name(cls, name):
|
|
25
|
+
return cls.objects.get(name=name)
|
|
20
26
|
|
|
21
27
|
def natural_key(self):
|
|
22
28
|
return (self.name,)
|
|
23
|
-
|
|
29
|
+
|
|
24
30
|
def __str__(self):
|
|
25
|
-
return self.name
|
|
31
|
+
return self.name
|
|
32
|
+
|
|
33
|
+
def get_first_names(self):
|
|
34
|
+
from endoreg_db.models import FirstName
|
|
35
|
+
|
|
36
|
+
names = FirstName.objects.filter(centers=self)
|
|
37
|
+
return names
|
|
38
|
+
|
|
39
|
+
def get_last_names(self):
|
|
40
|
+
from endoreg_db.models import LastName
|
|
41
|
+
|
|
42
|
+
names = LastName.objects.filter(centers=self)
|
|
43
|
+
return names
|
|
44
|
+
|
|
45
|
+
def get_endoscopes(self):
|
|
46
|
+
from endoreg_db.models import Endoscope
|
|
47
|
+
|
|
48
|
+
endoscopes = Endoscope.objects.filter(center=self)
|
|
49
|
+
return endoscopes
|
|
50
|
+
|
|
51
|
+
# def get_endoscopy_processor
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from os import name
|
|
2
1
|
from django.db import models
|
|
3
2
|
|
|
4
3
|
class CenterResource(models.Model):
|
|
@@ -16,4 +15,19 @@ class CenterResource(models.Model):
|
|
|
16
15
|
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
17
16
|
|
|
18
17
|
def __str__(self):
|
|
19
|
-
|
|
18
|
+
result_string = ""
|
|
19
|
+
|
|
20
|
+
if self.name is not None:
|
|
21
|
+
result_string += self.name + ":\n"
|
|
22
|
+
|
|
23
|
+
result_string += "\tCenter\t-\t" + str(self.center) + "\n"
|
|
24
|
+
result_string += "\tResource\t-\t" + str(self.resource) + "\n"
|
|
25
|
+
result_string += "\tQuantity\t-\t" + str(self.quantity) + "\n"
|
|
26
|
+
result_string += "\tYear\t-\t" + str(self.year) + "\n"
|
|
27
|
+
result_string += "\tUnit\t-\t" + str(self.unit) + "\n"
|
|
28
|
+
result_string += "\tTransport Emission Factor\t-\t" + str(self.transport_emission_factor) + "\n"
|
|
29
|
+
result_string += "\tUse Emission Factor\t-\t" + str(self.use_emission_factor) + "\n"
|
|
30
|
+
|
|
31
|
+
result_string += "\n"
|
|
32
|
+
|
|
33
|
+
return result_string
|
|
@@ -8,4 +8,9 @@ class CenterWaste(models.Model):
|
|
|
8
8
|
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
9
9
|
emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
|
|
12
|
+
def __str__(self):
|
|
13
|
+
result = f"{self.quantity} {self.unit}"
|
|
14
|
+
result += f" -\t{self.waste}, EmissionFactor: {self.emission_factor}\t\t- {self.center} - {self.year}"
|
|
15
|
+
|
|
16
|
+
return result
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class ContraindicationManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class Contraindication(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
|
+
objects = ContraindicationManager()
|
|
16
|
+
|
|
17
|
+
def natural_key(self):
|
|
18
|
+
return (self.name,)
|
|
19
|
+
|
|
20
|
+
def __str__(self):
|
|
21
|
+
return self.name
|
|
@@ -1,6 +1,39 @@
|
|
|
1
|
-
from .frame import Frame,
|
|
1
|
+
from .frame import Frame, RawFrame
|
|
2
2
|
from .report_file import ReportFile
|
|
3
|
-
from .video import Video,
|
|
4
|
-
from .video_segment import
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
from .video import Video, VideoImportMeta
|
|
4
|
+
from .video_segment import (
|
|
5
|
+
LabelVideoSegment,
|
|
6
|
+
LabelRawVideoSegment,
|
|
7
|
+
find_segments_in_prediction_array,
|
|
8
|
+
)
|
|
9
|
+
from .metadata import (
|
|
10
|
+
SensitiveMeta,
|
|
11
|
+
PdfMeta,
|
|
12
|
+
PdfType,
|
|
13
|
+
VideoMeta,
|
|
14
|
+
FFMpegMeta,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
from .import_classes import (
|
|
18
|
+
RawPdfFile,
|
|
19
|
+
RawVideoFile,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"Frame",
|
|
25
|
+
"ReportFile",
|
|
26
|
+
"Video",
|
|
27
|
+
"LabelVideoSegment",
|
|
28
|
+
"LabelRawVideoSegment",
|
|
29
|
+
"find_segments_in_prediction_array",
|
|
30
|
+
"SensitiveMeta",
|
|
31
|
+
"PdfMeta",
|
|
32
|
+
"PdfType",
|
|
33
|
+
"RawFrame",
|
|
34
|
+
"VideoMeta",
|
|
35
|
+
"FFMpegMeta",
|
|
36
|
+
"VideoImportMeta",
|
|
37
|
+
"RawPdfFile",
|
|
38
|
+
"RawVideoFile",
|
|
39
|
+
]
|