Skip to content

kite-house/DevDash

Repository files navigation

🏆 IT-Cup

Сайт для проведения IT-кубка: регистрация команд, динамическое скрытие кейсов, чат поддержки, статистика

Python 3.12 Django PostgreSQL Redis Docker Bootstrap 5 License GPLv3 CI Status

✨ О проекте

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

🚀 Быстрый старт

Предварительные требования

Установка и запуск

  1. Клонируйте репозиторий

    git clone https://github.com/kite-house/DevDash.git
    cd DevDash
  2. Настройте переменные окружения

    cp .env.example .env
  3. Запустите все сервисы (миграции применятся автоматически)

    docker compose up -d --build
  4. Создайте администратора

    docker compose exec app python manage.py createsuperuser
  5. Проверьте работу

📖 Использование

🏠 Главная страница

Отображает информацию о ближайшем мероприятии:

  • 📅 Дата проведения
  • 📍 Место проведения
  • 💰 Призовой фонд
  • 🔒 Статус доступности кейсов

👥 Регистрация и управление командой

Регистрация аккаунта:

  1. Заполните форму регистрации: логин, ФИО, дата рождения, телефон, email
  2. Валидация: возраст > 14 лет, корректный номер телефона

Регистрация команды:

  1. Капитан создаёт команду, указывает название и своё ФИО
  2. При желании выбирает кейс (если кейсы открыты)

Управление составом:

  1. Капитан заходит в карточку команды → «⚙️ Управление командой»
  2. Добавляет участников по username
  3. Может удалить любого участника

📋 Кейсы

Кейсы автоматически становятся доступными за 2 дня до мероприятия. До этого момента:

  • Поле выбора кейса скрыто при регистрации
  • Страница /cases/ недоступна и перенаправляет на главную

Логика реализована через context processor — проверка cases_visible_date из модели Event.

💬 Чат поддержки

  1. Зайдите в карточку своей команды
  2. Нажмите «💬 Чат поддержки»
  3. Отправляйте сообщения — администраторы увидят их в админ-панели
  4. Ответы администратора выделяются цветом и помечаются бейджем «Поддержка»

📊 Статистика

На странице /statistics/ отображается:

  • Список всех команд с капитанами и кейсами
  • Статус: «В игре» или «Выбыла»
  • Прогресс-бары по контрольным точкам (пройдено / всего)

📥 Экспорт в Excel

  1. Зайдите в админ-панель → Teams
  2. Выберите нужные команды галочками
  3. В выпадающем списке действий выберите «📥 Выгрузить выбранные команды в Excel»
  4. Файл .xlsx скачается автоматически

🧩 Архитектура

🐳 Сервисы Docker Compose

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.CaseListViewTest

📁 Структура проекта

devdash/
├── .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

🔄 CI/CD

При каждом пуше в main или создании Pull Request-а GitHub Actions:

  1. Запускает контейнер PostgreSQL
  2. Устанавливает Python и зависимости
  3. Применяет миграции
  4. Запускает тесты

Статус сборки отображается бейджем вверху README.

🤝 Вклад в проект

Будем рады вашим идеям и улучшениям! Чтобы внести вклад:

  1. Форкните репозиторий
  2. Создайте ветку для фичи (git checkout -b feature/amazing-feature)
  3. Закоммитьте изменения (git commit -m '✨ Add some amazing feature')
  4. Запушьте ветку (git push origin feature/amazing-feature)
  5. Откройте Pull Request

📄 Лицензия

Проект распространяется под лицензией GNU General Public License v3.0. Подробности в файле LICENSE.

Releases

No releases published

Packages

 
 
 

Contributors