edu-rdm-integration 3.22.5__py3-none-any.whl → 3.22.8__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.

Files changed (23) hide show
  1. edu_rdm_integration/core/consts.py +3 -0
  2. edu_rdm_integration/pipelines/transfer/tasks.py +5 -0
  3. edu_rdm_integration/stages/collect_data/registry/templates/ui-js/collect-command-window.js +8 -19
  4. edu_rdm_integration/stages/collect_data/registry/templates/ui-js/validators.js +0 -15
  5. edu_rdm_integration/stages/export_data/models.py +4 -0
  6. edu_rdm_integration/stages/export_data/registry/actions.py +2 -1
  7. edu_rdm_integration/stages/export_data/registry/templates/ui-js/create-export-command-win.js +15 -31
  8. edu_rdm_integration/stages/service/service_outdated_data/cleaners/collect_data.py +1 -8
  9. edu_rdm_integration/stages/service/service_outdated_data/cleaners/consts.py +0 -11
  10. edu_rdm_integration/stages/service/service_outdated_data/cleaners/export_data.py +1 -2
  11. edu_rdm_integration/stages/upload_data/enums.py +2 -0
  12. edu_rdm_integration/stages/upload_data/export_managers.py +3 -1
  13. edu_rdm_integration/stages/upload_data/management/commands/custom_check_upload_status.py +59 -0
  14. edu_rdm_integration/stages/upload_data/management/commands/custom_upload_files.py +45 -0
  15. edu_rdm_integration/stages/upload_data/queues.py +50 -2
  16. edu_rdm_integration/stages/upload_data/tasks.py +2 -2
  17. edu_rdm_integration/stages/utils.py +12 -0
  18. edu_rdm_integration/templates/ui-js/collect-and-export-validators.js +54 -0
  19. {edu_rdm_integration-3.22.5.dist-info → edu_rdm_integration-3.22.8.dist-info}/METADATA +1 -1
  20. {edu_rdm_integration-3.22.5.dist-info → edu_rdm_integration-3.22.8.dist-info}/RECORD +23 -20
  21. {edu_rdm_integration-3.22.5.dist-info → edu_rdm_integration-3.22.8.dist-info}/WHEEL +0 -0
  22. {edu_rdm_integration-3.22.5.dist-info → edu_rdm_integration-3.22.8.dist-info}/licenses/LICENSE +0 -0
  23. {edu_rdm_integration-3.22.5.dist-info → edu_rdm_integration-3.22.8.dist-info}/top_level.txt +0 -0
@@ -39,3 +39,6 @@ ACADEMIC_YEAR = {
39
39
  TASK_QUEUE_NAME = 'RDM'
40
40
  FAST_TRANSFER_TASK_QUEUE_NAME = 'RDM_FAST'
41
41
  LONG_TRANSFER_TASK_QUEUE_NAME = 'RDM_LONG'
42
+
43
+ # Лаг по времени между сбором и экспортом при работе с репликам (в секундах)
44
+ PAUSE_TIME = 15
@@ -1,3 +1,4 @@
1
+ import time
1
2
  from datetime import (
2
3
  datetime,
3
4
  )
@@ -37,6 +38,7 @@ from educommon.utils.date import (
37
38
  from edu_rdm_integration.core.consts import (
38
39
  FAST_TRANSFER_TASK_QUEUE_NAME,
39
40
  LONG_TRANSFER_TASK_QUEUE_NAME,
41
+ PAUSE_TIME,
40
42
  TASK_QUEUE_NAME,
41
43
  )
42
44
  from edu_rdm_integration.core.enums import (
@@ -206,6 +208,9 @@ class BaseTransferLatestEntitiesDataPeriodicTask(BaseTransferLatestEntitiesDataM
206
208
 
207
209
  continue
208
210
 
211
+ # Лаг времени для достаки данных в реплику
212
+ time.sleep(PAUSE_TIME)
213
+
209
214
  try:
210
215
  if export_enabled:
211
216
  self._run_export_entity_data(entity_enum.key, task_id)
@@ -1,7 +1,9 @@
1
1
  {% load educommon %}
2
2
  {% include "ui-js/validators.js" %}
3
+ {% include "ui-js/collect-and-export-validators.js" %}
3
4
 
4
- var win = Ext.getCmp('{{ component.client_id }}');
5
+ var logsPeriodStartField = Ext.getCmp('logs_period_started_at');
6
+ var logsPeriodEndField = Ext.getCmp('logs_period_ended_at');
5
7
 
6
8
  Ext.onReady(function() {
7
9
  // Инициализация валидаторов
@@ -41,24 +43,11 @@ function initializeValidators() {
41
43
  });
42
44
  }
43
45
 
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;
46
+ // Устанавливаем время по умолчанию в календаре и доп валидатор
47
+ setupPeriodFields(
48
+ logsPeriodStartField,
49
+ logsPeriodEndField,
50
+ );
62
51
  }
63
52
 
64
53
  function initializeBatchSizeSplitByLogic() {
@@ -47,20 +47,5 @@ var instituteCountValidator = function() {
47
47
  }
48
48
 
49
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
50
  return true;
66
51
  };
@@ -168,6 +168,10 @@ class RDMExportingDataSubStageStatus(TitledModelEnum):
168
168
  )
169
169
  PROCESS_ERROR = ModelEnumValue(title='Ошибка обработки витриной')
170
170
 
171
+ IN_EXPORT = ModelEnumValue(
172
+ title='Экспортируется',
173
+ )
174
+
171
175
  class Meta:
172
176
  db_table = 'rdm_exporting_data_sub_stage_status'
173
177
  verbose_name = 'Модель-перечисление статусов подэтапа выгрузки данных'
@@ -228,7 +228,8 @@ class BaseExportingDataProgressPack(BaseCommandProgressPack):
228
228
  ready_sub_stages=Subquery(
229
229
  RDMExportingDataSubStage.objects.filter(
230
230
  stage_id=OuterRef('stage_id'),
231
- status=RDMExportingDataSubStageStatus.READY_FOR_EXPORT.key,
231
+ status__in=(RDMExportingDataSubStageStatus.READY_FOR_EXPORT.key,
232
+ RDMExportingDataSubStageStatus.IN_EXPORT.key)
232
233
  )
233
234
  .annotate(
234
235
  ready_count=Func(F('id'), function='Count', output_field=IntegerField()),
@@ -1,4 +1,5 @@
1
- var win = Ext.getCmp('{{ component.client_id }}');
1
+ {% include "ui-js/collect-and-export-validators.js" %}
2
+
2
3
  var periodStartField = Ext.getCmp('period_started_at');
3
4
  var periodEndField = Ext.getCmp('period_ended_at');
4
5
 
@@ -8,34 +9,17 @@ Ext.onReady(function() {
8
9
  });
9
10
 
10
11
  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;
12
+ // Установка максимальной даты (завтра 23:59:59)
13
+ const maxDate = new Date();
14
+ maxDate.setDate(maxDate.getDate() + 1);
15
+ maxDate.setHours(23, 59, 59);
16
+
17
+ periodStartField.setMaxValue(maxDate);
18
+ periodEndField.setMaxValue(maxDate);
19
+
20
+ // Устанавливаем время по умолчанию в календаре и доп валидатор
21
+ setupPeriodFields(
22
+ periodStartField,
23
+ periodEndField,
24
+ );
41
25
  }
@@ -21,15 +21,10 @@ from educommon.utils.seqtools import (
21
21
  make_chunks,
22
22
  )
23
23
 
24
- from web_edu.plugins.regional_data_mart_integration.models import (
25
- LessonClass,
26
- )
27
-
28
24
  from .base import (
29
25
  BaseServiceOutdatedDataCleaner,
30
26
  )
31
27
  from .consts import (
32
- OLD_RDM_MODEL,
33
28
  UNION_CHUNK_SIZE,
34
29
  )
35
30
 
@@ -49,14 +44,12 @@ class CollectingDataSubStageCleaner(BaseServiceOutdatedDataCleaner):
49
44
  def _get_valid_substage_ids_subquery(self) -> Optional[Subquery]:
50
45
  """Подзапрос, возвращающий все допустимые collecting_sub_stage_id из моделей, описанных в RDMModelEnum."""
51
46
  model_enum_values = RDMModelEnum.get_model_enum_values()
52
- all_model = [model_enum.model for model_enum in model_enum_values] + OLD_RDM_MODEL
47
+ all_model = [model_enum.model for model_enum in model_enum_values]
53
48
  chunk_queries = []
54
49
 
55
50
  for enum_values_chunk in make_chunks(all_model, UNION_CHUNK_SIZE, is_list=True):
56
51
  qs_list = []
57
52
  for model_cls in enum_values_chunk:
58
- if model_cls in [LessonClass]:
59
- continue
60
53
  try:
61
54
  model_cls._meta.get_field('collecting_sub_stage_id')
62
55
  except FieldDoesNotExist:
@@ -1,12 +1 @@
1
- from web_edu.plugins.regional_data_mart_integration.models.homework import Homework
2
- from web_edu.plugins.regional_data_mart_integration.models.homework_material import HomeworkMaterial
3
- from web_edu.plugins.regional_data_mart_integration.models.homework_student import HomeworkStudent
4
-
5
-
6
1
  UNION_CHUNK_SIZE = 5
7
-
8
- OLD_RDM_MODEL = [
9
- HomeworkStudent,
10
- HomeworkMaterial,
11
- Homework,
12
- ]
@@ -28,7 +28,6 @@ from .base import (
28
28
  ServiceFileCleaner,
29
29
  )
30
30
  from .consts import (
31
- OLD_RDM_MODEL,
32
31
  UNION_CHUNK_SIZE,
33
32
  )
34
33
 
@@ -47,7 +46,7 @@ class ExportingDataSubStageCleaner(BaseServiceOutdatedDataCleaner):
47
46
  def _get_valid_substage_ids_subquery(self) -> Optional[Subquery]:
48
47
  """Подзапрос, возвращающий все допустимые exporting_sub_stage_id из моделей, описанных в RDMModelEnum."""
49
48
  model_enum_values = RDMModelEnum.get_model_enum_values()
50
- all_model = [model_enum.model for model_enum in model_enum_values] + OLD_RDM_MODEL
49
+ all_model = [model_enum.model for model_enum in model_enum_values]
51
50
  chunk_queries = []
52
51
 
53
52
  for enum_values_chunk in make_chunks(all_model, UNION_CHUNK_SIZE, is_list=True):
@@ -9,9 +9,11 @@ class FileUploadStatusEnum(BaseEnumerate):
9
9
  IN_PROGRESS = 1
10
10
  FINISHED = 2
11
11
  ERROR = 3
12
+ IN_CHECK = 4
12
13
 
13
14
  values = {
14
15
  IN_PROGRESS: 'В процессе загрузки в витрину',
15
16
  FINISHED: 'Загрузка в витрину закончена',
16
17
  ERROR: 'Ошибка загрузки в витрину',
18
+ IN_CHECK: 'На проверке'
17
19
  }
@@ -106,11 +106,13 @@ class ExportQueueSender:
106
106
 
107
107
  def get_sub_stages_attachments_to_export(self):
108
108
  """Выборка готовых к экспорту подэтапов."""
109
- sub_stage_ids = (
109
+ sub_stage_ids = set(
110
110
  RDMExportingDataSubStage.objects.filter(self._make_stage_filter())
111
111
  .order_by('started_at')
112
112
  .values_list('id', flat=True)[: self.limit]
113
113
  )
114
+ RDMExportingDataSubStage.objects.filter(id__in=sub_stage_ids).update(
115
+ status=RDMExportingDataSubStageStatus.IN_EXPORT.key)
114
116
 
115
117
  return (
116
118
  RDMExportingDataSubStage.objects.filter(id__in=sub_stage_ids)
@@ -0,0 +1,59 @@
1
+ from time import (
2
+ sleep,
3
+ )
4
+ from typing import (
5
+ TYPE_CHECKING,
6
+ Any,
7
+ )
8
+
9
+ from django.core.cache import (
10
+ cache,
11
+ )
12
+ from django.core.management.base import (
13
+ BaseCommand,
14
+ )
15
+
16
+ from edu_rdm_integration.core.consts import (
17
+ BATCH_SIZE,
18
+ )
19
+ from edu_rdm_integration.stages.upload_data.enums import (
20
+ FileUploadStatusEnum,
21
+ )
22
+ from edu_rdm_integration.stages.upload_data.helpers import (
23
+ UploadStatusHelper,
24
+ )
25
+ from edu_rdm_integration.stages.upload_data.models import (
26
+ RDMExportingDataSubStageUploaderClientLog,
27
+ )
28
+
29
+
30
+ class Command(BaseCommand):
31
+ """Команда для отправки данных в витрину параллельно-последовательно. В рамках скрипта последовательно,
32
+ параллельно количетвом запусков команды."""
33
+
34
+ help = 'Команда для отправки данных в витрину параллельно-последовательно' # noqa: A003
35
+
36
+
37
+ def handle(self, *args: tuple[Any], **kwargs: dict[str, Any]) -> None:
38
+ """Обработчик команды."""
39
+ while True:
40
+ self.stdout.write(f'Начало проверки статуса загрузки данных в витрину..')
41
+
42
+ # Получаем незавершенные загрузки данных в витрину
43
+ in_progress_uploads = RDMExportingDataSubStageUploaderClientLog.objects.filter(
44
+ file_upload_status=FileUploadStatusEnum.IN_PROGRESS,
45
+ is_emulation=False,
46
+ ).select_related('attachment')[:BATCH_SIZE]
47
+
48
+ for upload in in_progress_uploads:
49
+ upload.file_upload_status = FileUploadStatusEnum.IN_CHECK
50
+
51
+ RDMExportingDataSubStageUploaderClientLog.objects.bulk_update(in_progress_uploads, fields=['file_upload_status'])
52
+
53
+ self.stdout.write(f'Обновление статуса загрузки данных в витрину на {FileUploadStatusEnum.IN_CHECK}..')
54
+
55
+ UploadStatusHelper(in_progress_uploads, cache).run()
56
+
57
+ sleep(10)
58
+
59
+ self.stdout.write(f'Окончание проверки статуса загрузки данных в витрину.\n\n')
@@ -0,0 +1,45 @@
1
+ from time import sleep
2
+ from typing import (
3
+ Any,
4
+ )
5
+
6
+ from django.core.management.base import (
7
+ BaseCommand,
8
+ )
9
+
10
+ from django.core.cache import (
11
+ cache,
12
+ )
13
+
14
+ from edu_rdm_integration.stages.upload_data.operations import (
15
+ UploadData,
16
+ )
17
+ from edu_rdm_integration.stages.upload_data.queues import (
18
+ RdmDictBasedSubStageAttachmentQueue
19
+ )
20
+
21
+
22
+ class Command(BaseCommand):
23
+ """Команда для отправки данных в витрину параллельно-последовательно. В рамках скрипта последовательно,
24
+ параллельно количетвом запусков команды."""
25
+
26
+ help = 'Команда для отправки данных в витрину параллельно-последовательно' # noqa: A003
27
+
28
+
29
+ def handle(self, *args: tuple[Any], **kwargs: dict[str, Any]) -> None:
30
+ """Обработчик команды."""
31
+ while True:
32
+ self.stdout.write(f'Начало отправки данных в витрину')
33
+
34
+ queue = RdmDictBasedSubStageAttachmentQueue()
35
+ upload_data = UploadData(
36
+ data_cache=cache,
37
+ queue=queue,
38
+ )
39
+
40
+ upload_result = upload_data.upload_data()
41
+
42
+ sleep(40)
43
+
44
+ self.stdout.write(f'Общий объем отправленных файлов {upload_result["total_file_size"]}')
45
+ self.stdout.write(f'Сущности, отправленные в витрину {upload_result["uploaded_entities"]}')
@@ -1,8 +1,12 @@
1
1
  import json
2
+ import uuid
2
3
  from abc import (
3
4
  ABC,
4
5
  abstractmethod,
5
6
  )
7
+ from collections import (
8
+ defaultdict,
9
+ )
6
10
  from typing import (
7
11
  Any,
8
12
  Union,
@@ -66,8 +70,6 @@ class RdmRedisSubStageAttachmentQueue(Queue):
66
70
  (Sorted Set in Redis)
67
71
  - Информация по файлам стандартно по ключу - ключом выступает sub_stage_id
68
72
  """
69
-
70
- queue_key = 'rdm:export_sub_stage_ids_queue'
71
73
  prefix = 'rdm:'
72
74
 
73
75
  def __init__(self, *args, **kwargs):
@@ -81,6 +83,9 @@ class RdmRedisSubStageAttachmentQueue(Queue):
81
83
  password=settings.RDM_REDIS_PASSWORD,
82
84
  )
83
85
 
86
+ self.queue_key = f'rdm:export_sub_stage_ids_queue:{str(uuid.uuid4())[:4]}'
87
+
88
+
84
89
  def _make_key(self, key: Union[int, str]) -> str:
85
90
  """Формирование ключа."""
86
91
  return f'{self.prefix}{key}'
@@ -169,3 +174,46 @@ class RdmRedisSubStageAttachmentQueue(Queue):
169
174
  db = kwargs['db']
170
175
 
171
176
  return f'Redis {version} on {host}:{port}/{db}'
177
+
178
+
179
+ class RdmDictBasedSubStageAttachmentQueue(Queue):
180
+ """Очередь файлов и подэтапов на основе словаря.
181
+
182
+ Данные хранятся следующим образом:
183
+ - Словарь вида (id подэтапа, сущность): список с данными по файлам.
184
+ Данные по файлу в именнованном кортеже UpladFile
185
+ {
186
+ (sub_stage_id,entity): [UploadFile1, UploadFile2],
187
+ }
188
+ """
189
+
190
+ def __init__(self, *args, **kwargs):
191
+ """Инициализация объекта очереди Queue."""
192
+ super().__init__(*args, **kwargs)
193
+
194
+ self.data = defaultdict(list)
195
+
196
+ @property
197
+ def count(self) -> int:
198
+ """Возвращает количество подэтапов в очереди."""
199
+ return len(self.data)
200
+
201
+ def enqueue(self, stage_id, entity_name: str, attachmets: list[UploadFile]) -> None:
202
+ """Помещение в очередь.
203
+
204
+ Подэтап попадает в упорядоченную очередь."""
205
+
206
+ self.data[(stage_id, entity_name)].extend(attachmets)
207
+
208
+ def dequeue(self) -> dict[tuple[Any, Any], list[UploadFile]]:
209
+ """Возвращает все данные из очереди."""
210
+ return self.data
211
+
212
+ def delete_from_queue(self, sub_stage_id: int, entity_name: str) -> None:
213
+ """Удаление элемента из очереди."""
214
+ self.data.get((sub_stage_id, entity_name))
215
+
216
+ def clear(self) -> None:
217
+ """Очистить очередь."""
218
+ self.data.clear()
219
+
@@ -32,7 +32,7 @@ from edu_rdm_integration.stages.upload_data.operations import (
32
32
  UploadData,
33
33
  )
34
34
  from edu_rdm_integration.stages.upload_data.queues import (
35
- RdmRedisSubStageAttachmentQueue,
35
+ RdmDictBasedSubStageAttachmentQueue
36
36
  )
37
37
 
38
38
 
@@ -81,7 +81,7 @@ class UploadDataAsyncTask(UniquePeriodicAsyncTask):
81
81
  """Выполнение."""
82
82
  super().process(*args, **kwargs)
83
83
 
84
- queue = RdmRedisSubStageAttachmentQueue()
84
+ queue = RdmDictBasedSubStageAttachmentQueue()
85
85
  upload_data = UploadData(
86
86
  data_cache=cache,
87
87
  queue=queue,
@@ -24,6 +24,18 @@ def update_foreign_key_constraint(
24
24
  on_delete (str): Поведение при удалении связанной записи.
25
25
  """
26
26
  with connection.cursor() as cursor:
27
+ # Проверяем существование таблиц
28
+ cursor.execute("""
29
+ SELECT EXISTS (
30
+ SELECT FROM information_schema.tables WHERE table_name = %s AND table_schema = 'public'
31
+ ) AND EXISTS (
32
+ SELECT FROM information_schema.tables WHERE table_name = %s AND table_schema = 'public'
33
+ );
34
+ """, [table_name, target_table])
35
+
36
+ if not cursor.fetchone()[0]:
37
+ return
38
+
27
39
  # Найти имя constraint'а
28
40
  cursor.execute(f"""
29
41
  SELECT conname
@@ -0,0 +1,54 @@
1
+ function logsPeriodsValidator(startField, endField) {
2
+ if (
3
+ startField.getValue() &&
4
+ endField.getValue() &&
5
+ startField.getValue() > endField.getValue()
6
+ ) {
7
+ return 'Дата конца периода не может быть меньше даты начала периода';
8
+ }
9
+ return true;
10
+ }
11
+
12
+ function setupPeriodFields(startField, endField) {
13
+ // Функция валидации обоих полей
14
+ function validatePeriodFields() {
15
+ startField.validate();
16
+ endField.validate();
17
+ }
18
+
19
+ // Установка времени начала по умолчанию 00:00:00
20
+ function setDefaultStartTime() {
21
+ if (!startField.getValue()) {
22
+ const defaultDateTime = new Date();
23
+ defaultDateTime.setHours(0, 0, 0);
24
+ startField.setValue(defaultDateTime);
25
+ }
26
+ }
27
+
28
+ // Установка времени конца по умолчанию 23:59:59
29
+ function setDefaultEndTime() {
30
+ if (!endField.getValue()) {
31
+ const defaultDateTime = new Date();
32
+ defaultDateTime.setHours(23, 59, 59);
33
+ endField.setValue(defaultDateTime);
34
+ }
35
+ }
36
+
37
+ // Настройка обработчиков для поля начала периода
38
+ startField.menu.on('beforeshow', setDefaultStartTime);
39
+ startField.on('change', validatePeriodFields);
40
+ startField.on('select', validatePeriodFields);
41
+
42
+ // Настройка обработчиков для поля конца периода
43
+ endField.menu.on('beforeshow', setDefaultEndTime);
44
+ endField.on('change', validatePeriodFields);
45
+ endField.on('select', validatePeriodFields);
46
+
47
+ // Установка валидаторов
48
+ startField.validator = function() {
49
+ return logsPeriodsValidator(startField, endField);
50
+ };
51
+ endField.validator = function() {
52
+ return logsPeriodsValidator(startField, endField);
53
+ };
54
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edu-rdm-integration
3
- Version: 3.22.5
3
+ Version: 3.22.8
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=4dklnQS7rtuYJu0Hh7oX1Z9dc72pbIWZl9gXMUvc4rI,1526
12
+ edu_rdm_integration/core/consts.py,sha256=DhYEd6DiU9_4eDGH2mTL3sowkubHeEkVi11QSfGj74o,1679
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
@@ -56,7 +56,7 @@ edu_rdm_integration/pipelines/transfer/apps.py,sha256=mf8voFbMU3FWOwbyisgUUrnUBp
56
56
  edu_rdm_integration/pipelines/transfer/enums.py,sha256=7eaCcR_SQD_xz3DXywwZivxfcn0s2BsAddS9LsXlujE,787
57
57
  edu_rdm_integration/pipelines/transfer/mixins.py,sha256=tG-04PHYFWZBcVKDx3IejRJq4DsG3WSYeeGg_AnJTR0,4972
58
58
  edu_rdm_integration/pipelines/transfer/models.py,sha256=_ZxNVhTntJe07K5P56mzp_sfhNykn-_Zbe7xtktmhNY,1584
59
- edu_rdm_integration/pipelines/transfer/tasks.py,sha256=6jSJl4aNugKG45Sxb2cWAtS1R_y8LmLT7PHtRZ0GZrk,10936
59
+ edu_rdm_integration/pipelines/transfer/tasks.py,sha256=r2Y12DyIy3xNBqSKswFMSFA_3qwvU64E03y2WvEpVtQ,11089
60
60
  edu_rdm_integration/pipelines/transfer/ui.py,sha256=GLRy_oWO50ZbWcb9vnhP5nVuS8pImtw9APyV4tgm7sg,2543
61
61
  edu_rdm_integration/pipelines/transfer/migrations/0001_initial.py,sha256=js-Ap6xnw0yBN7E9k7gh9dz-jZkNyDUwmMGftwC55EQ,2322
62
62
  edu_rdm_integration/pipelines/transfer/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -79,7 +79,7 @@ edu_rdm_integration/rdm_models/migrations/0001_initial.py,sha256=qXgObuG2nfOLEnG
79
79
  edu_rdm_integration/rdm_models/migrations/0002_rename_regionaldatamartmodelenum_rdmmodelenum.py,sha256=hNTLriOc9r9WEVKahJURA3yXhZ3ivbwJJ_HaMC46PpI,451
80
80
  edu_rdm_integration/rdm_models/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
81
  edu_rdm_integration/stages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- edu_rdm_integration/stages/utils.py,sha256=XTOXXP1KeLCURjkjObP-lcIEARIBkgguk4MfN2dXivQ,1780
82
+ edu_rdm_integration/stages/utils.py,sha256=Gm07aspzt8jTN8v2pJRxyTCUs-kGeV-JzrxWunUgaf4,2253
83
83
  edu_rdm_integration/stages/collect_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
84
  edu_rdm_integration/stages/collect_data/apps.py,sha256=PhrxzAMXvzXajSlgwLudAgasVjh9IFS5M7a7pGbEKC0,339
85
85
  edu_rdm_integration/stages/collect_data/consts.py,sha256=tzaK9oxzdMRq3oTEocPz4umoXSJWUtFc7YhyXucCNbs,127
@@ -162,15 +162,15 @@ edu_rdm_integration/stages/collect_data/registry/__init__.py,sha256=47DEQpj8HBSa
162
162
  edu_rdm_integration/stages/collect_data/registry/actions.py,sha256=-3l944Csa5HCbrPqSOVwkVquoTBaju6BRtGOxF-Mnxc,10171
163
163
  edu_rdm_integration/stages/collect_data/registry/apps.py,sha256=K5f97YXKMmdM7m33qgQYvJjrA8_eGAJ4VWyuRjJ0gwQ,439
164
164
  edu_rdm_integration/stages/collect_data/registry/ui.py,sha256=pw13DAASxqnX_E5D4RG9CywtnQKQeljXHief7mojVgk,8398
165
- edu_rdm_integration/stages/collect_data/registry/templates/ui-js/collect-command-window.js,sha256=QfxVSAA0282-41K0XGtyPa9WPzpoX_uClke8pHdAzBo,3112
166
- edu_rdm_integration/stages/collect_data/registry/templates/ui-js/validators.js,sha256=8A07RgqRs71UuyHNc0HA_isGZL5-W9iLm0O-eC2JFT8,2021
165
+ edu_rdm_integration/stages/collect_data/registry/templates/ui-js/collect-command-window.js,sha256=AZsvitxQyK1FzCH_naHzZ9S-18mKU2otoqeYNa6wqH8,2777
166
+ edu_rdm_integration/stages/collect_data/registry/templates/ui-js/validators.js,sha256=udLEG1MwycYYgSrYiQr7Bqg7meNoetH8rF4JSRyrUdk,1524
167
167
  edu_rdm_integration/stages/export_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
168
  edu_rdm_integration/stages/export_data/apps.py,sha256=TU6AaMZGQE2oHVwKgtUDzFplaVasb2tMIurhkhwkxZo,406
169
169
  edu_rdm_integration/stages/export_data/consts.py,sha256=ZEi1kXMs-54KFKxkyGIQVwZ4d8OrOF_vLFQIjjWdSPQ,441
170
170
  edu_rdm_integration/stages/export_data/generators.py,sha256=XsTGcKm0oDgE3fUVDxRMkNFriOeuPDBAWi32nx5ASuc,3974
171
171
  edu_rdm_integration/stages/export_data/helpers.py,sha256=uBl85AWS-V0usHeLf7VeAsy0ywvqXL_zT1Kgho-MRTM,6537
172
172
  edu_rdm_integration/stages/export_data/mixins.py,sha256=YCr5aNcZmDx07JIr-vMietQQ3sZ82caWc7SWOMfdSjY,1772
173
- edu_rdm_integration/stages/export_data/models.py,sha256=u0gUHGw0qB9QvuhVMAvJ7Xyg5uGvZdKm7oS1UVaxr_g,12340
173
+ edu_rdm_integration/stages/export_data/models.py,sha256=8ewAWI9daAP_pxpq92Y-9m9zuxTp-pIveD_4Rsj1uaw,12426
174
174
  edu_rdm_integration/stages/export_data/operations.py,sha256=g8rj4TaFnkRkaBD4omckBTGwsTlYpuBydOwwxY9hEiI,13188
175
175
  edu_rdm_integration/stages/export_data/strategies.py,sha256=93pRhUOLL_q4VbWTY3CtC5J8rgPPO2EYn0fJk_oLuLk,6520
176
176
  edu_rdm_integration/stages/export_data/function_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -216,10 +216,10 @@ edu_rdm_integration/stages/export_data/migrations/0003_alter_rdmexportingdatasub
216
216
  edu_rdm_integration/stages/export_data/migrations/0004_fix_fk_constraints.py,sha256=F77WlV_UmT2FOWYPWsukfZ_ZqHcwbinIRbQmZJrjS34,3025
217
217
  edu_rdm_integration/stages/export_data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
218
218
  edu_rdm_integration/stages/export_data/registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
219
- edu_rdm_integration/stages/export_data/registry/actions.py,sha256=zJ1GEzyhoGGRCEGxErmepPtec0qNJtcDJJEaPtcATdA,10847
219
+ edu_rdm_integration/stages/export_data/registry/actions.py,sha256=iKolkD3h6lxx4a2agDeyMVSL_KImN6PI_kjQ_5knWu4,10930
220
220
  edu_rdm_integration/stages/export_data/registry/apps.py,sha256=71DtJQ2ULt8_3CnTu2VAfT5ABBrDNY1nKTmZ6UtvIpw,448
221
221
  edu_rdm_integration/stages/export_data/registry/ui.py,sha256=0kWWfOmtTyN4SUO9dGUcEz0wgOPA111jHoWw3_LNPqI,6238
222
- edu_rdm_integration/stages/export_data/registry/templates/ui-js/create-export-command-win.js,sha256=g0dpYsvd_6VfRU4nRv3tNK-0wtMND_VurQRT04ShJjk,1341
222
+ edu_rdm_integration/stages/export_data/registry/templates/ui-js/create-export-command-win.js,sha256=H_bjx5UVjlj1IAm9wZ8AyoukxMXV8W3RFJHwCojng3E,795
223
223
  edu_rdm_integration/stages/export_data/registry/templates/ui-js/stage_for_export.js,sha256=329OZIpiKHlQ-i8JStjBLXtouIMKuJHbycArUGSskfk,737
224
224
  edu_rdm_integration/stages/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
225
225
  edu_rdm_integration/stages/service/apps.py,sha256=lgCG4_kpwgfDWh6y-GNuUwz5SOjkP7oS8kkUyVUcNRg,648
@@ -231,26 +231,28 @@ edu_rdm_integration/stages/service/service_outdated_data/__init__.py,sha256=47DE
231
231
  edu_rdm_integration/stages/service/service_outdated_data/managers.py,sha256=zKGQWIvv1go5OlBIkgBDLNyEKkkHvm0qKFfCatddd68,2715
232
232
  edu_rdm_integration/stages/service/service_outdated_data/cleaners/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
233
233
  edu_rdm_integration/stages/service/service_outdated_data/cleaners/base.py,sha256=7h6eSex_BakFz3jQiJ7R552SLOb9CPn6Z8xG__Vm_xg,10479
234
- edu_rdm_integration/stages/service/service_outdated_data/cleaners/collect_data.py,sha256=zol47C4RQFnHd_MNldOHTtEjzeWsIZji1nDzKVVkJRg,4894
235
- edu_rdm_integration/stages/service/service_outdated_data/cleaners/consts.py,sha256=ONLW_NJFbnYU1CbDF4mzBXXqDt7fyKVfep3Qlf5sJOM,384
236
- edu_rdm_integration/stages/service/service_outdated_data/cleaners/export_data.py,sha256=A27cOnTgYzQA2_JUedB2SSm6y-g82ADoubKqLT71txw,7153
234
+ edu_rdm_integration/stages/service/service_outdated_data/cleaners/collect_data.py,sha256=hVNBRIaYoMw9Ucg-3P4DFgPkN5HS9ltJoT8WBzzA-ss,4695
235
+ edu_rdm_integration/stages/service/service_outdated_data/cleaners/consts.py,sha256=wVBq4PFm1N-NPHysCiR6KRgkbaeejkc9jruWY0ynGds,21
236
+ edu_rdm_integration/stages/service/service_outdated_data/cleaners/export_data.py,sha256=lC-v1kIGw_wbBM5ytU8lKKCcNgnnXKZoiFBSSfEiLI0,7118
237
237
  edu_rdm_integration/stages/service/service_outdated_data/cleaners/upload_data.py,sha256=a8oJ8Sg1eLZf1NemehREkJsvdtmyLwtOIuN5iXpzSb4,2846
238
238
  edu_rdm_integration/stages/upload_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
239
239
  edu_rdm_integration/stages/upload_data/apps.py,sha256=aFhVPK-65b35CGKoAeAgQ0mm3STaWtZg7rqk3eL-b7s,620
240
240
  edu_rdm_integration/stages/upload_data/consts.py,sha256=yTygXxS5dBRCvrE7Q3D0jEGSC5apIKvVAAViDM8QcKA,223
241
241
  edu_rdm_integration/stages/upload_data/dataclasses.py,sha256=zwxlED6yEeMStfc-Y6pvdY7xF-530qbO0HBWfwneeI8,261
242
- edu_rdm_integration/stages/upload_data/enums.py,sha256=uGRqcflf6moPWfFa8KKbeSY2y88-AegAcRJKlQ1PA_Y,453
243
- edu_rdm_integration/stages/upload_data/export_managers.py,sha256=DYHX0LwB6RkRqOEaB5EIWqbSJqjaUfR09AjRTjI2CR4,13646
242
+ edu_rdm_integration/stages/upload_data/enums.py,sha256=MisSJm2kDbW245IaJl5f5if45RCvotPg_8RdL6PQwPg,512
243
+ edu_rdm_integration/stages/upload_data/export_managers.py,sha256=OnycW8DaDUcLAyG-JbUGUymWb9eBzctqpl2kgwT5NuY,13792
244
244
  edu_rdm_integration/stages/upload_data/helpers.py,sha256=lCvM8QsERXRXP9rcpgaSQOKUkvi3bxkeHEC_zZruQy4,6183
245
245
  edu_rdm_integration/stages/upload_data/models.py,sha256=4XiodbnbK2MRBi8wTfU0beZQW3dLPT4_5NAh9DM-9gw,5220
246
246
  edu_rdm_integration/stages/upload_data/operations.py,sha256=CVQYaucerJbOAE3JDO05FaX4Bz9hBMKBXYqJohXKZpI,6462
247
- edu_rdm_integration/stages/upload_data/queues.py,sha256=MbDnltQLjTCXLnNQVO0KA4SaAzyU8xO51CRid6Cle4g,6130
248
- edu_rdm_integration/stages/upload_data/tasks.py,sha256=SYoQjL4sl0W0yOBFczlnQW-N4YcFiFgdMlEQUDO7IsQ,3573
247
+ edu_rdm_integration/stages/upload_data/queues.py,sha256=9PcIZHHh--OslhA0gPLh6yyS7jaxpa5cSFRaJ85rUC4,7851
248
+ edu_rdm_integration/stages/upload_data/tasks.py,sha256=-2CqrlNY17l6cE0VoBrWJKJnYD-2EZid0GvL9IGfVE4,3580
249
249
  edu_rdm_integration/stages/upload_data/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
250
250
  edu_rdm_integration/stages/upload_data/management/base.py,sha256=cXGIXvb1K5Q6xPM7S4W0gqGZO9dUao_ix_hyVJ6bkfQ,4402
251
251
  edu_rdm_integration/stages/upload_data/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
252
252
  edu_rdm_integration/stages/upload_data/management/commands/async_fix_attachment_size.py,sha256=50Bcy4TXg-xrBDBCMmKoxXl6chy2XibJlaD4ij2GCvY,9741
253
253
  edu_rdm_integration/stages/upload_data/management/commands/check_upload_status.py,sha256=FQgt41BDSWrXBdHas6vwCB0dx0sSS7MhGYxPd95sEL4,3951
254
+ edu_rdm_integration/stages/upload_data/management/commands/custom_check_upload_status.py,sha256=Ka1Wf_wb_gh1Y7Ruf8McL21mXUMt1IdLsi9UfRbg70M,2271
255
+ edu_rdm_integration/stages/upload_data/management/commands/custom_upload_files.py,sha256=gih12QHVu4KkBa1qy2P9ZtH4c6Tpd7oTGTIqOjyZlIc,1565
254
256
  edu_rdm_integration/stages/upload_data/management/commands/datamart_status.py,sha256=aKsxjSG2EiSuetyh9mDVfhKU3ZZAAS8GCAXbOv8lQaE,1262
255
257
  edu_rdm_integration/stages/upload_data/management/commands/datamart_upload.py,sha256=VF94eqO3nIbvhPFwtUlYLAMwPXEU0uGt9m5xnIjLu68,1525
256
258
  edu_rdm_integration/stages/upload_data/migrations/0001_initial.py,sha256=4dRroCI8ZxBuyRJC81si-LVAfzLMn3mYDccy48gUzCo,8080
@@ -268,8 +270,9 @@ edu_rdm_integration/stages/upload_data/uploader_log/ui.py,sha256=mU3XA9zVKHGqzNk
268
270
  edu_rdm_integration/stages/upload_data/uploader_log/migrations/0001_initial.py,sha256=r5oOB7DBK9-mfuqPAgjXUJY5-hEcmMdILCwDTpaLnBc,753
269
271
  edu_rdm_integration/stages/upload_data/uploader_log/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
270
272
  edu_rdm_integration/stages/upload_data/uploader_log/templates/ui-js/object-grid-buttons.js,sha256=2xyGe0wdVokM0RhpzRzcRvJPBkBmPe3SlZry4oP4Nzs,6201
271
- edu_rdm_integration-3.22.5.dist-info/licenses/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
272
- edu_rdm_integration-3.22.5.dist-info/METADATA,sha256=AV1obC85cWLt_cOlLzzwn6ZlCI_pl9rQH_VEs6rHXKI,43714
273
- edu_rdm_integration-3.22.5.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
274
- edu_rdm_integration-3.22.5.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
275
- edu_rdm_integration-3.22.5.dist-info/RECORD,,
273
+ edu_rdm_integration/templates/ui-js/collect-and-export-validators.js,sha256=NMjuFzc7sCK8EKbsrT7p-7Tvxa3AcNSRdKHQnlTK2v8,1967
274
+ edu_rdm_integration-3.22.8.dist-info/licenses/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
275
+ edu_rdm_integration-3.22.8.dist-info/METADATA,sha256=tAFUxWFDQ-3VhyyJBQkSlV1VYHQsN_VHSSfcMOnBS2w,43714
276
+ edu_rdm_integration-3.22.8.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
277
+ edu_rdm_integration-3.22.8.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
278
+ edu_rdm_integration-3.22.8.dist-info/RECORD,,