edu-rdm-integration 1.0.0__py3-none-any.whl → 1.0.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.
@@ -11,6 +11,9 @@ RDM_COLLECT_CHUNK_SIZE = 500
11
11
  # Количество записей моделей обрабатываемых за одну итерацию экспорта
12
12
  RDM_EXPORT_CHUNK_SIZE = 500
13
13
 
14
+ # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified
15
+ RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE = 5_000
16
+
14
17
 
15
18
  # Загрузка данных в Региональную витрину данных (РВД)
16
19
  # Адрес витрины (schema://host:port)
@@ -21,6 +21,10 @@ from django.conf import (
21
21
  from django.db.models import (
22
22
  F,
23
23
  Max,
24
+ CharField,
25
+ )
26
+ from django.db.models.functions import (
27
+ Cast,
24
28
  )
25
29
  from django.utils import (
26
30
  timezone,
@@ -45,9 +49,6 @@ from m3_db_utils.models import (
45
49
  ModelEnumValue,
46
50
  )
47
51
 
48
- from edu_rdm_integration.app_settings import (
49
- RDM_TRANSFER_TASK_TIMEDELTA,
50
- )
51
52
  from edu_rdm_integration.base import (
52
53
  BaseOperationData,
53
54
  )
@@ -317,23 +318,26 @@ class BaseCollectLatestModelsData(BaseCollectModelsData):
317
318
 
318
319
  return stage_created_or_in_progress
319
320
 
320
- def _get_last_finished_entity_upload(self) -> Dict[str, datetime]:
321
+ def _get_last_model_date(self, date_field: str) -> Dict[str, datetime]:
321
322
  """
322
- Возвращает словарь с uuid менеджера и датой последней успешной выгрузки по указанным сущностям.
323
+ Возвращает словарь с uuid менеджера и крайней датой из переданного поля по указанным моделям.
323
324
  """
324
- manager_to_last_date = CollectingExportedDataSubStage.objects.annotate(
325
- max_logs_period_ended_at=Max('stage__logs_period_ended_at'),
326
- ).values(
327
- 'stage__manager_id', 'max_logs_period_ended_at',
328
- ).annotate(
329
- manager_id=F('stage__manager_id'),
330
- date_end=F('max_logs_period_ended_at'),
331
- ).filter(
332
- status_id=CollectingDataSubStageStatus.READY_TO_EXPORT.key,
333
- manager_id__in=[m.uuid for m in self._collecting_data_managers.values()],
334
- ).values('manager_id', 'date_end')
335
-
336
- return {str(m['manager_id']): m['date_end'] for m in manager_to_last_date}
325
+ manager_to_start_date = dict(
326
+ CollectingExportedDataSubStage.objects.annotate(
327
+ max_date=Max(f'stage__{date_field}'),
328
+ ).values(
329
+ 'stage__manager_id', 'max_date',
330
+ ).annotate(
331
+ manager_id=Cast('stage__manager_id', output_field=CharField()),
332
+ date=F('max_date'),
333
+ ).filter(
334
+ status_id=CollectingDataSubStageStatus.READY_TO_EXPORT.key,
335
+ manager_id__in=(m.uuid for m in
336
+ self._collecting_data_managers.values()),
337
+ ).values_list('manager_id', 'date')
338
+ )
339
+
340
+ return manager_to_start_date
337
341
 
338
342
  def _collect_models_data(self, *args, logs: Optional[Dict[str, List[AuditLog]]] = None, **kwargs) -> None:
339
343
  """
@@ -341,21 +345,20 @@ class BaseCollectLatestModelsData(BaseCollectModelsData):
341
345
  """
342
346
  logger.info('collect models data..')
343
347
 
344
- last_finished_entity_upload = self._get_last_finished_entity_upload()
348
+ last_finished_model_upload = self._get_last_model_date('logs_period_ended_at')
349
+ last_model_start = self._get_last_model_date('started_at')
345
350
 
346
351
  for model_key, manager_class in self._collecting_data_managers.items():
347
352
  model_logs = logs.get(model_key) if logs else None
348
353
 
349
354
  kwargs['logs_period_started_at'] = (
350
- last_finished_entity_upload.get(manager_class.uuid)
355
+ last_finished_model_upload.get(manager_class.uuid)
351
356
  or get_today_min_datetime()
352
357
  )
353
358
  kwargs['logs_period_ended_at'] = timezone.now()
354
359
 
355
360
  if kwargs['logs_period_started_at'] > kwargs['logs_period_ended_at']:
356
- kwargs['logs_period_started_at'] = kwargs['logs_period_ended_at'] - timedelta(
357
- seconds=RDM_TRANSFER_TASK_TIMEDELTA,
358
- )
361
+ kwargs['logs_period_started_at'] = last_model_start.get(manager_class.uuid)
359
362
 
360
363
  manager = manager_class(*args, logs=model_logs, **kwargs)
361
364
 
@@ -50,6 +50,9 @@ from educommon.async_task.models import (
50
50
  from educommon.utils.date import (
51
51
  get_today_max_datetime,
52
52
  )
53
+ from educommon.utils.seqtools import (
54
+ make_chunks,
55
+ )
53
56
  from function_tools.managers import (
54
57
  RunnerManager,
55
58
  )
@@ -339,9 +342,16 @@ class BaseExportLatestEntitiesData(BaseExportEntitiesData):
339
342
  ),
340
343
  )
341
344
 
342
- with atomic():
343
- for queryset in querysets_to_update:
344
- queryset.update(modified=now)
345
+ for queryset in querysets_to_update:
346
+ not_exported_model_ids = queryset.values_list('id', flat=True)
347
+
348
+ with atomic():
349
+
350
+ for model_ids in make_chunks(
351
+ iterable=not_exported_model_ids,
352
+ size=settings.RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE,
353
+ ):
354
+ queryset.filter(id__in=model_ids).update(modified=now)
345
355
 
346
356
  def _calculate_last_finished_entity_export(self) -> Dict[str, datetime]:
347
357
  """Находит левую границу экспорта данных для сущностей."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edu-rdm-integration
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: Интеграция с Региональной витриной данных
5
5
  Home-page:
6
6
  Download-URL:
@@ -138,6 +138,9 @@ Requires-Dist: uploader-client <1,>=0.2.1
138
138
 
139
139
  # Количество записей моделей обрабатываемых за одну итерацию экспорта данных
140
140
  RDM_EXPORT_CHUNK_SIZE = conf.get_int('rdm_general', 'EXPORT_CHUNK_SIZE')
141
+
142
+ # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified
143
+ RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE = conf.get_int('rdm_general', 'UPDATE_NON_EXPORTED_CHUNK_SIZE')
141
144
 
142
145
  # Настройка запуска периодической задачи выгрузки данных:
143
146
  RDM_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task', 'MINUTE')
@@ -181,6 +184,7 @@ Requires-Dist: uploader-client <1,>=0.2.1
181
184
  | UPLOADS | Основная директория в MEDIA, в которой будет создана директория edu_rdm_integration для сохранения файлов для дальнейшей выгрузки | 500 |
182
185
  | RDM_COLLECT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию сбора данных | 500 |
183
186
  | RDM_EXPORT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию экспорта | 500 |
187
+ | RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE | # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified | 5000 |
184
188
  | RDM_UPLOADER_CLIENT_URL | Адрес витрины (schema://host:port) | 'http://localhost:8090' |
185
189
  | RDM_UPLOADER_CLIENT_DATAMART_NAME | Мнемоника Витрины | 'test' |
186
190
  | RDM_UPLOADER_CLIENT_REQUEST_RETRIES | Количество повторных попыток запроса | 10 |
@@ -209,6 +213,8 @@ Requires-Dist: uploader-client <1,>=0.2.1
209
213
  EXPORT_CHUNK_SIZE = 500
210
214
  # Количество записей моделей ЭШ обрабатываемых за одну итерацию сбора данных
211
215
  COLLECT_CHUNK_SIZE = 500
216
+ # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified
217
+ UPDATE_NON_EXPORTED_CHUNK_SIZE = 5_000
212
218
 
213
219
  # Настройка запуска периодической задачи выгрузки данных
214
220
  [rdm_transfer_task]
@@ -289,6 +295,28 @@ Requires-Dist: uploader-client <1,>=0.2.1
289
295
  ### Удалено
290
296
 
291
297
 
298
+ ## [1.0.2] - 2024-03-06
299
+
300
+ Добавлено разбиение на чанки запроса на обновление поля modified у невыгруженных записей,
301
+ при запуске команды `export_latest_entities_data`.
302
+
303
+ ### Исправлено
304
+
305
+ - [EDUSCHL-21572](https://jira.bars.group/browse/EDUSCHL-21572)
306
+ PATCH Добавлено разбиение на чанки запроса на обновление в методе `_update_model_modified_field`
307
+ класса `BaseExportLatestEntitiesData`.
308
+
309
+
310
+ ## [1.0.1] - 2024-02-20
311
+
312
+ Исправлено ограничение сбора логов периодом `RDM_TRANSFER_TASK_TIMEDELTA` в `BaseCollectLatestModelsData`
313
+
314
+ ### Исправлено
315
+
316
+ - [EDUSCHL-21413](https://jira.bars.group/browse/EDUSCHL-21413)
317
+ PATCH Исправлено ограничение сбора логов периодом `RDM_TRANSFER_TASK_TIMEDELTA` в `BaseCollectLatestModelsData`
318
+
319
+
292
320
  ## [1.0.0] - 2024-01-31
293
321
 
294
322
  Удален дублирующийся клаcc `LogChange` из `collect_data.non_calculated.base.caches`.
@@ -1,6 +1,6 @@
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=kideEO9SvYU8RXPB-8hTVosL4bAspPHNHtyz-R0F7v4,1822
3
+ edu_rdm_integration/app_settings.py,sha256=PK-hjkGIwbSqgKdJKoTdryk6nt-OOGLIKSzPYXCzmYE,2056
4
4
  edu_rdm_integration/apps.py,sha256=5OgNdmuqe26fbu4wYb69haQJe-XFO_rDbnU1vPqJU-U,3571
5
5
  edu_rdm_integration/base.py,sha256=_G0qPTAXe6bXfgDHNiZMSsYt3sMuUhLKnHuQCWSFttU,1341
6
6
  edu_rdm_integration/consts.py,sha256=FFwcMHNsfjP_s9LfkccLAHjJMEMp7ppPmrRlJcgV88k,1104
@@ -31,7 +31,7 @@ edu_rdm_integration/adapters/strings.py,sha256=-k9dex8A7hCpkzUkudVkKRAbNRuuqog2h
31
31
  edu_rdm_integration/adapters/tests.py,sha256=MoRY-a75Ow-7EjeQYxkXWunwqTGuBMaUyEkEV2oy05I,59
32
32
  edu_rdm_integration/adapters/validators.py,sha256=LJWnCY8PtXDOj-fm3fBWjQYsHsSLfyKf_D97pqPv73s,496
33
33
  edu_rdm_integration/collect_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- edu_rdm_integration/collect_data/collect.py,sha256=Og_ZHdFFuVnQokZJBf9_uuWjndl7UWUDOs-DhSnpe-Q,14490
34
+ edu_rdm_integration/collect_data/collect.py,sha256=n73jmtVoJ-0VHShqL8Aqoo5TiOpcjJYIMY5YZ4Qtqxs,14499
35
35
  edu_rdm_integration/collect_data/generators.py,sha256=61DdPF8d0BRmvGJSYVA7wz3HmDpbbdStU4lBoJ0sUdY,9053
36
36
  edu_rdm_integration/collect_data/helpers.py,sha256=pthYW-ugOww5TveWxONYcJby2VwWG6goJwbdTkNdVUU,3009
37
37
  edu_rdm_integration/collect_data/tests.py,sha256=vAvNRe23ep2JsBcEE0VjoOqwgFN3QmKE552iZgvbWdM,5378
@@ -79,7 +79,7 @@ edu_rdm_integration/enum_register/mixins.py,sha256=shLb8-9ySoY9kK1Wzb46I9wRKglQI
79
79
  edu_rdm_integration/enum_register/register.py,sha256=5OWOjK-M0Erd_5CENpBaXhVtfL0pEaDl3Bev5QKNDJc,2218
80
80
  edu_rdm_integration/export_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
81
  edu_rdm_integration/export_data/consts.py,sha256=Z6Uho8oViMc0t1tyQFZfrPFBwPx6KnhUf_iZ0qgob8o,16
82
- edu_rdm_integration/export_data/export.py,sha256=Axij_T66EX7I_VjLeVaELuKharDNAVAWDsFlZpqf9EY,16879
82
+ edu_rdm_integration/export_data/export.py,sha256=m1C2gmpQb_Dlr9qtYplHSTJOtU-Ll1d9S5tzPGp73os,17231
83
83
  edu_rdm_integration/export_data/generators.py,sha256=yLDOcHB1PoilJwXtKGxZQhDjpeKBzEWoosahbJJ4Ba4,4020
84
84
  edu_rdm_integration/export_data/helpers.py,sha256=hU346RmQ17Ra2etFvxXI7JQlLyp_0KxH1jm-eeCqejc,2933
85
85
  edu_rdm_integration/export_data/strategies.py,sha256=ocHskG-x54U-ESX56OlZPgOibkGkuv7VKmK7hVmqj_0,6725
@@ -156,9 +156,9 @@ edu_rdm_integration/uploader_log/apps.py,sha256=tYJj4-sDlq8fLOSvw18L_yys7SILpTKW
156
156
  edu_rdm_integration/uploader_log/enums.py,sha256=rgSO3BL2rh2xpfm0Pt4waQW8fB1VMJLdsGmr3SXwH_U,266
157
157
  edu_rdm_integration/uploader_log/managers.py,sha256=y5wTSMzF9hpOpIU_A7nIafL_LBU3QEie6LAYWoB-pBQ,3203
158
158
  edu_rdm_integration/uploader_log/ui.py,sha256=YM9Buqp2wxE95Wf5gvAATBzuYzDOossK1sEmvFk07cI,2110
159
- edu_rdm_integration-1.0.0.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
160
- edu_rdm_integration-1.0.0.dist-info/METADATA,sha256=eUoptMk2T5qgxv3bDop9dYkuN_2qBjcY63MeXDD9sDU,53408
161
- edu_rdm_integration-1.0.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
162
- edu_rdm_integration-1.0.0.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
163
- edu_rdm_integration-1.0.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
164
- edu_rdm_integration-1.0.0.dist-info/RECORD,,
159
+ edu_rdm_integration-1.0.2.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
160
+ edu_rdm_integration-1.0.2.dist-info/METADATA,sha256=tND-Xftw5QICLhRSKrGcEZoZ3JV3sEfU50Rk5ebK9O0,55202
161
+ edu_rdm_integration-1.0.2.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
162
+ edu_rdm_integration-1.0.2.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
163
+ edu_rdm_integration-1.0.2.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
164
+ edu_rdm_integration-1.0.2.dist-info/RECORD,,