edu-rdm-integration 3.8.0__py3-none-any.whl → 3.9.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.
@@ -0,0 +1,199 @@
1
+ from typing import (
2
+ Any,
3
+ Dict,
4
+ )
5
+
6
+ from m3_ext.ui.controls.buttons import (
7
+ ExtButton,
8
+ )
9
+ from m3_ext.ui.fields import (
10
+ ExtComboBox,
11
+ ExtDisplayField,
12
+ ExtNumberField,
13
+ ExtStringField,
14
+ )
15
+ from m3_ext.ui.fields.simple import (
16
+ ExtDateTimeField,
17
+ )
18
+ from m3_ext.ui.icons import (
19
+ Icons,
20
+ )
21
+ from m3_ext.ui.misc import (
22
+ ExtDataStore,
23
+ )
24
+
25
+ from educommon.objectpack.ui import (
26
+ BaseEditWindow,
27
+ )
28
+ from educommon.utils.ui import (
29
+ append_template_globals,
30
+ )
31
+
32
+ from edu_rdm_integration.collect_and_export_data.ui import (
33
+ CommandProgressListWindow,
34
+ )
35
+ from edu_rdm_integration.collect_data.ui import (
36
+ BaseCreateCommandWindow,
37
+ )
38
+ from edu_rdm_integration.consts import (
39
+ BATCH_SIZE,
40
+ )
41
+ from edu_rdm_integration.models import (
42
+ RegionalDataMartEntityEnum,
43
+ )
44
+
45
+
46
+ class CreateExportCommandWindow(BaseCreateCommandWindow):
47
+ """Окно создания команды экспорта данных сущности РВД."""
48
+
49
+ def _init_components(self):
50
+ """Инициализация компонентов."""
51
+ super()._init_components()
52
+
53
+ entity = ExtComboBox(
54
+ name='entity_id',
55
+ label='Сущность',
56
+ display_field='entity',
57
+ anchor='100%',
58
+ editable=False,
59
+ trigger_action_all=True,
60
+ allow_blank=False,
61
+ )
62
+ entity.set_store(
63
+ ExtDataStore((idx, key) for idx, key in enumerate(RegionalDataMartEntityEnum.get_model_enum_keys()))
64
+ )
65
+ period_started_at = ExtDateTimeField(
66
+ name='period_started_at',
67
+ label='Начало периода',
68
+ anchor='100%',
69
+ allow_blank=False,
70
+ )
71
+ period_ended_at = ExtDateTimeField(
72
+ name='period_ended_at',
73
+ label='Конец периода',
74
+ anchor='100%',
75
+ allow_blank=False,
76
+ )
77
+ batch_size = ExtNumberField(
78
+ name='batch_size',
79
+ label='Размер чанка',
80
+ allow_blank=False,
81
+ allow_decimals=False,
82
+ allow_negative=False,
83
+ anchor='100%',
84
+ min_value=1,
85
+ value=BATCH_SIZE,
86
+ )
87
+
88
+ self.items_ = (
89
+ entity,
90
+ period_started_at,
91
+ period_ended_at,
92
+ batch_size,
93
+ )
94
+
95
+
96
+ class DetailExportCommandWindow(BaseEditWindow):
97
+ """Окно просмотра команды экспорта данных сущности РВД."""
98
+
99
+ def set_params(self, params: Dict[str, Any]) -> None:
100
+ """Устанавливает параметры окна."""
101
+ super().set_params(params)
102
+
103
+ self.height = 'auto'
104
+ self.logs_link_field.value = params.get('log_url', '')
105
+
106
+ def _init_components(self) -> None:
107
+ """Инициализирует компоненты окна."""
108
+ super()._init_components()
109
+
110
+ self.entity_field = ExtStringField(
111
+ name='entity_id',
112
+ label='Сущность',
113
+ anchor='100%',
114
+ )
115
+ self.created_field = ExtDateTimeField(
116
+ name='created',
117
+ label='Дата создания',
118
+ anchor='100%',
119
+ )
120
+ self.generation_id_field = ExtStringField(
121
+ name='generation_id',
122
+ label='Идентификатор генерации',
123
+ anchor='100%',
124
+ )
125
+ self.task_id_field = ExtStringField(
126
+ name='task_id',
127
+ label='Идентификатор задачи',
128
+ anchor='100%',
129
+ )
130
+ self.status_field = ExtStringField(
131
+ name='stage.status.key',
132
+ label='Статус экспорта',
133
+ anchor='100%',
134
+ )
135
+ self.started_at_field = ExtDateTimeField(
136
+ name='stage.started_at',
137
+ label='Время начала экспорта',
138
+ anchor='100%',
139
+ )
140
+ self.logs_link_field = ExtDisplayField(
141
+ name='log_url',
142
+ label='Ссылка на логи',
143
+ anchor='100%',
144
+ )
145
+ self.period_started_at_field = ExtDateTimeField(
146
+ name='period_started_at',
147
+ label='Начало периода',
148
+ anchor='100%',
149
+ )
150
+ self.period_ended_at_field = ExtDateTimeField(
151
+ name='period_ended_at',
152
+ label='Конец периода',
153
+ anchor='100%',
154
+ )
155
+
156
+ def _do_layout(self) -> None:
157
+ """Располагает компоненты окна."""
158
+ super()._do_layout()
159
+
160
+ self.form.items.extend(
161
+ (
162
+ self.entity_field,
163
+ self.created_field,
164
+ self.generation_id_field,
165
+ self.task_id_field,
166
+ self.status_field,
167
+ self.started_at_field,
168
+ self.logs_link_field,
169
+ self.period_started_at_field,
170
+ self.period_ended_at_field,
171
+ )
172
+ )
173
+
174
+
175
+ class ExportCommandProgressListWindow(CommandProgressListWindow):
176
+ """Окно отображения реестра Экспорт данных сущностей РВД."""
177
+
178
+ def _init_components(self):
179
+ """Инициализирует компоненты окна."""
180
+ super()._init_components()
181
+
182
+ self.sub_stage_for_export_button = ExtButton(
183
+ text='Переотправить',
184
+ icon_cls=Icons.ARROW_REFRESH,
185
+ handler='stageForExport',
186
+ )
187
+
188
+ def _do_layout(self):
189
+ """Располагает компоненты окна."""
190
+ super()._do_layout()
191
+
192
+ self.grid.top_bar.items.append(self.sub_stage_for_export_button)
193
+
194
+ def set_params(self, params):
195
+ """Устанавливает параметры окна."""
196
+ super().set_params(params)
197
+
198
+ append_template_globals(self, 'ui-js/stage_for_export.js')
199
+ self.sub_stage_for_export_url = params['sub_stage_for_export_url']
@@ -30,6 +30,12 @@ from django.db.models.functions import (
30
30
  Cast,
31
31
  Least,
32
32
  )
33
+ from django.utils.html import (
34
+ format_html,
35
+ )
36
+ from django.utils.safestring import (
37
+ mark_safe,
38
+ )
33
39
  from uploader_client.adapters import (
34
40
  adapter,
35
41
  )
@@ -85,7 +91,7 @@ if TYPE_CHECKING:
85
91
  FAILED_STATUSES = {
86
92
  DataMartRequestStatus.FAILED_PROCESSING,
87
93
  DataMartRequestStatus.REQUEST_ID_NOT_FOUND,
88
- DataMartRequestStatus.FLC_ERROR
94
+ DataMartRequestStatus.FLC_ERROR,
89
95
  }
90
96
 
91
97
 
@@ -191,7 +197,7 @@ class UploadStatusHelper:
191
197
  self.cache.set(
192
198
  TOTAL_ATTACHMENTS_SIZE_KEY,
193
199
  queue_total_file_size,
194
- timeout=settings.RDM_REDIS_CACHE_TIMEOUT_SECONDS
200
+ timeout=settings.RDM_REDIS_CACHE_TIMEOUT_SECONDS,
195
201
  )
196
202
 
197
203
 
@@ -334,47 +340,73 @@ def get_collecting_managers_max_period_ended_dates(
334
340
  collecting_managers: Iterable['BaseCollectingExportedDataRunnerManager'],
335
341
  ) -> dict[str, 'datetime']:
336
342
  """Возвращает дату и время завершения последнего успешного этапа сбора для менеджеров Функций сбора."""
337
- managers_last_period_ended = CollectingExportedDataStage.objects.filter(
338
- manager_id__in=[manager.uuid for manager in collecting_managers],
339
- id=Subquery(
340
- CollectingExportedDataStage.objects.filter(
341
- manager_id=OuterRef('manager_id'),
342
- status_id=CollectingDataStageStatus.FINISHED.key,
343
- ).order_by('-id').values('id')[:1]
344
- ),
345
- ).annotate(
346
- str_manager_id=Cast('manager_id', output_field=CharField()),
347
- last_period_ended_at=Least('logs_period_ended_at', 'started_at'),
348
- ).values_list(
349
- 'str_manager_id', 'last_period_ended_at',
343
+ managers_last_period_ended = (
344
+ CollectingExportedDataStage.objects.filter(
345
+ manager_id__in=[manager.uuid for manager in collecting_managers],
346
+ id=Subquery(
347
+ CollectingExportedDataStage.objects.filter(
348
+ manager_id=OuterRef('manager_id'),
349
+ status_id=CollectingDataStageStatus.FINISHED.key,
350
+ )
351
+ .order_by('-id')
352
+ .values('id')[:1]
353
+ ),
354
+ )
355
+ .annotate(
356
+ str_manager_id=Cast('manager_id', output_field=CharField()),
357
+ last_period_ended_at=Least('logs_period_ended_at', 'started_at'),
358
+ )
359
+ .values_list(
360
+ 'str_manager_id',
361
+ 'last_period_ended_at',
362
+ )
350
363
  )
351
364
 
352
- return {
353
- manager_id: last_period_ended_at
354
- for manager_id, last_period_ended_at in managers_last_period_ended
355
- }
365
+ return {manager_id: last_period_ended_at for manager_id, last_period_ended_at in managers_last_period_ended}
356
366
 
357
367
 
358
368
  def get_exporting_managers_max_period_ended_dates(
359
369
  exporting_managers: Iterable['BaseExportDataRunnerManager'],
360
370
  ) -> dict[str, 'datetime']:
361
371
  """Возвращает дату и время последнего успешного этапа экспорта для менеджеров Функций экспорта."""
362
- managers_last_period_ended = ExportingDataStage.objects.filter(
363
- manager_id__in=[manager.uuid for manager in exporting_managers],
364
- id=Subquery(
365
- ExportingDataStage.objects.filter(
366
- manager_id=OuterRef('manager_id'),
367
- status_id=ExportingDataStageStatus.FINISHED.key,
368
- ).order_by('-id').values('id')[:1]
369
- ),
370
- ).annotate(
371
- str_manager_id=Cast('manager_id', output_field=CharField()),
372
- last_period_ended_at=Least('period_ended_at', 'started_at'),
373
- ).values_list(
374
- 'str_manager_id', 'last_period_ended_at',
372
+ managers_last_period_ended = (
373
+ ExportingDataStage.objects.filter(
374
+ manager_id__in=[manager.uuid for manager in exporting_managers],
375
+ id=Subquery(
376
+ ExportingDataStage.objects.filter(
377
+ manager_id=OuterRef('manager_id'),
378
+ status_id=ExportingDataStageStatus.FINISHED.key,
379
+ )
380
+ .order_by('-id')
381
+ .values('id')[:1]
382
+ ),
383
+ )
384
+ .annotate(
385
+ str_manager_id=Cast('manager_id', output_field=CharField()),
386
+ last_period_ended_at=Least('period_ended_at', 'started_at'),
387
+ )
388
+ .values_list(
389
+ 'str_manager_id',
390
+ 'last_period_ended_at',
391
+ )
375
392
  )
376
393
 
377
- return {
378
- manager_id: last_period_ended_at
379
- for manager_id, last_period_ended_at in managers_last_period_ended
380
- }
394
+ return {manager_id: last_period_ended_at for manager_id, last_period_ended_at in managers_last_period_ended}
395
+
396
+
397
+ def make_download_link(fieldfile, text='Cкачать', show_filename=False):
398
+ """Возвращает html ссылку для скачивания файла.
399
+
400
+ Если show_filename == True, использует имя файла как текст ссылки
401
+ """
402
+ link = mark_safe('')
403
+ if fieldfile:
404
+ link_text = os.path.basename(fieldfile.name) if show_filename else text
405
+ link = make_link(fieldfile.url, link_text)
406
+
407
+ return link
408
+
409
+
410
+ def make_link(url, text):
411
+ """Возвращает экаранированную html ссылку файла."""
412
+ return format_html('<a href="{}" target="_blank" download>{}</a>', url, text)
@@ -9,6 +9,10 @@ from typing import (
9
9
  Optional,
10
10
  )
11
11
 
12
+ from edu_rdm_integration.uploader_log.enums import (
13
+ RequestResultStatus,
14
+ )
15
+
12
16
  from django.db.models import (
13
17
  CASCADE,
14
18
  PROTECT,
@@ -917,6 +921,13 @@ class UploaderClientLog(Entry):
917
921
  """Ошибка запроса."""
918
922
  return self.error
919
923
 
924
+ @property
925
+ def result_status_display(self) -> str:
926
+ """Результат запроса."""
927
+ result_status = getattr(self, 'result_status', RequestResultStatus.ERROR)
928
+
929
+ return RequestResultStatus.values.get(result_status) or RequestResultStatus.values[RequestResultStatus.ERROR]
930
+
920
931
  class Meta:
921
932
  proxy = True
922
933
 
@@ -0,0 +1,25 @@
1
+ function stageForExport(){
2
+ var grid = Ext.getCmp('{{ component.grid.client_id }}'),
3
+ selections = grid.selModel.getSelections(),
4
+ commands = [];
5
+
6
+ if (Ext.isEmpty(selections)) {
7
+ Ext.Msg.alert('Внимание', 'Не выбрана команда!');
8
+ return false;
9
+ } else {
10
+ Ext.each(selections, function (obj) {
11
+ commands.push(obj.id);
12
+ });
13
+ }
14
+
15
+ Ext.Ajax.request({
16
+ url: '{{ component.sub_stage_for_export_url }}',
17
+ method: 'POST',
18
+ params: {'commands': commands.join()},
19
+ success: function (res) {
20
+ smart_eval(res.responseText);
21
+ grid.getStore().reload();
22
+ },
23
+ failure: uiAjaxFailMessage
24
+ });
25
+ }
@@ -0,0 +1,42 @@
1
+ function startTask(){
2
+ var grid = Ext.getCmp('{{ component.grid.client_id }}'),
3
+ selections = grid.selModel.getSelections(),
4
+ commands = [];
5
+
6
+ if (Ext.isEmpty(selections)) {
7
+ Ext.Msg.alert('Внимание', 'Не выбрана команда!');
8
+ return false;
9
+ } else {
10
+ Ext.each(selections, function (obj) {
11
+ commands.push(obj.id);
12
+ });
13
+ }
14
+
15
+ Ext.Ajax.request({
16
+ url: '{{ component.queue_select_win_url }}',
17
+ method: 'POST',
18
+ params: {},
19
+ success: function (res) {
20
+ var queue_select_win = smart_eval(res.responseText);
21
+ queue_select_win.on('closed_ok', function() {
22
+ var queue_level_field = queue_select_win.items.items[0];
23
+ var params = queue_select_win.actionContextJson;
24
+ params['commands'] = commands.join();
25
+ params['queue_level'] = queue_level_field.getValue();
26
+ Ext.Ajax.request({
27
+ url: '{{ component.start_task_url }}',
28
+ method: 'POST',
29
+ params: params,
30
+ success: function (res) {
31
+ smart_eval(res.responseText);
32
+ grid.getStore().reload();
33
+ },
34
+ failure: uiAjaxFailMessage
35
+ });
36
+ queue_select_win.close();
37
+
38
+ });
39
+ },
40
+ failure: uiAjaxFailMessage
41
+ });
42
+ }
@@ -11,6 +11,13 @@ from typing import (
11
11
  Optional,
12
12
  )
13
13
 
14
+ from django.conf import (
15
+ settings,
16
+ )
17
+ from edu_rdm_integration.uploader_log.enums import (
18
+ RequestResultStatus,
19
+ )
20
+
14
21
  from django.db.models import (
15
22
  Q,
16
23
  )
@@ -42,7 +49,9 @@ from edu_rdm_integration.models import (
42
49
  )
43
50
  from edu_rdm_integration.uploader_log.ui import (
44
51
  UploaderLogInfoWindow,
45
- UploaderLogListWindow,
52
+ )
53
+ from objectpack.filters import (
54
+ CustomFilter,
46
55
  )
47
56
 
48
57
 
@@ -54,7 +63,6 @@ class UploaderLogPack(ObjectPack):
54
63
  title = 'Журнал логов РВД'
55
64
  model = UploaderClientLog
56
65
 
57
- list_window = UploaderLogListWindow
58
66
  edit_window = UploaderLogInfoWindow
59
67
 
60
68
  _is_primary_for_model = False
@@ -108,8 +116,13 @@ class UploaderLogPack(ObjectPack):
108
116
  },
109
117
  {
110
118
  'header': 'Результат',
111
- 'data_index': 'http_response_status',
119
+ 'data_index': 'result_status_display',
112
120
  'sortable': False,
121
+ 'filter': ChoicesFilter(
122
+ choices=RequestResultStatus.get_choices(),
123
+ parser=int,
124
+ lookup='result_status',
125
+ ),
113
126
  'width': 5,
114
127
  },
115
128
  {
@@ -129,8 +142,13 @@ class UploaderLogPack(ObjectPack):
129
142
  {
130
143
  'header': 'Код статуса загрузки',
131
144
  'data_index': 'status_code',
132
- 'sortable': False,
145
+ 'sortable': True,
133
146
  'searchable': True,
147
+ 'filter': CustomFilter(
148
+ xtype='field',
149
+ parser=str,
150
+ lookup=lambda v: Q(response__icontains=f'"code": {v}'),
151
+ ),
134
152
  'width': 10,
135
153
  },
136
154
  {
@@ -151,7 +169,7 @@ class UploaderLogPack(ObjectPack):
151
169
  ),
152
170
  'column_renderer': boolean_column_renderer(),
153
171
  'width': 5,
154
- }
172
+ },
155
173
  ]
156
174
 
157
175
  def __init__(self):
@@ -204,6 +222,10 @@ class UploaderLogPack(ObjectPack):
204
222
  """Конфигурирование грида окна списка."""
205
223
  super().configure_grid(grid, *args, **kwargs)
206
224
 
225
+ if self.allow_paging:
226
+ grid.allow_paging = self.allow_paging
227
+ grid.paging_bar.page_size = self._DEFAULT_PAGING_LIMIT
228
+
207
229
  grid.url_edit = None
208
230
  add_one_row_button(
209
231
  'Просмотр',
@@ -224,11 +246,24 @@ class UploaderLogPack(ObjectPack):
224
246
 
225
247
  return params
226
248
 
227
- def extend_menu(self, menu): # noqa D102
228
- return menu.SubMenu(
229
- 'Администрирование', menu.SubMenu(
230
- 'Региональная витрина данных', menu.Item(
231
- self.title, self.list_window_action
232
- )
249
+ def extend_menu(self, menu):
250
+ """Размещение в меню подменю "Администрирование -> Региональная витрина данных -> Журнал логов РВД".
251
+
252
+ Args:
253
+ menu: Объект меню.
254
+ Returns:
255
+ Подменю "Администрирование -> Региональная витрина данных -> Журнал логов РВД".
256
+ """
257
+
258
+ if settings.RDM_MENU_ITEM:
259
+ return menu.SubMenu(
260
+ 'Администрирование',
261
+ menu.SubMenu(
262
+ 'Региональная витрина данных',
263
+ menu.Item(
264
+ self.title,
265
+ self.list_window_action,
266
+ ),
267
+ icon='menu-dicts-16',
268
+ ),
233
269
  )
234
- )
@@ -3,7 +3,6 @@ from m3_ext.ui.fields import (
3
3
  )
4
4
  from objectpack.ui import (
5
5
  BaseEditWindow,
6
- BaseListWindow,
7
6
  )
8
7
 
9
8
  from educommon.utils.ui import (
@@ -62,13 +61,3 @@ class UploaderLogInfoWindow(BaseEditWindow):
62
61
 
63
62
  switch_window_in_read_only_mode(self)
64
63
  self.make_read_only()
65
-
66
-
67
- class UploaderLogListWindow(BaseListWindow):
68
- """Окно для списка логов Загрузчика данных в витрину."""
69
-
70
- def _init_components(self):
71
- super()._init_components()
72
-
73
- self.grid.allow_paging = True
74
- self.grid.paging_bar.page_size = 35
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edu-rdm-integration
3
- Version: 3.8.0
3
+ Version: 3.9.0
4
4
  Summary: Интеграция с Региональной витриной данных
5
5
  Author-email: BARS Group <education_dev@bars.group>
6
6
  Project-URL: Homepage, https://stash.bars-open.ru/projects/EDUBASE/repos/edu_rdm_integration/browse
@@ -6,9 +6,9 @@ edu_rdm_integration/base.py,sha256=1NgLZd0KZRRgUcVfufVIpDJU2coT2zksFGDaX4fWqps,5
6
6
  edu_rdm_integration/consts.py,sha256=QnL9TqTKuJ0MrysqtqHvtCwOFbS1T7iwcfUZGjVsZTU,1166
7
7
  edu_rdm_integration/entities.py,sha256=mhVeB88A-VD5IAzZCNeI1qnkvNoZ8LPiLBdqk1yA3Jc,14541
8
8
  edu_rdm_integration/enums.py,sha256=RpQIZM1iSgFbYDHfwrbT-BwgRf-N9ZZnJgx8UyRFQ2o,4978
9
- edu_rdm_integration/helpers.py,sha256=qwSyeIDBVEhdYG9raf3uLZPd1_2eXuNAaosSR7bLa50,14759
9
+ edu_rdm_integration/helpers.py,sha256=30jynZZ4msdY0LHZT53pvTSLZ-Qbk32u2JxY44ZDUtE,15761
10
10
  edu_rdm_integration/mapping.py,sha256=1B6TsC4Os9wiM8L8BChnCNv_iWqjeWu3bdDsqKVsId0,616
11
- edu_rdm_integration/models.py,sha256=lrlJUAJJr29rrNwNdyCkswyRGmnm8XVDQDArWVO2ivc,31907
11
+ edu_rdm_integration/models.py,sha256=4IR5gdNX6YVvGysQQeixcjIOCrMQ37RVhmyvSwucLdc,32297
12
12
  edu_rdm_integration/redis_cache.py,sha256=SP_rcL5t6PTVLOnEYn_NTX0Z666VdZT4By2pyED24Z4,1537
13
13
  edu_rdm_integration/signals.py,sha256=3eRlpkDcFCF6TN80-QM8yBYLcyozzcmoPjz6r4_ApWg,73
14
14
  edu_rdm_integration/storages.py,sha256=G4Q4tIyJdEyb9ka551PADCFIm66bpsJe9VBRcvQhLMI,6745
@@ -33,17 +33,22 @@ edu_rdm_integration/adapters/strings.py,sha256=-k9dex8A7hCpkzUkudVkKRAbNRuuqog2h
33
33
  edu_rdm_integration/adapters/tests.py,sha256=MoRY-a75Ow-7EjeQYxkXWunwqTGuBMaUyEkEV2oy05I,59
34
34
  edu_rdm_integration/adapters/validators.py,sha256=LJWnCY8PtXDOj-fm3fBWjQYsHsSLfyKf_D97pqPv73s,496
35
35
  edu_rdm_integration/collect_and_export_data/__init__.py,sha256=4glPgPCzAyLreBGUnUrcRPCge45XucJz5bK8VjlQBaE,82
36
+ edu_rdm_integration/collect_and_export_data/actions.py,sha256=U0QPe6OVmngLeW_2b3KA9L1Vp6uWdQoanXcp45IHnec,4018
36
37
  edu_rdm_integration/collect_and_export_data/apps.py,sha256=fAcctcjxWP4Gd0Qr3YrQkMESrzga4IORWetBTy8wvHo,160
37
38
  edu_rdm_integration/collect_and_export_data/models.py,sha256=TGm-hM-1aDhVcFPy0PTC3yNczoZGF4ZmIdr0Y9s8CfU,2038
38
- edu_rdm_integration/collect_and_export_data/utils.py,sha256=lBWqqhLgMyz2IQN7r9zugRHpYNBbeVp59G0WBxEsmj8,3546
39
+ edu_rdm_integration/collect_and_export_data/ui.py,sha256=14MW_FAMF5N7oi608Y134u3m8FFdrC5PqqpJqm5fTuA,4194
40
+ edu_rdm_integration/collect_and_export_data/utils.py,sha256=voILhNvk8qyp0-LB7uahAgsgG2hzsnHWnJXrOVfRqHo,7852
39
41
  edu_rdm_integration/collect_and_export_data/migrations/0001_initial.py,sha256=UkoaXzh3tokZ8QdCdB09v3rRZfcHhvEwNMuj3mQIB74,4714
40
42
  edu_rdm_integration/collect_and_export_data/migrations/0002_auto_20250204_1413.py,sha256=8kNc8IHzEiIKpIv1oT6rytV80RJrikrEnlvRFpaFRWc,1017
41
43
  edu_rdm_integration/collect_and_export_data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
44
  edu_rdm_integration/collect_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ edu_rdm_integration/collect_data/actions.py,sha256=e6p5JlNi2LCVQH-IUV2Gezx5QdCLGaBf1j3NQGWx7kY,9774
43
46
  edu_rdm_integration/collect_data/collect.py,sha256=-u2ER3MZOLtNRmdtYwimpQqFsEBbJ-8Wsy-AjQeK168,11868
44
- edu_rdm_integration/collect_data/generators.py,sha256=C6GuwURZleB7UwoW7byKD6XOT734Fcitc7JUVwy6O1o,9061
47
+ edu_rdm_integration/collect_data/const.py,sha256=tzaK9oxzdMRq3oTEocPz4umoXSJWUtFc7YhyXucCNbs,127
48
+ edu_rdm_integration/collect_data/generators.py,sha256=nzTWdF2mDflYJXwG8KgrzR8piO8rUPPJ73OZx1Vg3sE,12144
45
49
  edu_rdm_integration/collect_data/helpers.py,sha256=wi1TECBFwur0LyREUwGLNXqQG731e2l1iuIp2Vsh8_o,2962
46
50
  edu_rdm_integration/collect_data/tests.py,sha256=_Inf8v_TS_LorBb702qykzc1Syj_tsPVRLJREcJ-XmY,5515
51
+ edu_rdm_integration/collect_data/ui.py,sha256=nBLDWWsGIGJelUBvHQE2r6YhmnXc6Xj__Ryw4FaOx8w,7698
47
52
  edu_rdm_integration/collect_data/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
53
  edu_rdm_integration/collect_data/base/caches.py,sha256=_Ja0q3hPSE_Mq-MCZN-1jr0WvpOqUr1-CkoBf1B7qKc,2141
49
54
  edu_rdm_integration/collect_data/base/consts.py,sha256=nzP7973d-YG29l-JxJcq7dF81QDLP7FRtTq0dSq46GM,304
@@ -88,6 +93,7 @@ edu_rdm_integration/enum_register/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeR
88
93
  edu_rdm_integration/enum_register/mixins.py,sha256=lry5JDGIleBCcOqsfX0sVOqwnnSV2Jlb4T2heD-xg54,4621
89
94
  edu_rdm_integration/enum_register/register.py,sha256=jb16O7TZDGVRo5NwWqyY_rcbBxOncYeOoSq6UAbTf48,2208
90
95
  edu_rdm_integration/export_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
+ edu_rdm_integration/export_data/actions.py,sha256=z3qMJJbgsiOCW8A_Ac5ThVBijK4dU_8VuOGrxEBNKso,10377
91
97
  edu_rdm_integration/export_data/consts.py,sha256=ZEi1kXMs-54KFKxkyGIQVwZ4d8OrOF_vLFQIjjWdSPQ,441
92
98
  edu_rdm_integration/export_data/dataclasses.py,sha256=IhftRopP4lS-m3ygdBU5Bz0HF71VSBP4JQ6-8VIVgtY,260
93
99
  edu_rdm_integration/export_data/export.py,sha256=qKvFRTcy2ZgaBMn6mEi_OsueNXZ7j_v2neu2Lu99MEs,19447
@@ -96,6 +102,7 @@ edu_rdm_integration/export_data/generators.py,sha256=UIoX49rQnUwwC9PL17te7Rb4WRD
96
102
  edu_rdm_integration/export_data/helpers.py,sha256=JKL4MC0IuoJv72NNnL8hG7HLy7kNHOXFp1uLCKF15AM,2900
97
103
  edu_rdm_integration/export_data/queue.py,sha256=GlwRwhMdv38OxmtFpFD5-Pt79gMe3IcLeWFQCLXTcik,6128
98
104
  edu_rdm_integration/export_data/strategies.py,sha256=RBBJuCMJCypB4mDwFb6zix3t791SkpFFX5B7Wd-O-4s,6715
105
+ edu_rdm_integration/export_data/ui.py,sha256=maSW3GB9l7pwIblOlni8uK3HhbwQyqh50KdUnyPc1QE,6012
99
106
  edu_rdm_integration/export_data/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
107
  edu_rdm_integration/export_data/base/caches.py,sha256=owWMT6FG9Y6xXwbObyPUI31UgSVi1rlb9i9zVMp8sTk,1507
101
108
  edu_rdm_integration/export_data/base/consts.py,sha256=jLuy2y7YQ921OrEuzDld3F0k6YxgCnr5yorWBQJiLLw,519
@@ -174,16 +181,18 @@ edu_rdm_integration/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
174
181
  edu_rdm_integration/registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
182
  edu_rdm_integration/registry/actions.py,sha256=-CHe95jbxO9JAEaOx6nV6Avn75ynppvZRWN8YPc6c6s,6074
176
183
  edu_rdm_integration/registry/ui.py,sha256=v4GqbQUcoeHxfUPUYORuj4DfzIp49diY-F1hyL3TCPo,2592
184
+ edu_rdm_integration/templates/ui-js/stage_for_export.js,sha256=329OZIpiKHlQ-i8JStjBLXtouIMKuJHbycArUGSskfk,737
185
+ edu_rdm_integration/templates/ui-js/start-task.js,sha256=mwLMFFOZku5AS0CF7AzPoIP_jGP36uetlN6noUE2pBw,1490
177
186
  edu_rdm_integration/templates/ui-js/transferred-entity-list.js,sha256=IWEZ9JoTxD5-CLic5v07XHWW0iGRWk-cjeGVSzU4yKg,1117
178
187
  edu_rdm_integration/uploader_log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- edu_rdm_integration/uploader_log/actions.py,sha256=2ckgI1PKgVcLYkbhtbK_bfv_6lDxpiIRSk1uPCIL-gg,6755
188
+ edu_rdm_integration/uploader_log/actions.py,sha256=K06pkaWGjPnt6cpPYdSk8X7nqQEfW-vXXvNVORRbDCs,7957
180
189
  edu_rdm_integration/uploader_log/apps.py,sha256=tYJj4-sDlq8fLOSvw18L_yys7SILpTKWNmE2Qug6GnE,265
181
190
  edu_rdm_integration/uploader_log/enums.py,sha256=rgSO3BL2rh2xpfm0Pt4waQW8fB1VMJLdsGmr3SXwH_U,266
182
191
  edu_rdm_integration/uploader_log/managers.py,sha256=OFdToWV8qhdfeGNpd-UWAmSEISzixmVQ6LF75EW7gzA,3248
183
- edu_rdm_integration/uploader_log/ui.py,sha256=YM9Buqp2wxE95Wf5gvAATBzuYzDOossK1sEmvFk07cI,2110
192
+ edu_rdm_integration/uploader_log/ui.py,sha256=7O63XJJYnJBLVU9aGuSyMOxFYtcj_Kyf5u6HIiuxl9A,1788
184
193
  edu_rdm_integration/uploader_log/templates/ui-js/object-grid-buttons.js,sha256=2xyGe0wdVokM0RhpzRzcRvJPBkBmPe3SlZry4oP4Nzs,6201
185
- edu_rdm_integration-3.8.0.dist-info/licenses/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
186
- edu_rdm_integration-3.8.0.dist-info/METADATA,sha256=RG6vIjFCjWp4m7xz-Eey7SLDFCFRIhi3AX6D24dHRcQ,35263
187
- edu_rdm_integration-3.8.0.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
188
- edu_rdm_integration-3.8.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
189
- edu_rdm_integration-3.8.0.dist-info/RECORD,,
194
+ edu_rdm_integration-3.9.0.dist-info/licenses/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
195
+ edu_rdm_integration-3.9.0.dist-info/METADATA,sha256=ukP5puX-wO0lxJqlzpaKQw8zsyG2rH7KDNZPSzql5J4,35263
196
+ edu_rdm_integration-3.9.0.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
197
+ edu_rdm_integration-3.9.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
198
+ edu_rdm_integration-3.9.0.dist-info/RECORD,,