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,15 +1,15 @@
1
- from rest_framework import serializers
2
- from endoreg_db.models import (
3
- ImageClassificationPrediction,
4
- LegacyVideoPredictionMeta
5
- )
6
-
7
- class ImageClassificationPredictionSerializer(serializers.ModelSerializer):
8
- class Meta:
9
- model = ImageClassificationPrediction
10
- fields = '__all__'
11
-
12
- class LegacyVideoPredictionMetaSerializer(serializers.ModelSerializer):
13
- class Meta:
14
- model = LegacyVideoPredictionMeta
15
- fields = '__all__'
1
+ from rest_framework import serializers
2
+ from endoreg_db.models import (
3
+ ImageClassificationPrediction,
4
+ LegacyVideoPredictionMeta
5
+ )
6
+
7
+ class ImageClassificationPredictionSerializer(serializers.ModelSerializer):
8
+ class Meta:
9
+ model = ImageClassificationPrediction
10
+ fields = '__all__'
11
+
12
+ class LegacyVideoPredictionMetaSerializer(serializers.ModelSerializer):
13
+ class Meta:
14
+ model = LegacyVideoPredictionMeta
15
+ fields = '__all__'
@@ -1,7 +1,7 @@
1
- from rest_framework import serializers
2
- from endoreg_db.models import ReportFile
3
-
4
- class ReportFileSerializer(serializers.ModelSerializer):
5
- class Meta:
6
- model = ReportFile
7
- fields = '__all__'
1
+ from rest_framework import serializers
2
+ from endoreg_db.models import ReportFile
3
+
4
+ class ReportFileSerializer(serializers.ModelSerializer):
5
+ class Meta:
6
+ model = ReportFile
7
+ fields = '__all__'
@@ -1,27 +1,27 @@
1
- from rest_framework import serializers
2
- from endoreg_db.models import Video, LegacyVideo, VideoImportMeta, LegacyLabelVideoSegment, LabelVideoSegment
3
-
4
- class VideoSerializer(serializers.ModelSerializer):
5
- class Meta:
6
- model = Video
7
- fields = '__all__'
8
-
9
- class LegacyVideoSerializer(serializers.ModelSerializer):
10
- class Meta:
11
- model = LegacyVideo
12
- fields = '__all__'
13
-
14
- class VideoImportMetaSerializer(serializers.ModelSerializer):
15
- class Meta:
16
- model = VideoImportMeta
17
- fields = '__all__'
18
-
19
- class LabelVideoSegmentSerializer(serializers.ModelSerializer):
20
- class Meta:
21
- model = LabelVideoSegment
22
- fields = '__all__'
23
-
24
- class LegacyLabelVideoSegmentSerializer(serializers.ModelSerializer):
25
- class Meta:
26
- model = LegacyLabelVideoSegment
27
- fields = '__all__'
1
+ from rest_framework import serializers
2
+ from endoreg_db.models import Video, LegacyVideo, VideoImportMeta, LegacyLabelVideoSegment, LabelVideoSegment
3
+
4
+ class VideoSerializer(serializers.ModelSerializer):
5
+ class Meta:
6
+ model = Video
7
+ fields = '__all__'
8
+
9
+ class LegacyVideoSerializer(serializers.ModelSerializer):
10
+ class Meta:
11
+ model = LegacyVideo
12
+ fields = '__all__'
13
+
14
+ class VideoImportMetaSerializer(serializers.ModelSerializer):
15
+ class Meta:
16
+ model = VideoImportMeta
17
+ fields = '__all__'
18
+
19
+ class LabelVideoSegmentSerializer(serializers.ModelSerializer):
20
+ class Meta:
21
+ model = LabelVideoSegment
22
+ fields = '__all__'
23
+
24
+ class LegacyLabelVideoSegmentSerializer(serializers.ModelSerializer):
25
+ class Meta:
26
+ model = LegacyLabelVideoSegment
27
+ fields = '__all__'
endoreg_db/tests.py CHANGED
@@ -1,3 +1,3 @@
1
- from django.test import TestCase
2
-
3
- # Create your tests here.
1
+ from django.test import TestCase
2
+
3
+ # Create your tests here.
@@ -1,29 +1,29 @@
1
- from PIL import Image
2
-
3
- def crop_and_insert(image:Image, x, y, h, w, bg_color=(255, 255, 255)):
4
- """
5
- Crops a region from an inverted grayscale image and inserts it into a white image of the same size as the original.
6
-
7
- Parameters:
8
- - fp: File path or a file object of the original image.
9
- - x, y: The top-left coordinates of the rectangle to be cropped.
10
- - h, w: The height and width of the rectangle to be cropped.
11
-
12
- Returns:
13
- A PIL Image object containing the original image with the specified region replaced.
14
- """
15
- # Load the original image
16
- original_image = image
17
-
18
- # Crop the specified region from the inverted image
19
- crop_rectangle = (x, y, x + w, y + h)
20
- cropped_content = original_image.crop(crop_rectangle)
21
-
22
- # Create a new white image of the same size as the original image
23
- white_background = Image.new('RGB', original_image.size, bg_color)
24
-
25
- # Paste the cropped content onto the white image at the specified location
26
- white_background.paste(cropped_content, (x, y))
27
-
28
- # The final image can be displayed or saved as needed
1
+ from PIL import Image
2
+
3
+ def crop_and_insert(image:Image, x, y, h, w, bg_color=(255, 255, 255)):
4
+ """
5
+ Crops a region from an inverted grayscale image and inserts it into a white image of the same size as the original.
6
+
7
+ Parameters:
8
+ - fp: File path or a file object of the original image.
9
+ - x, y: The top-left coordinates of the rectangle to be cropped.
10
+ - h, w: The height and width of the rectangle to be cropped.
11
+
12
+ Returns:
13
+ A PIL Image object containing the original image with the specified region replaced.
14
+ """
15
+ # Load the original image
16
+ original_image = image
17
+
18
+ # Crop the specified region from the inverted image
19
+ crop_rectangle = (x, y, x + w, y + h)
20
+ cropped_content = original_image.crop(crop_rectangle)
21
+
22
+ # Create a new white image of the same size as the original image
23
+ white_background = Image.new('RGB', original_image.size, bg_color)
24
+
25
+ # Paste the cropped content onto the white image at the specified location
26
+ white_background.paste(cropped_content, (x, y))
27
+
28
+ # The final image can be displayed or saved as needed
29
29
  return white_background
@@ -1,185 +1,92 @@
1
- import os
2
- import yaml
3
- from django.core.exceptions import ObjectDoesNotExist
4
-
5
- def load_model_data_from_yaml(command, model_name, metadata, verbose):
6
- """
7
- Load model data from YAML files.
8
-
9
- Args:
10
- command: Command object for stdout writing.
11
- model_name: Name of the model being loaded.
12
- metadata: Metadata including directory and foreign key information.
13
- verbose: Boolean indicating whether to print verbose output.
14
- """
15
- if verbose:
16
- command.stdout.write(f"Start loading {model_name}")
17
- model = metadata["model"]
18
- dir_path = metadata["dir"]
19
- foreign_keys = metadata["foreign_keys"]
20
- foreign_key_models = metadata["foreign_key_models"]
21
-
22
- for file in [f for f in os.listdir(dir_path) if f.endswith('.yaml')]:
23
- with open(os.path.join(dir_path, file), 'r') as file:
24
- yaml_data = yaml.safe_load(file)
25
-
26
- load_data_with_foreign_keys(command, model, yaml_data, foreign_keys, foreign_key_models, verbose)
27
-
28
- def load_data_with_foreign_keys(command, model, yaml_data, foreign_keys, foreign_key_models, verbose):
29
- """
30
- Load data handling foreign keys and many-to-many relationships.
31
-
32
- Args:
33
- command: Command object for stdout writing.
34
- model: The Django model for the data.
35
- yaml_data: Data loaded from YAML.
36
- foreign_keys: List of foreign keys.
37
- foreign_key_models: Corresponding models for the foreign keys.
38
- verbose: Boolean indicating whether to print verbose output.
39
- """
40
- for entry in yaml_data:
41
- fields = entry.get('fields', {})
42
- name = fields.pop('name', None)
43
- m2m_relationships = {} # Store many-to-many relationships
44
-
45
- # Handle foreign keys and many-to-many relationships
46
- for fk_field, fk_model in zip(foreign_keys, foreign_key_models):
47
- target_keys = fields.pop(fk_field, None)
48
-
49
- # Ensure the foreign key exists
50
- if target_keys is None:
51
- if verbose:
52
- command.stdout.write(command.style.WARNING(f"Foreign key {fk_field} not found in fields"))
53
- continue # Skip if no foreign key provided
54
-
55
- # Process many-to-many fields or foreign keys
56
- if isinstance(target_keys, list): # Assume many-to-many relationship
57
- related_objects = []
58
- for key in target_keys:
59
- obj, created = fk_model.objects.get_or_create(name=key)
60
- if created and verbose:
61
- command.stdout.write(command.style.SUCCESS(f"Created {fk_model.__name__} {key}"))
62
- related_objects.append(obj)
63
- m2m_relationships[fk_field] = related_objects
64
- else: # Single foreign key relationship
65
- try:
66
- obj = fk_model.objects.get_by_natural_key(target_keys)
67
- except ObjectDoesNotExist:
68
- if verbose:
69
- command.stdout.write(command.style.WARNING(f"{fk_model.__name__} with key {target_keys} not found"))
70
- continue
71
- fields[fk_field] = obj
72
-
73
- # Create or update the main object
74
- obj, created = model.objects.update_or_create(defaults=fields, name=name)
75
- if created and verbose:
76
- command.stdout.write(command.style.SUCCESS(f'Created {model.__name__} {name}'))
77
- elif verbose:
78
- command.stdout.write(command.style.WARNING(f'Skipped {model.__name__} {name}, already exists'))
79
-
80
- # Set many-to-many relationships
81
- for field_name, related_objs in m2m_relationships.items():
82
- getattr(obj, field_name).set(related_objs)
83
-
84
-
85
- # def load_model_data_from_yaml(
86
- # command,
87
- # model_name,
88
- # metadata,
89
- # verbose,
90
- # ):
91
-
92
- # if verbose:
93
- # command.stdout.write(f"Start Loading {model_name}")
94
- # model = metadata["model"]
95
- # dir = metadata["dir"]
96
- # foreign_keys = metadata["foreign_keys"]
97
- # foreign_key_models = metadata["foreign_key_models"]
98
-
99
- # for file in [f for f in os.listdir(dir) if f.endswith('.yaml')]:
100
- # with open(os.path.join(dir, file), 'r') as f:
101
- # yaml_data = yaml.safe_load(f)
102
-
103
- # load_data_with_foreign_keys(
104
- # command,
105
- # model,
106
- # yaml_data,
107
- # foreign_keys,
108
- # foreign_key_models,
109
- # verbose
110
- # )
111
-
112
- # def load_data_with_foreign_keys(command, model, yaml_data, foreign_keys, foreign_key_models, verbose):
113
- # # Since pathology types is a ManyToMany field, we need to hack arount
114
- # for entry in yaml_data:
115
- # fields = entry.get('fields', {})
116
- # name = fields.pop('name', None)
117
- # many_to_many_tuples = []
118
- # foreign_key_tuples = zip(foreign_keys, foreign_key_models)
119
- # for foreign_key, foreign_key_model in foreign_key_tuples:
120
- # # target_natural_key = fields.pop(foreign_key, None)
121
- # # get the target natural key, if it exists, should not alter fields
122
- # target_natural_key = fields.get(foreign_key, None)
123
- # assert target_natural_key, f"Foreign Key {foreign_key} not found in fields {fields}"
124
-
125
- # if (foreign_key == "first_names") or (foreign_key == "last_names"):
126
- # if isinstance(target_natural_key, list):
127
- # # For first_names and last_names, the field is a Many to Many field
128
- # # if names dont exist yet, we create them
129
- # fk_objects = []
130
- # for __name in target_natural_key:
131
- # obj, created = foreign_key_model.objects.get_or_create(name=__name)
132
- # if created:
133
- # command.stdout.write(command.style.SUCCESS(f'Created {foreign_key_model.__name__} {__name}'))
134
- # # fk_objects.append(obj)
135
-
136
- # fk_tuple = (foreign_key, fk_objects)
137
- # many_to_many_tuples.append(fk_tuple)
138
- # continue
139
-
140
- # if isinstance(target_natural_key, list):
141
- # # the field is a Many to X field.
142
- # fk_objects = [foreign_key_model.objects.get_by_natural_key(_) for _ in target_natural_key]
143
- # fk_tuple = (foreign_key, fk_objects)
144
- # many_to_many_tuples.append(fk_tuple)
145
- # continue
146
- # # Use the natural key to look up the related object
147
- # try:
148
- # obj = foreign_key_model.objects.get_by_natural_key(target_natural_key)
149
- # except:
150
- # # commandline log that the object was not found
151
- # command.stdout.write(command.style.WARNING(f'Object {foreign_key_model.__name__} {target_natural_key} not found'))
152
- # # commandline log entry
153
- # command.stdout.write(command.style.WARNING(_log))
154
- # # try to create by name if name is available
155
- # # create defaults dict from fields using the models fields
156
- # _field_names = [_.name for _ in foreign_key_model._meta.fields]
157
- # _defaults = {k: v for k, v in fields.items() if (k in _field_names) and v}
158
-
159
- # if target_natural_key:
160
- # # commandlie log
161
- # command.stdout.write(command.style.SUCCESS(f'Creating {foreign_key_model.__name__} {name} with defaults {_defaults}'))
162
- # obj, created = model.objects.get_or_create(
163
- # name = target_natural_key,
164
- # defaults=_defaults
165
- # )
166
- # # Assign the related object to the field
167
- # fields[foreign_key] = obj
168
-
169
- # if name:
170
- # try:
171
- # obj, created = model.objects.get_or_create(name=name, defaults=fields)
172
- # except:
173
- # # commandlinelog to print name, fields, target foreign key
174
- # command.stdout.write(command.style.WARNING(f'Object {model.__name__} {name} not found'))
175
- # else:
176
- # obj, created = model.objects.get_or_create(**fields)
177
- # if many_to_many_tuples:
178
-
179
- # for fk, fk_objects in many_to_many_tuples:
180
- # getattr(obj, fk).set(fk_objects)
181
-
182
- # if created and verbose:
183
- # command.stdout.write(command.style.SUCCESS(f'Created {model.__name__} {name}'))
184
- # elif verbose:
185
- # command.stdout.write(command.style.WARNING(f'Skipped {model.__name__} {name}, already exists'))
1
+ import os
2
+ import yaml
3
+ from django.core.exceptions import ObjectDoesNotExist
4
+
5
+ def load_model_data_from_yaml(command, model_name, metadata, verbose):
6
+ """
7
+ Load model data from YAML files.
8
+
9
+ Args:
10
+ command: Command object for stdout writing.
11
+ model_name: Name of the model being loaded.
12
+ metadata: Metadata including directory and foreign key information.
13
+ verbose: Boolean indicating whether to print verbose output.
14
+ """
15
+ if verbose:
16
+ command.stdout.write(f"Start loading {model_name}")
17
+ model = metadata["model"]
18
+ dir_path = metadata["dir"]
19
+ foreign_keys = metadata["foreign_keys"]
20
+ foreign_key_models = metadata["foreign_key_models"]
21
+
22
+ _files = [f for f in os.listdir(dir_path) if f.endswith('.yaml')]
23
+ # sort
24
+ _files.sort()
25
+ for file in _files:
26
+ with open(os.path.join(dir_path, file), 'r') as file:
27
+ yaml_data = yaml.safe_load(file)
28
+
29
+ load_data_with_foreign_keys(command, model, yaml_data, foreign_keys, foreign_key_models, verbose)
30
+
31
+ def load_data_with_foreign_keys(command, model, yaml_data, foreign_keys, foreign_key_models, verbose):
32
+ """
33
+ Load data handling foreign keys and many-to-many relationships.
34
+
35
+ Args:
36
+ command: Command object for stdout writing.
37
+ model: The Django model for the data.
38
+ yaml_data: Data loaded from YAML.
39
+ foreign_keys: List of foreign keys.
40
+ foreign_key_models: Corresponding models for the foreign keys.
41
+ verbose: Boolean indicating whether to print verbose output.
42
+ """
43
+ for entry in yaml_data:
44
+ fields = entry.get('fields', {})
45
+ name = fields.pop('name', None)
46
+ m2m_relationships = {} # Store many-to-many relationships
47
+ print(entry)
48
+
49
+ # Handle foreign keys and many-to-many relationships
50
+ for fk_field, fk_model in zip(foreign_keys, foreign_key_models):
51
+ print(fk_field, fk_model)
52
+ target_keys = fields.pop(fk_field, None)
53
+
54
+ # Ensure the foreign key exists
55
+ if target_keys is None:
56
+ if verbose:
57
+ command.stdout.write(command.style.WARNING(f"Foreign key {fk_field} not found in fields"))
58
+ continue # Skip if no foreign key provided
59
+
60
+ # Process many-to-many fields or foreign keys
61
+ if isinstance(target_keys, list): # Assume many-to-many relationship
62
+ related_objects = []
63
+ for key in target_keys:
64
+ obj, created = fk_model.objects.get_or_create(name=key)
65
+ if created and verbose:
66
+ command.stdout.write(command.style.SUCCESS(f"Created {fk_model.__name__} {key}"))
67
+ related_objects.append(obj)
68
+ m2m_relationships[fk_field] = related_objects
69
+ else: # Single foreign key relationship
70
+ try:
71
+ if model == "endoreg_db.case_template_rule":
72
+ print(fk_model, target_keys)
73
+ obj = fk_model.objects.get_by_natural_key(target_keys)
74
+ except ObjectDoesNotExist:
75
+ if verbose:
76
+ command.stdout.write(command.style.WARNING(f"{fk_model.__name__} with key {target_keys} not found"))
77
+ continue
78
+ fields[fk_field] = obj
79
+
80
+ # Create or update the main object
81
+ if name is None:
82
+ obj, created = model.objects.get_or_create(**fields)
83
+ else:
84
+ obj, created = model.objects.update_or_create(defaults=fields, name=name)
85
+ if created and verbose:
86
+ command.stdout.write(command.style.SUCCESS(f'Created {model.__name__} {name}'))
87
+ elif verbose:
88
+ command.stdout.write(command.style.WARNING(f'Skipped {model.__name__} {name}, already exists'))
89
+
90
+ # Set many-to-many relationships
91
+ for field_name, related_objs in m2m_relationships.items():
92
+ getattr(obj, field_name).set(related_objs)
@@ -1,30 +1,30 @@
1
- import shutil
2
- from pathlib import Path
3
- from endoreg_db.utils.uuid import get_uuid
4
-
5
- def get_uuid_filename(file:Path) -> tuple[str, str]:
6
- """
7
- Returns a new filename with a uuid
8
- """
9
- # Get the file extension
10
- file_extension = file.suffix
11
- # Generate a new file name
12
- uuid = get_uuid()
13
- new_file_name = f"{uuid}{file_extension}"
14
- return new_file_name, uuid
15
-
16
- def rename_file_uuid(old_file:Path):
17
- """
18
- Rename a file by assigning a uuid while preserving file extension. Returns new filepath and uuid
19
- """
20
- # Get the file extension
21
- file_extension = old_file.suffix
22
- # Generate a new file name
23
- uuid = get_uuid()
24
- new_file_name = f"{uuid}{file_extension}"
25
-
26
- # Rename the file
27
- new_file = old_file.with_name(new_file_name)
28
- shutil.move(old_file.resolve().as_posix(), new_file.resolve().as_posix())
29
-
30
- return new_file, uuid
1
+ import shutil
2
+ from pathlib import Path
3
+ from endoreg_db.utils.uuid import get_uuid
4
+
5
+ def get_uuid_filename(file:Path) -> tuple[str, str]:
6
+ """
7
+ Returns a new filename with a uuid
8
+ """
9
+ # Get the file extension
10
+ file_extension = file.suffix
11
+ # Generate a new file name
12
+ uuid = get_uuid()
13
+ new_file_name = f"{uuid}{file_extension}"
14
+ return new_file_name, uuid
15
+
16
+ def rename_file_uuid(old_file:Path):
17
+ """
18
+ Rename a file by assigning a uuid while preserving file extension. Returns new filepath and uuid
19
+ """
20
+ # Get the file extension
21
+ file_extension = old_file.suffix
22
+ # Generate a new file name
23
+ uuid = get_uuid()
24
+ new_file_name = f"{uuid}{file_extension}"
25
+
26
+ # Rename the file
27
+ new_file = old_file.with_name(new_file_name)
28
+ shutil.move(old_file.resolve().as_posix(), new_file.resolve().as_posix())
29
+
30
+ return new_file, uuid
endoreg_db/utils/hashs.py CHANGED
@@ -1,34 +1,34 @@
1
- import hashlib
2
- from pathlib import Path
3
-
4
- def get_video_hash(video_path):
5
- """
6
- Get the hash of a video file.
7
- """
8
- # Open the video file in read-binary mode:
9
- with open(video_path, 'rb') as f:
10
- # Create the hash object, passing in the video contents for hashing:
11
- hash_object = hashlib.sha256(f.read())
12
- # Get the hexadecimal representation of the hash
13
- video_hash = hash_object.hexdigest()
14
- assert len(video_hash) <= 255, "Hash length exceeds 255 characters"
15
-
16
- return video_hash
17
-
18
- def get_pdf_hash(pdf_path:Path):
19
- """
20
- Get the hash of a pdf file.
21
- """
22
- pdf_hash = None
23
-
24
- # Open the file in binary mode and read its contents
25
- with open(pdf_path, 'rb') as f:
26
- pdf_contents = f.read()
27
- # Create a hash object using SHA-256 algorithm
28
-
29
- hash_object = hashlib.sha256(pdf_contents, usedforsecurity=False)
30
- # Get the hexadecimal representation of the hash
31
- pdf_hash = hash_object.hexdigest()
32
- assert len(pdf_hash) <= 255, "Hash length exceeds 255 characters"
33
-
1
+ import hashlib
2
+ from pathlib import Path
3
+
4
+ def get_video_hash(video_path):
5
+ """
6
+ Get the hash of a video file.
7
+ """
8
+ # Open the video file in read-binary mode:
9
+ with open(video_path, 'rb') as f:
10
+ # Create the hash object, passing in the video contents for hashing:
11
+ hash_object = hashlib.sha256(f.read())
12
+ # Get the hexadecimal representation of the hash
13
+ video_hash = hash_object.hexdigest()
14
+ assert len(video_hash) <= 255, "Hash length exceeds 255 characters"
15
+
16
+ return video_hash
17
+
18
+ def get_pdf_hash(pdf_path:Path):
19
+ """
20
+ Get the hash of a pdf file.
21
+ """
22
+ pdf_hash = None
23
+
24
+ # Open the file in binary mode and read its contents
25
+ with open(pdf_path, 'rb') as f:
26
+ pdf_contents = f.read()
27
+ # Create a hash object using SHA-256 algorithm
28
+
29
+ hash_object = hashlib.sha256(pdf_contents, usedforsecurity=False)
30
+ # Get the hexadecimal representation of the hash
31
+ pdf_hash = hash_object.hexdigest()
32
+ assert len(pdf_hash) <= 255, "Hash length exceeds 255 characters"
33
+
34
34
  return pdf_hash