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.

Files changed (268) hide show
  1. endoreg_db/admin.py +90 -1
  2. endoreg_db/case_generator/case_generator.py +159 -0
  3. endoreg_db/case_generator/lab_sample_factory.py +33 -0
  4. endoreg_db/case_generator/utils.py +30 -0
  5. endoreg_db/data/__init__.py +50 -4
  6. endoreg_db/data/ai_model/data.yaml +7 -0
  7. endoreg_db/data/{label → ai_model_label}/label/data.yaml +27 -1
  8. endoreg_db/data/ai_model_label/label-set/data.yaml +21 -0
  9. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +5 -0
  10. endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
  11. endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
  12. endoreg_db/data/center/data.yaml +35 -5
  13. endoreg_db/data/contraindication/bleeding.yaml +11 -0
  14. endoreg_db/data/distribution/numeric/data.yaml +14 -0
  15. endoreg_db/data/endoscope/data.yaml +93 -0
  16. endoreg_db/data/examination_indication/endoscopy.yaml +8 -0
  17. endoreg_db/data/examination_indication_classification/endoscopy.yaml +8 -0
  18. endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
  19. endoreg_db/data/finding/data.yaml +141 -0
  20. endoreg_db/data/finding_intervention/endoscopy.yaml +138 -0
  21. endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
  22. endoreg_db/data/finding_location_classification/colonoscopy.yaml +46 -0
  23. endoreg_db/data/finding_location_classification_choice/colonoscopy.yaml +240 -0
  24. endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +48 -0
  25. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_circularity_default.yaml +34 -0
  26. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_nice.yaml +20 -0
  27. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_paris.yaml +65 -0
  28. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_planarity_default.yaml +56 -0
  29. endoreg_db/data/finding_morphology_classification_choice/colon_lesion_surface_intact_default.yaml +39 -0
  30. endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +57 -0
  31. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
  32. endoreg_db/data/finding_type/data.yaml +30 -0
  33. endoreg_db/data/gender/data.yaml +17 -0
  34. endoreg_db/data/lab_value/cardiac_enzymes.yaml +7 -1
  35. endoreg_db/data/lab_value/coagulation.yaml +6 -1
  36. endoreg_db/data/lab_value/electrolytes.yaml +39 -1
  37. endoreg_db/data/lab_value/gastrointestinal_function.yaml +12 -0
  38. endoreg_db/data/lab_value/hematology.yaml +17 -2
  39. endoreg_db/data/lab_value/hormones.yaml +6 -0
  40. endoreg_db/data/lab_value/lipids.yaml +12 -3
  41. endoreg_db/data/lab_value/misc.yaml +5 -2
  42. endoreg_db/data/lab_value/renal_function.yaml +2 -1
  43. endoreg_db/data/lx_client_tag/base.yaml +54 -0
  44. endoreg_db/data/lx_client_type/base.yaml +30 -0
  45. endoreg_db/data/lx_permission/base.yaml +24 -0
  46. endoreg_db/data/lx_permission/endoreg.yaml +52 -0
  47. endoreg_db/data/medication_indication/anticoagulation.yaml +44 -49
  48. endoreg_db/data/names_first/first_names.yaml +51 -0
  49. endoreg_db/data/names_last/last_names.yaml +51 -0
  50. endoreg_db/data/network_device/data.yaml +30 -0
  51. endoreg_db/data/organ/data.yaml +29 -0
  52. endoreg_db/data/pdf_type/data.yaml +2 -1
  53. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +4 -0
  54. endoreg_db/forms/__init__.py +3 -1
  55. endoreg_db/forms/examination_form.py +11 -0
  56. endoreg_db/forms/patient_finding_intervention_form.py +19 -0
  57. endoreg_db/forms/patient_form.py +26 -0
  58. endoreg_db/management/commands/__init__.py +0 -0
  59. endoreg_db/management/commands/load_ai_model_data.py +57 -23
  60. endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
  61. endoreg_db/management/commands/load_base_db_data.py +160 -118
  62. endoreg_db/management/commands/{load_endoscope_type_data.py → load_contraindication_data.py} +3 -7
  63. endoreg_db/management/commands/load_disease_data.py +29 -7
  64. endoreg_db/management/commands/load_endoscope_data.py +68 -0
  65. endoreg_db/management/commands/load_examination_indication_data.py +65 -0
  66. endoreg_db/management/commands/load_finding_data.py +171 -0
  67. endoreg_db/management/commands/load_lab_value_data.py +3 -3
  68. endoreg_db/management/commands/load_lx_data.py +64 -0
  69. endoreg_db/management/commands/load_medication_data.py +83 -21
  70. endoreg_db/management/commands/load_name_data.py +37 -0
  71. endoreg_db/management/commands/{load_endoscopy_processor_data.py → load_organ_data.py} +7 -9
  72. endoreg_db/migrations/0001_initial.py +1206 -728
  73. endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +23 -0
  74. endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +23 -0
  75. endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +25 -0
  76. endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +33 -0
  77. endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +23 -0
  78. endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +24 -0
  79. endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +48 -0
  80. endoreg_db/models/__init__.py +331 -28
  81. endoreg_db/models/ai_model/__init__.py +1 -0
  82. endoreg_db/models/ai_model/ai_model.py +103 -0
  83. endoreg_db/models/ai_model/lightning/__init__.py +3 -0
  84. endoreg_db/models/ai_model/lightning/inference_dataset.py +53 -0
  85. endoreg_db/models/ai_model/lightning/multilabel_classification_net.py +155 -0
  86. endoreg_db/models/ai_model/lightning/postprocess.py +53 -0
  87. endoreg_db/models/ai_model/lightning/predict.py +172 -0
  88. endoreg_db/models/ai_model/lightning/prediction_visualizer.py +55 -0
  89. endoreg_db/models/ai_model/lightning/preprocess.py +68 -0
  90. endoreg_db/models/ai_model/lightning/run_visualizer.py +21 -0
  91. endoreg_db/models/ai_model/model_meta.py +232 -6
  92. endoreg_db/models/ai_model/model_type.py +13 -3
  93. endoreg_db/models/annotation/__init__.py +31 -2
  94. endoreg_db/models/annotation/anonymized_image_annotation.py +73 -18
  95. endoreg_db/models/annotation/binary_classification_annotation_task.py +94 -57
  96. endoreg_db/models/annotation/image_classification.py +73 -14
  97. endoreg_db/models/annotation/video_segmentation_annotation.py +52 -0
  98. endoreg_db/models/annotation/video_segmentation_labelset.py +20 -0
  99. endoreg_db/models/case/__init__.py +1 -0
  100. endoreg_db/models/{persons/patient/case → case}/case.py +4 -0
  101. endoreg_db/models/case_template/__init__.py +10 -1
  102. endoreg_db/models/case_template/case_template.py +57 -13
  103. endoreg_db/models/case_template/case_template_rule.py +5 -5
  104. endoreg_db/models/case_template/case_template_rule_value.py +19 -4
  105. endoreg_db/models/center/__init__.py +7 -0
  106. endoreg_db/models/center/center.py +31 -5
  107. endoreg_db/models/center/center_product.py +0 -1
  108. endoreg_db/models/center/center_resource.py +16 -2
  109. endoreg_db/models/center/center_waste.py +6 -1
  110. endoreg_db/models/contraindication/__init__.py +21 -0
  111. endoreg_db/models/data_file/__init__.py +38 -5
  112. endoreg_db/models/data_file/base_classes/__init__.py +6 -1
  113. endoreg_db/models/data_file/base_classes/abstract_frame.py +64 -15
  114. endoreg_db/models/data_file/base_classes/abstract_pdf.py +136 -0
  115. endoreg_db/models/data_file/base_classes/abstract_video.py +744 -138
  116. endoreg_db/models/data_file/base_classes/frame_helpers.py +17 -0
  117. endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +19 -0
  118. endoreg_db/models/data_file/base_classes/utils.py +80 -0
  119. endoreg_db/models/data_file/frame.py +22 -38
  120. endoreg_db/models/data_file/import_classes/__init__.py +4 -18
  121. endoreg_db/models/data_file/import_classes/raw_pdf.py +162 -90
  122. endoreg_db/models/data_file/import_classes/raw_video.py +239 -294
  123. endoreg_db/models/data_file/metadata/__init__.py +10 -0
  124. endoreg_db/models/data_file/metadata/pdf_meta.py +4 -0
  125. endoreg_db/models/data_file/metadata/sensitive_meta.py +265 -6
  126. endoreg_db/models/data_file/metadata/video_meta.py +116 -50
  127. endoreg_db/models/data_file/report_file.py +30 -63
  128. endoreg_db/models/data_file/video/__init__.py +6 -2
  129. endoreg_db/models/data_file/video/video.py +187 -16
  130. endoreg_db/models/data_file/video_segment.py +162 -55
  131. endoreg_db/models/disease.py +25 -2
  132. endoreg_db/models/emission/__init__.py +5 -1
  133. endoreg_db/models/emission/emission_factor.py +71 -6
  134. endoreg_db/models/event.py +51 -0
  135. endoreg_db/models/examination/__init__.py +6 -1
  136. endoreg_db/models/examination/examination.py +53 -12
  137. endoreg_db/models/examination/examination_indication.py +170 -0
  138. endoreg_db/models/examination/examination_time.py +31 -5
  139. endoreg_db/models/examination/examination_time_type.py +28 -4
  140. endoreg_db/models/examination/examination_type.py +28 -6
  141. endoreg_db/models/finding/__init__.py +11 -0
  142. endoreg_db/models/finding/finding.py +75 -0
  143. endoreg_db/models/finding/finding_intervention.py +60 -0
  144. endoreg_db/models/finding/finding_location_classification.py +94 -0
  145. endoreg_db/models/finding/finding_morphology_classification.py +89 -0
  146. endoreg_db/models/finding/finding_type.py +22 -0
  147. endoreg_db/models/hardware/endoscope.py +16 -0
  148. endoreg_db/models/hardware/endoscopy_processor.py +31 -19
  149. endoreg_db/models/label/label.py +35 -7
  150. endoreg_db/models/laboratory/lab_value.py +12 -3
  151. endoreg_db/models/logging/__init__.py +8 -1
  152. endoreg_db/models/lx/__init__.py +4 -0
  153. endoreg_db/models/lx/client.py +57 -0
  154. endoreg_db/models/lx/identity.py +34 -0
  155. endoreg_db/models/lx/permission.py +18 -0
  156. endoreg_db/models/lx/user.py +16 -0
  157. endoreg_db/models/medication/__init__.py +19 -1
  158. endoreg_db/models/medication/medication.py +7 -122
  159. endoreg_db/models/medication/medication_indication.py +50 -0
  160. endoreg_db/models/medication/medication_indication_type.py +34 -0
  161. endoreg_db/models/medication/medication_intake_time.py +26 -0
  162. endoreg_db/models/medication/medication_schedule.py +37 -0
  163. endoreg_db/models/network/__init__.py +7 -1
  164. endoreg_db/models/network/network_device.py +13 -8
  165. endoreg_db/models/organ/__init__.py +38 -0
  166. endoreg_db/models/other/__init__.py +19 -1
  167. endoreg_db/models/other/distribution/__init__.py +44 -0
  168. endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
  169. endoreg_db/models/other/distribution/date_value_distribution.py +91 -0
  170. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
  171. endoreg_db/models/other/distribution/numeric_value_distribution.py +97 -0
  172. endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
  173. endoreg_db/models/other/distribution.py +1 -211
  174. endoreg_db/models/other/material.py +4 -0
  175. endoreg_db/models/other/transport_route.py +2 -1
  176. endoreg_db/models/patient/__init__.py +24 -0
  177. endoreg_db/models/patient/patient_examination.py +182 -0
  178. endoreg_db/models/patient/patient_finding.py +143 -0
  179. endoreg_db/models/patient/patient_finding_intervention.py +26 -0
  180. endoreg_db/models/patient/patient_finding_location.py +120 -0
  181. endoreg_db/models/patient/patient_finding_morphology.py +166 -0
  182. endoreg_db/models/persons/__init__.py +29 -2
  183. endoreg_db/models/persons/examiner/examiner.py +48 -4
  184. endoreg_db/models/persons/patient/__init__.py +1 -1
  185. endoreg_db/models/persons/patient/patient.py +227 -54
  186. endoreg_db/models/persons/patient/patient_disease.py +6 -0
  187. endoreg_db/models/persons/patient/patient_event.py +31 -1
  188. endoreg_db/models/persons/patient/patient_examination_indication.py +32 -0
  189. endoreg_db/models/persons/patient/patient_lab_sample.py +4 -2
  190. endoreg_db/models/persons/patient/patient_lab_value.py +37 -16
  191. endoreg_db/models/persons/patient/patient_medication.py +27 -12
  192. endoreg_db/models/persons/patient/patient_medication_schedule.py +62 -2
  193. endoreg_db/models/prediction/__init__.py +7 -1
  194. endoreg_db/models/prediction/image_classification.py +20 -6
  195. endoreg_db/models/prediction/video_prediction_meta.py +151 -89
  196. endoreg_db/models/product/__init__.py +10 -1
  197. endoreg_db/models/product/product.py +15 -2
  198. endoreg_db/models/product/product_group.py +8 -0
  199. endoreg_db/models/product/product_material.py +4 -0
  200. endoreg_db/models/product/product_weight.py +12 -0
  201. endoreg_db/models/product/reference_product.py +19 -3
  202. endoreg_db/models/quiz/__init__.py +8 -1
  203. endoreg_db/models/report_reader/__init__.py +6 -1
  204. endoreg_db/serializers/__init__.py +1 -1
  205. endoreg_db/serializers/annotation.py +2 -5
  206. endoreg_db/serializers/frame.py +1 -5
  207. endoreg_db/serializers/patient.py +26 -3
  208. endoreg_db/serializers/prediction.py +2 -7
  209. endoreg_db/serializers/raw_video_meta_validation.py +13 -0
  210. endoreg_db/serializers/video.py +6 -13
  211. endoreg_db/serializers/video_segmentation.py +492 -0
  212. endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
  213. endoreg_db/templates/admin/start_examination.html +12 -0
  214. endoreg_db/templates/timeline.html +176 -0
  215. endoreg_db/urls.py +173 -0
  216. endoreg_db/utils/__init__.py +36 -1
  217. endoreg_db/utils/dataloader.py +45 -19
  218. endoreg_db/utils/dates.py +39 -0
  219. endoreg_db/utils/hashs.py +122 -4
  220. endoreg_db/utils/names.py +74 -0
  221. endoreg_db/utils/parse_and_generate_yaml.py +46 -0
  222. endoreg_db/utils/pydantic_models/__init__.py +6 -0
  223. endoreg_db/utils/pydantic_models/db_config.py +57 -0
  224. endoreg_db/utils/validate_endo_roi.py +19 -0
  225. endoreg_db/utils/validate_subcategory_dict.py +91 -0
  226. endoreg_db/utils/video/__init__.py +13 -0
  227. endoreg_db/utils/video/extract_frames.py +121 -0
  228. endoreg_db/utils/video/transcode_videofile.py +111 -0
  229. endoreg_db/views/__init__.py +2 -0
  230. endoreg_db/views/csrf.py +7 -0
  231. endoreg_db/views/patient_views.py +90 -0
  232. endoreg_db/views/raw_video_meta_validation_views.py +38 -0
  233. endoreg_db/views/report_views.py +96 -0
  234. endoreg_db/views/video_segmentation_views.py +149 -0
  235. endoreg_db/views/views_for_timeline.py +46 -0
  236. endoreg_db/views.py +0 -3
  237. endoreg_db-0.6.1.dist-info/METADATA +151 -0
  238. endoreg_db-0.6.1.dist-info/RECORD +420 -0
  239. {endoreg_db-0.5.3.dist-info → endoreg_db-0.6.1.dist-info}/WHEEL +1 -1
  240. endoreg_db/data/active_model/data.yaml +0 -3
  241. endoreg_db/data/label/label-set/data.yaml +0 -18
  242. endoreg_db/management/commands/delete_legacy_images.py +0 -19
  243. endoreg_db/management/commands/delete_legacy_videos.py +0 -17
  244. endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
  245. endoreg_db/management/commands/import_legacy_images.py +0 -94
  246. endoreg_db/management/commands/import_legacy_videos.py +0 -76
  247. endoreg_db/management/commands/load_label_data.py +0 -67
  248. endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
  249. endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
  250. endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
  251. endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
  252. endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
  253. endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
  254. endoreg_db/migrations/0008_networkdevicelogentry_aglnet_ip_and_more.py +0 -28
  255. endoreg_db/migrations/0009_alter_networkdevicelogentry_vpn_service_status.py +0 -18
  256. endoreg_db/migrations/0010_remove_networkdevicelogentry_hostname.py +0 -17
  257. endoreg_db/models/legacy_data/__init__.py +0 -3
  258. endoreg_db/models/legacy_data/image.py +0 -34
  259. endoreg_db/models/patient_examination/__init__.py +0 -35
  260. endoreg_db/utils/video_metadata.py +0 -87
  261. endoreg_db-0.5.3.dist-info/METADATA +0 -28
  262. endoreg_db-0.5.3.dist-info/RECORD +0 -319
  263. /endoreg_db/{models/persons/patient/case → case_generator}/__init__.py +0 -0
  264. /endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +0 -0
  265. /endoreg_db/data/{model_type → ai_model_type}/data.yaml +0 -0
  266. /endoreg_db/{data/distribution/numeric/.init → management/__init__.py} +0 -0
  267. /endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +0 -0
  268. {endoreg_db-0.5.3.dist-info → endoreg_db-0.6.1.dist-info}/licenses/LICENSE +0 -0
@@ -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
- def get_by_natural_key(self, name):
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('ExaminationType', blank=True)
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
- class Meta:
23
- verbose_name = 'Examination'
24
- verbose_name_plural = 'Examinations'
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
- def get_by_natural_key(self, name):
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
- def get_by_natural_key(self, name):
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
- def get_by_natural_key(self, name):
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
- return self.name_en
15
-
16
- def natural_key(self):
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