edu-rdm-integration 3.9.2__py3-none-any.whl → 3.10.1__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/collect_and_export_data/models.py +1 -67
  20. edu_rdm_integration/{consts.py → core/consts.py} +0 -11
  21. edu_rdm_integration/{enums.py → core/enums.py} +7 -54
  22. edu_rdm_integration/core/helpers.py +331 -0
  23. edu_rdm_integration/core/operations.py +71 -0
  24. edu_rdm_integration/core/redis_cache.py +20 -0
  25. edu_rdm_integration/{collect_and_export_data → core/registry}/actions.py +6 -12
  26. edu_rdm_integration/core/registry/apps.py +11 -0
  27. edu_rdm_integration/{collect_and_export_data → core/registry}/ui.py +1 -1
  28. edu_rdm_integration/{storages.py → core/storages.py} +8 -17
  29. edu_rdm_integration/{utils.py → core/utils.py} +29 -91
  30. edu_rdm_integration/migrations/0001_initial.py +294 -44
  31. edu_rdm_integration/migrations/0002_init_data_uploadstatus.py +1 -3
  32. edu_rdm_integration/migrations/0003_create_index_file_upload_status.py +0 -1
  33. edu_rdm_integration/migrations/0004_uploaderclientlog.py +1 -2
  34. edu_rdm_integration/migrations/0005_auto_20231204_1224.py +16 -4
  35. edu_rdm_integration/migrations/0006_request_status_data.py +60 -58
  36. edu_rdm_integration/migrations/0007_delete_upload_status.py +0 -1
  37. edu_rdm_integration/migrations/0009_auto_20240522_1619.py +1 -5
  38. edu_rdm_integration/migrations/0010_transferredentity_export_enabled.py +0 -1
  39. edu_rdm_integration/migrations/0011_exportingdatasubstageentity.py +16 -3
  40. edu_rdm_integration/migrations/0012_exportingdatasubstageattachment_attachment_size.py +0 -1
  41. edu_rdm_integration/migrations/0013_set_attachment_size.py +8 -12
  42. edu_rdm_integration/migrations/0014_uploaddatacommand.py +33 -6
  43. edu_rdm_integration/migrations/0015_set_exporting_sub_stage_status.py +1 -5
  44. edu_rdm_integration/migrations/0016_transferredentity_queue_level.py +2 -2
  45. edu_rdm_integration/migrations/0017_delete_uploaddatacommand.py +3 -2
  46. edu_rdm_integration/migrations/__init__.py +1 -0
  47. edu_rdm_integration/{registry → pipelines/transfer}/actions.py +13 -26
  48. edu_rdm_integration/pipelines/transfer/app_meta.py +18 -0
  49. edu_rdm_integration/pipelines/transfer/apps.py +19 -0
  50. edu_rdm_integration/pipelines/transfer/enums.py +34 -0
  51. edu_rdm_integration/pipelines/transfer/migrations/0001_initial.py +57 -0
  52. edu_rdm_integration/{base.py → pipelines/transfer/mixins.py} +29 -53
  53. edu_rdm_integration/pipelines/transfer/models.py +48 -0
  54. edu_rdm_integration/{tasks.py → pipelines/transfer/tasks.py} +51 -150
  55. edu_rdm_integration/{registry → pipelines/transfer}/ui.py +4 -10
  56. edu_rdm_integration/rdm_entities/apps.py +11 -0
  57. edu_rdm_integration/{entities.py → rdm_entities/entities.py} +67 -57
  58. edu_rdm_integration/rdm_entities/migrations/0001_initial.py +44 -0
  59. edu_rdm_integration/{enum_register → rdm_entities}/mixins.py +8 -59
  60. edu_rdm_integration/rdm_entities/models.py +63 -0
  61. edu_rdm_integration/rdm_entities/utils.py +33 -0
  62. edu_rdm_integration/rdm_models/apps.py +16 -0
  63. edu_rdm_integration/rdm_models/migrations/0001_initial.py +40 -0
  64. edu_rdm_integration/rdm_models/mixins.py +67 -0
  65. edu_rdm_integration/rdm_models/models.py +73 -0
  66. edu_rdm_integration/rdm_models/utils.py +23 -0
  67. edu_rdm_integration/stages/collect_data/apps.py +11 -0
  68. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/functions.py-tpl +2 -2
  69. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/managers.py-tpl +1 -1
  70. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/runners.py-tpl +1 -1
  71. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/tests.py-tpl +2 -1
  72. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/caches.py +2 -2
  73. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/functions.py +15 -18
  74. edu_rdm_integration/stages/collect_data/functions/base/helpers.py +20 -0
  75. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/managers.py +20 -27
  76. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/mixins.py +38 -55
  77. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/runners.py +2 -5
  78. edu_rdm_integration/stages/collect_data/functions/calculated/__init__.py +0 -0
  79. edu_rdm_integration/stages/collect_data/functions/calculated/base/__init__.py +0 -0
  80. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/caches.py +3 -7
  81. edu_rdm_integration/stages/collect_data/functions/calculated/base/errors.py +7 -0
  82. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/functions.py +8 -16
  83. edu_rdm_integration/stages/collect_data/functions/calculated/base/helpers.py +24 -0
  84. edu_rdm_integration/stages/collect_data/functions/calculated/base/managers.py +19 -0
  85. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/presenters.py +1 -3
  86. edu_rdm_integration/stages/collect_data/functions/calculated/base/results.py +12 -0
  87. edu_rdm_integration/stages/collect_data/functions/calculated/base/runners.py +28 -0
  88. edu_rdm_integration/stages/collect_data/functions/calculated/base/validators.py +20 -0
  89. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/strategies.py +32 -70
  90. edu_rdm_integration/stages/collect_data/functions/non_calculated/__init__.py +0 -0
  91. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/__init__.py +0 -0
  92. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/caches.py +13 -22
  93. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/errors.py +7 -0
  94. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/functions.py +8 -16
  95. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/helpers.py +24 -0
  96. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/managers.py +19 -0
  97. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/presenters.py +1 -3
  98. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/results.py +12 -0
  99. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/runners.py +28 -0
  100. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/validators.py +20 -0
  101. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/strategies.py +32 -70
  102. edu_rdm_integration/{collect_data → stages/collect_data}/generators.py +9 -14
  103. edu_rdm_integration/stages/collect_data/helpers.py +154 -0
  104. edu_rdm_integration/stages/collect_data/management/__init__.py +0 -0
  105. edu_rdm_integration/stages/collect_data/management/base.py +100 -0
  106. edu_rdm_integration/stages/collect_data/management/commands/__init__.py +0 -0
  107. edu_rdm_integration/{management → stages/collect_data/management}/commands/collect_latest_models_data.py +5 -7
  108. edu_rdm_integration/{management → stages/collect_data/management}/commands/collect_models_data.py +5 -7
  109. edu_rdm_integration/stages/collect_data/migrations/0001_initial.py +187 -0
  110. edu_rdm_integration/stages/collect_data/migrations/0002_edurdmcollectdatacommandprogress.py +105 -0
  111. edu_rdm_integration/stages/collect_data/migrations/__init__.py +0 -0
  112. edu_rdm_integration/stages/collect_data/mixins.py +56 -0
  113. edu_rdm_integration/stages/collect_data/models.py +318 -0
  114. edu_rdm_integration/{collect_data/collect.py → stages/collect_data/operations.py} +30 -43
  115. edu_rdm_integration/stages/collect_data/registry/__init__.py +0 -0
  116. edu_rdm_integration/{collect_data → stages/collect_data/registry}/actions.py +17 -20
  117. edu_rdm_integration/stages/collect_data/registry/apps.py +11 -0
  118. edu_rdm_integration/{collect_data → stages/collect_data/registry}/ui.py +8 -15
  119. edu_rdm_integration/{collect_data → stages/collect_data}/tests.py +2 -2
  120. edu_rdm_integration/stages/export_data/__init__.py +0 -0
  121. edu_rdm_integration/stages/export_data/apps.py +11 -0
  122. edu_rdm_integration/stages/export_data/function_templates/__init__.py +0 -0
  123. edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/functions.py-tpl +2 -2
  124. edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/managers.py-tpl +2 -2
  125. edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/runners.py-tpl +2 -2
  126. edu_rdm_integration/stages/export_data/functions/__init__.py +0 -0
  127. edu_rdm_integration/stages/export_data/functions/base/__init__.py +0 -0
  128. edu_rdm_integration/{export_data → stages/export_data/functions}/base/caches.py +3 -8
  129. edu_rdm_integration/stages/export_data/functions/base/errors.py +7 -0
  130. edu_rdm_integration/{export_data → stages/export_data/functions}/base/functions.py +28 -59
  131. edu_rdm_integration/{export_data → stages/export_data/functions}/base/helpers.py +7 -17
  132. edu_rdm_integration/{export_data → stages/export_data/functions}/base/managers.py +19 -28
  133. edu_rdm_integration/stages/export_data/functions/base/presenters.py +11 -0
  134. edu_rdm_integration/{export_data → stages/export_data/functions}/base/requests.py +13 -40
  135. edu_rdm_integration/stages/export_data/functions/base/results.py +12 -0
  136. edu_rdm_integration/{export_data → stages/export_data/functions}/base/runners.py +9 -21
  137. edu_rdm_integration/stages/export_data/functions/base/validators.py +20 -0
  138. edu_rdm_integration/{export_data → stages/export_data}/generators.py +7 -6
  139. edu_rdm_integration/stages/export_data/helpers.py +203 -0
  140. edu_rdm_integration/stages/export_data/management/__init__.py +0 -0
  141. edu_rdm_integration/stages/export_data/management/base.py +101 -0
  142. edu_rdm_integration/stages/export_data/management/commands/__init__.py +0 -0
  143. edu_rdm_integration/{management → stages/export_data/management}/commands/export_entities_data.py +5 -7
  144. edu_rdm_integration/{management → stages/export_data/management}/commands/export_latest_entities_data.py +5 -7
  145. edu_rdm_integration/stages/export_data/migrations/0001_initial.py +324 -0
  146. edu_rdm_integration/stages/export_data/migrations/__init__.py +0 -0
  147. edu_rdm_integration/stages/export_data/mixins.py +50 -0
  148. edu_rdm_integration/stages/export_data/models.py +362 -0
  149. edu_rdm_integration/{export_data/export.py → stages/export_data/operations.py} +13 -152
  150. edu_rdm_integration/stages/export_data/registry/__init__.py +0 -0
  151. edu_rdm_integration/{export_data → stages/export_data/registry}/actions.py +18 -18
  152. edu_rdm_integration/stages/export_data/registry/apps.py +11 -0
  153. edu_rdm_integration/{export_data → stages/export_data/registry}/ui.py +5 -7
  154. edu_rdm_integration/{export_data → stages/export_data}/strategies.py +30 -68
  155. edu_rdm_integration/stages/service/__init__.py +0 -0
  156. edu_rdm_integration/stages/service/apps.py +19 -0
  157. edu_rdm_integration/stages/service/tasks.py +63 -0
  158. edu_rdm_integration/stages/upload_data/__init__.py +0 -0
  159. edu_rdm_integration/stages/upload_data/apps.py +19 -0
  160. edu_rdm_integration/stages/upload_data/consts.py +10 -0
  161. edu_rdm_integration/{export_data → stages/upload_data}/dataclasses.py +1 -0
  162. edu_rdm_integration/stages/upload_data/enums.py +17 -0
  163. edu_rdm_integration/{export_data/export_manager.py → stages/upload_data/export_managers.py} +73 -68
  164. edu_rdm_integration/stages/upload_data/helpers.py +164 -0
  165. edu_rdm_integration/stages/upload_data/management/__init__.py +0 -0
  166. edu_rdm_integration/stages/upload_data/management/base.py +134 -0
  167. edu_rdm_integration/stages/upload_data/management/commands/__init__.py +0 -0
  168. edu_rdm_integration/{management → stages/upload_data/management}/commands/async_fix_attachment_size.py +32 -54
  169. edu_rdm_integration/{management → stages/upload_data/management}/commands/check_upload_status.py +7 -6
  170. edu_rdm_integration/{management → stages/upload_data/management}/commands/datamart_status.py +3 -3
  171. edu_rdm_integration/{management → stages/upload_data/management}/commands/datamart_upload.py +4 -4
  172. edu_rdm_integration/stages/upload_data/migrations/0001_initial.py +161 -0
  173. edu_rdm_integration/stages/upload_data/migrations/__init__.py +0 -0
  174. edu_rdm_integration/stages/upload_data/models.py +175 -0
  175. edu_rdm_integration/stages/upload_data/operations.py +156 -0
  176. edu_rdm_integration/{export_data/queue.py → stages/upload_data/queues.py} +10 -8
  177. edu_rdm_integration/stages/upload_data/tasks.py +103 -0
  178. edu_rdm_integration/stages/upload_data/uploader_log/__init__.py +0 -0
  179. edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/actions.py +14 -16
  180. edu_rdm_integration/stages/upload_data/uploader_log/apps.py +11 -0
  181. edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/managers.py +15 -30
  182. edu_rdm_integration/stages/upload_data/uploader_log/migrations/0001_initial.py +31 -0
  183. edu_rdm_integration/stages/upload_data/uploader_log/migrations/__init__.py +0 -0
  184. edu_rdm_integration/stages/upload_data/uploader_log/models.py +86 -0
  185. edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/ui.py +8 -6
  186. {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.1.dist-info}/METADATA +238 -238
  187. edu_rdm_integration-3.10.1.dist-info/RECORD +257 -0
  188. edu_rdm_integration/app_meta.py +0 -16
  189. edu_rdm_integration/app_settings.py +0 -77
  190. edu_rdm_integration/collect_and_export_data/utils.py +0 -224
  191. edu_rdm_integration/collect_data/base/helpers.py +0 -26
  192. edu_rdm_integration/collect_data/calculated/base/errors.py +0 -9
  193. edu_rdm_integration/collect_data/calculated/base/helpers.py +0 -32
  194. edu_rdm_integration/collect_data/calculated/base/managers.py +0 -23
  195. edu_rdm_integration/collect_data/calculated/base/results.py +0 -16
  196. edu_rdm_integration/collect_data/calculated/base/runners.py +0 -36
  197. edu_rdm_integration/collect_data/calculated/base/validators.py +0 -28
  198. edu_rdm_integration/collect_data/helpers.py +0 -92
  199. edu_rdm_integration/collect_data/non_calculated/base/errors.py +0 -9
  200. edu_rdm_integration/collect_data/non_calculated/base/helpers.py +0 -32
  201. edu_rdm_integration/collect_data/non_calculated/base/managers.py +0 -23
  202. edu_rdm_integration/collect_data/non_calculated/base/results.py +0 -16
  203. edu_rdm_integration/collect_data/non_calculated/base/runners.py +0 -36
  204. edu_rdm_integration/collect_data/non_calculated/base/validators.py +0 -28
  205. edu_rdm_integration/enum_register/register.py +0 -79
  206. edu_rdm_integration/export_data/base/errors.py +0 -9
  207. edu_rdm_integration/export_data/base/presenters.py +0 -13
  208. edu_rdm_integration/export_data/base/results.py +0 -16
  209. edu_rdm_integration/export_data/base/validators.py +0 -28
  210. edu_rdm_integration/export_data/helpers.py +0 -92
  211. edu_rdm_integration/helpers.py +0 -412
  212. edu_rdm_integration/management/general.py +0 -327
  213. edu_rdm_integration/models.py +0 -982
  214. edu_rdm_integration/redis_cache.py +0 -51
  215. edu_rdm_integration/uploader_log/apps.py +0 -10
  216. edu_rdm_integration-3.9.2.dist-info/RECORD +0 -198
  217. /edu_rdm_integration/{collect_data → core}/__init__.py +0 -0
  218. /edu_rdm_integration/{mapping.py → core/mapping.py} +0 -0
  219. /edu_rdm_integration/{collect_data/base → core/registry}/__init__.py +0 -0
  220. /edu_rdm_integration/{templates → core/registry/templates}/ui-js/start-task.js +0 -0
  221. /edu_rdm_integration/{signals.py → core/signals.py} +0 -0
  222. /edu_rdm_integration/{typing.py → core/typing.py} +0 -0
  223. /edu_rdm_integration/{collect_data/calculated → pipelines}/__init__.py +0 -0
  224. /edu_rdm_integration/{collect_data/calculated/base → pipelines/transfer}/__init__.py +0 -0
  225. /edu_rdm_integration/{collect_data/non_calculated → pipelines/transfer/migrations}/__init__.py +0 -0
  226. /edu_rdm_integration/{templates → pipelines/transfer/templates}/ui-js/transferred-entity-list.js +0 -0
  227. /edu_rdm_integration/{collect_data/non_calculated/base → rdm_entities}/__init__.py +0 -0
  228. /edu_rdm_integration/{enum_register → rdm_entities/migrations}/__init__.py +0 -0
  229. /edu_rdm_integration/{export_data → rdm_models}/__init__.py +0 -0
  230. /edu_rdm_integration/{export_data/base → rdm_models/migrations}/__init__.py +0 -0
  231. /edu_rdm_integration/{function_templates → stages}/__init__.py +0 -0
  232. /edu_rdm_integration/{management → stages/collect_data}/__init__.py +0 -0
  233. /edu_rdm_integration/{collect_data/const.py → stages/collect_data/consts.py} +0 -0
  234. /edu_rdm_integration/{management/commands → stages/collect_data/function_templates}/__init__.py +0 -0
  235. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/__init__.py-tpl +0 -0
  236. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/apps.py-tpl +0 -0
  237. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/caches.py-tpl +0 -0
  238. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/consts.py-tpl +0 -0
  239. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/enums.py-tpl +0 -0
  240. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/errors.py-tpl +0 -0
  241. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/helpers.py-tpl +0 -0
  242. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/presenters.py-tpl +0 -0
  243. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/results.py-tpl +0 -0
  244. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/strings.py-tpl +0 -0
  245. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/validators.py-tpl +0 -0
  246. /edu_rdm_integration/{registry → stages/collect_data/functions}/__init__.py +0 -0
  247. /edu_rdm_integration/{uploader_log → stages/collect_data/functions/base}/__init__.py +0 -0
  248. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/consts.py +0 -0
  249. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/consts.py +0 -0
  250. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/enums.py +0 -0
  251. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/strings.py +0 -0
  252. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/tests.py +0 -0
  253. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/consts.py +0 -0
  254. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/enums.py +0 -0
  255. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/strings.py +0 -0
  256. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/tests.py +0 -0
  257. /edu_rdm_integration/{export_data → stages/export_data}/consts.py +0 -0
  258. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/__init__.py-tpl +0 -0
  259. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/apps.py-tpl +0 -0
  260. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/caches.py-tpl +0 -0
  261. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/consts.py-tpl +0 -0
  262. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/enums.py-tpl +0 -0
  263. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/errors.py-tpl +0 -0
  264. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/helpers.py-tpl +0 -0
  265. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/presenters.py-tpl +0 -0
  266. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/results.py-tpl +0 -0
  267. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/strings.py-tpl +0 -0
  268. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/tests.py-tpl +0 -0
  269. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/validators.py-tpl +0 -0
  270. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/consts.py +0 -0
  271. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/enums.py +0 -0
  272. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/strings.py +0 -0
  273. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/tests.py +0 -0
  274. /edu_rdm_integration/{templates → stages/export_data/registry/templates}/ui-js/stage_for_export.js +0 -0
  275. /edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/enums.py +0 -0
  276. /edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/templates/ui-js/object-grid-buttons.js +0 -0
  277. {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.1.dist-info}/WHEEL +0 -0
  278. {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.1.dist-info}/licenses/LICENSE +0 -0
  279. {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.1.dist-info}/top_level.txt +0 -0
@@ -1,982 +0,0 @@
1
- import uuid
2
- from datetime import (
3
- datetime,
4
- )
5
- from io import (
6
- StringIO,
7
- )
8
- from typing import (
9
- Optional,
10
- )
11
-
12
- from edu_rdm_integration.uploader_log.enums import (
13
- RequestResultStatus,
14
- )
15
-
16
- from django.db.models import (
17
- CASCADE,
18
- PROTECT,
19
- SET_NULL,
20
- BooleanField,
21
- CharField,
22
- DateTimeField,
23
- FileField,
24
- ForeignKey,
25
- JSONField,
26
- Manager,
27
- OneToOneField,
28
- PositiveIntegerField,
29
- PositiveSmallIntegerField,
30
- SmallIntegerField,
31
- UUIDField,
32
- )
33
- from django.utils import (
34
- timezone,
35
- )
36
- from django.utils.functional import (
37
- cached_property,
38
- )
39
- from m3 import (
40
- json_encode,
41
- )
42
- from m3.db import (
43
- BaseObjectModel,
44
- )
45
- from uploader_client.models import (
46
- Entry,
47
- )
48
-
49
- from educommon.django.db.mixins import (
50
- ReprStrPreModelMixin,
51
- )
52
- from educommon.integration_entities.enums import (
53
- EntityLogOperation,
54
- )
55
- from educommon.utils.date import (
56
- get_today_max_datetime,
57
- get_today_min_datetime,
58
- )
59
- from function_tools.models import (
60
- Entity,
61
- )
62
- from m3_db_utils.models import (
63
- ModelEnumValue,
64
- TitledIntegerModelEnum,
65
- TitledModelEnum,
66
- )
67
-
68
- from edu_rdm_integration.enums import (
69
- CommandType,
70
- EntityLevelQueueTypeEnum,
71
- FileUploadStatusEnum,
72
- )
73
- from edu_rdm_integration.uploader_log.managers import (
74
- UploaderClientLogManager,
75
- )
76
- from edu_rdm_integration.utils import (
77
- get_data_command_progress_attachment_path,
78
- get_exporting_data_stage_attachment_path,
79
- )
80
-
81
-
82
- class CollectingDataStageStatus(TitledModelEnum):
83
- """Статус этапа сбора данных."""
84
-
85
- CREATED = ModelEnumValue(
86
- title='Создан',
87
- )
88
-
89
- IN_PROGRESS = ModelEnumValue(
90
- title='В процессе сбора',
91
- )
92
-
93
- FAILED = ModelEnumValue(
94
- title='Завершено с ошибками',
95
- )
96
-
97
- FINISHED = ModelEnumValue(
98
- title='Завершено',
99
- )
100
-
101
- class Meta:
102
- db_table = 'rdm_collecting_data_stage_status'
103
- verbose_name = 'Модель-перечисление статусов этапа сбора данных'
104
- verbose_name_plural = 'Модели-перечисления статусов этапов сбора данных'
105
-
106
-
107
- class CollectingExportedDataStage(ReprStrPreModelMixin, BaseObjectModel):
108
- """Этап подготовки данных в рамках Функций. За работу Функции отвечает ранер менеджер."""
109
-
110
- manager = ForeignKey(
111
- to=Entity,
112
- verbose_name='Менеджер ранера Функции',
113
- on_delete=PROTECT,
114
- null=True,
115
- blank=True,
116
- )
117
-
118
- logs_period_started_at = DateTimeField(
119
- 'Левая граница периода обрабатываемых логов',
120
- db_index=True,
121
- default=get_today_min_datetime,
122
- )
123
-
124
- logs_period_ended_at = DateTimeField(
125
- 'Правая граница периода обрабатываемых логов',
126
- db_index=True,
127
- default=get_today_max_datetime,
128
- )
129
-
130
- started_at = DateTimeField(
131
- 'Время начала сбора данных',
132
- auto_now_add=True,
133
- db_index=True,
134
- )
135
-
136
- ended_at = DateTimeField(
137
- 'Время завершения сбора данных',
138
- null=True,
139
- blank=True,
140
- db_index=True,
141
- )
142
-
143
- status = ForeignKey(
144
- to=CollectingDataStageStatus,
145
- verbose_name='Статус',
146
- on_delete=PROTECT,
147
- default=CollectingDataStageStatus.CREATED.key,
148
- )
149
-
150
- class Meta:
151
- db_table = 'rdm_collecting_exported_data_stage'
152
- verbose_name = 'Этап формирования данных для выгрузки'
153
- verbose_name_plural = 'Этапы формирования данных для выгрузки'
154
-
155
- @property
156
- def attrs_for_repr_str(self):
157
- """Список атрибутов для отображения экземпляра модели."""
158
- return ['manager_id', 'logs_period_started_at', 'logs_period_ended_at', 'started_at', 'ended_at', 'status_id']
159
-
160
- def save(self, *args, **kwargs):
161
- if (
162
- self.status_id in (CollectingDataStageStatus.FAILED.key, CollectingDataStageStatus.FINISHED.key)
163
- and not self.ended_at
164
- ):
165
- self.ended_at = datetime.now()
166
-
167
- super().save(*args, **kwargs)
168
-
169
-
170
- class CollectingDataSubStageStatus(TitledModelEnum):
171
- """Статус этапа сбора данных."""
172
-
173
- CREATED = ModelEnumValue(
174
- title='Создан',
175
- )
176
-
177
- IN_PROGRESS = ModelEnumValue(
178
- title='В процессе сбора',
179
- )
180
-
181
- READY_TO_EXPORT = ModelEnumValue(
182
- title='Готово к выгрузке',
183
- )
184
-
185
- FAILED = ModelEnumValue(
186
- title='Завершено с ошибками',
187
- )
188
-
189
- EXPORTED = ModelEnumValue(
190
- title='Выгружено',
191
- )
192
-
193
- NOT_EXPORTED = ModelEnumValue(
194
- title='Не выгружено',
195
- )
196
-
197
- class Meta:
198
- db_table = 'rdm_collecting_data_sub_stage_status'
199
- verbose_name = 'Модель-перечисление статусов подэтапа сбора данных'
200
- verbose_name_plural = 'Модели-перечисления статусов подэтапов сбора данных'
201
-
202
-
203
- class CollectingExportedDataSubStage(ReprStrPreModelMixin, BaseObjectModel):
204
- """Подэтап сбора данных для сущностей в рамках функции."""
205
-
206
- stage = ForeignKey(
207
- to=CollectingExportedDataStage,
208
- verbose_name='Этап подготовки данных для экспорта',
209
- on_delete=PROTECT,
210
- )
211
-
212
- function = ForeignKey(
213
- to=Entity,
214
- verbose_name='Функция',
215
- on_delete=PROTECT,
216
- )
217
-
218
- started_at = DateTimeField(
219
- 'Время начала сбора данных',
220
- auto_now_add=True,
221
- db_index=True,
222
- )
223
-
224
- ended_at = DateTimeField(
225
- 'Время завершения сбора данных',
226
- null=True,
227
- blank=True,
228
- db_index=True,
229
- )
230
-
231
- previous = ForeignKey(
232
- 'self',
233
- null=True,
234
- blank=True,
235
- verbose_name='Предыдущий сбор данных',
236
- on_delete=CASCADE,
237
- )
238
-
239
- status = ForeignKey(
240
- to=CollectingDataSubStageStatus,
241
- verbose_name='Статус',
242
- on_delete=PROTECT,
243
- default=CollectingDataSubStageStatus.CREATED.key,
244
- )
245
-
246
- class Meta:
247
- db_table = 'rdm_collecting_exported_data_sub_stage'
248
- verbose_name = 'Подэтап формирования данных для выгрузки'
249
- verbose_name_plural = 'Подэтапы формирования данных для выгрузки'
250
-
251
- @property
252
- def attrs_for_repr_str(self):
253
- """Список атрибутов для отображения экземпляра модели."""
254
- return ['stage_id', 'function_id', 'started_at', 'ended_at', 'previous_id', 'status_id']
255
-
256
- def save(self, *args, **kwargs):
257
- if (
258
- self.status_id in (
259
- CollectingDataSubStageStatus.FAILED.key,
260
- CollectingDataSubStageStatus.READY_TO_EXPORT.key
261
- )
262
- and not self.ended_at
263
- ):
264
- self.ended_at = datetime.now()
265
-
266
- super().save(*args, **kwargs)
267
-
268
-
269
- class ExportingDataStageStatus(TitledModelEnum):
270
- """
271
- Статус этапа выгрузки данных.
272
- """
273
-
274
- CREATED = ModelEnumValue(
275
- title='Создан',
276
- )
277
-
278
- IN_PROGRESS = ModelEnumValue(
279
- title='В процессе',
280
- )
281
-
282
- FAILED = ModelEnumValue(
283
- title='Завершено с ошибками',
284
- )
285
-
286
- FINISHED = ModelEnumValue(
287
- title='Завершено',
288
- )
289
-
290
- class Meta:
291
- db_table = 'rdm_exporting_data_stage_status'
292
- verbose_name = 'Модель-перечисление статусов этапа выгрузки данных'
293
- verbose_name_plural = 'Модели-перечисления статусов этапов выгрузки данных'
294
-
295
-
296
- class ExportingDataStage(ReprStrPreModelMixin, BaseObjectModel):
297
- """
298
- Этап выгрузки данных.
299
- """
300
-
301
- manager = ForeignKey(
302
- to=Entity,
303
- verbose_name='Менеджер ранера Функции',
304
- on_delete=PROTECT,
305
- null=True,
306
- blank=True,
307
- )
308
-
309
- period_started_at = DateTimeField(
310
- 'Левая граница периода выборки данных для выгрузки',
311
- db_index=True,
312
- )
313
-
314
- period_ended_at = DateTimeField(
315
- 'Правая граница периода выборки данных для выгрузки',
316
- db_index=True,
317
- )
318
-
319
- started_at = DateTimeField(
320
- 'Время начала выгрузки данных',
321
- auto_now_add=True,
322
- )
323
-
324
- ended_at = DateTimeField(
325
- 'Время завершения выгрузки данных',
326
- null=True,
327
- blank=True,
328
- )
329
-
330
- status = ForeignKey(
331
- to=ExportingDataStageStatus,
332
- verbose_name='Статус',
333
- on_delete=PROTECT,
334
- default=ExportingDataStageStatus.CREATED.key,
335
- )
336
-
337
- class Meta:
338
- db_table = 'rdm_exporting_data_stage'
339
- verbose_name = 'Этап формирования данных для выгрузки'
340
- verbose_name_plural = 'Этапы формирования данных для выгрузки'
341
-
342
- @property
343
- def attrs_for_repr_str(self):
344
- """Список атрибутов для отображения экземпляра модели."""
345
- return ['manager_id', 'started_at', 'ended_at', 'status_id']
346
-
347
- def save(self, *args, **kwargs):
348
- if (
349
- self.status_id in (ExportingDataStageStatus.FAILED.key, ExportingDataStageStatus.FINISHED.key)
350
- and not self.ended_at
351
- ):
352
- self.ended_at = datetime.now()
353
-
354
- super().save(*args, **kwargs)
355
-
356
-
357
- class ExportingDataSubStageStatus(TitledModelEnum):
358
- """Модель-перечисление статусов этапа выгрузки данных."""
359
-
360
- CREATED = ModelEnumValue(
361
- title='Создан',
362
- )
363
-
364
- IN_PROGRESS = ModelEnumValue(
365
- title='Запущен',
366
- )
367
-
368
- FAILED = ModelEnumValue(
369
- title='Завершено с ошибками',
370
- )
371
-
372
- FINISHED = ModelEnumValue(
373
- title='Завершен',
374
- )
375
- READY_FOR_EXPORT = ModelEnumValue(
376
- title='Готов к выгрузке',
377
- )
378
- PROCESS_ERROR = ModelEnumValue(
379
- title='Ошибка обработки витриной'
380
- )
381
-
382
- class Meta:
383
- db_table = 'rdm_exporting_data_sub_stage_status'
384
- verbose_name = 'Модель-перечисление статусов подэтапа выгрузки данных'
385
- verbose_name_plural = 'Модели-перечисления статусов подэтапов выгрузки данных'
386
-
387
-
388
- class ExportingDataSubStage(ReprStrPreModelMixin, BaseObjectModel):
389
- """
390
- Подэтап выгрузки данных.
391
- """
392
-
393
- function = ForeignKey(
394
- to=Entity,
395
- verbose_name='Функция',
396
- on_delete=PROTECT,
397
- null=True,
398
- blank=True,
399
- )
400
-
401
- stage = ForeignKey(
402
- to=ExportingDataStage,
403
- verbose_name='Этап выгрузки данных',
404
- on_delete=CASCADE,
405
- )
406
-
407
- started_at = DateTimeField(
408
- verbose_name='Время начала сбора данных',
409
- auto_now_add=True,
410
- db_index=True,
411
- )
412
-
413
- ended_at = DateTimeField(
414
- verbose_name='Время завершения сбора данных',
415
- null=True,
416
- blank=True,
417
- db_index=True,
418
- )
419
-
420
- status = ForeignKey(
421
- to=ExportingDataSubStageStatus,
422
- verbose_name='Статус',
423
- on_delete=PROTECT,
424
- default=ExportingDataSubStageStatus.CREATED.key,
425
- )
426
-
427
- class Meta:
428
- db_table = 'rdm_exporting_data_sub_stage'
429
- verbose_name = 'Стадия выгрузки данных'
430
- verbose_name_plural = 'Стадии выгрузки данных'
431
-
432
- @property
433
- def attrs_for_repr_str(self):
434
- """Список атрибутов для отображения экземпляра модели."""
435
- return ['function_id', 'collecting_data_sub_stage_id', 'stage_id', 'started_at', 'ended_at', 'status_id']
436
-
437
- def save(self, *args, **kwargs):
438
- """Сохранение экземпляра модели."""
439
- if (
440
- self.status_id in {
441
- ExportingDataSubStageStatus.FAILED.key,
442
- ExportingDataSubStageStatus.FINISHED.key,
443
- ExportingDataSubStageStatus.READY_FOR_EXPORT.key,
444
- }
445
- and not self.ended_at
446
- ):
447
- self.ended_at = datetime.now()
448
-
449
- super().save(*args, **kwargs)
450
-
451
-
452
- class ExportingDataSubStageAttachment(ReprStrPreModelMixin, BaseObjectModel):
453
- """
454
- Сгенерированный файл для дальнейшей выгрузки в "Региональная витрина данных".
455
- """
456
-
457
- exporting_data_sub_stage = ForeignKey(
458
- to=ExportingDataSubStage,
459
- verbose_name='Подэтап выгрузки данных',
460
- on_delete=CASCADE,
461
- )
462
-
463
- # TODO PYTD-22 В зависимости от принятого решения по инструменту ограничения доступа к media-файлам, нужно будет
464
- # изменить тип поля или оставить как есть
465
- attachment = FileField(
466
- verbose_name='Сгенерированный файл',
467
- upload_to=get_exporting_data_stage_attachment_path,
468
- max_length=512,
469
- null=True,
470
- blank=True,
471
- )
472
-
473
- operation = SmallIntegerField(
474
- verbose_name='Действие',
475
- choices=EntityLogOperation.get_choices(),
476
- )
477
-
478
- created = DateTimeField(
479
- verbose_name='Дата создания',
480
- auto_now_add=True,
481
- null=True,
482
- blank=True,
483
- )
484
- modified = DateTimeField(
485
- verbose_name='Дата изменения',
486
- auto_now=True,
487
- null=True,
488
- blank=True,
489
- )
490
- attachment_size = PositiveIntegerField(
491
- null=True,
492
- verbose_name='Размер файла (байт)'
493
- )
494
-
495
- class Meta:
496
- db_table = 'rdm_exporting_data_sub_stage_attachment'
497
- verbose_name = 'Сгенерированный файл для дальнейшей выгрузки в "Региональная витрина данных"'
498
- verbose_name_plural = 'Сгенерированные файлы для дальнейшей выгрузки в "Региональная витрина данных"'
499
-
500
- @property
501
- def attrs_for_repr_str(self):
502
- """Список атрибутов для отображения экземпляра модели."""
503
- return ['exporting_data_sub_stage_id', 'attachment', 'operation', 'created', 'modified']
504
-
505
-
506
- class DataMartRequestStatus(TitledIntegerModelEnum):
507
- """Модель-перечисление статусов загрузки данных в Витрину."""
508
-
509
- UPLOAD_TO_BUFFER = ModelEnumValue(
510
- value=-1,
511
- title='Загрузка данных в буффер',
512
- )
513
-
514
- BUFFERED = ModelEnumValue(
515
- value=0,
516
- title='Запрос буфферизирован',
517
- )
518
-
519
- WAIT_FOR_OPEN_DELTA = ModelEnumValue(
520
- value=1,
521
- title='Ожидает открытия дельты',
522
- )
523
-
524
- IN_PROCESSING = ModelEnumValue(
525
- value=2,
526
- title='В обработке',
527
- )
528
-
529
- SUCCESSFULLY_PROCESSED = ModelEnumValue(
530
- value=3,
531
- title='Успешно обработан',
532
- )
533
-
534
- FAILED_PROCESSING = ModelEnumValue(
535
- value=4,
536
- title='Ошибка обработки запроса',
537
- )
538
-
539
- REQUEST_ID_NOT_FOUND = ModelEnumValue(
540
- value=5,
541
- title='Идентификатор запроса не обнаружен',
542
- )
543
-
544
- FORMAT_LOGICAL_CONTROL = ModelEnumValue(
545
- value=6,
546
- title='Форматно-логический контроль',
547
- )
548
-
549
- FLC_ERROR = ModelEnumValue(
550
- value=7,
551
- title='Ошибки ФЛК',
552
- )
553
-
554
- class Meta:
555
- db_table = 'rdm_request_status'
556
- verbose_name = 'Статус загрузки данных в Витрину'
557
- verbose_name_plural = 'Статусы загрузки данных в Витрину'
558
-
559
-
560
- class ExportingDataSubStageUploaderClientLog(ReprStrPreModelMixin, BaseObjectModel):
561
- """
562
- Связь лога Загрузчика данных с подэтапом выгрузки данных.
563
- """
564
-
565
- entry = ForeignKey(
566
- to=Entry,
567
- verbose_name='Лог запроса и ответа',
568
- on_delete=CASCADE,
569
- related_name='uploader_client_log',
570
- )
571
-
572
- sub_stage = ForeignKey(
573
- to=ExportingDataSubStage,
574
- verbose_name='Подэтап выгрузки данных',
575
- on_delete=CASCADE,
576
- )
577
-
578
- attachment = ForeignKey(
579
- to=ExportingDataSubStageAttachment,
580
- verbose_name='Прикрепленный файл',
581
- on_delete=CASCADE,
582
- )
583
-
584
- request_id = CharField(
585
- verbose_name='Id запроса загрузки в витрину',
586
- max_length=100,
587
- blank=True,
588
- db_index=True,
589
- )
590
-
591
- is_emulation = BooleanField(
592
- verbose_name='Включен режим эмуляции',
593
- default=False,
594
- )
595
-
596
- file_upload_status = SmallIntegerField(
597
- verbose_name='Общий статус загрузки файла в витрину',
598
- choices=FileUploadStatusEnum.get_choices(),
599
- null=True,
600
- blank=True,
601
- )
602
-
603
- created = DateTimeField(
604
- verbose_name='Дата создания',
605
- auto_now_add=True,
606
- null=True,
607
- blank=True,
608
- db_index=True,
609
- )
610
- modified = DateTimeField(
611
- verbose_name='Дата изменения',
612
- auto_now=True,
613
- null=True,
614
- blank=True,
615
- db_index=True,
616
- )
617
-
618
- class Meta:
619
- db_table = 'rdm_exporting_data_sub_stage_uploader_client_log'
620
- verbose_name = 'Лог запроса подэтапа выгрузки данных'
621
- verbose_name_plural = 'Лог запроса подэтапа выгрузки данных'
622
-
623
-
624
- class UploadStatusRequestLog(ReprStrPreModelMixin, BaseObjectModel):
625
- """
626
- Модель связывающая статусы, загрузку файла в витрину и http-запрос к витрине.
627
- """
628
-
629
- upload = ForeignKey(
630
- verbose_name='Cвязь запроса статуса с загрузкой файла в витрину',
631
- to=ExportingDataSubStageUploaderClientLog,
632
- on_delete=CASCADE,
633
- )
634
- entry = ForeignKey(
635
- verbose_name='Cвязь запроса статуса с запросом в витрину',
636
- to=Entry,
637
- on_delete=CASCADE,
638
- related_name='upload_status_request_log',
639
- )
640
- request_status = ForeignKey(
641
- verbose_name='Статус запроса в витрине',
642
- to=DataMartRequestStatus,
643
- on_delete=PROTECT,
644
- null=True,
645
- blank=True,
646
- )
647
-
648
- class Meta:
649
- db_table = 'rdm_upload_status_request_log'
650
- verbose_name = 'Лог запроса подэтапа выгрузки данных'
651
- verbose_name_plural = 'Логи запроса подэтапа выгрузки данных'
652
-
653
-
654
- class BaseEntityModel(ReprStrPreModelMixin, BaseObjectModel):
655
- """Базовая модель сущности."""
656
-
657
- collecting_sub_stage = ForeignKey(
658
- verbose_name='Подэтап сбора данных сущности',
659
- to=CollectingExportedDataSubStage,
660
- on_delete=CASCADE,
661
- )
662
- exporting_sub_stage = ForeignKey(
663
- verbose_name='Подэтап выгрузки',
664
- to=ExportingDataSubStage,
665
- blank=True,
666
- null=True,
667
- on_delete=CASCADE,
668
- )
669
- operation = SmallIntegerField(
670
- verbose_name='Действие',
671
- choices=EntityLogOperation.get_choices(),
672
- )
673
-
674
- created = DateTimeField(
675
- verbose_name='Дата создания',
676
- auto_now_add=True,
677
- null=True,
678
- blank=True,
679
- db_index=True,
680
- )
681
- modified = DateTimeField(
682
- verbose_name='Дата изменения',
683
- auto_now=True,
684
- null=True,
685
- blank=True,
686
- db_index=True,
687
- )
688
-
689
- @property
690
- def attrs_for_repr_str(self):
691
- """Список атрибутов для отображения экземпляра модели."""
692
- return ['collecting_sub_stage', 'exporting_sub_stage', 'operation', 'created', 'modified']
693
-
694
- class Meta:
695
- abstract = True
696
-
697
-
698
- class RegionalDataMartModelEnum(TitledModelEnum):
699
- """Модель-перечисление моделей "Региональная витрина данных"."""
700
-
701
- class Meta:
702
- db_table = 'rdm_model'
703
- extensible = True
704
- verbose_name = 'Модель-перечисление моделей "Региональной витрины данных"'
705
- verbose_name_plural = 'Модели-перечисления моделей "Региональной витрины данных"'
706
-
707
-
708
- class RegionalDataMartEntityEnum(TitledModelEnum):
709
- """Модель-перечисление сущностей выгрузки в Региональная витрина данных.
710
-
711
- Поля:
712
- entity - data-класс сущности;
713
- main_model_enum - значение модели-перечисления RegionalDataMartModelEnum основной модели РВД для формирования
714
- данных сущности. Обычно это модель идентификаторы записей которой соответствуют идентификаторам в записях
715
- сущности. У этих записей проставляется подэтап выгрузки данных;
716
- additional_model_enums - кортеж значений модели-перечисления RegionalDataMartModelEnum с дополнительными
717
- моделями РВД, которые участвуют в формировании записей сущностей. Они показывают, что перед запуском
718
- экспорта данных сущности по ним и основной модели должен быть запущен сбор данных.
719
- """
720
-
721
- class Meta:
722
- db_table = 'rdm_entity'
723
- extensible = True
724
- verbose_name = 'Модель-перечисление сущностей "Региональной витрины данных"'
725
- verbose_name_plural = 'Модели-перечисления сущностей "Региональной витрины данных"'
726
-
727
- @property
728
- def model_enums(self):
729
- """Возвращает модели, от которых зависит сущность."""
730
- value = self.model_enum_value
731
-
732
- return self.get_model_enums_from_value(value=value)
733
-
734
- @staticmethod
735
- def get_model_enums_from_value(value: ModelEnumValue):
736
- """Получение значений модели-перечисления моделей по значению модели-перечисления сущностей."""
737
- model_enums = [value.main_model_enum, *value.additional_model_enums]
738
-
739
- return model_enums
740
-
741
- @classmethod
742
- def get_entities_model_enums(
743
- cls,
744
- entity_enums: list[ModelEnumValue],
745
- is_sorted: bool = True,
746
- ) -> list[ModelEnumValue]:
747
- """Получение списка значений модели-перечисления моделей RegionalDataMartModelEnum.
748
-
749
- Args:
750
- entity_enums: Список значений модели-перечисления сущностей RegionalDataMartEntityEnum;
751
- is_sorted: Необходимость сортировки значений модели-перечисления RegionalDataMartModelEnum по полю
752
- order_number.
753
- """
754
- model_enums = set()
755
-
756
- for entity_enum_value in entity_enums:
757
- model_enums.update(cls.get_model_enums_from_value(value=entity_enum_value))
758
-
759
- model_enums = list(model_enums)
760
-
761
- if is_sorted:
762
- model_enums = sorted(model_enums, key=lambda value: value.order_number)
763
-
764
- return model_enums
765
-
766
-
767
- class AbstractCollectDataCommandProgress(ReprStrPreModelMixin, BaseObjectModel):
768
- """
769
- Модель, хранящая данные для формирования и отслеживания асинхронных задач по сбору данных.
770
-
771
- В реализации необходимо определить поля:
772
- 1. Ссылку на асинхронную задачу, например:
773
- task = ForeignKey(
774
- to=RunningTask,
775
- verbose_name='Асинхронная задача',
776
- blank=True, null=True,
777
- on_delete=SET_NULL,
778
- )
779
- 2. Поле хранения лога:
780
- logs_link = FileField(
781
- upload_to=upload_file_handler,
782
- max_length=255,
783
- verbose_name='Ссылка на файл логов',
784
- )
785
- """
786
-
787
- task = ...
788
-
789
- logs_link = ...
790
-
791
- stage = ForeignKey(
792
- to=CollectingExportedDataStage,
793
- verbose_name='Этап формирования данных для выгрузки',
794
- blank=True,
795
- null=True,
796
- on_delete=SET_NULL,
797
- )
798
- model = ForeignKey(
799
- to=RegionalDataMartModelEnum,
800
- verbose_name='Модель РВД',
801
- on_delete=PROTECT,
802
- )
803
- created = DateTimeField(
804
- verbose_name='Дата создания',
805
- default=timezone.now,
806
- )
807
- logs_period_started_at = DateTimeField(
808
- 'Левая граница периода обрабатываемых логов',
809
- )
810
- logs_period_ended_at = DateTimeField(
811
- 'Правая граница периода обрабатываемых логов',
812
- )
813
- generation_id = UUIDField(
814
- 'Идентификатор генерации',
815
- default=uuid.uuid4,
816
- )
817
- institute_ids = JSONField(
818
- 'id учебного заведения',
819
- blank=True,
820
- null=True,
821
- default=list,
822
- )
823
-
824
- class Meta:
825
- abstract = True
826
- db_table = 'rdm_collecting_data_command_progress'
827
- verbose_name = 'Задача по сбору данных'
828
- verbose_name_plural = 'Задачи по сбору данных'
829
-
830
-
831
- class AbstractExportDataCommandProgress(ReprStrPreModelMixin, BaseObjectModel):
832
- """Команда экспорта данных."""
833
-
834
- task = ...
835
-
836
- logs_link = ...
837
-
838
- stage = ForeignKey(
839
- to=ExportingDataStage,
840
- verbose_name='Этап выгрузки данных',
841
- null=True,
842
- blank=True,
843
- on_delete=SET_NULL,
844
- )
845
- entity = ForeignKey(
846
- to=RegionalDataMartEntityEnum,
847
- verbose_name='Сущность РВД',
848
- on_delete=PROTECT,
849
- )
850
- created = DateTimeField(
851
- verbose_name='Дата создания',
852
- default=timezone.now,
853
- )
854
- period_started_at = DateTimeField(
855
- 'Левая граница периода выборки данных для выгрузки',
856
- )
857
- period_ended_at = DateTimeField(
858
- 'Правая граница периода выборки данных для выгрузки',
859
- )
860
- generation_id = UUIDField(
861
- 'Идентификатор генерации',
862
- default=uuid.uuid4,
863
- )
864
-
865
- class Meta:
866
- abstract = True
867
- db_table = 'rdm_exporting_data_command_progress'
868
- verbose_name = 'Команда экспорта данных'
869
- verbose_name_plural = 'Команды экспорта данных'
870
-
871
-
872
- class UploaderClientLog(Entry):
873
- """Прокси модель Загрузчика данных в витрину."""
874
-
875
- objects = UploaderClientLogManager()
876
- base_objects = Manager()
877
-
878
- @cached_property
879
- def http_method_and_url(self) -> tuple[str, str]:
880
- """Возвращает http-метод и url из поля запроса Entry.request."""
881
- request = StringIO(self.request)
882
- request_first_line = request.readline()
883
- request.close()
884
-
885
- method, url = request_first_line.split(' ')[:2]
886
- if not (method and url.startswith('http')):
887
- method = url = ''
888
-
889
- return method.strip('[]'), url
890
-
891
- @cached_property
892
- def http_response_status(self) -> Optional[str]:
893
- """Статус-код запроса к витрине."""
894
- try:
895
- http_status = self.response.split(' ')[0].strip('[]')
896
-
897
- if not http_status:
898
- return None
899
-
900
- if 200 <= int(http_status) < 300:
901
- http_status = 'Успех'
902
- elif int(http_status) >= 400:
903
- http_status = 'Ошибка'
904
- except (IndexError, AttributeError):
905
- http_status = None
906
-
907
- return http_status
908
-
909
- @property
910
- def http_method(self) -> str:
911
- """Значение http-метода."""
912
- return self.http_method_and_url[0]
913
-
914
- @property
915
- def request_url(self) -> str:
916
- """URL запроса."""
917
- return self.http_method_and_url[1]
918
-
919
- @property
920
- def request_error(self) -> Optional[str]:
921
- """Ошибка запроса."""
922
- return self.error
923
-
924
- @property
925
- def result_status_display(self) -> str:
926
- """Результат запроса."""
927
- result_status = getattr(self, 'result_status', RequestResultStatus.ERROR)
928
-
929
- return RequestResultStatus.values.get(result_status) or RequestResultStatus.values[RequestResultStatus.ERROR]
930
-
931
- class Meta:
932
- proxy = True
933
-
934
-
935
- class TransferredEntity(BaseObjectModel):
936
- """Сущность, по которой должен быть произведен сбор и экспорт данных."""
937
-
938
- entity = OneToOneField(
939
- to=RegionalDataMartEntityEnum,
940
- verbose_name='Сущность',
941
- on_delete=CASCADE,
942
- )
943
- export_enabled = BooleanField(
944
- verbose_name='Включение экспорта для сущности',
945
- default=True,
946
- )
947
- queue_level = PositiveIntegerField(
948
- choices=EntityLevelQueueTypeEnum.get_choices(),
949
- default=EntityLevelQueueTypeEnum.BASE,
950
- verbose_name='Уровень очереди',
951
- )
952
-
953
- class Meta:
954
- db_table = 'rdm_transferred_entity'
955
- verbose_name = 'Сущность, по которой должен быть произведен сбор и экспорт данных'
956
- verbose_name_plural = 'Сущности, по которым должен быть произведен сбор и экспорт данных'
957
-
958
- @json_encode
959
- def no_export(self):
960
- """Формирует отображение признака отключения экспорта."""
961
- return 'Нет' if self.export_enabled else 'Да'
962
-
963
-
964
- class ExportingDataSubStageEntity(BaseObjectModel):
965
- """Модель связи сущности и подэтапа выгрузки."""
966
-
967
- entity = ForeignKey(
968
- to=RegionalDataMartEntityEnum,
969
- verbose_name='Сущность РВД',
970
- on_delete=PROTECT,
971
- )
972
-
973
- exporting_data_sub_stage = ForeignKey(
974
- to=ExportingDataSubStage,
975
- verbose_name='Подэтап выгрузки данных',
976
- on_delete=CASCADE,
977
- )
978
-
979
- class Meta:
980
- db_table = 'rdm_exporting_data_sub_stage_entity'
981
- verbose_name = 'Связь сущности и подэтапа выгрузки'
982
- verbose_name_plural = 'Связи сущности и подэтапа выгрузки'