В СПбГУ студенты-должники, закрывшиеся справками, отправляются на допсессию по индивидуальному графику. Расписание допсессии составляется в студотделе и рассылается всем преподавателям, которые должны что-либо принимать, по почте в виде текстовых документов. Для каждого студента расписание состоит из списка дисциплин, которые ему надо пересдать, и для каждой дисциплины фиксируется дата сдачи, пересдачи и комиссии. Проблема в том, что у среднего активного преподавателя таких "хвостистов" может быть несколько десятков, причём расписание составляется не сразу для всех, а по частям, и досоставляется в процессе (хвостисты нередко закрывают справками весь график, и тогда для них надо составлять новый). Следить вручную за всем этим может быть сложно и трудозатратно (порядка получаса в неделю на разбор графиков, которые за эту неделю наприсылали, причём это совершенно непродуктивно потраченное время, и очень скучно), а цена ошибки высока — если студент пришёл пересдавать, а препод нет, потому что забыл занести в календарь эту конкретную сдачу, то это прямо скандал. Хочется инструмент, который бы умел это автоматизировать, тем самым помогая преподавателю экономить время и минимизируя риск кого-то пропустить.
Реализовать нужный инструмент можно на нескольких уровнях, в зависимости от навыков реализатора и готовности тратить на это время.
Требуется консольный инструмент, принимающий как параметр командной строки имя .docx-файла с индивидуальным графиком и обновляющий таблицу на Яндекс.Диске с расписанием сдач. Таблица может выглядеть, например, вот так:
При запуске инструмента новые пересдачи из индивидуального графика добавляются на своё место в таблицу в порядке даты и времени актуальной сдачи. Старые записи пересортировываются в порядке актуальной даты и времени сдачи — если дата сдачи прошла, актуальной считается ближайшая ненаступившая в графике по дисциплине. Если все даты сдачи прошли, запись в таблице перемещается вверх и выделяется красным для ревью преподавателем и последующиего удаления.
- Должна быть возможность запуска инструмента без параметров — в этом случае он пересортирует уже имеющиеся в таблице даты.
- Ссылка на таблицу и клиентские секреты для доступа на Яндекс.Диск должны браться из конфигурации, по требованию Яндекс.Диска должна выполняться авторизация по протоколу OAuth.
- Должна быть также написана подробная инструкция, как любому преподавателю получить, собрать и настроить инструмент для работы со своими индивидуальными графиками.
- дополнительная задача После каждого запуска должен гененироваться календарь в формате iCal для удобного экспорта в календари наподобие Яндекс.Календарь.
Требуется веб-приложение, которое красиво отображает календарь сдач по индивидуальным графикам для зарегистрированных преподавателей и позволяет загрузить .docx с индивидуальным графиком, чтобы добавить оттуда новые записи.
- Требуется аутентификация преподавателей.
- Требуется экспорт календаря с автоматическим обновлением, как это сейчас делает тул для синхронизации календаря и Timetable.
- Требуется возможность пометить сдачу как успешную, в этом случае запись дисциплины удаляется из базы.
Требуется веб-приложение для составления и просмотра расписания индивидуальных графиков. Боль преподавателей по разбору графиков несравнима с болью сотрудников студотдела по их составлению, кроме того, кривые .doc-файлы, рассылаемые по почте, никому радости не добавляют (и, скорее всего, сложны в парсинге). Поэтому предлагается сделать приложение, автоматизирующее и составление графиков тоже, и записывающее составленные графики в базу, доступную для отображения преподавательской части из уровня 2.
- Все требования Уровня 2 применимы и тут, к преподавательскому интерфейсу приложения.
- Интерфейс составления индивидуального графика должен позволять ввести ФИО студента и номер его группы, после чего отобразится подгруженное из Timetable расписание для его учебной группы (чтобы избежать попадания пересдачи на пару по расписанию).
- Интерфейс также должен позволять выбрать из списка дисциплину, по которой выполняется пересдача, и указать преподавателя. После чего показывается расписание преподавателя, подгруженное из Timetable (чтобы избежать попадания пересдачи на время, когда преподаватель на паре).
- Выбор из списка выполняется по учебному плану, для этого потребуется использовать сервис парсинга учебных планов, который уже более-менее существует.
- В списке должны отображаться только дисциплины, по которым в принципе возможна пересдача (по номеру группы можно понять, о каких семестрах может идти речь, плюс исключить из списка дисциплины без аттестации).
- Должен быть удобный поиск по списку (начали вводить дисциплину или её код — показываются отфильтрованные дисциплины).
- На комиссию нельзя выбрать преподавателя, который принимал сдачу и пересдачу.
- дополнительная задача Преподаватель может через свой интерфейс ввести время, когда он никак не может (например, в командировке), эта информация также показывается в интерфейсе сотрудника студотдела.
- После выбора дисциплины и преподавателя появляется возможность указать время и место сдачи, пересдачи и комиссии.
- Из Timetable получаем информацию о занятости аудиторий, проверяем, что в данном тайм-слоте аудитория свободна.
- Проверяется, что данный тайм-слот не занят другой пересдачей и другие ограничения (которые требуется предварительно выяснить в студотделе — например, кажется, не больше двух сдач в день).
- По нажатию на кнопку "Сохранить" запись добавляется в базу.
- Должна быть возможность экспорта новых записей в файл с распоряжением (тот самый .docx, который сейчас рассылают преподавателям — рассылать его не будут, но приказ на утверждение надо отправить в правильной форме).
- Должна быть возможность показать все записи индивидуальных графиков или отфильтрованные по конкретному студенту или преподавателю.
- Реализация должна быть на платформе .NET и языках программирования C# или F#.
- Работа должна вестись в этом репозитории, согласно Git Flow (main — стабильная релизная ветка, develop — актуальная разработческая ветка, вся разработка в feature-ветках, мерджащихся через пуллреквесты в develop).
- Требуется CI, модульные тесты, архитектурная документация, комментарии в коде.
- Для работы с .docx-файлами и электронными таблицами рекомендуется использовать библиотеку https://github.com/yurii-litvinov/DocUtils.
- Для работы с учебными планами, если она потребуется, можно использовать библиотеку https://github.com/yurii-litvinov/CurriculumParser или веб-сервис https://github.com/yurii-litvinov/RpdProcessor (который надо привести в адекватное состояние и задеплоить — скорее всего, с помощью научника).
- Для веб-приложений:
- Клиентская часть должна разрабатываться на TypeScript, как одностраничное приложение (на Vue, React или подобных фреймворках).
- Требуется авторизация по протоколу OAuth с использованием российских OAuth-сервисов (например, Яндекс).
- Видимо, требуется общая для всех преподов и сотрудников учебного управления база данных для хранения записей о пересдачах.
- Обязательно резервное копирование всех данных и чёткая и автоматизированная процедура восстановления сервиса со всеми данными с нуля, включая ситуацию с переходом на другой облачный провайдер.
- Нужна продуманная схема миграции при изменении схемы БД.
- Требуется контейнеризация в Docker, и, в случае наличия нескольких сервисов, Docker Compose.
- дополнительная задача Требуется наладить процесс выкладывания релизной версии приложения на Yandex Cloud, возможно более автоматический.
- Часто принимают пересдачу не те преподаватели, которые указаны в графике, поэтому важно каждому преподавателю отображать не только его сдачи, но и потенциально интересные ему (например, пересдачи практик у техпрога, записанные на А.Н. Терехова, скорее всего, будет принимать Ю.В. Литвинов).
- Если сдача и пересдача были записаны на преподавателя, комиссия должна отображаться преподавателю (его всё равно туда пригласят).
- Преподаватель должен иметь возможность указать пару из направления подготовки и дисциплины, все сдачи по которым попадают ему в список сдач (например, графики по учебным практикам могут писаться на завкафов разных кафедр, но организовать их всё равно должен руководитель практики).
- Должна быть возможность отписаться от конкретной сдачи (точнее, дисциплины у конкретного студента), если преподаватель точно знает, что это не его.
- Перед тем, как что-то писать для студотдела, надо сделать макет, показать его сотрудникам студотдела (возможно, с помощью научника) и собрать от них уточнённые требования.