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,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
- A class representing an image classification annotation.
11
+ Represents an image classification annotation.
6
12
 
7
13
  Attributes:
8
- label (str): The label that was assigned to the image.
9
- confidence (float): The confidence that the label is correct.
10
- annotator (User): The user that created this annotation.
11
- date (datetime.datetime): The date and time when this annotation was created.
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("Frame", on_delete=models.CASCADE, blank=True, null=True, related_name="image_classification_annotations")
16
- legacy_frame = models.ForeignKey("LegacyFrame", on_delete=models.CASCADE, blank=True, null=True, related_name="image_classification_annotations")
17
- legacy_image = models.ForeignKey("LegacyImage", on_delete=models.CASCADE, blank=True, null=True, related_name="image_classification_annotations")
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("Label", on_delete=models.CASCADE, related_name="image_classification_annotations")
41
+ label = models.ForeignKey(
42
+ "Label",
43
+ on_delete=models.CASCADE,
44
+ related_name="image_classification_annotations",
45
+ )
20
46
  value = models.BooleanField()
21
- annotator = models.CharField(max_length=255)
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 __str__(self):
26
- return self.label.name + " - " + str(self.value)
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
- A class representing a case template.
9
+ Represents a case template.
10
10
 
11
11
  Attributes:
12
- name (str): The name of the case template. This is the natural key.
13
- case_template_type (CaseTemplateType): The type of the case template.
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
- rules = self.rules.all()
40
- return rules
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
- """Asserts that there is at most one rule with the rule_type__name "create-object" and target_model__name "Patient"."""
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("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'.")
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
- """Filter the rules for the rule which has the rule_type__name "create-object" and target_model__name "Patient".
59
- Also makes sure, that only 1 is returned. If there is no such rule, get default create patient rule.
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
- """Filter the rules for the rule which has the rule_type__name "create-object" and target_model__name "PatientMedicationSchedule".
71
- Also makes sure, that only 1 is returned. If there is no such rule, get default create patient medication schedule rule.
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
- A class representing a case template rule type.
9
+ Represents a type of rule for a case template.
10
10
 
11
11
  Attributes:
12
- name (str): The name of the case template rule type.
13
- description (str): A description of the case template rule type.
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
- A class representing a case template rule value.
43
+ Represents a case template rule value.
44
44
 
45
45
  Attributes:
46
- value (str): The value of the case template rule value.
47
- case_template_rule (CaseTemplateRule): The case template rule of the case template rule value.
48
- case_template (CaseTemplate): The case template of the case template rule value.
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:
@@ -2,3 +2,10 @@ from .center import Center
2
2
  from .center_product import CenterProduct
3
3
  from .center_resource import CenterResource
4
4
  from .center_waste import CenterWaste
5
+
6
+ __all__ = [
7
+ 'Center',
8
+ 'CenterProduct',
9
+ 'CenterResource',
10
+ 'CenterWaste'
11
+ ]
@@ -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
- 'FirstName',
17
- related_name='centers',
18
+ "FirstName",
19
+ related_name="centers",
18
20
  )
19
- last_names = models.ManyToManyField('LastName', related_name='centers')
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 itertools import product
2
1
  from django.db import models
3
2
 
4
3
  class CenterProduct(models.Model):
@@ -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
- return self.center.name + " - " + self.resource.name + " (" + str(self.year) + ")"
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, LegacyFrame
1
+ from .frame import Frame, RawFrame
2
2
  from .report_file import ReportFile
3
- from .video import Video, LegacyVideo, VideoImportMeta
4
- from .video_segment import LegacyLabelVideoSegment, LabelVideoSegment
5
- from .metadata import *
6
- from .import_classes import *
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
+ ]
@@ -1,2 +1,7 @@
1
1
  from .abstract_frame import AbstractFrame
2
- from .abstract_video import AbstractVideo
2
+ from .abstract_video import AbstractVideoFile
3
+
4
+ __all__ = [
5
+ "AbstractFrame",
6
+ "AbstractVideoFile",
7
+ ]