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
@@ -1,5 +1,4 @@
1
- """
2
- Команда для проставления расчетов файла . По умолчанию собирается за месяц. Обновление работает асинхронно.
1
+ """Команда для проставления расчетов файла . По умолчанию собирается за месяц. Обновление работает асинхронно.
3
2
 
4
3
  Выполнение:
5
4
  django-admin async_fix_attachment_size --chunk_size=50 --count_store_size --connection_pool_size=5
@@ -15,7 +14,6 @@ django-admin async_fix_attachment_size --chunk_size=50 --count_store_size --conn
15
14
  --async_workers_count количество одновременных асинхронных воркеров-исполнителей по умолчанию 20
16
15
  """
17
16
 
18
-
19
17
  import asyncio
20
18
  from datetime import (
21
19
  date,
@@ -39,12 +37,12 @@ from educommon.utils.seqtools import (
39
37
  make_chunks,
40
38
  )
41
39
 
42
- from edu_rdm_integration.enums import (
43
- FileUploadStatusEnum,
44
- )
45
- from edu_rdm_integration.models import (
40
+ from edu_rdm_integration.stages.export_data.models import (
46
41
  ExportingDataSubStageAttachment,
47
42
  )
43
+ from edu_rdm_integration.stages.upload_data.enums import (
44
+ FileUploadStatusEnum,
45
+ )
48
46
 
49
47
 
50
48
  DEFAULT_QUERYSET_CHUNK_SIZE = 500
@@ -61,7 +59,7 @@ class Command(BaseCommand):
61
59
  'Команда для проставления размера по умолчанию (в байтах) для отправленных файлов.'
62
60
  )
63
61
 
64
- def __init__(self, *args, **kwargs):
62
+ def __init__(self, *args, **kwargs):
65
63
  super().__init__(*args, **kwargs)
66
64
 
67
65
  self.result = {
@@ -76,25 +74,21 @@ class Command(BaseCommand):
76
74
  '--chunk_size',
77
75
  type=int,
78
76
  default=DEFAULT_QUERYSET_CHUNK_SIZE,
79
- help='Кол-во единовременно изменяемых элементов в запросе'
77
+ help='Кол-во единовременно изменяемых элементов в запросе',
78
+ )
79
+ (
80
+ parser.add_argument(
81
+ '--count_store_size', action='store_true', default=False, help='Рассчитать размер файлов'
82
+ ),
80
83
  )
81
84
  parser.add_argument(
82
- '--count_store_size',
83
- action='store_true',
84
- default=False,
85
- help='Рассчитать размер файлов'
86
- ),
87
- parser.add_argument(
88
- '--connection_pool_size',
89
- type=int,
90
- default=DEFAULT_POOL_SIZE,
91
- help='Кол-во одновременных коннектов к базе'
85
+ '--connection_pool_size', type=int, default=DEFAULT_POOL_SIZE, help='Кол-во одновременных коннектов к базе'
92
86
  )
93
87
  parser.add_argument(
94
88
  '--async_workers_count',
95
89
  type=int,
96
90
  default=DEFAULT_ASYNC_WORKERS_COUNT,
97
- help='Кол-во одновременных асинхронных воркеров-исполнителей'
91
+ help='Кол-во одновременных асинхронных воркеров-исполнителей',
98
92
  )
99
93
  parser.add_argument(
100
94
  '--date_begin',
@@ -108,11 +102,7 @@ class Command(BaseCommand):
108
102
  )
109
103
 
110
104
  def get_attachments_fix_query(
111
- self,
112
- chunk_size: int,
113
- date_begin: date,
114
- date_end: date,
115
- count_store_size: bool
105
+ self, chunk_size: int, date_begin: date, date_end: date, count_store_size: bool
116
106
  ) -> list[tuple[int, int]]:
117
107
  """Формирование id файлов, которым надо обновить размер."""
118
108
  logger.info('Определение файлов, которым надо обновить размер.')
@@ -128,25 +118,22 @@ class Command(BaseCommand):
128
118
  for chunk in make_chunks(attachment_query.iterator(), chunk_size):
129
119
  if count_store_size:
130
120
  update_attachments.append(
131
- [
132
- (
133
- attachment.id, attachment.attachment.size
134
- if attachment.attachment.field.storage.exists(attachment.attachment.name)
135
- else DEFAULT_FILE_SIZE
136
- )
137
- for attachment in chunk
138
- ]
121
+ [
122
+ (
123
+ attachment.id,
124
+ attachment.attachment.size
125
+ if attachment.attachment.field.storage.exists(attachment.attachment.name)
126
+ else DEFAULT_FILE_SIZE,
127
+ )
128
+ for attachment in chunk
129
+ ]
139
130
  )
140
131
  else:
141
132
  update_attachments.append([(attachment.id, DEFAULT_FILE_SIZE) for attachment in chunk])
142
133
 
143
134
  return update_attachments
144
135
 
145
- async def execute_update_sql(
146
- self,
147
- pool: asyncpg.Pool,
148
- data: list[tuple[int, int]]
149
- ) -> None:
136
+ async def execute_update_sql(self, pool: asyncpg.Pool, data: list[tuple[int, int]]) -> None:
150
137
  """Метод для исполнения сгенерированного UPDATE sql запроса."""
151
138
  self.result['initial_count_rows_to_fix'] += len(data)
152
139
  logger.info('Обновление размера файлов')
@@ -157,18 +144,14 @@ class Command(BaseCommand):
157
144
  UPDATE rdm_exporting_data_sub_stage_attachment
158
145
  set attachment_size = $2
159
146
  where id = $1;
160
- """, data,
147
+ """,
148
+ data,
161
149
  )
162
150
  self.result['fixed_rows_count'] += len(data)
163
151
  except Exception as ex:
164
152
  self.result['errors'].append(str(ex))
165
153
 
166
- async def fix_attachment_size(
167
- self,
168
- fix_queries: list,
169
- pool_size: int = None,
170
- workers_count: int = None
171
- ) -> None:
154
+ async def fix_attachment_size(self, fix_queries: list, pool_size: int = None, workers_count: int = None) -> None:
172
155
  """Асинхронное обновление размера файлов."""
173
156
  pool = await asyncpg.create_pool(
174
157
  max_size=pool_size,
@@ -177,7 +160,7 @@ class Command(BaseCommand):
177
160
  port=DB_SETTINGS['PORT'],
178
161
  user=DB_SETTINGS['USER'],
179
162
  password=DB_SETTINGS['PASSWORD'],
180
- database=DB_SETTINGS['NAME']
163
+ database=DB_SETTINGS['NAME'],
181
164
  )
182
165
  if len(fix_queries) > workers_count:
183
166
  for chunk in make_chunks(fix_queries, workers_count):
@@ -192,9 +175,9 @@ class Command(BaseCommand):
192
175
  connection_pool_size: int,
193
176
  chunk_size: int,
194
177
  date_begin: date,
195
- date_end:date,
178
+ date_end: date,
196
179
  async_workers_count: int,
197
- count_store_size: bool
180
+ count_store_size: bool,
198
181
  ):
199
182
  """Обновление размеров файла."""
200
183
  fix_queries = self.get_attachments_fix_query(chunk_size, date_begin, date_end, count_store_size)
@@ -228,12 +211,7 @@ class Command(BaseCommand):
228
211
  logger.info('Обновление размеров файла\n')
229
212
 
230
213
  self.update_attachment_size(
231
- connection_pool_size,
232
- chunk_size,
233
- date_begin,
234
- date_end,
235
- async_workers_count,
236
- count_store_size
214
+ connection_pool_size, chunk_size, date_begin, date_end, async_workers_count, count_store_size
237
215
  )
238
216
 
239
217
  delta = datetime.now() - time_start
@@ -1,5 +1,4 @@
1
- """
2
- Команда для проверки состояния отправленных в витрину данных.
1
+ """Команда для проверки состояния отправленных в витрину данных.
3
2
 
4
3
  Необязательные параметры:
5
4
  --period_started_at - дата и время начала периода загрузки данных в витрину
@@ -9,6 +8,7 @@
9
8
  Пример использования:
10
9
  python manage.py check_upload_status --period_started_at="01.11.2023 10:00:00" --thread_count=4
11
10
  """
11
+
12
12
  from datetime import (
13
13
  date,
14
14
  datetime,
@@ -18,6 +18,7 @@ from typing import (
18
18
  TYPE_CHECKING,
19
19
  Any,
20
20
  )
21
+
21
22
  from django.core.cache import (
22
23
  cache,
23
24
  )
@@ -25,16 +26,16 @@ from django.core.management.base import (
25
26
  BaseCommand,
26
27
  )
27
28
 
28
- from edu_rdm_integration.consts import (
29
+ from edu_rdm_integration.core.consts import (
29
30
  DATETIME_FORMAT,
30
31
  )
31
- from edu_rdm_integration.enums import (
32
+ from edu_rdm_integration.stages.upload_data.enums import (
32
33
  FileUploadStatusEnum,
33
34
  )
34
- from edu_rdm_integration.helpers import (
35
+ from edu_rdm_integration.stages.upload_data.helpers import (
35
36
  UploadStatusHelper,
36
37
  )
37
- from edu_rdm_integration.models import (
38
+ from edu_rdm_integration.stages.upload_data.models import (
38
39
  ExportingDataSubStageUploaderClientLog,
39
40
  )
40
41
 
@@ -1,13 +1,13 @@
1
- from edu_rdm_integration.export_data.base.requests import (
1
+ from edu_rdm_integration.stages.export_data.functions.base.requests import (
2
2
  RegionalDataMartStatusRequest,
3
3
  )
4
- from edu_rdm_integration.management.general import (
4
+ from edu_rdm_integration.stages.upload_data.management.base import (
5
5
  BaseDatamartClientCommand,
6
6
  )
7
7
 
8
8
 
9
+ # ruff: noqa: D101
9
10
  class Command(BaseDatamartClientCommand):
10
-
11
11
  help = 'Команда для получения статуса загрузки файла в РВД с использованием uploader-client.' # noqa A003
12
12
 
13
13
  def add_arguments(self, parser):
@@ -2,17 +2,17 @@ from pathlib import (
2
2
  Path,
3
3
  )
4
4
 
5
- from edu_rdm_integration.export_data.base.requests import (
5
+ from edu_rdm_integration.stages.export_data.functions.base.requests import (
6
6
  RegionalDataMartEntityRequest,
7
7
  )
8
- from edu_rdm_integration.management.general import (
8
+ from edu_rdm_integration.stages.upload_data.management.base import (
9
9
  BaseDatamartClientCommand,
10
10
  )
11
11
 
12
12
 
13
+ # ruff: noqa: D101
13
14
  class Command(BaseDatamartClientCommand):
14
-
15
- help = 'Команда для загрузки csv-файла в РВД с использованием uploader-client.' # noqa A003
15
+ help = 'Команда для загрузки csv-файла в РВД с использованием uploader-client.'
16
16
 
17
17
  def add_arguments(self, parser):
18
18
  """Добавление параметров."""
@@ -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 = 'Логи запроса подэтапа выгрузки данных'