edu-rdm-integration 0.6.10__py3-none-any.whl → 0.7.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/collect_data/base/managers.py +68 -9
- edu_rdm_integration/collect_data/collect.py +1 -1
- edu_rdm_integration/collect_data/tests.py +1 -1
- edu_rdm_integration/function_templates/function_collect_data_template/functions.py-tpl +44 -21
- edu_rdm_integration/function_templates/function_collect_data_template/helpers.py-tpl +1 -3
- edu_rdm_integration/function_templates/function_collect_data_template/managers.py-tpl +9 -2
- edu_rdm_integration/function_templates/function_collect_data_template/runners.py-tpl +10 -2
- edu_rdm_integration/function_templates/function_collect_data_template/tests.py-tpl +31 -1
- edu_rdm_integration/function_templates/function_collect_data_template/validators.py-tpl +0 -8
- edu_rdm_integration/function_templates/function_export_data_template/caches.py-tpl +13 -11
- edu_rdm_integration/function_templates/function_export_data_template/functions.py-tpl +29 -19
- edu_rdm_integration/function_templates/function_export_data_template/managers.py-tpl +25 -5
- edu_rdm_integration/function_templates/function_export_data_template/runners.py-tpl +22 -4
- edu_rdm_integration/function_templates/function_export_data_template/validators.py-tpl +0 -8
- {edu_rdm_integration-0.6.10.dist-info → edu_rdm_integration-0.7.0.dist-info}/METADATA +26 -2
- {edu_rdm_integration-0.6.10.dist-info → edu_rdm_integration-0.7.0.dist-info}/RECORD +20 -20
- {edu_rdm_integration-0.6.10.dist-info → edu_rdm_integration-0.7.0.dist-info}/LICENSE +0 -0
- {edu_rdm_integration-0.6.10.dist-info → edu_rdm_integration-0.7.0.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-0.6.10.dist-info → edu_rdm_integration-0.7.0.dist-info}/namespace_packages.txt +0 -0
- {edu_rdm_integration-0.6.10.dist-info → edu_rdm_integration-0.7.0.dist-info}/top_level.txt +0 -0
@@ -1,13 +1,23 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
1
3
|
from abc import (
|
2
4
|
ABCMeta,
|
3
5
|
)
|
4
6
|
from datetime import (
|
5
7
|
datetime,
|
6
8
|
)
|
9
|
+
from django.apps import (
|
10
|
+
apps,
|
11
|
+
)
|
7
12
|
from typing import (
|
8
13
|
TYPE_CHECKING,
|
9
14
|
List,
|
10
15
|
Type,
|
16
|
+
Set,
|
17
|
+
)
|
18
|
+
|
19
|
+
from django.conf import (
|
20
|
+
settings,
|
11
21
|
)
|
12
22
|
|
13
23
|
from educommon import (
|
@@ -61,21 +71,46 @@ class BaseCollectingDataRunnerManager(WebEduRunnerManager, metaclass=ABCMeta):
|
|
61
71
|
self._logs = logs
|
62
72
|
|
63
73
|
self._logs_period_started_at = logs_period_started_at
|
64
|
-
|
65
|
-
logger.info(f'{LOGS_DELIMITER}logs period started at {self._logs_period_started_at.strftime(DATETIME_FORMAT)}')
|
66
|
-
|
67
74
|
self._logs_period_ended_at = logs_period_ended_at
|
68
|
-
|
69
|
-
logger.info(f'{LOGS_DELIMITER}log period ended at {self._logs_period_ended_at.strftime(DATETIME_FORMAT)}')
|
70
|
-
|
71
75
|
self._stage = CollectingExportedDataStage.objects.create(
|
72
76
|
manager_id=self.uuid,
|
73
77
|
logs_period_started_at=logs_period_started_at,
|
74
78
|
logs_period_ended_at=logs_period_ended_at,
|
75
79
|
)
|
76
80
|
|
81
|
+
self._command_id = kwargs.get('command_id')
|
82
|
+
self._file_handler = None
|
83
|
+
|
84
|
+
self._add_file_handler()
|
85
|
+
|
86
|
+
logger.info(f'{LOGS_DELIMITER}logs period started at {self._logs_period_started_at.strftime(DATETIME_FORMAT)}')
|
87
|
+
logger.info(f'{LOGS_DELIMITER}log period ended at {self._logs_period_ended_at.strftime(DATETIME_FORMAT)}')
|
77
88
|
logger.info(f'{LOGS_DELIMITER}created {repr(self._stage)}')
|
78
89
|
|
90
|
+
def _add_file_handler(self) -> None:
|
91
|
+
"""
|
92
|
+
Добавляет обработчик логов.
|
93
|
+
"""
|
94
|
+
if self._command_id:
|
95
|
+
self._file_handler = logging.FileHandler(
|
96
|
+
os.path.join(
|
97
|
+
settings.MEDIA_ROOT,
|
98
|
+
settings.RDM_COLLECT_LOG_DIR,
|
99
|
+
f'{self._stage.id}.log',
|
100
|
+
),
|
101
|
+
)
|
102
|
+
logging.getLogger('info_logger').addHandler(self._file_handler)
|
103
|
+
logging.getLogger('exception_logger').addHandler(self._file_handler)
|
104
|
+
|
105
|
+
def _remove_file_handler(self) -> None:
|
106
|
+
"""
|
107
|
+
Удаляет обработчик логов.
|
108
|
+
"""
|
109
|
+
if self._command_id:
|
110
|
+
logging.getLogger('info_logger').removeHandler(self._file_handler)
|
111
|
+
logging.getLogger('exception_logger').removeHandler(self._file_handler)
|
112
|
+
self._file_handler.close()
|
113
|
+
|
79
114
|
def _collect_runner_regional_data_mart_integration_entities(
|
80
115
|
self,
|
81
116
|
runner_class: Type[BaseRunner],
|
@@ -98,11 +133,11 @@ class BaseCollectingDataRunnerManager(WebEduRunnerManager, metaclass=ABCMeta):
|
|
98
133
|
|
99
134
|
runner_regional_data_mart_integration_entities.extend(entities)
|
100
135
|
|
101
|
-
def _get_loggable_models(self) ->
|
136
|
+
def _get_loggable_models(self) -> Set['Model']:
|
102
137
|
"""
|
103
138
|
Возвращает перечень моделей по которым собираются логи.
|
104
139
|
"""
|
105
|
-
loggable_models =
|
140
|
+
loggable_models = set()
|
106
141
|
regional_data_mart_integration_entities = []
|
107
142
|
|
108
143
|
self._collect_runner_regional_data_mart_integration_entities(
|
@@ -110,7 +145,19 @@ class BaseCollectingDataRunnerManager(WebEduRunnerManager, metaclass=ABCMeta):
|
|
110
145
|
regional_data_mart_integration_entities,
|
111
146
|
)
|
112
147
|
for entity in regional_data_mart_integration_entities:
|
113
|
-
loggable_models.
|
148
|
+
loggable_models.update(entity.loggable_models)
|
149
|
+
# TODO: EDUSCHL-20938 Произвести рефакторинг plugins_info.
|
150
|
+
if hasattr(entity, 'plugins_info'):
|
151
|
+
for app_name, app_content in entity.plugins_info.items():
|
152
|
+
if not apps.is_installed(app_name):
|
153
|
+
continue
|
154
|
+
|
155
|
+
app_label, model_name = app_content.split('.')
|
156
|
+
try:
|
157
|
+
model = apps.get_model(app_label=app_label, model_name=model_name)
|
158
|
+
loggable_models.add(model)
|
159
|
+
except (ValueError, LookupError):
|
160
|
+
continue
|
114
161
|
|
115
162
|
return loggable_models
|
116
163
|
|
@@ -177,3 +224,15 @@ class BaseCollectingDataRunnerManager(WebEduRunnerManager, metaclass=ABCMeta):
|
|
177
224
|
self._stage.save()
|
178
225
|
|
179
226
|
logger.info(f'{LOGS_DELIMITER}change status {repr(self._stage)}')
|
227
|
+
|
228
|
+
def run(self, *args, **kwargs):
|
229
|
+
"""
|
230
|
+
Запускает менеджер ранера.
|
231
|
+
"""
|
232
|
+
try:
|
233
|
+
super().run(*args, **kwargs)
|
234
|
+
except Exception as err:
|
235
|
+
logger.exception(err)
|
236
|
+
raise
|
237
|
+
finally:
|
238
|
+
self._remove_file_handler()
|
@@ -138,7 +138,7 @@ class BaseCollectModelsData:
|
|
138
138
|
|
139
139
|
for model_key, manager_class in self._collecting_data_managers.items():
|
140
140
|
model_logs = logs.get(model_key) if logs else None
|
141
|
-
manager = manager_class(*args, logs=model_logs, **kwargs)
|
141
|
+
manager = manager_class(*args, logs=model_logs, command_id=self.command_id, **kwargs)
|
142
142
|
|
143
143
|
if self.command_id:
|
144
144
|
# Подается сигнал, что менеджер создан:
|
@@ -127,7 +127,7 @@ class BaseCollectingFunctionTestCase(TestCase):
|
|
127
127
|
operation=operation,
|
128
128
|
)
|
129
129
|
|
130
|
-
def create_sub_stage(self, *class_names:
|
130
|
+
def create_sub_stage(self, *class_names: str) -> CollectingExportedDataSubStage:
|
131
131
|
"""Создает подэтап сбора данных."""
|
132
132
|
function_tools_entities = dict(
|
133
133
|
Entity.objects.filter(
|
@@ -1,4 +1,6 @@
|
|
1
1
|
from typing import (
|
2
|
+
TYPE_CHECKING,
|
3
|
+
Any,
|
2
4
|
Dict,
|
3
5
|
List,
|
4
6
|
Optional,
|
@@ -12,6 +14,13 @@ from educommon.integration_entities.helpers import (
|
|
12
14
|
EntitySaver,
|
13
15
|
)
|
14
16
|
|
17
|
+
from edu_rdm_integration.consts import (
|
18
|
+
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
19
|
+
)
|
20
|
+
from edu_rdm_integration.models import (
|
21
|
+
RegionalDataMartModelEnum,
|
22
|
+
)
|
23
|
+
|
15
24
|
from {{ strategy.function_class_module }} import (
|
16
25
|
{{ strategy.function_class_name }},
|
17
26
|
)
|
@@ -27,6 +36,12 @@ from {{ function_python_path }}.validators import (
|
|
27
36
|
)
|
28
37
|
|
29
38
|
|
39
|
+
if TYPE_CHECKING:
|
40
|
+
from m3_db_utils.models import (
|
41
|
+
ModelEnumValue,
|
42
|
+
)
|
43
|
+
|
44
|
+
|
30
45
|
class {{ camel_case_function_name }}Function({{ strategy.function_class_name }}):
|
31
46
|
"""Функция "{{ function_verbose_name }}"."""
|
32
47
|
|
@@ -37,20 +52,15 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
37
52
|
):
|
38
53
|
super().__init__(*args, **kwargs)
|
39
54
|
|
40
|
-
# Ключ результата работы функции, используется в презентере
|
41
|
-
# self.result.key =
|
42
|
-
# Сообщение об успешном выполнении функции
|
43
|
-
# self.result.message =
|
44
|
-
|
45
55
|
self._to_save_entities = {
|
46
56
|
EntityLogOperation.CREATE: {},
|
47
57
|
EntityLogOperation.UPDATE: {},
|
48
58
|
}
|
49
59
|
|
50
60
|
self._preparing_functions_map = {
|
51
|
-
EntityLogOperation.CREATE: self.
|
52
|
-
EntityLogOperation.UPDATE: self.
|
53
|
-
EntityLogOperation.DELETE: self.
|
61
|
+
EntityLogOperation.CREATE: self._prepare_model_instances_for_create,
|
62
|
+
EntityLogOperation.UPDATE: self._prepare_model_instances_for_update,
|
63
|
+
EntityLogOperation.DELETE: self._prepare_model_instances_for_delete,
|
54
64
|
}
|
55
65
|
|
56
66
|
@classmethod
|
@@ -59,7 +69,7 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
59
69
|
|
60
70
|
Если ничего не возвращает, то регистрация в БД не будет произведена.
|
61
71
|
"""
|
62
|
-
return
|
72
|
+
return '{{ strategy.function_uuid }}'
|
63
73
|
|
64
74
|
@classmethod
|
65
75
|
def _prepare_verbose_name(cls) -> str:
|
@@ -69,9 +79,21 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
69
79
|
@classmethod
|
70
80
|
def _prepare_tags(cls) -> List[str]:
|
71
81
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
72
|
-
tags = [
|
82
|
+
tags = [
|
83
|
+
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
84
|
+
]
|
85
|
+
|
73
86
|
return tags
|
74
87
|
|
88
|
+
@classmethod
|
89
|
+
def _prepare_entities(cls) -> List['ModelEnumValue']:
|
90
|
+
"""Формирование списка ключей модели-перечисления моделей РВД."""
|
91
|
+
rdm_models = [
|
92
|
+
RegionalDataMartModelEnum.,
|
93
|
+
]
|
94
|
+
|
95
|
+
return rdm_models
|
96
|
+
|
75
97
|
def _prepare_helper_class(self) -> Type[{{ camel_case_function_name }}FunctionHelper]:
|
76
98
|
"""Возвращает класс помощника функции."""
|
77
99
|
return {{ camel_case_function_name }}FunctionHelper
|
@@ -84,23 +106,24 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
84
106
|
"""Возвращает класс результата функции."""
|
85
107
|
return {{ camel_case_function_name }}FunctionResult
|
86
108
|
|
87
|
-
def
|
88
|
-
"""Подготовка объектов модели для создания."""
|
109
|
+
def _prepare_model_instances_for_create(self, class_id: int, **kwargs) -> None:
|
110
|
+
"""Подготовка объектов модели РВД для создания."""
|
89
111
|
raise NotImplementedError
|
90
112
|
|
91
|
-
def
|
92
|
-
"""Подготовка объектов модели для обновления."""
|
113
|
+
def _prepare_model_instances_for_update(self, class_id: int, log_changes: Dict[str, Any], **kwargs) -> None:
|
114
|
+
"""Подготовка объектов модели РВД для обновления."""
|
93
115
|
raise NotImplementedError
|
94
116
|
|
95
|
-
def
|
96
|
-
"""Подготовка объектов модели для удаления."""
|
117
|
+
def _prepare_model_instances_for_delete(self, class_id: int, **kwargs) -> None:
|
118
|
+
"""Подготовка объектов модели РВД для удаления."""
|
97
119
|
raise NotImplementedError
|
98
120
|
|
99
|
-
def
|
100
|
-
"""Подготовка объектов
|
121
|
+
def _prepare_model_instances(self):
|
122
|
+
"""Подготовка объектов модели РВД для сохранения.
|
101
123
|
|
102
124
|
Производится обработка логов и на их основе выбирается подходящий метод для дальнейшей обработки.
|
103
125
|
"""
|
126
|
+
# !!! Удалить после реализации !!!
|
104
127
|
# for some_id, log_changes in <some logs>:
|
105
128
|
# for log_change in log_changes:
|
106
129
|
# func = self._preparing_functions_map[log_change.operation]
|
@@ -109,12 +132,12 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
109
132
|
|
110
133
|
def _prepare(self, *args, **kwargs):
|
111
134
|
"""Выполнение действий функций системы."""
|
112
|
-
|
135
|
+
save_model_instances = EntitySaver(
|
113
136
|
to_save_entities=self._to_save_entities,
|
114
137
|
model=self.first_entity.model,
|
115
138
|
)
|
116
139
|
|
117
|
-
self.
|
140
|
+
self._prepare_model_instances()
|
118
141
|
|
119
142
|
if self.result.has_not_errors:
|
120
|
-
self.do_on_save(
|
143
|
+
self.do_on_save(save_model_instances)
|
@@ -27,7 +27,5 @@ class {{ camel_case_function_name }}FunctionHelper({{ strategy.function_helper_c
|
|
27
27
|
"""Помощник функции "{{ function_verbose_name }}"."""
|
28
28
|
|
29
29
|
def _prepare_cache_class(self) -> Type[{{ camel_case_function_name }}FunctionCacheStorage]:
|
30
|
-
"""
|
31
|
-
Возвращает класс кеша помощника функции.
|
32
|
-
"""
|
30
|
+
"""Возвращает класс кеша помощника функции."""
|
33
31
|
return {{ camel_case_function_name }}FunctionCacheStorage
|
@@ -4,6 +4,10 @@ from typing import (
|
|
4
4
|
Type,
|
5
5
|
)
|
6
6
|
|
7
|
+
from edu_rdm_integration.consts import (
|
8
|
+
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
9
|
+
)
|
10
|
+
|
7
11
|
from {{ strategy.manager_class_module }} import (
|
8
12
|
{{ strategy.manager_class_name }},
|
9
13
|
)
|
@@ -22,7 +26,7 @@ class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name
|
|
22
26
|
|
23
27
|
Если ничего не возвращает, то регистрация в БД не будет произведена.
|
24
28
|
"""
|
25
|
-
return
|
29
|
+
return '{{ strategy.manager_uuid }}'
|
26
30
|
|
27
31
|
@classmethod
|
28
32
|
def _prepare_verbose_name(cls) -> str:
|
@@ -32,7 +36,10 @@ class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name
|
|
32
36
|
@classmethod
|
33
37
|
def _prepare_tags(cls) -> List[str]:
|
34
38
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
35
|
-
tags = [
|
39
|
+
tags = [
|
40
|
+
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
41
|
+
]
|
42
|
+
|
36
43
|
return tags
|
37
44
|
|
38
45
|
@classmethod
|
@@ -8,6 +8,10 @@ from function_tools.general import (
|
|
8
8
|
RunnableObject,
|
9
9
|
)
|
10
10
|
|
11
|
+
from edu_rdm_integration.consts import (
|
12
|
+
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
13
|
+
)
|
14
|
+
|
11
15
|
from {{ strategy.runner_class_module }} import (
|
12
16
|
{{ strategy.runner_class_name }},
|
13
17
|
)
|
@@ -35,7 +39,7 @@ class {{ camel_case_function_name }}Runner({{ strategy.runner_class_name }}):
|
|
35
39
|
|
36
40
|
Если ничего не возвращает, то регистрация в БД не будет произведена.
|
37
41
|
"""
|
38
|
-
return
|
42
|
+
return '{{ strategy.runner_uuid }}'
|
39
43
|
|
40
44
|
@classmethod
|
41
45
|
def _prepare_verbose_name(cls) -> str:
|
@@ -45,7 +49,11 @@ class {{ camel_case_function_name }}Runner({{ strategy.runner_class_name }}):
|
|
45
49
|
@classmethod
|
46
50
|
def _prepare_tags(cls) -> List[str]:
|
47
51
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
48
|
-
|
52
|
+
tags = [
|
53
|
+
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
54
|
+
]
|
55
|
+
|
56
|
+
return tags
|
49
57
|
|
50
58
|
@classmethod
|
51
59
|
def _prepare_runnable_classes(cls) -> Optional[List[Type[RunnableObject]]]:
|
@@ -1 +1,31 @@
|
|
1
|
-
|
1
|
+
from typing import (
|
2
|
+
TYPE_CHECKING,
|
3
|
+
Type,
|
4
|
+
)
|
5
|
+
|
6
|
+
from edu_rdm_integration.collect_data.tests import (
|
7
|
+
BaseCollectingFunctionTestCase,
|
8
|
+
)
|
9
|
+
|
10
|
+
from {{ function_python_path }}.managers import (
|
11
|
+
{{ camel_case_function_name }}RunnerManager,
|
12
|
+
)
|
13
|
+
|
14
|
+
|
15
|
+
if TYPE_CHECKING:
|
16
|
+
from function_tools.managers import (
|
17
|
+
RunnerManager,
|
18
|
+
)
|
19
|
+
|
20
|
+
|
21
|
+
class Base{{ camel_case_function_name }}TestCase(BaseCollectingFunctionTestCase):
|
22
|
+
"""Базовый класс тестирования Функции "{{ function_verbose_name }}"."""
|
23
|
+
|
24
|
+
@property
|
25
|
+
def manager(self) -> Type['RunnerManager']:
|
26
|
+
"""Менеджер раннера Функции сбора."""
|
27
|
+
return {{ camel_case_function_name }}RunnerManager
|
28
|
+
|
29
|
+
def setUp(self) -> None:
|
30
|
+
"""Подготавливает фикстуры."""
|
31
|
+
super().setUp()
|
@@ -9,14 +9,6 @@ from {{ strategy.runner_validator_class_module }} import (
|
|
9
9
|
class {{ camel_case_function_name }}RunnerValidator({{ strategy.runner_validator_class_name }}):
|
10
10
|
"""Валидатор ранера функции "{{ function_verbose_name }}"."""
|
11
11
|
|
12
|
-
def validate(self, runnable):
|
13
|
-
"""Выполнение валидации."""
|
14
|
-
super().validate(runnable=runnable)
|
15
|
-
|
16
12
|
|
17
13
|
class {{ camel_case_function_name }}FunctionValidator({{ strategy.function_validator_class_name }}):
|
18
14
|
"""Валидатор функции "{{ function_verbose_name }}"."""
|
19
|
-
|
20
|
-
def validate(self, runnable):
|
21
|
-
"""Выполнение валидации."""
|
22
|
-
super().validate(runnable=runnable)
|
@@ -1,3 +1,8 @@
|
|
1
|
+
from typing import (
|
2
|
+
TYPE_CHECKING,
|
3
|
+
List,
|
4
|
+
)
|
5
|
+
|
1
6
|
from {{ strategy.function_cache_storage_class_module }} import (
|
2
7
|
{{ strategy.function_cache_storage_class_name }},
|
3
8
|
)
|
@@ -6,24 +11,21 @@ from {{ strategy.runner_cache_storage_class_module }} import (
|
|
6
11
|
)
|
7
12
|
|
8
13
|
|
9
|
-
|
10
|
-
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from educommon.integration_entities.entities import (
|
16
|
+
BaseEntity,
|
17
|
+
)
|
11
18
|
|
12
|
-
def __init__(self, *args, **kwargs):
|
13
|
-
"""Инициализация хранилища кешей ранера."""
|
14
19
|
|
15
|
-
|
16
|
-
|
17
|
-
def _prepare(self, *args, **kwargs):
|
18
|
-
"""Наполнение кешей данными."""
|
19
|
-
super()._prepare(*args, **kwargs)
|
20
|
+
class {{ camel_case_function_name }}RunnerCacheStorage({{ strategy.runner_cache_storage_class_name }}):
|
21
|
+
"""Кеш помощника ранера функции "{{ function_verbose_name }}"."""
|
20
22
|
|
21
23
|
|
22
24
|
class {{ camel_case_function_name }}FunctionCacheStorage({{ strategy.function_cache_storage_class_name }}):
|
23
25
|
"""Кеш помощника функции "{{ function_verbose_name }}"."""
|
24
26
|
|
25
|
-
def _prepare_entity_instances(self, model_ids, *args, **kwargs) -> List[BaseEntity]:
|
26
|
-
"""Подготовка данных для
|
27
|
+
def _prepare_entity_instances(self, model_ids, *args, **kwargs) -> List['BaseEntity']:
|
28
|
+
"""Подготовка данных для экспорта в виде экземпляров сущности."""
|
27
29
|
instances = []
|
28
30
|
|
29
31
|
return instances
|
@@ -1,9 +1,17 @@
|
|
1
1
|
from typing import (
|
2
|
+
TYPE_CHECKING,
|
2
3
|
List,
|
3
4
|
Optional,
|
4
5
|
Type,
|
5
6
|
)
|
6
7
|
|
8
|
+
from edu_rdm_integration.consts import (
|
9
|
+
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
10
|
+
)
|
11
|
+
from edu_rdm_integration.models import (
|
12
|
+
RegionalDataMartEntityEnum,
|
13
|
+
)
|
14
|
+
|
7
15
|
from {{ strategy.function_class_module }} import (
|
8
16
|
{{ strategy.function_class_name }},
|
9
17
|
)
|
@@ -19,20 +27,14 @@ from {{ function_python_path }}.validators import (
|
|
19
27
|
)
|
20
28
|
|
21
29
|
|
22
|
-
|
23
|
-
|
30
|
+
if TYPE_CHECKING:
|
31
|
+
from m3_db_utils.models import (
|
32
|
+
ModelEnumValue,
|
33
|
+
)
|
24
34
|
|
25
|
-
def __init__(
|
26
|
-
self,
|
27
|
-
*args,
|
28
|
-
**kwargs,
|
29
|
-
):
|
30
|
-
super().__init__(*args, **kwargs)
|
31
35
|
|
32
|
-
|
33
|
-
|
34
|
-
# Сообщение об успешном выполнении функции
|
35
|
-
# self.result.message =
|
36
|
+
class {{ camel_case_function_name }}Function({{ strategy.function_class_name }}):
|
37
|
+
"""Функция "{{ function_verbose_name }}"."""
|
36
38
|
|
37
39
|
@classmethod
|
38
40
|
def _prepare_uuid(cls) -> Optional[str]:
|
@@ -40,17 +42,30 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
40
42
|
|
41
43
|
Если ничего не возвращает, то регистрация в БД не будет произведена.
|
42
44
|
"""
|
43
|
-
return
|
45
|
+
return '{{ strategy.function_uuid }}'
|
44
46
|
|
45
47
|
@classmethod
|
46
48
|
def _prepare_verbose_name(cls) -> str:
|
47
49
|
"""Полное наименование для дальнейшей регистрации и отображения пользователю."""
|
48
50
|
return 'Функция "{{ function_verbose_name }}"'
|
49
51
|
|
52
|
+
@classmethod
|
53
|
+
def _prepare_entities(cls) -> List['ModelEnumValue']:
|
54
|
+
"""Формирование списка ключей модели-перечисления сущностей."""
|
55
|
+
entities = [
|
56
|
+
RegionalDataMartEntityEnum.,
|
57
|
+
]
|
58
|
+
|
59
|
+
return entities
|
60
|
+
|
50
61
|
@classmethod
|
51
62
|
def _prepare_tags(cls) -> List[str]:
|
52
63
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
53
|
-
|
64
|
+
tags = [
|
65
|
+
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
66
|
+
]
|
67
|
+
|
68
|
+
return tags
|
54
69
|
|
55
70
|
def _prepare_helper_class(self) -> Type[{{ camel_case_function_name }}FunctionHelper]:
|
56
71
|
"""Возвращает класс помощника функции."""
|
@@ -63,8 +78,3 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
63
78
|
def _prepare_result_class(self) -> Type[{{ camel_case_function_name }}FunctionResult]:
|
64
79
|
"""Возвращает класс результата функции."""
|
65
80
|
return {{ camel_case_function_name }}FunctionResult
|
66
|
-
|
67
|
-
def _prepare(self, *args, **kwargs):
|
68
|
-
"""Выполнение действий функции."""
|
69
|
-
if self.result.has_not_errors:
|
70
|
-
pass
|
@@ -1,9 +1,19 @@
|
|
1
1
|
from typing import (
|
2
|
+
TYPE_CHECKING,
|
3
|
+
Dict,
|
4
|
+
Iterator,
|
2
5
|
List,
|
3
6
|
Optional,
|
4
7
|
Type,
|
5
8
|
)
|
6
9
|
|
10
|
+
from edu_rdm_integration.consts import (
|
11
|
+
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
12
|
+
)
|
13
|
+
from edu_rdm_integration.models import (
|
14
|
+
RegionalDataMartModelEnum,
|
15
|
+
)
|
16
|
+
|
7
17
|
from {{ strategy.manager_class_module }} import (
|
8
18
|
{{ strategy.manager_class_name }},
|
9
19
|
)
|
@@ -13,6 +23,12 @@ from {{ function_python_path }}.runners import (
|
|
13
23
|
)
|
14
24
|
|
15
25
|
|
26
|
+
if TYPE_CHECKING:
|
27
|
+
from m3_db_utils.models import (
|
28
|
+
ModelEnumValue,
|
29
|
+
)
|
30
|
+
|
31
|
+
|
16
32
|
class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name }}):
|
17
33
|
"""Менеджер ранера функций "{{ function_verbose_name }}"."""
|
18
34
|
|
@@ -22,7 +38,7 @@ class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name
|
|
22
38
|
|
23
39
|
Если ничего не возвращает, то регистрация в БД не будет произведена.
|
24
40
|
"""
|
25
|
-
return
|
41
|
+
return '{{ strategy.manager_uuid }}'
|
26
42
|
|
27
43
|
@classmethod
|
28
44
|
def _prepare_verbose_name(cls) -> str:
|
@@ -32,7 +48,11 @@ class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name
|
|
32
48
|
@classmethod
|
33
49
|
def _prepare_tags(cls) -> List[str]:
|
34
50
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
35
|
-
|
51
|
+
tags = [
|
52
|
+
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
53
|
+
]
|
54
|
+
|
55
|
+
return tags
|
36
56
|
|
37
57
|
@classmethod
|
38
58
|
def _prepare_runner_class(cls) -> Type[{{ camel_case_function_name }}Runner]:
|
@@ -45,12 +65,12 @@ class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name
|
|
45
65
|
В выборках (QuerySet) необходимо использовать iterator().
|
46
66
|
"""
|
47
67
|
model_ids_map = {
|
48
|
-
RegionalDataMartModelEnum
|
49
|
-
RegionalDataMartModelEnum
|
68
|
+
RegionalDataMartModelEnum.: (
|
69
|
+
RegionalDataMartModelEnum..model.objects.filter(
|
50
70
|
modified__gte=self._period_started_at,
|
51
71
|
modified__lt=self._period_ended_at,
|
52
72
|
).values_list('pk', flat=True).iterator()
|
53
73
|
),
|
54
74
|
}
|
55
75
|
|
56
|
-
return model_ids_map
|
76
|
+
return model_ids_map
|
@@ -4,10 +4,24 @@ from typing import (
|
|
4
4
|
Type,
|
5
5
|
)
|
6
6
|
|
7
|
+
from django.conf import (
|
8
|
+
settings,
|
9
|
+
)
|
10
|
+
|
11
|
+
from educommon.utils.seqtools import (
|
12
|
+
make_chunks,
|
13
|
+
)
|
7
14
|
from function_tools.general import (
|
8
15
|
RunnableObject,
|
9
16
|
)
|
10
17
|
|
18
|
+
from edu_rdm_integration.consts import (
|
19
|
+
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
20
|
+
)
|
21
|
+
from edu_rdm_integration.models import (
|
22
|
+
RegionalDataMartModelEnum,
|
23
|
+
)
|
24
|
+
|
11
25
|
from {{ strategy.runner_class_module }} import (
|
12
26
|
{{ strategy.runner_class_name }},
|
13
27
|
)
|
@@ -35,7 +49,7 @@ class {{ camel_case_function_name }}Runner({{ strategy.runner_class_name }}):
|
|
35
49
|
|
36
50
|
Если ничего не возвращает, то регистрация в БД не будет произведена.
|
37
51
|
"""
|
38
|
-
return
|
52
|
+
return '{{ strategy.runner_uuid }}'
|
39
53
|
|
40
54
|
@classmethod
|
41
55
|
def _prepare_verbose_name(cls) -> str:
|
@@ -45,7 +59,11 @@ class {{ camel_case_function_name }}Runner({{ strategy.runner_class_name }}):
|
|
45
59
|
@classmethod
|
46
60
|
def _prepare_tags(cls) -> List[str]:
|
47
61
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
48
|
-
|
62
|
+
tags = [
|
63
|
+
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
64
|
+
]
|
65
|
+
|
66
|
+
return tags
|
49
67
|
|
50
68
|
@classmethod
|
51
69
|
def _prepare_runnable_classes(cls) -> Optional[List[Type[RunnableObject]]]:
|
@@ -68,10 +86,10 @@ class {{ camel_case_function_name }}Runner({{ strategy.runner_class_name }}):
|
|
68
86
|
"""Формирование чанков идентификаторов записей моделей для дальнейшей работы в рамках функций."""
|
69
87
|
if model_ids_map:
|
70
88
|
model_ids_chunks = make_chunks(
|
71
|
-
iterable=model_ids_map[RegionalDataMartModelEnum
|
89
|
+
iterable=model_ids_map[RegionalDataMartModelEnum.],
|
72
90
|
size=settings.RDM_EXPORT_CHUNK_SIZE,
|
73
91
|
)
|
74
92
|
else:
|
75
93
|
model_ids_chunks = ()
|
76
94
|
|
77
|
-
return model_ids_chunks
|
95
|
+
return model_ids_chunks
|
@@ -9,14 +9,6 @@ from {{ strategy.runner_validator_class_module }} import (
|
|
9
9
|
class {{ camel_case_function_name }}RunnerValidator({{ strategy.runner_validator_class_name }}):
|
10
10
|
"""Валидатор ранера функции "{{ function_verbose_name }}"."""
|
11
11
|
|
12
|
-
def validate(self, runnable):
|
13
|
-
"""Выполнение валидации."""
|
14
|
-
super().validate(runnable=runnable)
|
15
|
-
|
16
12
|
|
17
13
|
class {{ camel_case_function_name }}FunctionValidator({{ strategy.function_validator_class_name }}):
|
18
14
|
"""Валидатор функции "{{ function_verbose_name }}"."""
|
19
|
-
|
20
|
-
def validate(self, runnable):
|
21
|
-
"""Выполнение валидации."""
|
22
|
-
super().validate(runnable=runnable)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: edu-rdm-integration
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.7.0
|
4
4
|
Summary: Интеграция с Региональной витриной данных
|
5
5
|
Home-page:
|
6
6
|
Download-URL:
|
@@ -29,7 +29,7 @@ Requires-Dist: wheel <0.42,>=0.37.1
|
|
29
29
|
Requires-Dist: transliterate <2
|
30
30
|
Requires-Dist: Django <2.3,>=1.11
|
31
31
|
Requires-Dist: educommon <4,>=3.0.0
|
32
|
-
Requires-Dist: function-tools <1,>=0.
|
32
|
+
Requires-Dist: function-tools <1,>=0.8.0
|
33
33
|
Requires-Dist: m3-db-utils <1,>=0.3.8
|
34
34
|
Requires-Dist: uploader-client <1,>=0.2.1
|
35
35
|
|
@@ -290,6 +290,30 @@ Requires-Dist: uploader-client <1,>=0.2.1
|
|
290
290
|
### Удалено
|
291
291
|
|
292
292
|
|
293
|
+
## [0.7.0] - 2023-12-02
|
294
|
+
|
295
|
+
Добавлено формирование логов для последующего скачивания.
|
296
|
+
Доработаны шаблоны реализации Функций сбора и выгрузки данных.
|
297
|
+
Написана документация для реализации функционала новой Сущности.
|
298
|
+
Добавлено получение моделей на основе данных plugins_info при работе метода _get_loggable_models.
|
299
|
+
|
300
|
+
### Добавлено
|
301
|
+
|
302
|
+
- [EDUSCHL-20072](https://jira.bars.group/browse/EDUSCHL-20072)
|
303
|
+
MINOR - Реестр сбора и выгрузки. Логи
|
304
|
+
|
305
|
+
- [EDUSCHL-20954](https://jira.bars.group/browse/EDUSCHL-20954)
|
306
|
+
PATCH Добавлена документация для реализации функционала новой Сущности.
|
307
|
+
|
308
|
+
### Изменено
|
309
|
+
|
310
|
+
- [EDUSCHL-20954](https://jira.bars.group/browse/EDUSCHL-20954)
|
311
|
+
PATCH Произведена доработка шаблонов Функций сбора и выгрузки данных.
|
312
|
+
|
313
|
+
- [EDUSCHL-19576](https://jira.bars.group/browse/EDUSCHL-19576)
|
314
|
+
PATCH - Добавлено получение моделей на основе данных plugins_info при работе метода _get_loggable_models.
|
315
|
+
|
316
|
+
|
293
317
|
## [0.6.10] - 2023-11-30
|
294
318
|
|
295
319
|
При добавлении префикса RDM_EXPORT_ENTITY_ID_PREFIX в классе BaseExportDataFunctionHelper
|
@@ -27,14 +27,14 @@ edu_rdm_integration/adapters/strings.py,sha256=-k9dex8A7hCpkzUkudVkKRAbNRuuqog2h
|
|
27
27
|
edu_rdm_integration/adapters/tests.py,sha256=MoRY-a75Ow-7EjeQYxkXWunwqTGuBMaUyEkEV2oy05I,59
|
28
28
|
edu_rdm_integration/adapters/validators.py,sha256=LJWnCY8PtXDOj-fm3fBWjQYsHsSLfyKf_D97pqPv73s,496
|
29
29
|
edu_rdm_integration/collect_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
30
|
-
edu_rdm_integration/collect_data/collect.py,sha256=
|
30
|
+
edu_rdm_integration/collect_data/collect.py,sha256=LjMjBwf4nQ5KGkbMun6wx-sF6TZfibRqWGdwDTrUwVY,14068
|
31
31
|
edu_rdm_integration/collect_data/generators.py,sha256=DA5EQ4xvIE-xe-H1RFTku3BfHZtCSVe_UCUx4qWB9D0,8988
|
32
32
|
edu_rdm_integration/collect_data/helpers.py,sha256=pthYW-ugOww5TveWxONYcJby2VwWG6goJwbdTkNdVUU,3009
|
33
|
-
edu_rdm_integration/collect_data/tests.py,sha256=
|
33
|
+
edu_rdm_integration/collect_data/tests.py,sha256=WilmfMllgXCsEhT77fnK9URJEOx66EmdNMcTXo4LgCg,5163
|
34
34
|
edu_rdm_integration/collect_data/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
35
|
edu_rdm_integration/collect_data/base/caches.py,sha256=3BaJxYBk9fi0aiAVzym-Jz8aNP1eSOqh4Y8OVw1HnSg,763
|
36
36
|
edu_rdm_integration/collect_data/base/functions.py,sha256=HT23EyiD-H50p4NLx2_LtioktTHHFVLRmAgWdbuHErw,2379
|
37
|
-
edu_rdm_integration/collect_data/base/managers.py,sha256=
|
37
|
+
edu_rdm_integration/collect_data/base/managers.py,sha256=hvxVQ7EXRol-kXHNVSLppG-9ojlbOf9t2u_p8xO4d7Y,8127
|
38
38
|
edu_rdm_integration/collect_data/base/mixins.py,sha256=Rp3ECccl3vOWZH2QHR_ArAbibQMq92IMGPoP5XAfgVc,3180
|
39
39
|
edu_rdm_integration/collect_data/base/runners.py,sha256=OjhdTmMab6dCoIZp2zmXZTK4H5Haz__QHddwGxjOuB0,2829
|
40
40
|
edu_rdm_integration/collect_data/calculated/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -100,30 +100,30 @@ edu_rdm_integration/function_templates/function_collect_data_template/caches.py-
|
|
100
100
|
edu_rdm_integration/function_templates/function_collect_data_template/consts.py-tpl,sha256=pds1t4eHzovm7Yz2o5je3UHqRE8gqfT2sL-IwpoBN_o,66
|
101
101
|
edu_rdm_integration/function_templates/function_collect_data_template/enums.py-tpl,sha256=BSmwrkzYwEQhz9NbZCJsldY532PqgZJzxzsVk6ue0bM,93
|
102
102
|
edu_rdm_integration/function_templates/function_collect_data_template/errors.py-tpl,sha256=dFPgKvChYiv5iyMdoqOG8szqX7BEp8BTmDog2trqueE,247
|
103
|
-
edu_rdm_integration/function_templates/function_collect_data_template/functions.py-tpl,sha256=
|
104
|
-
edu_rdm_integration/function_templates/function_collect_data_template/helpers.py-tpl,sha256=
|
105
|
-
edu_rdm_integration/function_templates/function_collect_data_template/managers.py-tpl,sha256=
|
103
|
+
edu_rdm_integration/function_templates/function_collect_data_template/functions.py-tpl,sha256=GA0x0J7Y0MjwePQeDUaqvZujfbpzRAKD6fwGavXJPrE,5349
|
104
|
+
edu_rdm_integration/function_templates/function_collect_data_template/helpers.py-tpl,sha256=otsT4yC70ZGGicgjNgdk7poDrmbOrqJyYTUbPPjQei8,1254
|
105
|
+
edu_rdm_integration/function_templates/function_collect_data_template/managers.py-tpl,sha256=iTtad4XjtUvHpk1TYTb75JneDB1o0cbwngYOmmjqAeQ,1731
|
106
106
|
edu_rdm_integration/function_templates/function_collect_data_template/presenters.py-tpl,sha256=2Jv_xfrz1Qxj-NXEIaa08uWrIhb5QVZEr9uRxVXczAA,316
|
107
107
|
edu_rdm_integration/function_templates/function_collect_data_template/results.py-tpl,sha256=2iyHuzzS0YPZ688hAhSnPKnkY5BZNRNiZpLRcrn40CE,589
|
108
|
-
edu_rdm_integration/function_templates/function_collect_data_template/runners.py-tpl,sha256=
|
108
|
+
edu_rdm_integration/function_templates/function_collect_data_template/runners.py-tpl,sha256=_uJpzU_DyJUN2S07cjrw_UnYibeI_fj3SVIdWFgBdNk,2937
|
109
109
|
edu_rdm_integration/function_templates/function_collect_data_template/strings.py-tpl,sha256=-k9dex8A7hCpkzUkudVkKRAbNRuuqog2hYl2xmibl8I,181
|
110
|
-
edu_rdm_integration/function_templates/function_collect_data_template/tests.py-tpl,sha256=
|
111
|
-
edu_rdm_integration/function_templates/function_collect_data_template/validators.py-tpl,sha256=
|
110
|
+
edu_rdm_integration/function_templates/function_collect_data_template/tests.py-tpl,sha256=dga5UYQSZsWUTsWiRoT2VcJ3FLxQmy7MX9KihrEWFBg,838
|
111
|
+
edu_rdm_integration/function_templates/function_collect_data_template/validators.py-tpl,sha256=TIPYLk-rPGE9A1hViZ1Mym8XVJjk1qRlG67YTGZHcIE,587
|
112
112
|
edu_rdm_integration/function_templates/function_export_data_template/__init__.py-tpl,sha256=wnHVZJb9qLDSBrWBNWKNd3vSwHfHl2QHB-WH_iN-OtQ,107
|
113
113
|
edu_rdm_integration/function_templates/function_export_data_template/apps.py-tpl,sha256=PU5vgYdhtqu440mRAtIzZ78eIc-no3CsPS3rr1kPpOU,319
|
114
|
-
edu_rdm_integration/function_templates/function_export_data_template/caches.py-tpl,sha256=
|
114
|
+
edu_rdm_integration/function_templates/function_export_data_template/caches.py-tpl,sha256=g6eJ726bVQUkbd3y7sAcLELeKt4oxM5smcZhcd6j2Kc,1054
|
115
115
|
edu_rdm_integration/function_templates/function_export_data_template/consts.py-tpl,sha256=pds1t4eHzovm7Yz2o5je3UHqRE8gqfT2sL-IwpoBN_o,66
|
116
116
|
edu_rdm_integration/function_templates/function_export_data_template/enums.py-tpl,sha256=BSmwrkzYwEQhz9NbZCJsldY532PqgZJzxzsVk6ue0bM,93
|
117
117
|
edu_rdm_integration/function_templates/function_export_data_template/errors.py-tpl,sha256=dFPgKvChYiv5iyMdoqOG8szqX7BEp8BTmDog2trqueE,247
|
118
|
-
edu_rdm_integration/function_templates/function_export_data_template/functions.py-tpl,sha256=
|
118
|
+
edu_rdm_integration/function_templates/function_export_data_template/functions.py-tpl,sha256=QhhZiZ1cBYIuzzH5Pe7zQjd1QQwJglRA_Gf1iNeK4GY,2882
|
119
119
|
edu_rdm_integration/function_templates/function_export_data_template/helpers.py-tpl,sha256=tySl3pBeaGjORX5qc2y1zvC8YogpcwbNqvGhh1Ow1Ws,1272
|
120
|
-
edu_rdm_integration/function_templates/function_export_data_template/managers.py-tpl,sha256=
|
120
|
+
edu_rdm_integration/function_templates/function_export_data_template/managers.py-tpl,sha256=tK5GLit5n1TTfLdsxClWxpwlRbfUITRJUWsJwrI7Iqs,2669
|
121
121
|
edu_rdm_integration/function_templates/function_export_data_template/presenters.py-tpl,sha256=2Jv_xfrz1Qxj-NXEIaa08uWrIhb5QVZEr9uRxVXczAA,316
|
122
122
|
edu_rdm_integration/function_templates/function_export_data_template/results.py-tpl,sha256=2iyHuzzS0YPZ688hAhSnPKnkY5BZNRNiZpLRcrn40CE,589
|
123
|
-
edu_rdm_integration/function_templates/function_export_data_template/runners.py-tpl,sha256=
|
123
|
+
edu_rdm_integration/function_templates/function_export_data_template/runners.py-tpl,sha256=_5csHUJ79u7NqLAgjbH05tAbOcWH-sHZGYcKliZPmKQ,3653
|
124
124
|
edu_rdm_integration/function_templates/function_export_data_template/strings.py-tpl,sha256=-k9dex8A7hCpkzUkudVkKRAbNRuuqog2hYl2xmibl8I,181
|
125
125
|
edu_rdm_integration/function_templates/function_export_data_template/tests.py-tpl,sha256=MoRY-a75Ow-7EjeQYxkXWunwqTGuBMaUyEkEV2oy05I,59
|
126
|
-
edu_rdm_integration/function_templates/function_export_data_template/validators.py-tpl,sha256=
|
126
|
+
edu_rdm_integration/function_templates/function_export_data_template/validators.py-tpl,sha256=TIPYLk-rPGE9A1hViZ1Mym8XVJjk1qRlG67YTGZHcIE,587
|
127
127
|
edu_rdm_integration/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
128
128
|
edu_rdm_integration/management/general.py,sha256=Yem9IcU9es_xA6Ap8v2IpAjNL1CI5VkkvQffUoJhQhY,13381
|
129
129
|
edu_rdm_integration/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -135,9 +135,9 @@ edu_rdm_integration/migrations/0001_initial.py,sha256=toNuYoHZePe5wJ6AKEW9oPOdt2
|
|
135
135
|
edu_rdm_integration/migrations/0002_init_data_uploadstatus.py,sha256=kht966YNuDbC3qTGrcWswJPsVuAtNO59Ck15G2eS2bU,944
|
136
136
|
edu_rdm_integration/migrations/0003_create_index_file_upload_status.py,sha256=TiLnqQ8bxkVI7sRa5-D3JQ6jopFYDoH1ytSxmU6USUo,735
|
137
137
|
edu_rdm_integration/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
138
|
-
edu_rdm_integration-0.
|
139
|
-
edu_rdm_integration-0.
|
140
|
-
edu_rdm_integration-0.
|
141
|
-
edu_rdm_integration-0.
|
142
|
-
edu_rdm_integration-0.
|
143
|
-
edu_rdm_integration-0.
|
138
|
+
edu_rdm_integration-0.7.0.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
|
139
|
+
edu_rdm_integration-0.7.0.dist-info/METADATA,sha256=MfxAPyf9iF899ul9s_WEb_nyMvKv7qalR_QfiycHs-Y,43101
|
140
|
+
edu_rdm_integration-0.7.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
141
|
+
edu_rdm_integration-0.7.0.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
142
|
+
edu_rdm_integration-0.7.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
|
143
|
+
edu_rdm_integration-0.7.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
{edu_rdm_integration-0.6.10.dist-info → edu_rdm_integration-0.7.0.dist-info}/namespace_packages.txt
RENAMED
File without changes
|
File without changes
|