endoreg-db 0.3.5__py3-none-any.whl → 0.3.6__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.
Files changed (341) hide show
  1. endoreg_db/admin.py +3 -3
  2. endoreg_db/apps.py +6 -6
  3. endoreg_db/data/__init__.py +64 -64
  4. endoreg_db/data/active_model/data.yaml +2 -2
  5. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -167
  6. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +7 -7
  7. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +8 -8
  8. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +22 -22
  9. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +18 -18
  10. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +18 -18
  11. endoreg_db/data/case_template/rule/19_create_patient.yaml +16 -16
  12. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -35
  13. endoreg_db/data/case_template/rule_value_type/base_types.yaml +58 -58
  14. endoreg_db/data/case_template/template/base.yaml +7 -7
  15. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +2 -2
  16. endoreg_db/data/case_template/tmp/_rule_value +13 -13
  17. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -21
  18. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +9 -9
  19. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +6 -6
  20. endoreg_db/data/center/data.yaml +59 -59
  21. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
  22. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
  23. endoreg_db/data/disease/cardiovascular.yaml +37 -37
  24. endoreg_db/data/disease/hepatology.yaml +4 -4
  25. endoreg_db/data/disease/misc.yaml +5 -5
  26. endoreg_db/data/disease/renal.yaml +4 -4
  27. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +5 -5
  28. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
  29. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +40 -40
  30. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +19 -19
  31. endoreg_db/data/distribution/date/patient.yaml +6 -6
  32. endoreg_db/data/distribution/single_categorical/patient.yaml +6 -6
  33. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -132
  34. endoreg_db/data/endoscope_type/data.yaml +10 -10
  35. endoreg_db/data/endoscopy_processor/data.yaml +45 -45
  36. endoreg_db/data/event/cardiology.yaml +27 -27
  37. endoreg_db/data/event/neurology.yaml +13 -13
  38. endoreg_db/data/event/surgery.yaml +12 -12
  39. endoreg_db/data/event/thrombembolism.yaml +19 -19
  40. endoreg_db/data/examination/examinations/data.yaml +65 -65
  41. endoreg_db/data/examination/time/data.yaml +47 -47
  42. endoreg_db/data/examination/time-type/data.yaml +7 -7
  43. endoreg_db/data/examination/type/data.yaml +5 -5
  44. endoreg_db/data/gender/data.yaml +18 -18
  45. endoreg_db/data/information_source/data.yaml +30 -30
  46. endoreg_db/data/information_source/medication.yaml +5 -5
  47. endoreg_db/data/lab_value/cardiac_enzymes.yaml +30 -30
  48. endoreg_db/data/lab_value/coagulation.yaml +48 -48
  49. endoreg_db/data/lab_value/electrolytes.yaml +189 -189
  50. endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -121
  51. endoreg_db/data/lab_value/hematology.yaml +169 -169
  52. endoreg_db/data/lab_value/hormones.yaml +53 -53
  53. endoreg_db/data/lab_value/lipids.yaml +44 -44
  54. endoreg_db/data/lab_value/misc.yaml +30 -30
  55. endoreg_db/data/lab_value/renal_function.yaml +10 -10
  56. endoreg_db/data/label/label/data.yaml +62 -62
  57. endoreg_db/data/label/label-set/data.yaml +17 -17
  58. endoreg_db/data/label/label-type/data.yaml +6 -6
  59. endoreg_db/data/medication/anticoagulation.yaml +64 -64
  60. endoreg_db/data/medication/tah.yaml +69 -69
  61. endoreg_db/data/medication_indication/anticoagulation.yaml +120 -120
  62. endoreg_db/data/medication_indication_type/data.yaml +10 -10
  63. endoreg_db/data/medication_indication_type/thrombembolism.yaml +40 -40
  64. endoreg_db/data/medication_intake_time/base.yaml +30 -30
  65. endoreg_db/data/medication_schedule/apixaban.yaml +94 -94
  66. endoreg_db/data/medication_schedule/ass.yaml +12 -12
  67. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -26
  68. endoreg_db/data/model_type/data.yaml +6 -6
  69. endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
  70. endoreg_db/data/pdf_type/data.yaml +28 -28
  71. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -66
  72. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -33
  73. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -308
  74. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -88
  75. endoreg_db/data/profession/data.yaml +70 -70
  76. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
  77. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
  78. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
  79. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
  80. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
  81. endoreg_db/data/unit/concentration.yaml +92 -92
  82. endoreg_db/data/unit/data.yaml +17 -17
  83. endoreg_db/data/unit/length.yaml +30 -30
  84. endoreg_db/data/unit/misc.yaml +19 -19
  85. endoreg_db/data/unit/rate.yaml +5 -5
  86. endoreg_db/data/unit/time.yaml +12 -12
  87. endoreg_db/data/unit/volume.yaml +35 -35
  88. endoreg_db/data/unit/weight.yaml +37 -37
  89. endoreg_db/data/waste/data.yaml +11 -11
  90. endoreg_db/forms/__init__.py +2 -2
  91. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
  92. endoreg_db/forms/settings/__init__.py +8 -8
  93. endoreg_db/forms/unit.py +5 -5
  94. endoreg_db/management/commands/_load_model_template.py +40 -40
  95. endoreg_db/management/commands/delete_all.py +18 -18
  96. endoreg_db/management/commands/delete_legacy_images.py +19 -19
  97. endoreg_db/management/commands/delete_legacy_videos.py +16 -16
  98. endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
  99. endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
  100. endoreg_db/management/commands/fix_auth_permission.py +20 -20
  101. endoreg_db/management/commands/import_legacy_images.py +94 -94
  102. endoreg_db/management/commands/import_legacy_videos.py +76 -76
  103. endoreg_db/management/commands/load_active_model_data.py +44 -44
  104. endoreg_db/management/commands/load_ai_model_data.py +44 -44
  105. endoreg_db/management/commands/load_base_db_data.py +128 -128
  106. endoreg_db/management/commands/load_center_data.py +42 -42
  107. endoreg_db/management/commands/load_disease_classification_choices_data.py +40 -40
  108. endoreg_db/management/commands/load_disease_classification_data.py +40 -40
  109. endoreg_db/management/commands/load_disease_data.py +39 -39
  110. endoreg_db/management/commands/load_distribution_data.py +65 -65
  111. endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
  112. endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
  113. endoreg_db/management/commands/load_event_data.py +40 -40
  114. endoreg_db/management/commands/load_examination_data.py +74 -74
  115. endoreg_db/management/commands/load_g_play_data.py +112 -112
  116. endoreg_db/management/commands/load_gender_data.py +43 -43
  117. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -132
  118. endoreg_db/management/commands/load_information_source.py +44 -44
  119. endoreg_db/management/commands/load_lab_value_data.py +49 -49
  120. endoreg_db/management/commands/load_label_data.py +66 -66
  121. endoreg_db/management/commands/load_medication_data.py +40 -40
  122. endoreg_db/management/commands/load_medication_indication_data.py +62 -62
  123. endoreg_db/management/commands/load_medication_indication_type_data.py +40 -40
  124. endoreg_db/management/commands/load_medication_intake_time_data.py +40 -40
  125. endoreg_db/management/commands/load_medication_schedule_data.py +54 -54
  126. endoreg_db/management/commands/load_pdf_type_data.py +60 -60
  127. endoreg_db/management/commands/load_profession_data.py +43 -43
  128. endoreg_db/management/commands/load_report_reader_flag.py +45 -45
  129. endoreg_db/management/commands/load_unit_data.py +45 -45
  130. endoreg_db/management/commands/load_user_groups.py +28 -28
  131. endoreg_db/management/commands/register_ai_model.py +65 -65
  132. endoreg_db/management/commands/reset_celery_schedule.py +9 -9
  133. endoreg_db/migrations/0001_initial.py +582 -582
  134. endoreg_db/migrations/0002_rawvideofile.py +26 -26
  135. endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -18
  136. endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -18
  137. endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -56
  138. endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -25
  139. endoreg_db/migrations/0007_rawvideofile_processor.py +19 -19
  140. endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -18
  141. endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -31
  142. endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -18
  143. endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -18
  144. endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -109
  145. endoreg_db/migrations/0013_rawpdffile.py +31 -31
  146. endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -38
  147. endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -31
  148. endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -18
  149. endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -37
  150. endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -37
  151. endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -42
  152. endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -18
  153. endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -19
  154. endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -19
  155. endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -59
  156. endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -27
  157. endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -42
  158. endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -166
  159. endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -38
  160. endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -18
  161. endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -75
  162. endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -101
  163. endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -38
  164. endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -18
  165. endoreg_db/migrations/0033_medicationindication_sources.py +18 -18
  166. endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -20
  167. endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -18
  168. endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -20
  169. endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -18
  170. endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -164
  171. endoreg_db/migrations/0039_referenceproduct_name.py +19 -19
  172. endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -50
  173. endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -40
  174. endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -74
  175. endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -23
  176. endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -23
  177. endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -19
  178. endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -18
  179. endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -18
  180. endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -22
  181. endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -17
  182. endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -18
  183. endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -27
  184. endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -18
  185. endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -38
  186. endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -69
  187. endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -59
  188. endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -32
  189. endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -72
  190. endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -28
  191. endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -18
  192. endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -44
  193. endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -24
  194. endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -18
  195. endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -18
  196. endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -23
  197. endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -58
  198. endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -29
  199. endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -19
  200. endoreg_db/models/__init__.py +74 -74
  201. endoreg_db/models/ai_model/__init__.py +3 -3
  202. endoreg_db/models/ai_model/active_model.py +9 -9
  203. endoreg_db/models/ai_model/model_meta.py +24 -24
  204. endoreg_db/models/ai_model/model_type.py +25 -25
  205. endoreg_db/models/ai_model/utils.py +8 -8
  206. endoreg_db/models/annotation/__init__.py +1 -1
  207. endoreg_db/models/annotation/binary_classification_annotation_task.py +80 -80
  208. endoreg_db/models/annotation/image_classification.py +26 -26
  209. endoreg_db/models/case_template/__init__.py +5 -5
  210. endoreg_db/models/case_template/case_template.py +81 -81
  211. endoreg_db/models/case_template/case_template_rule.py +276 -276
  212. endoreg_db/models/case_template/case_template_rule_value.py +73 -73
  213. endoreg_db/models/case_template/case_template_type.py +27 -27
  214. endoreg_db/models/center/__init__.py +4 -4
  215. endoreg_db/models/center/center.py +24 -24
  216. endoreg_db/models/center/center_product.py +33 -33
  217. endoreg_db/models/center/center_resource.py +18 -18
  218. endoreg_db/models/center/center_waste.py +10 -10
  219. endoreg_db/models/data_file/__init__.py +5 -5
  220. endoreg_db/models/data_file/base_classes/__init__.py +2 -2
  221. endoreg_db/models/data_file/base_classes/abstract_frame.py +50 -50
  222. endoreg_db/models/data_file/base_classes/abstract_video.py +200 -200
  223. endoreg_db/models/data_file/frame.py +45 -45
  224. endoreg_db/models/data_file/import_classes/__init__.py +31 -31
  225. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +34 -34
  226. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -28
  227. endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -260
  228. endoreg_db/models/data_file/import_classes/raw_pdf.py +188 -188
  229. endoreg_db/models/data_file/import_classes/raw_video.py +343 -343
  230. endoreg_db/models/data_file/metadata/__init__.py +3 -3
  231. endoreg_db/models/data_file/metadata/pdf_meta.py +70 -70
  232. endoreg_db/models/data_file/metadata/sensitive_meta.py +31 -31
  233. endoreg_db/models/data_file/metadata/video_meta.py +132 -132
  234. endoreg_db/models/data_file/report_file.py +89 -89
  235. endoreg_db/models/data_file/video/__init__.py +6 -6
  236. endoreg_db/models/data_file/video/import_meta.py +25 -25
  237. endoreg_db/models/data_file/video/video.py +25 -25
  238. endoreg_db/models/data_file/video_segment.py +107 -107
  239. endoreg_db/models/disease.py +55 -55
  240. endoreg_db/models/emission/emission_factor.py +19 -19
  241. endoreg_db/models/event.py +21 -21
  242. endoreg_db/models/examination/__init__.py +3 -3
  243. endoreg_db/models/examination/examination.py +26 -26
  244. endoreg_db/models/examination/examination_time.py +27 -27
  245. endoreg_db/models/examination/examination_time_type.py +24 -24
  246. endoreg_db/models/examination/examination_type.py +18 -18
  247. endoreg_db/models/hardware/__init__.py +1 -1
  248. endoreg_db/models/hardware/endoscope.py +44 -44
  249. endoreg_db/models/hardware/endoscopy_processor.py +143 -143
  250. endoreg_db/models/information_source.py +29 -29
  251. endoreg_db/models/label/label.py +84 -84
  252. endoreg_db/models/laboratory/lab_value.py +102 -102
  253. endoreg_db/models/legacy_data/__init__.py +3 -3
  254. endoreg_db/models/legacy_data/image.py +34 -34
  255. endoreg_db/models/medication/medication.py +148 -148
  256. endoreg_db/models/other/__init__.py +4 -4
  257. endoreg_db/models/other/distribution.py +215 -215
  258. endoreg_db/models/other/material.py +16 -16
  259. endoreg_db/models/other/resource.py +17 -17
  260. endoreg_db/models/other/transport_route.py +20 -20
  261. endoreg_db/models/other/waste.py +20 -20
  262. endoreg_db/models/patient_examination/__init__.py +35 -35
  263. endoreg_db/models/permissions/__init__.py +44 -44
  264. endoreg_db/models/persons/__init__.py +6 -6
  265. endoreg_db/models/persons/examiner/__init__.py +1 -1
  266. endoreg_db/models/persons/examiner/examiner.py +15 -15
  267. endoreg_db/models/persons/examiner/examiner_type.py +1 -1
  268. endoreg_db/models/persons/first_name.py +17 -17
  269. endoreg_db/models/persons/gender.py +22 -22
  270. endoreg_db/models/persons/last_name.py +19 -19
  271. endoreg_db/models/persons/patient/__init__.py +7 -7
  272. endoreg_db/models/persons/patient/case/case.py +30 -30
  273. endoreg_db/models/persons/patient/patient.py +216 -216
  274. endoreg_db/models/persons/patient/patient_disease.py +16 -16
  275. endoreg_db/models/persons/patient/patient_event.py +22 -22
  276. endoreg_db/models/persons/patient/patient_lab_sample.py +106 -106
  277. endoreg_db/models/persons/patient/patient_lab_value.py +176 -176
  278. endoreg_db/models/persons/patient/patient_medication.py +43 -43
  279. endoreg_db/models/persons/patient/patient_medication_schedule.py +27 -27
  280. endoreg_db/models/persons/person.py +31 -31
  281. endoreg_db/models/persons/portal_user_information.py +27 -27
  282. endoreg_db/models/prediction/__init__.py +1 -1
  283. endoreg_db/models/prediction/image_classification.py +37 -37
  284. endoreg_db/models/prediction/video_prediction_meta.py +244 -244
  285. endoreg_db/models/product/__init__.py +4 -4
  286. endoreg_db/models/product/product.py +97 -97
  287. endoreg_db/models/product/product_group.py +19 -19
  288. endoreg_db/models/product/product_material.py +24 -24
  289. endoreg_db/models/product/product_weight.py +26 -26
  290. endoreg_db/models/product/reference_product.py +99 -99
  291. endoreg_db/models/questionnaires/__init__.py +114 -114
  292. endoreg_db/models/quiz/__init__.py +1 -1
  293. endoreg_db/models/quiz/quiz_answer.py +41 -41
  294. endoreg_db/models/quiz/quiz_question.py +54 -54
  295. endoreg_db/models/report_reader/__init__.py +1 -1
  296. endoreg_db/models/report_reader/report_reader_config.py +53 -53
  297. endoreg_db/models/report_reader/report_reader_flag.py +19 -19
  298. endoreg_db/models/rules/__init__.py +4 -4
  299. endoreg_db/models/rules/rule.py +23 -23
  300. endoreg_db/models/rules/rule_applicator.py +224 -224
  301. endoreg_db/models/rules/rule_attribute_dtype.py +18 -18
  302. endoreg_db/models/rules/rule_type.py +21 -21
  303. endoreg_db/models/rules/ruleset.py +19 -19
  304. endoreg_db/models/unit.py +21 -21
  305. endoreg_db/queries/__init__.py +4 -4
  306. endoreg_db/queries/annotations/__init__.py +2 -2
  307. endoreg_db/queries/annotations/legacy.py +159 -159
  308. endoreg_db/queries/get/__init__.py +5 -5
  309. endoreg_db/queries/get/center.py +42 -42
  310. endoreg_db/queries/get/model.py +13 -13
  311. endoreg_db/queries/get/patient.py +14 -14
  312. endoreg_db/queries/get/patient_examination.py +20 -20
  313. endoreg_db/queries/get/report_file.py +33 -33
  314. endoreg_db/queries/get/video.py +31 -31
  315. endoreg_db/serializers/__init__.py +9 -9
  316. endoreg_db/serializers/ai_model.py +18 -18
  317. endoreg_db/serializers/annotation.py +17 -17
  318. endoreg_db/serializers/center.py +11 -11
  319. endoreg_db/serializers/examination.py +32 -32
  320. endoreg_db/serializers/frame.py +13 -13
  321. endoreg_db/serializers/hardware.py +20 -20
  322. endoreg_db/serializers/label.py +22 -22
  323. endoreg_db/serializers/patient.py +10 -10
  324. endoreg_db/serializers/prediction.py +15 -15
  325. endoreg_db/serializers/report_file.py +7 -7
  326. endoreg_db/serializers/video.py +27 -27
  327. endoreg_db/tests.py +3 -3
  328. endoreg_db/utils/cropping.py +28 -28
  329. endoreg_db/utils/dataloader.py +92 -92
  330. endoreg_db/utils/file_operations.py +30 -30
  331. endoreg_db/utils/hashs.py +33 -33
  332. endoreg_db/utils/legacy_ocr.py +201 -201
  333. endoreg_db/utils/ocr.py +197 -197
  334. endoreg_db/utils/uuid.py +4 -4
  335. endoreg_db/utils/video_metadata.py +87 -87
  336. endoreg_db/views.py +3 -3
  337. {endoreg_db-0.3.5.dist-info → endoreg_db-0.3.6.dist-info}/LICENSE +674 -674
  338. {endoreg_db-0.3.5.dist-info → endoreg_db-0.3.6.dist-info}/METADATA +2 -2
  339. endoreg_db-0.3.6.dist-info/RECORD +357 -0
  340. {endoreg_db-0.3.5.dist-info → endoreg_db-0.3.6.dist-info}/WHEEL +1 -1
  341. endoreg_db-0.3.5.dist-info/RECORD +0 -357
@@ -1,159 +1,159 @@
1
- from ...models import LabelSet, ImageClassificationAnnotation
2
- from django.db.models import Q, F
3
- from django.db import models
4
- from icecream import ic
5
- from tqdm import tqdm
6
- from collections import defaultdict
7
-
8
- # def get_legacy_annotations_for_labelset(labelset_name, version=None):
9
- # """
10
- # Retrieve annotations for a given label set for training.
11
-
12
- # Args:
13
- # - labelset_name (str): The name of the label set.
14
- # - version (int, optional): The version of the label set. If not specified, the latest version is fetched.
15
-
16
- # Returns:
17
- # - list[dict]: A list of dictionaries. Each dictionary represents an image and its annotations.
18
- # Format: [{"frame": <frame_object>, "annotations": [{"label": <label_name>, "value": <value>}, ...]}, ...]
19
-
20
- # Example:
21
- # annotations_for_training = get_annotations_for_labelset("YourLabelSetName", version=2)
22
-
23
- # """
24
-
25
- # # Fetch the label set based on the name and optionally the version
26
- # if version:
27
- # labelset = LabelSet.objects.get(name=labelset_name, version=version)
28
- # else:
29
- # labelset = LabelSet.objects.filter(name=labelset_name).order_by('-version').first()
30
- # if not labelset:
31
- # raise ValueError(f"No label set found with the name: {labelset_name}")
32
-
33
- # # Retrieve all labels in the label set
34
- # labels_in_set = labelset.labels.all()
35
-
36
- # # Get the most recent annotations for each frame/label combination
37
- # annotations = ImageClassificationAnnotation.objects.filter(label__in=labels_in_set)
38
- # annotations = annotations.annotate(
39
- # latest_annotation=models.Window(
40
- # expression=models.functions.RowNumber(),
41
- # partition_by=[F('legacy_image'), F('label')],
42
- # order_by=F('date_modified').desc()
43
- # )
44
- # ).filter(latest_annotation=1)
45
-
46
- # # Organize the annotations by image/frame
47
- # organized_annotations = []
48
-
49
- # for annotation in tqdm(annotations):
50
- # # ic(annotation)
51
- # # Check if the frame is already in the organized list
52
- # existing_entry = next((entry for entry in organized_annotations if entry['legacy_image'] == annotation.legacy_frame), None)
53
-
54
- # if existing_entry:
55
- # # Add this annotation to the existing frame's annotations
56
- # existing_entry['annotations'].append({
57
- # "label": annotation.label.name,
58
- # "value": annotation.value
59
- # })
60
- # else:
61
- # # Create a new entry for this frame
62
- # organized_annotations.append({
63
- # "legacy_image": annotation.legacy_image,
64
- # "annotations": [{
65
- # "label": annotation.label.name,
66
- # "value": annotation.value
67
- # }]
68
- # })
69
-
70
- # return organized_annotations
71
-
72
-
73
-
74
- def get_legacy_annotations_for_labelset(labelset_name, version=None):
75
- """
76
- ... [rest of your docstring]
77
- """
78
-
79
- # Fetch the label set based on the name and optionally the version
80
- if version:
81
- labelset = LabelSet.objects.get(name=labelset_name, version=version)
82
- else:
83
- labelset = LabelSet.objects.filter(name=labelset_name).order_by('-version').first()
84
- if not labelset:
85
- raise ValueError(f"No label set found with the name: {labelset_name}")
86
-
87
- # Retrieve all labels in the label set
88
- labels_in_set = labelset.labels.all()
89
-
90
- # Get the most recent annotations for each frame/label combination
91
- annotations = (ImageClassificationAnnotation.objects
92
- .filter(label__in=labels_in_set)
93
- .select_related('legacy_image', 'label') # Reduce number of queries
94
- .annotate(
95
- latest_annotation=models.Window(
96
- expression=models.functions.RowNumber(),
97
- partition_by=[F('legacy_image'), F('label')],
98
- order_by=F('date_modified').desc()
99
- )
100
- ).filter(latest_annotation=1))
101
-
102
- # Organize the annotations by image/frame using a defaultdict
103
- organized_annotations_dict = defaultdict(lambda: {
104
- "legacy_image": None,
105
- "annotations": []
106
- })
107
-
108
- for annotation in tqdm(annotations):
109
- organized_entry = organized_annotations_dict[annotation.legacy_image.id]
110
- organized_entry["legacy_image"] = annotation.legacy_image
111
- organized_entry["annotations"].append({
112
- "label": annotation.label.name,
113
- "value": annotation.value
114
- })
115
-
116
- # Convert organized_annotations_dict to a list
117
- organized_annotations = list(organized_annotations_dict.values())
118
-
119
- return organized_annotations
120
-
121
- def generate_legacy_dataset_output(labelset_name, version=None):
122
- """
123
- Generate an output suitable for creating PyTorch datasets.
124
-
125
- Args:
126
- - labelset_name (str): The name of the label set.
127
- - version (int, optional): The version of the label set. If not specified, the latest version is fetched.
128
-
129
- Returns:
130
- - list[dict]: A list of dictionaries, where each dictionary contains the file path and the labels.
131
- Format: [{"path": <file_path>, "labels": [<label_1_value>, <label_2_value>, ...]}, ...]
132
- - labelset[LabelSet]: The label set that was used to generate the output.
133
- """
134
-
135
- # First, retrieve the organized annotations using the previously defined function
136
- organized_annotations = get_legacy_annotations_for_labelset(labelset_name, version)
137
-
138
- # Fetch all labels from the labelset for consistent ordering
139
- labelset = LabelSet.objects.get(name=labelset_name, version=version)
140
- all_labels = labelset.get_labels_in_order()
141
-
142
- dataset_output = []
143
-
144
- for entry in organized_annotations:
145
- # Prepare a dictionary for each frame
146
- frame_data = {
147
- "path": entry['legacy_image'].image.path, # Assuming 'image' field stores the file path
148
- "labels": [-1] * len(all_labels) # Initialize with -1 for all labels
149
- }
150
-
151
- # Update the labels based on the annotations
152
- for annotation in entry['annotations']:
153
- index = next((i for i, label in enumerate(all_labels) if label.name == annotation['label']), None)
154
- if index is not None:
155
- frame_data['labels'][index] = int(annotation['value'])
156
-
157
- dataset_output.append(frame_data)
158
-
159
- return dataset_output, labelset
1
+ from ...models import LabelSet, ImageClassificationAnnotation
2
+ from django.db.models import Q, F
3
+ from django.db import models
4
+ from icecream import ic
5
+ from tqdm import tqdm
6
+ from collections import defaultdict
7
+
8
+ # def get_legacy_annotations_for_labelset(labelset_name, version=None):
9
+ # """
10
+ # Retrieve annotations for a given label set for training.
11
+
12
+ # Args:
13
+ # - labelset_name (str): The name of the label set.
14
+ # - version (int, optional): The version of the label set. If not specified, the latest version is fetched.
15
+
16
+ # Returns:
17
+ # - list[dict]: A list of dictionaries. Each dictionary represents an image and its annotations.
18
+ # Format: [{"frame": <frame_object>, "annotations": [{"label": <label_name>, "value": <value>}, ...]}, ...]
19
+
20
+ # Example:
21
+ # annotations_for_training = get_annotations_for_labelset("YourLabelSetName", version=2)
22
+
23
+ # """
24
+
25
+ # # Fetch the label set based on the name and optionally the version
26
+ # if version:
27
+ # labelset = LabelSet.objects.get(name=labelset_name, version=version)
28
+ # else:
29
+ # labelset = LabelSet.objects.filter(name=labelset_name).order_by('-version').first()
30
+ # if not labelset:
31
+ # raise ValueError(f"No label set found with the name: {labelset_name}")
32
+
33
+ # # Retrieve all labels in the label set
34
+ # labels_in_set = labelset.labels.all()
35
+
36
+ # # Get the most recent annotations for each frame/label combination
37
+ # annotations = ImageClassificationAnnotation.objects.filter(label__in=labels_in_set)
38
+ # annotations = annotations.annotate(
39
+ # latest_annotation=models.Window(
40
+ # expression=models.functions.RowNumber(),
41
+ # partition_by=[F('legacy_image'), F('label')],
42
+ # order_by=F('date_modified').desc()
43
+ # )
44
+ # ).filter(latest_annotation=1)
45
+
46
+ # # Organize the annotations by image/frame
47
+ # organized_annotations = []
48
+
49
+ # for annotation in tqdm(annotations):
50
+ # # ic(annotation)
51
+ # # Check if the frame is already in the organized list
52
+ # existing_entry = next((entry for entry in organized_annotations if entry['legacy_image'] == annotation.legacy_frame), None)
53
+
54
+ # if existing_entry:
55
+ # # Add this annotation to the existing frame's annotations
56
+ # existing_entry['annotations'].append({
57
+ # "label": annotation.label.name,
58
+ # "value": annotation.value
59
+ # })
60
+ # else:
61
+ # # Create a new entry for this frame
62
+ # organized_annotations.append({
63
+ # "legacy_image": annotation.legacy_image,
64
+ # "annotations": [{
65
+ # "label": annotation.label.name,
66
+ # "value": annotation.value
67
+ # }]
68
+ # })
69
+
70
+ # return organized_annotations
71
+
72
+
73
+
74
+ def get_legacy_annotations_for_labelset(labelset_name, version=None):
75
+ """
76
+ ... [rest of your docstring]
77
+ """
78
+
79
+ # Fetch the label set based on the name and optionally the version
80
+ if version:
81
+ labelset = LabelSet.objects.get(name=labelset_name, version=version)
82
+ else:
83
+ labelset = LabelSet.objects.filter(name=labelset_name).order_by('-version').first()
84
+ if not labelset:
85
+ raise ValueError(f"No label set found with the name: {labelset_name}")
86
+
87
+ # Retrieve all labels in the label set
88
+ labels_in_set = labelset.labels.all()
89
+
90
+ # Get the most recent annotations for each frame/label combination
91
+ annotations = (ImageClassificationAnnotation.objects
92
+ .filter(label__in=labels_in_set)
93
+ .select_related('legacy_image', 'label') # Reduce number of queries
94
+ .annotate(
95
+ latest_annotation=models.Window(
96
+ expression=models.functions.RowNumber(),
97
+ partition_by=[F('legacy_image'), F('label')],
98
+ order_by=F('date_modified').desc()
99
+ )
100
+ ).filter(latest_annotation=1))
101
+
102
+ # Organize the annotations by image/frame using a defaultdict
103
+ organized_annotations_dict = defaultdict(lambda: {
104
+ "legacy_image": None,
105
+ "annotations": []
106
+ })
107
+
108
+ for annotation in tqdm(annotations):
109
+ organized_entry = organized_annotations_dict[annotation.legacy_image.id]
110
+ organized_entry["legacy_image"] = annotation.legacy_image
111
+ organized_entry["annotations"].append({
112
+ "label": annotation.label.name,
113
+ "value": annotation.value
114
+ })
115
+
116
+ # Convert organized_annotations_dict to a list
117
+ organized_annotations = list(organized_annotations_dict.values())
118
+
119
+ return organized_annotations
120
+
121
+ def generate_legacy_dataset_output(labelset_name, version=None):
122
+ """
123
+ Generate an output suitable for creating PyTorch datasets.
124
+
125
+ Args:
126
+ - labelset_name (str): The name of the label set.
127
+ - version (int, optional): The version of the label set. If not specified, the latest version is fetched.
128
+
129
+ Returns:
130
+ - list[dict]: A list of dictionaries, where each dictionary contains the file path and the labels.
131
+ Format: [{"path": <file_path>, "labels": [<label_1_value>, <label_2_value>, ...]}, ...]
132
+ - labelset[LabelSet]: The label set that was used to generate the output.
133
+ """
134
+
135
+ # First, retrieve the organized annotations using the previously defined function
136
+ organized_annotations = get_legacy_annotations_for_labelset(labelset_name, version)
137
+
138
+ # Fetch all labels from the labelset for consistent ordering
139
+ labelset = LabelSet.objects.get(name=labelset_name, version=version)
140
+ all_labels = labelset.get_labels_in_order()
141
+
142
+ dataset_output = []
143
+
144
+ for entry in organized_annotations:
145
+ # Prepare a dictionary for each frame
146
+ frame_data = {
147
+ "path": entry['legacy_image'].image.path, # Assuming 'image' field stores the file path
148
+ "labels": [-1] * len(all_labels) # Initialize with -1 for all labels
149
+ }
150
+
151
+ # Update the labels based on the annotations
152
+ for annotation in entry['annotations']:
153
+ index = next((i for i, label in enumerate(all_labels) if label.name == annotation['label']), None)
154
+ if index is not None:
155
+ frame_data['labels'][index] = int(annotation['value'])
156
+
157
+ dataset_output.append(frame_data)
158
+
159
+ return dataset_output, labelset
@@ -1,6 +1,6 @@
1
- from .annotation import *
2
- from .center import *
3
- from .model import *
4
- from .patient import *
5
- from .patient_examination import *
1
+ from .annotation import *
2
+ from .center import *
3
+ from .model import *
4
+ from .patient import *
5
+ from .patient_examination import *
6
6
  from .video import *
@@ -1,42 +1,42 @@
1
- from endoreg_db.models import Center
2
- from typing import Optional
3
-
4
- def get_centers() -> Center:
5
- """
6
- Returns all Center objects from the database.
7
- """
8
- return Center.objects.all()
9
-
10
- def get_center_by_name(name) -> Optional[Center]:
11
- """Retrieve a Center object by its name.
12
-
13
- Args:
14
- name (str): The name of the center to retrieve.
15
-
16
- Returns:
17
- Optional[Center]: The Center object with the given name, or None if it does not exist.
18
- """
19
- return Center.objects.get(name=name)
20
-
21
- def get_center_by_id(id) -> Optional[Center]:
22
- """Retrieve a Center object by its id.
23
-
24
- Args:
25
- id (int): The id of the center to retrieve.
26
-
27
- Returns:
28
- Optional[Center]: The Center object with the given id, or None if it does not exist.
29
- """
30
- return Center.objects.get(id=id)
31
-
32
- def get_center_by_natural_key(name: str) -> Optional[Center]:
33
- """
34
- Retrieve a Center object by its natural key.
35
-
36
- Args:
37
- name: The name of the center to retrieve.
38
-
39
- Returns:
40
- The Center object with the given name, or None if it does not exist.
41
- """
42
- return Center.objects.get_by_natural_key(name=name)
1
+ from endoreg_db.models import Center
2
+ from typing import Optional
3
+
4
+ def get_centers() -> Center:
5
+ """
6
+ Returns all Center objects from the database.
7
+ """
8
+ return Center.objects.all()
9
+
10
+ def get_center_by_name(name) -> Optional[Center]:
11
+ """Retrieve a Center object by its name.
12
+
13
+ Args:
14
+ name (str): The name of the center to retrieve.
15
+
16
+ Returns:
17
+ Optional[Center]: The Center object with the given name, or None if it does not exist.
18
+ """
19
+ return Center.objects.get(name=name)
20
+
21
+ def get_center_by_id(id) -> Optional[Center]:
22
+ """Retrieve a Center object by its id.
23
+
24
+ Args:
25
+ id (int): The id of the center to retrieve.
26
+
27
+ Returns:
28
+ Optional[Center]: The Center object with the given id, or None if it does not exist.
29
+ """
30
+ return Center.objects.get(id=id)
31
+
32
+ def get_center_by_natural_key(name: str) -> Optional[Center]:
33
+ """
34
+ Retrieve a Center object by its natural key.
35
+
36
+ Args:
37
+ name: The name of the center to retrieve.
38
+
39
+ Returns:
40
+ The Center object with the given name, or None if it does not exist.
41
+ """
42
+ return Center.objects.get_by_natural_key(name=name)
@@ -1,13 +1,13 @@
1
- from endoreg_db.models import (
2
- ModelMeta,
3
- )
4
-
5
- def get_latest_model_by_name(model_name):
6
- """
7
- Expects model name. Fetches models by name from database, sorts by version and returns latest version.
8
- """
9
- models = ModelMeta.objects.filter(name=model_name).order_by('-version')
10
- if len(models) == 0:
11
- return None
12
- else:
13
- return models[0]
1
+ from endoreg_db.models import (
2
+ ModelMeta,
3
+ )
4
+
5
+ def get_latest_model_by_name(model_name):
6
+ """
7
+ Expects model name. Fetches models by name from database, sorts by version and returns latest version.
8
+ """
9
+ models = ModelMeta.objects.filter(name=model_name).order_by('-version')
10
+ if len(models) == 0:
11
+ return None
12
+ else:
13
+ return models[0]
@@ -1,14 +1,14 @@
1
- from endoreg_db.models import Patient
2
-
3
- def get_patients() -> Patient:
4
- """
5
- Returns all Patient objects from the database.
6
- """
7
- return Patient.objects.all()
8
-
9
- def get_patients_without_dob() -> Patient:
10
- """
11
- Returns all Patient objects from the database without a date of birth.
12
- """
13
- return Patient.objects.filter(dob__isnull=True)
14
-
1
+ from endoreg_db.models import Patient
2
+
3
+ def get_patients() -> Patient:
4
+ """
5
+ Returns all Patient objects from the database.
6
+ """
7
+ return Patient.objects.all()
8
+
9
+ def get_patients_without_dob() -> Patient:
10
+ """
11
+ Returns all Patient objects from the database without a date of birth.
12
+ """
13
+ return Patient.objects.filter(dob__isnull=True)
14
+
@@ -1,20 +1,20 @@
1
- from endoreg_db.models import PatientExamination
2
- from typing import Optional
3
-
4
- def get_patient_examinations() -> PatientExamination:
5
- """
6
- Returns all PatientExamination objects from the database.
7
- """
8
- return PatientExamination.objects.all()
9
-
10
- def get_patient_examinations_without_report_file() -> PatientExamination:
11
- """
12
- Returns all PatientExamination objects from the database without a report_file.
13
- """
14
- return PatientExamination.objects.filter(report_file__isnull=True)
15
-
16
- def get_patient_examinations_without_video() -> PatientExamination:
17
- """
18
- Returns all PatientExamination objects from the database without a video.
19
- """
20
- return PatientExamination.objects.filter(video__isnull=True)
1
+ from endoreg_db.models import PatientExamination
2
+ from typing import Optional
3
+
4
+ def get_patient_examinations() -> PatientExamination:
5
+ """
6
+ Returns all PatientExamination objects from the database.
7
+ """
8
+ return PatientExamination.objects.all()
9
+
10
+ def get_patient_examinations_without_report_file() -> PatientExamination:
11
+ """
12
+ Returns all PatientExamination objects from the database without a report_file.
13
+ """
14
+ return PatientExamination.objects.filter(report_file__isnull=True)
15
+
16
+ def get_patient_examinations_without_video() -> PatientExamination:
17
+ """
18
+ Returns all PatientExamination objects from the database without a video.
19
+ """
20
+ return PatientExamination.objects.filter(video__isnull=True)
@@ -1,33 +1,33 @@
1
- from endoreg_db.models import ReportFile
2
- from typing import Optional
3
-
4
- def get_report_files() -> ReportFile:
5
- """
6
- Returns all ReportFile objects from the database.
7
- """
8
- return ReportFile.objects.all()
9
-
10
- def get_report_file_by_id(id) -> Optional[ReportFile]:
11
- """Retrieve a ReportFile object by its id.
12
-
13
- Args:
14
- id (int): The id of the report_file to retrieve.
15
-
16
- Returns:
17
- Optional[ReportFile]: The ReportFile object with the given id, or None if it does not exist.
18
- """
19
- return ReportFile.objects.get(id=id)
20
-
21
- def get_report_files_without_examination() -> ReportFile:
22
- """
23
- Returns all ReportFile objects from the database without an examination.
24
- """
25
- return ReportFile.objects.filter(patient_examination__isnull=True)
26
-
27
- def get_report_files_without_patient() -> ReportFile:
28
- """
29
- Returns all ReportFile objects from the database without a patient.
30
- """
31
- return ReportFile.objects.filter(patient__isnull=True)
32
-
33
-
1
+ from endoreg_db.models import ReportFile
2
+ from typing import Optional
3
+
4
+ def get_report_files() -> ReportFile:
5
+ """
6
+ Returns all ReportFile objects from the database.
7
+ """
8
+ return ReportFile.objects.all()
9
+
10
+ def get_report_file_by_id(id) -> Optional[ReportFile]:
11
+ """Retrieve a ReportFile object by its id.
12
+
13
+ Args:
14
+ id (int): The id of the report_file to retrieve.
15
+
16
+ Returns:
17
+ Optional[ReportFile]: The ReportFile object with the given id, or None if it does not exist.
18
+ """
19
+ return ReportFile.objects.get(id=id)
20
+
21
+ def get_report_files_without_examination() -> ReportFile:
22
+ """
23
+ Returns all ReportFile objects from the database without an examination.
24
+ """
25
+ return ReportFile.objects.filter(patient_examination__isnull=True)
26
+
27
+ def get_report_files_without_patient() -> ReportFile:
28
+ """
29
+ Returns all ReportFile objects from the database without a patient.
30
+ """
31
+ return ReportFile.objects.filter(patient__isnull=True)
32
+
33
+
@@ -1,31 +1,31 @@
1
- from endoreg_db.models import Video, PatientExamination
2
- from typing import Optional
3
-
4
- def get_videos() -> Video:
5
- """
6
- Returns all Video objects from the database.
7
- """
8
- return Video.objects.all()
9
-
10
- def get_video_by_id(id) -> Optional[Video]:
11
- """Retrieve a Video object by its id.
12
-
13
- Args:
14
- id (int): The id of the video to retrieve.
15
-
16
- Returns:
17
- Optional[Video]: The Video object with the given id, or None if it does not exist.
18
- """
19
- return Video.objects.get(id=id)
20
-
21
- def get_video_without_examination() -> Video:
22
- """
23
- Returns all Video objects from the database without an examination.
24
- """
25
- return Video.objects.filter(patient_examination__isnull=True)
26
-
27
- def get_video_without_patient() -> Video:
28
- """
29
- Returns all Video objects from the database without a patient.
30
- """
31
- return Video.objects.filter(patient__isnull=True)
1
+ from endoreg_db.models import Video, PatientExamination
2
+ from typing import Optional
3
+
4
+ def get_videos() -> Video:
5
+ """
6
+ Returns all Video objects from the database.
7
+ """
8
+ return Video.objects.all()
9
+
10
+ def get_video_by_id(id) -> Optional[Video]:
11
+ """Retrieve a Video object by its id.
12
+
13
+ Args:
14
+ id (int): The id of the video to retrieve.
15
+
16
+ Returns:
17
+ Optional[Video]: The Video object with the given id, or None if it does not exist.
18
+ """
19
+ return Video.objects.get(id=id)
20
+
21
+ def get_video_without_examination() -> Video:
22
+ """
23
+ Returns all Video objects from the database without an examination.
24
+ """
25
+ return Video.objects.filter(patient_examination__isnull=True)
26
+
27
+ def get_video_without_patient() -> Video:
28
+ """
29
+ Returns all Video objects from the database without a patient.
30
+ """
31
+ return Video.objects.filter(patient__isnull=True)