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.
- edu_rdm_integration/collect_and_export_data/actions.py +121 -0
- edu_rdm_integration/collect_and_export_data/ui.py +137 -0
- edu_rdm_integration/collect_and_export_data/utils.py +130 -0
- edu_rdm_integration/collect_data/actions.py +276 -0
- edu_rdm_integration/collect_data/const.py +2 -0
- edu_rdm_integration/collect_data/generators.py +72 -8
- edu_rdm_integration/collect_data/ui.py +246 -0
- edu_rdm_integration/export_data/actions.py +291 -0
- edu_rdm_integration/export_data/ui.py +199 -0
- edu_rdm_integration/helpers.py +68 -36
- edu_rdm_integration/models.py +11 -0
- edu_rdm_integration/templates/ui-js/stage_for_export.js +25 -0
- edu_rdm_integration/templates/ui-js/start-task.js +42 -0
- edu_rdm_integration/uploader_log/actions.py +47 -12
- edu_rdm_integration/uploader_log/ui.py +0 -11
- {edu_rdm_integration-3.8.0.dist-info → edu_rdm_integration-3.9.0.dist-info}/METADATA +1 -1
- {edu_rdm_integration-3.8.0.dist-info → edu_rdm_integration-3.9.0.dist-info}/RECORD +20 -11
- {edu_rdm_integration-3.8.0.dist-info → edu_rdm_integration-3.9.0.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-3.8.0.dist-info → edu_rdm_integration-3.9.0.dist-info}/licenses/LICENSE +0 -0
- {edu_rdm_integration-3.8.0.dist-info → edu_rdm_integration-3.9.0.dist-info}/top_level.txt +0 -0
@@ -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']
|
edu_rdm_integration/helpers.py
CHANGED
@@ -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 =
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
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 =
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
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
|
-
|
379
|
-
|
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)
|
edu_rdm_integration/models.py
CHANGED
@@ -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
|
-
|
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': '
|
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':
|
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):
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
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.
|
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=
|
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=
|
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/
|
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/
|
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=
|
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=
|
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.
|
186
|
-
edu_rdm_integration-3.
|
187
|
-
edu_rdm_integration-3.
|
188
|
-
edu_rdm_integration-3.
|
189
|
-
edu_rdm_integration-3.
|
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,,
|
File without changes
|
{edu_rdm_integration-3.8.0.dist-info → edu_rdm_integration-3.9.0.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
File without changes
|