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.
@@ -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.5
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.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,,
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,,