Синхронизация студентов
Модели
Процессы
Запрос информации
DiSpace запрашивает данные у ЦИУ по ссылке (пример ссылки ниже). В ответ приходят данные в формате JSON.
Параметры запроса:
- workspaceID - int - обязательный параметр, ID рабочего пространства.
- decode_unicode_escape - обязательный параметр.
- json_indent - обязательный параметр.
Периодичность синхронизации
Синхронизация выполняется в начале каждого семестра, а так же в течении семестра в ручном режиме. У суперюзера есть страница запуска всех синхронизаций. Там через интерфейс можно выбрать пространство и запустить любой из указанных скриптов.
Обработка информации
Данные в формате JSON, ниже указаны какие конкретно атрибуты передаются:
- ID_CIU — устаревший ID учащегося, для поиска по устаревшим данным.
- FAMILY_NAME — Фамилия.
- NAME — Имя.
- PATRONYMIC_NAME — Отчество.
- SHIFR — ученический шифр студента.
- EMAIL — e-mail студента.
- REMARK — комментарий от ЦИУ, назначение поля плавающее. При синхронизации также записывается в поле city (странная логика — нужно это учесть и удалить).
- ID_UNIQUE — id_ciu_unique, уникальный идентификатор пользователя.
- STATUS — статус, 1, 2, 3: активный / отчисленный. Сейчас игнорируется, так как приходят только активные студенты.
- ID_STUDY_GROUP — id_ciu группы.
- data — данные по назначенному тестированию (см. раздел Привязка тестов
).
Для начала получаем роль студента (в рабочем пространстве) в синхронизируемом пространстве. Если такой нет, алгоритм исполнить невозможно — выходим из скрипта с ошибкой.
После получения списка студентов ЦИУ, выполняем следующее: - Группируем студентов ЦИУ по группам, чтобы можно было определить, перемещен ли студент в другую группу или нет. - Получаем список всех групп DiSpace в пространстве. Будем обходить его и сверять со списком ЦИУ.
Обходим список групп DiSpace и на каждом шаге:
Получаем список всех студентов в этой группе. Если в передаваемой группе ЦИУ студенты есть, начинаем сверку. Для этой группы ЦИУ начинаем обходить каждого студента ЦИУ.
- Пытаемся получить студента в нашей базе по признакам из ЦИУ:
- По id_ciu_unique.
- Если такой не найден, и это студент из пространства абитуриентов или любого пространства магистрантов (в квадрате, школа развития, ФПК), сразу создаём в указанной группе нового студента и выходим из алгоритма. Иначе продолжаем поиск.
- По ФИО.
- Если найдено несколько полных однофамильцев, проверяем их id_ciu_unique. Если id_ciu_unique не заполнен — берём этого.
- Если другой id_ciu_unique — это полный однофамилец, пропускаем. Так бывает.
- По первичному e-mail.
- Если нашли студента по любому из критериев, проверяем необходимость обновления:
- Проверяем, обновились ли ФИО по каждому из полей. Меняется не только фамилия, бывает, что меняются имя и отчество.
- Если e-mail у него не установлен, и не назначен никому ещё в базе, установить e-mail этому пользователю из ЦИУ. Поле e-mail уникальное, нужно обязательно проверить, не назначено ли оно ещё кому-то.
- Если не установлен id_ciu_unique — сохранить его.
- Для ФПК сохранить e-mail в качестве secondary (устаревшая логика).
- Если ни по одному из критериев поиск не удался — создаём нового пользователя.
- E-mail из ЦИУ записываем в качестве secondary, первичный e-mail не сохраняем (устаревшая логика, нужно писать в первичный).
- Добавляем ему роль студента.
- Привязываем к рабочему пространству.
Дальше работаем с сущностью студент. Получаем запись студента для этого пользователя и просматриваемой группы. Если он найден, студент находится в нужной ему группе, его не трогаем. В противном случае его нужно перевести или отчислить.
Перевод
Если найдена студенческая запись этого пользователя в другой группе, выполняем перевод. - Проверяем роль студента в другой группе, принадлежит ли она этому пространству? Если нет, такого студента мы не переводим и не обновляем, создаем полностью новую запись студента. Это нужно, чтобы не потерялась история отправленных работ и оценки. - Если у студента несколько групп (редкая ошибочная ситуация) — берём ту запись, которая совпадает с нашей целевой. Вторая будет автоматически отчислена далее. - Если найденная запись имеет статус 3 (отчислен), студента восстанавливаем (status → 1). - Если есть критичные изменения в записи студента, сохраняем их (новая группа, шифр студента, запись от ЦИУ — атрибут remark в модели студента) - Если студент не найден, создаем запись студента.
Если студент переводится в пределах текущего рабочего пространства, автоматически перебрасываем ему работы в новую группу.
Переброс работ
Мы должны постараться осуществить бесшовный переход студента, чтобы его работы остались доступны, т.е. привязаны к аналогичным контролирующим мероприятиям новой группы при полном совпадении их имен.
План может быть кардинально другой, преподаватели и дисциплины могут быть другими, поэтому не всё может совпасть. Переброс работает по следующему алгоритму: - Получаем список старых дисциплин студента. - Получаем список новых дисциплин студента. - Если совпадает название, семестр и есть одноименное мероприятие в журнале — привязываем работу.
Отчисление
Если студент не принадлежит группам из списка Исключение 2 (см. синхронизация групп), ставим ему статус 3. Он отчислен.
Привязка тестов
Для пространств абитуриентов, магистрантов и опросов нужно также привязать тесты. Параметры тестов приходят в поле data[] — список тестов с количеством попыток, названием, гарантированным баллом, датой тестирования и т.д.
Формат data следующий:
- GARANT_BALL — минимальный балл, который получит студент после прохождения. Даже если студент не ответил ни на один вопрос, он получит GARANT_BALL баллов.
- DISC — назначаемый тест.
- DATE_TEST — дата тестирования.
- TIME_TEST — время тестирования. Если не пришло, время устанавливается по алгоритму ниже, в зависимости от пространства.
- ID_CARD_PROCTOR — id_ciu_unique проктора (атрибут модели пользователь).
- ID_TEST_OLD — ранее пройденный тест, абитуриент выбрал его ошибочно или отозвал поступление по направлению, его нужно отвязать.
- FAC_NAME — факультет поступления (для магистратуры).
- SPECIALITY — специальность (для магистратуры).
- ADD_TEST — направление, например, Т
, Э
(для магистратуры).
- LANG — иностранный язык студента (для магистратуры).
- ADD_TIME — по умолчанию тестирование на 2 ч, если TRUE — +1 ч. Дополнительный час всегда добавляется студентам с физическими ограничениями.
- VII_AUD, VIII_AUD — аудитория тестирования. Было актуально для доковидной эпохи. Если хотя бы одно TRUE, разрешает тестироваться по любому IP. По умолчанию интервал 192.168.0.0–192.168.255.255.
Сейчас можно тестироваться по любому IP всегда.
(поле устарело)
Если это пространство опросов, привязываем тест 11720 (Проверка знаний по Охране труда) с неограниченным временем прохождения и 3 попытками. Выход.
Если пространство абитуриентов или магистратуры в квадрате, привязка осуществляется с параметрами, которые приходят из ЦИУ. В этом случае ЦИУ присылает даже ID теста (поле DISC), мы тут же делаем назначение и не выполняем дополнительных проверок. Этот идентификатор мы передаём в ЦИУ вручную, по мере обновления тестов преподавателями. Тестов немного (русский язык, математика, физика, история, информатика, т.е. стандартный набор для поступления), поэтому ручной труд в этом случае оправдан.
Прочие пространства. Во всех остальных случаях тест ищется автоматически, на основе полей в data: FAC_NAME, SPECIALITY, ADD_TEST, LANG. Если дата назначения теста DATE_TEST раньше текущей даты, назначение этого теста пропускаем.
Алгоритм поиска. SPECIALITY преобразуем к виду “через точки” 111111 → 11.11.11. Ищем в базе активные тесты с именем, начинающимся по шаблону ${FAC_NAME}_${SPECIALITY}${ADD_TEST}%
Может найтись несколько тестов с разными языками, либо бывают тесты без языка, которые подходят всем пользователям независимо от его выбора. А также пробные тесты со строкой (пробный)
в конце.
Проверяем полученный массив найденных тестов:
- Тест с OLD
в названии отбрасывается.
- Тест с пробный
в названии отбрасывается.
- Если тест без языка или в массиве найденный есть тест с выбранным пользователем языком — назначаем его с параметрами из ЦИУ. Всем назначениям ставится строгое оценивание.
Время тестирования рассчитывается как: - Для магистрантов всех типов, абитуриентов и пространства опросов. - дата начала устанавливается как 08:00:01 - дата окончания устанавливается как +16 ч от начала. - Для всех остальных дата начала 08:50:00, окончание +8 ч.(выглядит как устаревшая логика)
Для абитуриентов статус назначения устанавливается как 0 (неактивный). Позже он активируется вручную проктором. Если приходит ID_CARD_PROCTOR, к записи тестирования привязывается проктор.
Особые пожелания факультетов.
Некоторые факультеты хотят особые настройки тестирования. Этот пункт может менять каждый год в зависимости от ответственного по факультету, желания декана или если он хотел этого в прошлом году, но передумал, забыл и звонит ругаться узнать почему так: - ФЭН отключил строгое оценивание. - ФПМИ передумал и использует настройки по умолчанию.
Если в data приходит ID_TEST_OLD, этот тест у студента отвязывается.