endoreg-db 0.8.9.2__py3-none-any.whl → 0.8.9.10__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 (450) hide show
  1. endoreg_db/admin.py +10 -5
  2. endoreg_db/apps.py +4 -7
  3. endoreg_db/authz/auth.py +1 -0
  4. endoreg_db/authz/backends.py +1 -1
  5. endoreg_db/authz/management/commands/list_routes.py +2 -0
  6. endoreg_db/authz/middleware.py +8 -7
  7. endoreg_db/authz/permissions.py +21 -10
  8. endoreg_db/authz/policy.py +14 -19
  9. endoreg_db/authz/views_auth.py +14 -10
  10. endoreg_db/codemods/rename_datetime_fields.py +8 -1
  11. endoreg_db/exceptions.py +5 -2
  12. endoreg_db/forms/__init__.py +0 -1
  13. endoreg_db/forms/examination_form.py +4 -3
  14. endoreg_db/forms/patient_finding_intervention_form.py +30 -8
  15. endoreg_db/forms/patient_form.py +9 -13
  16. endoreg_db/forms/questionnaires/__init__.py +1 -1
  17. endoreg_db/forms/settings/__init__.py +4 -1
  18. endoreg_db/forms/unit.py +2 -1
  19. endoreg_db/helpers/count_db.py +17 -14
  20. endoreg_db/helpers/default_objects.py +2 -1
  21. endoreg_db/helpers/download_segmentation_model.py +4 -3
  22. endoreg_db/helpers/interact.py +0 -5
  23. endoreg_db/helpers/test_video_helper.py +33 -25
  24. endoreg_db/import_files/__init__.py +1 -1
  25. endoreg_db/import_files/context/__init__.py +1 -1
  26. endoreg_db/import_files/context/default_sensitive_meta.py +11 -9
  27. endoreg_db/import_files/context/ensure_center.py +4 -4
  28. endoreg_db/import_files/context/file_lock.py +3 -3
  29. endoreg_db/import_files/context/import_context.py +11 -12
  30. endoreg_db/import_files/context/validate_directories.py +1 -0
  31. endoreg_db/import_files/file_storage/create_report_file.py +57 -34
  32. endoreg_db/import_files/file_storage/create_video_file.py +64 -35
  33. endoreg_db/import_files/file_storage/sensitive_meta_storage.py +5 -2
  34. endoreg_db/import_files/file_storage/state_management.py +89 -122
  35. endoreg_db/import_files/file_storage/storage.py +5 -1
  36. endoreg_db/import_files/processing/report_processing/report_anonymization.py +24 -19
  37. endoreg_db/import_files/processing/sensitive_meta_adapter.py +3 -3
  38. endoreg_db/import_files/processing/video_processing/video_anonymization.py +18 -18
  39. endoreg_db/import_files/pseudonymization/k_anonymity.py +8 -9
  40. endoreg_db/import_files/pseudonymization/k_pseudonymity.py +16 -5
  41. endoreg_db/import_files/report_import_service.py +36 -30
  42. endoreg_db/import_files/video_import_service.py +27 -23
  43. endoreg_db/logger_conf.py +56 -40
  44. endoreg_db/management/__init__.py +1 -1
  45. endoreg_db/management/commands/__init__.py +1 -1
  46. endoreg_db/management/commands/check_auth.py +45 -38
  47. endoreg_db/management/commands/create_model_meta_from_huggingface.py +53 -2
  48. endoreg_db/management/commands/create_multilabel_model_meta.py +54 -19
  49. endoreg_db/management/commands/fix_missing_patient_data.py +105 -71
  50. endoreg_db/management/commands/fix_video_paths.py +75 -54
  51. endoreg_db/management/commands/import_report.py +1 -3
  52. endoreg_db/management/commands/list_routes.py +2 -0
  53. endoreg_db/management/commands/load_ai_model_data.py +8 -2
  54. endoreg_db/management/commands/load_ai_model_label_data.py +0 -1
  55. endoreg_db/management/commands/load_center_data.py +3 -3
  56. endoreg_db/management/commands/load_distribution_data.py +35 -38
  57. endoreg_db/management/commands/load_endoscope_data.py +0 -3
  58. endoreg_db/management/commands/load_examination_data.py +20 -4
  59. endoreg_db/management/commands/load_finding_data.py +18 -3
  60. endoreg_db/management/commands/load_gender_data.py +17 -24
  61. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +95 -85
  62. endoreg_db/management/commands/load_information_source.py +0 -3
  63. endoreg_db/management/commands/load_lab_value_data.py +14 -3
  64. endoreg_db/management/commands/load_legacy_data.py +303 -0
  65. endoreg_db/management/commands/load_name_data.py +1 -2
  66. endoreg_db/management/commands/load_pdf_type_data.py +4 -8
  67. endoreg_db/management/commands/load_profession_data.py +0 -1
  68. endoreg_db/management/commands/load_report_reader_flag_data.py +0 -4
  69. endoreg_db/management/commands/load_requirement_data.py +6 -2
  70. endoreg_db/management/commands/load_unit_data.py +0 -4
  71. endoreg_db/management/commands/load_user_groups.py +5 -7
  72. endoreg_db/management/commands/model_input.py +169 -0
  73. endoreg_db/management/commands/register_ai_model.py +22 -16
  74. endoreg_db/management/commands/setup_endoreg_db.py +110 -32
  75. endoreg_db/management/commands/storage_management.py +14 -8
  76. endoreg_db/management/commands/summarize_db_content.py +154 -63
  77. endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
  78. endoreg_db/management/commands/validate_video_files.py +82 -50
  79. endoreg_db/management/commands/video_validation.py +4 -6
  80. endoreg_db/migrations/0001_initial.py +112 -63
  81. endoreg_db/models/__init__.py +8 -0
  82. endoreg_db/models/administration/ai/active_model.py +5 -5
  83. endoreg_db/models/administration/ai/ai_model.py +41 -18
  84. endoreg_db/models/administration/ai/model_type.py +1 -0
  85. endoreg_db/models/administration/case/case.py +22 -22
  86. endoreg_db/models/administration/center/__init__.py +5 -5
  87. endoreg_db/models/administration/center/center.py +6 -2
  88. endoreg_db/models/administration/center/center_resource.py +18 -4
  89. endoreg_db/models/administration/center/center_shift.py +3 -1
  90. endoreg_db/models/administration/center/center_waste.py +6 -2
  91. endoreg_db/models/administration/person/__init__.py +1 -1
  92. endoreg_db/models/administration/person/employee/__init__.py +1 -1
  93. endoreg_db/models/administration/person/employee/employee_type.py +3 -1
  94. endoreg_db/models/administration/person/examiner/__init__.py +1 -1
  95. endoreg_db/models/administration/person/examiner/examiner.py +10 -2
  96. endoreg_db/models/administration/person/names/first_name.py +6 -4
  97. endoreg_db/models/administration/person/names/last_name.py +4 -3
  98. endoreg_db/models/administration/person/patient/__init__.py +1 -1
  99. endoreg_db/models/administration/person/patient/patient.py +0 -1
  100. endoreg_db/models/administration/person/patient/patient_external_id.py +0 -1
  101. endoreg_db/models/administration/person/person.py +1 -1
  102. endoreg_db/models/administration/product/__init__.py +7 -6
  103. endoreg_db/models/administration/product/product.py +6 -2
  104. endoreg_db/models/administration/product/product_group.py +9 -7
  105. endoreg_db/models/administration/product/product_material.py +9 -2
  106. endoreg_db/models/administration/product/reference_product.py +64 -15
  107. endoreg_db/models/administration/qualification/qualification.py +3 -1
  108. endoreg_db/models/administration/shift/shift.py +3 -1
  109. endoreg_db/models/administration/shift/shift_type.py +12 -4
  110. endoreg_db/models/aidataset/__init__.py +5 -0
  111. endoreg_db/models/aidataset/aidataset.py +193 -0
  112. endoreg_db/models/label/__init__.py +1 -1
  113. endoreg_db/models/label/label.py +10 -2
  114. endoreg_db/models/label/label_set.py +3 -1
  115. endoreg_db/models/label/label_video_segment/_create_from_video.py +6 -2
  116. endoreg_db/models/label/label_video_segment/label_video_segment.py +148 -44
  117. endoreg_db/models/media/__init__.py +12 -5
  118. endoreg_db/models/media/frame/__init__.py +1 -1
  119. endoreg_db/models/media/frame/frame.py +34 -8
  120. endoreg_db/models/media/pdf/__init__.py +2 -1
  121. endoreg_db/models/media/pdf/raw_pdf.py +11 -4
  122. endoreg_db/models/media/pdf/report_file.py +6 -2
  123. endoreg_db/models/media/pdf/report_reader/__init__.py +3 -3
  124. endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +15 -5
  125. endoreg_db/models/media/video/create_from_file.py +20 -41
  126. endoreg_db/models/media/video/pipe_1.py +75 -30
  127. endoreg_db/models/media/video/pipe_2.py +37 -12
  128. endoreg_db/models/media/video/video_file.py +36 -24
  129. endoreg_db/models/media/video/video_file_ai.py +235 -70
  130. endoreg_db/models/media/video/video_file_anonymize.py +240 -65
  131. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -1
  132. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +3 -1
  133. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +30 -9
  134. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +95 -29
  135. endoreg_db/models/media/video/video_file_frames/_get_frame.py +13 -3
  136. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -1
  137. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +15 -3
  138. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +15 -3
  139. endoreg_db/models/media/video/video_file_frames/_get_frames.py +7 -2
  140. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +109 -23
  141. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +111 -27
  142. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +46 -13
  143. endoreg_db/models/media/video/video_file_io.py +85 -33
  144. endoreg_db/models/media/video/video_file_meta/__init__.py +6 -6
  145. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +17 -4
  146. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +28 -7
  147. endoreg_db/models/media/video/video_file_meta/get_fps.py +46 -13
  148. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +81 -20
  149. endoreg_db/models/media/video/video_file_meta/text_meta.py +61 -20
  150. endoreg_db/models/media/video/video_file_meta/video_meta.py +40 -12
  151. endoreg_db/models/media/video/video_file_segments.py +118 -27
  152. endoreg_db/models/media/video/video_metadata.py +25 -6
  153. endoreg_db/models/media/video/video_processing.py +54 -15
  154. endoreg_db/models/medical/__init__.py +3 -13
  155. endoreg_db/models/medical/contraindication/__init__.py +3 -1
  156. endoreg_db/models/medical/disease.py +18 -6
  157. endoreg_db/models/medical/event.py +6 -2
  158. endoreg_db/models/medical/examination/__init__.py +5 -1
  159. endoreg_db/models/medical/examination/examination.py +22 -6
  160. endoreg_db/models/medical/examination/examination_indication.py +23 -7
  161. endoreg_db/models/medical/examination/examination_time.py +6 -2
  162. endoreg_db/models/medical/finding/__init__.py +3 -1
  163. endoreg_db/models/medical/finding/finding.py +37 -12
  164. endoreg_db/models/medical/finding/finding_classification.py +27 -8
  165. endoreg_db/models/medical/finding/finding_intervention.py +19 -6
  166. endoreg_db/models/medical/finding/finding_type.py +3 -1
  167. endoreg_db/models/medical/hardware/__init__.py +1 -1
  168. endoreg_db/models/medical/hardware/endoscope.py +14 -2
  169. endoreg_db/models/medical/laboratory/__init__.py +1 -1
  170. endoreg_db/models/medical/laboratory/lab_value.py +139 -39
  171. endoreg_db/models/medical/medication/__init__.py +7 -3
  172. endoreg_db/models/medical/medication/medication.py +3 -1
  173. endoreg_db/models/medical/medication/medication_indication.py +3 -1
  174. endoreg_db/models/medical/medication/medication_indication_type.py +11 -3
  175. endoreg_db/models/medical/medication/medication_intake_time.py +3 -1
  176. endoreg_db/models/medical/medication/medication_schedule.py +3 -1
  177. endoreg_db/models/medical/patient/__init__.py +2 -10
  178. endoreg_db/models/medical/patient/medication_examples.py +3 -14
  179. endoreg_db/models/medical/patient/patient_disease.py +17 -5
  180. endoreg_db/models/medical/patient/patient_event.py +12 -4
  181. endoreg_db/models/medical/patient/patient_examination.py +52 -15
  182. endoreg_db/models/medical/patient/patient_examination_indication.py +15 -4
  183. endoreg_db/models/medical/patient/patient_finding.py +105 -29
  184. endoreg_db/models/medical/patient/patient_finding_classification.py +41 -12
  185. endoreg_db/models/medical/patient/patient_finding_intervention.py +11 -3
  186. endoreg_db/models/medical/patient/patient_lab_sample.py +6 -2
  187. endoreg_db/models/medical/patient/patient_lab_value.py +42 -10
  188. endoreg_db/models/medical/patient/patient_medication.py +25 -7
  189. endoreg_db/models/medical/patient/patient_medication_schedule.py +34 -10
  190. endoreg_db/models/metadata/model_meta.py +40 -12
  191. endoreg_db/models/metadata/model_meta_logic.py +51 -16
  192. endoreg_db/models/metadata/sensitive_meta.py +65 -28
  193. endoreg_db/models/metadata/sensitive_meta_logic.py +28 -26
  194. endoreg_db/models/metadata/video_meta.py +146 -39
  195. endoreg_db/models/metadata/video_prediction_logic.py +70 -21
  196. endoreg_db/models/metadata/video_prediction_meta.py +80 -27
  197. endoreg_db/models/operation_log.py +63 -0
  198. endoreg_db/models/other/__init__.py +10 -10
  199. endoreg_db/models/other/distribution/__init__.py +9 -7
  200. endoreg_db/models/other/distribution/base_value_distribution.py +3 -1
  201. endoreg_db/models/other/distribution/date_value_distribution.py +19 -5
  202. endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +3 -1
  203. endoreg_db/models/other/distribution/numeric_value_distribution.py +34 -9
  204. endoreg_db/models/other/emission/__init__.py +1 -1
  205. endoreg_db/models/other/emission/emission_factor.py +9 -3
  206. endoreg_db/models/other/information_source.py +15 -5
  207. endoreg_db/models/other/material.py +3 -1
  208. endoreg_db/models/other/transport_route.py +3 -1
  209. endoreg_db/models/other/unit.py +6 -2
  210. endoreg_db/models/report/report.py +0 -1
  211. endoreg_db/models/requirement/requirement.py +84 -27
  212. endoreg_db/models/requirement/requirement_error.py +5 -6
  213. endoreg_db/models/requirement/requirement_evaluation/__init__.py +1 -1
  214. endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +8 -8
  215. endoreg_db/models/requirement/requirement_evaluation/get_values.py +3 -3
  216. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +24 -8
  217. endoreg_db/models/requirement/requirement_operator.py +28 -8
  218. endoreg_db/models/requirement/requirement_set.py +34 -11
  219. endoreg_db/models/state/__init__.py +1 -0
  220. endoreg_db/models/state/audit_ledger.py +9 -2
  221. endoreg_db/models/{media → state}/processing_history/__init__.py +1 -3
  222. endoreg_db/models/state/processing_history/processing_history.py +136 -0
  223. endoreg_db/models/state/raw_pdf.py +0 -1
  224. endoreg_db/models/state/video.py +2 -4
  225. endoreg_db/models/utils.py +4 -2
  226. endoreg_db/queries/__init__.py +2 -6
  227. endoreg_db/queries/annotations/__init__.py +1 -3
  228. endoreg_db/queries/annotations/legacy.py +37 -26
  229. endoreg_db/root_urls.py +3 -4
  230. endoreg_db/schemas/examination_evaluation.py +3 -0
  231. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +249 -163
  232. endoreg_db/serializers/__init__.py +2 -8
  233. endoreg_db/serializers/administration/__init__.py +1 -2
  234. endoreg_db/serializers/administration/ai/__init__.py +0 -1
  235. endoreg_db/serializers/administration/ai/active_model.py +3 -1
  236. endoreg_db/serializers/administration/ai/ai_model.py +5 -3
  237. endoreg_db/serializers/administration/ai/model_type.py +3 -1
  238. endoreg_db/serializers/administration/center.py +7 -2
  239. endoreg_db/serializers/administration/gender.py +4 -2
  240. endoreg_db/serializers/anonymization.py +13 -13
  241. endoreg_db/serializers/evaluation/examination_evaluation.py +0 -1
  242. endoreg_db/serializers/examination/__init__.py +1 -1
  243. endoreg_db/serializers/examination/base.py +12 -13
  244. endoreg_db/serializers/examination/dropdown.py +6 -7
  245. endoreg_db/serializers/examination_serializer.py +3 -6
  246. endoreg_db/serializers/finding/__init__.py +1 -1
  247. endoreg_db/serializers/finding/finding.py +14 -7
  248. endoreg_db/serializers/finding_classification/__init__.py +3 -3
  249. endoreg_db/serializers/finding_classification/choice.py +3 -3
  250. endoreg_db/serializers/finding_classification/classification.py +2 -4
  251. endoreg_db/serializers/label_video_segment/__init__.py +5 -3
  252. endoreg_db/serializers/{label → label_video_segment}/image_classification_annotation.py +5 -5
  253. endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
  254. endoreg_db/serializers/{label → label_video_segment/label}/label.py +1 -1
  255. endoreg_db/serializers/label_video_segment/label_video_segment.py +338 -228
  256. endoreg_db/serializers/meta/__init__.py +1 -2
  257. endoreg_db/serializers/meta/sensitive_meta_detail.py +28 -13
  258. endoreg_db/serializers/meta/sensitive_meta_update.py +51 -46
  259. endoreg_db/serializers/meta/sensitive_meta_verification.py +19 -16
  260. endoreg_db/serializers/misc/__init__.py +2 -2
  261. endoreg_db/serializers/misc/file_overview.py +11 -7
  262. endoreg_db/serializers/misc/stats.py +10 -8
  263. endoreg_db/serializers/misc/translatable_field_mix_in.py +6 -6
  264. endoreg_db/serializers/misc/upload_job.py +32 -29
  265. endoreg_db/serializers/patient/__init__.py +2 -1
  266. endoreg_db/serializers/patient/patient.py +32 -15
  267. endoreg_db/serializers/patient/patient_dropdown.py +11 -3
  268. endoreg_db/serializers/patient_examination/__init__.py +1 -1
  269. endoreg_db/serializers/patient_examination/patient_examination.py +67 -40
  270. endoreg_db/serializers/patient_finding/__init__.py +1 -1
  271. endoreg_db/serializers/patient_finding/patient_finding.py +2 -1
  272. endoreg_db/serializers/patient_finding/patient_finding_classification.py +17 -9
  273. endoreg_db/serializers/patient_finding/patient_finding_detail.py +26 -17
  274. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +7 -5
  275. endoreg_db/serializers/patient_finding/patient_finding_list.py +10 -11
  276. endoreg_db/serializers/patient_finding/patient_finding_write.py +36 -27
  277. endoreg_db/serializers/pdf/__init__.py +1 -3
  278. endoreg_db/serializers/requirements/requirement_schema.py +1 -6
  279. endoreg_db/serializers/sensitive_meta_serializer.py +100 -81
  280. endoreg_db/serializers/video/__init__.py +2 -2
  281. endoreg_db/serializers/video/{segmentation.py → video_file.py} +66 -47
  282. endoreg_db/serializers/video/video_file_brief.py +6 -2
  283. endoreg_db/serializers/video/video_file_detail.py +36 -23
  284. endoreg_db/serializers/video/video_file_list.py +4 -2
  285. endoreg_db/serializers/video/video_processing_history.py +54 -50
  286. endoreg_db/services/__init__.py +1 -1
  287. endoreg_db/services/anonymization.py +2 -2
  288. endoreg_db/services/examination_evaluation.py +40 -17
  289. endoreg_db/services/model_meta_from_hf.py +76 -0
  290. endoreg_db/services/polling_coordinator.py +101 -70
  291. endoreg_db/services/pseudonym_service.py +27 -22
  292. endoreg_db/services/report_import.py +6 -3
  293. endoreg_db/services/segment_sync.py +75 -59
  294. endoreg_db/services/video_import.py +6 -7
  295. endoreg_db/urls/__init__.py +2 -2
  296. endoreg_db/urls/ai.py +7 -25
  297. endoreg_db/urls/anonymization.py +61 -15
  298. endoreg_db/urls/auth.py +4 -4
  299. endoreg_db/urls/classification.py +4 -9
  300. endoreg_db/urls/examination.py +27 -18
  301. endoreg_db/urls/media.py +27 -34
  302. endoreg_db/urls/patient.py +11 -7
  303. endoreg_db/urls/requirements.py +3 -1
  304. endoreg_db/urls/root_urls.py +2 -3
  305. endoreg_db/urls/stats.py +24 -16
  306. endoreg_db/urls/upload.py +3 -11
  307. endoreg_db/utils/__init__.py +14 -15
  308. endoreg_db/utils/ai/__init__.py +1 -1
  309. endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
  310. endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
  311. endoreg_db/utils/ai/get.py +2 -1
  312. endoreg_db/utils/ai/inference_dataset.py +14 -15
  313. endoreg_db/utils/ai/model_training/config.py +117 -0
  314. endoreg_db/utils/ai/model_training/dataset.py +74 -0
  315. endoreg_db/utils/ai/model_training/losses.py +68 -0
  316. endoreg_db/utils/ai/model_training/metrics.py +78 -0
  317. endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
  318. endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
  319. endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
  320. endoreg_db/utils/ai/multilabel_classification_net.py +21 -6
  321. endoreg_db/utils/ai/predict.py +4 -4
  322. endoreg_db/utils/ai/preprocess.py +19 -11
  323. endoreg_db/utils/calc_duration_seconds.py +4 -4
  324. endoreg_db/utils/case_generator/lab_sample_factory.py +3 -4
  325. endoreg_db/utils/check_video_files.py +74 -47
  326. endoreg_db/utils/cropping.py +10 -9
  327. endoreg_db/utils/dataloader.py +11 -3
  328. endoreg_db/utils/dates.py +3 -4
  329. endoreg_db/utils/defaults/set_default_center.py +7 -6
  330. endoreg_db/utils/env.py +6 -2
  331. endoreg_db/utils/extract_specific_frames.py +24 -9
  332. endoreg_db/utils/file_operations.py +30 -18
  333. endoreg_db/utils/fix_video_path_direct.py +57 -41
  334. endoreg_db/utils/frame_anonymization_utils.py +157 -157
  335. endoreg_db/utils/hashs.py +3 -18
  336. endoreg_db/utils/links/requirement_link.py +96 -52
  337. endoreg_db/utils/ocr.py +30 -25
  338. endoreg_db/utils/operation_log.py +61 -0
  339. endoreg_db/utils/parse_and_generate_yaml.py +12 -13
  340. endoreg_db/utils/paths.py +6 -6
  341. endoreg_db/utils/permissions.py +40 -24
  342. endoreg_db/utils/pipelines/process_video_dir.py +50 -26
  343. endoreg_db/utils/product/sum_emissions.py +5 -3
  344. endoreg_db/utils/product/sum_weights.py +4 -2
  345. endoreg_db/utils/pydantic_models/__init__.py +3 -4
  346. endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +207 -107
  347. endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +252 -65
  348. endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +27 -10
  349. endoreg_db/utils/setup_config.py +21 -5
  350. endoreg_db/utils/storage.py +3 -1
  351. endoreg_db/utils/translation.py +19 -15
  352. endoreg_db/utils/uuid.py +1 -0
  353. endoreg_db/utils/validate_endo_roi.py +12 -4
  354. endoreg_db/utils/validate_subcategory_dict.py +26 -24
  355. endoreg_db/utils/validate_video_detailed.py +207 -149
  356. endoreg_db/utils/video/__init__.py +7 -3
  357. endoreg_db/utils/video/extract_frames.py +30 -18
  358. endoreg_db/utils/video/names.py +11 -6
  359. endoreg_db/utils/video/streaming_processor.py +175 -101
  360. endoreg_db/utils/video/video_splitter.py +30 -19
  361. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +59 -50
  362. endoreg_db/views/__init__.py +0 -20
  363. endoreg_db/views/anonymization/__init__.py +6 -2
  364. endoreg_db/views/anonymization/media_management.py +2 -6
  365. endoreg_db/views/anonymization/overview.py +34 -1
  366. endoreg_db/views/anonymization/validate.py +79 -18
  367. endoreg_db/views/auth/__init__.py +1 -1
  368. endoreg_db/views/auth/keycloak.py +16 -14
  369. endoreg_db/views/examination/__init__.py +12 -15
  370. endoreg_db/views/examination/examination.py +5 -5
  371. endoreg_db/views/examination/examination_manifest_cache.py +5 -5
  372. endoreg_db/views/examination/get_finding_classification_choices.py +8 -5
  373. endoreg_db/views/examination/get_finding_classifications.py +9 -7
  374. endoreg_db/views/examination/get_findings.py +8 -10
  375. endoreg_db/views/examination/get_instruments.py +3 -2
  376. endoreg_db/views/examination/get_interventions.py +1 -1
  377. endoreg_db/views/finding/__init__.py +2 -2
  378. endoreg_db/views/finding/finding.py +58 -54
  379. endoreg_db/views/finding/get_classifications.py +1 -1
  380. endoreg_db/views/finding/get_interventions.py +1 -1
  381. endoreg_db/views/finding_classification/__init__.py +5 -5
  382. endoreg_db/views/finding_classification/finding_classification.py +5 -6
  383. endoreg_db/views/finding_classification/get_classification_choices.py +3 -4
  384. endoreg_db/views/media/__init__.py +13 -13
  385. endoreg_db/views/media/pdf_media.py +9 -9
  386. endoreg_db/views/media/sensitive_metadata.py +10 -7
  387. endoreg_db/views/media/video_media.py +4 -4
  388. endoreg_db/views/meta/__init__.py +1 -1
  389. endoreg_db/views/meta/sensitive_meta_list.py +20 -22
  390. endoreg_db/views/meta/sensitive_meta_verification.py +14 -11
  391. endoreg_db/views/misc/__init__.py +6 -34
  392. endoreg_db/views/misc/center.py +2 -1
  393. endoreg_db/views/misc/csrf.py +2 -1
  394. endoreg_db/views/misc/gender.py +2 -1
  395. endoreg_db/views/misc/stats.py +141 -106
  396. endoreg_db/views/patient/__init__.py +1 -3
  397. endoreg_db/views/patient/patient.py +141 -99
  398. endoreg_db/views/patient_examination/__init__.py +5 -5
  399. endoreg_db/views/patient_examination/patient_examination.py +43 -42
  400. endoreg_db/views/patient_examination/patient_examination_create.py +10 -15
  401. endoreg_db/views/patient_examination/patient_examination_detail.py +12 -15
  402. endoreg_db/views/patient_examination/patient_examination_list.py +21 -17
  403. endoreg_db/views/patient_examination/video.py +114 -80
  404. endoreg_db/views/patient_finding/__init__.py +1 -1
  405. endoreg_db/views/patient_finding/patient_finding.py +17 -10
  406. endoreg_db/views/patient_finding/patient_finding_optimized.py +127 -95
  407. endoreg_db/views/patient_finding_classification/__init__.py +1 -1
  408. endoreg_db/views/patient_finding_classification/pfc_create.py +35 -27
  409. endoreg_db/views/report/reimport.py +1 -1
  410. endoreg_db/views/report/report_stream.py +5 -8
  411. endoreg_db/views/requirement/__init__.py +2 -1
  412. endoreg_db/views/requirement/evaluate.py +7 -9
  413. endoreg_db/views/requirement/lookup.py +2 -3
  414. endoreg_db/views/requirement/lookup_store.py +0 -1
  415. endoreg_db/views/requirement/requirement_utils.py +2 -4
  416. endoreg_db/views/stats/__init__.py +4 -4
  417. endoreg_db/views/stats/stats_views.py +152 -115
  418. endoreg_db/views/video/__init__.py +18 -27
  419. endoreg_db/views/{ai → video/ai}/__init__.py +2 -2
  420. endoreg_db/views/{ai → video/ai}/label.py +20 -16
  421. endoreg_db/views/video/correction.py +5 -6
  422. endoreg_db/views/video/reimport.py +134 -99
  423. endoreg_db/views/video/segments_crud.py +134 -44
  424. endoreg_db/views/video/video_apply_mask.py +13 -12
  425. endoreg_db/views/video/video_correction.py +2 -1
  426. endoreg_db/views/video/video_download_processed.py +15 -15
  427. endoreg_db/views/video/video_meta_stats.py +7 -6
  428. endoreg_db/views/video/video_processing_history.py +3 -2
  429. endoreg_db/views/video/video_remove_frames.py +13 -12
  430. endoreg_db/views/video/video_stream.py +110 -82
  431. {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/METADATA +9 -3
  432. {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/RECORD +434 -431
  433. endoreg_db/management/commands/import_fallback_video.py +0 -203
  434. endoreg_db/management/commands/import_video.py +0 -422
  435. endoreg_db/management/commands/import_video_with_classification.py +0 -367
  436. endoreg_db/models/media/processing_history/processing_history.py +0 -96
  437. endoreg_db/serializers/label/__init__.py +0 -7
  438. endoreg_db/serializers/label_video_segment/_lvs_create.py +0 -149
  439. endoreg_db/serializers/label_video_segment/_lvs_update.py +0 -138
  440. endoreg_db/serializers/label_video_segment/_lvs_validate.py +0 -149
  441. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +0 -99
  442. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +0 -163
  443. endoreg_db/services/__old/pdf_import.py +0 -1487
  444. endoreg_db/services/__old/video_import.py +0 -1306
  445. endoreg_db/tasks/upload_tasks.py +0 -216
  446. endoreg_db/tasks/video_ingest.py +0 -161
  447. endoreg_db/tasks/video_processing_tasks.py +0 -327
  448. endoreg_db/views/misc/translation.py +0 -182
  449. {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/WHEEL +0 -0
  450. {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/licenses/LICENSE +0 -0
@@ -27,59 +27,59 @@ logger = logging.getLogger(__name__)
27
27
  def parse_range_header(range_header: str, file_size: int) -> Tuple[int, int]:
28
28
  """
29
29
  Parse HTTP Range header and return (start, end) byte positions.
30
-
30
+
31
31
  Args:
32
32
  range_header: HTTP Range header value (e.g., "bytes=0-1023")
33
33
  file_size: Total file size in bytes
34
-
34
+
35
35
  Returns:
36
36
  Tuple of (start_byte, end_byte) inclusive
37
-
37
+
38
38
  Raises:
39
39
  ValueError: If range header is invalid
40
40
  """
41
41
  # Expected format: "bytes=start-end" or "bytes=start-"
42
- match = re.match(r'bytes=(\d+)-(\d*)', range_header)
43
-
42
+ match = re.match(r"bytes=(\d+)-(\d*)", range_header)
43
+
44
44
  if not match:
45
45
  raise ValueError(f"Invalid Range header format: {range_header}")
46
-
46
+
47
47
  start = int(match.group(1))
48
48
  end_str = match.group(2)
49
-
49
+
50
50
  # If end is not specified, use file size - 1
51
51
  end = int(end_str) if end_str else file_size - 1
52
-
52
+
53
53
  # Validate range
54
54
  if start >= file_size or start < 0:
55
55
  raise ValueError(f"Start byte {start} is out of range (file size: {file_size})")
56
-
56
+
57
57
  if end >= file_size:
58
58
  end = file_size - 1
59
-
59
+
60
60
  if start > end:
61
61
  raise ValueError(f"Invalid range: start ({start}) > end ({end})")
62
-
62
+
63
63
  return start, end
64
64
 
65
65
 
66
66
  def stream_file_chunk(file_path: Path, start: int, end: int, chunk_size: int = 8192):
67
67
  """
68
68
  Generator that yields chunks of a file within the specified byte range.
69
-
69
+
70
70
  Args:
71
71
  file_path: Path to the file
72
72
  start: Start byte position (inclusive)
73
73
  end: End byte position (inclusive)
74
74
  chunk_size: Size of each chunk to yield
75
-
75
+
76
76
  Yields:
77
77
  Bytes chunks from the file
78
78
  """
79
- with open(file_path, 'rb') as f:
79
+ with open(file_path, "rb") as f:
80
80
  f.seek(start)
81
81
  remaining = end - start + 1 # +1 because end is inclusive
82
-
82
+
83
83
  while remaining > 0:
84
84
  chunk = f.read(min(chunk_size, remaining))
85
85
  if not chunk:
@@ -88,57 +88,72 @@ def stream_file_chunk(file_path: Path, start: int, end: int, chunk_size: int = 8
88
88
  remaining -= len(chunk)
89
89
 
90
90
 
91
- def _stream_video_file(vf: VideoFile, frontend_origin: str, file_type: str = 'raw', range_header: Optional[str] = None) -> FileResponse | StreamingHttpResponse:
91
+ def _stream_video_file(
92
+ vf: VideoFile,
93
+ frontend_origin: str,
94
+ file_type: str = "raw",
95
+ range_header: Optional[str] = None,
96
+ ) -> FileResponse | StreamingHttpResponse:
92
97
  """
93
98
  Helper function to stream a video file with proper headers, CORS support, and HTTP Range Requests.
94
-
99
+
95
100
  Args:
96
101
  vf: VideoFile model instance
97
102
  frontend_origin: Frontend origin URL for CORS headers
98
103
  file_type: Either 'raw' (original video) or 'processed' (anonymized video)
99
104
  range_header: HTTP Range header value (e.g., "bytes=0-1023") for partial content requests
100
-
105
+
101
106
  Returns:
102
107
  FileResponse: HTTP 200 response streaming the entire file (no range header)
103
108
  StreamingHttpResponse: HTTP 206 response streaming partial content (with range header)
104
-
109
+
105
110
  Raises:
106
111
  Http404: If video file not found or cannot be accessed
107
-
112
+
108
113
  Note:
109
114
  Permissions are handled by the calling view, not in this helper function.
110
115
  HTTP 206 Partial Content support is critical for video seeking in browsers.
111
116
  """
112
117
  try:
113
118
  # Determine which file to stream based on file_type
114
- if file_type == 'raw':
115
- if hasattr(vf, 'active_raw_file') and vf.active_raw_file and hasattr(vf.active_raw_file, 'name'):
119
+ if file_type == "raw":
120
+ if (
121
+ hasattr(vf, "active_raw_file")
122
+ and vf.active_raw_file
123
+ and hasattr(vf.active_raw_file, "name")
124
+ ):
116
125
  file_ref = vf.active_raw_file
117
126
  else:
118
127
  raise Http404("No raw video file available for this entry")
119
-
120
- elif file_type == 'processed':
121
- if hasattr(vf, 'processed_file') and vf.processed_file and hasattr(vf.processed_file, 'name'):
128
+
129
+ elif file_type == "processed":
130
+ if (
131
+ hasattr(vf, "processed_file")
132
+ and vf.processed_file
133
+ and hasattr(vf.processed_file, "name")
134
+ ):
122
135
  file_ref = vf.processed_file
123
136
  else:
124
137
  raise Http404("No processed video file available for this entry")
125
138
  else:
126
- raise ValueError(f"Invalid file_type: {file_type}. Must be 'raw' or 'processed'.")
127
-
139
+ raise ValueError(
140
+ f"Invalid file_type: {file_type}. Must be 'raw' or 'processed'."
141
+ )
142
+
128
143
  # FIX: Handle both relative and absolute paths
129
144
  # Django FileField.path returns .name if MEDIA_ROOT is not set
130
145
  # Import services store relative paths like "videos/UUID.mp4"
131
146
  # We need to resolve to absolute path: STORAGE_DIR / "videos/UUID.mp4"
132
147
  file_name = file_ref.name
133
-
134
- if file_name.startswith('/'):
148
+
149
+ if file_name.startswith("/"):
135
150
  # Already absolute path
136
151
  path = Path(file_name)
137
152
  else:
138
153
  # Relative path - make absolute by prepending STORAGE_DIR
139
154
  path = STORAGE_DIR / file_name
140
155
  logger.debug("Resolved relative path '%s' to absolute: %s", file_name, path)
141
-
156
+
142
157
  # Validate file exists on disk
143
158
  if not path.exists():
144
159
  raise Http404(f"Video file not found on disk: {path}")
@@ -153,37 +168,39 @@ def _stream_video_file(vf: VideoFile, frontend_origin: str, file_type: str = 'ra
153
168
 
154
169
  # Determine MIME type
155
170
  mime, _ = mimetypes.guess_type(str(path))
156
- content_type = mime or 'video/mp4' # Default to mp4 if detection fails
157
-
171
+ content_type = mime or "video/mp4" # Default to mp4 if detection fails
172
+
158
173
  # ✅ NEW: HTTP Range Request support for video seeking
159
174
  if range_header:
160
175
  try:
161
176
  # Parse Range header
162
177
  start, end = parse_range_header(range_header, file_size)
163
- logger.debug("Range request: bytes=%d-%d (total: %d)", start, end, file_size)
164
-
178
+ logger.debug(
179
+ "Range request: bytes=%d-%d (total: %d)", start, end, file_size
180
+ )
181
+
165
182
  # Stream partial content (HTTP 206)
166
183
  response = StreamingHttpResponse(
167
184
  stream_file_chunk(path, start, end),
168
185
  status=206, # Partial Content
169
- content_type=content_type
186
+ content_type=content_type,
170
187
  )
171
-
188
+
172
189
  # Set Range-specific headers
173
- response['Content-Range'] = f'bytes {start}-{end}/{file_size}'
174
- response['Content-Length'] = str(end - start + 1)
175
- response['Accept-Ranges'] = 'bytes'
176
- response['Content-Disposition'] = f'inline; filename="{path.name}"'
177
-
190
+ response["Content-Range"] = f"bytes {start}-{end}/{file_size}"
191
+ response["Content-Length"] = str(end - start + 1)
192
+ response["Accept-Ranges"] = "bytes"
193
+ response["Content-Disposition"] = f'inline; filename="{path.name}"'
194
+
178
195
  except ValueError as e:
179
196
  # Invalid range header - return 416 Range Not Satisfiable
180
197
  logger.warning("Invalid Range header: %s", str(e))
181
198
  response = StreamingHttpResponse(
182
199
  status=416, # Range Not Satisfiable
183
- content_type=content_type
200
+ content_type=content_type,
184
201
  )
185
- response['Content-Range'] = f'bytes */{file_size}'
186
-
202
+ response["Content-Range"] = f"bytes */{file_size}"
203
+
187
204
  else:
188
205
  # No Range header - stream entire file (HTTP 200)
189
206
  try:
@@ -191,19 +208,21 @@ def _stream_video_file(vf: VideoFile, frontend_origin: str, file_type: str = 'ra
191
208
  with open(path, "rb") as file_handle:
192
209
  response = FileResponse(file_handle, content_type=content_type)
193
210
  # Set HTTP headers for video streaming
194
- response['Content-Length'] = str(file_size)
195
- response['Accept-Ranges'] = 'bytes' # Enable HTTP range requests for seeking
196
- response['Content-Disposition'] = f'inline; filename="{path.name}"'
197
-
211
+ response["Content-Length"] = str(file_size)
212
+ response["Accept-Ranges"] = (
213
+ "bytes" # Enable HTTP range requests for seeking
214
+ )
215
+ response["Content-Disposition"] = f'inline; filename="{path.name}"'
216
+
198
217
  except IOError as e:
199
218
  raise Http404(f"Cannot open video file: {str(e)}")
200
-
219
+
201
220
  # CORS headers for frontend access (both HTTP 200 and 206)
202
221
  response["Access-Control-Allow-Origin"] = frontend_origin
203
222
  response["Access-Control-Allow-Credentials"] = "true"
204
-
223
+
205
224
  return response
206
-
225
+
207
226
  except Exception as e:
208
227
  # Log unexpected errors but don't expose internal details
209
228
  logger.error("Unexpected error in _stream_video_file: %s", str(e))
@@ -213,18 +232,18 @@ def _stream_video_file(vf: VideoFile, frontend_origin: str, file_type: str = 'ra
213
232
  class VideoStreamView(APIView):
214
233
  """
215
234
  Separate view for video streaming to avoid DRF content negotiation issues.
216
-
235
+
217
236
  Supports streaming both raw (original) and processed (anonymized) videos.
218
-
237
+
219
238
  Query Parameters:
220
239
  type: 'raw' (default) or 'processed' - Selects which video file to stream
221
240
  file_type: (deprecated, use 'type') - Legacy parameter for backwards compatibility
222
-
241
+
223
242
  Examples:
224
243
  GET /api/media/videos/1/?type=raw - Stream original raw video
225
244
  GET /api/media/videos/1/?type=processed - Stream anonymized/masked video
226
245
  GET /api/videostream/1/ - Default to raw video (legacy endpoint)
227
-
246
+
228
247
  Phase 3.2 Implementation:
229
248
  - Supports dual video comparison (raw vs processed)
230
249
  - Backward compatible with legacy ?file_type= parameter
@@ -232,74 +251,83 @@ class VideoStreamView(APIView):
232
251
  - CORS support for frontend access
233
252
  - HTTP range support for video seeking
234
253
  """
254
+
235
255
  permission_classes = [EnvironmentAwarePermission]
236
-
256
+
237
257
  def get(self, request, pk=None):
238
258
  """
239
259
  Stream raw or anonymized video file with HTTP Range Request and CORS support.
240
-
260
+
241
261
  Supports HTTP 206 Partial Content for video seeking functionality.
242
-
262
+
243
263
  Args:
244
264
  request: HTTP request object
245
265
  pk: Video ID (primary key)
246
-
266
+
247
267
  Returns:
248
268
  FileResponse: HTTP 200 streaming entire video file (no range header)
249
269
  StreamingHttpResponse: HTTP 206 streaming partial content (with range header)
250
-
270
+
251
271
  Raises:
252
272
  Http404: If video not found or file cannot be accessed
253
273
  """
254
274
  if pk is None:
255
275
  raise Http404("Video ID is required")
256
-
276
+
257
277
  # Initialize variables in outer scope
258
278
  video_id_int = None
259
-
279
+
260
280
  try:
261
281
  # Validate video_id is numeric
262
282
  try:
263
283
  video_id_int = int(pk)
264
284
  except (ValueError, TypeError):
265
285
  raise Http404("Invalid video ID format")
266
-
286
+
267
287
  # Support both 'type' (frontend standard) and 'file_type' (legacy)
268
288
  # Priority: type > file_type > default 'raw'
269
- file_type = 'raw' # Default value
289
+ file_type = "raw" # Default value
270
290
  try:
271
- file_type_param = request.query_params.get('type') or request.query_params.get('file_type')
291
+ file_type_param = request.query_params.get(
292
+ "type"
293
+ ) or request.query_params.get("file_type")
272
294
  if file_type_param:
273
295
  file_type = file_type_param.lower()
274
-
275
- if file_type not in ['raw', 'processed']:
276
- logger.warning("Invalid file_type '%s', defaulting to 'raw'", file_type)
277
- file_type = 'raw'
278
-
296
+
297
+ if file_type not in ["raw", "processed"]:
298
+ logger.warning(
299
+ "Invalid file_type '%s', defaulting to 'raw'", file_type
300
+ )
301
+ file_type = "raw"
302
+
279
303
  except Exception as e:
280
- logger.warning("Error parsing file_type parameter: %s, defaulting to 'raw'", e)
281
- file_type = 'raw'
282
-
304
+ logger.warning(
305
+ "Error parsing file_type parameter: %s, defaulting to 'raw'", e
306
+ )
307
+ file_type = "raw"
308
+
283
309
  # Fetch video from database
284
310
  vf = VideoFile.objects.get(pk=video_id_int)
285
-
311
+
286
312
  # Get frontend origin for CORS
287
- frontend_origin = os.environ.get('FRONTEND_ORIGIN', 'http://localhost:8000')
288
-
313
+ frontend_origin = os.environ.get("FRONTEND_ORIGIN", "http://localhost:8000")
314
+
289
315
  # ✅ NEW: Extract Range header for HTTP 206 support
290
- range_header = request.META.get('HTTP_RANGE')
291
-
316
+ range_header = request.META.get("HTTP_RANGE")
317
+
292
318
  # Stream the video file with optional range support
293
319
  return _stream_video_file(vf, frontend_origin, file_type, range_header)
294
-
320
+
295
321
  except VideoFile.DoesNotExist:
296
322
  raise Http404(f"Video with ID {pk} not found")
297
-
323
+
298
324
  except Http404:
299
325
  # Re-raise Http404 exceptions as they should bubble up
300
326
  raise
301
-
327
+
302
328
  except Exception as e:
303
329
  # Log unexpected errors and convert to Http404
304
- logger.error("Unexpected error in VideoStreamView for video_id=%s: %s", pk, str(e))
330
+ logger.error(
331
+ "Unexpected error in VideoStreamView for video_id=%s: %s", pk, str(e)
332
+ )
305
333
  raise Http404("Video streaming failed")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: endoreg-db
3
- Version: 0.8.9.2
3
+ Version: 0.8.9.10
4
4
  Summary: EndoReg Db Django App
5
5
  Project-URL: Homepage, https://info.coloreg.de
6
6
  Project-URL: Repository, https://github.com/wg-lux/endoreg-db
@@ -22,8 +22,9 @@ Requires-Dist: django-bootstrap5>=25.2
22
22
  Requires-Dist: django-cors-headers>=4.8.0
23
23
  Requires-Dist: django-extensions>=3.2.3
24
24
  Requires-Dist: django-filter>=25.1
25
- Requires-Dist: django-modeltranslation>=0.19.16
25
+ Requires-Dist: django-stubs>=5.2.8
26
26
  Requires-Dist: django>=5.2.4
27
+ Requires-Dist: djangorestframework-stubs>=3.16.6
27
28
  Requires-Dist: djangorestframework>=3.16.1
28
29
  Requires-Dist: dotenv>=0.9.9
29
30
  Requires-Dist: faker>=37.6.0
@@ -33,7 +34,7 @@ Requires-Dist: gunicorn>=23.0.0
33
34
  Requires-Dist: icecream>=2.1.4
34
35
  Requires-Dist: librosa==0.11.0
35
36
  Requires-Dist: llvmlite>=0.44.0
36
- Requires-Dist: lx-anonymizer[llm,ocr]==0.8.9.7
37
+ Requires-Dist: lx-anonymizer[llm,ocr]==0.8.9.8
37
38
  Requires-Dist: moviepy==2.2.1
38
39
  Requires-Dist: mozilla-django-oidc>=4.0.1
39
40
  Requires-Dist: mypy>=1.16.0
@@ -45,6 +46,7 @@ Requires-Dist: optimum==1.26.1
45
46
  Requires-Dist: pandas>=2.2.3
46
47
  Requires-Dist: pillow>=11.3.0
47
48
  Requires-Dist: pip>=25.2
49
+ Requires-Dist: pre-commit>=4.5.1
48
50
  Requires-Dist: pydantic>=2.10.6
49
51
  Requires-Dist: pyjwt>=2.10.1
50
52
  Requires-Dist: pytesseract>=0.3.13
@@ -73,6 +75,10 @@ Requires-Dist: torchvision==0.20.1
73
75
  Requires-Dist: tqdm>=4.67.0
74
76
  Requires-Dist: transformers==4.44.2
75
77
  Requires-Dist: twine>=6.2.0
78
+ Requires-Dist: types-django-filter>=25.2.0.20251010
79
+ Requires-Dist: types-pyyaml>=6.0.12.20250915
80
+ Requires-Dist: types-requests>=2.32.4.20250913
81
+ Requires-Dist: types-tqdm>=4.67.0.20250809
76
82
  Requires-Dist: urllib3>=2.2.3
77
83
  Requires-Dist: vector-quantize-pytorch==1.18.5
78
84
  Requires-Dist: vocos==0.1.0