edu-rdm-integration 3.3.7__py3-none-any.whl → 3.4.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.
@@ -32,6 +32,9 @@ from educommon.audit_log.models import (
32
32
  from educommon.integration_entities.enums import (
33
33
  EntityLogOperation,
34
34
  )
35
+ from educommon.utils.phone_number.phone_number import (
36
+ PhoneNumber,
37
+ )
35
38
  from function_tools.models import (
36
39
  Entity,
37
40
  EntityType,
@@ -166,6 +169,8 @@ class BaseCollectingFunctionTestCase(TestCase):
166
169
  fields[key] = value.name
167
170
  elif isinstance(value, list):
168
171
  fields[key] = f'{{{",".join(map(str, value))}}}'
172
+ elif isinstance(value, PhoneNumber):
173
+ fields[key] = value.cleaned
169
174
  else:
170
175
  fields[key] = value
171
176
 
@@ -1,7 +1,9 @@
1
1
  from typing import (
2
2
  Any,
3
3
  Dict,
4
+ NamedTuple,
4
5
  Optional,
6
+ Type,
5
7
  Tuple,
6
8
  )
7
9
 
@@ -23,6 +25,9 @@ from edu_rdm_integration.models import (
23
25
  RegionalDataMartEntityEnum,
24
26
  RegionalDataMartModelEnum,
25
27
  )
28
+ from edu_rdm_integration.typing import (
29
+ MODEL_TYPE_VAR,
30
+ )
26
31
  from edu_rdm_integration.utils import (
27
32
  camel_to_underscore,
28
33
  )
@@ -108,3 +113,17 @@ class ModelEnumRegisterMixin(BaseEnumRegisterMixin):
108
113
  register_params['loggable_models'] = cls.loggable_models
109
114
 
110
115
  return register_params
116
+
117
+
118
+ class FromNamedTupleMixin:
119
+ """Миксин получения экземпляра модели из получаемого кэша значений."""
120
+
121
+ @classmethod
122
+ def from_namedtuple(cls: Type[MODEL_TYPE_VAR], namedtuple: NamedTuple) -> MODEL_TYPE_VAR:
123
+ """Создает экземпляр класса из NamedTuple."""
124
+ return cls(
125
+ **{
126
+ field: getattr(namedtuple, field)
127
+ for field in [f.column for f in cls._meta.get_fields()]
128
+ }
129
+ )
@@ -14,3 +14,6 @@ MODEL_FIELDS_LOG_FILTER: Dict[EntityLogOperation, Dict[str, Tuple]] = {
14
14
  EntityLogOperation.UPDATE: {},
15
15
  EntityLogOperation.DELETE: {}
16
16
  }
17
+
18
+ # Маппинг операций логов моделей и сущностей по умолчанию
19
+ DEFAULT_ENTITY_LOG_OPERATION_MAP = {op: op for op in EntityLogOperation.values}
@@ -0,0 +1,28 @@
1
+ from typing import (
2
+ Sequence,
3
+ TypeVar,
4
+ Union,
5
+ )
6
+
7
+ from django.db.models import (
8
+ Expression,
9
+ Model,
10
+ )
11
+
12
+
13
+ # Тип, обозначающий любую модель. При указании в качестве type annotation
14
+ # можно указать, что аргументом может быть любая модель или тип модели (через
15
+ # Type[MODEL_TYPE_VAR]), а сама функция возвращает инстанс этой
16
+ # конкретной модели
17
+ MODEL_TYPE_VAR = TypeVar('MODEL_TYPE_VAR', bound=Model)
18
+
19
+ # Аннотация типов для id записи в БД
20
+ RECORD_IDS = Union[
21
+ tuple[int, ...],
22
+ tuple[str, ...],
23
+ list[int],
24
+ list[str],
25
+ Sequence[int],
26
+ Sequence[str],
27
+ Expression,
28
+ ]
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  from datetime import (
3
+ date,
3
4
  datetime,
4
5
  time,
5
6
  timedelta,
@@ -11,12 +12,30 @@ from typing import (
11
12
  List,
12
13
  Optional,
13
14
  Set,
15
+ Type,
16
+ TypeVar,
14
17
  Union,
15
18
  )
16
19
 
17
20
  from django.conf import (
18
21
  settings,
19
22
  )
23
+ from django.db.models import (
24
+ DateField,
25
+ DateTimeField,
26
+ Expression,
27
+ F,
28
+ )
29
+ from django.db.models.expressions import (
30
+ Func,
31
+ )
32
+ from django.db.models.functions import (
33
+ Cast,
34
+ Now,
35
+ )
36
+ from educommon.integration_entities.enums import (
37
+ EntityLogOperation,
38
+ )
20
39
 
21
40
  from edu_rdm_integration.apps import (
22
41
  EduRDMIntegrationConfig,
@@ -285,3 +304,59 @@ def get_data_command_progress_attachment_path(
285
304
  str(instance.type),
286
305
  filename
287
306
  )
307
+
308
+
309
+ class MakeInterval(Func):
310
+ """Функция обработки даты/времени."""
311
+
312
+ template = 'make_interval(%(expressions)s)'
313
+
314
+ def __init__(
315
+ self, *,
316
+ years: Union[int, F] = 0,
317
+ months: Union[int, F] = 0,
318
+ weeks: Union[int, F] = 0,
319
+ days: Union[int, F] = 0,
320
+ hours: Union[int, F] = 0,
321
+ minutes: Union[int, F] = 0,
322
+ seconds: Union[float, F] = 0.0,
323
+ output_field=None,
324
+ ) -> None:
325
+ self.years = years
326
+ self.months = months
327
+ self.weeks = weeks
328
+ self.days = days
329
+ self.hours = hours
330
+ self.minutes = minutes
331
+ self.seconds = seconds
332
+
333
+ super().__init__(
334
+ self.years,
335
+ self.months,
336
+ self.weeks,
337
+ self.days,
338
+ self.hours,
339
+ self.minutes,
340
+ self.seconds,
341
+ output_field=output_field or DateTimeField(),
342
+ )
343
+
344
+
345
+ def make_passed_datetime_from_today(
346
+ *,
347
+ years: int = 0,
348
+ months: int = 0,
349
+ days: int = 0,
350
+ ) -> Union[datetime, Expression, F]:
351
+ """Возвращает выражение на лет/месяцев/дней меньше относительно сегодня."""
352
+ now_expr = Now()
353
+
354
+ return now_expr - MakeInterval(years=years, months=months, days=days)
355
+
356
+
357
+ TODAY_EXPR: Union[date, Expression, F] = Cast(make_passed_datetime_from_today(), output_field=DateField())
358
+
359
+ THREE_YEARS_AGO_DATE_EXPR: Union[date, Expression, F] = Cast(
360
+ make_passed_datetime_from_today(years=3),
361
+ output_field=DateField()
362
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edu-rdm-integration
3
- Version: 3.3.7
3
+ Version: 3.4.0
4
4
  Summary: Интеграция с Региональной витриной данных
5
5
  Home-page:
6
6
  Download-URL:
@@ -28,7 +28,7 @@ Requires-Dist: wheel <0.42,>=0.37.1
28
28
  Requires-Dist: transliterate <2
29
29
  Requires-Dist: Django <3.3,>=2.2
30
30
  Requires-Dist: celery <5.3,>=4.4.7
31
- Requires-Dist: educommon <4,>=3.10.0
31
+ Requires-Dist: educommon <4,>=3.11.0
32
32
  Requires-Dist: function-tools <1,>=0.9.0
33
33
  Requires-Dist: m3-db-utils <1,>=0.3.10
34
34
  Requires-Dist: m3-django-compat <2,>=1.10.2
@@ -302,6 +302,21 @@ Requires-Dist: uploader-client <1,>=0.2.1
302
302
  ### Удалено
303
303
 
304
304
 
305
+ ## 3.4.0 - 2024-09-25
306
+ В базовый класс тестирования функций сбора добавлена поддержка формата PhoneNumber для формирования
307
+ экземпляра модели AuditLog.
308
+ Повышена версия зависимости educommon >= 3.11.0.
309
+ Вынесены утилиты и базовый класс для логирования и сбора по модели в рамках сущности
310
+
311
+ ## Добавлено
312
+ - [EDUSCHL-22378](https://jira.bars.group/browse/EDUSCHL-22378)
313
+ Реализация поля моделей Django содержащего номер телефона
314
+
315
+ ### Изменено
316
+ - [EDUKNDG-14516](https://jira.bars.group/browse/EDUKNDG-14516)
317
+ PATCH Вынесены утилиты и базовый класс для логирования и сбора по модели в рамках сущности
318
+
319
+
305
320
  ## 3.3.7 - 2024-09-06
306
321
  Добавлены команда (UploadEntitiesData) и модель (UploadDataCommand) для логирования и запуска выгрузки данных в витрину
307
322
  - [EDUSCHL-22042](https://jira.bars.group/browse/EDUSCHL-22042)
@@ -7,13 +7,14 @@ edu_rdm_integration/consts.py,sha256=Qt52SOCQ-3wOet-_6inJih_W9nToORKXbkxb3jVSjEo
7
7
  edu_rdm_integration/entities.py,sha256=qNVWUhjwvX298Ak86_AKmqBZioP0czGwBcAz_4dtUUE,14552
8
8
  edu_rdm_integration/enums.py,sha256=T3Mu5D-CbKO3BSg16MPPnIPlcc_YGLYR-ThS8dzl9gg,4246
9
9
  edu_rdm_integration/helpers.py,sha256=_zQb3vuMrWClpUErshYTI1aVgdKjXf819pHfBjaIty4,14592
10
- edu_rdm_integration/mapping.py,sha256=bwa2fJCbV4YjQcAgRrgT3hgM6dJhr_uBtQgx3L3F2Ck,473
10
+ edu_rdm_integration/mapping.py,sha256=PGy6oH3Jzg4uuSIjlI0A-gWWpJPozqZHN4wGzp-ldFY,660
11
11
  edu_rdm_integration/models.py,sha256=YP_vot6PbQ3jWv3NNW1wa0gScjOsT2lgdrj7z5V6NHw,33053
12
12
  edu_rdm_integration/redis_cache.py,sha256=GZhtM1d0cVr5TEqxh15K7dS371Msit6wRemIiYb2rzk,1548
13
13
  edu_rdm_integration/signals.py,sha256=3eRlpkDcFCF6TN80-QM8yBYLcyozzcmoPjz6r4_ApWg,73
14
14
  edu_rdm_integration/storages.py,sha256=o5WqUG7SnkeuMt-z8spUi-IraivST-7KHzfY-M3v7FA,6807
15
15
  edu_rdm_integration/tasks.py,sha256=QAOytSCEoWtFWJqmTkj3N6NRl_Hds9EXyRfngFHrbPk,16046
16
- edu_rdm_integration/utils.py,sha256=NIOxlH4JiTOOxYgqcwtfqT5UAtNG24GLq_tsnBUtp8E,10370
16
+ edu_rdm_integration/typing.py,sha256=6GOZfRDqOjN-o5NR86-f2o4uXQm_8AUCRRdQTITtrcs,785
17
+ edu_rdm_integration/utils.py,sha256=QMiohtOaId3Zab91IZPazGzhce5pa5e-ilRgXpISkHk,12249
17
18
  edu_rdm_integration/adapters/__init__.py,sha256=cU0swn4Ny5ZQz5buWRcWsT1mpWuUFJaUlHf2l7TtEBo,83
18
19
  edu_rdm_integration/adapters/apps.py,sha256=TyJTkSPs2qAHJ11fqbwLGk3Ea7ujtqWwbxqmvYNQxG8,363
19
20
  edu_rdm_integration/adapters/caches.py,sha256=OxSqeXySUN42LxEeHBLtC1ZBt-7aicbRbmP1EJYTvV4,1505
@@ -41,7 +42,7 @@ edu_rdm_integration/collect_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
41
42
  edu_rdm_integration/collect_data/collect.py,sha256=HIKO8Kvw9NY9Nt5M5w9XfcZ9E5IVue_4mT7ESYJ6n4I,11909
42
43
  edu_rdm_integration/collect_data/generators.py,sha256=f34AAwdEcQNIokX0ypqYgjRD1XolwBVLER_HYv9ibNw,9075
43
44
  edu_rdm_integration/collect_data/helpers.py,sha256=gAFZAm9YhMtQhvlwSF3LMthPPa8LsqG_zbVe7vnW_Ag,2995
44
- edu_rdm_integration/collect_data/tests.py,sha256=-UNX3-GL0H9i89GXRfICT0ABltn_9aN_I_cmn1gQcDA,5367
45
+ edu_rdm_integration/collect_data/tests.py,sha256=hlf2eXUQonYeLY2enm-ND712NrsGcYa03FxjCUOj7EE,5535
45
46
  edu_rdm_integration/collect_data/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
47
  edu_rdm_integration/collect_data/base/caches.py,sha256=XPMVZSgR8vRhCHmHsnUKy86rEIPUQXHz0wJabovPyfU,2170
47
48
  edu_rdm_integration/collect_data/base/functions.py,sha256=E1vYmC8F8NM5cBB5SGQEpluHrMynpjf3Ek3s0HsbxwY,2998
@@ -82,7 +83,7 @@ edu_rdm_integration/collect_data/non_calculated/base/strings.py,sha256=-k9dex8A7
82
83
  edu_rdm_integration/collect_data/non_calculated/base/tests.py,sha256=MoRY-a75Ow-7EjeQYxkXWunwqTGuBMaUyEkEV2oy05I,59
83
84
  edu_rdm_integration/collect_data/non_calculated/base/validators.py,sha256=0YvnfrfK1iFcZVSB-M-Xv82tIjYxEU_BwLofAEuGVW4,973
84
85
  edu_rdm_integration/enum_register/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
- edu_rdm_integration/enum_register/mixins.py,sha256=nmHue9-9bqKZn9_MFiL0E-5wBUBIZPZwk3DWVir5pKk,4021
86
+ edu_rdm_integration/enum_register/mixins.py,sha256=YYCvSQEf6RMaMnGS2vA2v-P1ojkXA5MgAuBOcFgLIRE,4642
86
87
  edu_rdm_integration/enum_register/register.py,sha256=5OWOjK-M0Erd_5CENpBaXhVtfL0pEaDl3Bev5QKNDJc,2218
87
88
  edu_rdm_integration/export_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
89
  edu_rdm_integration/export_data/consts.py,sha256=rmJ_18wHCE54j0VABxfo7Zu01EPFYSjYrj5L79hVW2Y,333
@@ -175,9 +176,9 @@ edu_rdm_integration/uploader_log/enums.py,sha256=rgSO3BL2rh2xpfm0Pt4waQW8fB1VMJL
175
176
  edu_rdm_integration/uploader_log/managers.py,sha256=y5wTSMzF9hpOpIU_A7nIafL_LBU3QEie6LAYWoB-pBQ,3203
176
177
  edu_rdm_integration/uploader_log/ui.py,sha256=YM9Buqp2wxE95Wf5gvAATBzuYzDOossK1sEmvFk07cI,2110
177
178
  edu_rdm_integration/uploader_log/templates/ui-js/object-grid-buttons.js,sha256=2xyGe0wdVokM0RhpzRzcRvJPBkBmPe3SlZry4oP4Nzs,6201
178
- edu_rdm_integration-3.3.7.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
179
- edu_rdm_integration-3.3.7.dist-info/METADATA,sha256=S5XBS2DDMg8tHJujIXOFixFcUEA_7oCNP9Ks6BM3Y78,72714
180
- edu_rdm_integration-3.3.7.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
181
- edu_rdm_integration-3.3.7.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
182
- edu_rdm_integration-3.3.7.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
183
- edu_rdm_integration-3.3.7.dist-info/RECORD,,
179
+ edu_rdm_integration-3.4.0.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
180
+ edu_rdm_integration-3.4.0.dist-info/METADATA,sha256=yyTvi9MApMnWTUi9cv5G3MRQ8CKcEb48KFVSvcGQXzk,73632
181
+ edu_rdm_integration-3.4.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
182
+ edu_rdm_integration-3.4.0.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
183
+ edu_rdm_integration-3.4.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
184
+ edu_rdm_integration-3.4.0.dist-info/RECORD,,