edu-rdm-integration 3.3.8__py3-none-any.whl → 3.4.2__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.
@@ -48,3 +48,9 @@ RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS = 60 * 60 * 2
48
48
  RDM_UPLOAD_QUEUE_MAX_SIZE = 500_000_000
49
49
  # Таймаут для сохранения параметров в общем кеш
50
50
  RDM_REDIS_CACHE_TIMEOUT_SECONDS = 60 * 60 * 2
51
+
52
+ # Настройка запуска периодической задачи отправки csv-файлов в витрину:
53
+ RDM_UPLOAD_DATA_TASK_MINUTE = '0'
54
+ RDM_UPLOAD_DATA_TASK_HOUR = '*/2'
55
+ RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK = '*'
56
+ RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS = 60 * 60 * 2
@@ -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}
@@ -350,12 +350,12 @@ class UploadDataAsyncTask(UniquePeriodicAsyncTask):
350
350
  queue = TASK_QUEUE_NAME
351
351
  routing_key = TASK_QUEUE_NAME
352
352
  description = 'Отправка данных в витрину "Региональная витрина данных"'
353
- lock_expire_seconds = settings.RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS
353
+ lock_expire_seconds = settings.RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS
354
354
  task_type = AsyncTaskType.SYSTEM
355
355
  run_every = crontab(
356
- minute=settings.RDM_UPLOAD_STATUS_TASK_MINUTE,
357
- hour=settings.RDM_UPLOAD_STATUS_TASK_HOUR,
358
- day_of_week=settings.RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK,
356
+ minute=settings.RDM_UPLOAD_DATA_TASK_MINUTE,
357
+ hour=settings.RDM_UPLOAD_DATA_TASK_HOUR,
358
+ day_of_week=settings.RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK,
359
359
  )
360
360
 
361
361
  def process(self, *args, **kwargs):
@@ -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.8
3
+ Version: 3.4.2
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,37 @@ Requires-Dist: uploader-client <1,>=0.2.1
302
302
  ### Удалено
303
303
 
304
304
 
305
+ ## 3.4.2 - 2024-10-15
306
+ Добавлены отдельные параметры по управлению временем запуска UploadDataAsyncTask
307
+
308
+ ## Добавлено
309
+ - [EDUSCHL-22166](https://jira.bars.group/browse/EDUSCHL-22166)
310
+ Добавлены отдельные параметры по управлению временем запуска UploadDataAsyncTask
311
+
312
+
313
+ ## 3.4.1 - 2024-09-26
314
+ Добавлена документация по сбору/выгрузке сущностей для ЭДС, ЭК
315
+
316
+ ## Добавлено
317
+ - [EDUKNDG-14518](https://jira.bars.group/browse/EDUKNDG-14518)
318
+ Добавлена документация по сбору/выгрузке сущностей для ЭДС, ЭК
319
+
320
+
321
+ ## 3.4.0 - 2024-09-25
322
+ В базовый класс тестирования функций сбора добавлена поддержка формата PhoneNumber для формирования
323
+ экземпляра модели AuditLog.
324
+ Повышена версия зависимости educommon >= 3.11.0.
325
+ Вынесены утилиты и базовый класс для логирования и сбора по модели в рамках сущности
326
+
327
+ ## Добавлено
328
+ - [EDUSCHL-22378](https://jira.bars.group/browse/EDUSCHL-22378)
329
+ Реализация поля моделей Django содержащего номер телефона
330
+
331
+ ### Изменено
332
+ - [EDUKNDG-14516](https://jira.bars.group/browse/EDUKNDG-14516)
333
+ PATCH Вынесены утилиты и базовый класс для логирования и сбора по модели в рамках сущности
334
+
335
+
305
336
  ## 3.3.8 - 2024-10-14
306
337
  Задача UploadDataAsyncTask изменена с PeriodicAsyncTask на UploadDataAsyncTask
307
338
  - [EDUSCHL-22519]https://jira.bars.group/browse/EDUSCHL-22519
@@ -1,19 +1,20 @@
1
1
  edu_rdm_integration/__init__.py,sha256=fVCvQ7QGI_iCyAeE8dMapyY8gOM617ye5GQqAVGPlZI,72
2
2
  edu_rdm_integration/app_meta.py,sha256=v5IU69yaeLbyHF0Ln6iPN_IfizbtF3rCWrz2n71m8dU,337
3
- edu_rdm_integration/app_settings.py,sha256=bR8zGz2fJPSia5LO4KDUENIlxdqHmKkTAg92-q0qhew,2398
3
+ edu_rdm_integration/app_settings.py,sha256=iqoGMJXFvINd4YwDfXCKjZEsGJCCNxpIRWfvwLrvpPA,2689
4
4
  edu_rdm_integration/apps.py,sha256=BoXiTr8B04ZtDxHNXc1Jy2xzRoaq8CMBQ9cfmBK73j4,3571
5
5
  edu_rdm_integration/base.py,sha256=_G0qPTAXe6bXfgDHNiZMSsYt3sMuUhLKnHuQCWSFttU,1341
6
6
  edu_rdm_integration/consts.py,sha256=Qt52SOCQ-3wOet-_6inJih_W9nToORKXbkxb3jVSjEo,1079
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
- edu_rdm_integration/tasks.py,sha256=-YVApvlXdke5IYEBppU7M5_3bBYgIUqzxtZF976qIxM,16052
16
- edu_rdm_integration/utils.py,sha256=NIOxlH4JiTOOxYgqcwtfqT5UAtNG24GLq_tsnBUtp8E,10370
15
+ edu_rdm_integration/tasks.py,sha256=9LzUCuCmSR2dDi35SI2VeOdxTpKf33SkFCffov3WO7Y,16044
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.8.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
179
- edu_rdm_integration-3.3.8.dist-info/METADATA,sha256=LV7V-Iqbz2EZVVQAsflLPWVD08Ta7rCw4y0bZzNkPq4,73000
180
- edu_rdm_integration-3.3.8.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
181
- edu_rdm_integration-3.3.8.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
182
- edu_rdm_integration-3.3.8.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
183
- edu_rdm_integration-3.3.8.dist-info/RECORD,,
179
+ edu_rdm_integration-3.4.2.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
180
+ edu_rdm_integration-3.4.2.dist-info/METADATA,sha256=MyujvyOvHWMyJpk9lZTwTeWORxzV_fMisjEO_DEDvIA,74646
181
+ edu_rdm_integration-3.4.2.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
182
+ edu_rdm_integration-3.4.2.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
183
+ edu_rdm_integration-3.4.2.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
184
+ edu_rdm_integration-3.4.2.dist-info/RECORD,,