edu-rdm-integration 3.0.4__py3-none-any.whl → 3.2.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.
- edu_rdm_integration/app_settings.py +2 -0
- edu_rdm_integration/tasks.py +45 -3
- {edu_rdm_integration-3.0.4.dist-info → edu_rdm_integration-3.2.0.dist-info}/METADATA +34 -4
- {edu_rdm_integration-3.0.4.dist-info → edu_rdm_integration-3.2.0.dist-info}/RECORD +8 -8
- {edu_rdm_integration-3.0.4.dist-info → edu_rdm_integration-3.2.0.dist-info}/LICENSE +0 -0
- {edu_rdm_integration-3.0.4.dist-info → edu_rdm_integration-3.2.0.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-3.0.4.dist-info → edu_rdm_integration-3.2.0.dist-info}/namespace_packages.txt +0 -0
- {edu_rdm_integration-3.0.4.dist-info → edu_rdm_integration-3.2.0.dist-info}/top_level.txt +0 -0
@@ -36,9 +36,11 @@ RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION = True
|
|
36
36
|
RDM_TRANSFER_TASK_MINUTE = '0'
|
37
37
|
RDM_TRANSFER_TASK_HOUR = '*/4'
|
38
38
|
RDM_TRANSFER_TASK_DAY_OF_WEEK = '*'
|
39
|
+
RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = 60 * 60 * 6
|
39
40
|
RDM_TRANSFER_TASK_TIMEDELTA = 3600
|
40
41
|
|
41
42
|
# Настройка запуска периодической задачи статуса загрузки данных в витрину:
|
42
43
|
RDM_UPLOAD_STATUS_TASK_MINUTE = '*/30'
|
43
44
|
RDM_UPLOAD_STATUS_TASK_HOUR = '*'
|
44
45
|
RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK = '*'
|
46
|
+
RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS = 60 * 60 * 2
|
edu_rdm_integration/tasks.py
CHANGED
@@ -9,6 +9,9 @@ from typing import (
|
|
9
9
|
)
|
10
10
|
|
11
11
|
import celery
|
12
|
+
from celery.exceptions import (
|
13
|
+
Ignore,
|
14
|
+
)
|
12
15
|
from celery.schedules import (
|
13
16
|
crontab,
|
14
17
|
)
|
@@ -26,6 +29,9 @@ from django.utils import (
|
|
26
29
|
timezone,
|
27
30
|
)
|
28
31
|
|
32
|
+
from educommon.async_task.locker import (
|
33
|
+
TaskLocker,
|
34
|
+
)
|
29
35
|
from educommon.async_task.models import (
|
30
36
|
AsyncTaskType,
|
31
37
|
RunningTask,
|
@@ -93,12 +99,46 @@ if TYPE_CHECKING:
|
|
93
99
|
)
|
94
100
|
|
95
101
|
|
96
|
-
class
|
102
|
+
class PeriodicTaskLocker(TaskLocker):
|
103
|
+
"""Класс отвечающий за блокировку задач.
|
104
|
+
|
105
|
+
Переопределён для возможности игнорирования повторного запуска для уже
|
106
|
+
запущенных периодических задач.
|
107
|
+
"""
|
108
|
+
|
109
|
+
def raise_if_locked(self, message: Optional[str] = None):
|
110
|
+
"""Если блокировано, то вызывает исключение."""
|
111
|
+
if self.is_locked():
|
112
|
+
self.debug(f'Add failed. Task {self.task_name} currently locked ({self.params})')
|
113
|
+
|
114
|
+
raise Ignore()
|
115
|
+
|
116
|
+
|
117
|
+
class UniquePeriodicAsyncTask(PeriodicAsyncTask):
|
118
|
+
"""Уникальные периодические задачи."""
|
119
|
+
|
120
|
+
abstract = True
|
121
|
+
lock_expire_seconds = 60 * 60
|
122
|
+
|
123
|
+
locker_class = PeriodicTaskLocker
|
124
|
+
|
125
|
+
@property
|
126
|
+
def locker_config(self) -> dict:
|
127
|
+
"""Настройки для механизма блокировок. """
|
128
|
+
return {
|
129
|
+
'lock_params': {'task_name': self.name},
|
130
|
+
'lock_message': f'Task [{self.__name__}] is running',
|
131
|
+
'lock_expire': self.lock_expire_seconds,
|
132
|
+
}
|
133
|
+
|
134
|
+
|
135
|
+
class RDMCheckUploadStatus(UniquePeriodicAsyncTask):
|
97
136
|
"""Периодическая задача для сбора статусов по загрузке файла в витрину."""
|
98
137
|
|
99
138
|
queue = TASK_QUEUE_NAME
|
100
139
|
routing_key = TASK_QUEUE_NAME
|
101
140
|
description = 'Сбор статусов загрузки данных в витрину "Региональная витрина данных"'
|
141
|
+
lock_expire_seconds = settings.RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS
|
102
142
|
task_type = AsyncTaskType.UNKNOWN
|
103
143
|
run_every = crontab(
|
104
144
|
minute=settings.RDM_UPLOAD_STATUS_TASK_MINUTE,
|
@@ -119,12 +159,13 @@ class RDMCheckUploadStatus(PeriodicAsyncTask):
|
|
119
159
|
UploadStatusHelper(in_progress_uploads).run()
|
120
160
|
|
121
161
|
|
122
|
-
class CheckSuspendedExportedStagePeriodicTask(
|
162
|
+
class CheckSuspendedExportedStagePeriodicTask(UniquePeriodicAsyncTask):
|
123
163
|
"""Периодическая задача поиска зависших этапов/подэтапов экспорта."""
|
124
164
|
|
125
165
|
queue = TASK_QUEUE_NAME
|
126
166
|
routing_key = TASK_QUEUE_NAME
|
127
167
|
description = 'Поиск зависших этапов/подэтапов экспорта в "Региональная витрина данных"'
|
168
|
+
lock_expire_seconds = settings.RDM_CHECK_SUSPEND_TASK_LOCK_EXPIRE_SECONDS
|
128
169
|
task_type = AsyncTaskType.SYSTEM
|
129
170
|
run_every = crontab(
|
130
171
|
minute=settings.RDM_CHECK_SUSPEND_TASK_MINUTE,
|
@@ -155,12 +196,13 @@ class CheckSuspendedExportedStagePeriodicTask(PeriodicAsyncTask):
|
|
155
196
|
)
|
156
197
|
|
157
198
|
|
158
|
-
class TransferLatestEntitiesDataPeriodicTask(
|
199
|
+
class TransferLatestEntitiesDataPeriodicTask(UniquePeriodicAsyncTask):
|
159
200
|
"""Периодическая задача сбора и выгрузки данных."""
|
160
201
|
|
161
202
|
queue = TASK_QUEUE_NAME
|
162
203
|
routing_key = TASK_QUEUE_NAME
|
163
204
|
description = 'Периодическая задача сбора и экспорта данных РВД'
|
205
|
+
lock_expire_seconds = settings.RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS
|
164
206
|
task_type = AsyncTaskType.UNKNOWN
|
165
207
|
run_every = crontab(
|
166
208
|
minute=settings.RDM_TRANSFER_TASK_MINUTE,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: edu-rdm-integration
|
3
|
-
Version: 3.0
|
3
|
+
Version: 3.2.0
|
4
4
|
Summary: Интеграция с Региональной витриной данных
|
5
5
|
Home-page:
|
6
6
|
Download-URL:
|
@@ -22,8 +22,8 @@ Classifier: Framework :: Django :: 3.1
|
|
22
22
|
Description-Content-Type: text/markdown
|
23
23
|
License-File: LICENSE
|
24
24
|
Requires-Dist: packaging <24,>=21.3
|
25
|
-
Requires-Dist: pip <24,>=
|
26
|
-
Requires-Dist: setuptools <
|
25
|
+
Requires-Dist: pip <24,>=23.2.1
|
26
|
+
Requires-Dist: setuptools <70,>=47.3.1
|
27
27
|
Requires-Dist: wheel <0.42,>=0.37.1
|
28
28
|
Requires-Dist: transliterate <2
|
29
29
|
Requires-Dist: Django <3.2,>=2.2
|
@@ -106,12 +106,14 @@ Requires-Dist: uploader-client <1,>=0.2.1
|
|
106
106
|
('rdm_general', 'EXPORT_CHUNK_SIZE'): 500,
|
107
107
|
('rdm_transfer_task', 'MINUTE'): '0',
|
108
108
|
('rdm_transfer_task', 'HOUR'): '*/4',
|
109
|
-
('rdm_transfer_task', '
|
109
|
+
('rdm_transfer_task', 'DAY_OF_WEEK'): '*',
|
110
|
+
('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS'): 21600,
|
110
111
|
('rdm_transfer_task', 'TIMEDELTA'): 3600,
|
111
112
|
('rdm_transfer_task', 'ENTITIES'): '',
|
112
113
|
('rdm_upload_status_task', 'MINUTE'): '*/30',
|
113
114
|
('rdm_upload_status_task', 'HOUR'): '*',
|
114
115
|
('rdm_upload_status_task', 'DAY_OF_WEEK'): '*',
|
116
|
+
('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
115
117
|
('uploader_client', 'URL'): 'http://localhost:8090',
|
116
118
|
('uploader_client', 'DATAMART_NAME'): '',
|
117
119
|
('uploader_client', 'REQUEST_RETRIES'): 10,
|
@@ -145,17 +147,20 @@ Requires-Dist: uploader-client <1,>=0.2.1
|
|
145
147
|
RDM_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task', 'MINUTE')
|
146
148
|
RDM_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task', 'HOUR')
|
147
149
|
RDM_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task', 'DAY_OF_WEEK')
|
150
|
+
RDM_TRANSFER_TASK_EXPIRE_SECOND = conf.get('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS')
|
148
151
|
RDM_TRANSFER_TASK_TIMEDELTA = conf.get_int('rdm_transfer_task', 'TIMEDELTA')
|
149
152
|
|
150
153
|
# Настройка запуска периодической задачи статуса загрузки данных в витрину:
|
151
154
|
RDM_UPLOAD_STATUS_TASK_MINUTE = conf.get('rdm_upload_status_task', 'MINUTE')
|
152
155
|
RDM_UPLOAD_STATUS_TASK_HOUR = conf.get('rdm_upload_status_task', 'HOUR')
|
153
156
|
RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK = conf.get('rdm_upload_status_task', 'DAY_OF_WEEK')
|
157
|
+
RDM_UPLOAD_STATUS_TASK_EXPIRE_SECOND = conf.get('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS')
|
154
158
|
|
155
159
|
# Настройка запуска периодической задачи поиска зависших этапов экспорта:
|
156
160
|
RDM_CHECK_SUSPEND_TASK_MINUTE = conf.get('rdm_check_suspend_task', 'MINUTE')
|
157
161
|
RDM_CHECK_SUSPEND_TASK_HOUR = conf.get('rdm_check_suspend_task', 'HOUR')
|
158
162
|
RDM_CHECK_SUSPEND_TASK_DAY_OF_WEEK = conf.get('rdm_check_suspend_task', 'DAY_OF_WEEK')
|
163
|
+
RDM_CHECK_SUSPEND_TASK_EXPIRE_SECOND = conf.get('rdm_check_suspend_task', 'LOCK_EXPIRE_SECONDS')
|
159
164
|
RDM_CHECK_SUSPEND_TASK_TIMEDELTA = conf.get_int('rdm_check_suspend_task', 'TIMEDELTA')
|
160
165
|
|
161
166
|
# Загрузка данных в Региональную витрину данных (РВД)
|
@@ -192,10 +197,12 @@ Requires-Dist: uploader-client <1,>=0.2.1
|
|
192
197
|
| RDM_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи выгрузки данных. Минута | '0' |
|
193
198
|
| RDM_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи выгрузки данных. Час | '*/4' |
|
194
199
|
| RDM_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи выгрузки данных. День недели | '*' |
|
200
|
+
| RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 21600 |
|
195
201
|
| RDM_TRANSFER_TASK_TIMEDELTA | Дельта между предыдущим и следующим запуском периодической задачи в секундах | 3600 |
|
196
202
|
| RDM_UPLOAD_STATUS_TASK_MINUTE | Настройка запуска периодической задачи статуса загрузки данных в витрину. Минута | '*/30' |
|
197
203
|
| RDM_UPLOAD_STATUS_TASK_HOUR | Настройка запуска периодической задачи статуса загрузки данных в витрину. Час | '*' |
|
198
204
|
| RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи статуса загрузки данных в витрину. День недели | '*' |
|
205
|
+
| RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 3600 |
|
199
206
|
| RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT | Дельта для определения зависшего подэтапа. Минута | 120 |
|
200
207
|
|
201
208
|
|
@@ -220,6 +227,7 @@ Requires-Dist: uploader-client <1,>=0.2.1
|
|
220
227
|
MINUTE=*/2
|
221
228
|
HOUR=*
|
222
229
|
DAY_OF_WEEK=*
|
230
|
+
LOCK_EXPIRE_SECONDS=21600
|
223
231
|
# Дельта между прошлым и текущим запуском, сек
|
224
232
|
TIMEDELTA=120
|
225
233
|
# Сущности, по которым должен производиться сбор и выгрузка данных. Перечисляются через запятую без пробелов.
|
@@ -230,12 +238,14 @@ Requires-Dist: uploader-client <1,>=0.2.1
|
|
230
238
|
MINUTE=*/2
|
231
239
|
HOUR=*
|
232
240
|
DAY_OF_WEEK=*
|
241
|
+
LOCK_EXPIRE_SECONDS=7200
|
233
242
|
|
234
243
|
# Настройка запуска периодической задачи поиска зависших этапов экспорта
|
235
244
|
[rdm_check_suspend_task]
|
236
245
|
MINUTE=*/10
|
237
246
|
HOUR=*
|
238
247
|
DAY_OF_WEEK=*
|
248
|
+
LOCK_EXPIRE_SECONDS=7200
|
239
249
|
# Дельта для определения зависшего подэтапа, мин
|
240
250
|
STAGE_TIMEOUT=120
|
241
251
|
|
@@ -294,6 +304,26 @@ Requires-Dist: uploader-client <1,>=0.2.1
|
|
294
304
|
### Удалено
|
295
305
|
|
296
306
|
|
307
|
+
## 3.2.0 - 2024-05-02
|
308
|
+
Периодические задачи RDMCheckUploadStatus, CheckSuspendedExportedStagePeriodicTask,
|
309
|
+
TransferLatestEntitiesDataPeriodicTask сделаны уникальными.
|
310
|
+
|
311
|
+
### Изменено
|
312
|
+
- [EDUSCHL-21891](https://jira.bars.group/browse/EDUSCHL-21891)
|
313
|
+
MINOR Периодические задачи RDMCheckUploadStatus, CheckSuspendedExportedStagePeriodicTask,
|
314
|
+
TransferLatestEntitiesDataPeriodicTask сделаны уникальными. Во время действия блокировки не будет возможности
|
315
|
+
поставить новую подобную задачу.
|
316
|
+
|
317
|
+
|
318
|
+
## 3.1.0 - 2024-04-23
|
319
|
+
Добавлена поддержка setuptools 69.*.
|
320
|
+
Поднята минимальная версия пакета pip 23.2.1
|
321
|
+
|
322
|
+
### Изменено
|
323
|
+
- [EDUSCHL-21761](https://jira.bars.group/browse/EDUSCHL-21761)
|
324
|
+
MINOR Добавлена поддержка setuptools 69.*. Поднять минимальную версию pip до 23.2.1.
|
325
|
+
|
326
|
+
|
297
327
|
## 3.0.4 - 2024-04-17
|
298
328
|
Возвращено проставление подэтапа выгрузки всем записям модели.
|
299
329
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
edu_rdm_integration/__init__.py,sha256=fVCvQ7QGI_iCyAeE8dMapyY8gOM617ye5GQqAVGPlZI,72
|
2
2
|
edu_rdm_integration/app_meta.py,sha256=v5IU69yaeLbyHF0Ln6iPN_IfizbtF3rCWrz2n71m8dU,337
|
3
|
-
edu_rdm_integration/app_settings.py,sha256=
|
3
|
+
edu_rdm_integration/app_settings.py,sha256=rsXBw40Air-fUamS2ZmtSZMAs9mSCoDa50z5WlBONo0,2165
|
4
4
|
edu_rdm_integration/apps.py,sha256=5OgNdmuqe26fbu4wYb69haQJe-XFO_rDbnU1vPqJU-U,3571
|
5
5
|
edu_rdm_integration/base.py,sha256=_G0qPTAXe6bXfgDHNiZMSsYt3sMuUhLKnHuQCWSFttU,1341
|
6
6
|
edu_rdm_integration/consts.py,sha256=FFwcMHNsfjP_s9LfkccLAHjJMEMp7ppPmrRlJcgV88k,1104
|
@@ -11,7 +11,7 @@ edu_rdm_integration/mapping.py,sha256=bwa2fJCbV4YjQcAgRrgT3hgM6dJhr_uBtQgx3L3F2C
|
|
11
11
|
edu_rdm_integration/models.py,sha256=Wg8NYj4C6Xqw-15AsQGU0TWNzUjdwBW_YZDzmPqx3GY,29327
|
12
12
|
edu_rdm_integration/signals.py,sha256=3eRlpkDcFCF6TN80-QM8yBYLcyozzcmoPjz6r4_ApWg,73
|
13
13
|
edu_rdm_integration/storages.py,sha256=o5WqUG7SnkeuMt-z8spUi-IraivST-7KHzfY-M3v7FA,6807
|
14
|
-
edu_rdm_integration/tasks.py,sha256=
|
14
|
+
edu_rdm_integration/tasks.py,sha256=blG952xd84DspIQZepF6Vdsz6i7O5pKxN3CGOlDwB2g,15253
|
15
15
|
edu_rdm_integration/utils.py,sha256=-my8q9fude6Nc9r_qUDww-8QaU2tcv-xOexewYqOPJw,10369
|
16
16
|
edu_rdm_integration/adapters/__init__.py,sha256=cU0swn4Ny5ZQz5buWRcWsT1mpWuUFJaUlHf2l7TtEBo,83
|
17
17
|
edu_rdm_integration/adapters/apps.py,sha256=TyJTkSPs2qAHJ11fqbwLGk3Ea7ujtqWwbxqmvYNQxG8,363
|
@@ -162,9 +162,9 @@ edu_rdm_integration/uploader_log/apps.py,sha256=tYJj4-sDlq8fLOSvw18L_yys7SILpTKW
|
|
162
162
|
edu_rdm_integration/uploader_log/enums.py,sha256=rgSO3BL2rh2xpfm0Pt4waQW8fB1VMJLdsGmr3SXwH_U,266
|
163
163
|
edu_rdm_integration/uploader_log/managers.py,sha256=y5wTSMzF9hpOpIU_A7nIafL_LBU3QEie6LAYWoB-pBQ,3203
|
164
164
|
edu_rdm_integration/uploader_log/ui.py,sha256=YM9Buqp2wxE95Wf5gvAATBzuYzDOossK1sEmvFk07cI,2110
|
165
|
-
edu_rdm_integration-3.0.
|
166
|
-
edu_rdm_integration-3.0.
|
167
|
-
edu_rdm_integration-3.0.
|
168
|
-
edu_rdm_integration-3.0.
|
169
|
-
edu_rdm_integration-3.0.
|
170
|
-
edu_rdm_integration-3.0.
|
165
|
+
edu_rdm_integration-3.2.0.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
|
166
|
+
edu_rdm_integration-3.2.0.dist-info/METADATA,sha256=H5B9TuvSmXOEUFSIguHL7MzfkLyhlskeZkJHpgWOKG0,63284
|
167
|
+
edu_rdm_integration-3.2.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
168
|
+
edu_rdm_integration-3.2.0.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
169
|
+
edu_rdm_integration-3.2.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
|
170
|
+
edu_rdm_integration-3.2.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
{edu_rdm_integration-3.0.4.dist-info → edu_rdm_integration-3.2.0.dist-info}/namespace_packages.txt
RENAMED
File without changes
|
File without changes
|