Добро пожаловать!

Пока версия сайта не дойдёт до первой релизной версии (1.0.0), здесь будет публиковаться список изменений в суровом текстовом виде, чтобы вы могли наблюдать, что появилось в новой версии.

История изменений

v0.1.3 09.03.2026 Последняя

Добавлено

Уроки (lessons)

  • Модель LessonAttachment — множественные файловые вложения к уроку (файл, название, порядок). Свойства display_title (название или имя файла) и extension (расширение)
  • Поля Slidev-презентации на модели Lesson: presentation_url (путь к собранному SPA), presentation_title (отображаемое название), presentation_pdf (PDF для скачивания)
  • Endpoint GET /lessons/<id>/file/<attachment_id>/ — скачивание конкретного вложения с верификацией lesson_id
  • Endpoint GET /lessons/<id>/presentation-pdf/ — скачивание PDF-версии презентации
  • Секция презентации в lesson_detail.html: синяя карточка с кнопками «Открыть» и «PDF»
  • Секция файлов в lesson_detail.html: зелёная карточка со списком вложений, значком расширения и кнопкой скачивания
  • Admin: LessonAttachmentInline в LessonAdmin, fieldset «Презентация Slidev», колонки has_presentation и attachment_count в списке
  • docs/slidev-guide.md — инструкция по созданию и деплою Slidev-презентаций к урокам
  • Slidev установлен в проект (package.json, @slidev/cli, @slidev/theme-default)

Изменено

Уроки (lessons)

  • Все upload_to переведены на единую иерархию media/lessons/{safe_title}/ через хелпер _lesson_upload_path
  • Удалено старое поле Lesson.file (одиночный файл заменён на LessonAttachment)
  • Dev-сервер (config/urls.py): _media_serve с index.html fallback для корректного открытия Slidev SPA
v0.1.2 05.03.2026

Исправлено

Тесты (quizzes)

  • CodeMirror-редактор кода переставал работать после переключения между задачами (ошибка Cannot read properties of undefined в prepareSelection). Причина: CM5 теряет внутреннее состояние при display:none от Alpine.js x-show. Решение: полное пересоздание CM-инстанса при возврате к задаче. Затронуты quiz_detail.html и ege_detail.html

Профиль (accounts)

  • Статистика «Верных ответов» и статистика по типам вопросов теперь считают уникальные вопросы вместо суммы всех ответов из всех попыток
v0.1.1 01.03.2026

Добавлено

Профиль пользователя (accounts)

  • Расширенная страница профиля с метриками активности: суммарное время, статистика по типам вопросов (выбор/текст/код), результаты по тестам (лучший балл), прогресс по ЕГЭ-заданиям, статистика запросов помощи и лайков
  • accounts/templatetags/profile_tags.py — кастомные фильтры duration_display и duration_short для форматирования timedelta в шаблонах профиля

Изменено

Профиль пользователя (accounts)

  • Полный редизайн templates/registration/profile.html: баннер с инициалами пользователя, мини-карточки метрик, тематические секции (типы вопросов, тесты, ЕГЭ, помощь), таблица последней активности, кнопка перехода в тренажёр ЕГЭ
  • ProfileView в accounts/views.py расширен: передаёт в контекст агрегированную статистику по тестам, ответам, ЕГЭ-прогрессу, помощи и лайкам
v0.1.0 23.02.2026

Добавлено

Тренажёр ЕГЭ (quizzes)

  • Полноценный тренажёр для подготовки к ЕГЭ по информатике
  • Публичный список вариантов ЕГЭ с навигацией из главного меню
  • Страница прохождения варианта: таймер обратного отсчёта, навигация по заданиям, автосохранение ответов
  • Поддержка всех типов заданий: выбор ответа, свободный текст, Python-код с автопроверкой
  • Нормализация ответов (пробелы, регистр) для корректного сравнения
  • Страница результата после завершения варианта с подсчётом баллов
  • Таблица результатов с разбивкой по заданиям и сортировкой
  • Страница детального просмотра решения (код, тесты, метрики CPU/памяти)
  • Личная статистика: лучшие результаты, прогресс по заданиям
  • Модальное окно с предупреждением о сохранении при уходе со страницы

Модели и данные

  • Quiz.slug — уникальный слаг для URL вариантов ЕГЭ
  • Quiz.is_ege, Quiz.ege_task_number, Quiz.ege_max_score — поля экзамена
  • Question.correct_text_answer — эталонный ответ для текстовых заданий ЕГЭ
  • ExamTaskProgress — прогресс по каждому заданию варианта (ответы, код, статус проверки)
  • ExamTaskProgress.best_time, best_memory, best_cpu — лучшие метрики выполнения
  • ExamTaskProgress.best_code, best_answer — снимки лучших решений
  • SolutionAttachment — вложения к решениям
  • Индексы БД для оптимизации запросов результатов
  • 10 миграций (0021–0030) включая data-миграцию для генерации slug и переноса медиафайлов

Management-команда load_ege

  • Импорт вариантов ЕГЭ из JSON-фикстур (python manage.py load_ege <file.json>)
  • Поддержка всех типов вопросов: choice, text, code с тест-кейсами
  • Загрузка медиафайлов (изображения, файлы данных) с привязкой к slug варианта
  • Защита от дубликатов по slug

Шаблоны и UI

  • ege_list.html — список вариантов с карточками
  • ege_detail.html — интерфейс прохождения экзамена с боковой панелью навигации
  • ege_result.html — результат завершённого варианта
  • ege_results.html — таблица всех результатов с popover-сортировкой
  • ege_solution_detail.html — детальный просмотр решения с подсветкой кода
  • Ссылка «Тренажёр ЕГЭ» в навигации (base.html)

JavaScript и фронтенд

  • ege-timer.js — таймер обратного отсчёта с визуальным предупреждением при истечении времени
  • Расширение quiz-async.js для поддержки ЕГЭ-режима (прогресс заданий, обновление статусов)

Template tags

  • ege_filters.py — кастомные фильтры для шаблонов ЕГЭ (форматирование баллов, времени, метрик)

Инфраструктура

  • Структурированное хранение медиафайлов ЕГЭ по slug варианта
  • Расширение Celery-задач для сбора метрик CPU и памяти при проверке кода
  • URL-маршрутизация: urls_ege.py подключён в config/urls.py

Изменено

  • Админка: расширены list_display, фильтры и inline-формы для ЕГЭ-моделей
  • quizzes/utils.py — утилиты нормализации ответов и работы с результатами
  • WebSocket consumer обновлён для поддержки ЕГЭ-задач
  • .gitignore — добавлены fixtures и медиафайлы ЕГЭ
v0.0.2 09.02.2026

Добавлено

Система помощи (quizzes)

  • Запросы помощи: ученик задаёт вопрос по задаче, учитель отвечает в диалоге
  • Комментарии к конкретным строкам кода (inline line threads в CodeMirror)
  • Общие комментарии через панель помощи
  • Уведомления в реальном времени (WebSocket + polling fallback)
  • Бейдж непрочитанных уведомлений в навигации
  • Dropdown со списком уведомлений и превью последнего ответа
  • Авто-открытие панели помощи при клике по уведомлению (open_help параметр)
  • Точечная очистка непрочитанных: unread сбрасывается только при явном открытии диалога (mark_read)
  • Страница ревью для учителя с inline-комментариями к коду
  • Список запросов помощи для учителя с фильтрацией по статусу
  • Модели HelpRequest и HelpComment с трекингом статусов
  • WebSocket consumer NotificationConsumer (/ws/notifications/)
  • Админка для HelpRequest/HelpComment

UI улучшения

  • Подсветка синтаксиса Python через highlight.js (результаты, детали попытки)
  • Баннер статуса WebSocket-соединения (connected/disconnected/reconnecting/polling)
  • Оптимистичная блокировка кнопки отправки кода (до ответа сервера)
  • Секция «Архив» в списке тестов (завершённые тесты, свёрнуты по умолчанию)
  • Колонка «ЕГЭ» в статистике теста
  • Формат баллов X/Y в статистике (вместо просто числа)
  • Маркеры строк с комментариями (жёлтая подсветка, жирные номера строк)
  • Подсказка о кликабельности номеров строк (с авто-скрытием)

Изменено

  • Убрана публичная регистрация: аккаунты создаёт преподаватель
  • Страница входа: заменена ссылка «Зарегистрируйтесь» на подсказку «Данные выдаёт преподаватель»
  • Улучшена админка пользователей: добавлены list_display, фильтр по группе и ЕГЭ
  • Админка вопросов: поле title, поиск по заголовку и тексту
  • Команда Celery в README обновлена (--pool=solo -Q default,code_execution)
  • CodeMirror: фиксированная высота 500px вместо auto min/max

Модели

  • Profile.is_ege — флаг ученика, готовящегося к ЕГЭ
  • Question.title — краткое название вопроса (для отображения в уведомлениях и админке)
v0.0.1 06.02.2026

Добавлено

Аккаунты (accounts)

  • Регистрация и авторизация пользователей
  • Профили учеников с привязкой к учебным группам (классам)
  • Модель StudentGroup для организации учеников по классам

Страницы (pages)

  • Главная страница и "Обо мне" с блочным конструктором контента
  • Типы блоков: текст, изображение, текст + изображение
  • Настройки стилей: шрифты (размер, семейство), цвета текста и заголовков, фон карточек
  • Выравнивание текста и изображений
  • Обрезка, позиционирование и масштабирование изображений
  • Настройки object-fit, border-radius и opacity для изображений

Уроки (lessons)

  • Иерархия контента: Раздел (Section) > Урок (Lesson) > Блоки контента (LessonBlock)
  • Поддержка файловых вложений для скачивания
  • Поле для видео URL (YouTube, Vimeo)
  • Превью-карточки с изображениями и кратким описанием
  • Гибкая компоновка блоков: вертикально, горизонтально (текст слева/справа)
  • Настройки шрифтов, цветов и фонов для каждого блока

Тесты (quizzes)

  • Три типа вопросов: выбор ответа (choice), свободный текст (text), Python-код (code)
  • Тест-кейсы (TestCase) с входными данными и ожидаемым выводом для code-вопросов
  • Файлы с данными для скачивания в вопросах
  • Назначение тестов группам и отдельным ученикам (QuizAssignment)
  • Ограничение попыток: глобальное для теста и индивидуальное через назначения
  • Временные окна доступа: глобальные (start_date/end_date) и переопределяемые через назначения
  • Результаты прохождения (UserResult) с подсчётом баллов и времени
  • Детальные ответы (UserAnswer) с привязкой к результатам
  • Статистика по тестам и вопросам

Асинхронная проверка кода

  • Celery + Redis для фоновой проверки Python-кода в Docker-песочнице
  • WebSocket (Django Channels + Daphne) для real-time обратной связи
  • Модель CodeSubmission для отслеживания статуса (pending > running > success/failed/error)
  • Frontend quiz-async.js: WebSocket-клиент, визуальная индикация статуса, обновление UI без перезагрузки
  • WebSocket routing: /ws/quiz/<quiz_id>/

Админ-панель

  • Кастомные формы для тестов с inline-редактированием вопросов и вариантов ответа
  • Inline-редактирование тест-кейсов для code-вопросов
  • Массовое назначение тестов группам
  • Кастомная change_form для Quiz с дополнительными действиями

Инфраструктура

  • PostgreSQL через psycopg2-binary
  • Gunicorn (HTTP) + Daphne (WebSocket) + Nginx (reverse proxy + SSL)
  • Tailwind CSS для стилизации + Alpine.js для интерактивности
  • WhiteNoise для раздачи статических файлов
  • Docker-песочница для безопасного выполнения пользовательского кода
  • Systemd-сервисы: site (Gunicorn), daphne, celery, redis-server