endoreg-db 0.5.2__py3-none-any.whl → 0.6.0__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 (320) hide show
  1. endoreg_db/admin.py +90 -1
  2. endoreg_db/urls.py +173 -0
  3. endoreg_db/views.py +0 -3
  4. endoreg_db-0.6.0.dist-info/METADATA +151 -0
  5. endoreg_db-0.6.0.dist-info/RECORD +11 -0
  6. {endoreg_db-0.5.2.dist-info → endoreg_db-0.6.0.dist-info}/WHEEL +2 -1
  7. endoreg_db-0.6.0.dist-info/top_level.txt +1 -0
  8. endoreg_db/data/__init__.py +0 -72
  9. endoreg_db/data/active_model/data.yaml +0 -3
  10. endoreg_db/data/agl_service/data.yaml +0 -19
  11. endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +0 -167
  12. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +0 -8
  13. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +0 -9
  14. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +0 -23
  15. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +0 -19
  16. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +0 -19
  17. endoreg_db/data/case_template/rule/19_create_patient.yaml +0 -17
  18. endoreg_db/data/case_template/rule_type/base_types.yaml +0 -35
  19. endoreg_db/data/case_template/rule_value/.init +0 -0
  20. endoreg_db/data/case_template/rule_value_type/base_types.yaml +0 -59
  21. endoreg_db/data/case_template/template/base.yaml +0 -8
  22. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +0 -3
  23. endoreg_db/data/case_template/tmp/_rule_value +0 -13
  24. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +0 -21
  25. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +0 -10
  26. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +0 -7
  27. endoreg_db/data/center/data.yaml +0 -60
  28. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +0 -144
  29. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +0 -48
  30. endoreg_db/data/disease/cardiovascular.yaml +0 -37
  31. endoreg_db/data/disease/hepatology.yaml +0 -5
  32. endoreg_db/data/disease/misc.yaml +0 -6
  33. endoreg_db/data/disease/renal.yaml +0 -5
  34. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +0 -6
  35. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +0 -6
  36. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +0 -41
  37. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +0 -20
  38. endoreg_db/data/distribution/date/patient.yaml +0 -7
  39. endoreg_db/data/distribution/multiple_categorical/.init +0 -0
  40. endoreg_db/data/distribution/numeric/.init +0 -0
  41. endoreg_db/data/distribution/single_categorical/patient.yaml +0 -7
  42. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +0 -132
  43. endoreg_db/data/endoscope_type/data.yaml +0 -11
  44. endoreg_db/data/endoscopy_processor/data.yaml +0 -47
  45. endoreg_db/data/event/cardiology.yaml +0 -28
  46. endoreg_db/data/event/neurology.yaml +0 -14
  47. endoreg_db/data/event/surgery.yaml +0 -13
  48. endoreg_db/data/event/thrombembolism.yaml +0 -20
  49. endoreg_db/data/examination/examinations/data.yaml +0 -66
  50. endoreg_db/data/examination/time/data.yaml +0 -48
  51. endoreg_db/data/examination/time-type/data.yaml +0 -8
  52. endoreg_db/data/examination/type/data.yaml +0 -5
  53. endoreg_db/data/gender/data.yaml +0 -18
  54. endoreg_db/data/information_source/data.yaml +0 -30
  55. endoreg_db/data/information_source/medication.yaml +0 -6
  56. endoreg_db/data/lab_value/cardiac_enzymes.yaml +0 -31
  57. endoreg_db/data/lab_value/coagulation.yaml +0 -49
  58. endoreg_db/data/lab_value/electrolytes.yaml +0 -190
  59. endoreg_db/data/lab_value/gastrointestinal_function.yaml +0 -121
  60. endoreg_db/data/lab_value/hematology.yaml +0 -169
  61. endoreg_db/data/lab_value/hormones.yaml +0 -53
  62. endoreg_db/data/lab_value/lipids.yaml +0 -44
  63. endoreg_db/data/lab_value/misc.yaml +0 -30
  64. endoreg_db/data/lab_value/renal_function.yaml +0 -11
  65. endoreg_db/data/label/label/data.yaml +0 -62
  66. endoreg_db/data/label/label-set/data.yaml +0 -18
  67. endoreg_db/data/label/label-type/data.yaml +0 -7
  68. endoreg_db/data/log_type/data.yaml +0 -57
  69. endoreg_db/data/material/material.yaml +0 -91
  70. endoreg_db/data/medication/anticoagulation.yaml +0 -65
  71. endoreg_db/data/medication/tah.yaml +0 -70
  72. endoreg_db/data/medication_indication/anticoagulation.yaml +0 -120
  73. endoreg_db/data/medication_indication_type/data.yaml +0 -11
  74. endoreg_db/data/medication_indication_type/thrombembolism.yaml +0 -41
  75. endoreg_db/data/medication_intake_time/base.yaml +0 -31
  76. endoreg_db/data/medication_schedule/apixaban.yaml +0 -95
  77. endoreg_db/data/medication_schedule/ass.yaml +0 -12
  78. endoreg_db/data/medication_schedule/enoxaparin.yaml +0 -26
  79. endoreg_db/data/model_type/data.yaml +0 -7
  80. endoreg_db/data/network_device/data.yaml +0 -29
  81. endoreg_db/data/network_device_type/data.yaml +0 -12
  82. endoreg_db/data/patient_lab_sample_type/generic.yaml +0 -6
  83. endoreg_db/data/pdf_type/data.yaml +0 -28
  84. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +0 -66
  85. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +0 -33
  86. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +0 -308
  87. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +0 -88
  88. endoreg_db/data/profession/data.yaml +0 -70
  89. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +0 -55
  90. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +0 -26
  91. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +0 -19
  92. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +0 -15
  93. endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
  94. endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
  95. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +0 -12
  96. endoreg_db/data/unit/concentration.yaml +0 -92
  97. endoreg_db/data/unit/data.yaml +0 -17
  98. endoreg_db/data/unit/length.yaml +0 -31
  99. endoreg_db/data/unit/misc.yaml +0 -20
  100. endoreg_db/data/unit/rate.yaml +0 -6
  101. endoreg_db/data/unit/time.yaml +0 -13
  102. endoreg_db/data/unit/volume.yaml +0 -35
  103. endoreg_db/data/unit/weight.yaml +0 -38
  104. endoreg_db/data/waste/data.yaml +0 -12
  105. endoreg_db/forms/__init__.py +0 -3
  106. endoreg_db/forms/questionnaires/__init__.py +0 -1
  107. endoreg_db/forms/questionnaires/tto_questionnaire.py +0 -23
  108. endoreg_db/forms/settings/__init__.py +0 -8
  109. endoreg_db/forms/unit.py +0 -6
  110. endoreg_db/management/commands/_load_model_template.py +0 -41
  111. endoreg_db/management/commands/delete_all.py +0 -18
  112. endoreg_db/management/commands/delete_legacy_images.py +0 -19
  113. endoreg_db/management/commands/delete_legacy_videos.py +0 -17
  114. endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
  115. endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
  116. endoreg_db/management/commands/fix_auth_permission.py +0 -20
  117. endoreg_db/management/commands/import_legacy_images.py +0 -94
  118. endoreg_db/management/commands/import_legacy_videos.py +0 -76
  119. endoreg_db/management/commands/load_active_model_data.py +0 -45
  120. endoreg_db/management/commands/load_ai_model_data.py +0 -45
  121. endoreg_db/management/commands/load_base_db_data.py +0 -136
  122. endoreg_db/management/commands/load_center_data.py +0 -43
  123. endoreg_db/management/commands/load_disease_classification_choices_data.py +0 -41
  124. endoreg_db/management/commands/load_disease_classification_data.py +0 -41
  125. endoreg_db/management/commands/load_disease_data.py +0 -40
  126. endoreg_db/management/commands/load_distribution_data.py +0 -66
  127. endoreg_db/management/commands/load_endoscope_type_data.py +0 -45
  128. endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
  129. endoreg_db/management/commands/load_event_data.py +0 -41
  130. endoreg_db/management/commands/load_examination_data.py +0 -75
  131. endoreg_db/management/commands/load_g_play_data.py +0 -113
  132. endoreg_db/management/commands/load_gender_data.py +0 -44
  133. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -133
  134. endoreg_db/management/commands/load_information_source.py +0 -45
  135. endoreg_db/management/commands/load_lab_value_data.py +0 -50
  136. endoreg_db/management/commands/load_label_data.py +0 -67
  137. endoreg_db/management/commands/load_logging_data.py +0 -39
  138. endoreg_db/management/commands/load_medication_data.py +0 -41
  139. endoreg_db/management/commands/load_medication_indication_data.py +0 -63
  140. endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
  141. endoreg_db/management/commands/load_medication_intake_time_data.py +0 -41
  142. endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
  143. endoreg_db/management/commands/load_network_data.py +0 -57
  144. endoreg_db/management/commands/load_pdf_type_data.py +0 -61
  145. endoreg_db/management/commands/load_profession_data.py +0 -44
  146. endoreg_db/management/commands/load_report_reader_flag.py +0 -46
  147. endoreg_db/management/commands/load_unit_data.py +0 -46
  148. endoreg_db/management/commands/load_user_groups.py +0 -28
  149. endoreg_db/management/commands/register_ai_model.py +0 -64
  150. endoreg_db/management/commands/reset_celery_schedule.py +0 -9
  151. endoreg_db/migrations/0001_initial.py +0 -1567
  152. endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
  153. endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
  154. endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
  155. endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
  156. endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
  157. endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
  158. endoreg_db/migrations/0008_networkdevicelogentry_aglnet_ip_and_more.py +0 -28
  159. endoreg_db/migrations/0009_alter_networkdevicelogentry_vpn_service_status.py +0 -18
  160. endoreg_db/migrations/0010_remove_networkdevicelogentry_hostname.py +0 -17
  161. endoreg_db/migrations/__init__.py +0 -0
  162. endoreg_db/models/__init__.py +0 -73
  163. endoreg_db/models/ai_model/__init__.py +0 -3
  164. endoreg_db/models/ai_model/active_model.py +0 -9
  165. endoreg_db/models/ai_model/model_meta.py +0 -24
  166. endoreg_db/models/ai_model/model_type.py +0 -26
  167. endoreg_db/models/ai_model/utils.py +0 -8
  168. endoreg_db/models/annotation/__init__.py +0 -3
  169. endoreg_db/models/annotation/anonymized_image_annotation.py +0 -60
  170. endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
  171. endoreg_db/models/annotation/image_classification.py +0 -27
  172. endoreg_db/models/case_template/__init__.py +0 -6
  173. endoreg_db/models/case_template/case_template.py +0 -81
  174. endoreg_db/models/case_template/case_template_rule.py +0 -276
  175. endoreg_db/models/case_template/case_template_rule_value.py +0 -73
  176. endoreg_db/models/case_template/case_template_type.py +0 -28
  177. endoreg_db/models/center/__init__.py +0 -4
  178. endoreg_db/models/center/center.py +0 -25
  179. endoreg_db/models/center/center_product.py +0 -34
  180. endoreg_db/models/center/center_resource.py +0 -19
  181. endoreg_db/models/center/center_waste.py +0 -11
  182. endoreg_db/models/data_file/__init__.py +0 -6
  183. endoreg_db/models/data_file/base_classes/__init__.py +0 -2
  184. endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
  185. endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
  186. endoreg_db/models/data_file/frame.py +0 -45
  187. endoreg_db/models/data_file/import_classes/__init__.py +0 -32
  188. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
  189. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
  190. endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
  191. endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -188
  192. endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
  193. endoreg_db/models/data_file/metadata/__init__.py +0 -3
  194. endoreg_db/models/data_file/metadata/pdf_meta.py +0 -70
  195. endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
  196. endoreg_db/models/data_file/metadata/video_meta.py +0 -133
  197. endoreg_db/models/data_file/report_file.py +0 -89
  198. endoreg_db/models/data_file/video/__init__.py +0 -7
  199. endoreg_db/models/data_file/video/import_meta.py +0 -25
  200. endoreg_db/models/data_file/video/video.py +0 -25
  201. endoreg_db/models/data_file/video_segment.py +0 -107
  202. endoreg_db/models/disease.py +0 -56
  203. endoreg_db/models/emission/__init__.py +0 -1
  204. endoreg_db/models/emission/emission_factor.py +0 -20
  205. endoreg_db/models/event.py +0 -22
  206. endoreg_db/models/examination/__init__.py +0 -4
  207. endoreg_db/models/examination/examination.py +0 -26
  208. endoreg_db/models/examination/examination_time.py +0 -27
  209. endoreg_db/models/examination/examination_time_type.py +0 -24
  210. endoreg_db/models/examination/examination_type.py +0 -18
  211. endoreg_db/models/hardware/__init__.py +0 -2
  212. endoreg_db/models/hardware/endoscope.py +0 -44
  213. endoreg_db/models/hardware/endoscopy_processor.py +0 -143
  214. endoreg_db/models/information_source.py +0 -29
  215. endoreg_db/models/label/__init__.py +0 -1
  216. endoreg_db/models/label/label.py +0 -84
  217. endoreg_db/models/laboratory/__init__.py +0 -1
  218. endoreg_db/models/laboratory/lab_value.py +0 -102
  219. endoreg_db/models/legacy_data/__init__.py +0 -3
  220. endoreg_db/models/legacy_data/image.py +0 -34
  221. endoreg_db/models/logging/__init__.py +0 -4
  222. endoreg_db/models/logging/agl_service.py +0 -19
  223. endoreg_db/models/logging/base.py +0 -22
  224. endoreg_db/models/logging/log_type.py +0 -23
  225. endoreg_db/models/logging/network_device.py +0 -27
  226. endoreg_db/models/medication/__init__.py +0 -1
  227. endoreg_db/models/medication/medication.py +0 -148
  228. endoreg_db/models/network/__init__.py +0 -3
  229. endoreg_db/models/network/agl_service.py +0 -38
  230. endoreg_db/models/network/network_device.py +0 -53
  231. endoreg_db/models/network/network_device_type.py +0 -23
  232. endoreg_db/models/other/__init__.py +0 -5
  233. endoreg_db/models/other/distribution.py +0 -215
  234. endoreg_db/models/other/material.py +0 -16
  235. endoreg_db/models/other/resource.py +0 -18
  236. endoreg_db/models/other/transport_route.py +0 -21
  237. endoreg_db/models/other/waste.py +0 -20
  238. endoreg_db/models/patient_examination/__init__.py +0 -35
  239. endoreg_db/models/permissions/__init__.py +0 -44
  240. endoreg_db/models/persons/__init__.py +0 -7
  241. endoreg_db/models/persons/examiner/__init__.py +0 -2
  242. endoreg_db/models/persons/examiner/examiner.py +0 -16
  243. endoreg_db/models/persons/examiner/examiner_type.py +0 -2
  244. endoreg_db/models/persons/first_name.py +0 -18
  245. endoreg_db/models/persons/gender.py +0 -22
  246. endoreg_db/models/persons/last_name.py +0 -20
  247. endoreg_db/models/persons/patient/__init__.py +0 -8
  248. endoreg_db/models/persons/patient/case/__init__.py +0 -0
  249. endoreg_db/models/persons/patient/case/case.py +0 -30
  250. endoreg_db/models/persons/patient/patient.py +0 -216
  251. endoreg_db/models/persons/patient/patient_disease.py +0 -16
  252. endoreg_db/models/persons/patient/patient_event.py +0 -22
  253. endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
  254. endoreg_db/models/persons/patient/patient_lab_value.py +0 -176
  255. endoreg_db/models/persons/patient/patient_medication.py +0 -44
  256. endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
  257. endoreg_db/models/persons/person.py +0 -31
  258. endoreg_db/models/persons/portal_user_information.py +0 -27
  259. endoreg_db/models/prediction/__init__.py +0 -2
  260. endoreg_db/models/prediction/image_classification.py +0 -37
  261. endoreg_db/models/prediction/video_prediction_meta.py +0 -244
  262. endoreg_db/models/product/__init__.py +0 -5
  263. endoreg_db/models/product/product.py +0 -97
  264. endoreg_db/models/product/product_group.py +0 -19
  265. endoreg_db/models/product/product_material.py +0 -24
  266. endoreg_db/models/product/product_weight.py +0 -26
  267. endoreg_db/models/product/reference_product.py +0 -99
  268. endoreg_db/models/questionnaires/__init__.py +0 -114
  269. endoreg_db/models/quiz/__init__.py +0 -2
  270. endoreg_db/models/quiz/quiz_answer.py +0 -41
  271. endoreg_db/models/quiz/quiz_question.py +0 -54
  272. endoreg_db/models/report_reader/__init__.py +0 -2
  273. endoreg_db/models/report_reader/report_reader_config.py +0 -53
  274. endoreg_db/models/report_reader/report_reader_flag.py +0 -20
  275. endoreg_db/models/rules/__init__.py +0 -5
  276. endoreg_db/models/rules/rule.py +0 -24
  277. endoreg_db/models/rules/rule_applicator.py +0 -224
  278. endoreg_db/models/rules/rule_attribute_dtype.py +0 -19
  279. endoreg_db/models/rules/rule_type.py +0 -22
  280. endoreg_db/models/rules/ruleset.py +0 -19
  281. endoreg_db/models/unit.py +0 -22
  282. endoreg_db/queries/__init__.py +0 -5
  283. endoreg_db/queries/annotations/__init__.py +0 -3
  284. endoreg_db/queries/annotations/legacy.py +0 -158
  285. endoreg_db/queries/get/__init__.py +0 -6
  286. endoreg_db/queries/get/annotation.py +0 -0
  287. endoreg_db/queries/get/center.py +0 -42
  288. endoreg_db/queries/get/model.py +0 -13
  289. endoreg_db/queries/get/patient.py +0 -14
  290. endoreg_db/queries/get/patient_examination.py +0 -20
  291. endoreg_db/queries/get/prediction.py +0 -0
  292. endoreg_db/queries/get/report_file.py +0 -33
  293. endoreg_db/queries/get/video.py +0 -31
  294. endoreg_db/queries/get/video_import_meta.py +0 -0
  295. endoreg_db/queries/get/video_prediction_meta.py +0 -0
  296. endoreg_db/queries/sanity/__init_.py +0 -0
  297. endoreg_db/serializers/__init__.py +0 -10
  298. endoreg_db/serializers/ai_model.py +0 -19
  299. endoreg_db/serializers/annotation.py +0 -17
  300. endoreg_db/serializers/center.py +0 -11
  301. endoreg_db/serializers/examination.py +0 -33
  302. endoreg_db/serializers/frame.py +0 -13
  303. endoreg_db/serializers/hardware.py +0 -21
  304. endoreg_db/serializers/label.py +0 -22
  305. endoreg_db/serializers/patient.py +0 -10
  306. endoreg_db/serializers/prediction.py +0 -15
  307. endoreg_db/serializers/report_file.py +0 -7
  308. endoreg_db/serializers/video.py +0 -27
  309. endoreg_db/utils/__init__.py +0 -1
  310. endoreg_db/utils/cropping.py +0 -29
  311. endoreg_db/utils/dataloader.py +0 -92
  312. endoreg_db/utils/file_operations.py +0 -30
  313. endoreg_db/utils/hashs.py +0 -34
  314. endoreg_db/utils/legacy_ocr.py +0 -201
  315. endoreg_db/utils/ocr.py +0 -190
  316. endoreg_db/utils/uuid.py +0 -4
  317. endoreg_db/utils/video_metadata.py +0 -87
  318. endoreg_db-0.5.2.dist-info/METADATA +0 -27
  319. endoreg_db-0.5.2.dist-info/RECORD +0 -319
  320. {endoreg_db-0.5.2.dist-info/licenses → endoreg_db-0.6.0.dist-info}/LICENSE +0 -0
@@ -1,216 +0,0 @@
1
- from ..person import Person
2
- from django import forms
3
- from django.forms import DateInput
4
- from rest_framework import serializers
5
- from ...patient_examination import PatientExamination
6
- from ...data_file import ReportFile
7
- from django.db import models
8
- from faker import Faker
9
- import random
10
- from datetime import datetime
11
-
12
- class Patient(Person):
13
- """
14
- A class representing a patient.
15
-
16
- Attributes inhereted from Person:
17
- first_name (str): The first name of the patient.
18
- last_name (str): The last name of the patient.
19
- dob (datetime.date): The date of birth of the patient.
20
- gender (Foreign Key): The gender of the patient.
21
- email (str): The email address of the patient.
22
- phone (str): The phone number of the patient.
23
-
24
- """
25
- center = models.ForeignKey("Center", on_delete=models.CASCADE, blank=True, null=True)
26
-
27
-
28
- def __str__(self):
29
- return self.first_name + " " + self.last_name + " (" + str(self.dob) + ")"
30
-
31
- def get_unmatched_report_files(self): #field: self.report_files; filter: report_file.patient_examination = None
32
- '''Returns all report files for this patient that are not matched to a patient examination.'''
33
-
34
- return self.reportfile_set.filter(patient_examination=None)
35
-
36
- def get_unmatched_video_files(self): #field: self.videos; filter: video.patient_examination = None
37
- '''Returns all video files for this patient that are not matched to a patient examination.'''
38
- return self.videos.filter(patient_examination=None)
39
-
40
- def get_patient_examinations(self): #field: self.patient_examinations
41
- '''Returns all patient examinations for this patient ordered by date (most recent is first).'''
42
- return self.patient_examinations.order_by('-date')
43
-
44
- def create_examination_by_report_file(self, report_file:ReportFile):
45
- '''Creates a patient examination for this patient based on the given report file.'''
46
- patient_examination = PatientExamination(patient=self, report_file=report_file)
47
- patient_examination.save()
48
- return patient_examination
49
-
50
- @classmethod
51
- def get_random_gender(self, p_male=0.5, p_female=0.5):
52
- """
53
- Get a Gender object by name (male, female) from the database with given probability.
54
-
55
- :param p_male: Probability of selecting 'male' gender.
56
- :param p_female: Probability of selecting 'female' gender.
57
- :return: Gender object selected based on given probabilities.
58
- """
59
- from endoreg_db.models import Gender
60
-
61
- # Extract names and probabilities
62
- gender_names = ["male", "female"]
63
- probabilities = [0.5, 0.5]
64
-
65
- # Debug: print the names and probabilities
66
- print(f"Gender names: {gender_names}")
67
- print(f"Probabilities: {probabilities}")
68
-
69
- # Select a gender based on the given probabilities
70
- selected_gender = random.choices(gender_names, probabilities)[0]
71
- # Debug: print the selected gender
72
- print(f"Selected gender: {selected_gender}")
73
-
74
- # Fetch the corresponding Gender object from the database
75
- gender_obj = Gender.objects.get(name=selected_gender)
76
-
77
- return gender_obj
78
-
79
-
80
- @classmethod
81
- def get_random_age(self,
82
- min_age = 55,
83
- max_age = 90,
84
- mean_age = 65,
85
- std_age = 10,
86
- distribution = "normal"
87
- ):
88
- """
89
- Get a random age based on the given distribution.
90
-
91
- :param min_age: Minimum age.
92
- :param max_age: Maximum age.
93
- :param mean_age: Mean age.
94
- :param std_age: Standard deviation of the age.
95
- :param distribution: Distribution of the age.
96
- :return: Random age based on the given distribution.
97
- """
98
- if distribution == "normal":
99
- age = int(random.normalvariate(mean_age, std_age))
100
- else:
101
- age = int(random.uniform(min_age, max_age))
102
-
103
- return age
104
-
105
- @classmethod
106
- def get_dob_from_age(self, age, current_date=None):
107
- """
108
- Get a date of birth based on the given age and current date.
109
-
110
- :param age: Age of the patient.
111
- :param current_date: Current date.
112
- :return: Date of birth based on the given age and current date.
113
- """
114
- if current_date is None:
115
- current_date = datetime.now()
116
- dob = current_date.replace(year=current_date.year - age).date()
117
-
118
- # TODO
119
- # randomize the day and month by adding a random number of days (0-364) to the date
120
-
121
- return dob
122
-
123
- @classmethod
124
- def get_random_name_for_gender(self, gender_obj, locale="de_DE"):
125
- gender = gender_obj.name
126
- fake = Faker(locale)
127
-
128
- if gender == "male":
129
- first_name = fake.first_name_male()
130
- last_name = fake.last_name_male()
131
-
132
- else:
133
- first_name = fake.first_name_female()
134
- last_name = fake.last_name_female()
135
-
136
- return last_name, first_name
137
-
138
- @classmethod
139
- def create_generic(self, center="gplay_case_generator"):
140
- """
141
- Create a generic patient with random attributes.
142
-
143
- :param center: The center of the patient.
144
- :return: The created patient.
145
- """
146
- from endoreg_db.models import Center
147
- gender = Patient.get_random_gender()
148
- last_name, first_name = Patient.get_random_name_for_gender(gender)
149
-
150
- age = Patient.get_random_age()
151
- dob = Patient.get_dob_from_age(age)
152
-
153
- center = Center.objects.get(name=center)
154
-
155
- patient = Patient.objects.create(
156
- first_name=first_name,
157
- last_name=last_name,
158
- dob=dob
159
- )
160
- patient.save()
161
- return patient
162
-
163
- def age(self):
164
- """
165
- Get the age of the patient.
166
-
167
- :return: The age of the patient.
168
- """
169
- # calculate correct age based on current date including day and month
170
- current_date = datetime.now()
171
- dob = self.dob
172
- age = current_date.year - dob.year - ((current_date.month, current_date.day) < (dob.month, dob.day))
173
- return age
174
-
175
- def create_lab_sample(self, sample_type="generic", date=None, save=True):
176
- """
177
- Create a lab sample for this patient.
178
-
179
- :param sample_type: The sample type. Should be either string of the sample types
180
- name or the sample type object. If not set, the default sample type ("generic") is used.
181
- :param date: The date of the lab sample.
182
- :return: The created lab sample.
183
- """
184
- from endoreg_db.models import PatientLabSample, PatientLabSampleType
185
- if date is None:
186
- date = datetime.now()
187
-
188
- if isinstance(sample_type, str):
189
- sample_type = PatientLabSampleType.objects.get(name=sample_type)
190
- assert sample_type is not None, f"Sample type with name '{sample_type}' not found."#
191
- elif not isinstance(sample_type, PatientLabSampleType):
192
- raise ValueError("Sample type must be either a string or a PatientLabSampleType object.")
193
-
194
- patient_lab_sample = PatientLabSample.objects.create(
195
- patient=self,
196
- sample_type=sample_type,
197
- date=date
198
- )
199
-
200
- if save:
201
- patient_lab_sample.save()
202
-
203
- return patient_lab_sample
204
-
205
- class PatientForm(forms.ModelForm):
206
- class Meta:
207
- model = Patient
208
- fields = '__all__'
209
- widgets = {
210
- 'dob': DateInput(attrs={'type': 'date'}),
211
- }
212
-
213
- def __init__(self, *args, **kwargs):
214
- super().__init__(*args, **kwargs)
215
- for field in self.fields.values():
216
- field.widget.attrs['class'] = 'form-control'
@@ -1,16 +0,0 @@
1
- from django.db import models
2
-
3
-
4
-
5
- class PatientDisease(models.Model):
6
- patient = models.ForeignKey("Patient", on_delete=models.CASCADE)
7
- disease = models.ForeignKey("Disease", on_delete=models.CASCADE)
8
- classification_choices = models.ManyToManyField("DiseaseClassificationChoice")
9
- start_date = models.DateField(blank=True, null=True)
10
- end_date = models.DateField(blank=True, null=True)
11
-
12
- last_update = models.DateTimeField(auto_now=True)
13
-
14
- def __str__(self):
15
- return f"{self.patient} - {self.disease}"
16
-
@@ -1,22 +0,0 @@
1
- from django.db import models
2
- from .patient import Patient
3
-
4
- class PatientEvent(models.Model):
5
- """
6
- A class representing an event for a patient.
7
-
8
- Attributes:
9
- patient (Patient): The patient associated with this event.
10
- date (datetime.date): The date of the event.
11
- description (str): A description of the event.
12
- """
13
- patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
14
- event = models.ForeignKey("Event", on_delete=models.CASCADE)
15
- date_start = models.DateField()
16
- date_end = models.DateField(blank=True, null=True)
17
- description = models.TextField(blank=True, null=True)
18
-
19
- last_update = models.DateTimeField(auto_now=True)
20
-
21
- def __str__(self):
22
- return str(self.date_start) + ": " + self.event
@@ -1,106 +0,0 @@
1
- from django.db import models
2
-
3
- DEFAULT_PATIENT_LAB_SAMPLE_TYPE_NAME = "generic"
4
-
5
- class PatientLabSampleTypeManager(models.Manager):
6
- def get_by_natural_key(self, name):
7
- return self.get(name=name)
8
-
9
- class PatientLabSampleType(models.Model):
10
- """
11
- A class representing a patient lab sample type.
12
-
13
- Attributes:
14
- name (str): The name of the patient lab sample type.
15
- description (str): A description of the patient lab sample type.
16
-
17
- """
18
- name = models.CharField(max_length=255)
19
- name_de = models.CharField(max_length=255, null=True)
20
- name_en = models.CharField(max_length=255, null=True)
21
- description = models.TextField(blank=True, null=True)
22
-
23
- objects = PatientLabSampleTypeManager()
24
-
25
- def natural_key(self):
26
- return (self.name,)
27
-
28
- def __str__(self):
29
- return self.name
30
-
31
- @classmethod
32
- def get_default_sample_type(cls):
33
- """
34
- Get the default patient lab sample type.
35
-
36
- Returns:
37
- PatientLabSampleType: The default patient lab sample type.
38
-
39
- """
40
- return cls.objects.get_or_create(name="default")[0]
41
-
42
- from datetime import datetime as dt
43
- from datetime import timezone
44
- class PatientLabSample(models.Model):
45
- """
46
- A class representing a patient lab sample.
47
-
48
- Attributes:
49
- patient (Patient): The patient to which the lab sample belongs.
50
- sample_type (PatientLabSampleType): The type of the lab sample.
51
- date (datetime): The date of the lab sample.
52
- values (PatientLabValue; One2Many): The value of the lab sample.
53
- unit (Unit): The unit of the lab sample.
54
-
55
- """
56
- patient = models.ForeignKey("Patient", on_delete=models.CASCADE, related_name="lab_samples")
57
- sample_type = models.ForeignKey("PatientLabSampleType", on_delete=models.CASCADE)
58
- date = models.DateTimeField()
59
-
60
- def __str__(self):
61
- return f"{self.patient} - {self.sample_type} - {self.date} ()"
62
-
63
- def get_values(self):
64
- return self.values
65
-
66
- @classmethod
67
- def create_by_patient(cls, patient=None, sample_type=None, date=None, save = True):
68
- """
69
- Create a new patient lab sample by patient.
70
-
71
- Args:
72
- patient (Patient): The patient to which the lab sample belongs.
73
- sample_type (PatientLabSampleType): The type of the lab sample.
74
- date (datetime): The date of the lab sample.
75
-
76
- Returns:
77
- PatientLabSample: The new patient lab sample.
78
-
79
- """
80
- from endoreg_db.models.persons.patient import Patient, PatientLabSampleType
81
- from warnings import warn
82
-
83
- if not patient:
84
- warn("No patient given. Cannot create patient lab sample.")
85
- return None
86
- if not sample_type:
87
- sample_type = PatientLabSampleType.get_default_sample_type()
88
- else:
89
- sample_type = PatientLabSampleType.objects.get(name=sample_type)
90
- if not date:
91
- date = dt.now(timezone.utc)
92
-
93
- patient_lab_sample = cls.objects.create(
94
- patient=patient,
95
- sample_type=sample_type,
96
- date=date
97
- )
98
-
99
- if save:
100
- patient_lab_sample.save()
101
-
102
- return patient_lab_sample
103
-
104
-
105
-
106
-
@@ -1,176 +0,0 @@
1
- from django.db import models
2
-
3
- class PatientLabValue(models.Model):
4
- """
5
- A class representing a patient lab value.
6
-
7
- Attributes:
8
- patient (Patient): The patient.
9
- lab_value (LabValue): The lab value.
10
- value (float): The value of the lab value.
11
- date (datetime): The date of the lab value.
12
- """
13
- patient = models.ForeignKey('Patient', on_delete=models.CASCADE,
14
- related_name="lab_values", blank=True, null=True
15
- )
16
- lab_value = models.ForeignKey('LabValue', on_delete=models.CASCADE)
17
- value = models.FloatField(blank=True, null=True)
18
- value_str = models.CharField(max_length=255, blank=True, null=True)
19
- sample = models.ForeignKey(
20
- 'PatientLabSample', on_delete=models.CASCADE,
21
- blank=True, null=True,
22
- related_name='values'
23
- )
24
- datetime = models.DateTimeField(# if not set, use now
25
- auto_now_add=True
26
- )
27
- normal_range = models.JSONField(
28
- default = dict
29
- )
30
- unit = models.ForeignKey('Unit', on_delete=models.CASCADE, blank=True, null=True)
31
-
32
- @classmethod
33
- def create_lab_value_by_sample(cls, sample=None, lab_value_name=None, value=None, value_str=None, unit=None):
34
- from endoreg_db.models import LabValue
35
- patient = sample.patient
36
- lab_value = LabValue.objects.get(name=lab_value_name)
37
- value = value
38
- value_str = value_str
39
-
40
- pat_lab_val = cls.objects.create(
41
- patient = patient,
42
- lab_value = lab_value,
43
- value = value,
44
- value_str = value_str,
45
- sample = sample,
46
- unit = unit,
47
- )
48
-
49
- pat_lab_val.save()
50
-
51
- return pat_lab_val
52
-
53
- def __str__(self):
54
- _str = f'{self.lab_value} - {self.value} {self.unit} ({self.datetime})'
55
- print(_str)
56
- return _str
57
-
58
- def set_min_norm_value(self, value, save = True):
59
- self.normal_range["min"] = value
60
- if save:
61
- self.save()
62
-
63
- def set_max_norm_value(self, value, save = True):
64
- self.normal_range["max"] = value
65
- if save:
66
- self.save()
67
-
68
- def set_norm_values_from_default(self):
69
- age = self.patient.age()
70
- gender = self.patient.gender
71
- min_value, max_value = self.lab_value.get_normal_range(age=age, gender=gender)
72
- self.set_min_norm_value(min_value, save = False)
73
- self.set_max_norm_value(max_value, save = False)
74
- self.save()
75
-
76
-
77
- def set_unit_from_default(self):
78
- self.unit = self.lab_value.default_unit
79
- self.save()
80
-
81
- def get_value(self):
82
- if self.value:
83
- return self.value
84
- else:
85
- return self.value_str
86
-
87
- def get_value_field_name(self):
88
- if self.value:
89
- return "value"
90
- else:
91
- return "value_str"
92
-
93
- # customize save method so that if a numeric value exists, we round it to the precision of the lab value
94
- def save(self, *args, **kwargs):
95
- if self.value:
96
- precision = self.lab_value.numeric_precision
97
- self.value = round(self.value, precision)
98
- super().save(*args, **kwargs)
99
-
100
- def set_value_by_distribution(self, distribution=None, save = True):
101
- from endoreg_db.models import (
102
- Patient, LabValue, Gender,
103
- DateValueDistribution,
104
- SingleCategoricalValueDistribution,
105
- NumericValueDistribution,
106
- MultipleCategoricalValueDistribution,
107
- )
108
- import warnings
109
-
110
- patient:Patient = self.patient
111
-
112
- dob = patient.dob
113
- gender:Gender = patient.gender
114
- lab_value:LabValue = self.lab_value
115
-
116
- assert self.lab_value, "Lab value must be set to set value by distribution"
117
- self.unit = self.lab_value.default_unit
118
-
119
- if not distribution:
120
- distribution = lab_value.get_default_default_distribution()
121
-
122
- if not distribution:
123
- warnings.warn(
124
- "No distribution set for lab value, assuming uniform numeric distribution based on normal values"
125
- )
126
-
127
- if not self.normal_range.get("min", None) or not self.normal_range.get("max", None):
128
- self.set_norm_values_from_default()
129
-
130
- self.normal_range:dict
131
- _min = self.normal_range.get("min", 0.0001)
132
- _max = self.normal_range.get("max", 100)
133
- _name = "auto-" + self.lab_value.name + "-distribution-default-uniform"
134
- distribution = NumericValueDistribution(
135
- name = _name,
136
- min_value = _min,
137
- max_value = _max,
138
- distribution_type = "uniform"
139
- )
140
-
141
- value = distribution.generate_value()
142
- self.value = value
143
- if save:
144
- self.save()
145
-
146
- return value
147
-
148
- if isinstance(distribution, SingleCategoricalValueDistribution):
149
- value = distribution.generate_value()
150
- self.value_str = value
151
- if save:
152
- self.save()
153
- return value
154
-
155
- elif isinstance(distribution, NumericValueDistribution):
156
- value = distribution.generate_value()
157
- self.value = value
158
- if save:
159
- self.save()
160
- return value
161
-
162
- elif isinstance(distribution, MultipleCategoricalValueDistribution):
163
- value = distribution.generate_value()
164
- self.value_str = value
165
- if save:
166
- self.save()
167
- return value
168
-
169
- elif isinstance(distribution, DateValueDistribution):
170
- # raise not implemented error
171
- value = distribution.generate_value()
172
- self.value = value
173
- if save:
174
- self.save()
175
-
176
-
@@ -1,44 +0,0 @@
1
- from django.db import models
2
- from django.utils.translation import gettext_lazy as _
3
-
4
- class PatientMedication(models.Model):
5
- patient = models.ForeignKey("Patient", on_delete= models.CASCADE)
6
- medication_indication = models.ForeignKey(
7
- "MedicationIndication", on_delete=models.CASCADE,
8
- related_name="patient_medications", null=True
9
- )
10
-
11
- medication_schedules = models.ManyToManyField(
12
- 'MedicationSchedule'
13
- )
14
- unit = models.ForeignKey('Unit', on_delete=models.CASCADE)
15
- dosage = models.JSONField()
16
- active = models.BooleanField(default=True)
17
-
18
- objects = models.Manager()
19
-
20
- class Meta:
21
- verbose_name = _('Patient Medication')
22
- verbose_name_plural = _('Patient Medications')
23
-
24
- @classmethod
25
- def create_by_patient_and_indication(cls, patient, medication_indication):
26
- from endoreg_db.models import MedicationIndication
27
- medication_indication: MedicationIndication
28
- patient_medication = cls.objects.create(patient=patient, medication_indication=medication_indication)
29
- patient_medication.save()
30
- patient_medication.set_schedules_from_indication()
31
-
32
- return patient_medication
33
-
34
- def set_schedules_from_indication(self):
35
- schedules = self.medication_indication.medication_schedules.all()
36
- self.medication_schedules.set(schedules)
37
- self.save()
38
-
39
- def __str__(self):
40
- indication = self.medication_indication
41
- schedules = self.medication_schedules.all()
42
- return f'{indication} - {schedules}'
43
-
44
-
@@ -1,28 +0,0 @@
1
- from django.db import models
2
-
3
- class PatientMedicationSchedule(models.Model):
4
- patient = models.ForeignKey("Patient", on_delete= models.CASCADE)
5
- medication = models.ManyToManyField(
6
- 'PatientMedication', related_name='patient_medication_schedules'
7
- )
8
-
9
- created_at = models.DateTimeField(auto_now_add=True)
10
- updated_at = models.DateTimeField(auto_now=True)
11
-
12
- def __str__(self):
13
- return f'{self.patient} - {self.medication.all()}'
14
-
15
- @classmethod
16
- def create_by_patient_and_indication_type(cls, patient, indication_type):
17
- from endoreg_db.models import MedicationIndicationType, PatientMedication
18
-
19
- medication_indication = MedicationIndicationType.get_random_indication_by_type(name=indication_type)
20
-
21
- patient_medication_schedule = cls.objects.create(patient=patient)
22
- patient_medication_schedule.save()
23
-
24
- patient_medication = PatientMedication.create_by_patient_and_indication(patient, medication_indication)
25
- patient_medication_schedule.medication.add(patient_medication)
26
- patient_medication_schedule.save()
27
-
28
- return patient_medication_schedule
@@ -1,31 +0,0 @@
1
- from abc import abstractmethod
2
- from django.db import models
3
-
4
- class Person(models.Model):
5
- """
6
- Abstract base class for a person.
7
-
8
- Attributes:
9
- first_name (str): The first name of the person.
10
- last_name (str): The last name of the person.
11
- dob (date): The date of birth of the person.
12
- gender (str): The gender of the person.
13
- email (str): The email address of the person.
14
- phone (str): The phone number of the person.
15
- """
16
-
17
- first_name = models.CharField(max_length=255)
18
- last_name = models.CharField(max_length=255)
19
- dob = models.DateField("Date of Birth", blank=True, null=True)
20
- gender = models.ForeignKey("Gender", on_delete=models.SET_NULL, null=True)
21
- email = models.EmailField(max_length=255, blank=True, null=True)
22
- phone = models.CharField(max_length=255, blank=True, null=True)
23
- is_real_person = models.BooleanField(default=True)
24
-
25
- @abstractmethod
26
- def __str__(self):
27
- pass
28
-
29
- class Meta:
30
- abstract = True
31
-
@@ -1,27 +0,0 @@
1
- from django.db import models
2
-
3
- # models.py in your main app
4
- from django.contrib.auth.models import User
5
-
6
- class ProfessionManager(models.Manager):
7
- def get_by_natural_key(self, name):
8
- return self.get(name=name)
9
-
10
- class Profession(models.Model):
11
- objects = ProfessionManager()
12
- name = models.CharField(max_length=100)
13
- name_de = models.CharField(max_length=100, blank=True, null=True)
14
- name_en = models.CharField(max_length=100, blank=True, null=True)
15
- description = models.TextField(blank=True, null=True)
16
-
17
- def __str__(self):
18
- return self.name_de
19
-
20
- class PortalUserInfo(models.Model):
21
- user = models.OneToOneField(User, on_delete=models.CASCADE)
22
- profession = models.ForeignKey('Profession', on_delete=models.CASCADE, blank=True, null=True)
23
- works_in_endoscopy = models.BooleanField(blank=True, null=True)
24
- # Add other fields as needed
25
-
26
- def __str__(self):
27
- return self.user.username
@@ -1,2 +0,0 @@
1
- from .image_classification import ImageClassificationPrediction
2
- from .video_prediction_meta import LegacyVideoPredictionMeta, VideoPredictionMeta