edu-rdm-integration 3.4.9__py3-none-any.whl → 3.5.1__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 +5 -7
- 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.1.dist-info}/METADATA +184 -58
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.1.dist-info}/RECORD +67 -67
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.1.dist-info}/LICENSE +0 -0
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.1.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.1.dist-info}/namespace_packages.txt +0 -0
- {edu_rdm_integration-3.4.9.dist-info → edu_rdm_integration-3.5.1.dist-info}/top_level.txt +0 -0
@@ -5,9 +5,6 @@ from abc import (
|
|
5
5
|
)
|
6
6
|
from typing import (
|
7
7
|
Any,
|
8
|
-
Dict,
|
9
|
-
List,
|
10
|
-
Tuple,
|
11
8
|
Union,
|
12
9
|
)
|
13
10
|
|
@@ -91,7 +88,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
|
|
91
88
|
"""Возвращает количество подэтапов в очереди."""
|
92
89
|
return self.connection.zcard(self.queue_key)
|
93
90
|
|
94
|
-
def enqueue(self, stage_id, entity_name: str, attachmets:
|
91
|
+
def enqueue(self, stage_id, entity_name: str, attachmets: list[UploadFile]) -> None:
|
95
92
|
"""Помещение в очередь.
|
96
93
|
|
97
94
|
Подэтап попадает в упорядоченную очередь.
|
@@ -103,7 +100,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
|
|
103
100
|
pipe.set(self._make_key(stage_id), json.dumps(attachmets))
|
104
101
|
pipe.execute()
|
105
102
|
|
106
|
-
def dequeue_sub_stage_attachments(self, sub_stage_id: int) ->
|
103
|
+
def dequeue_sub_stage_attachments(self, sub_stage_id: int) -> list[UploadFile]:
|
107
104
|
"""Возвращает файлы подэтапа из кеша."""
|
108
105
|
result = []
|
109
106
|
attachments = self.connection.get(self._make_key(sub_stage_id))
|
@@ -113,7 +110,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
|
|
113
110
|
|
114
111
|
return result
|
115
112
|
|
116
|
-
def dequeue(self) ->
|
113
|
+
def dequeue(self) -> dict[tuple[Any, Any], list[UploadFile]]:
|
117
114
|
"""Возвращает подэтапы из очереди - берется вся очередь без ограничений."""
|
118
115
|
upload_files = {}
|
119
116
|
exported_sub_stages = self.connection.zrange(self.queue_key, 0, -1)
|
@@ -1,5 +1,4 @@
|
|
1
1
|
from typing import (
|
2
|
-
List,
|
3
2
|
Optional,
|
4
3
|
)
|
5
4
|
|
@@ -69,7 +68,7 @@ class ExportDataFunctionImplementationStrategy(
|
|
69
68
|
return 'Стратегия создания функций выгрузки данных'
|
70
69
|
|
71
70
|
@classmethod
|
72
|
-
def _prepare_tags(cls) ->
|
71
|
+
def _prepare_tags(cls) -> list[str]:
|
73
72
|
"""
|
74
73
|
Список тегов, по которым сущность можно будет осуществлять поиск.
|
75
74
|
"""
|
@@ -1,10 +1,7 @@
|
|
1
1
|
from typing import (
|
2
2
|
TYPE_CHECKING,
|
3
3
|
Any,
|
4
|
-
Dict,
|
5
|
-
List,
|
6
4
|
Optional,
|
7
|
-
Type,
|
8
5
|
)
|
9
6
|
|
10
7
|
from educommon.integration_entities.enums import (
|
@@ -45,6 +42,8 @@ if TYPE_CHECKING:
|
|
45
42
|
class {{ camel_case_function_name }}Function({{ strategy.function_class_name }}):
|
46
43
|
"""Функция "{{ function_verbose_name }}"."""
|
47
44
|
|
45
|
+
helper: '{{ camel_case_function_name }}FunctionHelper'
|
46
|
+
|
48
47
|
def __init__(
|
49
48
|
self,
|
50
49
|
*args,
|
@@ -77,7 +76,7 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
77
76
|
return 'Функция "{{ function_verbose_name }}"'
|
78
77
|
|
79
78
|
@classmethod
|
80
|
-
def _prepare_tags(cls) ->
|
79
|
+
def _prepare_tags(cls) -> list[str]:
|
81
80
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
82
81
|
tags = [
|
83
82
|
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
@@ -86,7 +85,7 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
86
85
|
return tags
|
87
86
|
|
88
87
|
@classmethod
|
89
|
-
def _prepare_entities(cls) ->
|
88
|
+
def _prepare_entities(cls) -> list['ModelEnumValue']:
|
90
89
|
"""Формирование списка ключей модели-перечисления моделей РВД."""
|
91
90
|
rdm_models = [
|
92
91
|
RegionalDataMartModelEnum.,
|
@@ -94,15 +93,15 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
94
93
|
|
95
94
|
return rdm_models
|
96
95
|
|
97
|
-
def _prepare_helper_class(self) ->
|
96
|
+
def _prepare_helper_class(self) -> type[{{ camel_case_function_name }}FunctionHelper]:
|
98
97
|
"""Возвращает класс помощника функции."""
|
99
98
|
return {{ camel_case_function_name }}FunctionHelper
|
100
99
|
|
101
|
-
def _prepare_validator_class(self) ->
|
100
|
+
def _prepare_validator_class(self) -> type[{{ camel_case_function_name }}FunctionValidator]:
|
102
101
|
"""Возвращает класс валидатора функции."""
|
103
102
|
return {{ camel_case_function_name }}FunctionValidator
|
104
103
|
|
105
|
-
def _prepare_result_class(self) ->
|
104
|
+
def _prepare_result_class(self) -> type[{{ camel_case_function_name }}FunctionResult]:
|
106
105
|
"""Возвращает класс результата функции."""
|
107
106
|
return {{ camel_case_function_name }}FunctionResult
|
108
107
|
|
@@ -110,7 +109,7 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
110
109
|
"""Подготовка объектов модели РВД для создания."""
|
111
110
|
raise NotImplementedError
|
112
111
|
|
113
|
-
def _prepare_model_instances_for_update(self, class_id: int, log_changes:
|
112
|
+
def _prepare_model_instances_for_update(self, class_id: int, log_changes: dict[str, Any], **kwargs) -> None:
|
114
113
|
"""Подготовка объектов модели РВД для обновления."""
|
115
114
|
raise NotImplementedError
|
116
115
|
|
@@ -1,7 +1,3 @@
|
|
1
|
-
from typing import (
|
2
|
-
Type,
|
3
|
-
)
|
4
|
-
|
5
1
|
from {{ strategy.function_helper_class_module }} import (
|
6
2
|
{{ strategy.function_helper_class_name }},
|
7
3
|
)
|
@@ -18,7 +14,7 @@ from {{ function_python_path }}.caches import (
|
|
18
14
|
class {{ camel_case_function_name }}RunnerHelper({{ strategy.runner_helper_class_name }}):
|
19
15
|
"""Помощник ранера функции "{{ function_verbose_name }}"."""
|
20
16
|
|
21
|
-
def _prepare_cache_class(self) ->
|
17
|
+
def _prepare_cache_class(self) -> type[{{ camel_case_function_name }}RunnerCacheStorage]:
|
22
18
|
"""Возвращает класс кеша помощника ранера."""
|
23
19
|
return {{ camel_case_function_name }}RunnerCacheStorage
|
24
20
|
|
@@ -26,6 +22,8 @@ class {{ camel_case_function_name }}RunnerHelper({{ strategy.runner_helper_class
|
|
26
22
|
class {{ camel_case_function_name }}FunctionHelper({{ strategy.function_helper_class_name }}):
|
27
23
|
"""Помощник функции "{{ function_verbose_name }}"."""
|
28
24
|
|
29
|
-
|
25
|
+
cache: '{{ camel_case_function_name }}FunctionCacheStorage'
|
26
|
+
|
27
|
+
def _prepare_cache_class(self) -> type[{{ camel_case_function_name }}FunctionCacheStorage]:
|
30
28
|
"""Возвращает класс кеша помощника функции."""
|
31
29
|
return {{ camel_case_function_name }}FunctionCacheStorage
|
@@ -1,7 +1,5 @@
|
|
1
1
|
from typing import (
|
2
|
-
List,
|
3
2
|
Optional,
|
4
|
-
Type,
|
5
3
|
)
|
6
4
|
|
7
5
|
from edu_rdm_integration.consts import (
|
@@ -34,7 +32,7 @@ class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name
|
|
34
32
|
return 'Менеджер Функции "{{ function_verbose_name }}"'
|
35
33
|
|
36
34
|
@classmethod
|
37
|
-
def _prepare_tags(cls) ->
|
35
|
+
def _prepare_tags(cls) -> list[str]:
|
38
36
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
39
37
|
tags = [
|
40
38
|
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
@@ -43,6 +41,6 @@ class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name
|
|
43
41
|
return tags
|
44
42
|
|
45
43
|
@classmethod
|
46
|
-
def _prepare_runner_class(cls) ->
|
44
|
+
def _prepare_runner_class(cls) -> type[{{ camel_case_function_name }}Runner]:
|
47
45
|
"""Возвращает класс ранера."""
|
48
46
|
return {{ camel_case_function_name }}Runner
|
@@ -1,7 +1,5 @@
|
|
1
1
|
from typing import (
|
2
|
-
List,
|
3
2
|
Optional,
|
4
|
-
Type,
|
5
3
|
)
|
6
4
|
|
7
5
|
from function_tools.general import (
|
@@ -47,7 +45,7 @@ class {{ camel_case_function_name }}Runner({{ strategy.runner_class_name }}):
|
|
47
45
|
return 'Ранер функции "{{ function_verbose_name }}"'
|
48
46
|
|
49
47
|
@classmethod
|
50
|
-
def _prepare_tags(cls) ->
|
48
|
+
def _prepare_tags(cls) -> list[str]:
|
51
49
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
52
50
|
tags = [
|
53
51
|
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
@@ -56,18 +54,18 @@ class {{ camel_case_function_name }}Runner({{ strategy.runner_class_name }}):
|
|
56
54
|
return tags
|
57
55
|
|
58
56
|
@classmethod
|
59
|
-
def _prepare_runnable_classes(cls) -> Optional[
|
57
|
+
def _prepare_runnable_classes(cls) -> Optional[list[type[RunnableObject]]]:
|
60
58
|
"""Возвращает список классов запускаемых объектов, которые будут ставиться в очередь на исполнение."""
|
61
59
|
return [{{ camel_case_function_name }}Function]
|
62
60
|
|
63
|
-
def _prepare_helper_class(self) ->
|
61
|
+
def _prepare_helper_class(self) -> type[{{ camel_case_function_name }}RunnerHelper]:
|
64
62
|
"""Возвращает класс помощника ранера функции."""
|
65
63
|
return {{ camel_case_function_name }}RunnerHelper
|
66
64
|
|
67
|
-
def _prepare_validator_class(self) ->
|
65
|
+
def _prepare_validator_class(self) -> type[{{ camel_case_function_name }}RunnerValidator]:
|
68
66
|
"""Возвращает класс валидатора ранера функции."""
|
69
67
|
return {{ camel_case_function_name }}RunnerValidator
|
70
68
|
|
71
|
-
def _prepare_result_class(self) ->
|
69
|
+
def _prepare_result_class(self) -> type[{{ camel_case_function_name }}RunnerResult]:
|
72
70
|
"""Возвращает класс результата ранера функции."""
|
73
71
|
return {{ camel_case_function_name }}RunnerResult
|
@@ -1,6 +1,5 @@
|
|
1
1
|
from typing import (
|
2
2
|
TYPE_CHECKING,
|
3
|
-
Type,
|
4
3
|
)
|
5
4
|
|
6
5
|
from edu_rdm_integration.collect_data.tests import (
|
@@ -22,10 +21,6 @@ class Base{{ camel_case_function_name }}TestCase(BaseCollectingFunctionTestCase)
|
|
22
21
|
"""Базовый класс тестирования Функции "{{ function_verbose_name }}"."""
|
23
22
|
|
24
23
|
@property
|
25
|
-
def manager(self) ->
|
24
|
+
def manager(self) -> type['RunnerManager']:
|
26
25
|
"""Менеджер раннера Функции сбора."""
|
27
26
|
return {{ camel_case_function_name }}RunnerManager
|
28
|
-
|
29
|
-
def setUp(self) -> None:
|
30
|
-
"""Подготавливает фикстуры."""
|
31
|
-
super().setUp()
|
@@ -1,6 +1,5 @@
|
|
1
1
|
from typing import (
|
2
2
|
TYPE_CHECKING,
|
3
|
-
List,
|
4
3
|
)
|
5
4
|
|
6
5
|
from {{ strategy.function_cache_storage_class_module }} import (
|
@@ -24,7 +23,7 @@ class {{ camel_case_function_name }}RunnerCacheStorage({{ strategy.runner_cache_
|
|
24
23
|
class {{ camel_case_function_name }}FunctionCacheStorage({{ strategy.function_cache_storage_class_name }}):
|
25
24
|
"""Кеш помощника функции "{{ function_verbose_name }}"."""
|
26
25
|
|
27
|
-
def _prepare_entity_instances(self, model_ids, *args, **kwargs) ->
|
26
|
+
def _prepare_entity_instances(self, model_ids, *args, **kwargs) -> list['BaseEntity']:
|
28
27
|
"""Подготовка данных для экспорта в виде экземпляров сущности."""
|
29
28
|
instances = []
|
30
29
|
|
@@ -1,8 +1,6 @@
|
|
1
1
|
from typing import (
|
2
2
|
TYPE_CHECKING,
|
3
|
-
List,
|
4
3
|
Optional,
|
5
|
-
Type,
|
6
4
|
)
|
7
5
|
|
8
6
|
from edu_rdm_integration.consts import (
|
@@ -50,7 +48,7 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
50
48
|
return 'Функция "{{ function_verbose_name }}"'
|
51
49
|
|
52
50
|
@classmethod
|
53
|
-
def _prepare_entities(cls) ->
|
51
|
+
def _prepare_entities(cls) -> list['ModelEnumValue']:
|
54
52
|
"""Формирование списка ключей модели-перечисления сущностей."""
|
55
53
|
entities = [
|
56
54
|
RegionalDataMartEntityEnum.,
|
@@ -59,7 +57,7 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
59
57
|
return entities
|
60
58
|
|
61
59
|
@classmethod
|
62
|
-
def _prepare_tags(cls) ->
|
60
|
+
def _prepare_tags(cls) -> list[str]:
|
63
61
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
64
62
|
tags = [
|
65
63
|
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
@@ -67,14 +65,14 @@ class {{ camel_case_function_name }}Function({{ strategy.function_class_name }})
|
|
67
65
|
|
68
66
|
return tags
|
69
67
|
|
70
|
-
def _prepare_helper_class(self) ->
|
68
|
+
def _prepare_helper_class(self) -> type[{{ camel_case_function_name }}FunctionHelper]:
|
71
69
|
"""Возвращает класс помощника функции."""
|
72
70
|
return {{ camel_case_function_name }}FunctionHelper
|
73
71
|
|
74
|
-
def _prepare_validator_class(self) ->
|
72
|
+
def _prepare_validator_class(self) -> type[{{ camel_case_function_name }}FunctionValidator]:
|
75
73
|
"""Возвращает класс валидатора функции."""
|
76
74
|
return {{ camel_case_function_name }}FunctionValidator
|
77
75
|
|
78
|
-
def _prepare_result_class(self) ->
|
76
|
+
def _prepare_result_class(self) -> type[{{ camel_case_function_name }}FunctionResult]:
|
79
77
|
"""Возвращает класс результата функции."""
|
80
78
|
return {{ camel_case_function_name }}FunctionResult
|
@@ -1,7 +1,3 @@
|
|
1
|
-
from typing import (
|
2
|
-
Type,
|
3
|
-
)
|
4
|
-
|
5
1
|
from {{ strategy.function_helper_class_module }} import (
|
6
2
|
{{ strategy.function_helper_class_name }},
|
7
3
|
)
|
@@ -18,7 +14,7 @@ from {{ function_python_path }}.caches import (
|
|
18
14
|
class {{ camel_case_function_name }}RunnerHelper({{ strategy.runner_helper_class_name }}):
|
19
15
|
"""Помощник ранера функции "{{ function_verbose_name }}"."""
|
20
16
|
|
21
|
-
def _prepare_cache_class(self) ->
|
17
|
+
def _prepare_cache_class(self) -> type[{{ camel_case_function_name }}RunnerCacheStorage]:
|
22
18
|
"""Возвращает класс кеша помощника ранера."""
|
23
19
|
return {{ camel_case_function_name }}RunnerCacheStorage
|
24
20
|
|
@@ -26,7 +22,7 @@ class {{ camel_case_function_name }}RunnerHelper({{ strategy.runner_helper_class
|
|
26
22
|
class {{ camel_case_function_name }}FunctionHelper({{ strategy.function_helper_class_name }}):
|
27
23
|
"""Помощник функции "{{ function_verbose_name }}"."""
|
28
24
|
|
29
|
-
def _prepare_cache_class(self) ->
|
25
|
+
def _prepare_cache_class(self) -> type[{{ camel_case_function_name }}FunctionCacheStorage]:
|
30
26
|
"""
|
31
27
|
Возвращает класс кеша помощника функции.
|
32
28
|
"""
|
@@ -1,10 +1,7 @@
|
|
1
1
|
from typing import (
|
2
2
|
TYPE_CHECKING,
|
3
|
-
Dict,
|
4
3
|
Iterator,
|
5
|
-
List,
|
6
4
|
Optional,
|
7
|
-
Type,
|
8
5
|
)
|
9
6
|
|
10
7
|
from edu_rdm_integration.consts import (
|
@@ -46,7 +43,7 @@ class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name
|
|
46
43
|
return 'Менеджер Функции "{{ function_verbose_name }}"'
|
47
44
|
|
48
45
|
@classmethod
|
49
|
-
def _prepare_tags(cls) ->
|
46
|
+
def _prepare_tags(cls) -> list[str]:
|
50
47
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
51
48
|
tags = [
|
52
49
|
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
@@ -55,11 +52,11 @@ class {{ camel_case_function_name }}RunnerManager({{ strategy.manager_class_name
|
|
55
52
|
return tags
|
56
53
|
|
57
54
|
@classmethod
|
58
|
-
def _prepare_runner_class(cls) ->
|
55
|
+
def _prepare_runner_class(cls) -> type[{{ camel_case_function_name }}Runner]:
|
59
56
|
"""Возвращает класс ранера."""
|
60
57
|
return {{ camel_case_function_name }}Runner
|
61
58
|
|
62
|
-
def _prepare_model_ids_map(self) ->
|
59
|
+
def _prepare_model_ids_map(self) -> dict['ModelEnumValue', Iterator[int]]:
|
63
60
|
"""Осуществляется поиск записей моделей добавленных или обновленных за указанный период времени.
|
64
61
|
|
65
62
|
В выборках (QuerySet) необходимо использовать iterator().
|
@@ -1,7 +1,5 @@
|
|
1
1
|
from typing import (
|
2
|
-
List,
|
3
2
|
Optional,
|
4
|
-
Type,
|
5
3
|
)
|
6
4
|
|
7
5
|
from django.conf import (
|
@@ -57,7 +55,7 @@ class {{ camel_case_function_name }}Runner({{ strategy.runner_class_name }}):
|
|
57
55
|
return 'Ранер функции "{{ function_verbose_name }}"'
|
58
56
|
|
59
57
|
@classmethod
|
60
|
-
def _prepare_tags(cls) ->
|
58
|
+
def _prepare_tags(cls) -> list[str]:
|
61
59
|
"""Список тегов, по которым сущность можно будет осуществлять поиск."""
|
62
60
|
tags = [
|
63
61
|
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
@@ -66,19 +64,19 @@ class {{ camel_case_function_name }}Runner({{ strategy.runner_class_name }}):
|
|
66
64
|
return tags
|
67
65
|
|
68
66
|
@classmethod
|
69
|
-
def _prepare_runnable_classes(cls) -> Optional[
|
67
|
+
def _prepare_runnable_classes(cls) -> Optional[list[type[RunnableObject]]]:
|
70
68
|
"""Возвращает список классов запускаемых объектов, которые будут ставиться в очередь на исполнение."""
|
71
69
|
return [{{ camel_case_function_name }}Function]
|
72
70
|
|
73
|
-
def _prepare_helper_class(self) ->
|
71
|
+
def _prepare_helper_class(self) -> type[{{ camel_case_function_name }}RunnerHelper]:
|
74
72
|
"""Возвращает класс помощника ранера функции."""
|
75
73
|
return {{ camel_case_function_name }}RunnerHelper
|
76
74
|
|
77
|
-
def _prepare_validator_class(self) ->
|
75
|
+
def _prepare_validator_class(self) -> type[{{ camel_case_function_name }}RunnerValidator]:
|
78
76
|
"""Возвращает класс валидатора ранера функции."""
|
79
77
|
return {{ camel_case_function_name }}RunnerValidator
|
80
78
|
|
81
|
-
def _prepare_result_class(self) ->
|
79
|
+
def _prepare_result_class(self) -> type[{{ camel_case_function_name }}RunnerResult]:
|
82
80
|
"""Возвращает класс результата ранера функции."""
|
83
81
|
return {{ camel_case_function_name }}RunnerResult
|
84
82
|
|
edu_rdm_integration/helpers.py
CHANGED
@@ -9,11 +9,8 @@ from json import (
|
|
9
9
|
from typing import (
|
10
10
|
TYPE_CHECKING,
|
11
11
|
Any,
|
12
|
-
Dict,
|
13
12
|
Iterable,
|
14
|
-
List,
|
15
13
|
Optional,
|
16
|
-
Tuple,
|
17
14
|
Union,
|
18
15
|
)
|
19
16
|
|
@@ -102,7 +99,7 @@ class UploadStatusHelper:
|
|
102
99
|
self._process_upload(upload)
|
103
100
|
|
104
101
|
@classmethod
|
105
|
-
def send_upload_status_request(cls, request_id: str) ->
|
102
|
+
def send_upload_status_request(cls, request_id: str) -> tuple[Optional[dict[str, Any]], 'Entry']:
|
106
103
|
"""Формирует и отправляет запрос для получения статуса загрузки данных в витрину."""
|
107
104
|
request = RegionalDataMartStatusRequest(
|
108
105
|
request_id=request_id,
|
@@ -141,7 +138,7 @@ class UploadStatusHelper:
|
|
141
138
|
def update_upload_status(
|
142
139
|
cls,
|
143
140
|
upload: ExportingDataSubStageUploaderClientLog,
|
144
|
-
response: Optional[
|
141
|
+
response: Optional[dict[str, Any]],
|
145
142
|
log_entry: 'Entry',
|
146
143
|
) -> None:
|
147
144
|
"""Обновляет статус загрузки данных в витрину."""
|
@@ -201,7 +198,7 @@ class Graph:
|
|
201
198
|
"""
|
202
199
|
|
203
200
|
def __init__(self):
|
204
|
-
self.vertices:
|
201
|
+
self.vertices: dict[str, dict[str, Optional[str]]] = {}
|
205
202
|
"""Словарь для хранения данных графа."""
|
206
203
|
|
207
204
|
def add_vertex(self, vertex: str):
|
@@ -232,11 +229,11 @@ class Graph:
|
|
232
229
|
self.vertices[vertex1].pop(vertex2, None)
|
233
230
|
self.vertices[vertex2].pop(vertex1, None)
|
234
231
|
|
235
|
-
def get_vertices(self) ->
|
232
|
+
def get_vertices(self) -> list[str]:
|
236
233
|
"""Получение списка всех вершин."""
|
237
234
|
return list(self.vertices)
|
238
235
|
|
239
|
-
def get_edges(self) ->
|
236
|
+
def get_edges(self) -> list[tuple[str, str, Optional[str]]]:
|
240
237
|
"""Получение всех связей."""
|
241
238
|
edges = []
|
242
239
|
|
@@ -258,7 +255,7 @@ class Graph:
|
|
258
255
|
|
259
256
|
def get_edges_between_vertices(
|
260
257
|
self, from_vertex: str, to_vertex: str, required_edge_name: bool = True
|
261
|
-
) ->
|
258
|
+
) -> list[str]:
|
262
259
|
"""Получение списка наименований ребер между вершинами."""
|
263
260
|
if from_vertex not in self.vertices and to_vertex not in self.vertices:
|
264
261
|
return []
|
@@ -326,7 +323,7 @@ def save_command_log_link(
|
|
326
323
|
|
327
324
|
def get_collecting_managers_max_period_ended_dates(
|
328
325
|
collecting_managers: Iterable['BaseCollectingExportedDataRunnerManager'],
|
329
|
-
) ->
|
326
|
+
) -> dict[str, 'datetime']:
|
330
327
|
"""Возвращает дату и время завершения последнего успешного этапа сбора для менеджеров Функций сбора."""
|
331
328
|
managers_last_period_ended = CollectingExportedDataStage.objects.filter(
|
332
329
|
manager_id__in=[manager.uuid for manager in collecting_managers],
|
@@ -351,7 +348,7 @@ def get_collecting_managers_max_period_ended_dates(
|
|
351
348
|
|
352
349
|
def get_exporting_managers_max_period_ended_dates(
|
353
350
|
exporting_managers: Iterable['BaseExportDataRunnerManager'],
|
354
|
-
) ->
|
351
|
+
) -> dict[str, 'datetime']:
|
355
352
|
"""Возвращает дату и время последнего успешного этапа экспорта для менеджеров Функций экспорта."""
|
356
353
|
managers_last_period_ended = ExportingDataStage.objects.filter(
|
357
354
|
manager_id__in=[manager.uuid for manager in exporting_managers],
|
@@ -22,10 +22,6 @@ from datetime import (
|
|
22
22
|
datetime,
|
23
23
|
timedelta,
|
24
24
|
)
|
25
|
-
from typing import (
|
26
|
-
List,
|
27
|
-
Tuple,
|
28
|
-
)
|
29
25
|
|
30
26
|
import asyncpg
|
31
27
|
from django.conf import (
|
@@ -117,7 +113,7 @@ class Command(BaseCommand):
|
|
117
113
|
date_begin: date,
|
118
114
|
date_end: date,
|
119
115
|
count_store_size: bool
|
120
|
-
) ->
|
116
|
+
) -> list[tuple[int, int]]:
|
121
117
|
"""Формирование id файлов, которым надо обновить размер."""
|
122
118
|
logger.info('Определение файлов, которым надо обновить размер.')
|
123
119
|
attachment_query = ExportingDataSubStageAttachment.objects.filter(
|
@@ -149,7 +145,7 @@ class Command(BaseCommand):
|
|
149
145
|
async def execute_update_sql(
|
150
146
|
self,
|
151
147
|
pool: asyncpg.Pool,
|
152
|
-
data:
|
148
|
+
data: list[tuple[int, int]]
|
153
149
|
) -> None:
|
154
150
|
"""Метод для исполнения сгенерированного UPDATE sql запроса."""
|
155
151
|
self.result['initial_count_rows_to_fix'] += len(data)
|
@@ -169,7 +165,7 @@ class Command(BaseCommand):
|
|
169
165
|
|
170
166
|
async def fix_attachment_size(
|
171
167
|
self,
|
172
|
-
fix_queries:
|
168
|
+
fix_queries: list,
|
173
169
|
pool_size: int = None,
|
174
170
|
workers_count: int = None
|
175
171
|
) -> None:
|
@@ -17,8 +17,6 @@ from datetime import (
|
|
17
17
|
from typing import (
|
18
18
|
TYPE_CHECKING,
|
19
19
|
Any,
|
20
|
-
Dict,
|
21
|
-
Tuple,
|
22
20
|
)
|
23
21
|
|
24
22
|
from django.core.management.base import (
|
@@ -31,7 +29,9 @@ from edu_rdm_integration.consts import (
|
|
31
29
|
from edu_rdm_integration.enums import (
|
32
30
|
FileUploadStatusEnum,
|
33
31
|
)
|
34
|
-
from edu_rdm_integration.helpers import
|
32
|
+
from edu_rdm_integration.helpers import (
|
33
|
+
UploadStatusHelper,
|
34
|
+
)
|
35
35
|
from edu_rdm_integration.models import (
|
36
36
|
ExportingDataSubStageUploaderClientLog,
|
37
37
|
)
|
@@ -81,7 +81,7 @@ class Command(BaseCommand):
|
|
81
81
|
help='Количество потоков для обработки. По умолчанию, 1.',
|
82
82
|
)
|
83
83
|
|
84
|
-
def handle(self, *args:
|
84
|
+
def handle(self, *args: tuple[Any], **kwargs: dict[str, Any]) -> None:
|
85
85
|
"""Обработчик команды."""
|
86
86
|
thread_count = kwargs['thread_count']
|
87
87
|
if thread_count < 1:
|
edu_rdm_integration/mapping.py
CHANGED
@@ -1,18 +1,13 @@
|
|
1
|
-
from typing import (
|
2
|
-
Dict,
|
3
|
-
Tuple,
|
4
|
-
)
|
5
|
-
|
6
1
|
from educommon.integration_entities.enums import (
|
7
2
|
EntityLogOperation,
|
8
3
|
)
|
9
4
|
|
10
5
|
|
11
6
|
# Перечень отслеживаемых моделей и перечней полей по операциям лога. Расширяется в продуктах
|
12
|
-
MODEL_FIELDS_LOG_FILTER:
|
7
|
+
MODEL_FIELDS_LOG_FILTER: dict[EntityLogOperation, dict[str, tuple]] = {
|
13
8
|
EntityLogOperation.CREATE: {},
|
14
9
|
EntityLogOperation.UPDATE: {},
|
15
|
-
EntityLogOperation.DELETE: {}
|
10
|
+
EntityLogOperation.DELETE: {},
|
16
11
|
}
|
17
12
|
|
18
13
|
# Маппинг операций логов моделей и сущностей по умолчанию
|
@@ -4,13 +4,14 @@ from django.db import (
|
|
4
4
|
migrations,
|
5
5
|
)
|
6
6
|
|
7
|
-
from edu_rdm_integration.enums import (
|
8
|
-
FileUploadStatusEnum,
|
9
|
-
)
|
10
7
|
from educommon.utils.seqtools import (
|
11
8
|
make_chunks,
|
12
9
|
)
|
13
10
|
|
11
|
+
from edu_rdm_integration.enums import (
|
12
|
+
FileUploadStatusEnum,
|
13
|
+
)
|
14
|
+
|
14
15
|
|
15
16
|
# Значение размера файла по умолчанию (если файл не найден)
|
16
17
|
ATTACHMENT_SIZES = 10_485_760
|
edu_rdm_integration/models.py
CHANGED
@@ -6,9 +6,7 @@ from io import (
|
|
6
6
|
StringIO,
|
7
7
|
)
|
8
8
|
from typing import (
|
9
|
-
List,
|
10
9
|
Optional,
|
11
|
-
Tuple,
|
12
10
|
)
|
13
11
|
|
14
12
|
from django.contrib.postgres.fields import (
|
@@ -737,9 +735,9 @@ class RegionalDataMartEntityEnum(TitledModelEnum):
|
|
737
735
|
@classmethod
|
738
736
|
def get_entities_model_enums(
|
739
737
|
cls,
|
740
|
-
entity_enums:
|
738
|
+
entity_enums: list[ModelEnumValue],
|
741
739
|
is_sorted: bool = True,
|
742
|
-
) ->
|
740
|
+
) -> list[ModelEnumValue]:
|
743
741
|
"""Получение списка значений модели-перечисления моделей RegionalDataMartModelEnum.
|
744
742
|
|
745
743
|
Args:
|
@@ -872,7 +870,7 @@ class UploaderClientLog(Entry):
|
|
872
870
|
base_objects = Manager()
|
873
871
|
|
874
872
|
@cached_property
|
875
|
-
def http_method_and_url(self) ->
|
873
|
+
def http_method_and_url(self) -> tuple[str, str]:
|
876
874
|
"""Возвращает http-метод и url из поля запроса Entry.request."""
|
877
875
|
request = StringIO(self.request)
|
878
876
|
request_first_line = request.readline()
|
@@ -3,7 +3,6 @@ from abc import (
|
|
3
3
|
abstractmethod,
|
4
4
|
)
|
5
5
|
from typing import (
|
6
|
-
Tuple,
|
7
6
|
Union,
|
8
7
|
)
|
9
8
|
|
@@ -13,7 +12,7 @@ from redis import (
|
|
13
12
|
)
|
14
13
|
|
15
14
|
|
16
|
-
def get_redis_version(connection: 'Redis') ->
|
15
|
+
def get_redis_version(connection: 'Redis') -> tuple[int, int, int]:
|
17
16
|
"""Возвращает кортеж с версией сервера Redis."""
|
18
17
|
try:
|
19
18
|
version = getattr(connection, '__redis_server_version', None)
|
@@ -1,13 +1,15 @@
|
|
1
|
-
from objectpack.ui import (
|
2
|
-
BaseListWindow,
|
3
|
-
)
|
4
1
|
from m3_ext.ui.all_components import (
|
5
2
|
ExtButton,
|
6
3
|
)
|
4
|
+
from objectpack.ui import (
|
5
|
+
BaseListWindow,
|
6
|
+
)
|
7
|
+
|
7
8
|
from educommon.utils.ui import (
|
8
9
|
append_template_globals,
|
9
10
|
)
|
10
11
|
|
12
|
+
|
11
13
|
class TransferredEntityListWindow(BaseListWindow):
|
12
14
|
"""Окно реестра сущностей для сбора и экспорта данных."""
|
13
15
|
|