endoreg-db 0.3.6__py3-none-any.whl → 0.3.8__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 (351) hide show
  1. endoreg_db/admin.py +3 -3
  2. endoreg_db/apps.py +6 -6
  3. endoreg_db/data/__init__.py +67 -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/.init +0 -0
  14. endoreg_db/data/case_template/rule_value_type/base_types.yaml +58 -58
  15. endoreg_db/data/case_template/template/base.yaml +7 -7
  16. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +2 -2
  17. endoreg_db/data/case_template/tmp/_rule_value +13 -13
  18. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -21
  19. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +9 -9
  20. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +6 -6
  21. endoreg_db/data/center/data.yaml +59 -59
  22. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
  23. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
  24. endoreg_db/data/disease/cardiovascular.yaml +37 -37
  25. endoreg_db/data/disease/hepatology.yaml +4 -4
  26. endoreg_db/data/disease/misc.yaml +5 -5
  27. endoreg_db/data/disease/renal.yaml +4 -4
  28. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +5 -5
  29. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
  30. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +40 -40
  31. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +19 -19
  32. endoreg_db/data/distribution/date/patient.yaml +6 -6
  33. endoreg_db/data/distribution/multiple_categorical/.init +0 -0
  34. endoreg_db/data/distribution/numeric/.init +0 -0
  35. endoreg_db/data/distribution/single_categorical/patient.yaml +6 -6
  36. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -132
  37. endoreg_db/data/endoscope_type/data.yaml +10 -10
  38. endoreg_db/data/endoscopy_processor/data.yaml +45 -45
  39. endoreg_db/data/event/cardiology.yaml +27 -27
  40. endoreg_db/data/event/neurology.yaml +13 -13
  41. endoreg_db/data/event/surgery.yaml +12 -12
  42. endoreg_db/data/event/thrombembolism.yaml +19 -19
  43. endoreg_db/data/examination/examinations/data.yaml +65 -65
  44. endoreg_db/data/examination/time/data.yaml +47 -47
  45. endoreg_db/data/examination/time-type/data.yaml +7 -7
  46. endoreg_db/data/examination/type/data.yaml +5 -5
  47. endoreg_db/data/gender/data.yaml +18 -18
  48. endoreg_db/data/information_source/data.yaml +30 -30
  49. endoreg_db/data/information_source/medication.yaml +5 -5
  50. endoreg_db/data/lab_value/cardiac_enzymes.yaml +30 -30
  51. endoreg_db/data/lab_value/coagulation.yaml +48 -48
  52. endoreg_db/data/lab_value/electrolytes.yaml +189 -189
  53. endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -121
  54. endoreg_db/data/lab_value/hematology.yaml +169 -169
  55. endoreg_db/data/lab_value/hormones.yaml +53 -53
  56. endoreg_db/data/lab_value/lipids.yaml +44 -44
  57. endoreg_db/data/lab_value/misc.yaml +30 -30
  58. endoreg_db/data/lab_value/renal_function.yaml +10 -10
  59. endoreg_db/data/label/label/data.yaml +62 -62
  60. endoreg_db/data/label/label-set/data.yaml +17 -17
  61. endoreg_db/data/label/label-type/data.yaml +6 -6
  62. endoreg_db/data/medication/anticoagulation.yaml +64 -64
  63. endoreg_db/data/medication/tah.yaml +69 -69
  64. endoreg_db/data/medication_indication/anticoagulation.yaml +120 -120
  65. endoreg_db/data/medication_indication_type/data.yaml +10 -10
  66. endoreg_db/data/medication_indication_type/thrombembolism.yaml +40 -40
  67. endoreg_db/data/medication_intake_time/base.yaml +30 -30
  68. endoreg_db/data/medication_schedule/apixaban.yaml +94 -94
  69. endoreg_db/data/medication_schedule/ass.yaml +12 -12
  70. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -26
  71. endoreg_db/data/model_type/data.yaml +6 -6
  72. endoreg_db/data/network_device/data.yaml +17 -0
  73. endoreg_db/data/network_device_type/data.yaml +8 -0
  74. endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
  75. endoreg_db/data/pdf_type/data.yaml +28 -28
  76. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -66
  77. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -33
  78. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -308
  79. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -88
  80. endoreg_db/data/profession/data.yaml +70 -70
  81. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
  82. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
  83. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
  84. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
  85. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
  86. endoreg_db/data/unit/concentration.yaml +92 -92
  87. endoreg_db/data/unit/data.yaml +17 -17
  88. endoreg_db/data/unit/length.yaml +30 -30
  89. endoreg_db/data/unit/misc.yaml +19 -19
  90. endoreg_db/data/unit/rate.yaml +5 -5
  91. endoreg_db/data/unit/time.yaml +12 -12
  92. endoreg_db/data/unit/volume.yaml +35 -35
  93. endoreg_db/data/unit/weight.yaml +37 -37
  94. endoreg_db/data/waste/data.yaml +11 -11
  95. endoreg_db/forms/__init__.py +2 -2
  96. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
  97. endoreg_db/forms/settings/__init__.py +8 -8
  98. endoreg_db/forms/unit.py +5 -5
  99. endoreg_db/management/commands/_load_model_template.py +40 -40
  100. endoreg_db/management/commands/delete_all.py +18 -18
  101. endoreg_db/management/commands/delete_legacy_images.py +19 -19
  102. endoreg_db/management/commands/delete_legacy_videos.py +16 -16
  103. endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
  104. endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
  105. endoreg_db/management/commands/fix_auth_permission.py +20 -20
  106. endoreg_db/management/commands/import_legacy_images.py +94 -94
  107. endoreg_db/management/commands/import_legacy_videos.py +76 -76
  108. endoreg_db/management/commands/load_active_model_data.py +44 -44
  109. endoreg_db/management/commands/load_ai_model_data.py +44 -44
  110. endoreg_db/management/commands/load_base_db_data.py +132 -128
  111. endoreg_db/management/commands/load_center_data.py +42 -42
  112. endoreg_db/management/commands/load_disease_classification_choices_data.py +40 -40
  113. endoreg_db/management/commands/load_disease_classification_data.py +40 -40
  114. endoreg_db/management/commands/load_disease_data.py +39 -39
  115. endoreg_db/management/commands/load_distribution_data.py +65 -65
  116. endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
  117. endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
  118. endoreg_db/management/commands/load_event_data.py +40 -40
  119. endoreg_db/management/commands/load_examination_data.py +74 -74
  120. endoreg_db/management/commands/load_g_play_data.py +112 -112
  121. endoreg_db/management/commands/load_gender_data.py +43 -43
  122. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -132
  123. endoreg_db/management/commands/load_information_source.py +44 -44
  124. endoreg_db/management/commands/load_lab_value_data.py +49 -49
  125. endoreg_db/management/commands/load_label_data.py +66 -66
  126. endoreg_db/management/commands/load_medication_data.py +40 -40
  127. endoreg_db/management/commands/load_medication_indication_data.py +62 -62
  128. endoreg_db/management/commands/load_medication_indication_type_data.py +40 -40
  129. endoreg_db/management/commands/load_medication_intake_time_data.py +40 -40
  130. endoreg_db/management/commands/load_medication_schedule_data.py +54 -54
  131. endoreg_db/management/commands/load_network_data.py +49 -0
  132. endoreg_db/management/commands/load_pdf_type_data.py +60 -60
  133. endoreg_db/management/commands/load_profession_data.py +43 -43
  134. endoreg_db/management/commands/load_report_reader_flag.py +45 -45
  135. endoreg_db/management/commands/load_unit_data.py +45 -45
  136. endoreg_db/management/commands/load_user_groups.py +28 -28
  137. endoreg_db/management/commands/register_ai_model.py +65 -65
  138. endoreg_db/management/commands/reset_celery_schedule.py +9 -9
  139. endoreg_db/migrations/0001_initial.py +582 -582
  140. endoreg_db/migrations/0002_rawvideofile.py +26 -26
  141. endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -18
  142. endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -18
  143. endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -56
  144. endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -25
  145. endoreg_db/migrations/0007_rawvideofile_processor.py +19 -19
  146. endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -18
  147. endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -31
  148. endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -18
  149. endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -18
  150. endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -109
  151. endoreg_db/migrations/0013_rawpdffile.py +31 -31
  152. endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -38
  153. endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -31
  154. endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -18
  155. endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -37
  156. endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -37
  157. endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -42
  158. endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -18
  159. endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -19
  160. endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -19
  161. endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -59
  162. endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -27
  163. endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -42
  164. endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -166
  165. endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -38
  166. endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -18
  167. endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -75
  168. endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -101
  169. endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -38
  170. endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -18
  171. endoreg_db/migrations/0033_medicationindication_sources.py +18 -18
  172. endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -20
  173. endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -18
  174. endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -20
  175. endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -18
  176. endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -164
  177. endoreg_db/migrations/0039_referenceproduct_name.py +19 -19
  178. endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -50
  179. endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -40
  180. endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -74
  181. endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -23
  182. endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -23
  183. endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -19
  184. endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -18
  185. endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -18
  186. endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -22
  187. endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -17
  188. endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -18
  189. endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -27
  190. endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -18
  191. endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -38
  192. endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -69
  193. endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -59
  194. endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -32
  195. endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -72
  196. endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -28
  197. endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -18
  198. endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -44
  199. endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -24
  200. endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -18
  201. endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -18
  202. endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -23
  203. endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -58
  204. endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -29
  205. endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -19
  206. endoreg_db/migrations/0068_networkdevicetype_networkdevicetypemanager_and_more.py +57 -0
  207. endoreg_db/models/__init__.py +75 -74
  208. endoreg_db/models/ai_model/__init__.py +3 -3
  209. endoreg_db/models/ai_model/active_model.py +9 -9
  210. endoreg_db/models/ai_model/model_meta.py +24 -24
  211. endoreg_db/models/ai_model/model_type.py +25 -25
  212. endoreg_db/models/ai_model/utils.py +8 -8
  213. endoreg_db/models/annotation/__init__.py +1 -1
  214. endoreg_db/models/annotation/binary_classification_annotation_task.py +80 -80
  215. endoreg_db/models/annotation/image_classification.py +26 -26
  216. endoreg_db/models/case_template/__init__.py +5 -5
  217. endoreg_db/models/case_template/case_template.py +81 -81
  218. endoreg_db/models/case_template/case_template_rule.py +276 -276
  219. endoreg_db/models/case_template/case_template_rule_value.py +73 -73
  220. endoreg_db/models/case_template/case_template_type.py +27 -27
  221. endoreg_db/models/center/__init__.py +4 -4
  222. endoreg_db/models/center/center.py +24 -24
  223. endoreg_db/models/center/center_product.py +33 -33
  224. endoreg_db/models/center/center_resource.py +18 -18
  225. endoreg_db/models/center/center_waste.py +10 -10
  226. endoreg_db/models/data_file/__init__.py +5 -5
  227. endoreg_db/models/data_file/base_classes/__init__.py +2 -2
  228. endoreg_db/models/data_file/base_classes/abstract_frame.py +50 -50
  229. endoreg_db/models/data_file/base_classes/abstract_video.py +200 -200
  230. endoreg_db/models/data_file/frame.py +45 -45
  231. endoreg_db/models/data_file/import_classes/__init__.py +31 -31
  232. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +34 -34
  233. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -28
  234. endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -260
  235. endoreg_db/models/data_file/import_classes/raw_pdf.py +188 -188
  236. endoreg_db/models/data_file/import_classes/raw_video.py +343 -343
  237. endoreg_db/models/data_file/metadata/__init__.py +3 -3
  238. endoreg_db/models/data_file/metadata/pdf_meta.py +70 -70
  239. endoreg_db/models/data_file/metadata/sensitive_meta.py +31 -31
  240. endoreg_db/models/data_file/metadata/video_meta.py +132 -132
  241. endoreg_db/models/data_file/report_file.py +89 -89
  242. endoreg_db/models/data_file/video/__init__.py +6 -6
  243. endoreg_db/models/data_file/video/import_meta.py +25 -25
  244. endoreg_db/models/data_file/video/video.py +25 -25
  245. endoreg_db/models/data_file/video_segment.py +107 -107
  246. endoreg_db/models/disease.py +55 -55
  247. endoreg_db/models/emission/emission_factor.py +19 -19
  248. endoreg_db/models/event.py +21 -21
  249. endoreg_db/models/examination/__init__.py +3 -3
  250. endoreg_db/models/examination/examination.py +26 -26
  251. endoreg_db/models/examination/examination_time.py +27 -27
  252. endoreg_db/models/examination/examination_time_type.py +24 -24
  253. endoreg_db/models/examination/examination_type.py +18 -18
  254. endoreg_db/models/hardware/__init__.py +1 -1
  255. endoreg_db/models/hardware/endoscope.py +44 -44
  256. endoreg_db/models/hardware/endoscopy_processor.py +143 -143
  257. endoreg_db/models/information_source.py +29 -29
  258. endoreg_db/models/label/label.py +84 -84
  259. endoreg_db/models/laboratory/lab_value.py +102 -102
  260. endoreg_db/models/legacy_data/__init__.py +3 -3
  261. endoreg_db/models/legacy_data/image.py +34 -34
  262. endoreg_db/models/medication/medication.py +148 -148
  263. endoreg_db/models/network/__init__.py +2 -0
  264. endoreg_db/models/network/network_device.py +27 -0
  265. endoreg_db/models/network/network_device_type.py +23 -0
  266. endoreg_db/models/other/__init__.py +4 -4
  267. endoreg_db/models/other/distribution.py +215 -215
  268. endoreg_db/models/other/material.py +16 -16
  269. endoreg_db/models/other/resource.py +17 -17
  270. endoreg_db/models/other/transport_route.py +20 -20
  271. endoreg_db/models/other/waste.py +20 -20
  272. endoreg_db/models/patient_examination/__init__.py +35 -35
  273. endoreg_db/models/permissions/__init__.py +44 -44
  274. endoreg_db/models/persons/__init__.py +6 -6
  275. endoreg_db/models/persons/examiner/__init__.py +1 -1
  276. endoreg_db/models/persons/examiner/examiner.py +15 -15
  277. endoreg_db/models/persons/examiner/examiner_type.py +1 -1
  278. endoreg_db/models/persons/first_name.py +17 -17
  279. endoreg_db/models/persons/gender.py +22 -22
  280. endoreg_db/models/persons/last_name.py +19 -19
  281. endoreg_db/models/persons/patient/__init__.py +7 -7
  282. endoreg_db/models/persons/patient/case/case.py +30 -30
  283. endoreg_db/models/persons/patient/patient.py +216 -216
  284. endoreg_db/models/persons/patient/patient_disease.py +16 -16
  285. endoreg_db/models/persons/patient/patient_event.py +22 -22
  286. endoreg_db/models/persons/patient/patient_lab_sample.py +106 -106
  287. endoreg_db/models/persons/patient/patient_lab_value.py +176 -176
  288. endoreg_db/models/persons/patient/patient_medication.py +43 -43
  289. endoreg_db/models/persons/patient/patient_medication_schedule.py +27 -27
  290. endoreg_db/models/persons/person.py +31 -31
  291. endoreg_db/models/persons/portal_user_information.py +27 -27
  292. endoreg_db/models/prediction/__init__.py +1 -1
  293. endoreg_db/models/prediction/image_classification.py +37 -37
  294. endoreg_db/models/prediction/video_prediction_meta.py +244 -244
  295. endoreg_db/models/product/__init__.py +4 -4
  296. endoreg_db/models/product/product.py +97 -97
  297. endoreg_db/models/product/product_group.py +19 -19
  298. endoreg_db/models/product/product_material.py +24 -24
  299. endoreg_db/models/product/product_weight.py +26 -26
  300. endoreg_db/models/product/reference_product.py +99 -99
  301. endoreg_db/models/questionnaires/__init__.py +114 -114
  302. endoreg_db/models/quiz/__init__.py +1 -1
  303. endoreg_db/models/quiz/quiz_answer.py +41 -41
  304. endoreg_db/models/quiz/quiz_question.py +54 -54
  305. endoreg_db/models/report_reader/__init__.py +1 -1
  306. endoreg_db/models/report_reader/report_reader_config.py +53 -53
  307. endoreg_db/models/report_reader/report_reader_flag.py +19 -19
  308. endoreg_db/models/rules/__init__.py +4 -4
  309. endoreg_db/models/rules/rule.py +23 -23
  310. endoreg_db/models/rules/rule_applicator.py +224 -224
  311. endoreg_db/models/rules/rule_attribute_dtype.py +18 -18
  312. endoreg_db/models/rules/rule_type.py +21 -21
  313. endoreg_db/models/rules/ruleset.py +19 -19
  314. endoreg_db/models/unit.py +21 -21
  315. endoreg_db/queries/__init__.py +4 -4
  316. endoreg_db/queries/annotations/__init__.py +2 -2
  317. endoreg_db/queries/annotations/legacy.py +159 -159
  318. endoreg_db/queries/get/__init__.py +5 -5
  319. endoreg_db/queries/get/center.py +42 -42
  320. endoreg_db/queries/get/model.py +13 -13
  321. endoreg_db/queries/get/patient.py +14 -14
  322. endoreg_db/queries/get/patient_examination.py +20 -20
  323. endoreg_db/queries/get/report_file.py +33 -33
  324. endoreg_db/queries/get/video.py +31 -31
  325. endoreg_db/serializers/__init__.py +9 -9
  326. endoreg_db/serializers/ai_model.py +18 -18
  327. endoreg_db/serializers/annotation.py +17 -17
  328. endoreg_db/serializers/center.py +11 -11
  329. endoreg_db/serializers/examination.py +32 -32
  330. endoreg_db/serializers/frame.py +13 -13
  331. endoreg_db/serializers/hardware.py +20 -20
  332. endoreg_db/serializers/label.py +22 -22
  333. endoreg_db/serializers/patient.py +10 -10
  334. endoreg_db/serializers/prediction.py +15 -15
  335. endoreg_db/serializers/report_file.py +7 -7
  336. endoreg_db/serializers/video.py +27 -27
  337. endoreg_db/tests.py +3 -3
  338. endoreg_db/utils/cropping.py +28 -28
  339. endoreg_db/utils/dataloader.py +92 -92
  340. endoreg_db/utils/file_operations.py +30 -30
  341. endoreg_db/utils/hashs.py +33 -33
  342. endoreg_db/utils/legacy_ocr.py +201 -201
  343. endoreg_db/utils/ocr.py +197 -197
  344. endoreg_db/utils/uuid.py +4 -4
  345. endoreg_db/utils/video_metadata.py +87 -87
  346. endoreg_db/views.py +3 -3
  347. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/LICENSE +674 -674
  348. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/METADATA +3 -1
  349. endoreg_db-0.3.8.dist-info/RECORD +367 -0
  350. {endoreg_db-0.3.6.dist-info → endoreg_db-0.3.8.dist-info}/WHEEL +1 -1
  351. endoreg_db-0.3.6.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)