Ознакомиться с docs/TEAM_ASSIGNMENTS_PLAN.md и реализовать функционал согласно плану.
Продолжение #46: сейчас /join/{course_id}/{lab_id} создаёт один репозиторий на одного студента. Нужно поддержать лабы, которые выполняются командами: один репозиторий на команду, доступ у всех её участников.
Сценарий: студент переходит по той же ссылке, авторизуется через GitHub, видит список уже созданных команд (человекочитаемое название, описание, состав, заполненность) и кнопку «Создать команду». Преподаватель задаёт в конфиге лабы максимум участников в команде и/или максимум команд.
Ключевые решения плана:
- Команда = репозиторий. Источник истины о составе — прямые коллабораторы репозитория
{github-prefix}-team-{N} плюс непринятые приглашения; название и описание команды хранятся в поле description репозитория. Нового хранилища не появляется, а RepoProvisioner._ensure_access (вместе с починкой протухших приглашений — заменой github-reinvite) переиспользуется целиком.
- GitHub teams (подход GitHub Classroom) не используются — членство в team требует членства в организации, что меняет модель доступа всего проекта; разбор в §3.2 плана.
- Удаление студента из команды — штатная операция GitHub (Settings → Collaborators → Remove плюс отмена непринятого приглашения); инструкция для преподавателя в §12 плана.
- После OAuth заводится короткая подписанная cookie-сессия студента (
join_session), так как командный сценарий требует диалога, а не одного колбэка. Username берётся только из cookie.
- Проверка работ: команда оценивается один раз, результат разносится по строкам всех участников с индивидуальной проверкой защиты ячейки. TASKID для командных лаб отключается.
Этапы и чек-лист приёмки — в §16 плана. Этап 7 (управление командами из админки) помечен как опциональный, вне минимального объёма.
Ознакомиться с docs/TEAM_ASSIGNMENTS_PLAN.md и реализовать функционал согласно плану.
Продолжение #46: сейчас
/join/{course_id}/{lab_id}создаёт один репозиторий на одного студента. Нужно поддержать лабы, которые выполняются командами: один репозиторий на команду, доступ у всех её участников.Сценарий: студент переходит по той же ссылке, авторизуется через GitHub, видит список уже созданных команд (человекочитаемое название, описание, состав, заполненность) и кнопку «Создать команду». Преподаватель задаёт в конфиге лабы максимум участников в команде и/или максимум команд.
Ключевые решения плана:
{github-prefix}-team-{N}плюс непринятые приглашения; название и описание команды хранятся в полеdescriptionрепозитория. Нового хранилища не появляется, аRepoProvisioner._ensure_access(вместе с починкой протухших приглашений — заменой github-reinvite) переиспользуется целиком.join_session), так как командный сценарий требует диалога, а не одного колбэка. Username берётся только из cookie.Этапы и чек-лист приёмки — в §16 плана. Этап 7 (управление командами из админки) помечен как опциональный, вне минимального объёма.