edu-rdm-integration 3.2.2__py3-none-any.whl → 3.2.7__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.
@@ -300,6 +300,13 @@ class BaseCollectLatestModelsData(BaseCollectModelsData):
300
300
  Сбор данных моделей РВД на основе логов за период с последней сборки до указанной даты.
301
301
  """
302
302
 
303
+ def __init__(self, *args, use_times_limit: bool = False, **kwargs):
304
+ super().__init__(*args, **kwargs)
305
+
306
+ # Если этот параметр не указан - то высчитываем временные рамки по менеджеру, не учитывая переданные
307
+ # logs_period_started_at и logs_period_ended_at
308
+ self.use_times_limit = use_times_limit
309
+
303
310
  def _has_stage_created_or_in_progress(self, manager_id: str, model: str) -> bool:
304
311
  """Проверяет есть ли готовый к работе stage или в работе для данной модели."""
305
312
  stage_created_or_in_progress = CollectingExportedDataStage.objects.filter(
@@ -318,22 +325,17 @@ class BaseCollectLatestModelsData(BaseCollectModelsData):
318
325
  """
319
326
  logger.info('collect models data..')
320
327
 
321
- managers_max_period_ended_dates = get_collecting_managers_max_period_ended_dates(
328
+ managers_last_period_ended_at = get_collecting_managers_max_period_ended_dates(
322
329
  self._collecting_data_managers.values()
323
330
  )
324
331
 
325
332
  for model_key, manager_class in self._collecting_data_managers.items():
326
333
  model_logs = logs.get(model_key) if logs else None
327
- manager_max_dates = managers_max_period_ended_dates.get(manager_class.uuid, {})
328
-
329
- kwargs['logs_period_started_at'] = (
330
- manager_max_dates.get('max_period_ended_at')
331
- or get_today_min_datetime()
332
- )
333
- kwargs['logs_period_ended_at'] = timezone.now()
334
+ manager_last_period_ended_at = managers_last_period_ended_at.get(manager_class.uuid)
334
335
 
335
- if kwargs['logs_period_started_at'] > kwargs['logs_period_ended_at']:
336
- kwargs['logs_period_started_at'] = manager_max_dates['max_started_at']
336
+ kwargs['logs_period_started_at'] = self.logs_period_started_at if self.use_times_limit else (
337
+ manager_last_period_ended_at or get_today_min_datetime())
338
+ kwargs['logs_period_ended_at'] = self.logs_period_ended_at if self.use_times_limit else timezone.now()
337
339
 
338
340
  manager = manager_class(*args, logs=model_logs, **kwargs)
339
341
 
@@ -367,19 +367,16 @@ class BaseExportLatestEntitiesData(BaseExportEntitiesData):
367
367
  # Массив с выгружаемыми сущностями для поля "Описание" в асинхронной задаче
368
368
  exported_entities = []
369
369
 
370
- managers_max_period_ended_dates = get_exporting_managers_max_period_ended_dates(
370
+ managers_max_period_ended = get_exporting_managers_max_period_ended_dates(
371
371
  self._exporting_data_managers
372
372
  )
373
373
 
374
374
  for manager_class in self._exporting_data_managers:
375
- manager_max_dates = managers_max_period_ended_dates.get(manager_class.uuid, {})
375
+ manager_last_exported = managers_max_period_ended.get(manager_class.uuid)
376
376
 
377
- kwargs['period_started_at'] = manager_max_dates.get('max_period_ended_at') or timezone.now()
377
+ kwargs['period_started_at'] = manager_last_exported or timezone.now()
378
378
  kwargs['period_ended_at'] = get_today_max_datetime()
379
379
 
380
- if kwargs['period_started_at'] > kwargs['period_ended_at']:
381
- kwargs['period_started_at'] = manager_max_dates['max_started_at']
382
-
383
380
  # Обновить поля modified у модели сущности:
384
381
  self._update_model_modified_field(
385
382
  manager_id=manager_class.uuid,
@@ -25,11 +25,13 @@ from django.db import (
25
25
  )
26
26
  from django.db.models import (
27
27
  CharField,
28
- Max,
28
+ OuterRef,
29
29
  QuerySet,
30
+ Subquery,
30
31
  )
31
32
  from django.db.models.functions import (
32
33
  Cast,
34
+ Least,
33
35
  )
34
36
 
35
37
  from educommon import (
@@ -304,51 +306,49 @@ def save_command_log_link(
304
306
 
305
307
  def get_collecting_managers_max_period_ended_dates(
306
308
  collecting_managers: Iterable['BaseCollectingExportedDataRunnerManager'],
307
- ) -> Dict[str, Dict[str, 'datetime']]:
308
- """Возвращает даты и времени последнего успешного этапа сбора для менеджеров Функций сбора."""
309
- managers_max_period_ended_dates = CollectingExportedDataStage.objects.filter(
310
- status_id=CollectingDataStageStatus.FINISHED.key,
309
+ ) -> Dict[str, 'datetime']:
310
+ """Возвращает дату и время завершения последнего успешного этапа сбора для менеджеров Функций сбора."""
311
+ managers_last_period_ended = CollectingExportedDataStage.objects.filter(
311
312
  manager_id__in=[manager.uuid for manager in collecting_managers],
312
- ).values(
313
- 'manager_id',
313
+ id=Subquery(
314
+ CollectingExportedDataStage.objects.filter(
315
+ manager_id=OuterRef('manager_id'),
316
+ status_id=CollectingDataStageStatus.FINISHED.key,
317
+ ).order_by('-id').values('id')[:1]
318
+ ),
314
319
  ).annotate(
315
320
  str_manager_id=Cast('manager_id', output_field=CharField()),
316
- max_period_ended_at=Max('logs_period_ended_at'),
317
- max_started_at=Max('started_at'),
321
+ last_period_ended_at=Least('logs_period_ended_at', 'started_at'),
318
322
  ).values_list(
319
- 'str_manager_id', 'max_period_ended_at', 'max_started_at',
323
+ 'str_manager_id', 'last_period_ended_at',
320
324
  )
321
325
 
322
326
  return {
323
- manager_id: {
324
- 'max_period_ended_at': max_period_ended_at,
325
- 'max_started_at': max_started_at,
326
- }
327
- for manager_id, max_period_ended_at, max_started_at in managers_max_period_ended_dates
327
+ manager_id: last_period_ended_at
328
+ for manager_id, last_period_ended_at in managers_last_period_ended
328
329
  }
329
330
 
330
331
 
331
332
  def get_exporting_managers_max_period_ended_dates(
332
333
  exporting_managers: Iterable['BaseExportDataRunnerManager'],
333
- ) -> Dict[str, Dict[str, 'datetime']]:
334
- """Возвращает даты и времени последнего успешного этапа экспорта для менеджеров Функций экспорта."""
335
- managers_max_period_ended_dates = ExportingDataStage.objects.filter(
336
- status_id=ExportingDataStageStatus.FINISHED.key,
334
+ ) -> Dict[str, 'datetime']:
335
+ """Возвращает дату и время последнего успешного этапа экспорта для менеджеров Функций экспорта."""
336
+ managers_last_period_ended = ExportingDataStage.objects.filter(
337
337
  manager_id__in=[manager.uuid for manager in exporting_managers],
338
- ).values(
339
- 'manager_id',
338
+ id=Subquery(
339
+ ExportingDataStage.objects.filter(
340
+ manager_id=OuterRef('manager_id'),
341
+ status_id=ExportingDataStageStatus.FINISHED.key,
342
+ ).order_by('-id').values('id')[:1]
343
+ ),
340
344
  ).annotate(
341
345
  str_manager_id=Cast('manager_id', output_field=CharField()),
342
- max_period_ended_at=Max('period_ended_at'),
343
- max_started_at=Max('started_at'),
346
+ last_period_ended_at=Least('period_ended_at', 'started_at'),
344
347
  ).values_list(
345
- 'str_manager_id', 'max_period_ended_at', 'max_started_at',
348
+ 'str_manager_id', 'last_period_ended_at',
346
349
  )
347
350
 
348
351
  return {
349
- manager_id: {
350
- 'max_period_ended_at': max_period_ended_at,
351
- 'max_started_at': max_started_at,
352
- }
353
- for manager_id, max_period_ended_at, max_started_at in managers_max_period_ended_dates
352
+ manager_id: last_period_ended_at
353
+ for manager_id, last_period_ended_at in managers_last_period_ended
354
354
  }
@@ -0,0 +1,21 @@
1
+ # Generated by Django 3.1.14 on 2024-07-24 09:14
2
+
3
+ from django.db import (
4
+ migrations,
5
+ models,
6
+ )
7
+
8
+
9
+ class Migration(migrations.Migration):
10
+
11
+ dependencies = [
12
+ ('edu_rdm_integration', '0008_transferredentity'),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AddField(
17
+ model_name='transferredentity',
18
+ name='export_enabled',
19
+ field=models.BooleanField(default=True, verbose_name='Включение экспорта для сущности'),
20
+ ),
21
+ ]
@@ -34,6 +34,9 @@ from django.utils import (
34
34
  from django.utils.functional import (
35
35
  cached_property,
36
36
  )
37
+ from m3 import (
38
+ json_encode,
39
+ )
37
40
  from m3.db import (
38
41
  BaseObjectModel,
39
42
  )
@@ -906,8 +909,16 @@ class TransferredEntity(BaseObjectModel):
906
909
  verbose_name='Сущность',
907
910
  on_delete=CASCADE,
908
911
  )
912
+ export_enabled = BooleanField(
913
+ verbose_name='Включение экспорта для сущности',
914
+ default=True,
915
+ )
909
916
 
910
917
  class Meta:
911
918
  db_table = 'rdm_transferred_entity'
912
919
  verbose_name = 'Сущность, по которой должен быть произведен сбор и экспорт данных'
913
920
  verbose_name_plural = 'Сущности, по которым должен быть произведен сбор и экспорт данных'
921
+
922
+ @json_encode
923
+ def no_export(self):
924
+ return 'Нет' if self.export_enabled else 'Да'
@@ -17,6 +17,9 @@ from edu_rdm_integration.models import (
17
17
  RegionalDataMartEntityEnum,
18
18
  TransferredEntity,
19
19
  )
20
+ from edu_rdm_integration.registry.ui import (
21
+ TransferredEntityListWindow,
22
+ )
20
23
 
21
24
 
22
25
  class EntitySelectPack(ObjectPack):
@@ -65,6 +68,25 @@ class TransferredEntityAddWindowAction(SelectorWindowAction):
65
68
  return win
66
69
 
67
70
 
71
+ class TransferredEntityExportChangeAction(BaseAction):
72
+ """Экшен смены статуса экспорта выбранных сущностей."""
73
+
74
+ def context_declaration(self):
75
+ """Объявляет контекст экшна."""
76
+ return {
77
+ 'ids': {'type': 'int_list', 'default': []},
78
+ 'export_enabled': {'type': 'boolean', 'default': True}
79
+ }
80
+
81
+ def run(self, request, context):
82
+ """Обеспечивает выполнение запроса."""
83
+ self.parent.model.objects.filter(
84
+ id__in=context.ids
85
+ ).update(export_enabled=context.export_enabled)
86
+
87
+ return OperationResult(success=True)
88
+
89
+
68
90
  class TransferredEntitySaveAction(BaseAction):
69
91
  """Экшн сохранения выбранных сущностей для сбора и экспорта данных."""
70
92
 
@@ -95,6 +117,7 @@ class TransferredEntityPack(ObjectPack):
95
117
  list_sort_order = ('entity__order_number', )
96
118
 
97
119
  need_check_permission = True
120
+ list_window = TransferredEntityListWindow
98
121
 
99
122
  columns = [
100
123
  {
@@ -105,6 +128,10 @@ class TransferredEntityPack(ObjectPack):
105
128
  'data_index': 'entity.title',
106
129
  'header': 'Описание',
107
130
  },
131
+ {
132
+ 'data_index': 'no_export',
133
+ 'header': 'Отключение экспорта',
134
+ }
108
135
  ]
109
136
 
110
137
  def __init__(self):
@@ -116,6 +143,10 @@ class TransferredEntityPack(ObjectPack):
116
143
  self.save_entity_action = TransferredEntitySaveAction()
117
144
  self.replace_action('save_action', self.save_entity_action)
118
145
 
146
+ self.export_change_action = TransferredEntityExportChangeAction()
147
+
148
+ self.actions.append(self.export_change_action)
149
+
119
150
  def configure_grid(self, grid, *args, **kwargs):
120
151
  """Конфигурирует грид."""
121
152
  super().configure_grid(grid, *args, **kwargs)
@@ -0,0 +1,39 @@
1
+ from objectpack.ui import (
2
+ BaseListWindow,
3
+ )
4
+ from m3_ext.ui.all_components import (
5
+ ExtButton,
6
+ )
7
+ from educommon.utils.ui import (
8
+ append_template_globals,
9
+ )
10
+
11
+ class TransferredEntityListWindow(BaseListWindow):
12
+ """Окно реестра сущностей для сбора и экспорта данных."""
13
+
14
+ def _init_components(self):
15
+ """Инициализация компонентов окна."""
16
+ super()._init_components()
17
+
18
+ self.export_off_button = ExtButton(
19
+ text='Отключить экспорт', handler='offExport'
20
+ )
21
+ self.export_on_button = ExtButton(
22
+ text='Включить экспорт', handler='onExport'
23
+ )
24
+
25
+ def _do_layout(self):
26
+ """Размещение компонентов окна на форме."""
27
+ super()._do_layout()
28
+
29
+ self.grid.top_bar.items.extend((self.export_off_button, self.export_on_button))
30
+
31
+ def set_params(self, params, *args, **kwargs):
32
+ """Настройка окна."""
33
+ super().set_params(params, *args, **kwargs)
34
+
35
+ append_template_globals(self, 'ui-js/transferred-entity-list.js')
36
+ self.export_change_action_url = (
37
+ params['pack'].export_change_action.get_absolute_url()
38
+ )
39
+ self.pack = params['pack']
@@ -1,6 +1,3 @@
1
- from itertools import (
2
- chain,
3
- )
4
1
  from typing import (
5
2
  TYPE_CHECKING,
6
3
  Dict,
@@ -18,16 +15,10 @@ from celery.schedules import (
18
15
  from django.conf import (
19
16
  settings,
20
17
  )
21
- from django.db.models import (
22
- CharField,
23
- Max,
24
- )
25
- from django.db.models.functions import (
26
- Cast,
27
- )
28
18
  from django.utils import (
29
19
  timezone,
30
20
  )
21
+
31
22
  from educommon.async_task.locker import (
32
23
  TaskLocker,
33
24
  )
@@ -71,9 +62,9 @@ from edu_rdm_integration.export_data.helpers import (
71
62
  set_failed_status_suspended_exporting_data_stages,
72
63
  )
73
64
  from edu_rdm_integration.helpers import (
65
+ UploadStatusHelper,
74
66
  get_collecting_managers_max_period_ended_dates,
75
67
  get_exporting_managers_max_period_ended_dates,
76
- UploadStatusHelper,
77
68
  save_command_log_link,
78
69
  )
79
70
  from edu_rdm_integration.models import (
@@ -85,6 +76,7 @@ from edu_rdm_integration.storages import (
85
76
  RegionalDataMartEntityStorage,
86
77
  )
87
78
 
79
+
88
80
  if TYPE_CHECKING:
89
81
  from datetime import (
90
82
  datetime,
@@ -230,17 +222,17 @@ class TransferLatestEntitiesDataPeriodicTask(UniquePeriodicAsyncTask):
230
222
  pk=self.request.id,
231
223
  ).values_list('pk', flat=True).first()
232
224
 
233
- model_enum_values = RegionalDataMartEntityEnum.get_entities_model_enums(
234
- entity_enums=self._transferred_entities,
235
- is_sorted=True,
236
- )
237
-
238
- filtered_model_enum_values = filter(lambda model: model.order_number != DEFAULT_ORDER_NUMBER, model_enum_values)
239
- for model_enum_value in filtered_model_enum_values:
240
- self._run_collect_model_data(model_enum_value.key, task_id)
225
+ for entity_data in self._transferred_entities:
226
+ for model_enum_value in entity_data['collected_models']:
227
+ self._run_collect_model_data(model_enum_value.key, task_id)
241
228
 
242
- for entity_enum_value in sorted(self._transferred_entities, key=lambda entity: entity.order_number):
243
- self._run_export_entity_data(entity_enum_value.key, task_id)
229
+ # Перехватывем ошибку экспорта для того, чтобы не останавливать сборку и экспорт остальных сущностей
230
+ try:
231
+ entity_enum_value = entity_data['exported_entity']
232
+ if entity_enum_value:
233
+ self._run_export_entity_data(entity_enum_value.key, task_id)
234
+ except Exception:
235
+ continue
244
236
 
245
237
  def _run_collect_model_data(self, model: str, task_id: str) -> None:
246
238
  """Запускает сбор данных модели РВД."""
@@ -263,10 +255,24 @@ class TransferLatestEntitiesDataPeriodicTask(UniquePeriodicAsyncTask):
263
255
 
264
256
  def _collect_transferred_entities(self) -> None:
265
257
  """Собирает сущности РВД, по которым будет произведен сбор и экспорт данных."""
266
- self._transferred_entities = [
267
- RegionalDataMartEntityEnum.get_model_enum_value(key=entity)
268
- for entity in TransferredEntity.objects.values_list('entity', flat=True)
258
+ entities = [
259
+ (RegionalDataMartEntityEnum.get_model_enum_value(key=entity), export_enabled)
260
+ for entity, export_enabled in TransferredEntity.objects.values_list('entity', 'export_enabled')
269
261
  ]
262
+ collected_entity_models = set()
263
+ # Собираем словарь по сущностям с учетом порядка выгрузки
264
+ for entity_enum, export_enabled in sorted(
265
+ entities, key=lambda entity: entity[0].order_number):
266
+ model_enums = [
267
+ model_enum for model_enum in (entity_enum.main_model_enum, *entity_enum.additional_model_enums)
268
+ if (model_enum not in collected_entity_models and model_enum.order_number != DEFAULT_ORDER_NUMBER)
269
+ ]
270
+ entity_data = {
271
+ 'collected_models': model_enums,
272
+ 'exported_entity': entity_enum if export_enabled else None,
273
+ }
274
+ self._transferred_entities.append(entity_data)
275
+ collected_entity_models.update(model_enums)
270
276
 
271
277
  def _collect_managers(self) -> None:
272
278
  """Собирает менеджеры Функций для сбора и выгрузки данных."""
@@ -281,14 +287,16 @@ class TransferLatestEntitiesDataPeriodicTask(UniquePeriodicAsyncTask):
281
287
  )
282
288
 
283
289
  for transferred_entity in self._transferred_entities:
284
- for model in chain((transferred_entity.main_model_enum, ), transferred_entity.additional_model_enums):
290
+ for model in transferred_entity['collected_models']:
285
291
  collect_manager_class = collecting_models_data_managers_map.get(model.key)
286
292
  if collect_manager_class:
287
293
  self._collecting_data_managers[model.key] = collect_manager_class
288
294
 
289
- export_manager_class = exporting_entities_data_managers_map.get(transferred_entity.key)
290
- if export_manager_class:
291
- self._exporting_data_managers[transferred_entity.key] = export_manager_class
295
+ entity = transferred_entity['exported_entity']
296
+ if entity:
297
+ export_manager_class = exporting_entities_data_managers_map.get(entity.key)
298
+ if export_manager_class:
299
+ self._exporting_data_managers[entity.key] = export_manager_class
292
300
 
293
301
  def _calculate_collecting_managers_logs_period_ended_at(self) -> None:
294
302
  """Определяет дату последнего успешного этапа сбора у менеджеров Функций сбора."""
@@ -310,12 +318,9 @@ class TransferLatestEntitiesDataPeriodicTask(UniquePeriodicAsyncTask):
310
318
  or get_today_min_datetime()
311
319
  )
312
320
 
313
- period_started_at = manager_last_collected['max_period_ended_at']
321
+ period_started_at = manager_last_collected
314
322
  period_ended_at = timezone.now()
315
323
 
316
- if period_started_at >= period_ended_at:
317
- period_started_at = manager_last_collected['max_started_at']
318
-
319
324
  return EduRdmCollectDataCommandProgress.objects.create(
320
325
  model_id=model,
321
326
  logs_period_started_at=period_started_at,
@@ -330,12 +335,9 @@ class TransferLatestEntitiesDataPeriodicTask(UniquePeriodicAsyncTask):
330
335
  manager_last_exported = self._exporting_data_manager_to_period_end.get(manager.uuid)
331
336
 
332
337
  if manager_last_exported:
333
- period_started_at = manager_last_exported['max_period_ended_at']
338
+ period_started_at = manager_last_exported
334
339
  period_ended_at = timezone.now()
335
340
 
336
- if period_started_at >= period_ended_at:
337
- period_started_at = manager_last_exported['max_started_at']
338
-
339
341
  return EduRdmExportDataCommandProgress.objects.create(
340
342
  entity_id=entity,
341
343
  period_started_at=period_started_at,
@@ -354,6 +356,7 @@ class TransferLatestEntitiesDataPeriodicTask(UniquePeriodicAsyncTask):
354
356
  logs_period_started_at=command.logs_period_started_at,
355
357
  logs_period_ended_at=command.logs_period_ended_at,
356
358
  command_id=command.id,
359
+ use_times_limit=True,
357
360
  )
358
361
 
359
362
  def _prepare_export_entity_data_class(self, command: EduRdmExportDataCommandProgress) -> ExportLatestEntitiesData:
@@ -0,0 +1,37 @@
1
+ var grid = Ext.getCmp('{{component.grid.client_id}}');
2
+
3
+ function changeExport(bool_value){
4
+ var selections = grid.selModel.getSelections();
5
+ var selections_len = selections.length;
6
+
7
+ if (selections_len){
8
+ var selected_ids = [];
9
+ for (var i = 0; i < selections_len; i += 1) {
10
+ selected_ids.push(selections[i].id);
11
+ }
12
+ var params = {'export_enabled': bool_value};
13
+ params['ids'] = selected_ids.join(',');
14
+ Ext.Ajax.request({
15
+ url: '{{component.export_change_action_url}}',
16
+ method: 'POST',
17
+ params: params,
18
+ success: function(res, opt){
19
+ if (Ext.util.JSON.decode(res.responseText).success) {
20
+ grid.refreshStore();
21
+ }
22
+ smart_eval(res.responseText);
23
+ },
24
+ failure: Ext.emptyFn
25
+ });
26
+ } else {
27
+ Ext.Msg.alert('Внимание!', 'Выберите Сущность для выключения экспорта!');
28
+ }
29
+ }
30
+
31
+ function offExport(){
32
+ changeExport(false)
33
+ }
34
+
35
+ function onExport(){
36
+ changeExport(true)
37
+ }
@@ -0,0 +1,185 @@
1
+ function onObjGridAction(grid, actionUrl) {
2
+ assert(grid, 'grid is not define');
3
+ assert(actionUrl, 'actionUrl is not define');
4
+ var mask = new Ext.LoadMask(grid.body),
5
+ params = grid.getMainContext();
6
+ params[grid.rowIdName] = '';
7
+ params = Ext.apply(params, getGridParams(grid));
8
+
9
+ grid.getStore()
10
+
11
+ var req = {
12
+ url: actionUrl,
13
+ params: params,
14
+ success: function(res, opt){
15
+ if (scope.fireEvent('afternewrequest', scope, res, opt)) {
16
+ try {
17
+ var child_win = scope.onNewRecordWindowOpenHandler(res, opt);
18
+ } finally {
19
+ mask.hide();
20
+ }
21
+ return child_win;
22
+ }
23
+ mask.hide();
24
+ }
25
+ ,failure: function(){
26
+ uiAjaxFailMessage.apply(this, arguments);
27
+ mask.hide();
28
+
29
+ }
30
+ };
31
+
32
+ if (grid.fireEvent('beforenewrequest', grid, req)) {
33
+ var scope = grid;
34
+
35
+ mask.show();
36
+ Ext.Ajax.request(req);
37
+ }
38
+ }
39
+
40
+ function onObjGridOneRecordAction(grid, actionName, actionUrl) {
41
+ assert(grid, 'grid is not define');
42
+ assert(actionName, 'actionName is not define');
43
+ assert(actionUrl, 'actionUrl is not define');
44
+ assert(grid.rowIdName, 'rowIdName is not define');
45
+
46
+ if (grid.getSelectionModel().hasSelection()) {
47
+ // при локальном редактировании запросим также текущую строку
48
+ var baseConf = grid.getSelectionContext(grid.localEdit);
49
+ // грязный хак
50
+ if (String(baseConf[grid.rowIdName]).indexOf(",") != -1) {
51
+ Ext.Msg.show({
52
+ title: actionName,
53
+ msg: 'Для выполнения действия должен быть выбран только один элемент.',
54
+ buttons: Ext.Msg.OK,
55
+ icon: Ext.MessageBox.INFO
56
+ });
57
+ } else {
58
+ var mask = new Ext.LoadMask(grid.body);
59
+ var req = {
60
+ url: actionUrl,
61
+ params: baseConf,
62
+ success: function(res, opt){
63
+ if (scope.fireEvent('aftereditrequest', scope, res, opt)) {
64
+ try {
65
+ var child_win = scope.onEditRecordWindowOpenHandler(res, opt);
66
+ } finally {
67
+ mask.hide();
68
+ }
69
+ return child_win;
70
+ }
71
+ mask.hide();
72
+ }
73
+ ,failure: function(){
74
+ uiAjaxFailMessage.apply(this, arguments);
75
+ mask.hide();
76
+ }
77
+ };
78
+
79
+ if (grid.fireEvent('beforeeditrequest', grid, req)) {
80
+ var scope = grid;
81
+
82
+ mask.show();
83
+ Ext.Ajax.request(req);
84
+ }
85
+ }
86
+ } else {
87
+ Ext.Msg.show({
88
+ title: actionName,
89
+ msg: 'Элемент не выбран',
90
+ buttons: Ext.Msg.OK,
91
+ icon: Ext.MessageBox.INFO
92
+ });
93
+ }
94
+ }
95
+
96
+ function onObjGridMultiRecordAction(
97
+ grid, actionName, actionUrl, isConfirmRequired
98
+ ) {
99
+ assert(grid, 'grid is not define');
100
+ assert(actionName, 'actionName is not define');
101
+ assert(actionUrl, 'actionUrl is not define');
102
+ assert(grid.rowIdName, 'rowIdName is not define');
103
+
104
+ var scope = grid;
105
+ if (scope.getSelectionModel().hasSelection()) {
106
+ var request = function(btn, text, opt){
107
+ if (btn === 'yes') {
108
+ var baseConf = scope.getSelectionContext(scope.localEdit);
109
+ var mask = new Ext.LoadMask(scope.body);
110
+ var req = {
111
+ url: actionUrl,
112
+ params: baseConf,
113
+ success: function(res, opt){
114
+ if (scope.fireEvent('afterdeleterequest', scope, res, opt)) {
115
+ try {
116
+ var child_win = scope.deleteOkHandler(res, opt);
117
+ } finally {
118
+ mask.hide();
119
+ }
120
+ return child_win;
121
+ }
122
+ mask.hide();
123
+ }
124
+ ,failure: function(){
125
+ uiAjaxFailMessage.apply(this, arguments);
126
+ mask.hide();
127
+ }
128
+ };
129
+ if (scope.fireEvent('beforedeleterequest', scope, req)) {
130
+
131
+ mask.show();
132
+ Ext.Ajax.request(req);
133
+ }
134
+ }
135
+ }
136
+ if (isConfirmRequired) {
137
+ Ext.Msg.show({
138
+ title: actionName,
139
+ msg: 'Вы действительно хотите выполнить '
140
+ + actionName + 'для выбранной записи?',
141
+ icon: Ext.Msg.QUESTION,
142
+ buttons: Ext.Msg.YESNO,
143
+ fn: request
144
+ });
145
+ }
146
+ else {
147
+ request('yes');
148
+ }
149
+ } else {
150
+ Ext.Msg.show({
151
+ title: actionName,
152
+ msg: 'Элемент не выбран',
153
+ buttons: Ext.Msg.OK,
154
+ icon: Ext.MessageBox.INFO
155
+ });
156
+ }
157
+ }
158
+
159
+ function getGridParams(grid) {
160
+ var options = {};
161
+ if (grid.allowPaging) {
162
+ var pagingBar = grid.getBottomToolbar();
163
+ if(pagingBar && pagingBar instanceof Ext.PagingToolbar){
164
+ var o = {}, pp = pagingBar.getParams();
165
+ o[pp.start] = (
166
+ (Math.ceil((
167
+ pagingBar.cursor + pagingBar.pageSize
168
+ ) / pagingBar.pageSize) - 1) * pagingBar.pageSize
169
+ ).constrain(0, pagingBar.store.getTotalCount());
170
+ o[pp.limit] = pagingBar.pageSize;
171
+ options = Ext.apply(options, o);
172
+ }
173
+ }
174
+
175
+ var store = grid.getStore();
176
+ options = Ext.apply(options, store.baseParams);
177
+
178
+ if (store.sortInfo && store.remoteSort) {
179
+ var sp = store.paramNames;
180
+ options[sp.sort] = store.sortInfo.field;
181
+ options[sp.dir] = store.sortInfo.direction;
182
+ }
183
+
184
+ return options;
185
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edu-rdm-integration
3
- Version: 3.2.2
3
+ Version: 3.2.7
4
4
  Summary: Интеграция с Региональной витриной данных
5
5
  Home-page:
6
6
  Download-URL:
@@ -301,6 +301,48 @@ Requires-Dist: uploader-client <1,>=0.2.1
301
301
 
302
302
  ### Удалено
303
303
 
304
+ ## 3.2.7 - 2024-07-31
305
+ Исправлен файл MANIFEST.in для включения в сборку js-шаблонов.
306
+
307
+ ### Изменено
308
+ - [EDUSCHL-21965](https://jira.bars.group/browse/EDUSCHL-21965)
309
+ PATCH Добавлено включение js-шаблонов в сборку в файл MANIFEST.in
310
+
311
+ ## 3.2.6 - 2024-07-23
312
+ Добавлен параметр export_off (Отключение экспорта для сущности) в модель TransferredEntity
313
+ Изменен порядок запуска сбора и экспорта по сущностям в периодической задаче TransferLatestEntitiesDataPeriodicTask
314
+
315
+ ### Изменено
316
+ - [EDUSCHL-21965](https://jira.bars.group/browse/EDUSCHL-21965)
317
+ PATCH Добавлен параметр export_off в модель TransferredEntity и изменен порядок запуска сбора и экспорта в
318
+ TransferLatestEntitiesDataPeriodicTask.
319
+
320
+
321
+ ## 3.2.5 - 2024-07-16
322
+ Добавлен параметр use_times_limit в BaseCollectLatestModelsData для использования переданных параметров logs_period_started_at и logs_period_ended_at
323
+
324
+ ### Изменено
325
+ - [EDUSCHL-22070](https://jira.bars.group/browse/EDUSCHL-22070)
326
+ PATCH Добавлен параметр use_times_limit в BaseCollectLatestModelsData для использования переданных параметров logs_period_started_at и logs_period_ended_at
327
+
328
+ ## 3.2.4 - 2024-07-16
329
+ Внесены корректировки в запросы используемые в функциях get_collecting_managers_max_period_ended_dates и get_exporting_managers_max_period_ended_dates.
330
+
331
+ ### Изменено
332
+ - [EDUSCHL-22217](https://jira.bars.group/browse/EDUSCHL-22217)
333
+ PATCH Внесены корректировки в запросы используемые в функциях get_collecting_managers_max_period_ended_dates и get_exporting_managers_max_period_ended_dates.
334
+ В подзапросах отсутствовало условие фильтрации по статусу.
335
+
336
+
337
+ ## 3.2.3 - 2024-06-06
338
+ Внесены корректировки в запросы используемые в функциях get_collecting_managers_max_period_ended_dates и get_exporting_managers_max_period_ended_dates.
339
+
340
+ ### Изменено
341
+ - [EDUSCHL-21804](https://jira.bars.group/browse/EDUSCHL-21804)
342
+ PATCH Внесены корректировки в запросы используемые в функциях get_collecting_managers_max_period_ended_dates и get_exporting_managers_max_period_ended_dates.
343
+ Дата и время окончания предыдущего сбора/экспорта могла быть не корректно определена.
344
+
345
+
304
346
  ## 3.2.2 - 2024-05-21
305
347
  Изменения в переодической задаче TransferLatestEntitiesDataPeriodicTask,
306
348
  Изменено определение даты последнего успешного этапа сбора у менеджеров Функций сбора и экспорта.
@@ -6,12 +6,12 @@ edu_rdm_integration/base.py,sha256=_G0qPTAXe6bXfgDHNiZMSsYt3sMuUhLKnHuQCWSFttU,1
6
6
  edu_rdm_integration/consts.py,sha256=FFwcMHNsfjP_s9LfkccLAHjJMEMp7ppPmrRlJcgV88k,1104
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
- edu_rdm_integration/helpers.py,sha256=pGgefbVCsi4-qb4KTy8ONV3gVNKx-FiJibFkK6hKzMM,13725
9
+ edu_rdm_integration/helpers.py,sha256=EGufjIdrww3w2QjVn6ufM9mjruxNkHNu_KCzXct7Fa4,13733
10
10
  edu_rdm_integration/mapping.py,sha256=bwa2fJCbV4YjQcAgRrgT3hgM6dJhr_uBtQgx3L3F2Ck,473
11
- edu_rdm_integration/models.py,sha256=Wg8NYj4C6Xqw-15AsQGU0TWNzUjdwBW_YZDzmPqx3GY,29327
11
+ edu_rdm_integration/models.py,sha256=Q6BxMUlKmqLBwoJFB0aefD9uE4F3D2fncFqTEKBsOSA,29612
12
12
  edu_rdm_integration/signals.py,sha256=3eRlpkDcFCF6TN80-QM8yBYLcyozzcmoPjz6r4_ApWg,73
13
13
  edu_rdm_integration/storages.py,sha256=o5WqUG7SnkeuMt-z8spUi-IraivST-7KHzfY-M3v7FA,6807
14
- edu_rdm_integration/tasks.py,sha256=LPbEbfRtEwYlfneLrMvE3EnyN0B52qwnwMUEAIFgQDs,14998
14
+ edu_rdm_integration/tasks.py,sha256=fK4aRyYHexkgEzEd7_r0522EM8vYqh0KKzkmhRjcqmc,15505
15
15
  edu_rdm_integration/utils.py,sha256=-my8q9fude6Nc9r_qUDww-8QaU2tcv-xOexewYqOPJw,10369
16
16
  edu_rdm_integration/adapters/__init__.py,sha256=cU0swn4Ny5ZQz5buWRcWsT1mpWuUFJaUlHf2l7TtEBo,83
17
17
  edu_rdm_integration/adapters/apps.py,sha256=TyJTkSPs2qAHJ11fqbwLGk3Ea7ujtqWwbxqmvYNQxG8,363
@@ -37,7 +37,7 @@ edu_rdm_integration/collect_and_export_data/utils.py,sha256=lBWqqhLgMyz2IQN7r9zu
37
37
  edu_rdm_integration/collect_and_export_data/migrations/0001_initial.py,sha256=UkoaXzh3tokZ8QdCdB09v3rRZfcHhvEwNMuj3mQIB74,4714
38
38
  edu_rdm_integration/collect_and_export_data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  edu_rdm_integration/collect_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- edu_rdm_integration/collect_data/collect.py,sha256=i5kf__jrlBOIZC2rRD-CHXn2HeAKWpQXrqxQg-fk94M,13596
40
+ edu_rdm_integration/collect_data/collect.py,sha256=Qcg0zL3a5MIFuuwW4k5gTD9r_m19ZCmihwwJdt0gPyc,13913
41
41
  edu_rdm_integration/collect_data/generators.py,sha256=f34AAwdEcQNIokX0ypqYgjRD1XolwBVLER_HYv9ibNw,9075
42
42
  edu_rdm_integration/collect_data/helpers.py,sha256=gAFZAm9YhMtQhvlwSF3LMthPPa8LsqG_zbVe7vnW_Ag,2995
43
43
  edu_rdm_integration/collect_data/tests.py,sha256=-UNX3-GL0H9i89GXRfICT0ABltn_9aN_I_cmn1gQcDA,5367
@@ -85,7 +85,7 @@ edu_rdm_integration/enum_register/mixins.py,sha256=nmHue9-9bqKZn9_MFiL0E-5wBUBIZ
85
85
  edu_rdm_integration/enum_register/register.py,sha256=5OWOjK-M0Erd_5CENpBaXhVtfL0pEaDl3Bev5QKNDJc,2218
86
86
  edu_rdm_integration/export_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  edu_rdm_integration/export_data/consts.py,sha256=Z6Uho8oViMc0t1tyQFZfrPFBwPx6KnhUf_iZ0qgob8o,16
88
- edu_rdm_integration/export_data/export.py,sha256=AAN_DqOAPENKEtlbnMF2j4CPmkoy57vJQ8t2yQRZtrM,16595
88
+ edu_rdm_integration/export_data/export.py,sha256=3d1POl4xzyh4GVXJYdkXkcyfiUIqsrlPKPO-apw30Uk,16405
89
89
  edu_rdm_integration/export_data/generators.py,sha256=yLDOcHB1PoilJwXtKGxZQhDjpeKBzEWoosahbJJ4Ba4,4020
90
90
  edu_rdm_integration/export_data/helpers.py,sha256=hU346RmQ17Ra2etFvxXI7JQlLyp_0KxH1jm-eeCqejc,2933
91
91
  edu_rdm_integration/export_data/strategies.py,sha256=ocHskG-x54U-ESX56OlZPgOibkGkuv7VKmK7hVmqj_0,6725
@@ -153,18 +153,22 @@ edu_rdm_integration/migrations/0005_auto_20231204_1224.py,sha256=YXWiwTImGg8FAO_
153
153
  edu_rdm_integration/migrations/0006_request_status_data.py,sha256=g5JZtP0q0fOrbKCooGmCeGgtcqd9ZLIBP56h-ZH8IS8,3448
154
154
  edu_rdm_integration/migrations/0007_delete_upload_status.py,sha256=GAQKX6N1vDDWiCTXLGg--0gzLQr7VveAPFYzC9QpUpU,457
155
155
  edu_rdm_integration/migrations/0008_transferredentity.py,sha256=rE5av85AIYKGDy7nuFKLrHAhj0uaeUTRsFfIsXPtaxo,1427
156
+ edu_rdm_integration/migrations/0009_transferredentity_export_enabled.py,sha256=xCCtmkl3PQ0o-AgiZEK3UUOvNnzcuTpSp8ViRm3KpnI,506
156
157
  edu_rdm_integration/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
158
  edu_rdm_integration/registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
- edu_rdm_integration/registry/actions.py,sha256=y84gsGz-ZpkOdG85dNwk-J3zmPeEqp894K55puJNDiI,4146
159
+ edu_rdm_integration/registry/actions.py,sha256=YUtCkpcc3DedM_x8rwJ6Aos-8HKkDCrOUdKnGhztfUU,5223
160
+ edu_rdm_integration/registry/ui.py,sha256=9iYHVyl3bvrbyQV4nFmSW4qo2HAVGHHmFOl9s0qLSWY,1327
161
+ edu_rdm_integration/templates/ui-js/transferred-entity-list.js,sha256=IWEZ9JoTxD5-CLic5v07XHWW0iGRWk-cjeGVSzU4yKg,1117
159
162
  edu_rdm_integration/uploader_log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
163
  edu_rdm_integration/uploader_log/actions.py,sha256=SGYYYNL4MdST1FYCZBCYAxj3_-PsJ8IcXBYwxpZqucg,6755
161
164
  edu_rdm_integration/uploader_log/apps.py,sha256=tYJj4-sDlq8fLOSvw18L_yys7SILpTKWNmE2Qug6GnE,265
162
165
  edu_rdm_integration/uploader_log/enums.py,sha256=rgSO3BL2rh2xpfm0Pt4waQW8fB1VMJLdsGmr3SXwH_U,266
163
166
  edu_rdm_integration/uploader_log/managers.py,sha256=y5wTSMzF9hpOpIU_A7nIafL_LBU3QEie6LAYWoB-pBQ,3203
164
167
  edu_rdm_integration/uploader_log/ui.py,sha256=YM9Buqp2wxE95Wf5gvAATBzuYzDOossK1sEmvFk07cI,2110
165
- edu_rdm_integration-3.2.2.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
166
- edu_rdm_integration-3.2.2.dist-info/METADATA,sha256=pf2mWm6W814a7FE1IGxpN0bhvun_2q7Zm0dmi1k6SHQ,65013
167
- edu_rdm_integration-3.2.2.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
168
- edu_rdm_integration-3.2.2.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
169
- edu_rdm_integration-3.2.2.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
170
- edu_rdm_integration-3.2.2.dist-info/RECORD,,
168
+ edu_rdm_integration/uploader_log/templates/ui-js/object-grid-buttons.js,sha256=2xyGe0wdVokM0RhpzRzcRvJPBkBmPe3SlZry4oP4Nzs,6201
169
+ edu_rdm_integration-3.2.7.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
170
+ edu_rdm_integration-3.2.7.dist-info/METADATA,sha256=g7Cff01IboSXv0-TVs9LvL_ZYnzGHYhVDy5iVivshSM,67821
171
+ edu_rdm_integration-3.2.7.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
172
+ edu_rdm_integration-3.2.7.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
173
+ edu_rdm_integration-3.2.7.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
174
+ edu_rdm_integration-3.2.7.dist-info/RECORD,,