edu-rdm-integration 3.9.1__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} +30 -192
  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.1.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.1.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.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/WHEEL +0 -0
  278. {edu_rdm_integration-3.9.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/licenses/LICENSE +0 -0
  279. {edu_rdm_integration-3.9.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,362 @@
1
+ import uuid
2
+ from datetime import (
3
+ datetime,
4
+ )
5
+
6
+ from django.db.models import (
7
+ CASCADE,
8
+ PROTECT,
9
+ SET_NULL,
10
+ DateTimeField,
11
+ FileField,
12
+ ForeignKey,
13
+ PositiveIntegerField,
14
+ PositiveSmallIntegerField,
15
+ SmallIntegerField,
16
+ UUIDField,
17
+ )
18
+ from django.utils import (
19
+ timezone,
20
+ )
21
+ from m3.db import (
22
+ BaseObjectModel,
23
+ )
24
+
25
+ from educommon.django.db.mixins import (
26
+ ReprStrPreModelMixin,
27
+ )
28
+ from educommon.integration_entities.enums import (
29
+ EntityLogOperation,
30
+ )
31
+ from function_tools.models import (
32
+ Entity,
33
+ )
34
+ from m3_db_utils.models import (
35
+ ModelEnumValue,
36
+ TitledModelEnum,
37
+ )
38
+
39
+ from edu_rdm_integration.core.enums import (
40
+ CommandType,
41
+ )
42
+ from edu_rdm_integration.core.utils import (
43
+ get_data_command_progress_attachment_path,
44
+ )
45
+ from edu_rdm_integration.rdm_entities.models import (
46
+ RegionalDataMartEntityEnum,
47
+ )
48
+ from edu_rdm_integration.stages.export_data.helpers import (
49
+ get_exporting_data_stage_attachment_path,
50
+ )
51
+
52
+
53
+ class ExportingDataStageStatus(TitledModelEnum):
54
+ """Статус этапа выгрузки данных."""
55
+
56
+ CREATED = ModelEnumValue(
57
+ title='Создан',
58
+ )
59
+
60
+ IN_PROGRESS = ModelEnumValue(
61
+ title='В процессе',
62
+ )
63
+
64
+ FAILED = ModelEnumValue(
65
+ title='Завершено с ошибками',
66
+ )
67
+
68
+ FINISHED = ModelEnumValue(
69
+ title='Завершено',
70
+ )
71
+
72
+ class Meta:
73
+ db_table = 'rdm_exporting_data_stage_status'
74
+ verbose_name = 'Модель-перечисление статусов этапа выгрузки данных'
75
+ verbose_name_plural = 'Модели-перечисления статусов этапов выгрузки данных'
76
+
77
+
78
+ class ExportingDataStage(ReprStrPreModelMixin, BaseObjectModel):
79
+ """Этап выгрузки данных."""
80
+
81
+ manager = ForeignKey(
82
+ to=Entity,
83
+ verbose_name='Менеджер ранера Функции',
84
+ on_delete=PROTECT,
85
+ null=True,
86
+ blank=True,
87
+ )
88
+
89
+ period_started_at = DateTimeField(
90
+ 'Левая граница периода выборки данных для выгрузки',
91
+ db_index=True,
92
+ )
93
+
94
+ period_ended_at = DateTimeField(
95
+ 'Правая граница периода выборки данных для выгрузки',
96
+ db_index=True,
97
+ )
98
+
99
+ started_at = DateTimeField(
100
+ 'Время начала выгрузки данных',
101
+ auto_now_add=True,
102
+ )
103
+
104
+ ended_at = DateTimeField(
105
+ 'Время завершения выгрузки данных',
106
+ null=True,
107
+ blank=True,
108
+ )
109
+
110
+ status = ForeignKey(
111
+ to=ExportingDataStageStatus,
112
+ verbose_name='Статус',
113
+ on_delete=PROTECT,
114
+ default=ExportingDataStageStatus.CREATED.key,
115
+ )
116
+
117
+ class Meta:
118
+ db_table = 'rdm_exporting_data_stage'
119
+ verbose_name = 'Этап формирования данных для выгрузки'
120
+ verbose_name_plural = 'Этапы формирования данных для выгрузки'
121
+
122
+ @property
123
+ def attrs_for_repr_str(self):
124
+ """Список атрибутов для отображения экземпляра модели."""
125
+ return ['manager_id', 'started_at', 'ended_at', 'status_id']
126
+
127
+ def save(self, *args, **kwargs):
128
+ """Сохранение этапа экспорта данных."""
129
+ if (
130
+ self.status_id in (ExportingDataStageStatus.FAILED.key, ExportingDataStageStatus.FINISHED.key)
131
+ and not self.ended_at
132
+ ):
133
+ self.ended_at = datetime.now()
134
+
135
+ super().save(*args, **kwargs)
136
+
137
+
138
+ class ExportingDataSubStageStatus(TitledModelEnum):
139
+ """Модель-перечисление статусов этапа выгрузки данных."""
140
+
141
+ CREATED = ModelEnumValue(
142
+ title='Создан',
143
+ )
144
+
145
+ IN_PROGRESS = ModelEnumValue(
146
+ title='Запущен',
147
+ )
148
+
149
+ FAILED = ModelEnumValue(
150
+ title='Завершено с ошибками',
151
+ )
152
+
153
+ FINISHED = ModelEnumValue(
154
+ title='Завершен',
155
+ )
156
+ READY_FOR_EXPORT = ModelEnumValue(
157
+ title='Готов к выгрузке',
158
+ )
159
+ PROCESS_ERROR = ModelEnumValue(title='Ошибка обработки витриной')
160
+
161
+ class Meta:
162
+ db_table = 'rdm_exporting_data_sub_stage_status'
163
+ verbose_name = 'Модель-перечисление статусов подэтапа выгрузки данных'
164
+ verbose_name_plural = 'Модели-перечисления статусов подэтапов выгрузки данных'
165
+
166
+
167
+ class ExportingDataSubStage(ReprStrPreModelMixin, BaseObjectModel):
168
+ """Подэтап выгрузки данных."""
169
+
170
+ function = ForeignKey(
171
+ to=Entity,
172
+ verbose_name='Функция',
173
+ on_delete=PROTECT,
174
+ null=True,
175
+ blank=True,
176
+ )
177
+
178
+ stage = ForeignKey(
179
+ to=ExportingDataStage,
180
+ verbose_name='Этап выгрузки данных',
181
+ on_delete=CASCADE,
182
+ )
183
+
184
+ started_at = DateTimeField(
185
+ verbose_name='Время начала сбора данных',
186
+ auto_now_add=True,
187
+ db_index=True,
188
+ )
189
+
190
+ ended_at = DateTimeField(
191
+ verbose_name='Время завершения сбора данных',
192
+ null=True,
193
+ blank=True,
194
+ db_index=True,
195
+ )
196
+
197
+ status = ForeignKey(
198
+ to=ExportingDataSubStageStatus,
199
+ verbose_name='Статус',
200
+ on_delete=PROTECT,
201
+ default=ExportingDataSubStageStatus.CREATED.key,
202
+ )
203
+
204
+ class Meta:
205
+ db_table = 'rdm_exporting_data_sub_stage'
206
+ verbose_name = 'Стадия выгрузки данных'
207
+ verbose_name_plural = 'Стадии выгрузки данных'
208
+
209
+ @property
210
+ def attrs_for_repr_str(self):
211
+ """Список атрибутов для отображения экземпляра модели."""
212
+ return ['function_id', 'collecting_data_sub_stage_id', 'stage_id', 'started_at', 'ended_at', 'status_id']
213
+
214
+ def save(self, *args, **kwargs):
215
+ """Сохранение экземпляра модели."""
216
+ if (
217
+ self.status_id
218
+ in {
219
+ ExportingDataSubStageStatus.FAILED.key,
220
+ ExportingDataSubStageStatus.FINISHED.key,
221
+ ExportingDataSubStageStatus.READY_FOR_EXPORT.key,
222
+ }
223
+ and not self.ended_at
224
+ ):
225
+ self.ended_at = datetime.now()
226
+
227
+ super().save(*args, **kwargs)
228
+
229
+
230
+ class ExportingDataSubStageAttachment(ReprStrPreModelMixin, BaseObjectModel):
231
+ """Сгенерированный файл для дальнейшей выгрузки в "Региональная витрина данных"."""
232
+
233
+ exporting_data_sub_stage = ForeignKey(
234
+ to=ExportingDataSubStage,
235
+ verbose_name='Подэтап выгрузки данных',
236
+ on_delete=CASCADE,
237
+ )
238
+
239
+ # TODO PYTD-22 В зависимости от принятого решения по инструменту ограничения доступа к media-файлам, нужно будет
240
+ # изменить тип поля или оставить как есть
241
+ attachment = FileField(
242
+ verbose_name='Сгенерированный файл',
243
+ upload_to=get_exporting_data_stage_attachment_path,
244
+ max_length=512,
245
+ null=True,
246
+ blank=True,
247
+ )
248
+
249
+ operation = SmallIntegerField(
250
+ verbose_name='Действие',
251
+ choices=EntityLogOperation.get_choices(),
252
+ )
253
+
254
+ created = DateTimeField(
255
+ verbose_name='Дата создания',
256
+ auto_now_add=True,
257
+ null=True,
258
+ blank=True,
259
+ )
260
+ modified = DateTimeField(
261
+ verbose_name='Дата изменения',
262
+ auto_now=True,
263
+ null=True,
264
+ blank=True,
265
+ )
266
+ attachment_size = PositiveIntegerField(null=True, verbose_name='Размер файла (байт)')
267
+
268
+ class Meta:
269
+ db_table = 'rdm_exporting_data_sub_stage_attachment'
270
+ verbose_name = 'Сгенерированный файл для дальнейшей выгрузки в "Региональная витрина данных"'
271
+ verbose_name_plural = 'Сгенерированные файлы для дальнейшей выгрузки в "Региональная витрина данных"'
272
+
273
+ @property
274
+ def attrs_for_repr_str(self):
275
+ """Список атрибутов для отображения экземпляра модели."""
276
+ return ['exporting_data_sub_stage_id', 'attachment', 'operation', 'created', 'modified']
277
+
278
+
279
+ class ExportingDataSubStageEntity(BaseObjectModel):
280
+ """Модель связи сущности и подэтапа выгрузки."""
281
+
282
+ entity = ForeignKey(
283
+ to=RegionalDataMartEntityEnum,
284
+ verbose_name='Сущность РВД',
285
+ on_delete=PROTECT,
286
+ )
287
+
288
+ exporting_data_sub_stage = ForeignKey(
289
+ to=ExportingDataSubStage,
290
+ verbose_name='Подэтап выгрузки данных',
291
+ on_delete=CASCADE,
292
+ )
293
+
294
+ class Meta:
295
+ db_table = 'rdm_exporting_data_sub_stage_entity'
296
+ verbose_name = 'Связь сущности и подэтапа выгрузки'
297
+ verbose_name_plural = 'Связи сущности и подэтапа выгрузки'
298
+
299
+
300
+ class AbstractExportDataCommandProgress(ReprStrPreModelMixin, BaseObjectModel):
301
+ """Команда экспорта данных."""
302
+
303
+ task = ...
304
+
305
+ logs_link = ...
306
+
307
+ stage = ForeignKey(
308
+ to='edu_rdm_integration_export_data_stage.ExportingDataStage',
309
+ verbose_name='Этап выгрузки данных',
310
+ null=True,
311
+ blank=True,
312
+ on_delete=SET_NULL,
313
+ )
314
+ entity = ForeignKey(
315
+ to=RegionalDataMartEntityEnum,
316
+ verbose_name='Сущность РВД',
317
+ on_delete=PROTECT,
318
+ )
319
+ created = DateTimeField(
320
+ verbose_name='Дата создания',
321
+ default=timezone.now,
322
+ )
323
+ period_started_at = DateTimeField(
324
+ 'Левая граница периода выборки данных для выгрузки',
325
+ )
326
+ period_ended_at = DateTimeField(
327
+ 'Правая граница периода выборки данных для выгрузки',
328
+ )
329
+ generation_id = UUIDField(
330
+ 'Идентификатор генерации',
331
+ default=uuid.uuid4,
332
+ )
333
+
334
+ class Meta:
335
+ abstract = True
336
+ db_table = 'rdm_exporting_data_command_progress'
337
+ verbose_name = 'Команда экспорта данных'
338
+ verbose_name_plural = 'Команды экспорта данных'
339
+
340
+
341
+ class EduRdmExportDataCommandProgress(AbstractExportDataCommandProgress):
342
+ """Команда экспорта данных."""
343
+
344
+ task = ForeignKey(
345
+ to='async_task.RunningTask',
346
+ verbose_name='Асинхронная задача',
347
+ null=True,
348
+ blank=True,
349
+ on_delete=SET_NULL,
350
+ )
351
+ logs_link = FileField(
352
+ upload_to=get_data_command_progress_attachment_path,
353
+ max_length=255,
354
+ verbose_name='Файл лога',
355
+ )
356
+ type = PositiveSmallIntegerField( # noqa: A003
357
+ verbose_name='Тип команды',
358
+ choices=CommandType.get_choices(),
359
+ )
360
+
361
+ class Meta(AbstractExportDataCommandProgress.Meta):
362
+ db_table = 'edu_rdm_exporting_data_command_progress'
@@ -1,4 +1,3 @@
1
- import logging
2
1
  import os
3
2
  from collections import (
4
3
  defaultdict,
@@ -12,7 +11,6 @@ from datetime import (
12
11
  from typing import (
13
12
  TYPE_CHECKING,
14
13
  Iterable,
15
- Union,
16
14
  )
17
15
 
18
16
  from django.conf import (
@@ -28,6 +26,7 @@ from django.db.models.base import (
28
26
  )
29
27
  from django.db.models.functions import (
30
28
  Concat,
29
+ Substr,
31
30
  )
32
31
  from django.db.transaction import (
33
32
  atomic,
@@ -58,38 +57,27 @@ from m3_db_utils.models import (
58
57
  ModelEnumValue,
59
58
  )
60
59
 
61
- from edu_rdm_integration.base import (
62
- BaseOperationData,
63
- )
64
- from edu_rdm_integration.consts import (
60
+ from edu_rdm_integration.core.consts import (
65
61
  REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
66
62
  )
67
- from edu_rdm_integration.export_data.consts import (
68
- TOTAL_ATTACHMENTS_SIZE_KEY,
63
+ from edu_rdm_integration.core.operations import (
64
+ BaseOperationData,
69
65
  )
70
- from edu_rdm_integration.export_data.export_manager import (
71
- ExportQueueSender,
72
- WorkerSender,
66
+ from edu_rdm_integration.core.signals import (
67
+ manager_created,
73
68
  )
74
- from edu_rdm_integration.export_data.queue import (
75
- Queue,
69
+ from edu_rdm_integration.core.storages import (
70
+ RegionalDataMartEntityStorage,
71
+ )
72
+ from edu_rdm_integration.rdm_entities.models import (
73
+ RegionalDataMartEntityEnum,
76
74
  )
77
- from edu_rdm_integration.helpers import (
75
+ from edu_rdm_integration.stages.export_data.helpers import (
78
76
  get_exporting_managers_max_period_ended_dates,
79
77
  )
80
- from edu_rdm_integration.models import (
78
+ from edu_rdm_integration.stages.export_data.models import (
81
79
  ExportingDataStage,
82
80
  ExportingDataSubStageStatus,
83
- RegionalDataMartEntityEnum,
84
- )
85
- from edu_rdm_integration.redis_cache import (
86
- AbstractCache,
87
- )
88
- from edu_rdm_integration.signals import (
89
- manager_created,
90
- )
91
- from edu_rdm_integration.storages import (
92
- RegionalDataMartEntityStorage,
93
81
  )
94
82
 
95
83
 
@@ -131,9 +119,7 @@ class BaseExportEntitiesData(BaseOperationData):
131
119
 
132
120
  @property
133
121
  def _log_file_path(self) -> str:
134
- """
135
- Путь до лог файла.
136
- """
122
+ """Путь до лог файла."""
137
123
  return os.path.join(settings.MEDIA_ROOT, settings.RDM_EXPORT_LOG_DIR, f'{self.command_id}.log')
138
124
 
139
125
  def _has_stage_created_or_in_progress(self, manager_id: str, entity: str) -> bool:
@@ -149,14 +135,10 @@ class BaseExportEntitiesData(BaseOperationData):
149
135
  return stage_created_or_in_progress
150
136
 
151
137
  def _fill_manager_entities_map(self, entity_storage: RegionalDataMartEntityStorage) -> None:
152
- """
153
- Заполнение словаря данных с классами менеджеров и их сущностями.
154
- """
138
+ """Заполнение словаря данных с классами менеджеров и их сущностями."""
155
139
 
156
140
  def _find_exporting_entities_data_managers(self):
157
- """
158
- Поиск менеджеров Функций выгрузки данных по сущностям РВД.
159
- """
141
+ """Поиск менеджеров Функций выгрузки данных по сущностям РВД."""
160
142
  logger.info('find exporting entities data manager..')
161
143
 
162
144
  entity_storage = RegionalDataMartEntityStorage()
@@ -179,9 +161,7 @@ class BaseExportEntitiesData(BaseOperationData):
179
161
  logger.info('finding exporting entities data manager finished.')
180
162
 
181
163
  def _export_entities_data(self, *args, **kwargs):
182
- """
183
- Выгрузка данных по указанным сущностям.
184
- """
164
+ """Выгрузка данных по указанным сущностям."""
185
165
  logger.info('start exporting entities data..')
186
166
 
187
167
  kwargs['period_started_at'] = self.period_started_at
@@ -201,9 +181,7 @@ class BaseExportEntitiesData(BaseOperationData):
201
181
  logger.info('exporting entities data finished.')
202
182
 
203
183
  def _export(self, *args, **kwargs):
204
- """
205
- Выполнение действий команды.
206
- """
184
+ """Выполнение действий команды."""
207
185
  logger.info(f'start exporting data of entities - {", ".join([entity.key for entity in self.entities])}..')
208
186
 
209
187
  self._find_exporting_entities_data_managers()
@@ -212,9 +190,7 @@ class BaseExportEntitiesData(BaseOperationData):
212
190
  logger.info('exporting entities data finished.')
213
191
 
214
192
  def export(self, *args, **kwargs):
215
- """
216
- Запускает экспорт данных.
217
- """
193
+ """Запускает экспорт данных."""
218
194
  try:
219
195
  self._export(*args, **kwargs)
220
196
  except Exception as err:
@@ -254,19 +230,18 @@ class BaseExportLatestEntitiesData(BaseExportEntitiesData):
254
230
  def _set_description_to_async_task(self, exported_entities: Iterable[str]) -> None:
255
231
  """Добавляет в описание асинхронной задачи список выгруженных сущностей."""
256
232
  if exported_entities and self.task_id:
257
- self.async_task.objects.filter(
258
- pk=self.task_id,
259
- ).update(
260
- description=Concat(
261
- 'description',
262
- Value(f': {", ".join(exported_entities)}')
263
- ),
233
+ entities_str = ', '.join(exported_entities)
234
+
235
+ self.async_task.objects.filter(pk=self.task_id).update(
236
+ description=Substr(
237
+ Concat('description', Value(f': {entities_str}')),
238
+ 1,
239
+ self.async_task._meta.get_field('description').max_length,
240
+ )
264
241
  )
265
242
 
266
243
  def _fill_manager_entities_map(self, entity_storage: RegionalDataMartEntityStorage) -> None:
267
- """
268
- Заполнение словаря данных с классами менеджеров и их сущностями.
269
- """
244
+ """Заполнение словаря данных с классами менеджеров и их сущностями."""
270
245
  self._manager_entities_map = entity_storage.prepare_manager_entities_map(
271
246
  tags={REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA},
272
247
  )
@@ -300,7 +275,6 @@ class BaseExportLatestEntitiesData(BaseExportEntitiesData):
300
275
  not_exported_model_ids = queryset.values_list('id', flat=True).iterator()
301
276
 
302
277
  with atomic():
303
-
304
278
  for model_ids in make_chunks(
305
279
  iterable=not_exported_model_ids,
306
280
  size=settings.RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE,
@@ -308,17 +282,13 @@ class BaseExportLatestEntitiesData(BaseExportEntitiesData):
308
282
  queryset.filter(id__in=model_ids).update(modified=now)
309
283
 
310
284
  def _export_entities_data(self, *args, **kwargs) -> None:
311
- """
312
- Запуск Функций по для экспорта данных.
313
- """
285
+ """Запуск Функций по для экспорта данных."""
314
286
  logger.info('export entities data..')
315
287
 
316
288
  # Массив с выгружаемыми сущностями для поля "Описание" в асинхронной задаче
317
289
  exported_entities = []
318
290
 
319
- managers_max_period_ended = get_exporting_managers_max_period_ended_dates(
320
- self._exporting_data_managers
321
- )
291
+ managers_max_period_ended = get_exporting_managers_max_period_ended_dates(self._exporting_data_managers)
322
292
 
323
293
  for manager_class in self._exporting_data_managers:
324
294
  manager_last_exported = managers_max_period_ended.get(manager_class.uuid)
@@ -361,135 +331,3 @@ class ExportLatestEntitiesData(BaseExportLatestEntitiesData):
361
331
  def _get_async_task(self) -> Model:
362
332
  """Возвращает модель асинхронной задачи."""
363
333
  return RunningTask
364
-
365
-
366
- class UploadData(BaseOperationData):
367
- """Класс отправки файлов в витрину."""
368
-
369
- def __init__(
370
- self,
371
- data_cache: AbstractCache,
372
- queue: Queue,
373
- **kwargs,
374
- ):
375
- super().__init__(**kwargs)
376
-
377
- self.data_cache = data_cache
378
- self.queue = queue
379
-
380
- self._configure_agent_client()
381
- self.result = {
382
- 'total_file_size': 0, # Общий размер отправленных файлов
383
- 'queue_is_full': False, # Признак переполнения очереди
384
- 'uploaded_entities': '' # Список сущностей, попавших в выгрузку
385
- }
386
-
387
- @property
388
- def _log_file_path(self) -> Union[str, bytes]:
389
- """
390
- Путь до лог файла.
391
- """
392
- return os.path.join(settings.MEDIA_ROOT, settings.RDM_UPLOAD_LOG_DIR, 'upload_entity.log')
393
-
394
- def _add_file_handler(self) -> None:
395
- """Добавляет обработчик логов."""
396
-
397
- self._file_handler = logging.FileHandler(self._log_file_path)
398
-
399
- logging.getLogger('info_logger').addHandler(self._file_handler)
400
- logging.getLogger('exception_logger').addHandler(self._file_handler)
401
-
402
- # TODO https://jira.bars.group/browse/EDUSCHL-22492. Вынужденная мера, т.к. при запуске команды не производится
403
- # проверка готовности конфигов приложений. Нужно переработать механизм конфигурирования клиента загрузчика.
404
- def _configure_agent_client(self):
405
- """
406
- Конфигурирование клиента загрузчика данных в Витрину.
407
- """
408
- import uploader_client
409
- from django.core.cache import (
410
- DEFAULT_CACHE_ALIAS,
411
- caches,
412
- )
413
- from uploader_client.contrib.rdm.interfaces.configurations import (
414
- RegionalDataMartEmulationUploaderConfig,
415
- RegionalDataMartUploaderConfig,
416
- )
417
- if settings.RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION:
418
- uploader_client.set_config(
419
- RegionalDataMartEmulationUploaderConfig(
420
- interface='uploader_client.contrib.rdm.interfaces.rest.OpenAPIInterfaceEmulation',
421
- url=settings.RDM_UPLOADER_CLIENT_URL,
422
- datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
423
- timeout=1,
424
- request_retries=1,
425
- file_status=settings.RDM_RESPONSE_FILE_STATUS
426
- )
427
- )
428
- elif settings.RDM_UPLOADER_CLIENT_USE_PROXY_API:
429
- uploader_client.set_config(
430
- RegionalDataMartUploaderConfig(
431
- interface='uploader_client.contrib.rdm.interfaces.rest.ProxyAPIInterface',
432
- cache=caches[DEFAULT_CACHE_ALIAS],
433
- url=settings.RDM_UPLOADER_CLIENT_URL,
434
- datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
435
- timeout=settings.RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT,
436
- request_retries=settings.RDM_UPLOADER_CLIENT_REQUEST_RETRIES,
437
- organization_ogrn=settings.RDM_UPLOADER_CLIENT_ORGANIZATION_OGRN,
438
- installation_name=settings.RDM_UPLOADER_CLIENT_INSTALLATION_NAME,
439
- installation_id=settings.RDM_UPLOADER_CLIENT_INSTALLATION_ID,
440
- username=settings.RDM_UPLOADER_CLIENT_USERNAME,
441
- password=settings.RDM_UPLOADER_CLIENT_PASSWORD,
442
- )
443
- )
444
- else:
445
- uploader_client.set_config(
446
- RegionalDataMartUploaderConfig(
447
- url=settings.RDM_UPLOADER_CLIENT_URL,
448
- datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
449
- timeout=settings.RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT,
450
- request_retries=settings.RDM_UPLOADER_CLIENT_REQUEST_RETRIES,
451
- )
452
- )
453
-
454
- def update_total_queue_size_in_cache(self, received_files_size: int):
455
- """Обновление размера файлов в кеш."""
456
- with self.data_cache.lock(f'{TOTAL_ATTACHMENTS_SIZE_KEY}:lock', timeout=300):
457
- queue_total_file_size = self.data_cache.get(TOTAL_ATTACHMENTS_SIZE_KEY) or 0
458
- if queue_total_file_size:
459
- queue_total_file_size -= received_files_size
460
- if queue_total_file_size > 0:
461
- self.data_cache.set(
462
- TOTAL_ATTACHMENTS_SIZE_KEY,
463
- queue_total_file_size,
464
- timeout=settings.RDM_REDIS_CACHE_TIMEOUT_SECONDS
465
- )
466
-
467
- def upload_data(self, *args, **kwargs):
468
- """
469
- Запускает отправку данных в витрину.
470
- """
471
- try:
472
- exporter = ExportQueueSender(self.data_cache, self.queue, settings.RDM_UPLOAD_DATA_TASK_EXPORT_STAGES)
473
- exporter.run()
474
-
475
- self.result['queue_is_full'] = exporter.queue_is_full
476
- self.result['total_file_size'] = exporter.queue_total_file_size
477
-
478
- # Если очередь не переполнена - то отправляем данные в витрину
479
- if not exporter.queue_is_full:
480
- sender = WorkerSender(self.queue)
481
- sender.run()
482
-
483
- if sender.entities:
484
- self.result['uploaded_entities'] = ','.join(sender.entities)
485
-
486
- if sender.received_file_size:
487
- self.update_total_queue_size_in_cache(sender.received_file_size)
488
-
489
- except Exception as err:
490
- logger.exception(err)
491
- raise err
492
- finally:
493
- self._remove_file_handler()
494
-
495
- return self.result