endoreg-db 0.3.4__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 (350) hide show
  1. endoreg_db/admin.py +3 -3
  2. endoreg_db/apps.py +6 -6
  3. endoreg_db/data/__init__.py +65 -16
  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 -0
  6. endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
  7. endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
  8. endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
  9. endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
  10. endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
  11. endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
  12. endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
  13. endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
  14. endoreg_db/data/case_template/template/base.yaml +8 -0
  15. endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
  16. endoreg_db/data/case_template/tmp/_rule_value +13 -0
  17. endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
  18. endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
  19. endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
  20. endoreg_db/data/center/data.yaml +60 -52
  21. endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
  22. endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
  23. endoreg_db/data/disease/cardiovascular.yaml +37 -0
  24. endoreg_db/data/disease/hepatology.yaml +5 -0
  25. endoreg_db/data/disease/misc.yaml +6 -0
  26. endoreg_db/data/disease/renal.yaml +5 -0
  27. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
  28. endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
  29. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
  30. endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
  31. endoreg_db/data/distribution/date/patient.yaml +7 -0
  32. endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
  33. endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
  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 +28 -0
  37. endoreg_db/data/event/neurology.yaml +14 -0
  38. endoreg_db/data/event/surgery.yaml +13 -0
  39. endoreg_db/data/event/thrombembolism.yaml +20 -0
  40. endoreg_db/data/examination/examinations/data.yaml +65 -16
  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 -0
  45. endoreg_db/data/information_source/data.yaml +30 -30
  46. endoreg_db/data/information_source/medication.yaml +6 -0
  47. endoreg_db/data/lab_value/cardiac_enzymes.yaml +31 -0
  48. endoreg_db/data/lab_value/coagulation.yaml +49 -0
  49. endoreg_db/data/lab_value/electrolytes.yaml +190 -0
  50. endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -0
  51. endoreg_db/data/lab_value/hematology.yaml +169 -0
  52. endoreg_db/data/lab_value/hormones.yaml +53 -0
  53. endoreg_db/data/lab_value/lipids.yaml +44 -0
  54. endoreg_db/data/lab_value/misc.yaml +30 -0
  55. endoreg_db/data/lab_value/renal_function.yaml +11 -0
  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/material/material.yaml +91 -0
  60. endoreg_db/data/medication/anticoagulation.yaml +65 -0
  61. endoreg_db/data/medication/tah.yaml +70 -0
  62. endoreg_db/data/medication_indication/anticoagulation.yaml +120 -0
  63. endoreg_db/data/medication_indication_type/data.yaml +11 -0
  64. endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
  65. endoreg_db/data/medication_intake_time/base.yaml +31 -0
  66. endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
  67. endoreg_db/data/medication_schedule/ass.yaml +12 -0
  68. endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
  69. endoreg_db/data/model_type/data.yaml +6 -6
  70. endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
  71. endoreg_db/data/pdf_type/data.yaml +28 -28
  72. endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
  73. endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
  74. endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
  75. endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
  76. endoreg_db/data/profession/data.yaml +70 -70
  77. endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
  78. endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +26 -26
  79. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +19 -19
  80. endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
  81. endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
  82. endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
  83. endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
  84. endoreg_db/data/unit/concentration.yaml +92 -0
  85. endoreg_db/data/unit/data.yaml +17 -17
  86. endoreg_db/data/unit/length.yaml +30 -30
  87. endoreg_db/data/unit/misc.yaml +20 -0
  88. endoreg_db/data/unit/rate.yaml +6 -0
  89. endoreg_db/data/unit/time.yaml +13 -0
  90. endoreg_db/data/unit/volume.yaml +35 -26
  91. endoreg_db/data/unit/weight.yaml +37 -30
  92. endoreg_db/data/waste/data.yaml +12 -0
  93. endoreg_db/forms/__init__.py +2 -2
  94. endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
  95. endoreg_db/forms/settings/__init__.py +8 -8
  96. endoreg_db/forms/unit.py +5 -5
  97. endoreg_db/management/commands/_load_model_template.py +40 -40
  98. endoreg_db/management/commands/delete_all.py +18 -18
  99. endoreg_db/management/commands/delete_legacy_images.py +19 -19
  100. endoreg_db/management/commands/delete_legacy_videos.py +16 -16
  101. endoreg_db/management/commands/extract_legacy_video_frames.py +18 -18
  102. endoreg_db/management/commands/fetch_legacy_image_dataset.py +32 -32
  103. endoreg_db/management/commands/fix_auth_permission.py +20 -20
  104. endoreg_db/management/commands/import_legacy_images.py +94 -94
  105. endoreg_db/management/commands/import_legacy_videos.py +76 -76
  106. endoreg_db/management/commands/load_active_model_data.py +44 -44
  107. endoreg_db/management/commands/load_ai_model_data.py +44 -44
  108. endoreg_db/management/commands/load_base_db_data.py +128 -71
  109. endoreg_db/management/commands/load_center_data.py +42 -42
  110. endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
  111. endoreg_db/management/commands/load_disease_classification_data.py +41 -0
  112. endoreg_db/management/commands/load_disease_data.py +40 -0
  113. endoreg_db/management/commands/load_distribution_data.py +66 -0
  114. endoreg_db/management/commands/load_endoscope_type_data.py +44 -44
  115. endoreg_db/management/commands/load_endoscopy_processor_data.py +44 -44
  116. endoreg_db/management/commands/load_event_data.py +41 -0
  117. endoreg_db/management/commands/load_examination_data.py +74 -74
  118. endoreg_db/management/commands/load_g_play_data.py +113 -0
  119. endoreg_db/management/commands/load_gender_data.py +44 -0
  120. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +133 -0
  121. endoreg_db/management/commands/load_information_source.py +44 -44
  122. endoreg_db/management/commands/load_lab_value_data.py +50 -0
  123. endoreg_db/management/commands/load_label_data.py +66 -66
  124. endoreg_db/management/commands/load_medication_data.py +41 -0
  125. endoreg_db/management/commands/load_medication_indication_data.py +63 -0
  126. endoreg_db/management/commands/load_medication_indication_type_data.py +41 -0
  127. endoreg_db/management/commands/load_medication_intake_time_data.py +41 -0
  128. endoreg_db/management/commands/load_medication_schedule_data.py +55 -0
  129. endoreg_db/management/commands/load_pdf_type_data.py +60 -60
  130. endoreg_db/management/commands/load_profession_data.py +43 -43
  131. endoreg_db/management/commands/load_report_reader_flag.py +45 -45
  132. endoreg_db/management/commands/load_unit_data.py +45 -45
  133. endoreg_db/management/commands/load_user_groups.py +28 -28
  134. endoreg_db/management/commands/register_ai_model.py +65 -65
  135. endoreg_db/management/commands/reset_celery_schedule.py +9 -9
  136. endoreg_db/migrations/0001_initial.py +582 -582
  137. endoreg_db/migrations/0002_rawvideofile.py +26 -26
  138. endoreg_db/migrations/0003_rawvideofile_frames_required.py +18 -18
  139. endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +18 -18
  140. endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +56 -56
  141. endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +25 -25
  142. endoreg_db/migrations/0007_rawvideofile_processor.py +19 -19
  143. endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +18 -18
  144. endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +31 -31
  145. endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +18 -18
  146. endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +18 -18
  147. endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +109 -109
  148. endoreg_db/migrations/0013_rawpdffile.py +31 -31
  149. endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +38 -38
  150. endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +31 -31
  151. endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +18 -18
  152. endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +37 -37
  153. endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +37 -37
  154. endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +42 -42
  155. endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +18 -18
  156. endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +19 -19
  157. endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +19 -19
  158. endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -59
  159. endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -27
  160. endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -0
  161. endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -0
  162. endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -0
  163. endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -0
  164. endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -0
  165. endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -0
  166. endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -0
  167. endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -0
  168. endoreg_db/migrations/0033_medicationindication_sources.py +18 -0
  169. endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -0
  170. endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -0
  171. endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -0
  172. endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -0
  173. endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -0
  174. endoreg_db/migrations/0039_referenceproduct_name.py +19 -0
  175. endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -0
  176. endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -0
  177. endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -0
  178. endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -0
  179. endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -0
  180. endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -0
  181. endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -0
  182. endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -0
  183. endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -0
  184. endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -0
  185. endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -0
  186. endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -0
  187. endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -0
  188. endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -0
  189. endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -0
  190. endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -0
  191. endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -0
  192. endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -0
  193. endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -0
  194. endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -0
  195. endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -0
  196. endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -0
  197. endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -0
  198. endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -0
  199. endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -0
  200. endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -0
  201. endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -0
  202. endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -0
  203. endoreg_db/models/__init__.py +74 -57
  204. endoreg_db/models/ai_model/__init__.py +3 -3
  205. endoreg_db/models/ai_model/active_model.py +9 -9
  206. endoreg_db/models/ai_model/model_meta.py +24 -24
  207. endoreg_db/models/ai_model/model_type.py +25 -25
  208. endoreg_db/models/ai_model/utils.py +8 -8
  209. endoreg_db/models/annotation/__init__.py +1 -1
  210. endoreg_db/models/annotation/binary_classification_annotation_task.py +80 -80
  211. endoreg_db/models/annotation/image_classification.py +26 -26
  212. endoreg_db/models/case_template/__init__.py +6 -0
  213. endoreg_db/models/case_template/case_template.py +81 -0
  214. endoreg_db/models/case_template/case_template_rule.py +276 -0
  215. endoreg_db/models/case_template/case_template_rule_value.py +73 -0
  216. endoreg_db/models/case_template/case_template_type.py +28 -0
  217. endoreg_db/models/center/__init__.py +4 -0
  218. endoreg_db/models/{center.py → center/center.py} +24 -24
  219. endoreg_db/models/center/center_product.py +34 -0
  220. endoreg_db/models/center/center_resource.py +19 -0
  221. endoreg_db/models/center/center_waste.py +11 -0
  222. endoreg_db/models/data_file/__init__.py +5 -5
  223. endoreg_db/models/data_file/base_classes/__init__.py +2 -2
  224. endoreg_db/models/data_file/base_classes/abstract_frame.py +50 -50
  225. endoreg_db/models/data_file/base_classes/abstract_video.py +200 -200
  226. endoreg_db/models/data_file/frame.py +45 -45
  227. endoreg_db/models/data_file/import_classes/__init__.py +31 -31
  228. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +34 -34
  229. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +28 -28
  230. endoreg_db/models/data_file/import_classes/processing_functions/video.py +260 -260
  231. endoreg_db/models/data_file/import_classes/raw_pdf.py +188 -185
  232. endoreg_db/models/data_file/import_classes/raw_video.py +343 -343
  233. endoreg_db/models/data_file/metadata/__init__.py +3 -3
  234. endoreg_db/models/data_file/metadata/pdf_meta.py +70 -70
  235. endoreg_db/models/data_file/metadata/sensitive_meta.py +31 -31
  236. endoreg_db/models/data_file/metadata/video_meta.py +132 -131
  237. endoreg_db/models/data_file/report_file.py +89 -89
  238. endoreg_db/models/data_file/video/__init__.py +6 -6
  239. endoreg_db/models/data_file/video/import_meta.py +25 -25
  240. endoreg_db/models/data_file/video/video.py +25 -25
  241. endoreg_db/models/data_file/video_segment.py +107 -107
  242. endoreg_db/models/disease.py +56 -0
  243. endoreg_db/models/emission/__init__.py +1 -0
  244. endoreg_db/models/emission/emission_factor.py +20 -0
  245. endoreg_db/models/event.py +22 -0
  246. endoreg_db/models/examination/__init__.py +3 -3
  247. endoreg_db/models/examination/examination.py +26 -26
  248. endoreg_db/models/examination/examination_time.py +27 -27
  249. endoreg_db/models/examination/examination_time_type.py +24 -24
  250. endoreg_db/models/examination/examination_type.py +18 -18
  251. endoreg_db/models/hardware/__init__.py +1 -1
  252. endoreg_db/models/hardware/endoscope.py +44 -44
  253. endoreg_db/models/hardware/endoscopy_processor.py +143 -143
  254. endoreg_db/models/information_source.py +29 -22
  255. endoreg_db/models/label/label.py +84 -84
  256. endoreg_db/models/laboratory/__init__.py +1 -0
  257. endoreg_db/models/laboratory/lab_value.py +102 -0
  258. endoreg_db/models/legacy_data/__init__.py +3 -3
  259. endoreg_db/models/legacy_data/image.py +34 -34
  260. endoreg_db/models/medication/__init__.py +1 -0
  261. endoreg_db/models/medication/medication.py +148 -0
  262. endoreg_db/models/other/__init__.py +5 -0
  263. endoreg_db/models/other/distribution.py +215 -0
  264. endoreg_db/models/other/material.py +16 -0
  265. endoreg_db/models/other/resource.py +18 -0
  266. endoreg_db/models/other/transport_route.py +21 -0
  267. endoreg_db/models/other/waste.py +20 -0
  268. endoreg_db/models/patient_examination/__init__.py +35 -35
  269. endoreg_db/models/permissions/__init__.py +44 -44
  270. endoreg_db/models/persons/__init__.py +7 -6
  271. endoreg_db/models/persons/examiner/__init__.py +1 -1
  272. endoreg_db/models/persons/examiner/examiner.py +15 -15
  273. endoreg_db/models/persons/examiner/examiner_type.py +1 -1
  274. endoreg_db/models/persons/first_name.py +17 -17
  275. endoreg_db/models/persons/gender.py +22 -0
  276. endoreg_db/models/persons/last_name.py +19 -19
  277. endoreg_db/models/persons/patient/__init__.py +8 -0
  278. endoreg_db/models/persons/patient/case/__init__.py +0 -0
  279. endoreg_db/models/persons/patient/case/case.py +30 -0
  280. endoreg_db/models/persons/patient/patient.py +216 -0
  281. endoreg_db/models/persons/patient/patient_disease.py +16 -0
  282. endoreg_db/models/persons/patient/patient_event.py +22 -0
  283. endoreg_db/models/persons/patient/patient_lab_sample.py +106 -0
  284. endoreg_db/models/persons/patient/patient_lab_value.py +176 -0
  285. endoreg_db/models/persons/patient/patient_medication.py +44 -0
  286. endoreg_db/models/persons/patient/patient_medication_schedule.py +28 -0
  287. endoreg_db/models/persons/person.py +31 -34
  288. endoreg_db/models/persons/portal_user_information.py +27 -29
  289. endoreg_db/models/prediction/__init__.py +1 -1
  290. endoreg_db/models/prediction/image_classification.py +37 -37
  291. endoreg_db/models/prediction/video_prediction_meta.py +244 -244
  292. endoreg_db/models/product/__init__.py +5 -0
  293. endoreg_db/models/product/product.py +97 -0
  294. endoreg_db/models/product/product_group.py +19 -0
  295. endoreg_db/models/product/product_material.py +24 -0
  296. endoreg_db/models/product/product_weight.py +26 -0
  297. endoreg_db/models/product/reference_product.py +99 -0
  298. endoreg_db/models/questionnaires/__init__.py +114 -114
  299. endoreg_db/models/quiz/__init__.py +2 -0
  300. endoreg_db/models/quiz/quiz_answer.py +41 -0
  301. endoreg_db/models/quiz/quiz_question.py +54 -0
  302. endoreg_db/models/report_reader/__init__.py +1 -1
  303. endoreg_db/models/report_reader/report_reader_config.py +53 -53
  304. endoreg_db/models/report_reader/report_reader_flag.py +19 -19
  305. endoreg_db/models/rules/__init__.py +5 -0
  306. endoreg_db/models/rules/rule.py +24 -0
  307. endoreg_db/models/rules/rule_applicator.py +224 -0
  308. endoreg_db/models/rules/rule_attribute_dtype.py +19 -0
  309. endoreg_db/models/rules/rule_type.py +22 -0
  310. endoreg_db/models/rules/ruleset.py +19 -0
  311. endoreg_db/models/unit.py +21 -19
  312. endoreg_db/queries/__init__.py +4 -4
  313. endoreg_db/queries/annotations/__init__.py +2 -2
  314. endoreg_db/queries/annotations/legacy.py +159 -159
  315. endoreg_db/queries/get/__init__.py +5 -5
  316. endoreg_db/queries/get/center.py +42 -42
  317. endoreg_db/queries/get/model.py +13 -13
  318. endoreg_db/queries/get/patient.py +14 -14
  319. endoreg_db/queries/get/patient_examination.py +20 -20
  320. endoreg_db/queries/get/report_file.py +33 -33
  321. endoreg_db/queries/get/video.py +31 -31
  322. endoreg_db/serializers/__init__.py +9 -9
  323. endoreg_db/serializers/ai_model.py +18 -18
  324. endoreg_db/serializers/annotation.py +17 -17
  325. endoreg_db/serializers/center.py +11 -11
  326. endoreg_db/serializers/examination.py +32 -32
  327. endoreg_db/serializers/frame.py +13 -13
  328. endoreg_db/serializers/hardware.py +20 -20
  329. endoreg_db/serializers/label.py +22 -22
  330. endoreg_db/serializers/patient.py +10 -10
  331. endoreg_db/serializers/prediction.py +15 -15
  332. endoreg_db/serializers/report_file.py +7 -7
  333. endoreg_db/serializers/video.py +27 -27
  334. endoreg_db/tests.py +3 -3
  335. endoreg_db/utils/cropping.py +28 -28
  336. endoreg_db/utils/dataloader.py +92 -185
  337. endoreg_db/utils/file_operations.py +30 -30
  338. endoreg_db/utils/hashs.py +33 -33
  339. endoreg_db/utils/legacy_ocr.py +201 -201
  340. endoreg_db/utils/ocr.py +197 -197
  341. endoreg_db/utils/uuid.py +4 -4
  342. endoreg_db/utils/video_metadata.py +87 -87
  343. endoreg_db/views.py +3 -3
  344. {endoreg_db-0.3.4.dist-info → endoreg_db-0.3.6.dist-info}/LICENSE +674 -674
  345. {endoreg_db-0.3.4.dist-info → endoreg_db-0.3.6.dist-info}/METADATA +2 -2
  346. endoreg_db-0.3.6.dist-info/RECORD +357 -0
  347. {endoreg_db-0.3.4.dist-info → endoreg_db-0.3.6.dist-info}/WHEEL +1 -1
  348. endoreg_db/models/persons/patient.py +0 -58
  349. endoreg_db/models.py +0 -3
  350. endoreg_db-0.3.4.dist-info/RECORD +0 -185
@@ -1,185 +1,188 @@
1
- # models/data_file/import_classes/raw_pdf.py
2
- # django db model "RawPdf"
3
- # Class to store raw pdf file using django file field
4
- # Class contains classmethod to create object from pdf file
5
- # objects contains methods to extract text, extract metadata from text and anonymize text from pdf file uzing agl_report_reader.ReportReader class
6
- # ------------------------------------------------------------------------------
7
-
8
- from django.db import models
9
- from django.core.files.storage import FileSystemStorage
10
- from django.core.files import File
11
- from django.conf import settings
12
- from django.utils import timezone
13
- from django.core.exceptions import ValidationError
14
- from django.core.validators import FileExtensionValidator
15
- from endoreg_db.utils.file_operations import get_uuid_filename
16
-
17
- from agl_report_reader.report_reader import ReportReader
18
-
19
- from endoreg_db.utils.hashs import get_pdf_hash
20
- from ..metadata import SensitiveMeta
21
-
22
- # setup logging to pdf_import.log
23
- import logging
24
- logger = logging.getLogger('pdf_import')
25
-
26
- import shutil
27
-
28
- class RawPdfFile(models.Model):
29
- file = models.FileField(
30
- upload_to='raw_pdf/',
31
- validators=[FileExtensionValidator(allowed_extensions=['pdf'])],
32
- storage=FileSystemStorage(location=settings.PSEUDO_DIR_RAW_PDF.resolve().as_posix()),
33
- )
34
-
35
- pdf_hash = models.CharField(max_length=255, unique=True)
36
- pdf_type = models.ForeignKey('PdfType', on_delete=models.CASCADE)
37
- center = models.ForeignKey('Center', on_delete=models.CASCADE)
38
-
39
- state_report_processing_required = models.BooleanField(default = True)
40
- state_report_processed = models.BooleanField(default=False)
41
-
42
- # report_file = models.OneToOneField("ReportFile", on_delete=models.CASCADE, null=True, blank=True)
43
- sensitive_meta = models.OneToOneField(
44
- 'SensitiveMeta',
45
- on_delete=models.CASCADE,
46
- related_name='raw_pdf_file',
47
- null=True,
48
- blank=True,
49
- )
50
-
51
- text = models.TextField(blank=True, null=True)
52
- anonymized_text = models.TextField(blank=True, null=True)
53
-
54
- raw_meta = models.JSONField(blank=True, null=True)
55
-
56
- created_at = models.DateTimeField(auto_now_add=True)
57
-
58
- def __str__(self):
59
- str_repr = f"RawPdfFile: {self.file.name}"
60
- return str_repr
61
-
62
- @classmethod
63
- def create_from_file(
64
- cls,
65
- file_path,
66
- center_name,
67
- pdf_type_name,
68
- destination_dir,
69
- save=True,
70
- ):
71
- from endoreg_db.models import PdfType, Center
72
- logger.info(f"Creating RawPdfFile object from file: {file_path}")
73
- original_file_name = file_path.name
74
-
75
- new_file_name, uuid = get_uuid_filename(file_path)
76
-
77
- if not destination_dir.exists():
78
- destination_dir.mkdir(parents=True)
79
-
80
- pdf_hash = get_pdf_hash(file_path)
81
-
82
- # check if pdf file already exists
83
- if cls.objects.filter(pdf_hash=pdf_hash).exists():
84
- logger.warning(f"RawPdfFile with hash {pdf_hash} already exists")
85
- return None
86
-
87
- assert pdf_type_name is not None, "pdf_type_name is required"
88
- assert center_name is not None, "center_name is required"
89
-
90
- pdf_type = PdfType.objects.get(name=pdf_type_name)
91
- center = Center.objects.get(name=center_name)
92
-
93
- new_file_path = destination_dir / new_file_name
94
-
95
- logger.info(f"Copying file to {new_file_path}")
96
- success = shutil.copy(file_path, new_file_path)
97
-
98
- # validate copy operation by comparing hashs
99
- assert get_pdf_hash(new_file_path) == pdf_hash, "Copy operation failed"
100
-
101
- raw_pdf = cls(
102
- file=new_file_path.resolve().as_posix(),
103
- pdf_hash=pdf_hash,
104
- pdf_type=pdf_type,
105
- center=center,
106
- )
107
- logger.info(f"RawPdfFile object created: {raw_pdf}")
108
-
109
- # remove source file
110
- file_path.unlink()
111
- logger.info(f"Source file removed: {file_path}")
112
-
113
- if save:
114
- raw_pdf.save()
115
-
116
-
117
- return raw_pdf
118
-
119
- def process_file(self, verbose = False):
120
-
121
- pdf_path = self.file.path
122
- rr_config = self.get_report_reader_config()
123
-
124
- rr = ReportReader(**rr_config) #FIXME In future we need to pass a configuration file
125
- # This configuration file should be associated with pdf type
126
-
127
- text, anonymized_text, report_meta = rr.process_report(pdf_path, verbose=verbose)
128
- if not self.sensitive_meta:
129
- sensitive_meta = SensitiveMeta.create_from_dict(report_meta)
130
- sensitive_meta.save()
131
- self.sensitive_meta = sensitive_meta
132
-
133
- else:
134
- # update existing sensitive meta
135
- sensitive_meta = self.sensitive_meta
136
- sensitive_meta.update_from_dict(report_meta)
137
-
138
- return text, anonymized_text, report_meta
139
-
140
- def update(self, save=True, verbose = True):
141
- try:
142
- self.text, self.anonymized_text, self.raw_meta = self.process_file(verbose = verbose)
143
- self.state_report_processed = True
144
- self.state_report_processing_required = False
145
-
146
- if save:
147
-
148
- self.save()
149
-
150
- return True
151
-
152
- except:
153
- logger.error(f"Error processing file: {self.file.path}")
154
- return False
155
-
156
- def save(self, *args, **kwargs):
157
- if not self.file.name.endswith('.pdf'):
158
- raise ValidationError('Only PDF files are allowed')
159
-
160
- if not self.pdf_hash:
161
- self.pdf_hash = get_pdf_hash(self.file.path)
162
-
163
- super().save(*args, **kwargs)
164
-
165
-
166
- def get_report_reader_config(self):
167
- if self.pdf_type.endoscope_info_line:
168
- endoscope_info_line = self.pdf_type.endoscope_info_line.value
169
- else:
170
- endoscope_info_line = None
171
- settings_dict = {
172
- "locale": "de_DE",
173
- "employee_first_names": [_.name for _ in self.center.first_names.all()],
174
- "employee_last_names": [_.name for _ in self.center.last_names.all()],
175
- "text_date_format":'%d.%m.%Y',
176
- "flags": {
177
- "patient_info_line": self.pdf_type.patient_info_line.value,
178
- "endoscope_info_line": endoscope_info_line,
179
- "examiner_info_line": self.pdf_type.examiner_info_line.value,
180
- "cut_off_below": [_.value for _ in self.pdf_type.cut_off_below_lines.all()],
181
- "cut_off_above": [_.value for _ in self.pdf_type.cut_off_above_lines.all()],
182
- }
183
- }
184
-
185
- return settings_dict
1
+ # models/data_file/import_classes/raw_pdf.py
2
+ # django db model "RawPdf"
3
+ # Class to store raw pdf file using django file field
4
+ # Class contains classmethod to create object from pdf file
5
+ # objects contains methods to extract text, extract metadata from text and anonymize text from pdf file uzing agl_report_reader.ReportReader class
6
+ # ------------------------------------------------------------------------------
7
+
8
+ from django.db import models
9
+ from django.core.files.storage import FileSystemStorage
10
+ from django.core.files import File
11
+ from django.conf import settings
12
+ from django.utils import timezone
13
+ from django.core.exceptions import ValidationError
14
+ from django.core.validators import FileExtensionValidator
15
+ from endoreg_db.utils.file_operations import get_uuid_filename
16
+
17
+ from agl_report_reader.report_reader import ReportReader
18
+
19
+ from endoreg_db.utils.hashs import get_pdf_hash
20
+ from ..metadata import SensitiveMeta
21
+
22
+ # setup logging to pdf_import.log
23
+ import logging
24
+ logger = logging.getLogger('pdf_import')
25
+
26
+ import shutil
27
+
28
+ # get pdf location from settings, default to ~/erc_data/raw_pdf and create if not exists
29
+ PSEUDO_DIR_RAW_PDF = getattr(settings, 'PSEUDO_DIR_RAW_PDF', settings.BASE_DIR / 'erc_data/raw_pdf')
30
+
31
+ class RawPdfFile(models.Model):
32
+ file = models.FileField(
33
+ upload_to='raw_pdf/',
34
+ validators=[FileExtensionValidator(allowed_extensions=['pdf'])],
35
+ storage=FileSystemStorage(location=PSEUDO_DIR_RAW_PDF.resolve().as_posix()),
36
+ )
37
+
38
+ pdf_hash = models.CharField(max_length=255, unique=True)
39
+ pdf_type = models.ForeignKey('PdfType', on_delete=models.CASCADE)
40
+ center = models.ForeignKey('Center', on_delete=models.CASCADE)
41
+
42
+ state_report_processing_required = models.BooleanField(default = True)
43
+ state_report_processed = models.BooleanField(default=False)
44
+
45
+ # report_file = models.OneToOneField("ReportFile", on_delete=models.CASCADE, null=True, blank=True)
46
+ sensitive_meta = models.OneToOneField(
47
+ 'SensitiveMeta',
48
+ on_delete=models.CASCADE,
49
+ related_name='raw_pdf_file',
50
+ null=True,
51
+ blank=True,
52
+ )
53
+
54
+ text = models.TextField(blank=True, null=True)
55
+ anonymized_text = models.TextField(blank=True, null=True)
56
+
57
+ raw_meta = models.JSONField(blank=True, null=True)
58
+
59
+ created_at = models.DateTimeField(auto_now_add=True)
60
+
61
+ def __str__(self):
62
+ str_repr = f"RawPdfFile: {self.file.name}"
63
+ return str_repr
64
+
65
+ @classmethod
66
+ def create_from_file(
67
+ cls,
68
+ file_path,
69
+ center_name,
70
+ pdf_type_name,
71
+ destination_dir,
72
+ save=True,
73
+ ):
74
+ from endoreg_db.models import PdfType, Center
75
+ logger.info(f"Creating RawPdfFile object from file: {file_path}")
76
+ original_file_name = file_path.name
77
+
78
+ new_file_name, uuid = get_uuid_filename(file_path)
79
+
80
+ if not destination_dir.exists():
81
+ destination_dir.mkdir(parents=True)
82
+
83
+ pdf_hash = get_pdf_hash(file_path)
84
+
85
+ # check if pdf file already exists
86
+ if cls.objects.filter(pdf_hash=pdf_hash).exists():
87
+ logger.warning(f"RawPdfFile with hash {pdf_hash} already exists")
88
+ return None
89
+
90
+ assert pdf_type_name is not None, "pdf_type_name is required"
91
+ assert center_name is not None, "center_name is required"
92
+
93
+ pdf_type = PdfType.objects.get(name=pdf_type_name)
94
+ center = Center.objects.get(name=center_name)
95
+
96
+ new_file_path = destination_dir / new_file_name
97
+
98
+ logger.info(f"Copying file to {new_file_path}")
99
+ success = shutil.copy(file_path, new_file_path)
100
+
101
+ # validate copy operation by comparing hashs
102
+ assert get_pdf_hash(new_file_path) == pdf_hash, "Copy operation failed"
103
+
104
+ raw_pdf = cls(
105
+ file=new_file_path.resolve().as_posix(),
106
+ pdf_hash=pdf_hash,
107
+ pdf_type=pdf_type,
108
+ center=center,
109
+ )
110
+ logger.info(f"RawPdfFile object created: {raw_pdf}")
111
+
112
+ # remove source file
113
+ file_path.unlink()
114
+ logger.info(f"Source file removed: {file_path}")
115
+
116
+ if save:
117
+ raw_pdf.save()
118
+
119
+
120
+ return raw_pdf
121
+
122
+ def process_file(self, verbose = False):
123
+
124
+ pdf_path = self.file.path
125
+ rr_config = self.get_report_reader_config()
126
+
127
+ rr = ReportReader(**rr_config) #FIXME In future we need to pass a configuration file
128
+ # This configuration file should be associated with pdf type
129
+
130
+ text, anonymized_text, report_meta = rr.process_report(pdf_path, verbose=verbose)
131
+ if not self.sensitive_meta:
132
+ sensitive_meta = SensitiveMeta.create_from_dict(report_meta)
133
+ sensitive_meta.save()
134
+ self.sensitive_meta = sensitive_meta
135
+
136
+ else:
137
+ # update existing sensitive meta
138
+ sensitive_meta = self.sensitive_meta
139
+ sensitive_meta.update_from_dict(report_meta)
140
+
141
+ return text, anonymized_text, report_meta
142
+
143
+ def update(self, save=True, verbose = True):
144
+ try:
145
+ self.text, self.anonymized_text, self.raw_meta = self.process_file(verbose = verbose)
146
+ self.state_report_processed = True
147
+ self.state_report_processing_required = False
148
+
149
+ if save:
150
+
151
+ self.save()
152
+
153
+ return True
154
+
155
+ except:
156
+ logger.error(f"Error processing file: {self.file.path}")
157
+ return False
158
+
159
+ def save(self, *args, **kwargs):
160
+ if not self.file.name.endswith('.pdf'):
161
+ raise ValidationError('Only PDF files are allowed')
162
+
163
+ if not self.pdf_hash:
164
+ self.pdf_hash = get_pdf_hash(self.file.path)
165
+
166
+ super().save(*args, **kwargs)
167
+
168
+
169
+ def get_report_reader_config(self):
170
+ if self.pdf_type.endoscope_info_line:
171
+ endoscope_info_line = self.pdf_type.endoscope_info_line.value
172
+ else:
173
+ endoscope_info_line = None
174
+ settings_dict = {
175
+ "locale": "de_DE",
176
+ "employee_first_names": [_.name for _ in self.center.first_names.all()],
177
+ "employee_last_names": [_.name for _ in self.center.last_names.all()],
178
+ "text_date_format":'%d.%m.%Y',
179
+ "flags": {
180
+ "patient_info_line": self.pdf_type.patient_info_line.value,
181
+ "endoscope_info_line": endoscope_info_line,
182
+ "examiner_info_line": self.pdf_type.examiner_info_line.value,
183
+ "cut_off_below": [_.value for _ in self.pdf_type.cut_off_below_lines.all()],
184
+ "cut_off_above": [_.value for _ in self.pdf_type.cut_off_above_lines.all()],
185
+ }
186
+ }
187
+
188
+ return settings_dict