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,187 @@
1
+ # Generated by Django 3.2.24 on 2025-06-28 14:07
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 educommon.utils.date
11
+
12
+
13
+ class Migration(migrations.Migration):
14
+ initial = True
15
+
16
+ dependencies = [
17
+ ('function_tools', '0005_auto_20220724_0050'),
18
+ ('edu_rdm_integration', '0017_delete_uploaddatacommand'),
19
+ ]
20
+
21
+ operations = [
22
+ migrations.SeparateDatabaseAndState(
23
+ state_operations=[
24
+ migrations.CreateModel(
25
+ name='CollectingDataStageStatus',
26
+ fields=[
27
+ ('title', models.TextField(verbose_name='расшифровка значения')),
28
+ (
29
+ 'key',
30
+ models.CharField(
31
+ db_index=True, max_length=512, primary_key=True, serialize=False, verbose_name='ключ'
32
+ ),
33
+ ),
34
+ ('order_number', models.PositiveIntegerField(default=100000, verbose_name='Порядковый номер')),
35
+ ],
36
+ options={
37
+ 'verbose_name': 'Модель-перечисление статусов этапа сбора данных',
38
+ 'verbose_name_plural': 'Модели-перечисления статусов этапов сбора данных',
39
+ 'db_table': 'rdm_collecting_data_stage_status',
40
+ },
41
+ ),
42
+ migrations.CreateModel(
43
+ name='CollectingDataSubStageStatus',
44
+ fields=[
45
+ ('title', models.TextField(verbose_name='расшифровка значения')),
46
+ (
47
+ 'key',
48
+ models.CharField(
49
+ db_index=True, max_length=512, primary_key=True, serialize=False, verbose_name='ключ'
50
+ ),
51
+ ),
52
+ ('order_number', models.PositiveIntegerField(default=100000, verbose_name='Порядковый номер')),
53
+ ],
54
+ options={
55
+ 'verbose_name': 'Модель-перечисление статусов подэтапа сбора данных',
56
+ 'verbose_name_plural': 'Модели-перечисления статусов подэтапов сбора данных',
57
+ 'db_table': 'rdm_collecting_data_sub_stage_status',
58
+ },
59
+ ),
60
+ migrations.CreateModel(
61
+ name='CollectingExportedDataStage',
62
+ fields=[
63
+ (
64
+ 'id',
65
+ models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
66
+ ),
67
+ (
68
+ 'logs_period_started_at',
69
+ models.DateTimeField(
70
+ db_index=True,
71
+ default=educommon.utils.date.get_today_min_datetime,
72
+ verbose_name='Левая граница периода обрабатываемых логов',
73
+ ),
74
+ ),
75
+ (
76
+ 'logs_period_ended_at',
77
+ models.DateTimeField(
78
+ db_index=True,
79
+ default=educommon.utils.date.get_today_max_datetime,
80
+ verbose_name='Правая граница периода обрабатываемых логов',
81
+ ),
82
+ ),
83
+ (
84
+ 'started_at',
85
+ models.DateTimeField(
86
+ auto_now_add=True, db_index=True, verbose_name='Время начала сбора данных'
87
+ ),
88
+ ),
89
+ (
90
+ 'ended_at',
91
+ models.DateTimeField(
92
+ blank=True, db_index=True, null=True, verbose_name='Время завершения сбора данных'
93
+ ),
94
+ ),
95
+ (
96
+ 'manager',
97
+ models.ForeignKey(
98
+ blank=True,
99
+ null=True,
100
+ on_delete=django.db.models.deletion.PROTECT,
101
+ to='function_tools.entity',
102
+ verbose_name='Менеджер ранера Функции',
103
+ ),
104
+ ),
105
+ (
106
+ 'status',
107
+ models.ForeignKey(
108
+ default='CREATED',
109
+ on_delete=django.db.models.deletion.PROTECT,
110
+ to='edu_rdm_integration_collect_data_stage.collectingdatastagestatus',
111
+ verbose_name='Статус',
112
+ ),
113
+ ),
114
+ ],
115
+ options={
116
+ 'verbose_name': 'Этап формирования данных для выгрузки',
117
+ 'verbose_name_plural': 'Этапы формирования данных для выгрузки',
118
+ 'db_table': 'rdm_collecting_exported_data_stage',
119
+ },
120
+ bases=(educommon.django.db.mixins.ReprStrPreModelMixin, models.Model),
121
+ ),
122
+ migrations.CreateModel(
123
+ name='CollectingExportedDataSubStage',
124
+ fields=[
125
+ (
126
+ 'id',
127
+ models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
128
+ ),
129
+ (
130
+ 'started_at',
131
+ models.DateTimeField(
132
+ auto_now_add=True, db_index=True, verbose_name='Время начала сбора данных'
133
+ ),
134
+ ),
135
+ (
136
+ 'ended_at',
137
+ models.DateTimeField(
138
+ blank=True, db_index=True, null=True, verbose_name='Время завершения сбора данных'
139
+ ),
140
+ ),
141
+ (
142
+ 'function',
143
+ models.ForeignKey(
144
+ on_delete=django.db.models.deletion.PROTECT,
145
+ to='function_tools.entity',
146
+ verbose_name='Функция',
147
+ ),
148
+ ),
149
+ (
150
+ 'previous',
151
+ models.ForeignKey(
152
+ blank=True,
153
+ null=True,
154
+ on_delete=django.db.models.deletion.CASCADE,
155
+ to='edu_rdm_integration_collect_data_stage.collectingexporteddatasubstage',
156
+ verbose_name='Предыдущий сбор данных',
157
+ ),
158
+ ),
159
+ (
160
+ 'stage',
161
+ models.ForeignKey(
162
+ on_delete=django.db.models.deletion.PROTECT,
163
+ to='edu_rdm_integration_collect_data_stage.collectingexporteddatastage',
164
+ verbose_name='Этап подготовки данных для экспорта',
165
+ ),
166
+ ),
167
+ (
168
+ 'status',
169
+ models.ForeignKey(
170
+ default='CREATED',
171
+ on_delete=django.db.models.deletion.PROTECT,
172
+ to='edu_rdm_integration_collect_data_stage.collectingdatasubstagestatus',
173
+ verbose_name='Статус',
174
+ ),
175
+ ),
176
+ ],
177
+ options={
178
+ 'verbose_name': 'Подэтап формирования данных для выгрузки',
179
+ 'verbose_name_plural': 'Подэтапы формирования данных для выгрузки',
180
+ 'db_table': 'rdm_collecting_exported_data_sub_stage',
181
+ },
182
+ bases=(educommon.django.db.mixins.ReprStrPreModelMixin, models.Model),
183
+ ),
184
+ ],
185
+ database_operations=[],
186
+ ),
187
+ ]
@@ -0,0 +1,105 @@
1
+ # Generated by Django 3.2.24 on 2025-06-28 14:09
2
+
3
+ import uuid
4
+
5
+ import django.db.models.deletion
6
+ import django.utils.timezone
7
+ from django.db import (
8
+ migrations,
9
+ models,
10
+ )
11
+
12
+ import educommon.django.db.mixins
13
+
14
+ import edu_rdm_integration.core.utils
15
+
16
+
17
+ class Migration(migrations.Migration):
18
+ dependencies = [
19
+ ('edu_rdm_integration_models', '0001_initial'),
20
+ ('async_task', '0003_alter_runningtask_options'),
21
+ ('edu_rdm_integration_collect_data_stage', '0001_initial'),
22
+ ]
23
+
24
+ operations = [
25
+ migrations.SeparateDatabaseAndState(
26
+ state_operations=[
27
+ migrations.CreateModel(
28
+ name='EduRdmCollectDataCommandProgress',
29
+ fields=[
30
+ (
31
+ 'id',
32
+ models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
33
+ ),
34
+ (
35
+ 'created',
36
+ models.DateTimeField(default=django.utils.timezone.now, verbose_name='Дата создания'),
37
+ ),
38
+ (
39
+ 'logs_period_started_at',
40
+ models.DateTimeField(verbose_name='Левая граница периода обрабатываемых логов'),
41
+ ),
42
+ (
43
+ 'logs_period_ended_at',
44
+ models.DateTimeField(verbose_name='Правая граница периода обрабатываемых логов'),
45
+ ),
46
+ ('generation_id', models.UUIDField(default=uuid.uuid4, verbose_name='Идентификатор генерации')),
47
+ (
48
+ 'institute_ids',
49
+ models.JSONField(blank=True, default=list, null=True, verbose_name='id учебного заведения'),
50
+ ),
51
+ (
52
+ 'logs_link',
53
+ models.FileField(
54
+ max_length=255,
55
+ upload_to=edu_rdm_integration.core.utils.get_data_command_progress_attachment_path,
56
+ verbose_name='Ссылка на файл логов',
57
+ ),
58
+ ),
59
+ (
60
+ 'type',
61
+ models.PositiveSmallIntegerField(
62
+ choices=[(1, 'Автоматический'), (2, 'Ручной')], verbose_name='Тип команды'
63
+ ),
64
+ ),
65
+ (
66
+ 'model',
67
+ models.ForeignKey(
68
+ on_delete=django.db.models.deletion.PROTECT,
69
+ to='edu_rdm_integration_models.regionaldatamartmodelenum',
70
+ verbose_name='Модель РВД',
71
+ ),
72
+ ),
73
+ (
74
+ 'stage',
75
+ models.ForeignKey(
76
+ blank=True,
77
+ null=True,
78
+ on_delete=django.db.models.deletion.SET_NULL,
79
+ to='edu_rdm_integration_collect_data_stage.collectingexporteddatastage',
80
+ verbose_name='Этап формирования данных для выгрузки',
81
+ ),
82
+ ),
83
+ (
84
+ 'task',
85
+ models.ForeignKey(
86
+ blank=True,
87
+ null=True,
88
+ on_delete=django.db.models.deletion.SET_NULL,
89
+ to='async_task.runningtask',
90
+ verbose_name='Асинхронная задача',
91
+ ),
92
+ ),
93
+ ],
94
+ options={
95
+ 'verbose_name': 'Задача по сбору данных',
96
+ 'verbose_name_plural': 'Задачи по сбору данных',
97
+ 'db_table': 'edu_rdm_collecting_data_command_progress',
98
+ 'abstract': False,
99
+ },
100
+ bases=(educommon.django.db.mixins.ReprStrPreModelMixin, models.Model),
101
+ ),
102
+ ],
103
+ database_operations=[],
104
+ ),
105
+ ]
@@ -0,0 +1,56 @@
1
+ from educommon.async_task.models import (
2
+ AsyncTaskType,
3
+ )
4
+
5
+ from edu_rdm_integration.core.consts import (
6
+ TASK_QUEUE_NAME,
7
+ )
8
+ from edu_rdm_integration.core.helpers import (
9
+ save_command_log_link,
10
+ )
11
+ from edu_rdm_integration.stages.collect_data.models import (
12
+ EduRdmCollectDataCommandProgress,
13
+ )
14
+ from edu_rdm_integration.stages.collect_data.operations import (
15
+ BaseCollectModelsDataByGeneratingLogs,
16
+ )
17
+
18
+
19
+ class CollectCommandMixin:
20
+ """Класс-примесь для запуска команды сборки моделей."""
21
+
22
+ queue = TASK_QUEUE_NAME
23
+ routing_key = TASK_QUEUE_NAME
24
+ description = 'Сбор данных моделей РВД'
25
+ task_type = AsyncTaskType.SYSTEM
26
+
27
+ def get_collect_command(self, command_id: int) -> EduRdmCollectDataCommandProgress:
28
+ """Возвращает экземпляр модели команды запуска."""
29
+ command = EduRdmCollectDataCommandProgress.objects.get(id=command_id)
30
+
31
+ return command
32
+
33
+ def get_collect_models_class(self):
34
+ """Возвращает класс для сбора данных."""
35
+ return BaseCollectModelsDataByGeneratingLogs
36
+
37
+ def run_collect_command(self, command) -> None:
38
+ """Запуск команды сбора."""
39
+ collect_models_data_class = self.get_collect_models_class()
40
+ collect_models_data_class(
41
+ models=(command.model_id,),
42
+ logs_period_started_at=command.logs_period_started_at,
43
+ logs_period_ended_at=command.logs_period_ended_at,
44
+ command_id=command.id,
45
+ institute_ids=tuple(command.institute_ids or ()),
46
+ ).collect()
47
+
48
+ def save_collect_command_logs(self, command_id: int, log_dir: str):
49
+ """Сохранение ссылки на файл логов в команде."""
50
+ try:
51
+ command = self.get_collect_command(command_id)
52
+ except EduRdmCollectDataCommandProgress.DoesNotExist:
53
+ command = None
54
+
55
+ if command:
56
+ save_command_log_link(command, log_dir)
@@ -0,0 +1,318 @@
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
+ JSONField,
14
+ PositiveSmallIntegerField,
15
+ UUIDField,
16
+ )
17
+ from django.utils import (
18
+ timezone,
19
+ )
20
+ from m3.db import (
21
+ BaseObjectModel,
22
+ )
23
+
24
+ from educommon.django.db.mixins import (
25
+ ReprStrPreModelMixin,
26
+ )
27
+ from educommon.utils.date import (
28
+ get_today_max_datetime,
29
+ get_today_min_datetime,
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
+
46
+
47
+ class CollectingDataStageStatus(TitledModelEnum):
48
+ """Статус этапа сбора данных."""
49
+
50
+ CREATED = ModelEnumValue(
51
+ title='Создан',
52
+ )
53
+
54
+ IN_PROGRESS = ModelEnumValue(
55
+ title='В процессе сбора',
56
+ )
57
+
58
+ FAILED = ModelEnumValue(
59
+ title='Завершено с ошибками',
60
+ )
61
+
62
+ FINISHED = ModelEnumValue(
63
+ title='Завершено',
64
+ )
65
+
66
+ class Meta:
67
+ db_table = 'rdm_collecting_data_stage_status'
68
+ verbose_name = 'Модель-перечисление статусов этапа сбора данных'
69
+ verbose_name_plural = 'Модели-перечисления статусов этапов сбора данных'
70
+
71
+
72
+ class CollectingExportedDataStage(ReprStrPreModelMixin, BaseObjectModel):
73
+ """Этап подготовки данных в рамках Функций. За работу Функции отвечает ранер менеджер."""
74
+
75
+ manager = ForeignKey(
76
+ to='function_tools.Entity',
77
+ verbose_name='Менеджер ранера Функции',
78
+ on_delete=PROTECT,
79
+ null=True,
80
+ blank=True,
81
+ )
82
+
83
+ logs_period_started_at = DateTimeField(
84
+ 'Левая граница периода обрабатываемых логов',
85
+ db_index=True,
86
+ default=get_today_min_datetime,
87
+ )
88
+
89
+ logs_period_ended_at = DateTimeField(
90
+ 'Правая граница периода обрабатываемых логов',
91
+ db_index=True,
92
+ default=get_today_max_datetime,
93
+ )
94
+
95
+ started_at = DateTimeField(
96
+ 'Время начала сбора данных',
97
+ auto_now_add=True,
98
+ db_index=True,
99
+ )
100
+
101
+ ended_at = DateTimeField(
102
+ 'Время завершения сбора данных',
103
+ null=True,
104
+ blank=True,
105
+ db_index=True,
106
+ )
107
+
108
+ status = ForeignKey(
109
+ to='edu_rdm_integration_collect_data_stage.CollectingDataStageStatus',
110
+ verbose_name='Статус',
111
+ on_delete=PROTECT,
112
+ default=CollectingDataStageStatus.CREATED.key,
113
+ )
114
+
115
+ class Meta:
116
+ db_table = 'rdm_collecting_exported_data_stage'
117
+ verbose_name = 'Этап формирования данных для выгрузки'
118
+ verbose_name_plural = 'Этапы формирования данных для выгрузки'
119
+
120
+ @property
121
+ def attrs_for_repr_str(self):
122
+ """Список атрибутов для отображения экземпляра модели."""
123
+ return ['manager_id', 'logs_period_started_at', 'logs_period_ended_at', 'started_at', 'ended_at', 'status_id']
124
+
125
+ def save(self, *args, **kwargs):
126
+ """Сохранение этапа сбора данных модели РВД."""
127
+ if (
128
+ self.status_id in (CollectingDataStageStatus.FAILED.key, CollectingDataStageStatus.FINISHED.key)
129
+ and not self.ended_at
130
+ ):
131
+ self.ended_at = datetime.now()
132
+
133
+ super().save(*args, **kwargs)
134
+
135
+
136
+ class CollectingDataSubStageStatus(TitledModelEnum):
137
+ """Статус этапа сбора данных."""
138
+
139
+ CREATED = ModelEnumValue(
140
+ title='Создан',
141
+ )
142
+
143
+ IN_PROGRESS = ModelEnumValue(
144
+ title='В процессе сбора',
145
+ )
146
+
147
+ READY_TO_EXPORT = ModelEnumValue(
148
+ title='Готово к выгрузке',
149
+ )
150
+
151
+ FAILED = ModelEnumValue(
152
+ title='Завершено с ошибками',
153
+ )
154
+
155
+ EXPORTED = ModelEnumValue(
156
+ title='Выгружено',
157
+ )
158
+
159
+ NOT_EXPORTED = ModelEnumValue(
160
+ title='Не выгружено',
161
+ )
162
+
163
+ class Meta:
164
+ db_table = 'rdm_collecting_data_sub_stage_status'
165
+ verbose_name = 'Модель-перечисление статусов подэтапа сбора данных'
166
+ verbose_name_plural = 'Модели-перечисления статусов подэтапов сбора данных'
167
+
168
+
169
+ class CollectingExportedDataSubStage(ReprStrPreModelMixin, BaseObjectModel):
170
+ """Подэтап сбора данных для сущностей в рамках функции."""
171
+
172
+ stage = ForeignKey(
173
+ to=CollectingExportedDataStage,
174
+ verbose_name='Этап подготовки данных для экспорта',
175
+ on_delete=PROTECT,
176
+ )
177
+
178
+ function = ForeignKey(
179
+ to=Entity,
180
+ verbose_name='Функция',
181
+ on_delete=PROTECT,
182
+ )
183
+
184
+ started_at = DateTimeField(
185
+ 'Время начала сбора данных',
186
+ auto_now_add=True,
187
+ db_index=True,
188
+ )
189
+
190
+ ended_at = DateTimeField(
191
+ 'Время завершения сбора данных',
192
+ null=True,
193
+ blank=True,
194
+ db_index=True,
195
+ )
196
+
197
+ previous = ForeignKey(
198
+ 'self',
199
+ null=True,
200
+ blank=True,
201
+ verbose_name='Предыдущий сбор данных',
202
+ on_delete=CASCADE,
203
+ )
204
+
205
+ status = ForeignKey(
206
+ to='edu_rdm_integration_collect_data_stage.CollectingDataSubStageStatus',
207
+ verbose_name='Статус',
208
+ on_delete=PROTECT,
209
+ default=CollectingDataSubStageStatus.CREATED.key,
210
+ )
211
+
212
+ class Meta:
213
+ db_table = 'rdm_collecting_exported_data_sub_stage'
214
+ verbose_name = 'Подэтап формирования данных для выгрузки'
215
+ verbose_name_plural = 'Подэтапы формирования данных для выгрузки'
216
+
217
+ @property
218
+ def attrs_for_repr_str(self):
219
+ """Список атрибутов для отображения экземпляра модели."""
220
+ return ['stage_id', 'function_id', 'started_at', 'ended_at', 'previous_id', 'status_id']
221
+
222
+ def save(self, *args, **kwargs):
223
+ """Сохранение подэтапа сбора данных."""
224
+ if (
225
+ self.status_id
226
+ in (CollectingDataSubStageStatus.FAILED.key, CollectingDataSubStageStatus.READY_TO_EXPORT.key)
227
+ and not self.ended_at
228
+ ):
229
+ self.ended_at = datetime.now()
230
+
231
+ super().save(*args, **kwargs)
232
+
233
+
234
+ class AbstractCollectDataCommandProgress(ReprStrPreModelMixin, BaseObjectModel):
235
+ """Модель, хранящая данные для формирования и отслеживания асинхронных задач по сбору данных.
236
+
237
+ В реализации необходимо определить поля:
238
+ 1. Ссылку на асинхронную задачу, например:
239
+ task = ForeignKey(
240
+ to=RunningTask,
241
+ verbose_name='Асинхронная задача',
242
+ blank=True, null=True,
243
+ on_delete=SET_NULL,
244
+ )
245
+ 2. Поле хранения лога:
246
+ logs_link = FileField(
247
+ upload_to=upload_file_handler,
248
+ max_length=255,
249
+ verbose_name='Ссылка на файл логов',
250
+ )
251
+ """
252
+
253
+ task = ...
254
+
255
+ logs_link = ...
256
+
257
+ stage = ForeignKey(
258
+ to='edu_rdm_integration_collect_data_stage.CollectingExportedDataStage',
259
+ verbose_name='Этап формирования данных для выгрузки',
260
+ blank=True,
261
+ null=True,
262
+ on_delete=SET_NULL,
263
+ )
264
+ model = ForeignKey(
265
+ to='edu_rdm_integration_models.RegionalDataMartModelEnum',
266
+ verbose_name='Модель РВД',
267
+ on_delete=PROTECT,
268
+ )
269
+ created = DateTimeField(
270
+ verbose_name='Дата создания',
271
+ default=timezone.now,
272
+ )
273
+ logs_period_started_at = DateTimeField(
274
+ 'Левая граница периода обрабатываемых логов',
275
+ )
276
+ logs_period_ended_at = DateTimeField(
277
+ 'Правая граница периода обрабатываемых логов',
278
+ )
279
+ generation_id = UUIDField(
280
+ 'Идентификатор генерации',
281
+ default=uuid.uuid4,
282
+ )
283
+ institute_ids = JSONField(
284
+ 'id учебного заведения',
285
+ blank=True,
286
+ null=True,
287
+ default=list,
288
+ )
289
+
290
+ class Meta:
291
+ abstract = True
292
+ db_table = 'rdm_collecting_data_command_progress'
293
+ verbose_name = 'Задача по сбору данных'
294
+ verbose_name_plural = 'Задачи по сбору данных'
295
+
296
+
297
+ class EduRdmCollectDataCommandProgress(AbstractCollectDataCommandProgress):
298
+ """Модель, хранящая данные для формирования и отслеживания асинхронных задач по сбору данных."""
299
+
300
+ task = ForeignKey(
301
+ to='async_task.RunningTask',
302
+ verbose_name='Асинхронная задача',
303
+ blank=True,
304
+ null=True,
305
+ on_delete=SET_NULL,
306
+ )
307
+ logs_link = FileField(
308
+ upload_to=get_data_command_progress_attachment_path,
309
+ max_length=255,
310
+ verbose_name='Ссылка на файл логов',
311
+ )
312
+ type = PositiveSmallIntegerField( # noqa: A003
313
+ verbose_name='Тип команды',
314
+ choices=CommandType.get_choices(),
315
+ )
316
+
317
+ class Meta(AbstractCollectDataCommandProgress.Meta):
318
+ db_table = 'edu_rdm_collecting_data_command_progress'