KaerVex/qa-team-tracker-py
QA Team Tracker — Python-версия
Переписанный на Python трекер задач QA-команды. Тот же домен, что и в ванильной версии (../QA_T), но как масштабируемый MVP: FastAPI + PostgreSQL + Jinja2/HTMX.
Вся логика — на Python. Браузер получает готовый HTML (Jinja2), динамика — через готовую библиотеку HTMX (вендорится в app/web/static/htmx.min.js, мы её не пишем). Ручного JS практически нет; графики аналитики рендерятся на сервере в SVG.
Архитектура
Браузер ◀─HTTP/HTMX─▶ Web (Jinja2) + REST API (/api, Swagger /docs)
│
services/ ← вся бизнес-логика (без фреймворков, тестируемо)
│
models/ (SQLAlchemy) → PostgreSQL / SQLiteapp/services/— ядро: рабочий календарь (working_calendar.py, перенос изapp.js1:1), жизненный цикл этапов (stages.py), метрики (hours.py,analytics.py,activities.py). Единственный источник логики; его вызывают и REST API, и веб-слой.app/api/— REST-роутеры (для интеграций/масштаба), авто-Swagger на/docs.app/web/— Jinja2-шаблоны + HTMX + серверные SVG-графики.app/models/,app/db/— модели и БД. Портируемо: PostgreSQL (прод) и SQLite (локально).
Быстрый старт (локально, SQLite — ничего ставить не нужно)
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
cp .env.example .env
python -m app.db.seed # схема + администратор + демо-данные
uvicorn app.main:app --reload # http://localhost:8000- UI: <http://localhost:8000> — вход
admin@example.com/admin. - REST API + Swagger: <http://localhost:8000/docs>.
- Healthcheck: <http://localhost:8000/api/health>.
Запуск в Docker (PostgreSQL, как в проде)
docker compose up --build # поднимет postgres + app, применит миграции и сидингПриложение на <http://localhost:8000>.
Деплой на Render + Neon (бесплатно)
Публичная ссылка с автодеплоем при каждом git push. Веб-сервис — на Render, PostgreSQL — на Neon (постоянный бесплатный план). В репозитории есть render.yaml (Blueprint).
- Neon — <https://neon.com>: зарегистрироваться → Create project (регион EU/Frankfurt) → скопировать connection string (
postgresql://user:pass@…neon.tech/db?sslmode=require). - Render — <https://render.com>: New → Blueprint → подключить GitHub и выбрать репозиторий
qa-team-tracker-py. Render прочитаетrender.yaml. Ввести в форме: DATABASE_URL= строка из Neon;ADMIN_PASSWORD= ваш пароль администратора. → Apply.- После сборки — ссылка
https://qa-team-tracker-py.onrender.com. Вход:admin@example.com/ заданный пароль. Дальше каждыйgit pushвmain→ автодеплой.
Заметки: Render free «засыпает» после ~15 мин простоя (первый заход потом ~30 сек); Neon free — 0.5 ГБ, данные персистентны. DATABASE_URL со схемой postgres:///postgresql:// нормализуется в коде под драйвер psycopg (см. app/core/config.py).
База данных
- Локально:
DATABASE_URL=sqlite:///./app.db(по умолчанию). Схема создаётся автоматически вENV=dev. - Прод:
DATABASE_URL=postgresql+psycopg://…+ миграции Alembic:
alembic upgrade head # применить миграции
alembic revision --autogenerate -m "..." # новая миграция после правки моделейТесты
python -m pytest # паритет рабочего календаря, жизненный цикл, аналитикаКонфигурация (.env)
Заметки по масштабированию
И REST, и UI — стейтлесс (cookie-сессия, HTMX), масштабируются воркерами за балансировщиком без sticky-сессий. Postgres — пул соединений; при росте: PgBouncer, реплики на чтение. Аутентификация вынесена в app/core/security.py — заменяется на Google OAuth без изменения остального кода.
Что не перенесено дословно
- Хранилище: Firebase → PostgreSQL/SQLite (нормализованная реляционная схема).
- Аутентификация: Firebase Google Auth → собственные cookie-сессии (задел под OAuth).
- Время: используется наивное локальное (бизнес-время) для простоты арифметики календаря.
