edu-rdm-integration 3.16.0__py3-none-any.whl → 3.16.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of edu-rdm-integration might be problematic. Click here for more details.

@@ -21,6 +21,14 @@ HASH_ALGORITHM = HashGostFunctionVersion.GOST12_512
21
21
 
22
22
  BATCH_SIZE = 5000
23
23
 
24
+ CHUNK_MAX_VALUE = 100000
25
+ """Максимальное значение для размера чанка при сборе данных РВД.
26
+ Ограничение 100000 предотвращает чрезмерное потребление памяти и блокировку БД
27
+ при обработке больших объемов данных в одном батче."""
28
+
29
+ SPLIT_BY_QUANTITY_MAX_VALUE = 366
30
+ """Максимальное значение для размера подпериода при временном разделении данных."""
31
+
24
32
  ACADEMIC_YEAR = {
25
33
  'start_day': 1,
26
34
  'start_month': 9,
@@ -2,6 +2,9 @@ from functools import (
2
2
  partial,
3
3
  )
4
4
 
5
+ from django.conf import (
6
+ settings,
7
+ )
5
8
  from django.db.models import (
6
9
  F,
7
10
  Func,
@@ -268,6 +271,4 @@ class BaseCollectingDataProgressPack(BaseCommandProgressPack):
268
271
  )
269
272
  for command in commands_to_save
270
273
  ]
271
-
272
- for obj in objs:
273
- super().save_row(obj, create_new, request, context, *args, **kwargs)
274
+ self.model.objects.bulk_create(objs, batch_size=settings.COLLECT_PROGRESS_BATCH_SIZE)
@@ -0,0 +1,98 @@
1
+ {% load educommon %}
2
+ {% include "ui-js/validators.js" %}
3
+
4
+ var win = Ext.getCmp('{{ component.client_id }}');
5
+
6
+ Ext.onReady(function() {
7
+ // Инициализация валидаторов
8
+ initializeValidators();
9
+
10
+ // Инициализация взаимозависимых полей
11
+ initializeBatchSizeSplitByLogic();
12
+ });
13
+
14
+ function initializeValidators() {
15
+ // Валидатор для institute_ids
16
+ var instituteIdsField = Ext.getCmp('institute_ids');
17
+ if (instituteIdsField) {
18
+ instituteIdsField.validate = instituteIdsValidator;
19
+ instituteIdsField.on('blur', function() {
20
+ this.validate();
21
+ });
22
+ }
23
+
24
+ // Валидатор для institute_count
25
+ var instituteCountField = Ext.getCmp('institute_count');
26
+ if (instituteCountField) {
27
+ var originalValidator = instituteCountField.validate;
28
+
29
+ instituteCountField.validate = function() {
30
+ if (!instituteCountValidator.call(this)) {
31
+ return false;
32
+ }
33
+ if (originalValidator) {
34
+ return originalValidator.call(this);
35
+ }
36
+ return true;
37
+ };
38
+
39
+ instituteCountField.on('blur', function() {
40
+ this.validate();
41
+ });
42
+ }
43
+
44
+ // Устанавливаем текущую дату и время как максимальное значение
45
+ // и выполняем валидацию каждую секунду
46
+ var validationInterval = setInterval(function() {
47
+ var now = new Date();
48
+
49
+ logsPeriodStartField.setMaxValue(now);
50
+ logsPeriodEndField.setMaxValue(now);
51
+
52
+ logsPeriodStartField.validate();
53
+ logsPeriodEndField.validate();
54
+ }, 1000);
55
+
56
+ win.on('destroy', function() {
57
+ clearInterval(validationInterval);
58
+ });
59
+
60
+ logsPeriodStartField.validator = logsPeriodsValidator;
61
+ logsPeriodEndField.validator = logsPeriodsValidator;
62
+ }
63
+
64
+ function initializeBatchSizeSplitByLogic() {
65
+ var batchSizeField = Ext.getCmp('batch_size');
66
+ var splitByField = Ext.getCmp('split_by');
67
+
68
+ if (!batchSizeField || !splitByField) {
69
+ return;
70
+ }
71
+
72
+ // Функция для обновления обязательности полей
73
+ function updateFieldRequirements() {
74
+ var batchSizeValue = batchSizeField.getValue();
75
+ var splitByValue = splitByField.getValue();
76
+
77
+ if (splitByValue && splitByValue !== '') {
78
+ batchSizeField.allowBlank = true;
79
+ batchSizeField.clearInvalid();
80
+ } else {
81
+ batchSizeField.allowBlank = false;
82
+ }
83
+
84
+ if (batchSizeValue && batchSizeValue !== '' && batchSizeValue !== 0) {
85
+ splitByField.allowBlank = true;
86
+ splitByField.clearInvalid();
87
+ } else {
88
+ splitByField.allowBlank = false;
89
+ }
90
+ }
91
+
92
+ // Обработчики изменения полей
93
+ batchSizeField.on('change', updateFieldRequirements);
94
+ splitByField.on('change', updateFieldRequirements);
95
+
96
+ // Инициализация при загрузке
97
+ updateFieldRequirements();
98
+ }
@@ -0,0 +1,66 @@
1
+ // Валидатор для поля institute_ids
2
+ var instituteIdsValidator = function () {
3
+ var value = this.getValue();
4
+
5
+ // Если поле пустое - это допустимо
6
+ if (!value || value.trim() === '') {
7
+ this.clearInvalid();
8
+ return true;
9
+ }
10
+
11
+ value = value.trim();
12
+
13
+ if (!/^[0-9,]+$/.test(value)) {
14
+ this.markInvalid('Разрешены только цифры и запятые');
15
+ return false;
16
+ }
17
+
18
+ var numbers = value.split(',');
19
+
20
+ for (var i = 0; i < numbers.length; i++) {
21
+ if (numbers[i].trim() === '') {
22
+ this.markInvalid('Между запятыми не должно быть пустых значений');
23
+ return false;
24
+ }
25
+ }
26
+
27
+ var uniqueNumbers = [];
28
+ for (var j = 0; j < numbers.length; j++) {
29
+ var num = parseInt(numbers[j].trim());
30
+ if (uniqueNumbers.indexOf(num) !== -1) {
31
+ this.markInvalid('ID организаций не должны повторяться');
32
+ return false;
33
+ }
34
+ uniqueNumbers.push(num);
35
+ }
36
+
37
+ this.clearInvalid();
38
+ return true;
39
+ };
40
+
41
+ // Валидатор для поля institute_count - запрещаем 0
42
+ var instituteCountValidator = function() {
43
+ var value = this.getValue();
44
+ if (value === 0) {
45
+ this.markInvalid('Количество организаций не может быть равно 0');
46
+ return false;
47
+ }
48
+
49
+ this.clearInvalid();
50
+ return true;
51
+ };
52
+
53
+ var logsPeriodStartField = Ext.getCmp('logs_period_started_at');
54
+ var logsPeriodEndField = Ext.getCmp('logs_period_ended_at');
55
+
56
+ var logsPeriodsValidator = function () {
57
+ if (
58
+ logsPeriodStartField.getValue() &&
59
+ logsPeriodEndField.getValue() &&
60
+ logsPeriodStartField.getValue() > logsPeriodEndField.getValue()
61
+ ) {
62
+ return 'Дата конца периода не может быть меньше даты начала периода'
63
+ };
64
+
65
+ return true;
66
+ };
@@ -24,6 +24,8 @@ from educommon.utils.date import (
24
24
 
25
25
  from edu_rdm_integration.core.consts import (
26
26
  BATCH_SIZE,
27
+ CHUNK_MAX_VALUE,
28
+ SPLIT_BY_QUANTITY_MAX_VALUE,
27
29
  )
28
30
  from edu_rdm_integration.core.registry.ui import (
29
31
  BaseCreateCommandWindow,
@@ -39,11 +41,6 @@ from edu_rdm_integration.stages.collect_data.consts import (
39
41
  class CreateCollectCommandWindow(BaseCreateCommandWindow):
40
42
  """Окно создания команды сбора данных модели РВД."""
41
43
 
42
- def __init__(self):
43
- super().__init__()
44
-
45
- self.template_globals = 'ui-js/create-collect-command-win.js'
46
-
47
44
  def _init_components(self):
48
45
  """Инициализация компонентов."""
49
46
  super()._init_components()
@@ -63,20 +60,23 @@ class CreateCollectCommandWindow(BaseCreateCommandWindow):
63
60
  label='Начало периода',
64
61
  anchor='100%',
65
62
  allow_blank=False,
63
+ client_id='logs_period_started_at',
66
64
  )
67
65
  logs_period_ended_at = ExtDateTimeField(
68
66
  name='logs_period_ended_at',
69
67
  label='Конец периода',
70
68
  anchor='100%',
71
69
  allow_blank=False,
70
+ client_id='logs_period_ended_at',
72
71
  )
73
72
  split_by = ExtComboBox(
74
73
  name='split_by',
75
74
  display_field='split_by',
76
75
  label='Единица подпериода',
77
76
  anchor='100%',
78
- editable=True,
77
+ editable=False,
79
78
  trigger_action_all=True,
79
+ client_id='split_by',
80
80
  )
81
81
  split_by.set_store(ExtDataStore(enumerate(DatesSplitter.get_split_by_modes())))
82
82
  split_by_quantity = ExtNumberField(
@@ -85,6 +85,7 @@ class CreateCollectCommandWindow(BaseCreateCommandWindow):
85
85
  allow_blank=False,
86
86
  allow_decimals=False,
87
87
  allow_negative=False,
88
+ max_value=SPLIT_BY_QUANTITY_MAX_VALUE,
88
89
  anchor='100%',
89
90
  value=1,
90
91
  )
@@ -109,6 +110,8 @@ class CreateCollectCommandWindow(BaseCreateCommandWindow):
109
110
  allow_negative=False,
110
111
  anchor='100%',
111
112
  value=BATCH_SIZE,
113
+ max_value=CHUNK_MAX_VALUE,
114
+ client_id='batch_size',
112
115
  )
113
116
  by_institutes = ExtCheckBox(
114
117
  anchor='100%',
@@ -116,10 +119,12 @@ class CreateCollectCommandWindow(BaseCreateCommandWindow):
116
119
  name='by_institutes',
117
120
  )
118
121
  institute_ids = ExtStringField(
119
- label='id организаций',
122
+ label='ID организаций (через запятую, например: 1,2,3 или оставить пустым для всех)',
120
123
  name='institute_ids',
121
124
  allow_blank=True,
122
125
  anchor='100%',
126
+ max_length=100,
127
+ client_id='institute_ids',
123
128
  )
124
129
  institute_count = ExtNumberField(
125
130
  name='institute_count',
@@ -128,6 +133,8 @@ class CreateCollectCommandWindow(BaseCreateCommandWindow):
128
133
  anchor='100%',
129
134
  min_value=ALL_UNITS_IN_COMMAND,
130
135
  value=ALL_UNITS_IN_COMMAND,
136
+ client_id='institute_count',
137
+ allow_blank=False,
131
138
  )
132
139
  hint_text = ExtDisplayField(
133
140
  value=(
@@ -156,6 +163,12 @@ class CreateCollectCommandWindow(BaseCreateCommandWindow):
156
163
  split_mode,
157
164
  )
158
165
 
166
+ def set_params(self, params: Dict[str, Any]) -> None:
167
+ """Устанавливает параметры окна."""
168
+ super().set_params(params)
169
+
170
+ self.template_globals = 'ui-js/collect-command-window.js'
171
+
159
172
 
160
173
  class DetailCollectCommandWindow(BaseEditWindow):
161
174
  """Окно просмотра команды сбора данных модели РВД."""
@@ -1,14 +1,41 @@
1
1
  var win = Ext.getCmp('{{ component.client_id }}');
2
- var form = win.getForm();
3
- var periodEndField = form.findField('period_ended_at');
4
-
5
- // Устанавливаем текущую дату и время как максимальное значение
6
- // и выполняем валидацию каждую секунду
7
- var validationInterval = setInterval(function() {
8
- periodEndField.setMaxValue(new Date())
9
- periodEndField.validate();
10
- }, 1000);
11
-
12
- win.on('destroy', function() {
13
- clearInterval(validationInterval);
2
+ var periodStartField = Ext.getCmp('period_started_at');
3
+ var periodEndField = Ext.getCmp('period_ended_at');
4
+
5
+ Ext.onReady(function() {
6
+ // Инициализация валидаторов
7
+ initializeValidators();
14
8
  });
9
+
10
+ function initializeValidators() {
11
+ // Устанавливаем текущую дату и время как максимальное значение
12
+ // и выполняем валидацию каждую секунду
13
+ var validationInterval = setInterval(function() {
14
+ var now = new Date();
15
+
16
+ periodStartField.setMaxValue(now);
17
+ periodEndField.setMaxValue(now);
18
+
19
+ periodStartField.validate();
20
+ periodEndField.validate();
21
+ }, 1000);
22
+
23
+ win.on('destroy', function() {
24
+ clearInterval(validationInterval);
25
+ });
26
+
27
+ var periodsValidator = function () {
28
+ if (
29
+ periodStartField.getValue() &&
30
+ periodEndField.getValue() &&
31
+ periodStartField.getValue() > periodEndField.getValue()
32
+ ) {
33
+ return 'Дата конца периода не может быть меньше даты начала периода'
34
+ };
35
+
36
+ return true;
37
+ };
38
+
39
+ periodStartField.validator = periodsValidator;
40
+ periodEndField.validator = periodsValidator;
41
+ }
@@ -44,11 +44,6 @@ from edu_rdm_integration.rdm_entities.models import (
44
44
  class CreateExportCommandWindow(BaseCreateCommandWindow):
45
45
  """Окно создания команды экспорта данных сущности РВД."""
46
46
 
47
- def __init__(self):
48
- super().__init__()
49
-
50
- self.template_globals = 'ui-js/create-export-command-win.js'
51
-
52
47
  def _init_components(self):
53
48
  """Инициализация компонентов."""
54
49
  super()._init_components()
@@ -68,12 +63,14 @@ class CreateExportCommandWindow(BaseCreateCommandWindow):
68
63
  label='Начало периода',
69
64
  anchor='100%',
70
65
  allow_blank=False,
66
+ client_id='period_started_at',
71
67
  )
72
68
  period_ended_at = ExtDateTimeField(
73
69
  name='period_ended_at',
74
70
  label='Конец периода',
75
71
  anchor='100%',
76
72
  allow_blank=False,
73
+ client_id='period_ended_at',
77
74
  )
78
75
  batch_size = ExtNumberField(
79
76
  name='batch_size',
@@ -93,6 +90,12 @@ class CreateExportCommandWindow(BaseCreateCommandWindow):
93
90
  batch_size,
94
91
  )
95
92
 
93
+ def set_params(self, params: Dict[str, Any]) -> None:
94
+ """Устанавливает параметры окна."""
95
+ super().set_params(params)
96
+
97
+ self.template_globals = 'ui-js/create-export-command-win.js'
98
+
96
99
 
97
100
  class DetailExportCommandWindow(BaseEditWindow):
98
101
  """Окно просмотра команды экспорта данных сущности РВД."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edu-rdm-integration
3
- Version: 3.16.0
3
+ Version: 3.16.2
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
@@ -9,7 +9,7 @@ edu_rdm_integration/collect_and_export_data/migrations/0002_auto_20250204_1413.p
9
9
  edu_rdm_integration/collect_and_export_data/migrations/0003_auto_20250704_0725.py,sha256=IcBTuQWp7D_mP1chCgTXUIJcm5nf2Scdt3ZJgjCgvgI,1108
10
10
  edu_rdm_integration/collect_and_export_data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  edu_rdm_integration/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- edu_rdm_integration/core/consts.py,sha256=5pFDMWNGqKYqgqqUjb_QiUyWnjugHzmpl6beMJgWVEI,955
12
+ edu_rdm_integration/core/consts.py,sha256=4dklnQS7rtuYJu0Hh7oX1Z9dc72pbIWZl9gXMUvc4rI,1526
13
13
  edu_rdm_integration/core/enums.py,sha256=HHZxX2vIe-c4SY6BIWgOg-Tu-_LVJjltFZ1lI9YITLw,3824
14
14
  edu_rdm_integration/core/helpers.py,sha256=Fe2AyI8kHAfcnXAn2I_SyNraI5uAjNzHObUNtZtum-g,12183
15
15
  edu_rdm_integration/core/mapping.py,sha256=1B6TsC4Os9wiM8L8BChnCNv_iWqjeWu3bdDsqKVsId0,616
@@ -151,10 +151,11 @@ edu_rdm_integration/stages/collect_data/migrations/0003_auto_20250704_0810.py,sh
151
151
  edu_rdm_integration/stages/collect_data/migrations/0004_auto_20250704_0825.py,sha256=B6SUsxlhQvWoD8lFGNwaMUCFDzhPj91bsMdmAcSuEDg,1379
152
152
  edu_rdm_integration/stages/collect_data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
153
  edu_rdm_integration/stages/collect_data/registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
154
- edu_rdm_integration/stages/collect_data/registry/actions.py,sha256=5eT6nw4xYuJlfVrFxoqn0SF4PqSgHIbMc7rlx8dWypE,9769
154
+ edu_rdm_integration/stages/collect_data/registry/actions.py,sha256=mUMGv1FjzjY0G46gTgi_mfL0yUjuCJlA2wQutq3jmPo,9798
155
155
  edu_rdm_integration/stages/collect_data/registry/apps.py,sha256=K5f97YXKMmdM7m33qgQYvJjrA8_eGAJ4VWyuRjJ0gwQ,439
156
- edu_rdm_integration/stages/collect_data/registry/ui.py,sha256=5qG5M2sw1qvrt3g_2ZOoJJw9YKmrmk7Hlt_VEnWCRhY,7736
157
- edu_rdm_integration/stages/collect_data/registry/templates/ui-js/create-collect-command-win.js,sha256=BypYLy6-xKjmQucGy_uVEx2830jh5f7VFvUaAaqL_AY,549
156
+ edu_rdm_integration/stages/collect_data/registry/ui.py,sha256=pw13DAASxqnX_E5D4RG9CywtnQKQeljXHief7mojVgk,8398
157
+ edu_rdm_integration/stages/collect_data/registry/templates/ui-js/collect-command-window.js,sha256=QfxVSAA0282-41K0XGtyPa9WPzpoX_uClke8pHdAzBo,3112
158
+ edu_rdm_integration/stages/collect_data/registry/templates/ui-js/validators.js,sha256=8A07RgqRs71UuyHNc0HA_isGZL5-W9iLm0O-eC2JFT8,2021
158
159
  edu_rdm_integration/stages/export_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
160
  edu_rdm_integration/stages/export_data/apps.py,sha256=TU6AaMZGQE2oHVwKgtUDzFplaVasb2tMIurhkhwkxZo,406
160
161
  edu_rdm_integration/stages/export_data/consts.py,sha256=ZEi1kXMs-54KFKxkyGIQVwZ4d8OrOF_vLFQIjjWdSPQ,441
@@ -207,8 +208,8 @@ edu_rdm_integration/stages/export_data/migrations/__init__.py,sha256=47DEQpj8HBS
207
208
  edu_rdm_integration/stages/export_data/registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
209
  edu_rdm_integration/stages/export_data/registry/actions.py,sha256=r-NAPs4pYVectt_J38UzMsnKrWfYkjy2rhx3LUGKQWk,10423
209
210
  edu_rdm_integration/stages/export_data/registry/apps.py,sha256=71DtJQ2ULt8_3CnTu2VAfT5ABBrDNY1nKTmZ6UtvIpw,448
210
- edu_rdm_integration/stages/export_data/registry/ui.py,sha256=GPp52ziV_xb0cnveprqIYmrx4kv0zgvrhMg-PHqUFeE,6042
211
- edu_rdm_integration/stages/export_data/registry/templates/ui-js/create-export-command-win.js,sha256=ADE04kltbx1e0spaFK_ycBmtxBQPz6pqfaNY_czo9z8,532
211
+ edu_rdm_integration/stages/export_data/registry/ui.py,sha256=0kWWfOmtTyN4SUO9dGUcEz0wgOPA111jHoWw3_LNPqI,6238
212
+ edu_rdm_integration/stages/export_data/registry/templates/ui-js/create-export-command-win.js,sha256=g0dpYsvd_6VfRU4nRv3tNK-0wtMND_VurQRT04ShJjk,1341
212
213
  edu_rdm_integration/stages/export_data/registry/templates/ui-js/stage_for_export.js,sha256=329OZIpiKHlQ-i8JStjBLXtouIMKuJHbycArUGSskfk,737
213
214
  edu_rdm_integration/stages/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
214
215
  edu_rdm_integration/stages/service/apps.py,sha256=lgCG4_kpwgfDWh6y-GNuUwz5SOjkP7oS8kkUyVUcNRg,648
@@ -244,8 +245,8 @@ edu_rdm_integration/stages/upload_data/uploader_log/ui.py,sha256=mU3XA9zVKHGqzNk
244
245
  edu_rdm_integration/stages/upload_data/uploader_log/migrations/0001_initial.py,sha256=r5oOB7DBK9-mfuqPAgjXUJY5-hEcmMdILCwDTpaLnBc,753
245
246
  edu_rdm_integration/stages/upload_data/uploader_log/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
246
247
  edu_rdm_integration/stages/upload_data/uploader_log/templates/ui-js/object-grid-buttons.js,sha256=2xyGe0wdVokM0RhpzRzcRvJPBkBmPe3SlZry4oP4Nzs,6201
247
- edu_rdm_integration-3.16.0.dist-info/licenses/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
248
- edu_rdm_integration-3.16.0.dist-info/METADATA,sha256=ibxS59Sa-EhxLukehcCeHUg0UoQB_4J9wxHACU6aloc,39780
249
- edu_rdm_integration-3.16.0.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
250
- edu_rdm_integration-3.16.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
251
- edu_rdm_integration-3.16.0.dist-info/RECORD,,
248
+ edu_rdm_integration-3.16.2.dist-info/licenses/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
249
+ edu_rdm_integration-3.16.2.dist-info/METADATA,sha256=OH3vRLpk80LhM4oaWAv3eIja9m6A67tjfsV0e1xrLeA,39780
250
+ edu_rdm_integration-3.16.2.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
251
+ edu_rdm_integration-3.16.2.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
252
+ edu_rdm_integration-3.16.2.dist-info/RECORD,,
@@ -1,14 +0,0 @@
1
- var win = Ext.getCmp('{{ component.client_id }}');
2
- var form = win.getForm();
3
- var logsPeriodEndField = form.findField('logs_period_ended_at');
4
-
5
- // Устанавливаем текущую дату и время как максимальное значение
6
- // и выполняем валидацию каждую секунду
7
- var validationInterval = setInterval(function() {
8
- logsPeriodEndField.setMaxValue(new Date())
9
- logsPeriodEndField.validate();
10
- }, 1000);
11
-
12
- win.on('destroy', function() {
13
- clearInterval(validationInterval);
14
- });