Сайт для проведения IT-кубка: регистрация команд, динамическое скрытие кейсов, чат поддержки, статистика
IT-Cup — это платформа для проведения хакатонов и IT-соревнований. Создана как замена сайтам на Тильде, где невозможно динамически управлять контентом. Реализована на Django с использованием PostgreSQL и Redis.
- 🔐 Секретная логика — кейсы автоматически открываются за 2 дня до мероприятия (middleware)
- 📝 Кастомная регистрация — ФИО, дата рождения, телефон, email с валидацией
- 👥 Регистрация команд — капитан создаёт команду, выбирает кейс (опционально)
- 👤 Управление составом — капитан добавляет/удаляет участников без админки
- 📊 Статистика турнира — отображение активных и выбывших команд по контрольным точкам
- 💬 Чат поддержки — встроенный чат для общения команд с организаторами
- 📥 Экспорт в Excel — выгрузка списка участников из админ-панели
- ⚡ Кеширование Redis — ускорение загрузки страниц и хранение сессий
- 🐳 Docker-first подход — весь стек поднимается одной командой
- 🧪 21 unit-тест — полное покрытие моделей, views и бизнес-логики
- 🔄 CI/CD — автоматический прогон тестов через GitHub Actions
| Компонент | Технология |
|---|---|
| Язык | Python 3.12 |
| Веб-фреймворк | Django 4.2 |
| База данных | PostgreSQL 17.4 |
| Кеш и сессии | Redis 7 |
| Формы | django-crispy-forms + Bootstrap 5 |
| Excel-экспорт | openpyxl |
| Контейнеризация | Docker + Docker Compose |
| CI/CD | GitHub Actions |
| Фронтенд | HTML5, CSS3, Bootstrap 5.3 |
| Лицензия | GPL v3.0 |
- Установленные Docker и Docker Compose
-
Клонируйте репозиторий
git clone https://github.com/kite-house/DevDash.git cd DevDash -
Настройте переменные окружения
cp .env.example .env
-
Запустите все сервисы (миграции применятся автоматически)
docker compose up -d --build
-
Создайте администратора
docker compose exec app python manage.py createsuperuser -
Проверьте работу
- Главная: http://localhost:8000
- Админ-панель: http://localhost:8000/admin
- Статистика: http://localhost:8000/statistics
Отображает информацию о ближайшем мероприятии:
- 📅 Дата проведения
- 📍 Место проведения
- 💰 Призовой фонд
- 🔒 Статус доступности кейсов
Регистрация аккаунта:
- Заполните форму регистрации: логин, ФИО, дата рождения, телефон, email
- Валидация: возраст > 14 лет, корректный номер телефона
Регистрация команды:
- Капитан создаёт команду, указывает название и своё ФИО
- При желании выбирает кейс (если кейсы открыты)
Управление составом:
- Капитан заходит в карточку команды → «⚙️ Управление командой»
- Добавляет участников по username
- Может удалить любого участника
Кейсы автоматически становятся доступными за 2 дня до мероприятия. До этого момента:
- Поле выбора кейса скрыто при регистрации
- Страница
/cases/недоступна и перенаправляет на главную
Логика реализована через context processor — проверка cases_visible_date из модели Event.
- Зайдите в карточку своей команды
- Нажмите «💬 Чат поддержки»
- Отправляйте сообщения — администраторы увидят их в админ-панели
- Ответы администратора выделяются цветом и помечаются бейджем «Поддержка»
На странице /statistics/ отображается:
- Список всех команд с капитанами и кейсами
- Статус: «В игре» или «Выбыла»
- Прогресс-бары по контрольным точкам (пройдено / всего)
- Зайдите в админ-панель → Teams
- Выберите нужные команды галочками
- В выпадающем списке действий выберите «📥 Выгрузить выбранные команды в Excel»
- Файл
.xlsxскачается автоматически
docker compose up -d
├── app — Django (проброс кода через volumes)
├── postgres_db — PostgreSQL 17.4 (health check: pg_isready)
├── redis — Redis 7 (health check: PING)
└── migrations — одноразовый контейнер: применяет миграции и завершается
| Сервис | Назначение | Health Check |
|---|---|---|
app |
Django-приложение | — |
postgres_db |
База данных | pg_isready |
redis |
Кеш и сессии | redis-cli ping |
migrations |
Применение миграций | Отрабатывает и завершается |
Event ───────────── мероприятие (дата, место, призовой фонд, дата открытия кейсов)
├── Case ──────── кейсы (название, описание)
├── Team ──────── команды (название, капитан, кейс, статус активности)
│ └── ChatMessage ─── сообщения чата поддержки
└── CheckPoint ── контрольные точки (название, порядок)
└── TeamCheckPointStatus ── статусы прохождения КП командами
context_processors.py
└── cases_visibility(request)
└── Проверяет: сейчас >= Event.cases_visible_date?
├── Да → can_view_cases = True (кейсы видны)
└── Нет → can_view_cases = False (кейсы скрыты)
views.py
├── home() → кеш 5 минут
├── case_list() → кеш 15 минут
└── statistics() → кеш 1 минута
admin.py
└── При сохранении/удалении → cache.delete()
Проект содержит 21 unit-тест, покрывающий:
| Тест-класс | Что проверяет |
|---|---|
EventModelTest |
Создание Event, verbose_name |
CaseModelTest |
Создание Case, связь с Event |
TeamModelTest |
Создание Team, уникальность имени |
CheckPointModelTest |
Создание CheckPoint, ordering |
ChatMessageModelTest |
Сообщения пользователя и админа |
HomeViewTest |
Главная с ивентом и без |
CaseListViewTest |
Секретная логика: скрытие/открытие кейсов |
TeamRegistrationTest |
Регистрация, закрытая регистрация, неавторизованный доступ |
TeamChatTest |
Доступ к чату, отправка сообщений |
StatisticsViewTest |
Активные/выбывшие команды |
CaseVisibilityLogicTest |
Проверка логики дат |
# Все тесты
docker-compose exec app python manage.py test core
# С подробным выводом
docker-compose exec app python manage.py test core -v 2
# Конкретный класс
docker-compose exec app python manage.py test core.tests.CaseListViewTestdevdash/
├── .github/
│ └── workflows/
│ └── django-tests.yml # GitHub Actions CI
├── accounts/
│ ├── forms.py # Кастомная форма регистрации
│ ├── models.py # Профиль пользователя (UserProfile)
│ ├── admin.py # Расширенная админка пользователей
│ ├── views.py # Регистрация
│ ├── urls.py # Маршруты login/logout/register
│ └── __init__.py
├── core/ # Основное приложение
│ ├── models.py # Модели: Event, Case, Team, CheckPoint, ChatMessage
│ ├── views.py # Представления: home, case_list, register_team, etc.
│ ├── urls.py # Маршруты: /, /cases/, /team/register/, /statistics/
│ ├── admin.py # Админ-панель + экспорт в Excel
│ ├── forms.py # Форма регистрации команды, форма чата
│ ├── context_processors.py # Секретная логика видимости кейсов
│ ├── tests.py # 21 unit-тест
│ └── __init__.py
├── devdash/ # Конфигурация проекта
│ ├── settings.py # Настройки Django
│ ├── urls.py # Корневые URL-маршруты
│ ├── wsgi.py
│ └── asgi.py
├── templates/ # HTML-шаблоны
│ ├── base.html # Базовый шаблон с навигацией
│ ├── accounts/
│ ├── login.html # Страница входа
│ │ └── register.html # Страница регистрации
│ └── core/
│ ├── home.html # Главная страница
│ ├── case_list.html # Список кейсов
│ ├── register_team.html # Регистрация команды
│ ├── team_detail.html # Карточка команды
│ ├── manage_team.html # Управление составом
│ ├── team_chat.html # Чат поддержки
│ └── statistics.html # Статистика турнира
├── static/ # Статические файлы
├── .env.example # Пример переменных окружения
├── .gitignore
├── .dockerignore
├── docker-compose.yml # Docker Compose (PostgreSQL + Redis + App)
├── dockerfile
├── manage.py
├── requirements.txt # Зависимости Python
└── LICENSE # GNU GPL v3.0
При каждом пуше в main или создании Pull Request-а GitHub Actions:
- Запускает контейнер PostgreSQL
- Устанавливает Python и зависимости
- Применяет миграции
- Запускает тесты
Статус сборки отображается бейджем вверху README.
Будем рады вашим идеям и улучшениям! Чтобы внести вклад:
- Форкните репозиторий
- Создайте ветку для фичи (
git checkout -b feature/amazing-feature) - Закоммитьте изменения (
git commit -m '✨ Add some amazing feature') - Запушьте ветку (
git push origin feature/amazing-feature) - Откройте Pull Request
Проект распространяется под лицензией GNU General Public License v3.0. Подробности в файле LICENSE.