edu-rdm-integration 3.2.3__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(
@@ -326,8 +333,9 @@ class BaseCollectLatestModelsData(BaseCollectModelsData):
326
333
  model_logs = logs.get(model_key) if logs else None
327
334
  manager_last_period_ended_at = managers_last_period_ended_at.get(manager_class.uuid)
328
335
 
329
- kwargs['logs_period_started_at'] = manager_last_period_ended_at or get_today_min_datetime()
330
- kwargs['logs_period_ended_at'] = timezone.now()
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()
331
339
 
332
340
  manager = manager_class(*args, logs=model_logs, **kwargs)
333
341
 
@@ -309,11 +309,11 @@ def get_collecting_managers_max_period_ended_dates(
309
309
  ) -> Dict[str, 'datetime']:
310
310
  """Возвращает дату и время завершения последнего успешного этапа сбора для менеджеров Функций сбора."""
311
311
  managers_last_period_ended = CollectingExportedDataStage.objects.filter(
312
- status_id=CollectingDataStageStatus.FINISHED.key,
313
312
  manager_id__in=[manager.uuid for manager in collecting_managers],
314
313
  id=Subquery(
315
314
  CollectingExportedDataStage.objects.filter(
316
- manager_id=OuterRef('manager_id')
315
+ manager_id=OuterRef('manager_id'),
316
+ status_id=CollectingDataStageStatus.FINISHED.key,
317
317
  ).order_by('-id').values('id')[:1]
318
318
  ),
319
319
  ).annotate(
@@ -334,11 +334,11 @@ def get_exporting_managers_max_period_ended_dates(
334
334
  ) -> Dict[str, 'datetime']:
335
335
  """Возвращает дату и время последнего успешного этапа экспорта для менеджеров Функций экспорта."""
336
336
  managers_last_period_ended = ExportingDataStage.objects.filter(
337
- status_id=ExportingDataStageStatus.FINISHED.key,
338
337
  manager_id__in=[manager.uuid for manager in exporting_managers],
339
338
  id=Subquery(
340
339
  ExportingDataStage.objects.filter(
341
- manager_id=OuterRef('manager_id')
340
+ manager_id=OuterRef('manager_id'),
341
+ status_id=ExportingDataStageStatus.FINISHED.key,
342
342
  ).order_by('-id').values('id')[:1]
343
343
  ),
344
344
  ).annotate(
@@ -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
  """Определяет дату последнего успешного этапа сбора у менеджеров Функций сбора."""
@@ -348,6 +356,7 @@ class TransferLatestEntitiesDataPeriodicTask(UniquePeriodicAsyncTask):
348
356
  logs_period_started_at=command.logs_period_started_at,
349
357
  logs_period_ended_at=command.logs_period_ended_at,
350
358
  command_id=command.id,
359
+ use_times_limit=True,
351
360
  )
352
361
 
353
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.3
3
+ Version: 3.2.7
4
4
  Summary: Интеграция с Региональной витриной данных
5
5
  Home-page:
6
6
  Download-URL:
@@ -301,6 +301,38 @@ 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
+
304
336
 
305
337
  ## 3.2.3 - 2024-06-06
306
338
  Внесены корректировки в запросы используемые в функциях get_collecting_managers_max_period_ended_dates и get_exporting_managers_max_period_ended_dates.
@@ -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=lUJv8X8gCY-w2SfcyOShNRtydOTJe0dGHN4h2Y6elqk,13715
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=PEqJeuGaWA_GgE4N6RU57dj-p2hRzGqYmKLRdSg2otQ,14699
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=UR4thiSJ4qFCgMRpJxKtylP5fcrtvxK2Q4FLZSSkN_4,13365
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
@@ -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.3.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
166
- edu_rdm_integration-3.2.3.dist-info/METADATA,sha256=gDOXDSYZhHOgHPJgrkZPEzWC4NFV8oZX_hbIaVoORjk,65697
167
- edu_rdm_integration-3.2.3.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
168
- edu_rdm_integration-3.2.3.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
169
- edu_rdm_integration-3.2.3.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
170
- edu_rdm_integration-3.2.3.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,,