edu-rdm-integration 3.16.2__py3-none-any.whl → 3.18.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.
Potentially problematic release.
This version of edu-rdm-integration might be problematic. Click here for more details.
- edu_rdm_integration/models.py +1 -1
- edu_rdm_integration/pipelines/cleanup_outdated_data/__init__.py +0 -0
- edu_rdm_integration/pipelines/cleanup_outdated_data/apps.py +11 -0
- edu_rdm_integration/pipelines/cleanup_outdated_data/management/__init__.py +0 -0
- edu_rdm_integration/pipelines/cleanup_outdated_data/management/commands/__init__.py +0 -0
- edu_rdm_integration/pipelines/cleanup_outdated_data/management/commands/rdm_cleanup_outdated_data.py +20 -0
- edu_rdm_integration/rdm_entities/models.py +42 -0
- edu_rdm_integration/rdm_models/models.py +127 -0
- edu_rdm_integration/stages/collect_data/functions/base/functions.py +3 -3
- edu_rdm_integration/stages/collect_data/functions/base/helpers.py +1 -0
- edu_rdm_integration/stages/collect_data/functions/base/managers.py +6 -6
- edu_rdm_integration/stages/collect_data/functions/base/mixins.py +1 -0
- edu_rdm_integration/stages/collect_data/functions/base/runners.py +3 -4
- edu_rdm_integration/stages/collect_data/functions/calculated/base/caches.py +4 -4
- edu_rdm_integration/stages/collect_data/functions/calculated/strategies.py +1 -0
- edu_rdm_integration/stages/collect_data/functions/non_calculated/base/caches.py +4 -4
- edu_rdm_integration/stages/collect_data/functions/non_calculated/strategies.py +1 -0
- edu_rdm_integration/stages/collect_data/generators.py +0 -10
- edu_rdm_integration/stages/collect_data/models.py +2 -5
- edu_rdm_integration/stages/collect_data/operations.py +6 -5
- edu_rdm_integration/stages/collect_data/registry/actions.py +7 -0
- edu_rdm_integration/stages/collect_data/tests.py +4 -4
- edu_rdm_integration/stages/export_data/functions/base/caches.py +9 -3
- edu_rdm_integration/stages/export_data/functions/base/functions.py +3 -4
- edu_rdm_integration/stages/export_data/functions/base/helpers.py +4 -4
- edu_rdm_integration/stages/export_data/functions/base/managers.py +3 -3
- edu_rdm_integration/stages/export_data/functions/base/runners.py +1 -0
- edu_rdm_integration/stages/export_data/functions/base/tests.py +3 -6
- edu_rdm_integration/stages/export_data/models.py +3 -3
- edu_rdm_integration/stages/export_data/strategies.py +1 -0
- edu_rdm_integration/stages/service/model_outdated_data/__init__.py +0 -0
- edu_rdm_integration/stages/service/model_outdated_data/cleaners.py +26 -0
- edu_rdm_integration/stages/service/model_outdated_data/managers.py +45 -0
- edu_rdm_integration/stages/service/outdated_service_data/__init__.py +0 -0
- {edu_rdm_integration-3.16.2.dist-info → edu_rdm_integration-3.18.0.dist-info}/METADATA +6 -4
- {edu_rdm_integration-3.16.2.dist-info → edu_rdm_integration-3.18.0.dist-info}/RECORD +39 -30
- {edu_rdm_integration-3.16.2.dist-info → edu_rdm_integration-3.18.0.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-3.16.2.dist-info → edu_rdm_integration-3.18.0.dist-info}/licenses/LICENSE +0 -0
- {edu_rdm_integration-3.16.2.dist-info → edu_rdm_integration-3.18.0.dist-info}/top_level.txt +0 -0
edu_rdm_integration/models.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
# Модели
|
|
1
|
+
# Модели
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from django.apps import (
|
|
2
|
+
AppConfig,
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class RDMCleanupOutdatedDataAppConfig(AppConfig):
|
|
7
|
+
"""Приложение для организации процесса очистки устаревших данных РВД."""
|
|
8
|
+
|
|
9
|
+
name = 'edu_rdm_integration.pipelines.cleanup_outdated_data'
|
|
10
|
+
label = 'edu_rdm_integration_cleanup_outdated_data_pipeline'
|
|
11
|
+
verbose_name = 'Приложение для организации процесса очистки устаревших данных РВД.'
|
|
File without changes
|
|
File without changes
|
edu_rdm_integration/pipelines/cleanup_outdated_data/management/commands/rdm_cleanup_outdated_data.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from django.core.management import (
|
|
2
|
+
BaseCommand,
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
from edu_rdm_integration.stages.service.model_outdated_data.managers import (
|
|
6
|
+
ModelOutdatedDataCleanerManager,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Command(BaseCommand):
|
|
11
|
+
"""Ночная команда для очистки устаревших данных РВД."""
|
|
12
|
+
|
|
13
|
+
nightly_script = True
|
|
14
|
+
|
|
15
|
+
help = 'Ночная команда для очистки устаревших данных РВД.'
|
|
16
|
+
|
|
17
|
+
def handle(self, *args, **options):
|
|
18
|
+
"""Запуск очистки устаревших данных РВД."""
|
|
19
|
+
model_data_cleaner_manager = ModelOutdatedDataCleanerManager()
|
|
20
|
+
model_data_cleaner_manager.run()
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
from typing import (
|
|
2
|
+
Optional,
|
|
3
|
+
Type,
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
from educommon.integration_entities.entities import (
|
|
7
|
+
BaseEntity,
|
|
8
|
+
)
|
|
1
9
|
from m3_db_utils.models import (
|
|
2
10
|
ModelEnumValue,
|
|
3
11
|
TitledModelEnum,
|
|
@@ -61,3 +69,37 @@ class RDMEntityEnum(TitledModelEnum):
|
|
|
61
69
|
model_enums = sorted(model_enums, key=lambda value: value.order_number)
|
|
62
70
|
|
|
63
71
|
return model_enums
|
|
72
|
+
|
|
73
|
+
@classmethod
|
|
74
|
+
def extend(
|
|
75
|
+
cls,
|
|
76
|
+
key,
|
|
77
|
+
title: str = '',
|
|
78
|
+
entity: Type[BaseEntity] = None,
|
|
79
|
+
main_model_enum: tuple = (),
|
|
80
|
+
additional_model_enums: tuple = (),
|
|
81
|
+
order_number: Optional[int] = None,
|
|
82
|
+
*args,
|
|
83
|
+
**kwargs,
|
|
84
|
+
):
|
|
85
|
+
"""Метод расширения модели-перечисления, например из плагина.
|
|
86
|
+
|
|
87
|
+
Необходимо, чтобы сама модель-перечисление была расширяемой. Для этого необходимо, чтобы был установлен
|
|
88
|
+
extensible = True в Meta.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
key: ключ элемента перечисления, указывается заглавными буквами с разделителем нижнее подчеркивание
|
|
92
|
+
title: название элемента перечисления
|
|
93
|
+
entity: сущность, регистрируемая в модели-перечислении
|
|
94
|
+
main_model_enum: основная модель РВД из модели-перечисления
|
|
95
|
+
additional_model_enums: дополнительные модели РВД из модели-перечисления
|
|
96
|
+
order_number: порядковый номер значения модели перечисления используемый при сортировке
|
|
97
|
+
args: порядковые аргументы для создания значения модели перечисления
|
|
98
|
+
kwargs: именованные аргументы для создания значения модели перечисления
|
|
99
|
+
"""
|
|
100
|
+
try:
|
|
101
|
+
order_number = cls._calculate_order_number(order_number=order_number)
|
|
102
|
+
except ValueError as e:
|
|
103
|
+
raise ValueError(f'Trying register entity "{entity.__name__}". {e.args[0]}')
|
|
104
|
+
|
|
105
|
+
setattr(cls, key, ModelEnumValue(key=key, order_number=order_number, **kwargs))
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
from typing import (
|
|
2
|
+
Optional,
|
|
3
|
+
Type,
|
|
4
|
+
)
|
|
5
|
+
|
|
1
6
|
from django.db.models import (
|
|
2
7
|
CASCADE,
|
|
3
8
|
DateTimeField,
|
|
@@ -14,7 +19,12 @@ from educommon.django.db.mixins import (
|
|
|
14
19
|
from educommon.integration_entities.enums import (
|
|
15
20
|
EntityLogOperation,
|
|
16
21
|
)
|
|
22
|
+
from educommon.utils.seqtools import (
|
|
23
|
+
topological_sort,
|
|
24
|
+
)
|
|
17
25
|
from m3_db_utils.models import (
|
|
26
|
+
FictiveForeignKeyField,
|
|
27
|
+
ModelEnumValue,
|
|
18
28
|
TitledModelEnum,
|
|
19
29
|
)
|
|
20
30
|
|
|
@@ -66,8 +76,125 @@ class BaseRDMModel(ReprStrPreModelMixin, BaseObjectModel):
|
|
|
66
76
|
class RDMModelEnum(TitledModelEnum):
|
|
67
77
|
"""Модель-перечисление моделей "Региональная витрина данных"."""
|
|
68
78
|
|
|
79
|
+
is_strict_order_number = True
|
|
80
|
+
"""Флаг, указывающий на уникальность порядкового номера элементов модели-перечисления."""
|
|
81
|
+
|
|
69
82
|
class Meta:
|
|
70
83
|
db_table = 'rdm_model'
|
|
71
84
|
extensible = True
|
|
72
85
|
verbose_name = 'Модель-перечисление моделей "Региональной витрины данных"'
|
|
73
86
|
verbose_name_plural = 'Модели-перечисления моделей "Региональной витрины данных"'
|
|
87
|
+
|
|
88
|
+
@classmethod
|
|
89
|
+
def _get_model_dependencies(cls, model: Type[BaseRDMModel]) -> list[tuple[str, str]]:
|
|
90
|
+
"""Получение списка зависимостей модели РВД."""
|
|
91
|
+
model_dependencies = []
|
|
92
|
+
|
|
93
|
+
for field in model._meta.concrete_fields:
|
|
94
|
+
if isinstance(field, FictiveForeignKeyField):
|
|
95
|
+
model_dependencies.append(field.to)
|
|
96
|
+
elif isinstance(field, ForeignKey):
|
|
97
|
+
model_dependencies.append(field.related_model._meta.label)
|
|
98
|
+
|
|
99
|
+
return model_dependencies
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
def _calculate_order_number(
|
|
103
|
+
cls, order_number: Optional[int], model: Type[BaseRDMModel] = None, *args, **kwargs
|
|
104
|
+
) -> int:
|
|
105
|
+
"""Вычисление порядкового номера элемента модели-перечисления.
|
|
106
|
+
|
|
107
|
+
Если order_number указан, то используется он.
|
|
108
|
+
|
|
109
|
+
При добавлении новой модели РВД в модель-перечисление производится перерасчет порядковых номеров уже
|
|
110
|
+
добавленных элементов. Порядок моделей РВД выстраивается по зависимости друг от друга. Зависимость определяется
|
|
111
|
+
внешними ключами (ForeignKey) и фиктивными внешними ключами (FictiveForeignKey). Сначала идут модели не имеющие
|
|
112
|
+
зависимостей, затем модели, которые зависят от других моделей. Сортировка моделей РВД происходит по алгоритму
|
|
113
|
+
топологической сортировки.
|
|
114
|
+
"""
|
|
115
|
+
if order_number is not None:
|
|
116
|
+
return super()._calculate_order_number(order_number=order_number)
|
|
117
|
+
|
|
118
|
+
enum_data = cls._get_enum_data()
|
|
119
|
+
models = [model, *[model_enum_value.model for model_enum_value in enum_data.values()]]
|
|
120
|
+
|
|
121
|
+
models_dependencies = []
|
|
122
|
+
for model in models:
|
|
123
|
+
model_dependencies = cls._get_model_dependencies(model=model)
|
|
124
|
+
|
|
125
|
+
for model_dependency in model_dependencies:
|
|
126
|
+
models_dependencies.append((model._meta.label, model_dependency))
|
|
127
|
+
|
|
128
|
+
sorted_dependencies_models = topological_sort(models_dependencies)
|
|
129
|
+
|
|
130
|
+
ordered_models = [*sorted_dependencies_models.cyclic, *reversed(sorted_dependencies_models.sorted)]
|
|
131
|
+
|
|
132
|
+
for model_enum_value in enum_data.values():
|
|
133
|
+
if model_enum_value.is_manual_order_number:
|
|
134
|
+
try:
|
|
135
|
+
manual_index_model = ordered_models[model_enum_value.order_number - 1]
|
|
136
|
+
except IndexError:
|
|
137
|
+
continue
|
|
138
|
+
|
|
139
|
+
if manual_index_model != model_enum_value.model._meta.label and cls.is_strict_order_number:
|
|
140
|
+
raise ValueError(
|
|
141
|
+
f'Order number "{model_enum_value.order_number}" is already in use in the "{cls.__name__}". '
|
|
142
|
+
f'Please choose a different one.'
|
|
143
|
+
)
|
|
144
|
+
else:
|
|
145
|
+
model_enum_value.order_number = ordered_models.index(model_enum_value.model._meta.label) + 1
|
|
146
|
+
|
|
147
|
+
return ordered_models.index(model._meta.label) + 1
|
|
148
|
+
|
|
149
|
+
@classmethod
|
|
150
|
+
def extend(
|
|
151
|
+
cls,
|
|
152
|
+
key,
|
|
153
|
+
model: Type[BaseRDMModel] = None,
|
|
154
|
+
title: str = '',
|
|
155
|
+
creating_trigger_models: tuple = (),
|
|
156
|
+
loggable_models: tuple = (),
|
|
157
|
+
order_number: Optional[int] = None,
|
|
158
|
+
*args,
|
|
159
|
+
**kwargs,
|
|
160
|
+
):
|
|
161
|
+
"""Метод расширения модели-перечисления, например из плагина.
|
|
162
|
+
|
|
163
|
+
Необходимо, чтобы сама модель-перечисление была расширяемой. Для этого необходимо, чтобы был установлен
|
|
164
|
+
extensible = True в Meta.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
key: ключ элемента перечисления, указывается заглавными буквами с разделителем нижнее подчеркивание
|
|
168
|
+
title: название элемента перечисления
|
|
169
|
+
model: модель, регистрируемая в модели-перечислении
|
|
170
|
+
creating_trigger_models: модели продукта, которые инициируют создание записей модели РВД
|
|
171
|
+
loggable_models: модели продукта, отслеживаемые в логах
|
|
172
|
+
order_number: порядковый номер значения модели перечисления используемый при сортировке
|
|
173
|
+
args: порядковые аргументы для модели-перечисления
|
|
174
|
+
kwargs: именованные аргументы для модели-перечисления
|
|
175
|
+
"""
|
|
176
|
+
if model is None:
|
|
177
|
+
raise ValueError(f'Trying extend model "{cls.__name__}". Argument "model" is required.')
|
|
178
|
+
|
|
179
|
+
is_manual_order_number = order_number is not None
|
|
180
|
+
|
|
181
|
+
try:
|
|
182
|
+
order_number = cls._calculate_order_number(
|
|
183
|
+
order_number=order_number,
|
|
184
|
+
model=model,
|
|
185
|
+
)
|
|
186
|
+
except ValueError as e:
|
|
187
|
+
raise ValueError(f'Trying register model "{model.__name__}". {e.args[0]}')
|
|
188
|
+
|
|
189
|
+
model_enum_value = ModelEnumValue(
|
|
190
|
+
key=key,
|
|
191
|
+
model=model,
|
|
192
|
+
title=title,
|
|
193
|
+
creating_trigger_models=creating_trigger_models,
|
|
194
|
+
loggable_models=loggable_models,
|
|
195
|
+
order_number=order_number,
|
|
196
|
+
is_manual_order_number=is_manual_order_number,
|
|
197
|
+
**kwargs,
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
setattr(cls, key, model_enum_value)
|
|
@@ -2,6 +2,9 @@ from abc import (
|
|
|
2
2
|
ABCMeta,
|
|
3
3
|
)
|
|
4
4
|
|
|
5
|
+
from edu_function_tools.functions import (
|
|
6
|
+
EduLazySavingPredefinedQueueFunction,
|
|
7
|
+
)
|
|
5
8
|
from educommon import (
|
|
6
9
|
logger,
|
|
7
10
|
)
|
|
@@ -9,9 +12,6 @@ from educommon.integration_entities.mixins import (
|
|
|
9
12
|
EntitiesMixin,
|
|
10
13
|
)
|
|
11
14
|
|
|
12
|
-
from edu_function_tools.functions import (
|
|
13
|
-
EduLazySavingPredefinedQueueFunction,
|
|
14
|
-
)
|
|
15
15
|
from edu_rdm_integration.core.consts import (
|
|
16
16
|
LOGS_DELIMITER,
|
|
17
17
|
)
|
|
@@ -12,6 +12,12 @@ from django.apps import (
|
|
|
12
12
|
apps,
|
|
13
13
|
)
|
|
14
14
|
|
|
15
|
+
from edu_function_tools.managers import (
|
|
16
|
+
EduRunnerManager,
|
|
17
|
+
)
|
|
18
|
+
from edu_function_tools.runners import (
|
|
19
|
+
EduRunner,
|
|
20
|
+
)
|
|
15
21
|
from educommon import (
|
|
16
22
|
logger,
|
|
17
23
|
)
|
|
@@ -21,13 +27,7 @@ from educommon.audit_log.helpers import (
|
|
|
21
27
|
from educommon.audit_log.models import (
|
|
22
28
|
AuditLog,
|
|
23
29
|
)
|
|
24
|
-
from edu_function_tools.runners import (
|
|
25
|
-
EduRunner,
|
|
26
|
-
)
|
|
27
30
|
|
|
28
|
-
from edu_function_tools.managers import (
|
|
29
|
-
EduRunnerManager,
|
|
30
|
-
)
|
|
31
31
|
from edu_rdm_integration.core.consts import (
|
|
32
32
|
DATETIME_FORMAT,
|
|
33
33
|
LOGS_DELIMITER,
|
|
@@ -2,13 +2,12 @@ from django.conf import (
|
|
|
2
2
|
settings,
|
|
3
3
|
)
|
|
4
4
|
|
|
5
|
-
from educommon.utils.seqtools import (
|
|
6
|
-
make_chunks,
|
|
7
|
-
)
|
|
8
|
-
|
|
9
5
|
from edu_function_tools.runners import (
|
|
10
6
|
EduRunner,
|
|
11
7
|
)
|
|
8
|
+
from educommon.utils.seqtools import (
|
|
9
|
+
make_chunks,
|
|
10
|
+
)
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
class BaseCollectingDataRunner(EduRunner):
|
|
@@ -8,14 +8,14 @@ from typing import (
|
|
|
8
8
|
Union,
|
|
9
9
|
)
|
|
10
10
|
|
|
11
|
-
from educommon.utils.conversion import (
|
|
12
|
-
int_or_none,
|
|
13
|
-
)
|
|
14
|
-
|
|
15
11
|
from edu_function_tools.caches import (
|
|
16
12
|
EduFunctionCacheStorage,
|
|
17
13
|
EduRunnerCacheStorage,
|
|
18
14
|
)
|
|
15
|
+
from educommon.utils.conversion import (
|
|
16
|
+
int_or_none,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
19
|
from edu_rdm_integration.stages.collect_data.functions.base.mixins import (
|
|
20
20
|
ReformatLogsMixin,
|
|
21
21
|
)
|
|
@@ -8,6 +8,10 @@ from typing import (
|
|
|
8
8
|
Union,
|
|
9
9
|
)
|
|
10
10
|
|
|
11
|
+
from edu_function_tools.caches import (
|
|
12
|
+
EduFunctionCacheStorage,
|
|
13
|
+
EduRunnerCacheStorage,
|
|
14
|
+
)
|
|
11
15
|
from educommon.audit_log.utils import (
|
|
12
16
|
get_model_by_table,
|
|
13
17
|
)
|
|
@@ -21,10 +25,6 @@ from educommon.utils.conversion import (
|
|
|
21
25
|
int_or_none,
|
|
22
26
|
)
|
|
23
27
|
|
|
24
|
-
from edu_function_tools.caches import (
|
|
25
|
-
EduFunctionCacheStorage,
|
|
26
|
-
EduRunnerCacheStorage,
|
|
27
|
-
)
|
|
28
28
|
from edu_rdm_integration.core.mapping import (
|
|
29
29
|
MODEL_FIELDS_LOG_FILTER,
|
|
30
30
|
)
|
|
@@ -227,16 +227,6 @@ class BaseFirstCollectModelsDataCommandsGenerator:
|
|
|
227
227
|
# Корректируем границы начала и конца сбора данных под значения введенные пользователем
|
|
228
228
|
params_for_model[0]['period_started_at'] = self.logs_period_started_at
|
|
229
229
|
params_for_model[-1]['period_ended_at'] = self.logs_period_ended_at
|
|
230
|
-
else:
|
|
231
|
-
# Создаем команду для отображения в UI, даже если не нашлось данных для обработки
|
|
232
|
-
params_for_model.append(
|
|
233
|
-
{
|
|
234
|
-
'period_started_at': self.logs_period_started_at,
|
|
235
|
-
'period_ended_at': self.logs_period_ended_at,
|
|
236
|
-
'model': rdm_model.key,
|
|
237
|
-
'generation_id': self.generation_id,
|
|
238
|
-
}
|
|
239
|
-
)
|
|
240
230
|
|
|
241
231
|
params_for_commands.extend(params_for_model)
|
|
242
232
|
|
|
@@ -17,9 +17,6 @@ from django.db.models import (
|
|
|
17
17
|
from django.utils import (
|
|
18
18
|
timezone,
|
|
19
19
|
)
|
|
20
|
-
from edu_function_tools.models import (
|
|
21
|
-
EduEntity,
|
|
22
|
-
)
|
|
23
20
|
from m3.db import (
|
|
24
21
|
BaseObjectModel,
|
|
25
22
|
)
|
|
@@ -175,13 +172,13 @@ class RDMCollectingDataSubStage(ReprStrPreModelMixin, BaseObjectModel):
|
|
|
175
172
|
"""Подэтап сбора данных для сущностей в рамках функции."""
|
|
176
173
|
|
|
177
174
|
stage = ForeignKey(
|
|
178
|
-
to=RDMCollectingDataStage,
|
|
175
|
+
to='edu_rdm_integration_collect_data_stage.RDMCollectingDataStage',
|
|
179
176
|
verbose_name='Этап сбора данных',
|
|
180
177
|
on_delete=PROTECT,
|
|
181
178
|
)
|
|
182
179
|
|
|
183
180
|
function = ForeignKey(
|
|
184
|
-
to=
|
|
181
|
+
to='function_tools.Entity',
|
|
185
182
|
verbose_name='Функция',
|
|
186
183
|
on_delete=PROTECT,
|
|
187
184
|
)
|
|
@@ -17,15 +17,15 @@ from django.utils import (
|
|
|
17
17
|
timezone,
|
|
18
18
|
)
|
|
19
19
|
|
|
20
|
+
from edu_function_tools.managers import (
|
|
21
|
+
EduRunnerManager,
|
|
22
|
+
)
|
|
20
23
|
from educommon import (
|
|
21
24
|
logger,
|
|
22
25
|
)
|
|
23
26
|
from educommon.utils.date import (
|
|
24
27
|
get_today_min_datetime,
|
|
25
28
|
)
|
|
26
|
-
from edu_function_tools.managers import (
|
|
27
|
-
EduRunnerManager,
|
|
28
|
-
)
|
|
29
29
|
from m3_db_utils.consts import (
|
|
30
30
|
DEFAULT_ORDER_NUMBER,
|
|
31
31
|
)
|
|
@@ -80,8 +80,9 @@ class BaseCollectModelsData(BaseOperationData):
|
|
|
80
80
|
super().__init__(**kwargs)
|
|
81
81
|
|
|
82
82
|
# Если модели не указаны, берется значение по умолчанию - все модели:
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
model_enum_data = RDMModelEnum.get_enum_data()
|
|
84
|
+
models = models if models else model_enum_data.keys()
|
|
85
|
+
self.models: list[ModelEnumValue] = [v for k, v in model_enum_data.items() if k in models]
|
|
85
86
|
|
|
86
87
|
self.logs_period_started_at = logs_period_started_at
|
|
87
88
|
self.logs_period_ended_at = logs_period_ended_at
|
|
@@ -260,6 +260,13 @@ class BaseCollectingDataProgressPack(BaseCommandProgressPack):
|
|
|
260
260
|
actual_institute_ids=self._get_actual_institute_ids(),
|
|
261
261
|
)
|
|
262
262
|
|
|
263
|
+
if not commands_to_save:
|
|
264
|
+
raise ApplicationLogicException(
|
|
265
|
+
f'Недостаточно данных для обработки модели "{obj.model_id}" '
|
|
266
|
+
f'в указанный период с {context.logs_period_started_at} по {context.logs_period_ended_at}. '
|
|
267
|
+
f'Проверьте наличие данных в указанном временном диапазоне.'
|
|
268
|
+
)
|
|
269
|
+
|
|
263
270
|
objs = [
|
|
264
271
|
self.model(
|
|
265
272
|
model_id=obj.model_id,
|
|
@@ -23,6 +23,10 @@ from django.utils import (
|
|
|
23
23
|
timezone,
|
|
24
24
|
)
|
|
25
25
|
|
|
26
|
+
from edu_function_tools.models import (
|
|
27
|
+
EduEntity,
|
|
28
|
+
EduEntityType,
|
|
29
|
+
)
|
|
26
30
|
from educommon.audit_log.models import (
|
|
27
31
|
AuditLog,
|
|
28
32
|
Table,
|
|
@@ -33,10 +37,6 @@ from educommon.integration_entities.enums import (
|
|
|
33
37
|
from educommon.utils.phone_number.phone_number import (
|
|
34
38
|
PhoneNumber,
|
|
35
39
|
)
|
|
36
|
-
from edu_function_tools.models import (
|
|
37
|
-
EduEntity,
|
|
38
|
-
EduEntityType,
|
|
39
|
-
)
|
|
40
40
|
|
|
41
41
|
from edu_rdm_integration.core.consts import (
|
|
42
42
|
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
1
|
+
from typing_extensions import (
|
|
2
|
+
TYPE_CHECKING,
|
|
3
3
|
)
|
|
4
4
|
|
|
5
5
|
from edu_function_tools.caches import (
|
|
@@ -8,6 +8,12 @@ from edu_function_tools.caches import (
|
|
|
8
8
|
)
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from educommon.integration_entities.entities import (
|
|
13
|
+
BaseEntity,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
11
17
|
class BaseExportDataRunnerCacheStorage(EduRunnerCacheStorage):
|
|
12
18
|
"""Базовый кеш помощников ранеров функций выгрузки данных для интеграции с "Региональная витрина данных"."""
|
|
13
19
|
|
|
@@ -15,7 +21,7 @@ class BaseExportDataRunnerCacheStorage(EduRunnerCacheStorage):
|
|
|
15
21
|
class BaseExportDataFunctionCacheStorage(EduFunctionCacheStorage):
|
|
16
22
|
"""Базовый кеш помощников функций выгрузки данных для интеграции с "Региональная витрина данных"."""
|
|
17
23
|
|
|
18
|
-
def _prepare_entity_instances(self, model_ids, *args, **kwargs) -> list[BaseEntity]:
|
|
24
|
+
def _prepare_entity_instances(self, model_ids, *args, **kwargs) -> list['BaseEntity']:
|
|
19
25
|
"""Формирование списка объектов сущностей для дальнейшей выгрузки.
|
|
20
26
|
|
|
21
27
|
Необходимо переопределить логику формирования объектов у потомков.
|
|
@@ -15,6 +15,9 @@ from transliterate import (
|
|
|
15
15
|
slugify,
|
|
16
16
|
)
|
|
17
17
|
|
|
18
|
+
from edu_function_tools.functions import (
|
|
19
|
+
EduLazySavingPredefinedQueueGlobalHelperFunction,
|
|
20
|
+
)
|
|
18
21
|
from educommon import (
|
|
19
22
|
logger,
|
|
20
23
|
)
|
|
@@ -25,9 +28,6 @@ from educommon.integration_entities.mixins import (
|
|
|
25
28
|
EntitiesMixin,
|
|
26
29
|
)
|
|
27
30
|
|
|
28
|
-
from edu_function_tools.functions import (
|
|
29
|
-
EduLazySavingPredefinedQueueGlobalHelperFunction,
|
|
30
|
-
)
|
|
31
31
|
from edu_rdm_integration.core.consts import (
|
|
32
32
|
LOGS_DELIMITER,
|
|
33
33
|
)
|
|
@@ -236,4 +236,3 @@ class BaseExportDataFunction(
|
|
|
236
236
|
def get_function_data(self):
|
|
237
237
|
"""Возвращает словарь с данными сущностей подготовленных к выгрузке."""
|
|
238
238
|
return self._data
|
|
239
|
-
|
|
@@ -10,6 +10,10 @@ from django.conf import (
|
|
|
10
10
|
settings,
|
|
11
11
|
)
|
|
12
12
|
|
|
13
|
+
from edu_function_tools.helpers import (
|
|
14
|
+
EduFunctionHelper,
|
|
15
|
+
EduRunnerHelper,
|
|
16
|
+
)
|
|
13
17
|
from educommon.utils.conversion import (
|
|
14
18
|
str_without_control_chars,
|
|
15
19
|
)
|
|
@@ -17,10 +21,6 @@ from educommon.utils.crypto import (
|
|
|
17
21
|
HashData,
|
|
18
22
|
)
|
|
19
23
|
|
|
20
|
-
from edu_function_tools.helpers import (
|
|
21
|
-
EduFunctionHelper,
|
|
22
|
-
EduRunnerHelper,
|
|
23
|
-
)
|
|
24
24
|
from edu_rdm_integration.core.consts import (
|
|
25
25
|
DATE_FORMAT,
|
|
26
26
|
EXPORT_DATETIME_FORMAT,
|
|
@@ -10,6 +10,9 @@ from typing import (
|
|
|
10
10
|
Iterator,
|
|
11
11
|
)
|
|
12
12
|
|
|
13
|
+
from edu_function_tools.managers import (
|
|
14
|
+
EduRunnerManager,
|
|
15
|
+
)
|
|
13
16
|
from educommon import (
|
|
14
17
|
logger,
|
|
15
18
|
)
|
|
@@ -17,9 +20,6 @@ from m3_db_utils.models import (
|
|
|
17
20
|
ModelEnumValue,
|
|
18
21
|
)
|
|
19
22
|
|
|
20
|
-
from edu_function_tools.managers import (
|
|
21
|
-
EduRunnerManager,
|
|
22
|
-
)
|
|
23
23
|
from edu_rdm_integration.core.consts import (
|
|
24
24
|
LOGS_DELIMITER,
|
|
25
25
|
)
|
|
@@ -80,6 +80,7 @@ class BaseExportTestCase(TestCase):
|
|
|
80
80
|
|
|
81
81
|
@classmethod
|
|
82
82
|
def tearDownClass(cls) -> None:
|
|
83
|
+
"""Удаляет временные директории."""
|
|
83
84
|
try:
|
|
84
85
|
shutil.rmtree(TEST_DIR)
|
|
85
86
|
except OSError:
|
|
@@ -120,8 +121,7 @@ class BaseExportManagerTestCase(BaseExportTestCase):
|
|
|
120
121
|
period_ended_at=self.export_period_ended_at,
|
|
121
122
|
).first()
|
|
122
123
|
exported_data_substage = ExportingDataSubStage.objects.filter(
|
|
123
|
-
function_id=function_tools_entities[EduEntityType.FUNCTION.key],
|
|
124
|
-
stage=exported_data_stage
|
|
124
|
+
function_id=function_tools_entities[EduEntityType.FUNCTION.key], stage=exported_data_stage
|
|
125
125
|
).first()
|
|
126
126
|
|
|
127
127
|
return exported_data_stage, exported_data_substage
|
|
@@ -153,10 +153,7 @@ class BaseExportFunctionTestCase(BaseExportTestCase):
|
|
|
153
153
|
@override_settings(MEDIA_ROOT=(TEST_DIR + '/media'))
|
|
154
154
|
def run_exporting_function(self, exporting_stage: ExportingDataStage, model_ids: list[int]) -> dict:
|
|
155
155
|
"""Запускает функцию экспорта."""
|
|
156
|
-
exporting_function = self.export_function(
|
|
157
|
-
stage=exporting_stage,
|
|
158
|
-
model_ids=model_ids
|
|
159
|
-
)
|
|
156
|
+
exporting_function = self.export_function(stage=exporting_stage, model_ids=model_ids)
|
|
160
157
|
exporting_function.run()
|
|
161
158
|
|
|
162
159
|
return exporting_function.get_function_data()
|
|
@@ -18,13 +18,13 @@ from django.db.models import (
|
|
|
18
18
|
from django.utils import (
|
|
19
19
|
timezone,
|
|
20
20
|
)
|
|
21
|
-
from edu_function_tools.models import (
|
|
22
|
-
EduEntity,
|
|
23
|
-
)
|
|
24
21
|
from m3.db import (
|
|
25
22
|
BaseObjectModel,
|
|
26
23
|
)
|
|
27
24
|
|
|
25
|
+
from edu_function_tools.models import (
|
|
26
|
+
EduEntity,
|
|
27
|
+
)
|
|
28
28
|
from educommon.django.db.mixins import (
|
|
29
29
|
ReprStrPreModelMixin,
|
|
30
30
|
)
|
|
File without changes
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from abc import (
|
|
2
|
+
ABCMeta,
|
|
3
|
+
abstractmethod,
|
|
4
|
+
)
|
|
5
|
+
from typing import (
|
|
6
|
+
TYPE_CHECKING,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from m3_db_utils.models import (
|
|
12
|
+
ModelEnumValue,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class BaseModelOutdatedDataCleaner(metaclass=ABCMeta):
|
|
17
|
+
"""Базовый класс уборщика устаревших данных моделей РВД."""
|
|
18
|
+
|
|
19
|
+
def __init__(self, model_enum_value: 'ModelEnumValue', *args, **kwargs):
|
|
20
|
+
self._model_enum_value = model_enum_value
|
|
21
|
+
|
|
22
|
+
super().__init__(*args, **kwargs)
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def run(self):
|
|
26
|
+
"""Запуск очистки устаревших данных."""
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
from typing import (
|
|
3
|
+
TYPE_CHECKING,
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
from edu_rdm_integration.rdm_models.models import (
|
|
7
|
+
RDMModelEnum,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from m3_db_utils.models import (
|
|
13
|
+
ModelEnumValue,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ModelOutdatedDataCleanerManager:
|
|
18
|
+
"""Управляет очисткой устаревших данных моделей РВД.
|
|
19
|
+
|
|
20
|
+
Получает все модели РВД зарегистрированные в модели-перечислении edu_rdm_integration.rdm_models.models.RDMModelEnum.
|
|
21
|
+
У каждой модели проверяет наличие поля outdated_data_cleaners. Если такое поле есть, то инстанцирует его и вызывает
|
|
22
|
+
метод run.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def _process_model(self, model_enum_value: 'ModelEnumValue'):
|
|
26
|
+
"""Обрабатывает модель РВД."""
|
|
27
|
+
if not hasattr(model_enum_value, 'outdated_data_cleaners'):
|
|
28
|
+
return
|
|
29
|
+
|
|
30
|
+
for outdated_data_cleaner in model_enum_value.outdated_data_cleaners:
|
|
31
|
+
if isinstance(outdated_data_cleaner, str):
|
|
32
|
+
outdated_data_cleaner_module_path, cleaner_name = outdated_data_cleaner.rsplit('.', 1)
|
|
33
|
+
outdated_data_cleaner_module = importlib.import_module(outdated_data_cleaner_module_path)
|
|
34
|
+
outdated_data_cleaner = getattr(outdated_data_cleaner_module, cleaner_name)
|
|
35
|
+
|
|
36
|
+
outdated_data_cleaner(model_enum_value=model_enum_value).run()
|
|
37
|
+
|
|
38
|
+
def _process_models(self):
|
|
39
|
+
"""Обрабатывает все модели РВД."""
|
|
40
|
+
for model_enum_value in RDMModelEnum.get_model_enum_values():
|
|
41
|
+
self._process_model(model_enum_value=model_enum_value)
|
|
42
|
+
|
|
43
|
+
def run(self):
|
|
44
|
+
"""Запускает очистку устаревших данных моделей РВД."""
|
|
45
|
+
self._process_models()
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: edu-rdm-integration
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.18.0
|
|
4
4
|
Summary: Интеграция с Региональной витриной данных
|
|
5
5
|
Author-email: BARS Group <education_dev@bars.group>
|
|
6
6
|
Project-URL: Homepage, https://stash.bars-open.ru/projects/EDUBASE/repos/edu-rdm-integration/browse
|
|
@@ -27,14 +27,15 @@ Requires-Dist: transliterate<2
|
|
|
27
27
|
Requires-Dist: Django<5.0,>=3.1
|
|
28
28
|
Requires-Dist: celery<5.3,>=4.4.7
|
|
29
29
|
Requires-Dist: asyncpg==0.23.0
|
|
30
|
-
Requires-Dist: educommon<4,>=3.
|
|
30
|
+
Requires-Dist: educommon<4,>=3.25.0
|
|
31
31
|
Requires-Dist: edu-function-tools<1,>=0.2.0
|
|
32
|
-
Requires-Dist: m3-db-utils<1,>=0.
|
|
32
|
+
Requires-Dist: m3-db-utils<1,>=0.7.0
|
|
33
33
|
Requires-Dist: m3-django-compat<2,>=1.10.2
|
|
34
|
+
Requires-Dist: m3-ui<2.3,>=2.2.122
|
|
34
35
|
Requires-Dist: uploader-client<1,>=0.3.0
|
|
35
36
|
Provides-Extra: dev
|
|
36
37
|
Requires-Dist: isort==5.12.0; extra == "dev"
|
|
37
|
-
Requires-Dist: ruff==0.12.
|
|
38
|
+
Requires-Dist: ruff==0.12.1; extra == "dev"
|
|
38
39
|
Requires-Dist: flake8<7,>=4.0.1; extra == "dev"
|
|
39
40
|
Requires-Dist: pytest<8,>=3.2.5; extra == "dev"
|
|
40
41
|
Requires-Dist: pytest-cov<5; extra == "dev"
|
|
@@ -124,6 +125,7 @@ INSTALLED_APPS = (
|
|
|
124
125
|
'edu_rdm_integration.core.registry',
|
|
125
126
|
'edu_rdm_integration.rdm_entities',
|
|
126
127
|
'edu_rdm_integration.rdm_models',
|
|
128
|
+
'edu_rdm_integration.pipelines.cleanup_outdated_data',
|
|
127
129
|
'edu_rdm_integration.pipelines.transfer',
|
|
128
130
|
'edu_rdm_integration.stages.collect_data',
|
|
129
131
|
'edu_rdm_integration.stages.export_data',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
edu_rdm_integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
edu_rdm_integration/apps.py,sha256=Rrwr04Q-fFmr-2nivyKmfdKj5tB3o_8T82CvVFMnswY,3094
|
|
3
|
-
edu_rdm_integration/models.py,sha256=
|
|
3
|
+
edu_rdm_integration/models.py,sha256=Yzbq2HmGZ8YzBUZpX2V49m_Bc3Q_MSZTaMQPz6kjns8,15
|
|
4
4
|
edu_rdm_integration/collect_and_export_data/__init__.py,sha256=LXkkpOw-CudTwly71opsc50LvknVTbylr4RRgEoRJ80,79
|
|
5
5
|
edu_rdm_integration/collect_and_export_data/apps.py,sha256=xzvyL8jwloAFff_SurVWbjJ3TAk5Z2ala51eqwz6Y0k,336
|
|
6
6
|
edu_rdm_integration/collect_and_export_data/models.py,sha256=yOhOu4Ma74WtPFEoTfqKsU1SWsv6m80YcltFPbvsRT4,55
|
|
@@ -44,6 +44,11 @@ edu_rdm_integration/migrations/0017_delete_uploaddatacommand.py,sha256=9hte6Ds-y
|
|
|
44
44
|
edu_rdm_integration/migrations/0018_auto_20250704_0725.py,sha256=Ui70ymzkSLCuiU4ydCTK8bBn2JaJJPW7w1gQ2RvmVVc,5661
|
|
45
45
|
edu_rdm_integration/migrations/__init__.py,sha256=X664cwuc-WxtjYBAbwJJaK7JEIDqY1Y0eSj0f8V76SU,79
|
|
46
46
|
edu_rdm_integration/pipelines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
|
+
edu_rdm_integration/pipelines/cleanup_outdated_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
|
+
edu_rdm_integration/pipelines/cleanup_outdated_data/apps.py,sha256=tyTlr1Wt574eby2vIV68FMm7SPFSZKYw6zNkD8x6COE,507
|
|
49
|
+
edu_rdm_integration/pipelines/cleanup_outdated_data/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
+
edu_rdm_integration/pipelines/cleanup_outdated_data/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
51
|
+
edu_rdm_integration/pipelines/cleanup_outdated_data/management/commands/rdm_cleanup_outdated_data.py,sha256=Mhas_dqs3NPpCKyRxdGFkQCrsic8_48fRDFhVAmq2MU,676
|
|
47
52
|
edu_rdm_integration/pipelines/transfer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
53
|
edu_rdm_integration/pipelines/transfer/actions.py,sha256=e94NVtTcFIqBBTZ9vbSfh_0oXUWK9ZOx2pDYnIePJVc,5920
|
|
49
54
|
edu_rdm_integration/pipelines/transfer/app_meta.py,sha256=jshfepDDJrbCACtJBJBPuidAVJ6rcziQiet27wqOIjk,373
|
|
@@ -60,7 +65,7 @@ edu_rdm_integration/rdm_entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
|
|
|
60
65
|
edu_rdm_integration/rdm_entities/apps.py,sha256=2rg5IqBjzpvNsjK-1lnrknxH002XYTDCcrEcARCV-ms,302
|
|
61
66
|
edu_rdm_integration/rdm_entities/entities.py,sha256=zfIVpXwiNWEeotiS17xZtijSXe3rx6utCFhZ18fGPhM,14850
|
|
62
67
|
edu_rdm_integration/rdm_entities/mixins.py,sha256=TFxRpajEGHwpFMOJ1G5sJK7hOTEdiv2dWqZzvbUOow4,3081
|
|
63
|
-
edu_rdm_integration/rdm_entities/models.py,sha256=
|
|
68
|
+
edu_rdm_integration/rdm_entities/models.py,sha256=SYzaxKjSNb5de5dRfxpJE-o9j30_Ken99NipsYSU59g,5511
|
|
64
69
|
edu_rdm_integration/rdm_entities/utils.py,sha256=zpVmqcJVYjQSHot9ZrVufDeSECP9kosgTmB8ydFDG8w,1095
|
|
65
70
|
edu_rdm_integration/rdm_entities/migrations/0001_initial.py,sha256=TL8zkmtbFdwdKkFy8wn5SC7dpLBFlS6s8PBp1YBPAog,1664
|
|
66
71
|
edu_rdm_integration/rdm_entities/migrations/0002_rename_regionaldatamartentityenum_rdmentityenum.py,sha256=CJmQp5TPAL66DBzho01tnWDrCa1fOmEI4AdaS0UbAB0,510
|
|
@@ -68,7 +73,7 @@ edu_rdm_integration/rdm_entities/migrations/__init__.py,sha256=47DEQpj8HBSa-_TIm
|
|
|
68
73
|
edu_rdm_integration/rdm_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
69
74
|
edu_rdm_integration/rdm_models/apps.py,sha256=JJwHzCXYVe5cEhvDg61KkrLoRT_ZbJCIAWEM2lOQyHU,288
|
|
70
75
|
edu_rdm_integration/rdm_models/mixins.py,sha256=NuPklb0SppvIfgHK_FCfX7VnD3Wsh48fR85hULoQUNY,2301
|
|
71
|
-
edu_rdm_integration/rdm_models/models.py,sha256=
|
|
76
|
+
edu_rdm_integration/rdm_models/models.py,sha256=6W04GnjydUi3n-8tS7llBRi0ppyJmsZyBmxAJxjxkyE,8444
|
|
72
77
|
edu_rdm_integration/rdm_models/utils.py,sha256=Xk0HEpFEGAndoAD2TdubK4SI_dW2BvchQ7UeMEfvpfQ,631
|
|
73
78
|
edu_rdm_integration/rdm_models/migrations/0001_initial.py,sha256=qXgObuG2nfOLEnGJBoBqmq30TXetOv21UZU4trMV7mQ,1529
|
|
74
79
|
edu_rdm_integration/rdm_models/migrations/0002_rename_regionaldatamartmodelenum_rdmmodelenum.py,sha256=hNTLriOc9r9WEVKahJURA3yXhZ3ivbwJJ_HaMC46PpI,451
|
|
@@ -77,12 +82,12 @@ edu_rdm_integration/stages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
|
|
|
77
82
|
edu_rdm_integration/stages/collect_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
78
83
|
edu_rdm_integration/stages/collect_data/apps.py,sha256=PhrxzAMXvzXajSlgwLudAgasVjh9IFS5M7a7pGbEKC0,339
|
|
79
84
|
edu_rdm_integration/stages/collect_data/consts.py,sha256=tzaK9oxzdMRq3oTEocPz4umoXSJWUtFc7YhyXucCNbs,127
|
|
80
|
-
edu_rdm_integration/stages/collect_data/generators.py,sha256=
|
|
85
|
+
edu_rdm_integration/stages/collect_data/generators.py,sha256=azl0s_xJp6Mg2ARNLKd4o4ikVcarUN3ysb4xm8pYlyY,12434
|
|
81
86
|
edu_rdm_integration/stages/collect_data/helpers.py,sha256=xy8z9yJKEMjNUPNhrsRRtnYy6RVbwDoD5zSDAX7y_6U,5260
|
|
82
87
|
edu_rdm_integration/stages/collect_data/mixins.py,sha256=izioaiPC26BDODgi_Lhy33IaH207945tGjFnbFLMQyI,2072
|
|
83
|
-
edu_rdm_integration/stages/collect_data/models.py,sha256=
|
|
84
|
-
edu_rdm_integration/stages/collect_data/operations.py,sha256=
|
|
85
|
-
edu_rdm_integration/stages/collect_data/tests.py,sha256=
|
|
88
|
+
edu_rdm_integration/stages/collect_data/models.py,sha256=WHGDg-qFyR88fryaD9joxT3bb0tj1yOYaH0XnbGRvAE,9424
|
|
89
|
+
edu_rdm_integration/stages/collect_data/operations.py,sha256=K-St1Avwq093VU1fKzYB19vHRthK_DX6nGPO6PYAipk,11883
|
|
90
|
+
edu_rdm_integration/stages/collect_data/tests.py,sha256=OqxCSdSAOQm92WcBQRF2s0o3VYf-N4e60xpJ1TGdKO8,5550
|
|
86
91
|
edu_rdm_integration/stages/collect_data/function_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
87
92
|
edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/__init__.py-tpl,sha256=pmUE0_cdK0_PUi0fhu25pcza04deRSfVpU63qPOFKQE,155
|
|
88
93
|
edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/apps.py-tpl,sha256=PU5vgYdhtqu440mRAtIzZ78eIc-no3CsPS3rr1kPpOU,319
|
|
@@ -103,15 +108,15 @@ edu_rdm_integration/stages/collect_data/functions/__init__.py,sha256=47DEQpj8HBS
|
|
|
103
108
|
edu_rdm_integration/stages/collect_data/functions/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
104
109
|
edu_rdm_integration/stages/collect_data/functions/base/caches.py,sha256=uFArwPl71zdZxwQPfBNNj3D8D6zOdMHQUJYSV8mZiGg,2138
|
|
105
110
|
edu_rdm_integration/stages/collect_data/functions/base/consts.py,sha256=nzP7973d-YG29l-JxJcq7dF81QDLP7FRtTq0dSq46GM,304
|
|
106
|
-
edu_rdm_integration/stages/collect_data/functions/base/functions.py,sha256=
|
|
107
|
-
edu_rdm_integration/stages/collect_data/functions/base/helpers.py,sha256=
|
|
108
|
-
edu_rdm_integration/stages/collect_data/functions/base/managers.py,sha256=
|
|
109
|
-
edu_rdm_integration/stages/collect_data/functions/base/mixins.py,sha256=
|
|
110
|
-
edu_rdm_integration/stages/collect_data/functions/base/runners.py,sha256=
|
|
111
|
+
edu_rdm_integration/stages/collect_data/functions/base/functions.py,sha256=s-JdkHAuv6FjUjwmHKz7X2PXZU8the6JOA9KDSiy_lQ,3002
|
|
112
|
+
edu_rdm_integration/stages/collect_data/functions/base/helpers.py,sha256=738rlcRnKONoYo-DzzAAWOB0QToKKkFrLhzhypObboI,932
|
|
113
|
+
edu_rdm_integration/stages/collect_data/functions/base/managers.py,sha256=srlaOnALgQoC6Y_5Vk9fD1DxkbufCZaFRqCMrg8JmHM,6120
|
|
114
|
+
edu_rdm_integration/stages/collect_data/functions/base/mixins.py,sha256=j06of4GO61kzKoJAiaT_fBtC1ok7hfaTkRVKqiqtdYI,18234
|
|
115
|
+
edu_rdm_integration/stages/collect_data/functions/base/runners.py,sha256=rR0bkxwk7iU2ENUamVKfs3MwmPO8oV1wkXLchh4sGEg,1525
|
|
111
116
|
edu_rdm_integration/stages/collect_data/functions/calculated/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
112
|
-
edu_rdm_integration/stages/collect_data/functions/calculated/strategies.py,sha256=
|
|
117
|
+
edu_rdm_integration/stages/collect_data/functions/calculated/strategies.py,sha256=K1xKY-nNjPW3GAYkNUfwSS3BhCaYJlBXk_3FpVALKYI,7424
|
|
113
118
|
edu_rdm_integration/stages/collect_data/functions/calculated/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
114
|
-
edu_rdm_integration/stages/collect_data/functions/calculated/base/caches.py,sha256=
|
|
119
|
+
edu_rdm_integration/stages/collect_data/functions/calculated/base/caches.py,sha256=ecC_n-Jlswjl_x-btO2qwZv9Dz6xBrPYI7jnY5UQACc,2813
|
|
115
120
|
edu_rdm_integration/stages/collect_data/functions/calculated/base/consts.py,sha256=DsgPOF_2iCzZTPity27oDDkpS6Axdhd5C94uSkIwA1g,84
|
|
116
121
|
edu_rdm_integration/stages/collect_data/functions/calculated/base/enums.py,sha256=BSmwrkzYwEQhz9NbZCJsldY532PqgZJzxzsVk6ue0bM,93
|
|
117
122
|
edu_rdm_integration/stages/collect_data/functions/calculated/base/errors.py,sha256=Yjcp4gPO0F4j43_NSmbaIapK9RBCiUMgphviF4QO100,300
|
|
@@ -125,9 +130,9 @@ edu_rdm_integration/stages/collect_data/functions/calculated/base/strings.py,sha
|
|
|
125
130
|
edu_rdm_integration/stages/collect_data/functions/calculated/base/tests.py,sha256=MoRY-a75Ow-7EjeQYxkXWunwqTGuBMaUyEkEV2oy05I,59
|
|
126
131
|
edu_rdm_integration/stages/collect_data/functions/calculated/base/validators.py,sha256=RJUDhzGsxOoyiHeAcUyUVuo25D7cnE9PVaJQObMFH0U,883
|
|
127
132
|
edu_rdm_integration/stages/collect_data/functions/non_calculated/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
|
-
edu_rdm_integration/stages/collect_data/functions/non_calculated/strategies.py,sha256=
|
|
133
|
+
edu_rdm_integration/stages/collect_data/functions/non_calculated/strategies.py,sha256=8F-Mr0uyOydwojhE0_X4lUzFENw08tgMReM8h9zh5BI,7226
|
|
129
134
|
edu_rdm_integration/stages/collect_data/functions/non_calculated/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
130
|
-
edu_rdm_integration/stages/collect_data/functions/non_calculated/base/caches.py,sha256=
|
|
135
|
+
edu_rdm_integration/stages/collect_data/functions/non_calculated/base/caches.py,sha256=AE3KBaPDSouLjNIz58cQqtgGgam2aj4LEN_S4RXYPYw,6523
|
|
131
136
|
edu_rdm_integration/stages/collect_data/functions/non_calculated/base/consts.py,sha256=pds1t4eHzovm7Yz2o5je3UHqRE8gqfT2sL-IwpoBN_o,66
|
|
132
137
|
edu_rdm_integration/stages/collect_data/functions/non_calculated/base/enums.py,sha256=BSmwrkzYwEQhz9NbZCJsldY532PqgZJzxzsVk6ue0bM,93
|
|
133
138
|
edu_rdm_integration/stages/collect_data/functions/non_calculated/base/errors.py,sha256=F1CbAT-IbAhb8MlVl-Q9foBya5RbDglzAT_Mr06gV3w,271
|
|
@@ -151,7 +156,7 @@ edu_rdm_integration/stages/collect_data/migrations/0003_auto_20250704_0810.py,sh
|
|
|
151
156
|
edu_rdm_integration/stages/collect_data/migrations/0004_auto_20250704_0825.py,sha256=B6SUsxlhQvWoD8lFGNwaMUCFDzhPj91bsMdmAcSuEDg,1379
|
|
152
157
|
edu_rdm_integration/stages/collect_data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
153
158
|
edu_rdm_integration/stages/collect_data/registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
154
|
-
edu_rdm_integration/stages/collect_data/registry/actions.py,sha256=
|
|
159
|
+
edu_rdm_integration/stages/collect_data/registry/actions.py,sha256=ZMk8H1adcI2ycQ0a0ECBVRNKrkeYDc64UEHKV8drpUU,10260
|
|
155
160
|
edu_rdm_integration/stages/collect_data/registry/apps.py,sha256=K5f97YXKMmdM7m33qgQYvJjrA8_eGAJ4VWyuRjJ0gwQ,439
|
|
156
161
|
edu_rdm_integration/stages/collect_data/registry/ui.py,sha256=pw13DAASxqnX_E5D4RG9CywtnQKQeljXHief7mojVgk,8398
|
|
157
162
|
edu_rdm_integration/stages/collect_data/registry/templates/ui-js/collect-command-window.js,sha256=QfxVSAA0282-41K0XGtyPa9WPzpoX_uClke8pHdAzBo,3112
|
|
@@ -162,9 +167,9 @@ edu_rdm_integration/stages/export_data/consts.py,sha256=ZEi1kXMs-54KFKxkyGIQVwZ4
|
|
|
162
167
|
edu_rdm_integration/stages/export_data/generators.py,sha256=XsTGcKm0oDgE3fUVDxRMkNFriOeuPDBAWi32nx5ASuc,3974
|
|
163
168
|
edu_rdm_integration/stages/export_data/helpers.py,sha256=uBl85AWS-V0usHeLf7VeAsy0ywvqXL_zT1Kgho-MRTM,6537
|
|
164
169
|
edu_rdm_integration/stages/export_data/mixins.py,sha256=YCr5aNcZmDx07JIr-vMietQQ3sZ82caWc7SWOMfdSjY,1772
|
|
165
|
-
edu_rdm_integration/stages/export_data/models.py,sha256=
|
|
170
|
+
edu_rdm_integration/stages/export_data/models.py,sha256=zz4PA0dTeF-6GGHZxUT8Gwd8CxQWSCCpyprK6ffjmz4,11767
|
|
166
171
|
edu_rdm_integration/stages/export_data/operations.py,sha256=g8rj4TaFnkRkaBD4omckBTGwsTlYpuBydOwwxY9hEiI,13188
|
|
167
|
-
edu_rdm_integration/stages/export_data/strategies.py,sha256=
|
|
172
|
+
edu_rdm_integration/stages/export_data/strategies.py,sha256=93pRhUOLL_q4VbWTY3CtC5J8rgPPO2EYn0fJk_oLuLk,6520
|
|
168
173
|
edu_rdm_integration/stages/export_data/function_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
169
174
|
edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/__init__.py-tpl,sha256=pmUE0_cdK0_PUi0fhu25pcza04deRSfVpU63qPOFKQE,155
|
|
170
175
|
edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/apps.py-tpl,sha256=PU5vgYdhtqu440mRAtIzZ78eIc-no3CsPS3rr1kPpOU,319
|
|
@@ -183,19 +188,19 @@ edu_rdm_integration/stages/export_data/function_templates/function_export_data_t
|
|
|
183
188
|
edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/validators.py-tpl,sha256=TIPYLk-rPGE9A1hViZ1Mym8XVJjk1qRlG67YTGZHcIE,587
|
|
184
189
|
edu_rdm_integration/stages/export_data/functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
185
190
|
edu_rdm_integration/stages/export_data/functions/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
186
|
-
edu_rdm_integration/stages/export_data/functions/base/caches.py,sha256=
|
|
191
|
+
edu_rdm_integration/stages/export_data/functions/base/caches.py,sha256=Qea50rW_k_dD6unh93faDkHIv5VrC6I3cRt6InANh4g,1543
|
|
187
192
|
edu_rdm_integration/stages/export_data/functions/base/consts.py,sha256=wRwgxRhQ21uFm9vF0Ub_R7cmep2nYWqGFQDxsIiM2ys,544
|
|
188
193
|
edu_rdm_integration/stages/export_data/functions/base/enums.py,sha256=BSmwrkzYwEQhz9NbZCJsldY532PqgZJzxzsVk6ue0bM,93
|
|
189
194
|
edu_rdm_integration/stages/export_data/functions/base/errors.py,sha256=hd1iXftfJa9oXV2ahBaxu-mfFHsRLSyq_nqAVCLseeA,265
|
|
190
|
-
edu_rdm_integration/stages/export_data/functions/base/functions.py,sha256=
|
|
191
|
-
edu_rdm_integration/stages/export_data/functions/base/helpers.py,sha256=
|
|
192
|
-
edu_rdm_integration/stages/export_data/functions/base/managers.py,sha256=
|
|
195
|
+
edu_rdm_integration/stages/export_data/functions/base/functions.py,sha256=lxMDmNWAV93eln17VoVoCz9TdbFfjQ77FVMe3J9r0SI,9467
|
|
196
|
+
edu_rdm_integration/stages/export_data/functions/base/helpers.py,sha256=hD5U2NdDSnVLlFL7RO5lMhHbrG6yeuiUgYUSaqNMA8A,4495
|
|
197
|
+
edu_rdm_integration/stages/export_data/functions/base/managers.py,sha256=4d-68lvLiIT2h93pDfQfw1TNEypmZ7vd63BEDgKa5Js,6082
|
|
193
198
|
edu_rdm_integration/stages/export_data/functions/base/presenters.py,sha256=DiraTz-aYLzdbz2JKDPBVPPNJpWW376DCBuJwvQQ9bQ,377
|
|
194
199
|
edu_rdm_integration/stages/export_data/functions/base/requests.py,sha256=kZkjuNBvAUraNFN0nxMBD4yHMpN3I0qKnLgJJthq1Ug,2342
|
|
195
200
|
edu_rdm_integration/stages/export_data/functions/base/results.py,sha256=GGVrgemlyyRmyjxovC6jRTRkJSoed-gfBu9LVknRxgs,505
|
|
196
|
-
edu_rdm_integration/stages/export_data/functions/base/runners.py,sha256=
|
|
201
|
+
edu_rdm_integration/stages/export_data/functions/base/runners.py,sha256=Mc_kQrzaM6jaoSjWev0Dyc0adsSMtcZ1aHsqeXoEARs,2423
|
|
197
202
|
edu_rdm_integration/stages/export_data/functions/base/strings.py,sha256=-k9dex8A7hCpkzUkudVkKRAbNRuuqog2hYl2xmibl8I,181
|
|
198
|
-
edu_rdm_integration/stages/export_data/functions/base/tests.py,sha256=
|
|
203
|
+
edu_rdm_integration/stages/export_data/functions/base/tests.py,sha256=QYgprO30EakW0rAhV1NhTIUHB1fvzoQQaQRe9B-ncmc,5842
|
|
199
204
|
edu_rdm_integration/stages/export_data/functions/base/validators.py,sha256=THOLA-9fG5-187O9UkoUgTlJ_7gLLmM9adhEKao1mg8,883
|
|
200
205
|
edu_rdm_integration/stages/export_data/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
201
206
|
edu_rdm_integration/stages/export_data/management/base.py,sha256=u_4Oc6F5OoMiYH7BHYD42Vv7c56vnHxFVqNyPaPv6MI,4068
|
|
@@ -214,6 +219,10 @@ edu_rdm_integration/stages/export_data/registry/templates/ui-js/stage_for_export
|
|
|
214
219
|
edu_rdm_integration/stages/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
215
220
|
edu_rdm_integration/stages/service/apps.py,sha256=lgCG4_kpwgfDWh6y-GNuUwz5SOjkP7oS8kkUyVUcNRg,648
|
|
216
221
|
edu_rdm_integration/stages/service/tasks.py,sha256=PPCtT6EpLkAKRczY0KIT6GeE9eBkv60fl2W6KFvCRqc,2302
|
|
222
|
+
edu_rdm_integration/stages/service/model_outdated_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
223
|
+
edu_rdm_integration/stages/service/model_outdated_data/cleaners.py,sha256=gk5_wUNVJwr3D6k5fJDzbSGEhWUXqk9yT6xPK7OP1hw,637
|
|
224
|
+
edu_rdm_integration/stages/service/model_outdated_data/managers.py,sha256=U2rBg-t-X9YfapP4xRRfKiou7sX0V10WxrPHyeCQ-oI,1880
|
|
225
|
+
edu_rdm_integration/stages/service/outdated_service_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
217
226
|
edu_rdm_integration/stages/upload_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
218
227
|
edu_rdm_integration/stages/upload_data/apps.py,sha256=aFhVPK-65b35CGKoAeAgQ0mm3STaWtZg7rqk3eL-b7s,620
|
|
219
228
|
edu_rdm_integration/stages/upload_data/consts.py,sha256=yTygXxS5dBRCvrE7Q3D0jEGSC5apIKvVAAViDM8QcKA,223
|
|
@@ -245,8 +254,8 @@ edu_rdm_integration/stages/upload_data/uploader_log/ui.py,sha256=mU3XA9zVKHGqzNk
|
|
|
245
254
|
edu_rdm_integration/stages/upload_data/uploader_log/migrations/0001_initial.py,sha256=r5oOB7DBK9-mfuqPAgjXUJY5-hEcmMdILCwDTpaLnBc,753
|
|
246
255
|
edu_rdm_integration/stages/upload_data/uploader_log/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
247
256
|
edu_rdm_integration/stages/upload_data/uploader_log/templates/ui-js/object-grid-buttons.js,sha256=2xyGe0wdVokM0RhpzRzcRvJPBkBmPe3SlZry4oP4Nzs,6201
|
|
248
|
-
edu_rdm_integration-3.
|
|
249
|
-
edu_rdm_integration-3.
|
|
250
|
-
edu_rdm_integration-3.
|
|
251
|
-
edu_rdm_integration-3.
|
|
252
|
-
edu_rdm_integration-3.
|
|
257
|
+
edu_rdm_integration-3.18.0.dist-info/licenses/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
|
|
258
|
+
edu_rdm_integration-3.18.0.dist-info/METADATA,sha256=RYc8moLtHi6fuFZy1BeJssiZ6dXh2UIjexaROn4jtFY,39873
|
|
259
|
+
edu_rdm_integration-3.18.0.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
|
260
|
+
edu_rdm_integration-3.18.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
|
|
261
|
+
edu_rdm_integration-3.18.0.dist-info/RECORD,,
|
|
File without changes
|
{edu_rdm_integration-3.16.2.dist-info → edu_rdm_integration-3.18.0.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|