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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. edu_rdm_integration/__init__.py +0 -1
  2. edu_rdm_integration/adapters/apps.py +15 -2
  3. edu_rdm_integration/adapters/caches.py +25 -12
  4. edu_rdm_integration/adapters/errors.py +13 -2
  5. edu_rdm_integration/adapters/functions.py +53 -14
  6. edu_rdm_integration/adapters/helpers.py +34 -8
  7. edu_rdm_integration/adapters/managers.py +41 -5
  8. edu_rdm_integration/adapters/presenters.py +26 -2
  9. edu_rdm_integration/adapters/receivers.py +16 -2
  10. edu_rdm_integration/adapters/results.py +50 -4
  11. edu_rdm_integration/adapters/runners.py +79 -20
  12. edu_rdm_integration/adapters/strategies.py +56 -54
  13. edu_rdm_integration/adapters/validators.py +43 -4
  14. edu_rdm_integration/apps.py +3 -23
  15. edu_rdm_integration/collect_and_export_data/__init__.py +1 -1
  16. edu_rdm_integration/collect_and_export_data/apps.py +1 -0
  17. edu_rdm_integration/collect_and_export_data/migrations/0001_initial.py +107 -17
  18. edu_rdm_integration/collect_and_export_data/migrations/0002_auto_20250204_1413.py +4 -2
  19. edu_rdm_integration/{consts.py → core/consts.py} +0 -11
  20. edu_rdm_integration/{enums.py → core/enums.py} +7 -54
  21. edu_rdm_integration/core/helpers.py +331 -0
  22. edu_rdm_integration/core/operations.py +71 -0
  23. edu_rdm_integration/core/redis_cache.py +20 -0
  24. edu_rdm_integration/{collect_and_export_data → core/registry}/actions.py +6 -12
  25. edu_rdm_integration/core/registry/apps.py +11 -0
  26. edu_rdm_integration/{collect_and_export_data → core/registry}/ui.py +1 -1
  27. edu_rdm_integration/{storages.py → core/storages.py} +8 -17
  28. edu_rdm_integration/{utils.py → core/utils.py} +29 -91
  29. edu_rdm_integration/migrations/0001_initial.py +294 -44
  30. edu_rdm_integration/migrations/0002_init_data_uploadstatus.py +1 -3
  31. edu_rdm_integration/migrations/0003_create_index_file_upload_status.py +0 -1
  32. edu_rdm_integration/migrations/0004_uploaderclientlog.py +1 -2
  33. edu_rdm_integration/migrations/0005_auto_20231204_1224.py +16 -4
  34. edu_rdm_integration/migrations/0006_request_status_data.py +60 -58
  35. edu_rdm_integration/migrations/0007_delete_upload_status.py +0 -1
  36. edu_rdm_integration/migrations/0009_auto_20240522_1619.py +1 -5
  37. edu_rdm_integration/migrations/0010_transferredentity_export_enabled.py +0 -1
  38. edu_rdm_integration/migrations/0011_exportingdatasubstageentity.py +16 -3
  39. edu_rdm_integration/migrations/0012_exportingdatasubstageattachment_attachment_size.py +0 -1
  40. edu_rdm_integration/migrations/0013_set_attachment_size.py +8 -12
  41. edu_rdm_integration/migrations/0014_uploaddatacommand.py +33 -6
  42. edu_rdm_integration/migrations/0015_set_exporting_sub_stage_status.py +1 -5
  43. edu_rdm_integration/migrations/0016_transferredentity_queue_level.py +2 -2
  44. edu_rdm_integration/migrations/0017_delete_uploaddatacommand.py +3 -2
  45. edu_rdm_integration/migrations/__init__.py +1 -0
  46. edu_rdm_integration/{registry → pipelines/transfer}/actions.py +13 -26
  47. edu_rdm_integration/pipelines/transfer/app_meta.py +18 -0
  48. edu_rdm_integration/pipelines/transfer/apps.py +19 -0
  49. edu_rdm_integration/pipelines/transfer/enums.py +34 -0
  50. edu_rdm_integration/pipelines/transfer/migrations/0001_initial.py +57 -0
  51. edu_rdm_integration/{base.py → pipelines/transfer/mixins.py} +29 -53
  52. edu_rdm_integration/pipelines/transfer/models.py +48 -0
  53. edu_rdm_integration/{tasks.py → pipelines/transfer/tasks.py} +51 -150
  54. edu_rdm_integration/{registry → pipelines/transfer}/ui.py +4 -10
  55. edu_rdm_integration/rdm_entities/apps.py +11 -0
  56. edu_rdm_integration/{entities.py → rdm_entities/entities.py} +67 -57
  57. edu_rdm_integration/rdm_entities/migrations/0001_initial.py +44 -0
  58. edu_rdm_integration/{enum_register → rdm_entities}/mixins.py +8 -59
  59. edu_rdm_integration/rdm_entities/models.py +63 -0
  60. edu_rdm_integration/rdm_entities/utils.py +33 -0
  61. edu_rdm_integration/rdm_models/apps.py +16 -0
  62. edu_rdm_integration/rdm_models/migrations/0001_initial.py +40 -0
  63. edu_rdm_integration/rdm_models/mixins.py +67 -0
  64. edu_rdm_integration/rdm_models/models.py +73 -0
  65. edu_rdm_integration/rdm_models/utils.py +23 -0
  66. edu_rdm_integration/stages/collect_data/apps.py +11 -0
  67. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/functions.py-tpl +2 -2
  68. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/managers.py-tpl +1 -1
  69. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/runners.py-tpl +1 -1
  70. edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/tests.py-tpl +2 -1
  71. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/caches.py +2 -2
  72. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/functions.py +15 -18
  73. edu_rdm_integration/stages/collect_data/functions/base/helpers.py +20 -0
  74. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/managers.py +20 -27
  75. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/mixins.py +38 -55
  76. edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/runners.py +2 -5
  77. edu_rdm_integration/stages/collect_data/functions/calculated/base/__init__.py +0 -0
  78. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/caches.py +3 -7
  79. edu_rdm_integration/stages/collect_data/functions/calculated/base/errors.py +7 -0
  80. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/functions.py +8 -16
  81. edu_rdm_integration/stages/collect_data/functions/calculated/base/helpers.py +24 -0
  82. edu_rdm_integration/stages/collect_data/functions/calculated/base/managers.py +19 -0
  83. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/presenters.py +1 -3
  84. edu_rdm_integration/stages/collect_data/functions/calculated/base/results.py +12 -0
  85. edu_rdm_integration/stages/collect_data/functions/calculated/base/runners.py +28 -0
  86. edu_rdm_integration/stages/collect_data/functions/calculated/base/validators.py +20 -0
  87. edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/strategies.py +32 -70
  88. edu_rdm_integration/stages/collect_data/functions/non_calculated/__init__.py +0 -0
  89. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/__init__.py +0 -0
  90. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/caches.py +13 -22
  91. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/errors.py +7 -0
  92. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/functions.py +8 -16
  93. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/helpers.py +24 -0
  94. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/managers.py +19 -0
  95. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/presenters.py +1 -3
  96. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/results.py +12 -0
  97. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/runners.py +28 -0
  98. edu_rdm_integration/stages/collect_data/functions/non_calculated/base/validators.py +20 -0
  99. edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/strategies.py +32 -70
  100. edu_rdm_integration/{collect_data → stages/collect_data}/generators.py +9 -14
  101. edu_rdm_integration/stages/collect_data/helpers.py +154 -0
  102. edu_rdm_integration/stages/collect_data/management/__init__.py +0 -0
  103. edu_rdm_integration/stages/collect_data/management/base.py +100 -0
  104. edu_rdm_integration/stages/collect_data/management/commands/__init__.py +0 -0
  105. edu_rdm_integration/{management → stages/collect_data/management}/commands/collect_latest_models_data.py +5 -7
  106. edu_rdm_integration/{management → stages/collect_data/management}/commands/collect_models_data.py +5 -7
  107. edu_rdm_integration/stages/collect_data/migrations/0001_initial.py +187 -0
  108. edu_rdm_integration/stages/collect_data/migrations/0002_edurdmcollectdatacommandprogress.py +105 -0
  109. edu_rdm_integration/stages/collect_data/migrations/__init__.py +0 -0
  110. edu_rdm_integration/stages/collect_data/mixins.py +56 -0
  111. edu_rdm_integration/stages/collect_data/models.py +318 -0
  112. edu_rdm_integration/{collect_data/collect.py → stages/collect_data/operations.py} +30 -43
  113. edu_rdm_integration/stages/collect_data/registry/__init__.py +0 -0
  114. edu_rdm_integration/{collect_data → stages/collect_data/registry}/actions.py +17 -20
  115. edu_rdm_integration/stages/collect_data/registry/apps.py +11 -0
  116. edu_rdm_integration/{collect_data → stages/collect_data/registry}/ui.py +8 -15
  117. edu_rdm_integration/{collect_data → stages/collect_data}/tests.py +2 -2
  118. edu_rdm_integration/stages/export_data/__init__.py +0 -0
  119. edu_rdm_integration/stages/export_data/apps.py +11 -0
  120. edu_rdm_integration/stages/export_data/function_templates/__init__.py +0 -0
  121. edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/functions.py-tpl +2 -2
  122. edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/managers.py-tpl +2 -2
  123. edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/runners.py-tpl +2 -2
  124. edu_rdm_integration/stages/export_data/functions/__init__.py +0 -0
  125. edu_rdm_integration/stages/export_data/functions/base/__init__.py +0 -0
  126. edu_rdm_integration/{export_data → stages/export_data/functions}/base/caches.py +3 -8
  127. edu_rdm_integration/stages/export_data/functions/base/errors.py +7 -0
  128. edu_rdm_integration/{export_data → stages/export_data/functions}/base/functions.py +28 -59
  129. edu_rdm_integration/{export_data → stages/export_data/functions}/base/helpers.py +7 -17
  130. edu_rdm_integration/{export_data → stages/export_data/functions}/base/managers.py +19 -28
  131. edu_rdm_integration/stages/export_data/functions/base/presenters.py +11 -0
  132. edu_rdm_integration/{export_data → stages/export_data/functions}/base/requests.py +13 -40
  133. edu_rdm_integration/stages/export_data/functions/base/results.py +12 -0
  134. edu_rdm_integration/{export_data → stages/export_data/functions}/base/runners.py +9 -21
  135. edu_rdm_integration/stages/export_data/functions/base/validators.py +20 -0
  136. edu_rdm_integration/{export_data → stages/export_data}/generators.py +7 -6
  137. edu_rdm_integration/stages/export_data/helpers.py +203 -0
  138. edu_rdm_integration/stages/export_data/management/__init__.py +0 -0
  139. edu_rdm_integration/stages/export_data/management/base.py +101 -0
  140. edu_rdm_integration/stages/export_data/management/commands/__init__.py +0 -0
  141. edu_rdm_integration/{management → stages/export_data/management}/commands/export_entities_data.py +5 -7
  142. edu_rdm_integration/{management → stages/export_data/management}/commands/export_latest_entities_data.py +5 -7
  143. edu_rdm_integration/stages/export_data/migrations/0001_initial.py +324 -0
  144. edu_rdm_integration/stages/export_data/migrations/__init__.py +0 -0
  145. edu_rdm_integration/stages/export_data/mixins.py +50 -0
  146. edu_rdm_integration/stages/export_data/models.py +362 -0
  147. edu_rdm_integration/{export_data/export.py → stages/export_data/operations.py} +30 -192
  148. edu_rdm_integration/stages/export_data/registry/__init__.py +0 -0
  149. edu_rdm_integration/{export_data → stages/export_data/registry}/actions.py +18 -18
  150. edu_rdm_integration/stages/export_data/registry/apps.py +11 -0
  151. edu_rdm_integration/{export_data → stages/export_data/registry}/ui.py +5 -7
  152. edu_rdm_integration/{export_data → stages/export_data}/strategies.py +30 -68
  153. edu_rdm_integration/stages/service/__init__.py +0 -0
  154. edu_rdm_integration/stages/service/apps.py +19 -0
  155. edu_rdm_integration/stages/service/tasks.py +63 -0
  156. edu_rdm_integration/stages/upload_data/__init__.py +0 -0
  157. edu_rdm_integration/stages/upload_data/apps.py +19 -0
  158. edu_rdm_integration/stages/upload_data/consts.py +10 -0
  159. edu_rdm_integration/{export_data → stages/upload_data}/dataclasses.py +1 -0
  160. edu_rdm_integration/stages/upload_data/enums.py +17 -0
  161. edu_rdm_integration/{export_data/export_manager.py → stages/upload_data/export_managers.py} +73 -68
  162. edu_rdm_integration/stages/upload_data/helpers.py +164 -0
  163. edu_rdm_integration/stages/upload_data/management/__init__.py +0 -0
  164. edu_rdm_integration/stages/upload_data/management/base.py +134 -0
  165. edu_rdm_integration/stages/upload_data/management/commands/__init__.py +0 -0
  166. edu_rdm_integration/{management → stages/upload_data/management}/commands/async_fix_attachment_size.py +32 -54
  167. edu_rdm_integration/{management → stages/upload_data/management}/commands/check_upload_status.py +7 -6
  168. edu_rdm_integration/{management → stages/upload_data/management}/commands/datamart_status.py +3 -3
  169. edu_rdm_integration/{management → stages/upload_data/management}/commands/datamart_upload.py +4 -4
  170. edu_rdm_integration/stages/upload_data/migrations/0001_initial.py +161 -0
  171. edu_rdm_integration/stages/upload_data/migrations/__init__.py +0 -0
  172. edu_rdm_integration/stages/upload_data/models.py +175 -0
  173. edu_rdm_integration/stages/upload_data/operations.py +156 -0
  174. edu_rdm_integration/{export_data/queue.py → stages/upload_data/queues.py} +10 -8
  175. edu_rdm_integration/stages/upload_data/tasks.py +103 -0
  176. edu_rdm_integration/stages/upload_data/uploader_log/__init__.py +0 -0
  177. edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/actions.py +14 -16
  178. edu_rdm_integration/stages/upload_data/uploader_log/apps.py +11 -0
  179. edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/managers.py +15 -30
  180. edu_rdm_integration/stages/upload_data/uploader_log/migrations/0001_initial.py +31 -0
  181. edu_rdm_integration/stages/upload_data/uploader_log/migrations/__init__.py +0 -0
  182. edu_rdm_integration/stages/upload_data/uploader_log/models.py +86 -0
  183. edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/ui.py +8 -6
  184. {edu_rdm_integration-3.9.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/METADATA +238 -238
  185. edu_rdm_integration-3.10.0.dist-info/RECORD +255 -0
  186. edu_rdm_integration/app_meta.py +0 -16
  187. edu_rdm_integration/app_settings.py +0 -77
  188. edu_rdm_integration/collect_and_export_data/models.py +0 -67
  189. edu_rdm_integration/collect_and_export_data/utils.py +0 -224
  190. edu_rdm_integration/collect_data/base/helpers.py +0 -26
  191. edu_rdm_integration/collect_data/calculated/base/errors.py +0 -9
  192. edu_rdm_integration/collect_data/calculated/base/helpers.py +0 -32
  193. edu_rdm_integration/collect_data/calculated/base/managers.py +0 -23
  194. edu_rdm_integration/collect_data/calculated/base/results.py +0 -16
  195. edu_rdm_integration/collect_data/calculated/base/runners.py +0 -36
  196. edu_rdm_integration/collect_data/calculated/base/validators.py +0 -28
  197. edu_rdm_integration/collect_data/helpers.py +0 -92
  198. edu_rdm_integration/collect_data/non_calculated/base/errors.py +0 -9
  199. edu_rdm_integration/collect_data/non_calculated/base/helpers.py +0 -32
  200. edu_rdm_integration/collect_data/non_calculated/base/managers.py +0 -23
  201. edu_rdm_integration/collect_data/non_calculated/base/results.py +0 -16
  202. edu_rdm_integration/collect_data/non_calculated/base/runners.py +0 -36
  203. edu_rdm_integration/collect_data/non_calculated/base/validators.py +0 -28
  204. edu_rdm_integration/enum_register/register.py +0 -79
  205. edu_rdm_integration/export_data/base/errors.py +0 -9
  206. edu_rdm_integration/export_data/base/presenters.py +0 -13
  207. edu_rdm_integration/export_data/base/results.py +0 -16
  208. edu_rdm_integration/export_data/base/validators.py +0 -28
  209. edu_rdm_integration/export_data/helpers.py +0 -92
  210. edu_rdm_integration/helpers.py +0 -412
  211. edu_rdm_integration/management/general.py +0 -327
  212. edu_rdm_integration/models.py +0 -982
  213. edu_rdm_integration/redis_cache.py +0 -51
  214. edu_rdm_integration/uploader_log/apps.py +0 -10
  215. edu_rdm_integration-3.9.1.dist-info/RECORD +0 -198
  216. /edu_rdm_integration/{collect_and_export_data/migrations → core}/__init__.py +0 -0
  217. /edu_rdm_integration/{mapping.py → core/mapping.py} +0 -0
  218. /edu_rdm_integration/{collect_data → core/registry}/__init__.py +0 -0
  219. /edu_rdm_integration/{templates → core/registry/templates}/ui-js/start-task.js +0 -0
  220. /edu_rdm_integration/{signals.py → core/signals.py} +0 -0
  221. /edu_rdm_integration/{typing.py → core/typing.py} +0 -0
  222. /edu_rdm_integration/{collect_data/base → pipelines}/__init__.py +0 -0
  223. /edu_rdm_integration/{collect_data/calculated → pipelines/transfer}/__init__.py +0 -0
  224. /edu_rdm_integration/{collect_data/calculated/base → pipelines/transfer/migrations}/__init__.py +0 -0
  225. /edu_rdm_integration/{templates → pipelines/transfer/templates}/ui-js/transferred-entity-list.js +0 -0
  226. /edu_rdm_integration/{collect_data/non_calculated → rdm_entities}/__init__.py +0 -0
  227. /edu_rdm_integration/{collect_data/non_calculated/base → rdm_entities/migrations}/__init__.py +0 -0
  228. /edu_rdm_integration/{enum_register → rdm_models}/__init__.py +0 -0
  229. /edu_rdm_integration/{export_data → rdm_models/migrations}/__init__.py +0 -0
  230. /edu_rdm_integration/{export_data/base → stages}/__init__.py +0 -0
  231. /edu_rdm_integration/{function_templates → stages/collect_data}/__init__.py +0 -0
  232. /edu_rdm_integration/{collect_data/const.py → stages/collect_data/consts.py} +0 -0
  233. /edu_rdm_integration/{management → stages/collect_data/function_templates}/__init__.py +0 -0
  234. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/__init__.py-tpl +0 -0
  235. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/apps.py-tpl +0 -0
  236. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/caches.py-tpl +0 -0
  237. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/consts.py-tpl +0 -0
  238. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/enums.py-tpl +0 -0
  239. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/errors.py-tpl +0 -0
  240. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/helpers.py-tpl +0 -0
  241. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/presenters.py-tpl +0 -0
  242. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/results.py-tpl +0 -0
  243. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/strings.py-tpl +0 -0
  244. /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/validators.py-tpl +0 -0
  245. /edu_rdm_integration/{management/commands → stages/collect_data/functions}/__init__.py +0 -0
  246. /edu_rdm_integration/{registry → stages/collect_data/functions/base}/__init__.py +0 -0
  247. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/consts.py +0 -0
  248. /edu_rdm_integration/{uploader_log → stages/collect_data/functions/calculated}/__init__.py +0 -0
  249. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/consts.py +0 -0
  250. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/enums.py +0 -0
  251. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/strings.py +0 -0
  252. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/tests.py +0 -0
  253. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/consts.py +0 -0
  254. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/enums.py +0 -0
  255. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/strings.py +0 -0
  256. /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/tests.py +0 -0
  257. /edu_rdm_integration/{export_data → stages/export_data}/consts.py +0 -0
  258. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/__init__.py-tpl +0 -0
  259. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/apps.py-tpl +0 -0
  260. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/caches.py-tpl +0 -0
  261. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/consts.py-tpl +0 -0
  262. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/enums.py-tpl +0 -0
  263. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/errors.py-tpl +0 -0
  264. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/helpers.py-tpl +0 -0
  265. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/presenters.py-tpl +0 -0
  266. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/results.py-tpl +0 -0
  267. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/strings.py-tpl +0 -0
  268. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/tests.py-tpl +0 -0
  269. /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/validators.py-tpl +0 -0
  270. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/consts.py +0 -0
  271. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/enums.py +0 -0
  272. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/strings.py +0 -0
  273. /edu_rdm_integration/{export_data → stages/export_data/functions}/base/tests.py +0 -0
  274. /edu_rdm_integration/{templates → stages/export_data/registry/templates}/ui-js/stage_for_export.js +0 -0
  275. /edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/enums.py +0 -0
  276. /edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/templates/ui-js/object-grid-buttons.js +0 -0
  277. {edu_rdm_integration-3.9.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/WHEEL +0 -0
  278. {edu_rdm_integration-3.9.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/licenses/LICENSE +0 -0
  279. {edu_rdm_integration-3.9.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,156 @@
1
+ import logging
2
+ import os
3
+ from typing import (
4
+ Union,
5
+ )
6
+
7
+ from django.conf import (
8
+ settings,
9
+ )
10
+
11
+ from educommon import (
12
+ logger,
13
+ )
14
+
15
+ from edu_rdm_integration.core.operations import (
16
+ BaseOperationData,
17
+ )
18
+ from edu_rdm_integration.core.redis_cache import (
19
+ AbstractCache,
20
+ )
21
+ from edu_rdm_integration.stages.export_data.consts import (
22
+ TOTAL_ATTACHMENTS_SIZE_KEY,
23
+ )
24
+ from edu_rdm_integration.stages.upload_data.export_managers import (
25
+ ExportQueueSender,
26
+ WorkerSender,
27
+ )
28
+ from edu_rdm_integration.stages.upload_data.queues import (
29
+ Queue,
30
+ )
31
+
32
+
33
+ class UploadData(BaseOperationData):
34
+ """Класс отправки файлов в витрину."""
35
+
36
+ def __init__(
37
+ self,
38
+ data_cache: AbstractCache,
39
+ queue: Queue,
40
+ **kwargs,
41
+ ):
42
+ super().__init__(**kwargs)
43
+
44
+ self.data_cache = data_cache
45
+ self.queue = queue
46
+
47
+ self._configure_agent_client()
48
+ self.result = {
49
+ 'total_file_size': 0, # Общий размер отправленных файлов
50
+ 'queue_is_full': False, # Признак переполнения очереди
51
+ 'uploaded_entities': '', # Список сущностей, попавших в выгрузку
52
+ }
53
+
54
+ @property
55
+ def _log_file_path(self) -> Union[str, bytes]:
56
+ """Путь до лог файла."""
57
+ return os.path.join(settings.MEDIA_ROOT, settings.RDM_UPLOAD_LOG_DIR, 'upload_entity.log')
58
+
59
+ def _add_file_handler(self) -> None:
60
+ """Добавляет обработчик логов."""
61
+ self._file_handler = logging.FileHandler(self._log_file_path)
62
+
63
+ logging.getLogger('info_logger').addHandler(self._file_handler)
64
+ logging.getLogger('exception_logger').addHandler(self._file_handler)
65
+
66
+ # TODO https://jira.bars.group/browse/EDUSCHL-22492. Вынужденная мера, т.к. при запуске команды не производится
67
+ # проверка готовности конфигов приложений. Нужно переработать механизм конфигурирования клиента загрузчика.
68
+ def _configure_agent_client(self):
69
+ """Конфигурирование клиента загрузчика данных в Витрину."""
70
+ import uploader_client
71
+ from django.core.cache import (
72
+ DEFAULT_CACHE_ALIAS,
73
+ caches,
74
+ )
75
+ from uploader_client.contrib.rdm.interfaces.configurations import (
76
+ RegionalDataMartEmulationUploaderConfig,
77
+ RegionalDataMartUploaderConfig,
78
+ )
79
+
80
+ if settings.RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION:
81
+ uploader_client.set_config(
82
+ RegionalDataMartEmulationUploaderConfig(
83
+ interface='uploader_client.contrib.rdm.interfaces.rest.OpenAPIInterfaceEmulation',
84
+ url=settings.RDM_UPLOADER_CLIENT_URL,
85
+ datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
86
+ timeout=1,
87
+ request_retries=1,
88
+ file_status=settings.RDM_RESPONSE_FILE_STATUS,
89
+ )
90
+ )
91
+ elif settings.RDM_UPLOADER_CLIENT_USE_PROXY_API:
92
+ uploader_client.set_config(
93
+ RegionalDataMartUploaderConfig(
94
+ interface='uploader_client.contrib.rdm.interfaces.rest.ProxyAPIInterface',
95
+ cache=caches[DEFAULT_CACHE_ALIAS],
96
+ url=settings.RDM_UPLOADER_CLIENT_URL,
97
+ datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
98
+ timeout=settings.RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT,
99
+ request_retries=settings.RDM_UPLOADER_CLIENT_REQUEST_RETRIES,
100
+ organization_ogrn=settings.RDM_UPLOADER_CLIENT_ORGANIZATION_OGRN,
101
+ installation_name=settings.RDM_UPLOADER_CLIENT_INSTALLATION_NAME,
102
+ installation_id=settings.RDM_UPLOADER_CLIENT_INSTALLATION_ID,
103
+ username=settings.RDM_UPLOADER_CLIENT_USERNAME,
104
+ password=settings.RDM_UPLOADER_CLIENT_PASSWORD,
105
+ )
106
+ )
107
+ else:
108
+ uploader_client.set_config(
109
+ RegionalDataMartUploaderConfig(
110
+ url=settings.RDM_UPLOADER_CLIENT_URL,
111
+ datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
112
+ timeout=settings.RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT,
113
+ request_retries=settings.RDM_UPLOADER_CLIENT_REQUEST_RETRIES,
114
+ )
115
+ )
116
+
117
+ def update_total_queue_size_in_cache(self, received_files_size: int):
118
+ """Обновление размера файлов в кеш."""
119
+ with self.data_cache.lock(f'{TOTAL_ATTACHMENTS_SIZE_KEY}:lock', timeout=300):
120
+ queue_total_file_size = self.data_cache.get(TOTAL_ATTACHMENTS_SIZE_KEY) or 0
121
+ if queue_total_file_size:
122
+ queue_total_file_size -= received_files_size
123
+ if queue_total_file_size > 0:
124
+ self.data_cache.set(
125
+ TOTAL_ATTACHMENTS_SIZE_KEY,
126
+ queue_total_file_size,
127
+ timeout=settings.RDM_REDIS_CACHE_TIMEOUT_SECONDS,
128
+ )
129
+
130
+ def upload_data(self, *args, **kwargs):
131
+ """Запускает отправку данных в витрину."""
132
+ try:
133
+ exporter = ExportQueueSender(self.data_cache, self.queue, settings.RDM_UPLOAD_DATA_TASK_EXPORT_STAGES)
134
+ exporter.run()
135
+
136
+ self.result['queue_is_full'] = exporter.queue_is_full
137
+ self.result['total_file_size'] = exporter.queue_total_file_size
138
+
139
+ # Если очередь не переполнена - то отправляем данные в витрину
140
+ if not exporter.queue_is_full:
141
+ sender = WorkerSender(self.queue)
142
+ sender.run()
143
+
144
+ if sender.entities:
145
+ self.result['uploaded_entities'] = ','.join(sender.entities)
146
+
147
+ if sender.received_file_size:
148
+ self.update_total_queue_size_in_cache(sender.received_file_size)
149
+
150
+ except Exception as err:
151
+ logger.exception(err)
152
+ raise err
153
+ finally:
154
+ self._remove_file_handler()
155
+
156
+ return self.result
@@ -15,20 +15,21 @@ from redis import (
15
15
  Redis,
16
16
  )
17
17
 
18
- from edu_rdm_integration.export_data.consts import (
18
+ from edu_rdm_integration.core.helpers import (
19
+ as_text,
20
+ get_redis_version,
21
+ )
22
+ from edu_rdm_integration.stages.export_data.consts import (
19
23
  REDIS_QUEUE_KEY_DELIMITER,
20
24
  )
21
- from edu_rdm_integration.export_data.dataclasses import (
25
+ from edu_rdm_integration.stages.upload_data.dataclasses import (
22
26
  UploadFile,
23
27
  )
24
- from edu_rdm_integration.redis_cache import (
25
- as_text,
26
- get_redis_version,
27
- )
28
28
 
29
29
 
30
30
  class Queue(ABC):
31
31
  """Интерфейс очереди."""
32
+
32
33
  queue_key: str = ''
33
34
 
34
35
  @property
@@ -65,6 +66,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
65
66
  (Sorted Set in Redis)
66
67
  - Информация по файлам стандартно по ключу - ключом выступает sub_stage_id
67
68
  """
69
+
68
70
  queue_key = 'rdm:export_sub_stage_ids_queue'
69
71
  prefix = 'rdm:'
70
72
 
@@ -76,7 +78,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
76
78
  host=settings.RDM_REDIS_HOST,
77
79
  port=settings.RDM_REDIS_PORT,
78
80
  db=settings.RDM_REDIS_DB,
79
- password=settings.RDM_REDIS_PASSWORD
81
+ password=settings.RDM_REDIS_PASSWORD,
80
82
  )
81
83
 
82
84
  def _make_key(self, key: Union[int, str]) -> str:
@@ -143,7 +145,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
143
145
  while true do
144
146
  local stage = redis.call("zpopmin", q)
145
147
  local stage_id = stage[2]
146
-
148
+
147
149
  if stage_id == nil then
148
150
  break
149
151
  end
@@ -0,0 +1,103 @@
1
+ import celery
2
+ from celery.schedules import (
3
+ crontab,
4
+ )
5
+ from django.conf import (
6
+ settings,
7
+ )
8
+ from django.core.cache import (
9
+ cache,
10
+ )
11
+
12
+ from educommon.async_task.models import (
13
+ AsyncTaskType,
14
+ )
15
+ from educommon.async_task.tasks import (
16
+ UniquePeriodicAsyncTask,
17
+ )
18
+
19
+ from edu_rdm_integration.core.consts import (
20
+ TASK_QUEUE_NAME,
21
+ )
22
+ from edu_rdm_integration.stages.upload_data.enums import (
23
+ FileUploadStatusEnum,
24
+ )
25
+ from edu_rdm_integration.stages.upload_data.helpers import (
26
+ UploadStatusHelper,
27
+ )
28
+ from edu_rdm_integration.stages.upload_data.models import (
29
+ ExportingDataSubStageUploaderClientLog,
30
+ )
31
+ from edu_rdm_integration.stages.upload_data.operations import (
32
+ UploadData,
33
+ )
34
+ from edu_rdm_integration.stages.upload_data.queues import (
35
+ RdmRedisSubStageAttachmentQueue,
36
+ )
37
+
38
+
39
+ class RDMCheckUploadStatus(UniquePeriodicAsyncTask):
40
+ """Периодическая задача для сбора статусов по загрузке файла в витрину."""
41
+
42
+ queue = TASK_QUEUE_NAME
43
+ routing_key = TASK_QUEUE_NAME
44
+ description = 'Сбор статусов загрузки данных в витрину "Региональная витрина данных"'
45
+ lock_expire_seconds = settings.RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS
46
+ task_type = AsyncTaskType.UNKNOWN
47
+ run_every = crontab(
48
+ minute=settings.RDM_UPLOAD_STATUS_TASK_MINUTE,
49
+ hour=settings.RDM_UPLOAD_STATUS_TASK_HOUR,
50
+ day_of_week=settings.RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK,
51
+ )
52
+
53
+ def process(self, *args, **kwargs):
54
+ """Выполнение."""
55
+ super().process(*args, **kwargs)
56
+
57
+ # Получаем незавершенные загрузки данных в витрину
58
+ in_progress_uploads = ExportingDataSubStageUploaderClientLog.objects.filter(
59
+ file_upload_status=FileUploadStatusEnum.IN_PROGRESS,
60
+ is_emulation=False,
61
+ ).select_related('attachment')
62
+
63
+ UploadStatusHelper(in_progress_uploads, cache).run()
64
+
65
+
66
+ class UploadDataAsyncTask(UniquePeriodicAsyncTask):
67
+ """Формирование очереди файлов и их отправка."""
68
+
69
+ queue = TASK_QUEUE_NAME
70
+ routing_key = TASK_QUEUE_NAME
71
+ description = 'Отправка данных в витрину "Региональная витрина данных"'
72
+ lock_expire_seconds = settings.RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS
73
+ task_type = AsyncTaskType.SYSTEM
74
+ run_every = crontab(
75
+ minute=settings.RDM_UPLOAD_DATA_TASK_MINUTE,
76
+ hour=settings.RDM_UPLOAD_DATA_TASK_HOUR,
77
+ day_of_week=settings.RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK,
78
+ )
79
+
80
+ def process(self, *args, **kwargs):
81
+ """Выполнение."""
82
+ super().process(*args, **kwargs)
83
+
84
+ queue = RdmRedisSubStageAttachmentQueue()
85
+ upload_data = UploadData(
86
+ data_cache=cache,
87
+ queue=queue,
88
+ )
89
+
90
+ upload_result = upload_data.upload_data()
91
+
92
+ task_result = {
93
+ 'Общий объем отправленных файлов': f'{upload_result["total_file_size"]}',
94
+ 'Очередь отправки переполнена': 'Да' if upload_result['queue_is_full'] else 'Нет',
95
+ 'Сущности, отправленные в витрину': upload_result['uploaded_entities'],
96
+ }
97
+
98
+ self.set_progress(values=task_result)
99
+
100
+
101
+ celery_app = celery.app.app_or_default()
102
+ celery_app.register_task(RDMCheckUploadStatus)
103
+ celery_app.register_task(UploadDataAsyncTask)
@@ -14,10 +14,6 @@ from typing import (
14
14
  from django.conf import (
15
15
  settings,
16
16
  )
17
- from edu_rdm_integration.uploader_log.enums import (
18
- RequestResultStatus,
19
- )
20
-
21
17
  from django.db.models import (
22
18
  Q,
23
19
  )
@@ -27,6 +23,9 @@ from m3_ext.ui.icons import (
27
23
  from objectpack.actions import (
28
24
  ObjectPack,
29
25
  )
26
+ from objectpack.filters import (
27
+ CustomFilter,
28
+ )
30
29
 
31
30
  from educommon.objectpack.actions import (
32
31
  ExtObjectRowsAction,
@@ -44,21 +43,19 @@ from educommon.utils.ui import (
44
43
  append_template_globals,
45
44
  )
46
45
 
47
- from edu_rdm_integration.models import (
46
+ from edu_rdm_integration.stages.upload_data.uploader_log.enums import (
47
+ RequestResultStatus,
48
+ )
49
+ from edu_rdm_integration.stages.upload_data.uploader_log.models import (
48
50
  UploaderClientLog,
49
51
  )
50
- from edu_rdm_integration.uploader_log.ui import (
52
+ from edu_rdm_integration.stages.upload_data.uploader_log.ui import (
51
53
  UploaderLogInfoWindow,
52
54
  )
53
- from objectpack.filters import (
54
- CustomFilter,
55
- )
56
55
 
57
56
 
58
57
  class UploaderLogPack(ObjectPack):
59
- """
60
- Пак журнала Загрузчика данных в витрину.
61
- """
58
+ """Пак журнала Загрузчика данных в витрину."""
62
59
 
63
60
  title = 'Журнал логов РВД'
64
61
  model = UploaderClientLog
@@ -104,13 +101,14 @@ class UploaderLogPack(ObjectPack):
104
101
  tooltip='C',
105
102
  default_value=date.today() - timedelta(days=1),
106
103
  editable=False,
107
- lookup=lambda v: Q(request_datetime__gte=datetime.combine(v, time.min))
108
- ) & _fd(
104
+ lookup=lambda v: Q(request_datetime__gte=datetime.combine(v, time.min)),
105
+ )
106
+ & _fd(
109
107
  'request_datetime',
110
108
  tooltip='По',
111
109
  default_value=date.today,
112
110
  editable=False,
113
- lookup=lambda v: Q(request_datetime__lte=datetime.combine(v, time.max))
111
+ lookup=lambda v: Q(request_datetime__lte=datetime.combine(v, time.max)),
114
112
  ),
115
113
  'width': 11,
116
114
  },
@@ -251,10 +249,10 @@ class UploaderLogPack(ObjectPack):
251
249
 
252
250
  Args:
253
251
  menu: Объект меню.
252
+
254
253
  Returns:
255
254
  Подменю "Администрирование -> Региональная витрина данных -> Журнал логов РВД".
256
255
  """
257
-
258
256
  if settings.RDM_MENU_ITEM:
259
257
  return menu.SubMenu(
260
258
  'Администрирование',
@@ -0,0 +1,11 @@
1
+ from django.apps import (
2
+ AppConfig,
3
+ )
4
+
5
+
6
+ class UploaderLoggerConfig(AppConfig): # noqa D101
7
+ """Приложение для работы с логами выгрузки данных в РВД."""
8
+
9
+ name = 'edu_rdm_integration.stages.upload_data.uploader_log'
10
+ label = 'edu_rdm_integration_uploader_log'
11
+ verbose_name = 'Журнал логов РВД'
@@ -12,7 +12,7 @@ from django.db.models.functions import (
12
12
  Cast,
13
13
  )
14
14
 
15
- from edu_rdm_integration.uploader_log.enums import (
15
+ from edu_rdm_integration.stages.upload_data.uploader_log.enums import (
16
16
  RequestResultStatus,
17
17
  )
18
18
 
@@ -26,9 +26,8 @@ class UploaderClientLogManager(Manager):
26
26
 
27
27
  result_status = Case(
28
28
  When(
29
- Q(Q(error__isnull=True) | Q(error__exact=''))
30
- & Q(Q(response__isnull=False) & ~Q(response__exact='')),
31
- then=Value(RequestResultStatus.SUCCESS)
29
+ Q(Q(error__isnull=True) | Q(error__exact='')) & Q(Q(response__isnull=False) & ~Q(response__exact='')),
30
+ then=Value(RequestResultStatus.SUCCESS),
32
31
  ),
33
32
  default=Value(RequestResultStatus.ERROR),
34
33
  output_field=PositiveSmallIntegerField(),
@@ -37,30 +36,21 @@ class UploaderClientLogManager(Manager):
37
36
  query = query.annotate(
38
37
  request_datetime=F('date_time'),
39
38
  attachment_file=Case(
40
- When(
41
- request__icontains='POST',
42
- then=F('uploader_client_log__attachment__attachment')
43
- ),
39
+ When(request__icontains='POST', then=F('uploader_client_log__attachment__attachment')),
44
40
  When(
45
41
  request__icontains='GET',
46
42
  then=F('upload_status_request_log__upload__attachment__attachment'),
47
43
  ),
48
44
  default=Value(''),
49
- output_field = CharField(),
45
+ output_field=CharField(),
50
46
  ),
51
47
  status_code=Case(
52
- When(
53
- request__icontains='POST',
54
- then=Value('', output_field=CharField())
55
- ),
48
+ When(request__icontains='POST', then=Value('', output_field=CharField())),
56
49
  When(
57
50
  request__icontains='GET',
58
- then=Cast(
59
- 'upload_status_request_log__request_status__value',
60
- output_field=CharField()
61
- ),
51
+ then=Cast('upload_status_request_log__request_status__value', output_field=CharField()),
62
52
  ),
63
- default=Value('')
53
+ default=Value(''),
64
54
  ),
65
55
  status_description=Case(
66
56
  When(
@@ -71,7 +61,8 @@ class UploaderClientLogManager(Manager):
71
61
  request__icontains='GET',
72
62
  then=F('upload_status_request_log__request_status__title'),
73
63
  ),
74
- default=Value(''), output_field=CharField()
64
+ default=Value(''),
65
+ output_field=CharField(),
75
66
  ),
76
67
  is_emulation=Case(
77
68
  When(
@@ -82,20 +73,14 @@ class UploaderClientLogManager(Manager):
82
73
  request__icontains='GET',
83
74
  then=F('upload_status_request_log__upload__is_emulation'),
84
75
  ),
85
- default=Value(False)
76
+ default=Value(False),
86
77
  ),
87
78
  request_id=Case(
88
- When(
89
- request__icontains='POST',
90
- then=F('uploader_client_log__request_id')
91
- ),
92
- When(
93
- request__icontains='GET',
94
- then=F('upload_status_request_log__upload__request_id')
95
- ),
96
- default=Value('')
79
+ When(request__icontains='POST', then=F('uploader_client_log__request_id')),
80
+ When(request__icontains='GET', then=F('upload_status_request_log__upload__request_id')),
81
+ default=Value(''),
97
82
  ),
98
- result_status=result_status
83
+ result_status=result_status,
99
84
  )
100
85
 
101
86
  return query
@@ -0,0 +1,31 @@
1
+ # Generated by Django 3.2.24 on 2025-06-28 14:22
2
+
3
+ from django.db import (
4
+ migrations,
5
+ )
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+ initial = True
10
+
11
+ dependencies = [
12
+ ('uploader_client', '0001_initial'),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.SeparateDatabaseAndState(
17
+ state_operations=[
18
+ migrations.CreateModel(
19
+ name='UploaderClientLog',
20
+ fields=[],
21
+ options={
22
+ 'proxy': True,
23
+ 'indexes': [],
24
+ 'constraints': [],
25
+ },
26
+ bases=('uploader_client.entry',),
27
+ ),
28
+ ],
29
+ database_operations=[],
30
+ ),
31
+ ]
@@ -0,0 +1,86 @@
1
+ from functools import (
2
+ cached_property,
3
+ )
4
+ from io import (
5
+ StringIO,
6
+ )
7
+ from typing import (
8
+ Optional,
9
+ )
10
+
11
+ from django.db.models import (
12
+ Manager,
13
+ )
14
+ from uploader_client.models import (
15
+ Entry,
16
+ )
17
+
18
+ from edu_rdm_integration.stages.upload_data.uploader_log.enums import (
19
+ RequestResultStatus,
20
+ )
21
+ from edu_rdm_integration.stages.upload_data.uploader_log.managers import (
22
+ UploaderClientLogManager,
23
+ )
24
+
25
+
26
+ class UploaderClientLog(Entry):
27
+ """Прокси модель Загрузчика данных в витрину."""
28
+
29
+ objects = UploaderClientLogManager()
30
+ base_objects = Manager()
31
+
32
+ @cached_property
33
+ def http_method_and_url(self) -> tuple[str, str]:
34
+ """Возвращает http-метод и url из поля запроса Entry.request."""
35
+ request = StringIO(self.request)
36
+ request_first_line = request.readline()
37
+ request.close()
38
+
39
+ method, url = request_first_line.split(' ')[:2]
40
+ if not (method and url.startswith('http')):
41
+ method = url = ''
42
+
43
+ return method.strip('[]'), url
44
+
45
+ @cached_property
46
+ def http_response_status(self) -> Optional[str]:
47
+ """Статус-код запроса к витрине."""
48
+ try:
49
+ http_status = self.response.split(' ')[0].strip('[]')
50
+
51
+ if not http_status:
52
+ return None
53
+
54
+ if 200 <= int(http_status) < 300:
55
+ http_status = 'Успех'
56
+ elif int(http_status) >= 400:
57
+ http_status = 'Ошибка'
58
+ except (IndexError, AttributeError):
59
+ http_status = None
60
+
61
+ return http_status
62
+
63
+ @property
64
+ def http_method(self) -> str:
65
+ """Значение http-метода."""
66
+ return self.http_method_and_url[0]
67
+
68
+ @property
69
+ def request_url(self) -> str:
70
+ """URL запроса."""
71
+ return self.http_method_and_url[1]
72
+
73
+ @property
74
+ def request_error(self) -> Optional[str]:
75
+ """Ошибка запроса."""
76
+ return self.error
77
+
78
+ @property
79
+ def result_status_display(self) -> str:
80
+ """Результат запроса."""
81
+ result_status = getattr(self, 'result_status', RequestResultStatus.ERROR)
82
+
83
+ return RequestResultStatus.values.get(result_status) or RequestResultStatus.values[RequestResultStatus.ERROR]
84
+
85
+ class Meta:
86
+ proxy = True
@@ -45,12 +45,14 @@ class UploaderLogInfoWindow(BaseEditWindow):
45
45
  """Размещение компонентов окна на форме."""
46
46
  super(UploaderLogInfoWindow, self)._do_layout()
47
47
 
48
- self.form.items.extend((
49
- self.field__request,
50
- self.field__response,
51
- self.field__error,
52
- self.field__attachment,
53
- ))
48
+ self.form.items.extend(
49
+ (
50
+ self.field__request,
51
+ self.field__response,
52
+ self.field__error,
53
+ self.field__attachment,
54
+ )
55
+ )
54
56
 
55
57
  def set_params(self, params):
56
58
  """Настройка окна."""