Files
LMS/docs/05-states.md

5.9 KiB
Raw Permalink Blame History

Диаграммы состояний

1. Сессия защиты (defense_sessions.status)

stateDiagram-v2
    [*] --> waiting : преподаватель назначил задание
    waiting --> waiting : выдан/обновлён код
    waiting --> started : студент ввёл верный код
    started --> ready : студент завершил работу
    started --> ready : истекло время (syncTimeouts, readyReason=timeout)
    ready --> waiting : «доп. задание: начать заново» (reset)
    ready --> [*] : задание принято
    note right of waiting
        code = NULL — ждёт кода
        code != NULL — код выдан
    end note

2. Публикация оценок (пара «студент + лабораторная»)

stateDiagram-v2
    [*] --> hidden : оценка выставлена (lab_grades)
    hidden --> published : чекбокс публикации в ячейке студент×ЛР (grade_publication_students)
    published --> hidden : снять чекбокс
    hidden --> published : «опубликовать всем» (глаз в шапке ЛР)
    published --> hidden : «скрыть у всех»
    note right of hidden
        студент не видит ни балл, ни комментарии.
        Проверка доступа — по (student, lab):
        групповая публикация (легаси, grade_publications)
        открывает всем, иначе — по списку студентов.
    end note
    note right of published
        видно только выбранным студентам; подсказки
        комментариев показывают частоту и позволяют
        удалять шаблоны с частотой 0
    end note

Кнопки: чекбокс в ячейке публикует/скрывает оценку конкретному студенту (AJAX, без перезагрузки, тост с «N из M»); «глаз» в шапке лабораторной — массово «всем/скрыть у всех» (частичное состояние — жёлтый со счётчиком).

3. Статус лабораторной (labs.status)

stateDiagram-v2
    [*] --> draft : импорт/создание
    draft --> published : публикация
    published --> draft : снятие с публикации
    note right of draft
        студентам не видна;
        доступна для настройки
    end note
    note right of published
        видна студентам: условие, вариант,
        сдача; оценки — только после публикации
    end note

4. Публикация материалов (главы, разделы, статьи)

stateDiagram-v2
    state "опубликовано" as pub
    state "скрыто" as hid
    [*] --> pub : импорт/создание (published=true)
    pub --> hid : «Скрыть» (published=false)
    hid --> pub : «Опубликовать»
    note right of hid
        Не видно гостям и студентам:
        глава целиком скрывает разделы и статьи,
        раздел — свои статьи.
        Администратор видит их с бейджем «скрыто»
        и может открыть для предпросмотра.
    end note

5. Жизненный цикл сдачи решения

stateDiagram-v2
    [*] --> notSubmitted : лабораторная выдана
    notSubmitted --> submitted : сдача (seq = 1, файлы на диске)
    submitted --> submitted : переотправка (seq + 1, хранится вся история)
    submitted --> closed : наступил дедлайн (deadlineAt)
    submitted --> closed : выдано индивидуальное задание на защиту
    closed --> [*]
    note right of closed
        Форма отправки скрыта,
        доступно только скачивание
        ранее отправленных решений
    end note
    note right of submitted
        Скачать можно любую попытку;
        преподаватель видит последнюю
    end note

6. Вариант студента

stateDiagram-v2
    [*] --> none : студент в группе, ЛР опубликована
    none --> auto : распределение («Раздать»)
    auto --> manual : «Закрепить» конкретный вариант
    auto --> auto : повторное распределение без force (не трогает занятые)
    manual --> manual : force не перезаписывает ручные закрепления
    auto --> none : force (сброс авто-назначений)
    note right of auto
        подбирается наименее занятый вариант
        своего уровня; пока есть невыданные —
        повторов нет
    end note

7. Пароль студента

stateDiagram-v2
    [*] --> temporary : аккаунт создан / «Сбросить пароль»
    temporary --> own : смена на /change-password
    own --> temporary : «Сбросить пароль» администратором
    note right of temporary
        must_change_password = true,
        temp_password хранится;
        пока пароль не сменён, доступны только
        /change-password, /logout и статика
    end note
    note right of own
        must_change_password = false,
        temp_password = NULL
    end note