edu-rdm-integration 0.6.5__py3-none-any.whl → 0.6.7__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.
@@ -0,0 +1,138 @@
1
+ import datetime
2
+ import decimal
3
+ import uuid
4
+ from typing import (
5
+ TYPE_CHECKING,
6
+ Any,
7
+ Dict,
8
+ Optional,
9
+ Type,
10
+ )
11
+ from unittest import (
12
+ mock,
13
+ )
14
+
15
+ from django.conf import (
16
+ settings,
17
+ )
18
+ from django.db.models.fields.files import (
19
+ FieldFile,
20
+ )
21
+ from django.test import (
22
+ TestCase,
23
+ )
24
+ from django.utils import (
25
+ timezone,
26
+ )
27
+
28
+ from educommon.audit_log.models import (
29
+ AuditLog,
30
+ Table,
31
+ )
32
+ from educommon.integration_entities.enums import (
33
+ EntityLogOperation,
34
+ )
35
+
36
+
37
+ if TYPE_CHECKING:
38
+ from django.db.models import (
39
+ Model,
40
+ )
41
+
42
+ from function_tools.managers import (
43
+ RunnerManager,
44
+ )
45
+
46
+
47
+ class BaseCollectingFunctionTestCase(TestCase):
48
+ """Базовый класс тестирования Функции сбора."""
49
+
50
+ databases = (settings.DEFAULT_DB_ALIAS, settings.SERVICE_DB_ALIAS)
51
+
52
+ @property
53
+ def manager(self) -> Type['RunnerManager']:
54
+ """Менеджер раннера Функции сбора."""
55
+ raise NotImplementedError
56
+
57
+ @classmethod
58
+ def tearDownClass(cls) -> None:
59
+ """Вызывается один раз после запуска всех тестов класса."""
60
+ cls.delete_auditlogs()
61
+
62
+ super().tearDownClass()
63
+
64
+ @staticmethod
65
+ def delete_auditlogs() -> None:
66
+ """Удаляет логи."""
67
+ AuditLog.objects.all().delete()
68
+
69
+ def setUp(self) -> None:
70
+ """Подготавливает фикстуры."""
71
+ self.now = timezone.now()
72
+
73
+ def run_collecting_function(self) -> None:
74
+ """Запускает Функцию сбора."""
75
+ runner_manager = self.manager(
76
+ logs_period_started_at=datetime.datetime.combine(self.now, datetime.time.min),
77
+ logs_period_ended_at=datetime.datetime.combine(self.now, datetime.time.max),
78
+ )
79
+ runner_manager.run()
80
+
81
+ @mock.patch('educommon.audit_log.models.AuditLog.ready_to_save')
82
+ @mock.patch('educommon.audit_log.models.AuditLog.is_read_only')
83
+ def create_auditlog(
84
+ self,
85
+ is_read_only_mock: mock.MagicMock,
86
+ ready_to_save_mock: mock.MagicMock,
87
+ *,
88
+ instance: 'Model',
89
+ changes: Optional[Dict[str, Any]] = None,
90
+ operation: EntityLogOperation = EntityLogOperation.UPDATE,
91
+ ) -> None:
92
+ """Создает AuditLog."""
93
+ is_read_only_mock.return_value = False
94
+ ready_to_save_mock.return_value = True
95
+
96
+ table = Table.objects.only('pk').get(name=instance._meta.db_table)
97
+
98
+ timestamp = datetime.datetime.combine(self.now, timezone.now().time())
99
+
100
+ if changes is None:
101
+ changes = {'__stub': None} # changes не может быть пустым
102
+ else:
103
+ changes['modified'] = timestamp.isoformat().replace('T', ' ')
104
+
105
+ AuditLog.objects.create(
106
+ user_id=1,
107
+ user_type_id=1,
108
+ ip='127.0.0.1',
109
+ data=self._clean_data(instance),
110
+ changes=changes,
111
+ table=table,
112
+ object_id=instance.pk,
113
+ time=timestamp,
114
+ operation=operation,
115
+ )
116
+
117
+ def _clean_data(self, instance: 'Model') -> Dict[str, Optional[str]]:
118
+ """Подготавливает данные экземпляра модели для формирования AuditLog'a."""
119
+ fields = {}
120
+
121
+ for key, value in vars(instance).items():
122
+ if key.startswith('_'):
123
+ continue
124
+
125
+ if isinstance(value, datetime.datetime):
126
+ fields[key] = value.strftime('%Y-%m-%d %H:%M:%S.%f%z')
127
+ elif isinstance(value, datetime.date):
128
+ fields[key] = value.strftime('%Y-%m-%d')
129
+ elif isinstance(value, bool):
130
+ fields[key] = 't' if value else 'f'
131
+ elif isinstance(value, (int, float, uuid.UUID, decimal.Decimal)):
132
+ fields[key] = str(value)
133
+ elif isinstance(value, FieldFile):
134
+ fields[key] = value.name
135
+ else:
136
+ fields[key] = value
137
+
138
+ return fields
@@ -8,15 +8,27 @@ from typing import (
8
8
  Tuple,
9
9
  )
10
10
 
11
+ from edu_rdm_integration.enum_register.mixins import (
12
+ EntityEnumRegisterMixin,
13
+ )
14
+ from edu_rdm_integration.models import (
15
+ RegionalDataMartModelEnum,
16
+ )
11
17
  from educommon.integration_entities.entities import (
12
18
  BaseEntity,
13
19
  )
14
20
 
15
21
 
16
22
  @dataclass
17
- class AddressEntity(BaseEntity):
23
+ class AddressEntity(EntityEnumRegisterMixin, BaseEntity):
18
24
  """Сущность РВД 'Адреса'."""
19
25
 
26
+ # Параметры регистрации в модель-перечисление РВД
27
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
28
+ title = 'Адреса'
29
+ main_model_enum = RegionalDataMartModelEnum.ADDRESS
30
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
31
+
20
32
  # Имена полей объявляются как константы, чтобы можно было выводить списки полей
21
33
  ID = 'id'
22
34
  USE_ADDRESS = 'use_address'
@@ -88,9 +100,16 @@ class AddressEntity(BaseEntity):
88
100
 
89
101
 
90
102
  @dataclass
91
- class AddressOrganisationEntity(BaseEntity):
103
+ class AddressOrganisationEntity(EntityEnumRegisterMixin, BaseEntity):
92
104
  """Сущность РВД 'Адреса'."""
93
105
 
106
+ # Параметры регистрации в модель-перечисление РВД
107
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
108
+ title = 'Адреса организаций'
109
+ main_model_enum = RegionalDataMartModelEnum.ADDRESS_ORGANISATION
110
+ additional_model_enums = (RegionalDataMartModelEnum.ORGANISATION, )
111
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
112
+
94
113
  # Имена полей объявляются как константы, чтобы можно было выводить списки полей
95
114
  ADDRESS_ID = 'address_id'
96
115
  ORGANISATION_ID = 'organisation_id'
@@ -132,9 +151,15 @@ class AddressOrganisationEntity(BaseEntity):
132
151
 
133
152
 
134
153
  @dataclass
135
- class TelecomEntity(BaseEntity):
154
+ class TelecomEntity(EntityEnumRegisterMixin, BaseEntity):
136
155
  """Сущность РВД "Контактные данные"."""
137
156
 
157
+ # Параметры регистрации в модель-перечисление РВД
158
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
159
+ title = 'Контактные данные'
160
+ main_model_enum = RegionalDataMartModelEnum.TELECOM
161
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
162
+
138
163
  # Имена полей объявляются как константы, чтобы можно было выводить списки полей
139
164
  ID = 'id'
140
165
  TYPE_CONTACT = 'type_contact'
@@ -194,11 +219,17 @@ class TelecomEntity(BaseEntity):
194
219
 
195
220
 
196
221
  @dataclass
197
- class OrganisationsEntity(BaseEntity):
222
+ class OrganisationsEntity(EntityEnumRegisterMixin, BaseEntity):
198
223
  """
199
224
  Сущность РВД "Организации".
200
225
  """
201
226
 
227
+ # Параметры регистрации в модель-перечисление РВД
228
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
229
+ title = 'Организации'
230
+ main_model_enum = RegionalDataMartModelEnum.ORGANISATION
231
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
232
+
202
233
  ID = 'id'
203
234
  ROSOBR_ID = 'rosobr_id'
204
235
  OGRN = 'ogrn'
@@ -209,7 +240,7 @@ class OrganisationsEntity(BaseEntity):
209
240
  OKPF = 'okpf'
210
241
  OKFS = 'okfs'
211
242
  OKOGU = 'okogu'
212
- OKATO = 'okato'
243
+ OKATO = 'okato'
213
244
  OKTMO = 'oktmo'
214
245
  NAME = 'name'
215
246
  PARTOF_ID = 'partof_id'
File without changes
@@ -0,0 +1,87 @@
1
+ from typing import (
2
+ Any,
3
+ Dict,
4
+ Tuple,
5
+ )
6
+
7
+ from django.db import (
8
+ models,
9
+ )
10
+ from django.utils.decorators import (
11
+ classproperty,
12
+ )
13
+
14
+ from edu_rdm_integration.models import (
15
+ RegionalDataMartEntityEnum,
16
+ RegionalDataMartModelEnum,
17
+ )
18
+ from edu_rdm_integration.utils import (
19
+ camel_to_underscore,
20
+ )
21
+ from m3_db_utils.mixins import (
22
+ BaseEnumRegisterMixin,
23
+ )
24
+ from m3_db_utils.models import (
25
+ ModelEnumValue,
26
+ )
27
+
28
+
29
+ class EntityEnumRegisterMixin(BaseEnumRegisterMixin):
30
+ """Миксин, для регистрации сущности в RegionalDataMartEntityEnum."""
31
+
32
+ enum = RegionalDataMartEntityEnum
33
+ """Модель-перечисление в которую регистрируется сущность."""
34
+
35
+ main_model_enum: ModelEnumValue
36
+ """Значение RegionalDataMartModelEnum,
37
+ основной модели РВД для формирования сущности."""
38
+
39
+ additional_model_enums: Tuple[ModelEnumValue] = ()
40
+ """Перечень дополнительных значений RegionalDataMartModelEnum,
41
+ которые участвуют в формировании записей сущностей"""
42
+
43
+ title: str
44
+ """Расшифровка сущности модели-перечисления"""
45
+
46
+ @classproperty
47
+ def key(cls) -> str:
48
+ return camel_to_underscore(cls.__name__.rsplit('Entity', 1)[0], upper=True)
49
+
50
+ @classmethod
51
+ def get_register_params(cls) -> Dict[str, Any]:
52
+ register_params = super().get_register_params()
53
+ register_params['main_model_enum'] = cls.main_model_enum
54
+ register_params['entity'] = cls
55
+ register_params['additional_model_enums'] = cls.additional_model_enums
56
+
57
+ return register_params
58
+
59
+
60
+ class ModelEnumRegisterMixin(BaseEnumRegisterMixin):
61
+ """Миксин, для регистрации модели в RegionalDataMartModelEnum."""
62
+
63
+ enum = RegionalDataMartModelEnum
64
+ """Модель-перечисление в которую регистрируется модель."""
65
+
66
+ creating_trigger_models: Tuple[models.Model] = ()
67
+ """Перечень моделей по которым генерируются логи."""
68
+
69
+ loggable_models: Tuple[models.Model] = ()
70
+ """Перечень моделей по которым собираются логи."""
71
+
72
+ @classproperty
73
+ def key(cls) -> str:
74
+ return camel_to_underscore(cls.__name__).upper()
75
+
76
+ @classproperty
77
+ def title(cls):
78
+ return cls._meta.verbose_name
79
+
80
+ @classmethod
81
+ def get_register_params(cls) -> Dict[str, Any]:
82
+ register_params = super().get_register_params()
83
+ register_params['model'] = cls
84
+ register_params['creating_trigger_models'] = cls.creating_trigger_models
85
+ register_params['loggable_models'] = cls.loggable_models
86
+
87
+ return register_params
@@ -0,0 +1,82 @@
1
+ import inspect
2
+ import sys
3
+ from importlib import (
4
+ import_module,
5
+ )
6
+ from operator import (
7
+ attrgetter,
8
+ )
9
+ from typing import (
10
+ Iterable,
11
+ Type,
12
+ )
13
+
14
+ from django.apps import (
15
+ apps,
16
+ )
17
+ from django.db import (
18
+ models,
19
+ )
20
+
21
+ from edu_rdm_integration.enum_register.mixins import (
22
+ EntityEnumRegisterMixin,
23
+ ModelEnumRegisterMixin,
24
+ )
25
+ from edu_rdm_integration.models import (
26
+ BaseEntityModel,
27
+ )
28
+ from educommon.integration_entities.entities import (
29
+ BaseEntity,
30
+ )
31
+ from m3_db_utils.mixins import (
32
+ BaseEnumRegisterMixin,
33
+ )
34
+
35
+
36
+ def register_classes(classes: Iterable[Type[BaseEnumRegisterMixin]]) -> None:
37
+ """Вызывает метод регистрации в модель-перечисление
38
+ у переданных классов.
39
+
40
+ Args:
41
+ classes: Классы, поддерживающие интерфейс регистрации.
42
+ """
43
+ classes = sorted(classes, key=attrgetter('order_number'))
44
+
45
+ for enum_class in classes:
46
+ enum_class.register()
47
+
48
+
49
+ def is_register_model(model: models.Model) -> bool:
50
+ """Проверяет, является ли класс регистрируемой моделью."""
51
+ return issubclass(model, ModelEnumRegisterMixin)
52
+
53
+
54
+ def is_register_entity(class_) -> bool:
55
+ """Проверяет, является ли класс регистрируемой сущностью."""
56
+ return (
57
+ inspect.isclass(class_) and
58
+ issubclass(class_, BaseEntity) and
59
+ issubclass(class_, EntityEnumRegisterMixin)
60
+ )
61
+
62
+
63
+ def register_models() -> None:
64
+ """Регистрирует модели в RegionalDataMartModelEnum."""
65
+ register_classes([
66
+ m for m in apps.get_models() if is_register_model(m)
67
+ ])
68
+
69
+
70
+ def register_entities(import_path: str) -> None:
71
+ """Находит регистрируемые сущности в модуле по переданному пути и
72
+ регистрирует в RegionalDataMartEntityEnum.
73
+
74
+ Args:
75
+ import_path: Путь до пакета, хранящего классы сущностей;
76
+ """
77
+ import_module(import_path)
78
+ entities_module = sys.modules[import_path]
79
+
80
+ register_classes([
81
+ c[1] for c in inspect.getmembers(entities_module, is_register_entity)
82
+ ])
@@ -165,3 +165,42 @@ def split_interval_by_delta(start_date: datetime, end_date: datetime, days_delta
165
165
  intervals = [*zip(iter_interval, iter_interval)]
166
166
 
167
167
  return intervals
168
+
169
+
170
+ def camel_to_underscore(name: str, upper=False) -> str:
171
+ """Переводит строку из верблюжьего в змеиный регистр.
172
+ По умолчанию строка приводится к нижнему регистру.
173
+ Несколько заглавных букв не будут разъединены, кроме последней.
174
+
175
+ Args:
176
+ name: форматируемая строка;
177
+ upper: флаг перевода в верхний регистр;
178
+
179
+ Returns:
180
+ Строка, приведенная к змеиному регистру.
181
+
182
+ >>> camel_to_underscore('ОдинДваТри')
183
+ 'один_два_три'
184
+ >>> camel_to_underscore('Один_два_три')
185
+ 'один_два_три'
186
+ >>> camel_to_underscore('Один_Два_Три')
187
+ 'один_два_три'
188
+ >>> camel_to_underscore('__ОдинДваТри__')
189
+ '__один_два_три__'
190
+ >>> camel_to_underscore('__ОдинДВАТри__')
191
+ '__один_два_три__'
192
+ """
193
+ output = []
194
+ for i, c in enumerate(name):
195
+ if i > 0:
196
+ pc = name[i - 1]
197
+ if c.isupper() and not pc.isupper() and pc != '_':
198
+ output.append('_')
199
+ elif i > 3 and not c.isupper():
200
+ previous = name[i - 3:i]
201
+ if previous.isalpha() and previous.isupper():
202
+ output.insert(len(output) - 1, '_')
203
+
204
+ output.append(c.upper() if upper else c.lower())
205
+
206
+ return ''.join(output)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edu-rdm-integration
3
- Version: 0.6.5
3
+ Version: 0.6.7
4
4
  Summary: Интеграция с Региональной витриной данных
5
5
  Home-page:
6
6
  Download-URL:
@@ -16,6 +16,10 @@ Classifier: Programming Language :: Python :: 3.8
16
16
  Classifier: Programming Language :: Python :: 3.9
17
17
  Classifier: Intended Audience :: Developers
18
18
  Classifier: Environment :: Console
19
+ Classifier: Framework :: Django :: 1.11
20
+ Classifier: Framework :: Django :: 2.0
21
+ Classifier: Framework :: Django :: 2.1
22
+ Classifier: Framework :: Django :: 2.2
19
23
  Description-Content-Type: text/markdown
20
24
  License-File: LICENSE
21
25
  Requires-Dist: packaging <24,>=21.3
@@ -23,9 +27,10 @@ Requires-Dist: pip <24,>=20.1.1
23
27
  Requires-Dist: setuptools <69,>=47.3.1
24
28
  Requires-Dist: wheel <0.42,>=0.37.1
25
29
  Requires-Dist: transliterate <2
30
+ Requires-Dist: Django <2.3,>=1.11
26
31
  Requires-Dist: educommon <4,>=3.0.0
27
32
  Requires-Dist: function-tools <1,>=0.5.0
28
- Requires-Dist: m3-db-utils <1,>=0.3.6
33
+ Requires-Dist: m3-db-utils <1,>=0.3.8
29
34
  Requires-Dist: uploader-client <1,>=0.1.12
30
35
 
31
36
  # Проект "Интеграция с Региональной витриной данных (РВД)"
@@ -285,6 +290,30 @@ Requires-Dist: uploader-client <1,>=0.1.12
285
290
  ### Удалено
286
291
 
287
292
 
293
+ ## [0.6.7] - 2023-11-01
294
+
295
+ Добавлен миксин EntityEnumRegisterMixin для регистрации сущностей в RegionalDataMartEntityEnum.
296
+ Миксин ModelEnumRegisterMixin для регистрации моделей в RegionalDataMartModelEnum.
297
+ Добавлены методы для запуска регистрации моделей и сущностей.
298
+
299
+ ### Добавлено
300
+
301
+ - [EDUCLLG-7632](https://jira.bars.group/browse/EDUCLLG-7632)
302
+ PATCH - Добавлен функционал регистрации моделей и сущностей в моделях-перечислениях.
303
+
304
+
305
+ ## [0.6.6] - 2023-10-16
306
+
307
+ Добавлен базовый класс для тестирования Функций сбора, добавлена явная зависимость Django.
308
+
309
+ ### Добавлено
310
+
311
+ - [EDUSCHL-20684](https://jira.bars.group/browse/EDUSCHL-20684)
312
+ PATCH - Базовый класс для тестирования Функций сбора;
313
+ - [EDUSCHL-20684](https://jira.bars.group/browse/EDUSCHL-20684)
314
+ PATCH - Добавлена зависимость Django.
315
+
316
+
288
317
  ## [0.6.5] - 2023-10-11
289
318
 
290
319
  Получение метода генерации логов вынесено в отдельный метод для избавления от необходимости хранить все методы в одном классе.
@@ -367,7 +396,7 @@ Requires-Dist: uploader-client <1,>=0.1.12
367
396
 
368
397
  ## [0.5.8] - 2023-09-13
369
398
 
370
- Исправлена ошибка добавления в описание асинхронной задачи списка выгруженных сущностей
399
+ Исправлена ошибка добавления в описание асинхронной задачи списка выгруженных сущностей
371
400
  BaseExportLatestEntitiesData._set_description_to_async_task.
372
401
 
373
402
  ### Исправлено
@@ -399,8 +428,8 @@ BaseExportLatestEntitiesData._set_description_to_async_task.
399
428
  - [EDUSCHL-20435](https://jira.bars.group/browse/EDUSCHL-20435)
400
429
  PATCH - Исправлено нахождение левой границы в классе ExportLatestEntitiesData;
401
430
  - Добавлена проверка на наличие запущенных или готовых к выгрузке сущностей;
402
- - Добавлен параметр update_modified, который обновляет поле modified у собранных моделей,
403
- чтобы выгрузить невыгруженные записи.
431
+ - Добавлен параметр update_modified, который обновляет поле modified у собранных моделей,
432
+ чтобы выгрузить невыгруженные записи.
404
433
 
405
434
 
406
435
  ## [0.5.5] - 2023-09-04
@@ -453,14 +482,14 @@ split_by_days_count переименовал в split_by_quantity.
453
482
  - [EDUSCHL-20227](https://jira.bars.group/browse/EDUSCHL-20227)
454
483
  PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator
455
484
  не формируется словарь с параметрами для команды.
456
-
485
+
457
486
  - [EDUSCHL-20229](https://jira.bars.group/browse/EDUSCHL-20229)
458
487
  PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator
459
488
  не формируется словарь с параметрами для команды.
460
489
 
461
490
 
462
491
  ## [0.5.0] - 2023-08-19
463
-
492
+
464
493
  Дополнительная функциональность WebEduEntityValueCache была перенесена в EntityCache в function_tools.
465
494
 
466
495
  ### Удалено
@@ -2,13 +2,13 @@ edu_rdm_integration/__init__.py,sha256=fVCvQ7QGI_iCyAeE8dMapyY8gOM617ye5GQqAVGPl
2
2
  edu_rdm_integration/app_settings.py,sha256=kideEO9SvYU8RXPB-8hTVosL4bAspPHNHtyz-R0F7v4,1822
3
3
  edu_rdm_integration/apps.py,sha256=Xcqck44MEvDFY6NryDTkkejI92Q_8Jgqv1oTHa87igg,2458
4
4
  edu_rdm_integration/consts.py,sha256=chOsPOOY4_JLzN-8idg-VjbLWSlp6r3maFWqnvUsapg,806
5
- edu_rdm_integration/entities.py,sha256=mI48GExfRrQZsyg8leGJDaiy8Cmf3vlkIttNq2OYJZI,9117
5
+ edu_rdm_integration/entities.py,sha256=H_B3bF4uwM_xebhGZvgfxIOFHkzVb_7w8SaG3Bl3YUo,11200
6
6
  edu_rdm_integration/enums.py,sha256=fnDPz6pwOYWS6vp65IAExbpDzn2q9U3_9GGyuf4B468,4876
7
7
  edu_rdm_integration/mapping.py,sha256=bwa2fJCbV4YjQcAgRrgT3hgM6dJhr_uBtQgx3L3F2Ck,473
8
8
  edu_rdm_integration/models.py,sha256=eUlR0DUIXcvr2yy_b0GZA6Jv__X9_iWyUsJhDMKwFDk,24976
9
9
  edu_rdm_integration/signals.py,sha256=3eRlpkDcFCF6TN80-QM8yBYLcyozzcmoPjz6r4_ApWg,73
10
10
  edu_rdm_integration/storages.py,sha256=o5WqUG7SnkeuMt-z8spUi-IraivST-7KHzfY-M3v7FA,6807
11
- edu_rdm_integration/utils.py,sha256=CgFrW1mEQim3wcCX6q9o9mvIm79ASQ92HojXyuN3dc0,5558
11
+ edu_rdm_integration/utils.py,sha256=vjme0N6tEXnHt6SaqjavZshjwc-mVv4X3Pz37a5YgTw,7092
12
12
  edu_rdm_integration/adapters/__init__.py,sha256=cU0swn4Ny5ZQz5buWRcWsT1mpWuUFJaUlHf2l7TtEBo,83
13
13
  edu_rdm_integration/adapters/apps.py,sha256=TyJTkSPs2qAHJ11fqbwLGk3Ea7ujtqWwbxqmvYNQxG8,363
14
14
  edu_rdm_integration/adapters/caches.py,sha256=OxSqeXySUN42LxEeHBLtC1ZBt-7aicbRbmP1EJYTvV4,1505
@@ -30,6 +30,7 @@ edu_rdm_integration/collect_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
30
30
  edu_rdm_integration/collect_data/collect.py,sha256=LokNsirTCRBUmzwZAW9d_n8bek_DDKVYzdU12h3xRhE,14040
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=EftJ8R-tn1r7Y_P6tGZmqxJ9-g89m12p9kA8NYmwwbQ,3009
33
+ edu_rdm_integration/collect_data/tests.py,sha256=7ergphTxnPgoI5XQMOFcW_y5Jy4ILWJkWlNbNDJF6_A,4080
33
34
  edu_rdm_integration/collect_data/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
35
  edu_rdm_integration/collect_data/base/caches.py,sha256=3BaJxYBk9fi0aiAVzym-Jz8aNP1eSOqh4Y8OVw1HnSg,763
35
36
  edu_rdm_integration/collect_data/base/functions.py,sha256=HT23EyiD-H50p4NLx2_LtioktTHHFVLRmAgWdbuHErw,2379
@@ -68,6 +69,9 @@ edu_rdm_integration/collect_data/non_calculated/base/runners.py,sha256=03pWh9LgF
68
69
  edu_rdm_integration/collect_data/non_calculated/base/strings.py,sha256=-k9dex8A7hCpkzUkudVkKRAbNRuuqog2hYl2xmibl8I,181
69
70
  edu_rdm_integration/collect_data/non_calculated/base/tests.py,sha256=MoRY-a75Ow-7EjeQYxkXWunwqTGuBMaUyEkEV2oy05I,59
70
71
  edu_rdm_integration/collect_data/non_calculated/base/validators.py,sha256=0YvnfrfK1iFcZVSB-M-Xv82tIjYxEU_BwLofAEuGVW4,973
72
+ edu_rdm_integration/enum_register/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ edu_rdm_integration/enum_register/mixins.py,sha256=fcq1pz4it0JJbgSMj4xEu8ALVQgy2zRLsWFtSmj-iEc,2881
74
+ edu_rdm_integration/enum_register/register.py,sha256=X7vCZZyzdwaFYBM-yfSkE11RWwBfTCLUKLVv_sDtYAg,2281
71
75
  edu_rdm_integration/export_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
76
  edu_rdm_integration/export_data/consts.py,sha256=Z6Uho8oViMc0t1tyQFZfrPFBwPx6KnhUf_iZ0qgob8o,16
73
77
  edu_rdm_integration/export_data/export.py,sha256=xr3_oTnufS_NMgJLPIeL87fNkt7zOVA5rM44sB3QvEw,14946
@@ -128,9 +132,9 @@ edu_rdm_integration/management/commands/export_entities_data.py,sha256=Mas1zwsH-
128
132
  edu_rdm_integration/migrations/0001_initial.py,sha256=toNuYoHZePe5wJ6AKEW9oPOdt2OefmxDEDDJGYQIrFk,18719
129
133
  edu_rdm_integration/migrations/0002_init_data_uploadstatus.py,sha256=kht966YNuDbC3qTGrcWswJPsVuAtNO59Ck15G2eS2bU,944
130
134
  edu_rdm_integration/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
- edu_rdm_integration-0.6.5.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
132
- edu_rdm_integration-0.6.5.dist-info/METADATA,sha256=HNybSOy9wm6bHinJJPRBTTsrakppfLTOYLqV2Lr1pB8,36953
133
- edu_rdm_integration-0.6.5.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
134
- edu_rdm_integration-0.6.5.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
135
- edu_rdm_integration-0.6.5.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
136
- edu_rdm_integration-0.6.5.dist-info/RECORD,,
135
+ edu_rdm_integration-0.6.7.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
136
+ edu_rdm_integration-0.6.7.dist-info/METADATA,sha256=6um_otgQ2Z06f_7Dw4GKMB8qz8CsKXKtlYACvsvVetw,38265
137
+ edu_rdm_integration-0.6.7.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
138
+ edu_rdm_integration-0.6.7.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
139
+ edu_rdm_integration-0.6.7.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
140
+ edu_rdm_integration-0.6.7.dist-info/RECORD,,