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.
@@ -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
@@ -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 RDMCheckUploadStatus(PeriodicAsyncTask):
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(PeriodicAsyncTask):
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(PeriodicAsyncTask):
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.4
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,>=20.1.1
26
- Requires-Dist: setuptools <69,>=47.3.1
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', 'TRANSFER_TASK_DAY_OF_WEEK'): '*',
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=PK-hjkGIwbSqgKdJKoTdryk6nt-OOGLIKSzPYXCzmYE,2056
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=8bQZbhVDuK3RYc8lSbWyW1xDyVgIZQCrcsTo8pUeIeE,13716
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.4.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
166
- edu_rdm_integration-3.0.4.dist-info/METADATA,sha256=8F3k2HKClhtfNsMWRafChSjc14nvRmfrI-ASQkrXtIk,61241
167
- edu_rdm_integration-3.0.4.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
168
- edu_rdm_integration-3.0.4.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
169
- edu_rdm_integration-3.0.4.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
170
- edu_rdm_integration-3.0.4.dist-info/RECORD,,
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,,