edu-rdm-integration 0.6.5__py3-none-any.whl → 0.6.6__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-0.6.5.dist-info → edu_rdm_integration-0.6.6.dist-info}/METADATA +23 -6
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.6.dist-info}/RECORD +7 -6
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.6.dist-info}/LICENSE +0 -0
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.6.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.6.dist-info}/namespace_packages.txt +0 -0
- {edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.6.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
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: edu-rdm-integration
|
3
|
-
Version: 0.6.
|
3
|
+
Version: 0.6.6
|
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,6 +27,7 @@ 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
33
|
Requires-Dist: m3-db-utils <1,>=0.3.6
|
@@ -285,6 +290,18 @@ Requires-Dist: uploader-client <1,>=0.1.12
|
|
285
290
|
### Удалено
|
286
291
|
|
287
292
|
|
293
|
+
## [0.6.6] - 2023-10-16
|
294
|
+
|
295
|
+
Добавлен базовый класс для тестирования Функций сбора, добавлена явная зависимость Django.
|
296
|
+
|
297
|
+
### Добавлено
|
298
|
+
|
299
|
+
- [EDUSCHL-20684](https://jira.bars.group/browse/EDUSCHL-20684)
|
300
|
+
PATCH - Базовый класс для тестирования Функций сбора;
|
301
|
+
- [EDUSCHL-20684](https://jira.bars.group/browse/EDUSCHL-20684)
|
302
|
+
PATCH - Добавлена зависимость Django.
|
303
|
+
|
304
|
+
|
288
305
|
## [0.6.5] - 2023-10-11
|
289
306
|
|
290
307
|
Получение метода генерации логов вынесено в отдельный метод для избавления от необходимости хранить все методы в одном классе.
|
@@ -367,7 +384,7 @@ Requires-Dist: uploader-client <1,>=0.1.12
|
|
367
384
|
|
368
385
|
## [0.5.8] - 2023-09-13
|
369
386
|
|
370
|
-
Исправлена ошибка добавления в описание асинхронной задачи списка выгруженных сущностей
|
387
|
+
Исправлена ошибка добавления в описание асинхронной задачи списка выгруженных сущностей
|
371
388
|
BaseExportLatestEntitiesData._set_description_to_async_task.
|
372
389
|
|
373
390
|
### Исправлено
|
@@ -399,8 +416,8 @@ BaseExportLatestEntitiesData._set_description_to_async_task.
|
|
399
416
|
- [EDUSCHL-20435](https://jira.bars.group/browse/EDUSCHL-20435)
|
400
417
|
PATCH - Исправлено нахождение левой границы в классе ExportLatestEntitiesData;
|
401
418
|
- Добавлена проверка на наличие запущенных или готовых к выгрузке сущностей;
|
402
|
-
- Добавлен параметр update_modified, который обновляет поле modified у собранных моделей,
|
403
|
-
чтобы выгрузить невыгруженные записи.
|
419
|
+
- Добавлен параметр update_modified, который обновляет поле modified у собранных моделей,
|
420
|
+
чтобы выгрузить невыгруженные записи.
|
404
421
|
|
405
422
|
|
406
423
|
## [0.5.5] - 2023-09-04
|
@@ -453,14 +470,14 @@ split_by_days_count переименовал в split_by_quantity.
|
|
453
470
|
- [EDUSCHL-20227](https://jira.bars.group/browse/EDUSCHL-20227)
|
454
471
|
PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator
|
455
472
|
не формируется словарь с параметрами для команды.
|
456
|
-
|
473
|
+
|
457
474
|
- [EDUSCHL-20229](https://jira.bars.group/browse/EDUSCHL-20229)
|
458
475
|
PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator
|
459
476
|
не формируется словарь с параметрами для команды.
|
460
477
|
|
461
478
|
|
462
479
|
## [0.5.0] - 2023-08-19
|
463
|
-
|
480
|
+
|
464
481
|
Дополнительная функциональность WebEduEntityValueCache была перенесена в EntityCache в function_tools.
|
465
482
|
|
466
483
|
### Удалено
|
@@ -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
|
@@ -128,9 +129,9 @@ edu_rdm_integration/management/commands/export_entities_data.py,sha256=Mas1zwsH-
|
|
128
129
|
edu_rdm_integration/migrations/0001_initial.py,sha256=toNuYoHZePe5wJ6AKEW9oPOdt2OefmxDEDDJGYQIrFk,18719
|
129
130
|
edu_rdm_integration/migrations/0002_init_data_uploadstatus.py,sha256=kht966YNuDbC3qTGrcWswJPsVuAtNO59Ck15G2eS2bU,944
|
130
131
|
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.
|
132
|
+
edu_rdm_integration-0.6.6.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
|
133
|
+
edu_rdm_integration-0.6.6.dist-info/METADATA,sha256=9__jYHSUtU3cPZY65i-5ckdPpZUVpRZ725spfS1EqJA,37636
|
134
|
+
edu_rdm_integration-0.6.6.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
135
|
+
edu_rdm_integration-0.6.6.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
136
|
+
edu_rdm_integration-0.6.6.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
|
137
|
+
edu_rdm_integration-0.6.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
{edu_rdm_integration-0.6.5.dist-info → edu_rdm_integration-0.6.6.dist-info}/namespace_packages.txt
RENAMED
File without changes
|
File without changes
|