edu-rdm-integration 3.5.6__py3-none-any.whl → 3.5.8__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/export_data/export_manager.py +2 -2
- edu_rdm_integration-3.5.8.dist-info/METADATA +250 -0
- {edu_rdm_integration-3.5.6.dist-info → edu_rdm_integration-3.5.8.dist-info}/RECORD +7 -7
- edu_rdm_integration-3.5.6.dist-info/METADATA +0 -1631
- {edu_rdm_integration-3.5.6.dist-info → edu_rdm_integration-3.5.8.dist-info}/LICENSE +0 -0
- {edu_rdm_integration-3.5.6.dist-info → edu_rdm_integration-3.5.8.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-3.5.6.dist-info → edu_rdm_integration-3.5.8.dist-info}/namespace_packages.txt +0 -0
- {edu_rdm_integration-3.5.6.dist-info → edu_rdm_integration-3.5.8.dist-info}/top_level.txt +0 -0
@@ -51,7 +51,7 @@ from edu_rdm_integration.export_data.queue import (
|
|
51
51
|
Queue,
|
52
52
|
)
|
53
53
|
from edu_rdm_integration.helpers import (
|
54
|
-
|
54
|
+
FAILED_STATUSES,
|
55
55
|
UploadStatusHelper,
|
56
56
|
)
|
57
57
|
from edu_rdm_integration.models import (
|
@@ -210,7 +210,7 @@ class WorkerSender:
|
|
210
210
|
f'{request_id}, данные ответа: {response}',
|
211
211
|
)
|
212
212
|
|
213
|
-
if request_status in
|
213
|
+
if request_status in FAILED_STATUSES:
|
214
214
|
file_upload_status = FileUploadStatusEnum.ERROR
|
215
215
|
|
216
216
|
elif request_status == DataMartRequestStatus.SUCCESSFULLY_PROCESSED:
|
@@ -0,0 +1,250 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: edu-rdm-integration
|
3
|
+
Version: 3.5.8
|
4
|
+
Summary: Интеграция с Региональной витриной данных
|
5
|
+
Home-page:
|
6
|
+
Download-URL:
|
7
|
+
Author: BARS Group
|
8
|
+
Author-email: bars@bars.group
|
9
|
+
Platform: Any
|
10
|
+
Requires-Python: >=3.9
|
11
|
+
Description-Content-Type: text/markdown
|
12
|
+
License-File: LICENSE
|
13
|
+
|
14
|
+
# Проект "Интеграция с Региональной витриной данных (РВД)"
|
15
|
+
|
16
|
+
Для интеграции с Региональной витриной данных был выделен отдельный пакет для использования его компонентов в различных
|
17
|
+
продуктах.
|
18
|
+
|
19
|
+
На текущий момент интеграция реализуется в рамках проектов Электронная школа (ЭШ) и Электронный колледж (ЭК).
|
20
|
+
|
21
|
+
## Описание концепции
|
22
|
+
|
23
|
+
Со стороны Минцифры предоставляется спецификация (ЕФТТ) с требованиями по формату и механизму выгрузки данных.
|
24
|
+
|
25
|
+
Выбрана модель промежуточного хранения данных на стороне продукта, которые подлежат выгрузке. При помощи такого подхода,
|
26
|
+
можно обеспечить формирование не хранящихся в продукте данных и дальнейшее их обновление и удаление. Упрощается процесс
|
27
|
+
поиска ошибок в данных, т.к. можно явно определить, в каких записях находятся ошибки и далее анализировать существующие
|
28
|
+
данные в продуктах или функционал по формированию данных.
|
29
|
+
|
30
|
+
## Принцип работы
|
31
|
+
|
32
|
+
Весь процесс разделен на сбор и выгрузку данных. Выделяются следующие понятия:
|
33
|
+
|
34
|
+
Модель продукта
|
35
|
+
: Django-модель находящаяся в самом продукте. При помощи нее производится накапливание пользовательских данных;
|
36
|
+
|
37
|
+
Модель РВД
|
38
|
+
: Django-модель находящаяся в пакете РВД продукта. Из моделей РВД формируется схема БД, позволяющая хранить данные для
|
39
|
+
дальнейшей выгрузки в нормализованном виде;
|
40
|
+
|
41
|
+
Сущность РВД
|
42
|
+
: Описание формата выгрузки данных в РВД в виде dataclass-а. Хранит в себе описание первичных, внешних ключей,
|
43
|
+
обязательность и порядок полей.
|
44
|
+
|
45
|
+
На этапе сбора данных производится формирование данных моделей РВД на основе данных моделей продуктов. Существуют так
|
46
|
+
называемые расчетные модели, для которых данные рассчитываются в процессе сбора.
|
47
|
+
|
48
|
+
Стоит обратить внимание, что сущности РВД могут содержать в себе данные из нескольких моделей РВД.
|
49
|
+
|
50
|
+
## Требования к окружению
|
51
|
+
|
52
|
+
Для работы требуется Python >=3.9. Так же в зависимостях есть внутренние пакеты:
|
53
|
+
|
54
|
+
- educommon;
|
55
|
+
- function-tools;
|
56
|
+
- m3-db-utils;
|
57
|
+
- uploader-client.
|
58
|
+
|
59
|
+
Версии всех пакетов уточнены в файлах с зависимостями.
|
60
|
+
|
61
|
+
## Разворачивание
|
62
|
+
|
63
|
+
Перед внедрением пакета в проект, необходимо убедиться, что:
|
64
|
+
|
65
|
+
- В проекте используется логирование из educommon;
|
66
|
+
- В проект внедрен function-tools;
|
67
|
+
- В проект внедрен m3-db-utils;
|
68
|
+
- В проект внедрен uploader-client.
|
69
|
+
|
70
|
+
## Параметры конфигурационного файла
|
71
|
+
|
72
|
+
В разных проектах существуют различные способы добавления настроек, где-то через плагины, где-то напрямую в settings.py.
|
73
|
+
Будет рассмотрен подход указания настроек в settings.py и указания параметров в конфигурационном файле.
|
74
|
+
|
75
|
+
Для возможности конфигурирования необходимо проделать ряд действий:
|
76
|
+
|
77
|
+
- Определение значений по умолчанию настроек в settings.py:
|
78
|
+
```
|
79
|
+
PROJECT_DEFAULT_CONFIG.update({
|
80
|
+
# Настройки РВД
|
81
|
+
('rdm_general', 'EXPORT_ENTITY_ID_PREFIX'): '', # Дефолтное значение нужно изменить на специфическое системе
|
82
|
+
('rdm_general', 'COLLECT_CHUNK_SIZE'): 500,
|
83
|
+
('rdm_general', 'EXPORT_CHUNK_SIZE'): 500,
|
84
|
+
('rdm_transfer_task', 'MINUTE'): '0',
|
85
|
+
('rdm_transfer_task', 'HOUR'): '*/4',
|
86
|
+
('rdm_transfer_task', 'DAY_OF_WEEK'): '*',
|
87
|
+
('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS'): 21600,
|
88
|
+
('rdm_transfer_task', 'TIMEDELTA'): 3600,
|
89
|
+
('rdm_transfer_task', 'ENTITIES'): '',
|
90
|
+
('rdm_upload_status_task', 'MINUTE'): '*/30',
|
91
|
+
('rdm_upload_status_task', 'HOUR'): '*',
|
92
|
+
('rdm_upload_status_task', 'DAY_OF_WEEK'): '*',
|
93
|
+
('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
94
|
+
('uploader_client', 'URL'): 'http://localhost:8090',
|
95
|
+
('uploader_client', 'DATAMART_NAME'): '',
|
96
|
+
('uploader_client', 'REQUEST_RETRIES'): 10,
|
97
|
+
('uploader_client', 'REQUEST_TIMEOUT'): 10,
|
98
|
+
('uploader_client', 'ENABLE_REQUEST_EMULATION'): False,
|
99
|
+
})
|
100
|
+
```
|
101
|
+
- Получение значений настроек из конфигурационного файла в settings.py:
|
102
|
+
|
103
|
+
```
|
104
|
+
# Ссылка на каталог с файлами для загрузки
|
105
|
+
UPLOADS = 'uploads'
|
106
|
+
|
107
|
+
# =============================================================================
|
108
|
+
# Интеграция с Региональной витриной данных (РВД)
|
109
|
+
# =============================================================================
|
110
|
+
|
111
|
+
# Префикс идентификаторов записей сущностей специфический для продукта
|
112
|
+
RDM_EXPORT_ENTITY_ID_PREFIX = conf.get('rdm_general', 'EXPORT_ENTITY_ID_PREFIX')
|
113
|
+
|
114
|
+
# Количество записей моделей ЭШ обрабатываемых за одну итерацию сбора данных
|
115
|
+
RDM_COLLECT_CHUNK_SIZE = conf.get_int('rdm_general', 'COLLECT_CHUNK_SIZE')
|
116
|
+
|
117
|
+
# Количество записей моделей обрабатываемых за одну итерацию экспорта данных
|
118
|
+
RDM_EXPORT_CHUNK_SIZE = conf.get_int('rdm_general', 'EXPORT_CHUNK_SIZE')
|
119
|
+
|
120
|
+
# Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified
|
121
|
+
RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE = conf.get_int('rdm_general', 'UPDATE_NON_EXPORTED_CHUNK_SIZE')
|
122
|
+
|
123
|
+
# Настройка запуска периодической задачи выгрузки данных:
|
124
|
+
RDM_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task', 'MINUTE')
|
125
|
+
RDM_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task', 'HOUR')
|
126
|
+
RDM_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task', 'DAY_OF_WEEK')
|
127
|
+
RDM_TRANSFER_TASK_EXPIRE_SECOND = conf.get('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS')
|
128
|
+
|
129
|
+
# Настройка запуска периодической задачи статуса загрузки данных в витрину:
|
130
|
+
RDM_UPLOAD_STATUS_TASK_MINUTE = conf.get('rdm_upload_status_task', 'MINUTE')
|
131
|
+
RDM_UPLOAD_STATUS_TASK_HOUR = conf.get('rdm_upload_status_task', 'HOUR')
|
132
|
+
RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK = conf.get('rdm_upload_status_task', 'DAY_OF_WEEK')
|
133
|
+
RDM_UPLOAD_STATUS_TASK_EXPIRE_SECOND = conf.get('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS')
|
134
|
+
|
135
|
+
# Настройка запуска периодической задачи поиска зависших этапов экспорта:
|
136
|
+
RDM_CHECK_SUSPEND_TASK_MINUTE = conf.get('rdm_check_suspend_task', 'MINUTE')
|
137
|
+
RDM_CHECK_SUSPEND_TASK_HOUR = conf.get('rdm_check_suspend_task', 'HOUR')
|
138
|
+
RDM_CHECK_SUSPEND_TASK_DAY_OF_WEEK = conf.get('rdm_check_suspend_task', 'DAY_OF_WEEK')
|
139
|
+
RDM_CHECK_SUSPEND_TASK_EXPIRE_SECOND = conf.get('rdm_check_suspend_task', 'LOCK_EXPIRE_SECONDS')
|
140
|
+
RDM_CHECK_SUSPEND_TASK_TIMEDELTA = conf.get_int('rdm_check_suspend_task', 'TIMEDELTA')
|
141
|
+
|
142
|
+
# Загрузка данных в Региональную витрину данных (РВД)
|
143
|
+
# Адрес витрины (schema://host:port)
|
144
|
+
RDM_UPLOADER_CLIENT_URL = conf.get('uploader_client', 'URL')
|
145
|
+
|
146
|
+
# Мнемоника Витрины
|
147
|
+
RDM_UPLOADER_CLIENT_DATAMART_NAME = conf.get('uploader_client', 'DATAMART_NAME')
|
148
|
+
|
149
|
+
# Количество повторных попыток запроса
|
150
|
+
RDM_UPLOADER_CLIENT_REQUEST_RETRIES = conf.get_int('uploader_client', 'REQUEST_RETRIES')
|
151
|
+
|
152
|
+
# Таймаут запроса, сек
|
153
|
+
RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT = conf.get_int('uploader_client', 'REQUEST_TIMEOUT')
|
154
|
+
|
155
|
+
# Включить эмуляцию отправки запросов
|
156
|
+
RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION = conf.get_bool('uploader_client', 'ENABLE_REQUEST_EMULATION')
|
157
|
+
|
158
|
+
```
|
159
|
+
|
160
|
+
Перечень настроек в settings.py указан в таблице ниже.
|
161
|
+
|
162
|
+
| Название настройки в settings | Описание | Значение по умолчанию |
|
163
|
+
| -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |
|
164
|
+
| UPLOADS | Основная директория в MEDIA, в которой будет создана директория edu_rdm_integration для сохранения файлов для дальнейшей выгрузки | 500 |
|
165
|
+
| RDM_COLLECT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию сбора данных | 500 |
|
166
|
+
| RDM_EXPORT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию экспорта | 500 |
|
167
|
+
| RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE | # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified | 5000 |
|
168
|
+
| RDM_UPLOADER_CLIENT_URL | Адрес витрины (schema://host:port) | 'http://localhost:8090' |
|
169
|
+
| RDM_UPLOADER_CLIENT_DATAMART_NAME | Мнемоника Витрины | 'test' |
|
170
|
+
| RDM_UPLOADER_CLIENT_REQUEST_RETRIES | Количество повторных попыток запроса | 10 |
|
171
|
+
| RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT | Таймаут запроса, сек | 10 |
|
172
|
+
| RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION | Включить эмуляцию отправки запросов | True |
|
173
|
+
| RDM_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи выгрузки данных. Минута | '0' |
|
174
|
+
| RDM_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи выгрузки данных. Час | '*/4' |
|
175
|
+
| RDM_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи выгрузки данных. День недели | '*' |
|
176
|
+
| RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 21600 |
|
177
|
+
| RDM_UPLOAD_STATUS_TASK_MINUTE | Настройка запуска периодической задачи статуса загрузки данных в витрину. Минута | '*/30' |
|
178
|
+
| RDM_UPLOAD_STATUS_TASK_HOUR | Настройка запуска периодической задачи статуса загрузки данных в витрину. Час | '*' |
|
179
|
+
| RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи статуса загрузки данных в витрину. День недели | '*' |
|
180
|
+
| RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 3600 |
|
181
|
+
| RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT | Дельта для определения зависшего подэтапа. Минута | 120 |
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
- В дефолтный конфиг проекта необходимо добавить:
|
186
|
+
|
187
|
+
```
|
188
|
+
# Общие настройки интеграции с РВД
|
189
|
+
[rmd_general]
|
190
|
+
# Префикс идентификаторов записей сущностей специфический для продукта. Указывается в settings.py и не должен
|
191
|
+
# изменяться. Возможность изменения через конфигурационный файл оставлена для экстренных случаев.
|
192
|
+
# EXPORT_ENTITY_ID_PREFIX =
|
193
|
+
# Количество записей моделей обрабатываемых за одну итерацию экспорта данных
|
194
|
+
EXPORT_CHUNK_SIZE = 500
|
195
|
+
# Количество записей моделей ЭШ обрабатываемых за одну итерацию сбора данных
|
196
|
+
COLLECT_CHUNK_SIZE = 500
|
197
|
+
# Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified
|
198
|
+
UPDATE_NON_EXPORTED_CHUNK_SIZE = 5_000
|
199
|
+
|
200
|
+
# Настройка запуска периодической задачи выгрузки данных
|
201
|
+
[rdm_transfer_task]
|
202
|
+
MINUTE=*/2
|
203
|
+
HOUR=*
|
204
|
+
DAY_OF_WEEK=*
|
205
|
+
LOCK_EXPIRE_SECONDS=21600
|
206
|
+
# Дельта между прошлым и текущим запуском, сек
|
207
|
+
TIMEDELTA=120
|
208
|
+
# Сущности, по которым должен производиться сбор и выгрузка данных. Перечисляются через запятую без пробелов.
|
209
|
+
ENTITIES =
|
210
|
+
|
211
|
+
# Настройка запуска периодической задачи статуса загрузки данных в витрину
|
212
|
+
[rdm_upload_status_task]
|
213
|
+
MINUTE=*/2
|
214
|
+
HOUR=*
|
215
|
+
DAY_OF_WEEK=*
|
216
|
+
LOCK_EXPIRE_SECONDS=7200
|
217
|
+
|
218
|
+
# Настройка запуска периодической задачи поиска зависших этапов экспорта
|
219
|
+
[rdm_check_suspend_task]
|
220
|
+
MINUTE=*/10
|
221
|
+
HOUR=*
|
222
|
+
DAY_OF_WEEK=*
|
223
|
+
LOCK_EXPIRE_SECONDS=7200
|
224
|
+
# Дельта для определения зависшего подэтапа, мин
|
225
|
+
STAGE_TIMEOUT=120
|
226
|
+
|
227
|
+
[uploader_client]
|
228
|
+
# Адрес витрины
|
229
|
+
URL = http://localhost:8090
|
230
|
+
# Мнемоника Витрины
|
231
|
+
DATAMART_NAME = test
|
232
|
+
# Количество повторных попыток запроса
|
233
|
+
REQUEST_RETRIES = 10
|
234
|
+
# Таймаут запроса, сек
|
235
|
+
REQUEST_TIMEOUT = 10
|
236
|
+
# Включить эмуляцию отправки запросов
|
237
|
+
ENABLE_REQUEST_EMULATION = True
|
238
|
+
```
|
239
|
+
|
240
|
+
На основе дефолтного конфига произвести конфигурирование приложений.
|
241
|
+
|
242
|
+
## Сборка и распространение
|
243
|
+
|
244
|
+
Сборка пакета производится при помощи [Job-а в Jenkins M3.build_dist](http://jenkins.py.bars.group/view/PY/job/M3.packages/job/M3.build_dist/).
|
245
|
+
|
246
|
+
Пакет выкладывается в глобальный [PYPI](https://pypi.org/project/edu-rdm-integration/) и во внутренний [Nexus](http://nexus.py.bars.group/#browse/browse:pypi-edu-private:edu-rdm-integration)
|
247
|
+
|
248
|
+
## Документация
|
249
|
+
|
250
|
+
С документацией можно ознакомиться по ссылке http://docs.py.bars.group/edu-rdm-integration/
|
@@ -90,7 +90,7 @@ edu_rdm_integration/export_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
90
90
|
edu_rdm_integration/export_data/consts.py,sha256=ZEi1kXMs-54KFKxkyGIQVwZ4d8OrOF_vLFQIjjWdSPQ,441
|
91
91
|
edu_rdm_integration/export_data/dataclasses.py,sha256=IhftRopP4lS-m3ygdBU5Bz0HF71VSBP4JQ6-8VIVgtY,260
|
92
92
|
edu_rdm_integration/export_data/export.py,sha256=qKvFRTcy2ZgaBMn6mEi_OsueNXZ7j_v2neu2Lu99MEs,19447
|
93
|
-
edu_rdm_integration/export_data/export_manager.py,sha256=
|
93
|
+
edu_rdm_integration/export_data/export_manager.py,sha256=ySAbrIiVo690HXGsEC_nxhF5FHCRl18rm5E4Ytr50VU,13285
|
94
94
|
edu_rdm_integration/export_data/generators.py,sha256=UIoX49rQnUwwC9PL17te7Rb4WRDe_5ShYQ1Rygf36NQ,4010
|
95
95
|
edu_rdm_integration/export_data/helpers.py,sha256=JKL4MC0IuoJv72NNnL8hG7HLy7kNHOXFp1uLCKF15AM,2900
|
96
96
|
edu_rdm_integration/export_data/queue.py,sha256=GlwRwhMdv38OxmtFpFD5-Pt79gMe3IcLeWFQCLXTcik,6128
|
@@ -179,9 +179,9 @@ edu_rdm_integration/uploader_log/enums.py,sha256=rgSO3BL2rh2xpfm0Pt4waQW8fB1VMJL
|
|
179
179
|
edu_rdm_integration/uploader_log/managers.py,sha256=OFdToWV8qhdfeGNpd-UWAmSEISzixmVQ6LF75EW7gzA,3248
|
180
180
|
edu_rdm_integration/uploader_log/ui.py,sha256=YM9Buqp2wxE95Wf5gvAATBzuYzDOossK1sEmvFk07cI,2110
|
181
181
|
edu_rdm_integration/uploader_log/templates/ui-js/object-grid-buttons.js,sha256=2xyGe0wdVokM0RhpzRzcRvJPBkBmPe3SlZry4oP4Nzs,6201
|
182
|
-
edu_rdm_integration-3.5.
|
183
|
-
edu_rdm_integration-3.5.
|
184
|
-
edu_rdm_integration-3.5.
|
185
|
-
edu_rdm_integration-3.5.
|
186
|
-
edu_rdm_integration-3.5.
|
187
|
-
edu_rdm_integration-3.5.
|
182
|
+
edu_rdm_integration-3.5.8.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
|
183
|
+
edu_rdm_integration-3.5.8.dist-info/METADATA,sha256=gLpWbKbbV5NwdI4QjG2uS-VM0ZqS5RX9OsmowZpGlbU,18691
|
184
|
+
edu_rdm_integration-3.5.8.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
185
|
+
edu_rdm_integration-3.5.8.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
186
|
+
edu_rdm_integration-3.5.8.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
|
187
|
+
edu_rdm_integration-3.5.8.dist-info/RECORD,,
|