edu-rdm-integration 0.6.9__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.
Files changed (22) hide show
  1. edu_rdm_integration/collect_data/base/managers.py +68 -9
  2. edu_rdm_integration/collect_data/collect.py +1 -1
  3. edu_rdm_integration/collect_data/tests.py +1 -1
  4. edu_rdm_integration/export_data/base/functions.py +2 -0
  5. edu_rdm_integration/export_data/base/helpers.py +4 -2
  6. edu_rdm_integration/function_templates/function_collect_data_template/functions.py-tpl +44 -21
  7. edu_rdm_integration/function_templates/function_collect_data_template/helpers.py-tpl +1 -3
  8. edu_rdm_integration/function_templates/function_collect_data_template/managers.py-tpl +9 -2
  9. edu_rdm_integration/function_templates/function_collect_data_template/runners.py-tpl +10 -2
  10. edu_rdm_integration/function_templates/function_collect_data_template/tests.py-tpl +31 -1
  11. edu_rdm_integration/function_templates/function_collect_data_template/validators.py-tpl +0 -8
  12. edu_rdm_integration/function_templates/function_export_data_template/caches.py-tpl +13 -11
  13. edu_rdm_integration/function_templates/function_export_data_template/functions.py-tpl +29 -19
  14. edu_rdm_integration/function_templates/function_export_data_template/managers.py-tpl +25 -5
  15. edu_rdm_integration/function_templates/function_export_data_template/runners.py-tpl +22 -4
  16. edu_rdm_integration/function_templates/function_export_data_template/validators.py-tpl +0 -8
  17. {edu_rdm_integration-0.6.9.dist-info → edu_rdm_integration-0.7.0.dist-info}/METADATA +38 -2
  18. {edu_rdm_integration-0.6.9.dist-info → edu_rdm_integration-0.7.0.dist-info}/RECORD +22 -22
  19. {edu_rdm_integration-0.6.9.dist-info → edu_rdm_integration-0.7.0.dist-info}/LICENSE +0 -0
  20. {edu_rdm_integration-0.6.9.dist-info → edu_rdm_integration-0.7.0.dist-info}/WHEEL +0 -0
  21. {edu_rdm_integration-0.6.9.dist-info → edu_rdm_integration-0.7.0.dist-info}/namespace_packages.txt +0 -0
  22. {edu_rdm_integration-0.6.9.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) -> List['Model']:
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.extend(entity.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: Tuple[str, str]) -> CollectingExportedDataSubStage:
130
+ def create_sub_stage(self, *class_names: str) -> CollectingExportedDataSubStage:
131
131
  """Создает подэтап сбора данных."""
132
132
  function_tools_entities = dict(
133
133
  Entity.objects.filter(
@@ -156,6 +156,7 @@ class BaseExportDataFunction(
156
156
  primary_key_fields = self.first_entity.entity.get_primary_key_fields()
157
157
  foreign_key_fields = self.first_entity.entity.get_foreign_key_fields()
158
158
  hashable_fields = self.first_entity.entity.get_hashable_fields()
159
+ ignore_prefix_fields = self.first_entity.entity.get_ignore_prefix_key_fields()
159
160
 
160
161
  field_values = self.helper.prepare_record(
161
162
  entity_instance=entity_instance,
@@ -163,6 +164,7 @@ class BaseExportDataFunction(
163
164
  primary_key_fields=primary_key_fields,
164
165
  foreign_key_fields=foreign_key_fields,
165
166
  hashable_fields=hashable_fields,
167
+ ignore_prefix_fields=ignore_prefix_fields,
166
168
  )
167
169
 
168
170
  return field_values
@@ -62,13 +62,15 @@ class BaseExportDataFunctionHelper(WebEduFunctionHelper):
62
62
  ordered_fields,
63
63
  primary_key_fields,
64
64
  foreign_key_fields,
65
- hashable_fields
65
+ hashable_fields,
66
+ ignore_prefix_fields,
66
67
  ) -> List[str]:
67
68
  """
68
69
  Формирование списка строковых значений полей.
69
70
  """
70
71
  field_values = []
71
72
  key_fields = set(chain(primary_key_fields, foreign_key_fields))
73
+ add_prefix_fields = key_fields - set(ignore_prefix_fields)
72
74
 
73
75
  for field in ordered_fields:
74
76
  field_value = getattr(entity_instance, field)
@@ -84,7 +86,7 @@ class BaseExportDataFunctionHelper(WebEduFunctionHelper):
84
86
  else:
85
87
  field_value = str(field_value if field_value is not None else '')
86
88
 
87
- if field_value and field in key_fields:
89
+ if field_value and field in add_prefix_fields:
88
90
  field_value = f'{settings.RDM_EXPORT_ENTITY_ID_PREFIX}-{field_value}'
89
91
 
90
92
  if field_value and field in hashable_fields:
@@ -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._prepare_entity_for_create,
52
- EntityLogOperation.UPDATE: self._prepare_entity_for_update,
53
- EntityLogOperation.DELETE: self._prepare_entity_for_delete,
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 _prepare_entity_for_create(self, class_id: int, **kwargs) -> None:
88
- """Подготовка объектов модели для создания."""
109
+ def _prepare_model_instances_for_create(self, class_id: int, **kwargs) -> None:
110
+ """Подготовка объектов модели РВД для создания."""
89
111
  raise NotImplementedError
90
112
 
91
- def _prepare_entity_for_update(self, class_id: int, log_changes: Dict[str, any], **kwargs) -> None:
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 _prepare_entity_for_delete(self, class_id: int, **kwargs) -> None:
96
- """Подготовка объектов модели для удаления."""
117
+ def _prepare_model_instances_for_delete(self, class_id: int, **kwargs) -> None:
118
+ """Подготовка объектов модели РВД для удаления."""
97
119
  raise NotImplementedError
98
120
 
99
- def _prepare_entity_instances(self):
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
- save_entities = EntitySaver(
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._prepare_entity_instances()
140
+ self._prepare_model_instances()
118
141
 
119
142
  if self.result.has_not_errors:
120
- self.do_on_save(save_entities)
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
- return []
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
- # Реализуйте свои unit-тесты здесь
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
- class {{ camel_case_function_name }}RunnerCacheStorage({{ strategy.runner_cache_storage_class_name }}):
10
- """Кеш помощника ранера функции "{{ function_verbose_name }}"."""
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
- super().__init__(*args, **kwargs)
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
- class {{ camel_case_function_name }}Function({{ strategy.function_class_name }}):
23
- """Функция "{{ function_verbose_name }}"."""
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
- # self.result.key =
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
- return []
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
- return []
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.<some model>: (
49
- RegionalDataMartModelEnum.<some model>.model.objects.filter(
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
- return []
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.<some model>],
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.6.9
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.5.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,42 @@ 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
+
317
+ ## [0.6.10] - 2023-11-30
318
+
319
+ При добавлении префикса RDM_EXPORT_ENTITY_ID_PREFIX в классе BaseExportDataFunctionHelper
320
+ учтены поля из get_ignore_prefix_key_fields.
321
+
322
+ ### Изменено
323
+
324
+ - [EDUSCHL-20961](https://jira.bars.group/browse/EDUSCHL-20961)
325
+ PATCH - При добавлении префикса RDM_EXPORT_ENTITY_ID_PREFIX в классе BaseExportDataFunctionHelper учтены поля
326
+ - из get_ignore_prefix_key_fields.
327
+
328
+
293
329
  ## [0.6.9] - 2023-11-30
294
330
 
295
331
  Доработка обработки ответа при отправке файлов в РВД.
@@ -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=LokNsirTCRBUmzwZAW9d_n8bek_DDKVYzdU12h3xRhE,14040
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=eTHwyxb3UFyZ62BWS7evC-C9c75PSlHwew8tlt0xsjU,5175
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=6dcngwr6R76NQ7R_DL8bH8udBRlzCdFUwC_Yf1CqVnA,6032
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
@@ -83,8 +83,8 @@ edu_rdm_integration/export_data/base/caches.py,sha256=dj8LGB7TMtX3cSfp-1UB3dnzcT
83
83
  edu_rdm_integration/export_data/base/consts.py,sha256=jLuy2y7YQ921OrEuzDld3F0k6YxgCnr5yorWBQJiLLw,519
84
84
  edu_rdm_integration/export_data/base/enums.py,sha256=BSmwrkzYwEQhz9NbZCJsldY532PqgZJzxzsVk6ue0bM,93
85
85
  edu_rdm_integration/export_data/base/errors.py,sha256=SaxXgKWNGG8RZQ8soFlzbX8d2_j58gWVmikzNZG1s74,291
86
- edu_rdm_integration/export_data/base/functions.py,sha256=og6MoWgPD3WxggWxwe-fUcW1LDtJS2d73sGC5a9OiW0,11881
87
- edu_rdm_integration/export_data/base/helpers.py,sha256=t2VLuvI8s84ZAVVnRLmV8jjYqSkn8hflfpgkQqzKJ3Q,3375
86
+ edu_rdm_integration/export_data/base/functions.py,sha256=nObDvmUcX1o8qq30VpOf9bsngMlebiaswJiRFHGpyjI,12023
87
+ edu_rdm_integration/export_data/base/helpers.py,sha256=-fpPTMrSHV3odfMjN5pRGzL7Q3BWsik0Vvl2DyCgHC4,3480
88
88
  edu_rdm_integration/export_data/base/managers.py,sha256=RuItunDuKIql065Xen6BSl_EEI8PHR9XeEyCDNgPBCg,6714
89
89
  edu_rdm_integration/export_data/base/presenters.py,sha256=JXh8nwyezaC-2h_TYfPPYUZRitFr9Y9Ifp-j7CaUCL0,403
90
90
  edu_rdm_integration/export_data/base/requests.py,sha256=-4Kn4hSl6IuKrpd8uIYTe4gO4Dz11HLfjJXLvmf9jTk,2576
@@ -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=oCUutLVvXHyPTt-2Jh-hZS6zU6xGVl1-a11gDj7BJU8,4772
104
- edu_rdm_integration/function_templates/function_collect_data_template/helpers.py-tpl,sha256=tySl3pBeaGjORX5qc2y1zvC8YogpcwbNqvGhh1Ow1Ws,1272
105
- edu_rdm_integration/function_templates/function_collect_data_template/managers.py-tpl,sha256=CxBaixZT-pIyEG7xl0l_sboieVNe8srkR-bEkt7hSwE,1527
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=5yWyPTLgKCAbYCTT-yuxdshKoO7eKZ9Ej1M5bHhmw00,2714
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=MoRY-a75Ow-7EjeQYxkXWunwqTGuBMaUyEkEV2oy05I,59
111
- edu_rdm_integration/function_templates/function_collect_data_template/validators.py-tpl,sha256=j9pcpMlD-2Ydc380WlZQ1HCHpxsdND9I-E03VH3mTRQ,855
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=tMYb5WhSyfWDBz7JbVYhL6LnJUvJ_VrsVqFmAx2dZgo,1159
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=t1fkefbofvuyVq24EjL0-ZWUNXa_ipct85evGYJuqHs,2721
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=Ad8iGzvQqp8EirLijzkBSI6KCHwCNmEQWch9708-jR8,2266
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=O_pvfbxgyVJCOt0lL89fGhcrGauyltc1aAdrbVhub3Y,3276
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=j9pcpMlD-2Ydc380WlZQ1HCHpxsdND9I-E03VH3mTRQ,855
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.6.9.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
139
- edu_rdm_integration-0.6.9.dist-info/METADATA,sha256=41t4NhdqobC8JS9XmDiEA7BUUjBSTIzPU6HCtgwM-30,41295
140
- edu_rdm_integration-0.6.9.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
141
- edu_rdm_integration-0.6.9.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
142
- edu_rdm_integration-0.6.9.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
143
- edu_rdm_integration-0.6.9.dist-info/RECORD,,
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,,