edu-rdm-integration 3.4.9__py3-none-any.whl → 3.5.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/adapters/functions.py +3 -6
- edu_rdm_integration/adapters/helpers.py +2 -5
- edu_rdm_integration/adapters/managers.py +1 -4
- edu_rdm_integration/adapters/runners.py +9 -13
- edu_rdm_integration/apps.py +1 -1
- edu_rdm_integration/collect_data/base/caches.py +5 -7
- edu_rdm_integration/collect_data/base/helpers.py +1 -5
- edu_rdm_integration/collect_data/base/managers.py +4 -7
- edu_rdm_integration/collect_data/base/mixins.py +5 -8
- edu_rdm_integration/collect_data/calculated/base/functions.py +3 -6
- edu_rdm_integration/collect_data/calculated/base/helpers.py +2 -6
- edu_rdm_integration/collect_data/calculated/base/managers.py +1 -4
- edu_rdm_integration/collect_data/calculated/base/runners.py +3 -7
- edu_rdm_integration/collect_data/calculated/strategies.py +1 -2
- edu_rdm_integration/collect_data/collect.py +6 -10
- edu_rdm_integration/collect_data/generators.py +4 -6
- edu_rdm_integration/collect_data/helpers.py +1 -4
- edu_rdm_integration/collect_data/non_calculated/base/caches.py +2 -4
- edu_rdm_integration/collect_data/non_calculated/base/functions.py +3 -6
- edu_rdm_integration/collect_data/non_calculated/base/helpers.py +2 -6
- edu_rdm_integration/collect_data/non_calculated/base/managers.py +1 -4
- edu_rdm_integration/collect_data/non_calculated/base/runners.py +3 -7
- edu_rdm_integration/collect_data/non_calculated/strategies.py +1 -2
- edu_rdm_integration/collect_data/tests.py +3 -5
- edu_rdm_integration/entities.py +21 -22
- edu_rdm_integration/enum_register/mixins.py +7 -10
- edu_rdm_integration/enum_register/register.py +1 -2
- edu_rdm_integration/export_data/base/caches.py +1 -5
- edu_rdm_integration/export_data/base/functions.py +5 -7
- edu_rdm_integration/export_data/base/helpers.py +9 -13
- edu_rdm_integration/export_data/base/managers.py +3 -6
- edu_rdm_integration/export_data/base/runners.py +3 -7
- edu_rdm_integration/export_data/export.py +5 -9
- edu_rdm_integration/export_data/export_manger.py +1 -2
- edu_rdm_integration/export_data/generators.py +2 -3
- edu_rdm_integration/export_data/helpers.py +1 -4
- edu_rdm_integration/export_data/queue.py +3 -6
- edu_rdm_integration/export_data/strategies.py +1 -2
- edu_rdm_integration/function_templates/function_collect_data_template/functions.py-tpl +8 -9
- edu_rdm_integration/function_templates/function_collect_data_template/helpers.py-tpl +4 -6
- edu_rdm_integration/function_templates/function_collect_data_template/managers.py-tpl +2 -4
- edu_rdm_integration/function_templates/function_collect_data_template/runners.py-tpl +5 -7
- edu_rdm_integration/function_templates/function_collect_data_template/tests.py-tpl +1 -6
- edu_rdm_integration/function_templates/function_export_data_template/caches.py-tpl +1 -2
- edu_rdm_integration/function_templates/function_export_data_template/functions.py-tpl +5 -7
- edu_rdm_integration/function_templates/function_export_data_template/helpers.py-tpl +2 -6
- edu_rdm_integration/function_templates/function_export_data_template/managers.py-tpl +3 -6
- edu_rdm_integration/function_templates/function_export_data_template/runners.py-tpl +5 -7
- edu_rdm_integration/helpers.py +8 -11
- edu_rdm_integration/management/commands/async_fix_attachment_size.py +3 -7
- edu_rdm_integration/management/commands/check_upload_status.py +4 -4
- edu_rdm_integration/mapping.py +2 -7
- edu_rdm_integration/migrations/0013_set_attachment_size.py +4 -3
- edu_rdm_integration/models.py +3 -5
- edu_rdm_integration/redis_cache.py +1 -2
- edu_rdm_integration/registry/ui.py +5 -3
- edu_rdm_integration/storages.py +9 -15
- edu_rdm_integration/tasks.py +4 -6
- edu_rdm_integration/typing.py +1 -1
- edu_rdm_integration/uploader_log/actions.py +1 -1
- edu_rdm_integration/utils.py +6 -14
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.0.dist-info}/METADATA +19 -6
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.0.dist-info}/RECORD +67 -67
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.0.dist-info}/LICENSE +0 -0
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.0.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.0.dist-info}/namespace_packages.txt +0 -0
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.0.dist-info}/top_level.txt +0 -0
@@ -1,9 +1,6 @@
|
|
1
1
|
from abc import (
|
2
2
|
ABCMeta,
|
3
3
|
)
|
4
|
-
from typing import (
|
5
|
-
Type,
|
6
|
-
)
|
7
4
|
|
8
5
|
from edu_rdm_integration.collect_data.base.managers import (
|
9
6
|
BaseCollectingDataRunnerManager,
|
@@ -19,7 +16,7 @@ class BaseCollectingExportedDataRunnerManager(BaseCollectingDataRunnerManager, m
|
|
19
16
|
"""
|
20
17
|
|
21
18
|
@classmethod
|
22
|
-
def _prepare_runner_class(cls) ->
|
19
|
+
def _prepare_runner_class(cls) -> type[BaseCollectingExportedDataRunner]:
|
23
20
|
"""
|
24
21
|
Возвращает класс ранера.
|
25
22
|
"""
|
@@ -1,7 +1,3 @@
|
|
1
|
-
from typing import (
|
2
|
-
Type,
|
3
|
-
)
|
4
|
-
|
5
1
|
from edu_rdm_integration.collect_data.base.runners import (
|
6
2
|
BaseCollectingDataRunner,
|
7
3
|
)
|
@@ -21,19 +17,19 @@ class BaseCollectingExportedDataRunner(BaseCollectingDataRunner):
|
|
21
17
|
Базовый класс ранеров функций сбора данных для интеграции с "Региональная витрина данных".
|
22
18
|
"""
|
23
19
|
|
24
|
-
def _prepare_helper_class(self) ->
|
20
|
+
def _prepare_helper_class(self) -> type[BaseCollectingExportedDataRunnerHelper]:
|
25
21
|
"""
|
26
22
|
Возвращает класс помощника ранера функции.
|
27
23
|
"""
|
28
24
|
return BaseCollectingExportedDataRunnerHelper
|
29
25
|
|
30
|
-
def _prepare_validator_class(self) ->
|
26
|
+
def _prepare_validator_class(self) -> type[BaseCollectingExportedDataRunnerValidator]:
|
31
27
|
"""
|
32
28
|
Возвращает класс валидатора ранера функции.
|
33
29
|
"""
|
34
30
|
return BaseCollectingExportedDataRunnerValidator
|
35
31
|
|
36
|
-
def _prepare_result_class(self) ->
|
32
|
+
def _prepare_result_class(self) -> type[BaseCollectingExportedDataRunnerResult]:
|
37
33
|
"""
|
38
34
|
Возвращает класс результата ранера функции.
|
39
35
|
"""
|
@@ -1,5 +1,4 @@
|
|
1
1
|
from typing import (
|
2
|
-
List,
|
3
2
|
Optional,
|
4
3
|
)
|
5
4
|
|
@@ -71,7 +70,7 @@ class CollectingExportedDataFunctionImplementationStrategy(
|
|
71
70
|
)
|
72
71
|
|
73
72
|
@classmethod
|
74
|
-
def _prepare_tags(cls) ->
|
73
|
+
def _prepare_tags(cls) -> list[str]:
|
75
74
|
"""
|
76
75
|
Список тегов, по которым сущность можно будет осуществлять поиск.
|
77
76
|
"""
|
@@ -4,9 +4,7 @@ import uuid
|
|
4
4
|
from typing import (
|
5
5
|
TYPE_CHECKING,
|
6
6
|
Any,
|
7
|
-
Dict,
|
8
7
|
Optional,
|
9
|
-
Type,
|
10
8
|
)
|
11
9
|
from unittest import (
|
12
10
|
mock,
|
@@ -65,7 +63,7 @@ class BaseCollectingFunctionTestCase(TestCase):
|
|
65
63
|
databases = (settings.DEFAULT_DB_ALIAS, settings.SERVICE_DB_ALIAS)
|
66
64
|
|
67
65
|
@property
|
68
|
-
def manager(self) ->
|
66
|
+
def manager(self) -> type['RunnerManager']:
|
69
67
|
"""Менеджер раннера Функции сбора."""
|
70
68
|
raise NotImplementedError
|
71
69
|
|
@@ -101,7 +99,7 @@ class BaseCollectingFunctionTestCase(TestCase):
|
|
101
99
|
ready_to_save_mock: mock.MagicMock,
|
102
100
|
*,
|
103
101
|
instance: 'Model',
|
104
|
-
changes: Optional[
|
102
|
+
changes: Optional[dict[str, Any]] = None,
|
105
103
|
operation: EntityLogOperation = EntityLogOperation.UPDATE,
|
106
104
|
) -> None:
|
107
105
|
"""Создает AuditLog."""
|
@@ -147,7 +145,7 @@ class BaseCollectingFunctionTestCase(TestCase):
|
|
147
145
|
stage=stage,
|
148
146
|
)
|
149
147
|
|
150
|
-
def _clean_data(self, instance: 'Model') ->
|
148
|
+
def _clean_data(self, instance: 'Model') -> dict[str, Optional[str]]:
|
151
149
|
"""Подготавливает данные экземпляра модели для формирования AuditLog'a."""
|
152
150
|
fields = {}
|
153
151
|
|
edu_rdm_integration/entities.py
CHANGED
@@ -6,7 +6,6 @@ from datetime import (
|
|
6
6
|
)
|
7
7
|
from typing import (
|
8
8
|
Optional,
|
9
|
-
Tuple,
|
10
9
|
)
|
11
10
|
|
12
11
|
from educommon.integration_entities.entities import (
|
@@ -73,31 +72,31 @@ class AddressEntity(EntityEnumRegisterMixin, BaseEntity):
|
|
73
72
|
end_datetime: datetime = None
|
74
73
|
|
75
74
|
@classmethod
|
76
|
-
def get_required_fields(cls) ->
|
75
|
+
def get_required_fields(cls) -> tuple[str, ...]:
|
77
76
|
"""Возвращает кортеж обязательных полей."""
|
78
77
|
return cls.ID, cls.TYPE_ADDRESS, cls.TEXT, cls.CREATE_DATETIME, cls.SEND_DATETIME
|
79
78
|
|
80
79
|
@classmethod
|
81
|
-
def get_hashable_fields(cls) ->
|
80
|
+
def get_hashable_fields(cls) -> tuple[str, ...]:
|
82
81
|
"""Возвращает кортеж полей, которые необходимо деперсонализировать (хэшировать)."""
|
83
82
|
return tuple()
|
84
83
|
|
85
84
|
@classmethod
|
86
|
-
def get_primary_key_fields(cls) ->
|
85
|
+
def get_primary_key_fields(cls) -> tuple[str, ...]:
|
87
86
|
"""
|
88
87
|
Возвращает кортеж полей первичного ключа.
|
89
88
|
"""
|
90
89
|
return cls.ID,
|
91
90
|
|
92
91
|
@classmethod
|
93
|
-
def get_foreign_key_fields(cls) ->
|
92
|
+
def get_foreign_key_fields(cls) -> tuple[str, ...]:
|
94
93
|
"""
|
95
94
|
Возвращает кортеж полей внешних ключей.
|
96
95
|
"""
|
97
96
|
return ()
|
98
97
|
|
99
98
|
@classmethod
|
100
|
-
def get_ordered_fields(cls) ->
|
99
|
+
def get_ordered_fields(cls) -> tuple[str, ...]:
|
101
100
|
return (
|
102
101
|
cls.ID, cls.USE_ADDRESS, cls.TYPE_ADDRESS, cls.TEXT, cls.CITY, cls.DISTRICT, cls.STATE, cls.POSTAL_CODE,
|
103
102
|
cls.COUNTRY, cls.START_DATETIME, cls.END_DATETIME, cls.FLAT, cls.BUILDING, cls.HOUSE, cls.STREET,
|
@@ -140,31 +139,31 @@ class AddressOrganisationEntity(EntityEnumRegisterMixin, BaseEntity):
|
|
140
139
|
send_datetime: datetime
|
141
140
|
|
142
141
|
@classmethod
|
143
|
-
def get_required_fields(cls) ->
|
142
|
+
def get_required_fields(cls) -> tuple[str, ...]:
|
144
143
|
"""Возвращает кортеж обязательных полей."""
|
145
144
|
return cls.ADDRESS_ID, cls.ORGANISATION_ID, cls.CREATE_DATETIME, cls.SEND_DATETIME
|
146
145
|
|
147
146
|
@classmethod
|
148
|
-
def get_hashable_fields(cls) ->
|
147
|
+
def get_hashable_fields(cls) -> tuple[str, ...]:
|
149
148
|
"""Возвращает кортеж полей, которые необходимо деперсонализировать (хэшировать)."""
|
150
149
|
return tuple()
|
151
150
|
|
152
151
|
@classmethod
|
153
|
-
def get_primary_key_fields(cls) ->
|
152
|
+
def get_primary_key_fields(cls) -> tuple[str, ...]:
|
154
153
|
"""
|
155
154
|
Возвращает кортеж полей первичного ключа.
|
156
155
|
"""
|
157
156
|
return cls.ADDRESS_ID, cls.ORGANISATION_ID,
|
158
157
|
|
159
158
|
@classmethod
|
160
|
-
def get_foreign_key_fields(cls) ->
|
159
|
+
def get_foreign_key_fields(cls) -> tuple[str, ...]:
|
161
160
|
"""
|
162
161
|
Возвращает кортеж полей внешних ключей.
|
163
162
|
"""
|
164
163
|
return ()
|
165
164
|
|
166
165
|
@classmethod
|
167
|
-
def get_ordered_fields(cls) ->
|
166
|
+
def get_ordered_fields(cls) -> tuple[str, ...]:
|
168
167
|
return cls.ADDRESS_ID, cls.ORGANISATION_ID, cls.CREATE_DATETIME, cls.SEND_DATETIME,
|
169
168
|
|
170
169
|
# TODO EDUSCHL-20938 Удалить в рамках задачи
|
@@ -180,7 +179,7 @@ class AddressOrganisationEntity(EntityEnumRegisterMixin, BaseEntity):
|
|
180
179
|
|
181
180
|
# TODO EDUSCHL-20938 Удалить в рамках задачи
|
182
181
|
@classmethod
|
183
|
-
def get_additional_model_enums(cls) -> Optional[
|
182
|
+
def get_additional_model_enums(cls) -> Optional[tuple[ModelEnumValue]]:
|
184
183
|
"""Возвращает кортеж значений модели-перечисления основной модели сущности.
|
185
184
|
|
186
185
|
В классе определяется поле additional_model_enums или данный метод.
|
@@ -225,7 +224,7 @@ class TelecomEntity(EntityEnumRegisterMixin, BaseEntity):
|
|
225
224
|
end_datetime: datetime = None
|
226
225
|
|
227
226
|
@classmethod
|
228
|
-
def get_ordered_fields(cls) ->
|
227
|
+
def get_ordered_fields(cls) -> tuple[str, ...]:
|
229
228
|
"""
|
230
229
|
Возвращает кортеж полей в правильном порядке.
|
231
230
|
"""
|
@@ -233,28 +232,28 @@ class TelecomEntity(EntityEnumRegisterMixin, BaseEntity):
|
|
233
232
|
cls.START_DATETIME, cls.END_DATETIME, cls.CREATE_DATETIME, cls.SEND_DATETIME,)
|
234
233
|
|
235
234
|
@classmethod
|
236
|
-
def get_primary_key_fields(cls) ->
|
235
|
+
def get_primary_key_fields(cls) -> tuple[str, ...]:
|
237
236
|
"""
|
238
237
|
Возвращает кортеж полей первичного ключа.
|
239
238
|
"""
|
240
239
|
return cls.ID,
|
241
240
|
|
242
241
|
@classmethod
|
243
|
-
def get_foreign_key_fields(cls) ->
|
242
|
+
def get_foreign_key_fields(cls) -> tuple[str, ...]:
|
244
243
|
"""
|
245
244
|
Возвращает кортеж полей внешних ключей.
|
246
245
|
"""
|
247
246
|
return ()
|
248
247
|
|
249
248
|
@classmethod
|
250
|
-
def get_required_fields(cls) ->
|
249
|
+
def get_required_fields(cls) -> tuple[str, ...]:
|
251
250
|
"""
|
252
251
|
Возвращает кортеж обязательных полей.
|
253
252
|
"""
|
254
253
|
return cls.ID, cls.CREATE_DATETIME, cls.SEND_DATETIME,
|
255
254
|
|
256
255
|
@classmethod
|
257
|
-
def get_hashable_fields(cls) ->
|
256
|
+
def get_hashable_fields(cls) -> tuple[str, ...]:
|
258
257
|
"""Возвращает кортеж полей, которые необходимо деперсонализировать (хэшировать)."""
|
259
258
|
return tuple()
|
260
259
|
|
@@ -326,7 +325,7 @@ class OrganisationsEntity(EntityEnumRegisterMixin, BaseEntity):
|
|
326
325
|
phone: str
|
327
326
|
|
328
327
|
@classmethod
|
329
|
-
def get_ordered_fields(cls) ->
|
328
|
+
def get_ordered_fields(cls) -> tuple[str, ...]:
|
330
329
|
"""
|
331
330
|
Возвращает кортеж полей в правильном порядке.
|
332
331
|
"""
|
@@ -353,7 +352,7 @@ class OrganisationsEntity(EntityEnumRegisterMixin, BaseEntity):
|
|
353
352
|
)
|
354
353
|
|
355
354
|
@classmethod
|
356
|
-
def get_required_fields(cls) ->
|
355
|
+
def get_required_fields(cls) -> tuple[str, ...]:
|
357
356
|
"""
|
358
357
|
Возвращает кортеж обязательных полей.
|
359
358
|
"""
|
@@ -377,21 +376,21 @@ class OrganisationsEntity(EntityEnumRegisterMixin, BaseEntity):
|
|
377
376
|
)
|
378
377
|
|
379
378
|
@classmethod
|
380
|
-
def get_primary_key_fields(cls) ->
|
379
|
+
def get_primary_key_fields(cls) -> tuple[str, ...]:
|
381
380
|
"""
|
382
381
|
Возвращает кортеж полей первичного ключа.
|
383
382
|
"""
|
384
383
|
return cls.ID,
|
385
384
|
|
386
385
|
@classmethod
|
387
|
-
def get_foreign_key_fields(cls) ->
|
386
|
+
def get_foreign_key_fields(cls) -> tuple[str, ...]:
|
388
387
|
"""
|
389
388
|
Возвращает кортеж полей внешних ключей.
|
390
389
|
"""
|
391
390
|
return cls.PARTOF_ID,
|
392
391
|
|
393
392
|
@classmethod
|
394
|
-
def get_hashable_fields(cls) ->
|
393
|
+
def get_hashable_fields(cls) -> tuple[str, ...]:
|
395
394
|
"""
|
396
395
|
Возвращает кортеж полей, которые необходимо деперсонализировать (хэшировать).
|
397
396
|
"""
|
@@ -1,10 +1,7 @@
|
|
1
1
|
from typing import (
|
2
2
|
Any,
|
3
|
-
Dict,
|
4
3
|
NamedTuple,
|
5
4
|
Optional,
|
6
|
-
Type,
|
7
|
-
Tuple,
|
8
5
|
)
|
9
6
|
|
10
7
|
from django.db import (
|
@@ -43,7 +40,7 @@ class EntityEnumRegisterMixin(BaseEnumRegisterMixin):
|
|
43
40
|
"""Значение RegionalDataMartModelEnum,
|
44
41
|
основной модели РВД для формирования сущности."""
|
45
42
|
|
46
|
-
additional_model_enums:
|
43
|
+
additional_model_enums: tuple[ModelEnumValue] = ()
|
47
44
|
"""Перечень дополнительных значений RegionalDataMartModelEnum,
|
48
45
|
которые участвуют в формировании записей сущностей"""
|
49
46
|
|
@@ -55,7 +52,7 @@ class EntityEnumRegisterMixin(BaseEnumRegisterMixin):
|
|
55
52
|
return camel_to_underscore(cls.__name__.rsplit('Entity', 1)[0], upper=True)
|
56
53
|
|
57
54
|
@classmethod
|
58
|
-
def get_register_params(cls) ->
|
55
|
+
def get_register_params(cls) -> dict[str, Any]:
|
59
56
|
register_params = super().get_register_params()
|
60
57
|
|
61
58
|
register_params['main_model_enum'] = getattr(cls, 'main_model_enum', None) or cls.get_main_model_enum()
|
@@ -76,7 +73,7 @@ class EntityEnumRegisterMixin(BaseEnumRegisterMixin):
|
|
76
73
|
|
77
74
|
# TODO EDUSCHL-20938 Удалить в рамках задачи
|
78
75
|
@classmethod
|
79
|
-
def get_additional_model_enums(cls) -> Optional[
|
76
|
+
def get_additional_model_enums(cls) -> Optional[tuple[ModelEnumValue]]:
|
80
77
|
"""Возвращает кортеж значений модели-перечисления основной модели сущности.
|
81
78
|
|
82
79
|
В классе определяется поле additional_model_enums или данный метод.
|
@@ -91,10 +88,10 @@ class ModelEnumRegisterMixin(BaseEnumRegisterMixin):
|
|
91
88
|
enum = RegionalDataMartModelEnum
|
92
89
|
"""Модель-перечисление в которую регистрируется модель."""
|
93
90
|
|
94
|
-
creating_trigger_models:
|
91
|
+
creating_trigger_models: tuple[models.Model, ...] = ()
|
95
92
|
"""Перечень моделей по которым генерируются логи."""
|
96
93
|
|
97
|
-
loggable_models:
|
94
|
+
loggable_models: tuple[models.Model, ...] = ()
|
98
95
|
"""Перечень моделей по которым собираются логи."""
|
99
96
|
|
100
97
|
@classproperty
|
@@ -106,7 +103,7 @@ class ModelEnumRegisterMixin(BaseEnumRegisterMixin):
|
|
106
103
|
return cls._meta.verbose_name
|
107
104
|
|
108
105
|
@classmethod
|
109
|
-
def get_register_params(cls) ->
|
106
|
+
def get_register_params(cls) -> dict[str, Any]:
|
110
107
|
register_params = super().get_register_params()
|
111
108
|
register_params['model'] = cls
|
112
109
|
register_params['creating_trigger_models'] = cls.creating_trigger_models
|
@@ -119,7 +116,7 @@ class FromNamedTupleMixin:
|
|
119
116
|
"""Миксин получения экземпляра модели из получаемого кэша значений."""
|
120
117
|
|
121
118
|
@classmethod
|
122
|
-
def from_namedtuple(cls:
|
119
|
+
def from_namedtuple(cls: type[MODEL_TYPE_VAR], namedtuple: NamedTuple) -> MODEL_TYPE_VAR:
|
123
120
|
"""Создает экземпляр класса из NamedTuple."""
|
124
121
|
return cls(
|
125
122
|
**{
|
@@ -8,7 +8,6 @@ from operator import (
|
|
8
8
|
)
|
9
9
|
from typing import (
|
10
10
|
Iterable,
|
11
|
-
Type,
|
12
11
|
)
|
13
12
|
|
14
13
|
from django.apps import (
|
@@ -31,7 +30,7 @@ from edu_rdm_integration.enum_register.mixins import (
|
|
31
30
|
)
|
32
31
|
|
33
32
|
|
34
|
-
def register_classes(classes: Iterable[
|
33
|
+
def register_classes(classes: Iterable[type[BaseEnumRegisterMixin]]) -> None:
|
35
34
|
"""Вызывает метод регистрации в модель-перечисление
|
36
35
|
у переданных классов.
|
37
36
|
|
@@ -1,7 +1,3 @@
|
|
1
|
-
from typing import (
|
2
|
-
List,
|
3
|
-
)
|
4
|
-
|
5
1
|
from educommon.integration_entities.entities import (
|
6
2
|
BaseEntity,
|
7
3
|
)
|
@@ -23,7 +19,7 @@ class BaseExportDataFunctionCacheStorage(WebEduFunctionCacheStorage):
|
|
23
19
|
Базовый кеш помощников функций выгрузки данных для интеграции с "Региональная витрина данных".
|
24
20
|
"""
|
25
21
|
|
26
|
-
def _prepare_entity_instances(self, model_ids, *args, **kwargs) ->
|
22
|
+
def _prepare_entity_instances(self, model_ids, *args, **kwargs) -> list[BaseEntity]:
|
27
23
|
"""
|
28
24
|
Формирование списка объектов сущностей для дальнейшей выгрузки.
|
29
25
|
|
@@ -2,8 +2,6 @@ from abc import (
|
|
2
2
|
ABCMeta,
|
3
3
|
)
|
4
4
|
from typing import (
|
5
|
-
List,
|
6
|
-
Type,
|
7
5
|
Union,
|
8
6
|
)
|
9
7
|
|
@@ -66,7 +64,7 @@ class BaseExportDataFunction(
|
|
66
64
|
Базовый класс функций выгрузки данных для интеграции с "Региональная витрина данных".
|
67
65
|
"""
|
68
66
|
|
69
|
-
def __init__(self, *args, stage: ExportingDataStage, model_ids:
|
67
|
+
def __init__(self, *args, stage: ExportingDataStage, model_ids: list[Union[int, str]], **kwargs):
|
70
68
|
super().__init__(*args, entities=self.entities, model_ids=model_ids, **kwargs)
|
71
69
|
|
72
70
|
self._sub_stage = ExportingDataSubStage.objects.create(
|
@@ -96,19 +94,19 @@ class BaseExportDataFunction(
|
|
96
94
|
|
97
95
|
self.has_data = False
|
98
96
|
|
99
|
-
def _prepare_helper_class(self) ->
|
97
|
+
def _prepare_helper_class(self) -> type[BaseExportDataFunctionHelper]:
|
100
98
|
"""
|
101
99
|
Возвращает класс помощника функции.
|
102
100
|
"""
|
103
101
|
return BaseExportDataFunctionHelper
|
104
102
|
|
105
|
-
def _prepare_validator_class(self) ->
|
103
|
+
def _prepare_validator_class(self) -> type[BaseExportDataFunctionValidator]:
|
106
104
|
"""
|
107
105
|
Возвращает класс валидатора функции.
|
108
106
|
"""
|
109
107
|
return BaseExportDataFunctionValidator
|
110
108
|
|
111
|
-
def _prepare_result_class(self) ->
|
109
|
+
def _prepare_result_class(self) -> type[BaseExportDataFunctionResult]:
|
112
110
|
"""
|
113
111
|
Возвращает класс результата функции.
|
114
112
|
"""
|
@@ -123,7 +121,7 @@ class BaseExportDataFunction(
|
|
123
121
|
|
124
122
|
logger.info(f'{LOGS_DELIMITER * 3}change status {repr(self._sub_stage)}')
|
125
123
|
|
126
|
-
def _prepare_record(self, entity_instance) ->
|
124
|
+
def _prepare_record(self, entity_instance) -> list[str]:
|
127
125
|
"""
|
128
126
|
Формирование списка строковых значений полей.
|
129
127
|
"""
|
@@ -4,10 +4,6 @@ from datetime import (
|
|
4
4
|
)
|
5
5
|
from typing import (
|
6
6
|
Any,
|
7
|
-
List,
|
8
|
-
Set,
|
9
|
-
Tuple,
|
10
|
-
Type,
|
11
7
|
)
|
12
8
|
|
13
9
|
from django.conf import (
|
@@ -41,7 +37,7 @@ class BaseExportDataRunnerHelper(WebEduRunnerHelper):
|
|
41
37
|
Базовый класс помощников ранеров функций выгрузки данных для интеграции с "Региональная витрина данных".
|
42
38
|
"""
|
43
39
|
|
44
|
-
def _prepare_cache_class(self) ->
|
40
|
+
def _prepare_cache_class(self) -> type[BaseExportDataRunnerCacheStorage]:
|
45
41
|
"""
|
46
42
|
Возвращает класс кеша помощника ранера.
|
47
43
|
"""
|
@@ -85,13 +81,13 @@ class BaseExportDataFunctionHelper(WebEduFunctionHelper):
|
|
85
81
|
def prepare_record(
|
86
82
|
cls,
|
87
83
|
entity_instance,
|
88
|
-
ordered_fields:
|
89
|
-
primary_key_fields:
|
90
|
-
foreign_key_fields:
|
91
|
-
required_fields:
|
92
|
-
hashable_fields:
|
93
|
-
ignore_prefix_fields:
|
94
|
-
) ->
|
84
|
+
ordered_fields: tuple[str, ...],
|
85
|
+
primary_key_fields: set[str],
|
86
|
+
foreign_key_fields: set[str],
|
87
|
+
required_fields: set[str],
|
88
|
+
hashable_fields: set[str],
|
89
|
+
ignore_prefix_fields: set[str],
|
90
|
+
) -> list[str]:
|
95
91
|
"""
|
96
92
|
Формирование списка строковых значений полей.
|
97
93
|
"""
|
@@ -127,7 +123,7 @@ class BaseExportDataFunctionHelper(WebEduFunctionHelper):
|
|
127
123
|
|
128
124
|
return field_values
|
129
125
|
|
130
|
-
def _prepare_cache_class(self) ->
|
126
|
+
def _prepare_cache_class(self) -> type[BaseExportDataFunctionCacheStorage]:
|
131
127
|
"""
|
132
128
|
Возвращает класс кеша помощника функции.
|
133
129
|
"""
|
@@ -7,10 +7,7 @@ from datetime import (
|
|
7
7
|
time,
|
8
8
|
)
|
9
9
|
from typing import (
|
10
|
-
Dict,
|
11
10
|
Iterator,
|
12
|
-
Tuple,
|
13
|
-
Type,
|
14
11
|
)
|
15
12
|
|
16
13
|
from educommon import (
|
@@ -68,7 +65,7 @@ class BaseExportDataRunnerManager(WebEduRunnerManager, metaclass=ABCMeta):
|
|
68
65
|
logger.info(f'{LOGS_DELIMITER}{repr(self._stage)} created.')
|
69
66
|
|
70
67
|
@classmethod
|
71
|
-
def _prepare_runner_class(cls) ->
|
68
|
+
def _prepare_runner_class(cls) -> type[BaseExportDataRunner]:
|
72
69
|
"""
|
73
70
|
Возвращает класс ранера.
|
74
71
|
"""
|
@@ -96,7 +93,7 @@ class BaseExportDataRunnerManager(WebEduRunnerManager, metaclass=ABCMeta):
|
|
96
93
|
|
97
94
|
return exporting_data_stage
|
98
95
|
|
99
|
-
def _prepare_period(self, *args, **kwargs) ->
|
96
|
+
def _prepare_period(self, *args, **kwargs) -> tuple[datetime, datetime]:
|
100
97
|
"""
|
101
98
|
Формирование периода сбора данных моделей РВД.
|
102
99
|
"""
|
@@ -116,7 +113,7 @@ class BaseExportDataRunnerManager(WebEduRunnerManager, metaclass=ABCMeta):
|
|
116
113
|
|
117
114
|
return period_started_at, period_ended_at
|
118
115
|
|
119
|
-
def _prepare_model_ids_map(self) ->
|
116
|
+
def _prepare_model_ids_map(self) -> dict[ModelEnumValue, Iterator[int]]:
|
120
117
|
"""
|
121
118
|
Осуществляется поиск записей моделей добавленных или обновленных за указанный период времени.
|
122
119
|
|
@@ -1,7 +1,3 @@
|
|
1
|
-
from typing import (
|
2
|
-
Type,
|
3
|
-
)
|
4
|
-
|
5
1
|
from edu_rdm_integration.adapters.runners import (
|
6
2
|
WebEduRunner,
|
7
3
|
)
|
@@ -21,19 +17,19 @@ class BaseExportDataRunner(WebEduRunner):
|
|
21
17
|
Базовый класс ранеров функций выгрузки данных для интеграции с "Региональная витрина данных".
|
22
18
|
"""
|
23
19
|
|
24
|
-
def _prepare_helper_class(self) ->
|
20
|
+
def _prepare_helper_class(self) -> type[BaseExportDataRunnerHelper]:
|
25
21
|
"""
|
26
22
|
Возвращает класс помощника ранера функции.
|
27
23
|
"""
|
28
24
|
return BaseExportDataRunnerHelper
|
29
25
|
|
30
|
-
def _prepare_validator_class(self) ->
|
26
|
+
def _prepare_validator_class(self) -> type[BaseExportDataRunnerValidator]:
|
31
27
|
"""
|
32
28
|
Возвращает класс валидатора ранера функции.
|
33
29
|
"""
|
34
30
|
return BaseExportDataRunnerValidator
|
35
31
|
|
36
|
-
def _prepare_result_class(self) ->
|
32
|
+
def _prepare_result_class(self) -> type[BaseExportDataRunnerResult]:
|
37
33
|
"""
|
38
34
|
Возвращает класс результата ранера функции.
|
39
35
|
"""
|
@@ -10,11 +10,7 @@ from datetime import (
|
|
10
10
|
)
|
11
11
|
from typing import (
|
12
12
|
TYPE_CHECKING,
|
13
|
-
Dict,
|
14
13
|
Iterable,
|
15
|
-
List,
|
16
|
-
Set,
|
17
|
-
Type,
|
18
14
|
Union,
|
19
15
|
)
|
20
16
|
|
@@ -116,7 +112,7 @@ class BaseExportEntitiesData(BaseOperationData):
|
|
116
112
|
|
117
113
|
# Если сущности не указаны, берется значение по умолчанию - все сущности:
|
118
114
|
entities = entities if entities else RegionalDataMartEntityEnum.get_enum_data().keys()
|
119
|
-
self.entities:
|
115
|
+
self.entities: list[ModelEnumValue] = [
|
120
116
|
RegionalDataMartEntityEnum.get_model_enum_value(entity) for entity in entities
|
121
117
|
]
|
122
118
|
|
@@ -124,13 +120,13 @@ class BaseExportEntitiesData(BaseOperationData):
|
|
124
120
|
self.period_ended_at = period_ended_at
|
125
121
|
|
126
122
|
# Классы менеджеров Функций, которые должны быть запущены для выгрузки данных
|
127
|
-
self._exporting_data_managers:
|
123
|
+
self._exporting_data_managers: set[type['RunnerManager']] = set()
|
128
124
|
|
129
125
|
# Результаты работы Функций выгрузки данных
|
130
126
|
self._exporting_data_results = []
|
131
127
|
|
132
128
|
# Карта соответствия manager_id сущности и его основной модели
|
133
|
-
self.manager_main_model_map:
|
129
|
+
self.manager_main_model_map: dict[str, ModelBase] = {}
|
134
130
|
|
135
131
|
@property
|
136
132
|
def _log_file_path(self) -> str:
|
@@ -240,10 +236,10 @@ class BaseExportLatestEntitiesData(BaseExportEntitiesData):
|
|
240
236
|
):
|
241
237
|
super().__init__(entities, period_started_at, period_ended_at, **kwargs)
|
242
238
|
|
243
|
-
self._exporting_data_managers:
|
239
|
+
self._exporting_data_managers: set[type['RunnerManager']] = OrderedSet()
|
244
240
|
|
245
241
|
# Словарь данных с классами менеджеров и их сущностями
|
246
|
-
self._manager_entities_map:
|
242
|
+
self._manager_entities_map: dict[type[object], list[str]] = defaultdict(set)
|
247
243
|
|
248
244
|
self.async_task = self._get_async_task()
|
249
245
|
self.task_id = kwargs.get('task_id')
|
@@ -3,7 +3,6 @@ from pathlib import (
|
|
3
3
|
)
|
4
4
|
from typing import (
|
5
5
|
Iterable,
|
6
|
-
List,
|
7
6
|
)
|
8
7
|
|
9
8
|
from django.conf import (
|
@@ -105,7 +104,7 @@ class ExportQueueSender:
|
|
105
104
|
'entity',
|
106
105
|
)
|
107
106
|
|
108
|
-
def set_sub_stage_to_cache(self, sub_stage_id: int, entity_name: str, attachments:
|
107
|
+
def set_sub_stage_to_cache(self, sub_stage_id: int, entity_name: str, attachments: list[UploadFile]) -> bool:
|
109
108
|
"""Помещение подэтапа в очередь вместе с информацией по файлам и обновление счетчика объема файлов."""
|
110
109
|
sub_stage_total_size = sum((attachment.attachment_size for attachment in attachments))
|
111
110
|
if self.queue_total_file_size + sub_stage_total_size > settings.RDM_UPLOAD_QUEUE_MAX_SIZE:
|
@@ -6,7 +6,6 @@ from datetime import (
|
|
6
6
|
)
|
7
7
|
from typing import (
|
8
8
|
Iterable,
|
9
|
-
List,
|
10
9
|
)
|
11
10
|
|
12
11
|
from django.db import (
|
@@ -39,7 +38,7 @@ class BaseFirstExportEntitiesDataCommandsGenerator:
|
|
39
38
|
"""Инициализация."""
|
40
39
|
# Если сущности не указаны, берется значение по умолчанию - все сущности:
|
41
40
|
entities = entities if entities else RegionalDataMartEntityEnum.get_enum_data().keys()
|
42
|
-
self.entities:
|
41
|
+
self.entities: list[ModelEnumValue] = [
|
43
42
|
RegionalDataMartEntityEnum.get_model_enum_value(entity) for entity in entities
|
44
43
|
]
|
45
44
|
|
@@ -81,7 +80,7 @@ class BaseFirstExportEntitiesDataCommandsGenerator:
|
|
81
80
|
where modified between '{period_started_at}' and '{period_ended_at}'
|
82
81
|
"""
|
83
82
|
|
84
|
-
def generate(self) ->
|
83
|
+
def generate(self) -> list:
|
85
84
|
"""Генерирует список данных для формирования команд для экспорта данных РВД."""
|
86
85
|
params_for_commands = []
|
87
86
|
|
@@ -4,9 +4,6 @@ from datetime import (
|
|
4
4
|
time,
|
5
5
|
timedelta,
|
6
6
|
)
|
7
|
-
from typing import (
|
8
|
-
Dict,
|
9
|
-
)
|
10
7
|
|
11
8
|
from django.conf import (
|
12
9
|
settings,
|
@@ -36,7 +33,7 @@ from edu_rdm_integration.models import (
|
|
36
33
|
|
37
34
|
|
38
35
|
@atomic
|
39
|
-
def set_failed_status_suspended_exporting_data_stages() ->
|
36
|
+
def set_failed_status_suspended_exporting_data_stages() -> dict[str, int]:
|
40
37
|
"""Установить статус 'Завершено с ошибками' для зависших этапов и подэтапов экспорта.
|
41
38
|
|
42
39
|
Экспорт считается зависшим в случае если за определенное в параметре RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT время,
|