edu-rdm-integration 3.9.2__py3-none-any.whl → 3.10.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. edu_rdm_integration/__init__.py +0 -1
  2. edu_rdm_integration/adapters/apps.py +15 -2
  3. edu_rdm_integration/adapters/caches.py +25 -12
  4. edu_rdm_integration/adapters/errors.py +13 -2
  5. edu_rdm_integration/adapters/functions.py +53 -14
  6. edu_rdm_integration/adapters/helpers.py +34 -8
  7. edu_rdm_integration/adapters/managers.py +41 -5
  8. edu_rdm_integration/adapters/presenters.py +26 -2
  9. edu_rdm_integration/adapters/receivers.py +16 -2
  10. edu_rdm_integration/adapters/results.py +50 -4
  11. edu_rdm_integration/adapters/runners.py +79 -20
  12. edu_rdm_integration/adapters/strategies.py +56 -54
  13. edu_rdm_integration/adapters/validators.py +43 -4
  14. edu_rdm_integration/apps.py +3 -23
  15. edu_rdm_integration/collect_and_export_data/__init__.py +1 -1
  16. edu_rdm_integration/collect_and_export_data/apps.py +1 -0
  17. edu_rdm_integration/collect_and_export_data/migrations/0001_initial.py +107 -17
  18. edu_rdm_integration/collect_and_export_data/migrations/0002_auto_20250204_1413.py +4 -2
  19. edu_rdm_integration/{consts.py → core/consts.py} +0 -11
  20. edu_rdm_integration/{enums.py → core/enums.py} +7 -54
  21. edu_rdm_integration/core/helpers.py +331 -0
  22. edu_rdm_integration/core/operations.py +71 -0
  23. edu_rdm_integration/core/redis_cache.py +20 -0
  24. edu_rdm_integration/{collect_and_export_data → core/registry}/actions.py +6 -12
  25. edu_rdm_integration/core/registry/apps.py +11 -0
  26. edu_rdm_integration/{collect_and_export_data → core/registry}/ui.py +1 -1
  27. edu_rdm_integration/{storages.py → core/storages.py} +8 -17
  28. edu_rdm_integration/{utils.py → core/utils.py} +29 -91
  29. edu_rdm_integration/migrations/0001_initial.py +294 -44
  30. edu_rdm_integration/migrations/0002_init_data_uploadstatus.py +1 -3
  31. edu_rdm_integration/migrations/0003_create_index_file_upload_status.py +0 -1
  32. edu_rdm_integration/migrations/0004_uploaderclientlog.py +1 -2
  33. edu_rdm_integration/migrations/0005_auto_20231204_1224.py +16 -4
  34. edu_rdm_integration/migrations/0006_request_status_data.py +60 -58
  35. edu_rdm_integration/migrations/0007_delete_upload_status.py +0 -1
  36. edu_rdm_integration/migrations/0009_auto_20240522_1619.py +1 -5
  37. edu_rdm_integration/migrations/0010_transferredentity_export_enabled.py +0 -1
  38. edu_rdm_integration/migrations/0011_exportingdatasubstageentity.py +16 -3
  39. edu_rdm_integration/migrations/0012_exportingdatasubstageattachment_attachment_size.py +0 -1
  40. edu_rdm_integration/migrations/0013_set_attachment_size.py +8 -12
  41. edu_rdm_integration/migrations/0014_uploaddatacommand.py +33 -6
  42. edu_rdm_integration/migrations/0015_set_exporting_sub_stage_status.py +1 -5
  43. edu_rdm_integration/migrations/0016_transferredentity_queue_level.py +2 -2
  44. edu_rdm_integration/migrations/0017_delete_uploaddatacommand.py +3 -2
  45. edu_rdm_integration/migrations/__init__.py +1 -0
  46. edu_rdm_integration/{registry → pipelines/transfer}/actions.py +13 -26
  47. edu_rdm_integration/pipelines/transfer/app_meta.py +18 -0
  48. edu_rdm_integration/pipelines/transfer/apps.py +19 -0
  49. edu_rdm_integration/pipelines/transfer/enums.py +34 -0
  50. edu_rdm_integration/pipelines/transfer/migrations/0001_initial.py +57 -0
  51. edu_rdm_integration/{base.py → pipelines/transfer/mixins.py} +29 -53
  52. edu_rdm_integration/pipelines/transfer/models.py +48 -0
  53. edu_rdm_integration/{tasks.py → pipelines/transfer/tasks.py} +51 -150
  54. edu_rdm_integration/{registry → pipelines/transfer}/ui.py +4 -10
  55. edu_rdm_integration/rdm_entities/apps.py +11 -0
  56. edu_rdm_integration/{entities.py → rdm_entities/entities.py} +67 -57
  57. edu_rdm_integration/rdm_entities/migrations/0001_initial.py +44 -0
  58. edu_rdm_integration/{enum_register → rdm_entities}/mixins.py +8 -59
  59. edu_rdm_integration/rdm_entities/models.py +63 -0
  60. edu_rdm_integration/rdm_entities/utils.py +33 -0
  61. edu_rdm_integration/rdm_models/apps.py +16 -0
  62. edu_rdm_integration/rdm_models/migrations/0001_initial.py +40 -0
  63. edu_rdm_integration/rdm_models/mixins.py +67 -0
  64. edu_rdm_integration/rdm_models/models.py +73 -0
  65. edu_rdm_integration/rdm_models/utils.py +23 -0
  66. edu_rdm_integration/stages/collect_data/apps.py +11 -0
  67. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/functions.py-tpl +2 -2
  68. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/managers.py-tpl +1 -1
  69. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/runners.py-tpl +1 -1
  70. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/tests.py-tpl +2 -1
  71. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/caches.py +2 -2
  72. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/functions.py +15 -18
  73. edu_rdm_integration/stages/collect_data/functions/base/helpers.py +20 -0
  74. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/managers.py +20 -27
  75. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/mixins.py +38 -55
  76. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/runners.py +2 -5
  77. edu_rdm_integration/stages/collect_data/functions/calculated/base/__init__.py +0 -0
  78. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/caches.py +3 -7
  79. edu_rdm_integration/stages/collect_data/functions/calculated/base/errors.py +7 -0
  80. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/functions.py +8 -16
  81. edu_rdm_integration/stages/collect_data/functions/calculated/base/helpers.py +24 -0
  82. edu_rdm_integration/stages/collect_data/functions/calculated/base/managers.py +19 -0
  83. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/presenters.py +1 -3
  84. edu_rdm_integration/stages/collect_data/functions/calculated/base/results.py +12 -0
  85. edu_rdm_integration/stages/collect_data/functions/calculated/base/runners.py +28 -0
  86. edu_rdm_integration/stages/collect_data/functions/calculated/base/validators.py +20 -0
  87. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/strategies.py +32 -70
  88. edu_rdm_integration/stages/collect_data/functions/non_calculated/__init__.py +0 -0
  89. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/__init__.py +0 -0
  90. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/caches.py +13 -22
  91. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/errors.py +7 -0
  92. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/functions.py +8 -16
  93. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/helpers.py +24 -0
  94. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/managers.py +19 -0
  95. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/presenters.py +1 -3
  96. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/results.py +12 -0
  97. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/runners.py +28 -0
  98. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/validators.py +20 -0
  99. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/strategies.py +32 -70
  100. edu_rdm_integration/{collect_data → stages/collect_data}/generators.py +9 -14
  101. edu_rdm_integration/stages/collect_data/helpers.py +154 -0
  102. edu_rdm_integration/stages/collect_data/management/__init__.py +0 -0
  103. edu_rdm_integration/stages/collect_data/management/base.py +100 -0
  104. edu_rdm_integration/stages/collect_data/management/commands/__init__.py +0 -0
  105. edu_rdm_integration/{management → stages/collect_data/management}/commands/collect_latest_models_data.py +5 -7
  106. edu_rdm_integration/{management → stages/collect_data/management}/commands/collect_models_data.py +5 -7
  107. edu_rdm_integration/stages/collect_data/migrations/0001_initial.py +187 -0
  108. edu_rdm_integration/stages/collect_data/migrations/0002_edurdmcollectdatacommandprogress.py +105 -0
  109. edu_rdm_integration/stages/collect_data/migrations/__init__.py +0 -0
  110. edu_rdm_integration/stages/collect_data/mixins.py +56 -0
  111. edu_rdm_integration/stages/collect_data/models.py +318 -0
  112. edu_rdm_integration/{collect_data/collect.py → stages/collect_data/operations.py} +30 -43
  113. edu_rdm_integration/stages/collect_data/registry/__init__.py +0 -0
  114. edu_rdm_integration/{collect_data → stages/collect_data/registry}/actions.py +17 -20
  115. edu_rdm_integration/stages/collect_data/registry/apps.py +11 -0
  116. edu_rdm_integration/{collect_data → stages/collect_data/registry}/ui.py +8 -15
  117. edu_rdm_integration/{collect_data → stages/collect_data}/tests.py +2 -2
  118. edu_rdm_integration/stages/export_data/__init__.py +0 -0
  119. edu_rdm_integration/stages/export_data/apps.py +11 -0
  120. edu_rdm_integration/stages/export_data/function_templates/__init__.py +0 -0
  121. edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/functions.py-tpl +2 -2
  122. edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/managers.py-tpl +2 -2
  123. edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/runners.py-tpl +2 -2
  124. edu_rdm_integration/stages/export_data/functions/__init__.py +0 -0
  125. edu_rdm_integration/stages/export_data/functions/base/__init__.py +0 -0
  126. edu_rdm_integration/{export_data → stages/export_data/functions}/base/caches.py +3 -8
  127. edu_rdm_integration/stages/export_data/functions/base/errors.py +7 -0
  128. edu_rdm_integration/{export_data → stages/export_data/functions}/base/functions.py +28 -59
  129. edu_rdm_integration/{export_data → stages/export_data/functions}/base/helpers.py +7 -17
  130. edu_rdm_integration/{export_data → stages/export_data/functions}/base/managers.py +19 -28
  131. edu_rdm_integration/stages/export_data/functions/base/presenters.py +11 -0
  132. edu_rdm_integration/{export_data → stages/export_data/functions}/base/requests.py +13 -40
  133. edu_rdm_integration/stages/export_data/functions/base/results.py +12 -0
  134. edu_rdm_integration/{export_data → stages/export_data/functions}/base/runners.py +9 -21
  135. edu_rdm_integration/stages/export_data/functions/base/validators.py +20 -0
  136. edu_rdm_integration/{export_data → stages/export_data}/generators.py +7 -6
  137. edu_rdm_integration/stages/export_data/helpers.py +203 -0
  138. edu_rdm_integration/stages/export_data/management/__init__.py +0 -0
  139. edu_rdm_integration/stages/export_data/management/base.py +101 -0
  140. edu_rdm_integration/stages/export_data/management/commands/__init__.py +0 -0
  141. edu_rdm_integration/{management → stages/export_data/management}/commands/export_entities_data.py +5 -7
  142. edu_rdm_integration/{management → stages/export_data/management}/commands/export_latest_entities_data.py +5 -7
  143. edu_rdm_integration/stages/export_data/migrations/0001_initial.py +324 -0
  144. edu_rdm_integration/stages/export_data/migrations/__init__.py +0 -0
  145. edu_rdm_integration/stages/export_data/mixins.py +50 -0
  146. edu_rdm_integration/stages/export_data/models.py +362 -0
  147. edu_rdm_integration/{export_data/export.py → stages/export_data/operations.py} +13 -152
  148. edu_rdm_integration/stages/export_data/registry/__init__.py +0 -0
  149. edu_rdm_integration/{export_data → stages/export_data/registry}/actions.py +18 -18
  150. edu_rdm_integration/stages/export_data/registry/apps.py +11 -0
  151. edu_rdm_integration/{export_data → stages/export_data/registry}/ui.py +5 -7
  152. edu_rdm_integration/{export_data → stages/export_data}/strategies.py +30 -68
  153. edu_rdm_integration/stages/service/__init__.py +0 -0
  154. edu_rdm_integration/stages/service/apps.py +19 -0
  155. edu_rdm_integration/stages/service/tasks.py +63 -0
  156. edu_rdm_integration/stages/upload_data/__init__.py +0 -0
  157. edu_rdm_integration/stages/upload_data/apps.py +19 -0
  158. edu_rdm_integration/stages/upload_data/consts.py +10 -0
  159. edu_rdm_integration/{export_data → stages/upload_data}/dataclasses.py +1 -0
  160. edu_rdm_integration/stages/upload_data/enums.py +17 -0
  161. edu_rdm_integration/{export_data/export_manager.py → stages/upload_data/export_managers.py} +73 -68
  162. edu_rdm_integration/stages/upload_data/helpers.py +164 -0
  163. edu_rdm_integration/stages/upload_data/management/__init__.py +0 -0
  164. edu_rdm_integration/stages/upload_data/management/base.py +134 -0
  165. edu_rdm_integration/stages/upload_data/management/commands/__init__.py +0 -0
  166. edu_rdm_integration/{management → stages/upload_data/management}/commands/async_fix_attachment_size.py +32 -54
  167. edu_rdm_integration/{management → stages/upload_data/management}/commands/check_upload_status.py +7 -6
  168. edu_rdm_integration/{management → stages/upload_data/management}/commands/datamart_status.py +3 -3
  169. edu_rdm_integration/{management → stages/upload_data/management}/commands/datamart_upload.py +4 -4
  170. edu_rdm_integration/stages/upload_data/migrations/0001_initial.py +161 -0
  171. edu_rdm_integration/stages/upload_data/migrations/__init__.py +0 -0
  172. edu_rdm_integration/stages/upload_data/models.py +175 -0
  173. edu_rdm_integration/stages/upload_data/operations.py +156 -0
  174. edu_rdm_integration/{export_data/queue.py → stages/upload_data/queues.py} +10 -8
  175. edu_rdm_integration/stages/upload_data/tasks.py +103 -0
  176. edu_rdm_integration/stages/upload_data/uploader_log/__init__.py +0 -0
  177. edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/actions.py +14 -16
  178. edu_rdm_integration/stages/upload_data/uploader_log/apps.py +11 -0
  179. edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/managers.py +15 -30
  180. edu_rdm_integration/stages/upload_data/uploader_log/migrations/0001_initial.py +31 -0
  181. edu_rdm_integration/stages/upload_data/uploader_log/migrations/__init__.py +0 -0
  182. edu_rdm_integration/stages/upload_data/uploader_log/models.py +86 -0
  183. edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/ui.py +8 -6
  184. {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.0.dist-info}/METADATA +238 -238
  185. edu_rdm_integration-3.10.0.dist-info/RECORD +255 -0
  186. edu_rdm_integration/app_meta.py +0 -16
  187. edu_rdm_integration/app_settings.py +0 -77
  188. edu_rdm_integration/collect_and_export_data/models.py +0 -67
  189. edu_rdm_integration/collect_and_export_data/utils.py +0 -224
  190. edu_rdm_integration/collect_data/base/helpers.py +0 -26
  191. edu_rdm_integration/collect_data/calculated/base/errors.py +0 -9
  192. edu_rdm_integration/collect_data/calculated/base/helpers.py +0 -32
  193. edu_rdm_integration/collect_data/calculated/base/managers.py +0 -23
  194. edu_rdm_integration/collect_data/calculated/base/results.py +0 -16
  195. edu_rdm_integration/collect_data/calculated/base/runners.py +0 -36
  196. edu_rdm_integration/collect_data/calculated/base/validators.py +0 -28
  197. edu_rdm_integration/collect_data/helpers.py +0 -92
  198. edu_rdm_integration/collect_data/non_calculated/base/errors.py +0 -9
  199. edu_rdm_integration/collect_data/non_calculated/base/helpers.py +0 -32
  200. edu_rdm_integration/collect_data/non_calculated/base/managers.py +0 -23
  201. edu_rdm_integration/collect_data/non_calculated/base/results.py +0 -16
  202. edu_rdm_integration/collect_data/non_calculated/base/runners.py +0 -36
  203. edu_rdm_integration/collect_data/non_calculated/base/validators.py +0 -28
  204. edu_rdm_integration/enum_register/register.py +0 -79
  205. edu_rdm_integration/export_data/base/errors.py +0 -9
  206. edu_rdm_integration/export_data/base/presenters.py +0 -13
  207. edu_rdm_integration/export_data/base/results.py +0 -16
  208. edu_rdm_integration/export_data/base/validators.py +0 -28
  209. edu_rdm_integration/export_data/helpers.py +0 -92
  210. edu_rdm_integration/helpers.py +0 -412
  211. edu_rdm_integration/management/general.py +0 -327
  212. edu_rdm_integration/models.py +0 -982
  213. edu_rdm_integration/redis_cache.py +0 -51
  214. edu_rdm_integration/uploader_log/apps.py +0 -10
  215. edu_rdm_integration-3.9.2.dist-info/RECORD +0 -198
  216. /edu_rdm_integration/{collect_and_export_data/migrations → core}/__init__.py +0 -0
  217. /edu_rdm_integration/{mapping.py → core/mapping.py} +0 -0
  218. /edu_rdm_integration/{collect_data → core/registry}/__init__.py +0 -0
  219. /edu_rdm_integration/{templates → core/registry/templates}/ui-js/start-task.js +0 -0
  220. /edu_rdm_integration/{signals.py → core/signals.py} +0 -0
  221. /edu_rdm_integration/{typing.py → core/typing.py} +0 -0
  222. /edu_rdm_integration/{collect_data/base → pipelines}/__init__.py +0 -0
  223. /edu_rdm_integration/{collect_data/calculated → pipelines/transfer}/__init__.py +0 -0
  224. /edu_rdm_integration/{collect_data/calculated/base → pipelines/transfer/migrations}/__init__.py +0 -0
  225. /edu_rdm_integration/{templates → pipelines/transfer/templates}/ui-js/transferred-entity-list.js +0 -0
  226. /edu_rdm_integration/{collect_data/non_calculated → rdm_entities}/__init__.py +0 -0
  227. /edu_rdm_integration/{collect_data/non_calculated/base → rdm_entities/migrations}/__init__.py +0 -0
  228. /edu_rdm_integration/{enum_register → rdm_models}/__init__.py +0 -0
  229. /edu_rdm_integration/{export_data → rdm_models/migrations}/__init__.py +0 -0
  230. /edu_rdm_integration/{export_data/base → stages}/__init__.py +0 -0
  231. /edu_rdm_integration/{function_templates → stages/collect_data}/__init__.py +0 -0
  232. /edu_rdm_integration/{collect_data/const.py → stages/collect_data/consts.py} +0 -0
  233. /edu_rdm_integration/{management → stages/collect_data/function_templates}/__init__.py +0 -0
  234. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/__init__.py-tpl +0 -0
  235. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/apps.py-tpl +0 -0
  236. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/caches.py-tpl +0 -0
  237. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/consts.py-tpl +0 -0
  238. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/enums.py-tpl +0 -0
  239. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/errors.py-tpl +0 -0
  240. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/helpers.py-tpl +0 -0
  241. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/presenters.py-tpl +0 -0
  242. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/results.py-tpl +0 -0
  243. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/strings.py-tpl +0 -0
  244. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/validators.py-tpl +0 -0
  245. /edu_rdm_integration/{management/commands → stages/collect_data/functions}/__init__.py +0 -0
  246. /edu_rdm_integration/{registry → stages/collect_data/functions/base}/__init__.py +0 -0
  247. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/consts.py +0 -0
  248. /edu_rdm_integration/{uploader_log → stages/collect_data/functions/calculated}/__init__.py +0 -0
  249. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/consts.py +0 -0
  250. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/enums.py +0 -0
  251. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/strings.py +0 -0
  252. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/tests.py +0 -0
  253. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/consts.py +0 -0
  254. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/enums.py +0 -0
  255. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/strings.py +0 -0
  256. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/tests.py +0 -0
  257. /edu_rdm_integration/{export_data → stages/export_data}/consts.py +0 -0
  258. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/__init__.py-tpl +0 -0
  259. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/apps.py-tpl +0 -0
  260. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/caches.py-tpl +0 -0
  261. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/consts.py-tpl +0 -0
  262. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/enums.py-tpl +0 -0
  263. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/errors.py-tpl +0 -0
  264. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/helpers.py-tpl +0 -0
  265. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/presenters.py-tpl +0 -0
  266. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/results.py-tpl +0 -0
  267. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/strings.py-tpl +0 -0
  268. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/tests.py-tpl +0 -0
  269. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/validators.py-tpl +0 -0
  270. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/consts.py +0 -0
  271. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/enums.py +0 -0
  272. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/strings.py +0 -0
  273. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/tests.py +0 -0
  274. /edu_rdm_integration/{templates → stages/export_data/registry/templates}/ui-js/stage_for_export.js +0 -0
  275. /edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/enums.py +0 -0
  276. /edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/templates/ui-js/object-grid-buttons.js +0 -0
  277. {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.0.dist-info}/WHEEL +0 -0
  278. {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.0.dist-info}/licenses/LICENSE +0 -0
  279. {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,161 @@
1
+ # Generated by Django 3.2.24 on 2025-06-28 14:21
2
+
3
+ import django.db.models.deletion
4
+ from django.db import (
5
+ migrations,
6
+ models,
7
+ )
8
+
9
+ import educommon.django.db.mixins
10
+ import m3_db_utils.mixins
11
+
12
+
13
+ class Migration(migrations.Migration):
14
+ initial = True
15
+
16
+ dependencies = [
17
+ ('edu_rdm_integration_export_data_stage', '0001_initial'),
18
+ ('uploader_client', '0001_initial'),
19
+ ]
20
+
21
+ operations = [
22
+ migrations.SeparateDatabaseAndState(
23
+ state_operations=[
24
+ migrations.CreateModel(
25
+ name='DataMartRequestStatus',
26
+ fields=[
27
+ ('title', models.TextField(verbose_name='расшифровка значения')),
28
+ ('value', models.IntegerField(verbose_name='значение')),
29
+ (
30
+ 'key',
31
+ models.CharField(
32
+ db_index=True, max_length=512, primary_key=True, serialize=False, verbose_name='ключ'
33
+ ),
34
+ ),
35
+ ('order_number', models.PositiveIntegerField(default=100000, verbose_name='Порядковый номер')),
36
+ ],
37
+ options={
38
+ 'verbose_name': 'Статус загрузки данных в Витрину',
39
+ 'verbose_name_plural': 'Статусы загрузки данных в Витрину',
40
+ 'db_table': 'rdm_request_status',
41
+ },
42
+ bases=(m3_db_utils.mixins.BaseValueMixin, models.Model),
43
+ ),
44
+ migrations.CreateModel(
45
+ name='ExportingDataSubStageUploaderClientLog',
46
+ fields=[
47
+ (
48
+ 'id',
49
+ models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
50
+ ),
51
+ (
52
+ 'request_id',
53
+ models.CharField(
54
+ blank=True, db_index=True, max_length=100, verbose_name='Id запроса загрузки в витрину'
55
+ ),
56
+ ),
57
+ ('is_emulation', models.BooleanField(default=False, verbose_name='Включен режим эмуляции')),
58
+ (
59
+ 'file_upload_status',
60
+ models.SmallIntegerField(
61
+ blank=True,
62
+ choices=[
63
+ (1, 'В процессе загрузки в витрину'),
64
+ (2, 'Загрузка в витрину закончена'),
65
+ (3, 'Ошибка загрузки в витрину'),
66
+ ],
67
+ null=True,
68
+ verbose_name='Общий статус загрузки файла в витрину',
69
+ ),
70
+ ),
71
+ (
72
+ 'created',
73
+ models.DateTimeField(
74
+ auto_now_add=True, db_index=True, null=True, verbose_name='Дата создания'
75
+ ),
76
+ ),
77
+ (
78
+ 'modified',
79
+ models.DateTimeField(
80
+ auto_now=True, db_index=True, null=True, verbose_name='Дата изменения'
81
+ ),
82
+ ),
83
+ (
84
+ 'attachment',
85
+ models.ForeignKey(
86
+ on_delete=django.db.models.deletion.CASCADE,
87
+ to='edu_rdm_integration_export_data_stage.exportingdatasubstageattachment',
88
+ verbose_name='Прикрепленный файл',
89
+ ),
90
+ ),
91
+ (
92
+ 'entry',
93
+ models.ForeignKey(
94
+ on_delete=django.db.models.deletion.CASCADE,
95
+ related_name='uploader_client_log',
96
+ to='uploader_client.entry',
97
+ verbose_name='Лог запроса и ответа',
98
+ ),
99
+ ),
100
+ (
101
+ 'sub_stage',
102
+ models.ForeignKey(
103
+ on_delete=django.db.models.deletion.CASCADE,
104
+ to='edu_rdm_integration_export_data_stage.exportingdatasubstage',
105
+ verbose_name='Подэтап выгрузки данных',
106
+ ),
107
+ ),
108
+ ],
109
+ options={
110
+ 'verbose_name': 'Лог запроса подэтапа выгрузки данных',
111
+ 'verbose_name_plural': 'Лог запроса подэтапа выгрузки данных',
112
+ 'db_table': 'rdm_exporting_data_sub_stage_uploader_client_log',
113
+ },
114
+ bases=(educommon.django.db.mixins.ReprStrPreModelMixin, models.Model),
115
+ ),
116
+ migrations.CreateModel(
117
+ name='UploadStatusRequestLog',
118
+ fields=[
119
+ (
120
+ 'id',
121
+ models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
122
+ ),
123
+ (
124
+ 'entry',
125
+ models.ForeignKey(
126
+ on_delete=django.db.models.deletion.CASCADE,
127
+ related_name='upload_status_request_log',
128
+ to='uploader_client.entry',
129
+ verbose_name='Cвязь запроса статуса с запросом в витрину',
130
+ ),
131
+ ),
132
+ (
133
+ 'request_status',
134
+ models.ForeignKey(
135
+ blank=True,
136
+ null=True,
137
+ on_delete=django.db.models.deletion.PROTECT,
138
+ to='edu_rdm_integration_upload_data_stage.datamartrequeststatus',
139
+ verbose_name='Статус запроса в витрине',
140
+ ),
141
+ ),
142
+ (
143
+ 'upload',
144
+ models.ForeignKey(
145
+ on_delete=django.db.models.deletion.CASCADE,
146
+ to='edu_rdm_integration_upload_data_stage.exportingdatasubstageuploaderclientlog',
147
+ verbose_name='Cвязь запроса статуса с загрузкой файла в витрину',
148
+ ),
149
+ ),
150
+ ],
151
+ options={
152
+ 'verbose_name': 'Лог запроса подэтапа выгрузки данных',
153
+ 'verbose_name_plural': 'Логи запроса подэтапа выгрузки данных',
154
+ 'db_table': 'rdm_upload_status_request_log',
155
+ },
156
+ bases=(educommon.django.db.mixins.ReprStrPreModelMixin, models.Model),
157
+ ),
158
+ ],
159
+ database_operations=[],
160
+ ),
161
+ ]
@@ -0,0 +1,175 @@
1
+ from django.db.models import (
2
+ CASCADE,
3
+ PROTECT,
4
+ BooleanField,
5
+ CharField,
6
+ DateTimeField,
7
+ ForeignKey,
8
+ SmallIntegerField,
9
+ )
10
+ from m3.db import (
11
+ BaseObjectModel,
12
+ )
13
+ from uploader_client.models import (
14
+ Entry,
15
+ )
16
+
17
+ from educommon.django.db.mixins import (
18
+ ReprStrPreModelMixin,
19
+ )
20
+ from m3_db_utils.models import (
21
+ ModelEnumValue,
22
+ TitledIntegerModelEnum,
23
+ )
24
+
25
+ from edu_rdm_integration.stages.export_data.models import (
26
+ ExportingDataSubStage,
27
+ ExportingDataSubStageAttachment,
28
+ )
29
+ from edu_rdm_integration.stages.upload_data.enums import (
30
+ FileUploadStatusEnum,
31
+ )
32
+
33
+
34
+ class DataMartRequestStatus(TitledIntegerModelEnum):
35
+ """Модель-перечисление статусов загрузки данных в Витрину."""
36
+
37
+ UPLOAD_TO_BUFFER = ModelEnumValue(
38
+ value=-1,
39
+ title='Загрузка данных в буффер',
40
+ )
41
+
42
+ BUFFERED = ModelEnumValue(
43
+ value=0,
44
+ title='Запрос буфферизирован',
45
+ )
46
+
47
+ WAIT_FOR_OPEN_DELTA = ModelEnumValue(
48
+ value=1,
49
+ title='Ожидает открытия дельты',
50
+ )
51
+
52
+ IN_PROCESSING = ModelEnumValue(
53
+ value=2,
54
+ title='В обработке',
55
+ )
56
+
57
+ SUCCESSFULLY_PROCESSED = ModelEnumValue(
58
+ value=3,
59
+ title='Успешно обработан',
60
+ )
61
+
62
+ FAILED_PROCESSING = ModelEnumValue(
63
+ value=4,
64
+ title='Ошибка обработки запроса',
65
+ )
66
+
67
+ REQUEST_ID_NOT_FOUND = ModelEnumValue(
68
+ value=5,
69
+ title='Идентификатор запроса не обнаружен',
70
+ )
71
+
72
+ FORMAT_LOGICAL_CONTROL = ModelEnumValue(
73
+ value=6,
74
+ title='Форматно-логический контроль',
75
+ )
76
+
77
+ FLC_ERROR = ModelEnumValue(
78
+ value=7,
79
+ title='Ошибки ФЛК',
80
+ )
81
+
82
+ class Meta:
83
+ db_table = 'rdm_request_status'
84
+ verbose_name = 'Статус загрузки данных в Витрину'
85
+ verbose_name_plural = 'Статусы загрузки данных в Витрину'
86
+
87
+
88
+ class ExportingDataSubStageUploaderClientLog(ReprStrPreModelMixin, BaseObjectModel):
89
+ """Связь лога Загрузчика данных с подэтапом выгрузки данных."""
90
+
91
+ entry = ForeignKey(
92
+ to=Entry,
93
+ verbose_name='Лог запроса и ответа',
94
+ on_delete=CASCADE,
95
+ related_name='uploader_client_log',
96
+ )
97
+
98
+ sub_stage = ForeignKey(
99
+ to=ExportingDataSubStage,
100
+ verbose_name='Подэтап выгрузки данных',
101
+ on_delete=CASCADE,
102
+ )
103
+
104
+ attachment = ForeignKey(
105
+ to=ExportingDataSubStageAttachment,
106
+ verbose_name='Прикрепленный файл',
107
+ on_delete=CASCADE,
108
+ )
109
+
110
+ request_id = CharField(
111
+ verbose_name='Id запроса загрузки в витрину',
112
+ max_length=100,
113
+ blank=True,
114
+ db_index=True,
115
+ )
116
+
117
+ is_emulation = BooleanField(
118
+ verbose_name='Включен режим эмуляции',
119
+ default=False,
120
+ )
121
+
122
+ file_upload_status = SmallIntegerField(
123
+ verbose_name='Общий статус загрузки файла в витрину',
124
+ choices=FileUploadStatusEnum.get_choices(),
125
+ null=True,
126
+ blank=True,
127
+ )
128
+
129
+ created = DateTimeField(
130
+ verbose_name='Дата создания',
131
+ auto_now_add=True,
132
+ null=True,
133
+ blank=True,
134
+ db_index=True,
135
+ )
136
+ modified = DateTimeField(
137
+ verbose_name='Дата изменения',
138
+ auto_now=True,
139
+ null=True,
140
+ blank=True,
141
+ db_index=True,
142
+ )
143
+
144
+ class Meta:
145
+ db_table = 'rdm_exporting_data_sub_stage_uploader_client_log'
146
+ verbose_name = 'Лог запроса подэтапа выгрузки данных'
147
+ verbose_name_plural = 'Лог запроса подэтапа выгрузки данных'
148
+
149
+
150
+ class UploadStatusRequestLog(ReprStrPreModelMixin, BaseObjectModel):
151
+ """Модель связывающая статусы, загрузку файла в витрину и http-запрос к витрине."""
152
+
153
+ upload = ForeignKey(
154
+ verbose_name='Cвязь запроса статуса с загрузкой файла в витрину',
155
+ to=ExportingDataSubStageUploaderClientLog,
156
+ on_delete=CASCADE,
157
+ )
158
+ entry = ForeignKey(
159
+ verbose_name='Cвязь запроса статуса с запросом в витрину',
160
+ to=Entry,
161
+ on_delete=CASCADE,
162
+ related_name='upload_status_request_log',
163
+ )
164
+ request_status = ForeignKey(
165
+ verbose_name='Статус запроса в витрине',
166
+ to=DataMartRequestStatus,
167
+ on_delete=PROTECT,
168
+ null=True,
169
+ blank=True,
170
+ )
171
+
172
+ class Meta:
173
+ db_table = 'rdm_upload_status_request_log'
174
+ verbose_name = 'Лог запроса подэтапа выгрузки данных'
175
+ verbose_name_plural = 'Логи запроса подэтапа выгрузки данных'
@@ -0,0 +1,156 @@
1
+ import logging
2
+ import os
3
+ from typing import (
4
+ Union,
5
+ )
6
+
7
+ from django.conf import (
8
+ settings,
9
+ )
10
+
11
+ from educommon import (
12
+ logger,
13
+ )
14
+
15
+ from edu_rdm_integration.core.operations import (
16
+ BaseOperationData,
17
+ )
18
+ from edu_rdm_integration.core.redis_cache import (
19
+ AbstractCache,
20
+ )
21
+ from edu_rdm_integration.stages.export_data.consts import (
22
+ TOTAL_ATTACHMENTS_SIZE_KEY,
23
+ )
24
+ from edu_rdm_integration.stages.upload_data.export_managers import (
25
+ ExportQueueSender,
26
+ WorkerSender,
27
+ )
28
+ from edu_rdm_integration.stages.upload_data.queues import (
29
+ Queue,
30
+ )
31
+
32
+
33
+ class UploadData(BaseOperationData):
34
+ """Класс отправки файлов в витрину."""
35
+
36
+ def __init__(
37
+ self,
38
+ data_cache: AbstractCache,
39
+ queue: Queue,
40
+ **kwargs,
41
+ ):
42
+ super().__init__(**kwargs)
43
+
44
+ self.data_cache = data_cache
45
+ self.queue = queue
46
+
47
+ self._configure_agent_client()
48
+ self.result = {
49
+ 'total_file_size': 0, # Общий размер отправленных файлов
50
+ 'queue_is_full': False, # Признак переполнения очереди
51
+ 'uploaded_entities': '', # Список сущностей, попавших в выгрузку
52
+ }
53
+
54
+ @property
55
+ def _log_file_path(self) -> Union[str, bytes]:
56
+ """Путь до лог файла."""
57
+ return os.path.join(settings.MEDIA_ROOT, settings.RDM_UPLOAD_LOG_DIR, 'upload_entity.log')
58
+
59
+ def _add_file_handler(self) -> None:
60
+ """Добавляет обработчик логов."""
61
+ self._file_handler = logging.FileHandler(self._log_file_path)
62
+
63
+ logging.getLogger('info_logger').addHandler(self._file_handler)
64
+ logging.getLogger('exception_logger').addHandler(self._file_handler)
65
+
66
+ # TODO https://jira.bars.group/browse/EDUSCHL-22492. Вынужденная мера, т.к. при запуске команды не производится
67
+ # проверка готовности конфигов приложений. Нужно переработать механизм конфигурирования клиента загрузчика.
68
+ def _configure_agent_client(self):
69
+ """Конфигурирование клиента загрузчика данных в Витрину."""
70
+ import uploader_client
71
+ from django.core.cache import (
72
+ DEFAULT_CACHE_ALIAS,
73
+ caches,
74
+ )
75
+ from uploader_client.contrib.rdm.interfaces.configurations import (
76
+ RegionalDataMartEmulationUploaderConfig,
77
+ RegionalDataMartUploaderConfig,
78
+ )
79
+
80
+ if settings.RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION:
81
+ uploader_client.set_config(
82
+ RegionalDataMartEmulationUploaderConfig(
83
+ interface='uploader_client.contrib.rdm.interfaces.rest.OpenAPIInterfaceEmulation',
84
+ url=settings.RDM_UPLOADER_CLIENT_URL,
85
+ datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
86
+ timeout=1,
87
+ request_retries=1,
88
+ file_status=settings.RDM_RESPONSE_FILE_STATUS,
89
+ )
90
+ )
91
+ elif settings.RDM_UPLOADER_CLIENT_USE_PROXY_API:
92
+ uploader_client.set_config(
93
+ RegionalDataMartUploaderConfig(
94
+ interface='uploader_client.contrib.rdm.interfaces.rest.ProxyAPIInterface',
95
+ cache=caches[DEFAULT_CACHE_ALIAS],
96
+ url=settings.RDM_UPLOADER_CLIENT_URL,
97
+ datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
98
+ timeout=settings.RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT,
99
+ request_retries=settings.RDM_UPLOADER_CLIENT_REQUEST_RETRIES,
100
+ organization_ogrn=settings.RDM_UPLOADER_CLIENT_ORGANIZATION_OGRN,
101
+ installation_name=settings.RDM_UPLOADER_CLIENT_INSTALLATION_NAME,
102
+ installation_id=settings.RDM_UPLOADER_CLIENT_INSTALLATION_ID,
103
+ username=settings.RDM_UPLOADER_CLIENT_USERNAME,
104
+ password=settings.RDM_UPLOADER_CLIENT_PASSWORD,
105
+ )
106
+ )
107
+ else:
108
+ uploader_client.set_config(
109
+ RegionalDataMartUploaderConfig(
110
+ url=settings.RDM_UPLOADER_CLIENT_URL,
111
+ datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
112
+ timeout=settings.RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT,
113
+ request_retries=settings.RDM_UPLOADER_CLIENT_REQUEST_RETRIES,
114
+ )
115
+ )
116
+
117
+ def update_total_queue_size_in_cache(self, received_files_size: int):
118
+ """Обновление размера файлов в кеш."""
119
+ with self.data_cache.lock(f'{TOTAL_ATTACHMENTS_SIZE_KEY}:lock', timeout=300):
120
+ queue_total_file_size = self.data_cache.get(TOTAL_ATTACHMENTS_SIZE_KEY) or 0
121
+ if queue_total_file_size:
122
+ queue_total_file_size -= received_files_size
123
+ if queue_total_file_size > 0:
124
+ self.data_cache.set(
125
+ TOTAL_ATTACHMENTS_SIZE_KEY,
126
+ queue_total_file_size,
127
+ timeout=settings.RDM_REDIS_CACHE_TIMEOUT_SECONDS,
128
+ )
129
+
130
+ def upload_data(self, *args, **kwargs):
131
+ """Запускает отправку данных в витрину."""
132
+ try:
133
+ exporter = ExportQueueSender(self.data_cache, self.queue, settings.RDM_UPLOAD_DATA_TASK_EXPORT_STAGES)
134
+ exporter.run()
135
+
136
+ self.result['queue_is_full'] = exporter.queue_is_full
137
+ self.result['total_file_size'] = exporter.queue_total_file_size
138
+
139
+ # Если очередь не переполнена - то отправляем данные в витрину
140
+ if not exporter.queue_is_full:
141
+ sender = WorkerSender(self.queue)
142
+ sender.run()
143
+
144
+ if sender.entities:
145
+ self.result['uploaded_entities'] = ','.join(sender.entities)
146
+
147
+ if sender.received_file_size:
148
+ self.update_total_queue_size_in_cache(sender.received_file_size)
149
+
150
+ except Exception as err:
151
+ logger.exception(err)
152
+ raise err
153
+ finally:
154
+ self._remove_file_handler()
155
+
156
+ return self.result
@@ -15,20 +15,21 @@ from redis import (
15
15
  Redis,
16
16
  )
17
17
 
18
- from edu_rdm_integration.export_data.consts import (
18
+ from edu_rdm_integration.core.helpers import (
19
+ as_text,
20
+ get_redis_version,
21
+ )
22
+ from edu_rdm_integration.stages.export_data.consts import (
19
23
  REDIS_QUEUE_KEY_DELIMITER,
20
24
  )
21
- from edu_rdm_integration.export_data.dataclasses import (
25
+ from edu_rdm_integration.stages.upload_data.dataclasses import (
22
26
  UploadFile,
23
27
  )
24
- from edu_rdm_integration.redis_cache import (
25
- as_text,
26
- get_redis_version,
27
- )
28
28
 
29
29
 
30
30
  class Queue(ABC):
31
31
  """Интерфейс очереди."""
32
+
32
33
  queue_key: str = ''
33
34
 
34
35
  @property
@@ -65,6 +66,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
65
66
  (Sorted Set in Redis)
66
67
  - Информация по файлам стандартно по ключу - ключом выступает sub_stage_id
67
68
  """
69
+
68
70
  queue_key = 'rdm:export_sub_stage_ids_queue'
69
71
  prefix = 'rdm:'
70
72
 
@@ -76,7 +78,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
76
78
  host=settings.RDM_REDIS_HOST,
77
79
  port=settings.RDM_REDIS_PORT,
78
80
  db=settings.RDM_REDIS_DB,
79
- password=settings.RDM_REDIS_PASSWORD
81
+ password=settings.RDM_REDIS_PASSWORD,
80
82
  )
81
83
 
82
84
  def _make_key(self, key: Union[int, str]) -> str:
@@ -143,7 +145,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
143
145
  while true do
144
146
  local stage = redis.call("zpopmin", q)
145
147
  local stage_id = stage[2]
146
-
148
+
147
149
  if stage_id == nil then
148
150
  break
149
151
  end
@@ -0,0 +1,103 @@
1
+ import celery
2
+ from celery.schedules import (
3
+ crontab,
4
+ )
5
+ from django.conf import (
6
+ settings,
7
+ )
8
+ from django.core.cache import (
9
+ cache,
10
+ )
11
+
12
+ from educommon.async_task.models import (
13
+ AsyncTaskType,
14
+ )
15
+ from educommon.async_task.tasks import (
16
+ UniquePeriodicAsyncTask,
17
+ )
18
+
19
+ from edu_rdm_integration.core.consts import (
20
+ TASK_QUEUE_NAME,
21
+ )
22
+ from edu_rdm_integration.stages.upload_data.enums import (
23
+ FileUploadStatusEnum,
24
+ )
25
+ from edu_rdm_integration.stages.upload_data.helpers import (
26
+ UploadStatusHelper,
27
+ )
28
+ from edu_rdm_integration.stages.upload_data.models import (
29
+ ExportingDataSubStageUploaderClientLog,
30
+ )
31
+ from edu_rdm_integration.stages.upload_data.operations import (
32
+ UploadData,
33
+ )
34
+ from edu_rdm_integration.stages.upload_data.queues import (
35
+ RdmRedisSubStageAttachmentQueue,
36
+ )
37
+
38
+
39
+ class RDMCheckUploadStatus(UniquePeriodicAsyncTask):
40
+ """Периодическая задача для сбора статусов по загрузке файла в витрину."""
41
+
42
+ queue = TASK_QUEUE_NAME
43
+ routing_key = TASK_QUEUE_NAME
44
+ description = 'Сбор статусов загрузки данных в витрину "Региональная витрина данных"'
45
+ lock_expire_seconds = settings.RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS
46
+ task_type = AsyncTaskType.UNKNOWN
47
+ run_every = crontab(
48
+ minute=settings.RDM_UPLOAD_STATUS_TASK_MINUTE,
49
+ hour=settings.RDM_UPLOAD_STATUS_TASK_HOUR,
50
+ day_of_week=settings.RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK,
51
+ )
52
+
53
+ def process(self, *args, **kwargs):
54
+ """Выполнение."""
55
+ super().process(*args, **kwargs)
56
+
57
+ # Получаем незавершенные загрузки данных в витрину
58
+ in_progress_uploads = ExportingDataSubStageUploaderClientLog.objects.filter(
59
+ file_upload_status=FileUploadStatusEnum.IN_PROGRESS,
60
+ is_emulation=False,
61
+ ).select_related('attachment')
62
+
63
+ UploadStatusHelper(in_progress_uploads, cache).run()
64
+
65
+
66
+ class UploadDataAsyncTask(UniquePeriodicAsyncTask):
67
+ """Формирование очереди файлов и их отправка."""
68
+
69
+ queue = TASK_QUEUE_NAME
70
+ routing_key = TASK_QUEUE_NAME
71
+ description = 'Отправка данных в витрину "Региональная витрина данных"'
72
+ lock_expire_seconds = settings.RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS
73
+ task_type = AsyncTaskType.SYSTEM
74
+ run_every = crontab(
75
+ minute=settings.RDM_UPLOAD_DATA_TASK_MINUTE,
76
+ hour=settings.RDM_UPLOAD_DATA_TASK_HOUR,
77
+ day_of_week=settings.RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK,
78
+ )
79
+
80
+ def process(self, *args, **kwargs):
81
+ """Выполнение."""
82
+ super().process(*args, **kwargs)
83
+
84
+ queue = RdmRedisSubStageAttachmentQueue()
85
+ upload_data = UploadData(
86
+ data_cache=cache,
87
+ queue=queue,
88
+ )
89
+
90
+ upload_result = upload_data.upload_data()
91
+
92
+ task_result = {
93
+ 'Общий объем отправленных файлов': f'{upload_result["total_file_size"]}',
94
+ 'Очередь отправки переполнена': 'Да' if upload_result['queue_is_full'] else 'Нет',
95
+ 'Сущности, отправленные в витрину': upload_result['uploaded_entities'],
96
+ }
97
+
98
+ self.set_progress(values=task_result)
99
+
100
+
101
+ celery_app = celery.app.app_or_default()
102
+ celery_app.register_task(RDMCheckUploadStatus)
103
+ celery_app.register_task(UploadDataAsyncTask)