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.
- edu_rdm_integration/collect_data/tests.py +138 -0
- edu_rdm_integration/entities.py +36 -5
- edu_rdm_integration/enum_register/__init__.py +0 -0
- edu_rdm_integration/enum_register/mixins.py +87 -0
- edu_rdm_integration/enum_register/register.py +82 -0
- edu_rdm_integration/utils.py +39 -0
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.7.dist-info}/METADATA +36 -7
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.7.dist-info}/RECORD +12 -8
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.7.dist-info}/LICENSE +0 -0
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.7.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.7.dist-info}/namespace_packages.txt +0 -0
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.7.dist-info}/top_level.txt +0 -0
@@ -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
|
edu_rdm_integration/entities.py
CHANGED
@@ -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
|
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
|
+
])
|
edu_rdm_integration/utils.py
CHANGED
@@ -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.
|
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.
|
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=
|
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=
|
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.
|
132
|
-
edu_rdm_integration-0.6.
|
133
|
-
edu_rdm_integration-0.6.
|
134
|
-
edu_rdm_integration-0.6.
|
135
|
-
edu_rdm_integration-0.6.
|
136
|
-
edu_rdm_integration-0.6.
|
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,,
|
File without changes
|
File without changes
|
{edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.7.dist-info}/namespace_packages.txt
RENAMED
File without changes
|
File without changes
|