CoolFace
Apppublic

KaerVex/qa-team-tracker-py

sourceHugging Faceupdated 3mo agoView on Hugging Face
0likes
App README

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 / SQLite
  • app/services/ — ядро: рабочий календарь (working_calendar.py, перенос из app.js 1: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 — ничего ставить не нужно)

bash
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, как в проде)

bash
docker compose up --build      # поднимет postgres + app, применит миграции и сидинг

Приложение на <http://localhost:8000>.

Деплой на Render + Neon (бесплатно)

Публичная ссылка с автодеплоем при каждом git push. Веб-сервис — на Render, PostgreSQL — на Neon (постоянный бесплатный план). В репозитории есть render.yaml (Blueprint).

  1. 1.Neon — <https://neon.com>: зарегистрироваться → Create project (регион EU/Frankfurt) → скопировать connection string (postgresql://user:pass@…neon.tech/db?sslmode=require).
  2. 2.Render — <https://render.com>: New → Blueprint → подключить GitHub и выбрать репозиторий qa-team-tracker-py. Render прочитает render.yaml. Ввести в форме:
  3. 3.DATABASE_URL = строка из Neon;
  4. 4.ADMIN_PASSWORD = ваш пароль администратора. → Apply.
  5. 5.После сборки — ссылка 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:
bash
alembic upgrade head          # применить миграции
alembic revision --autogenerate -m "..."   # новая миграция после правки моделей

Тесты

bash
python -m pytest              # паритет рабочего календаря, жизненный цикл, аналитика

Конфигурация (.env)

ПеременнаяНазначение
ENVdev (авто-создание схемы) / prod (только Alembic)
DATABASE_URLстрока подключения SQLAlchemy
SESSION_SECRETсекрет подписи cookie-сессий
ADMIN_EMAIL / ADMIN_PASSWORDучётка администратора при сидинге

Заметки по масштабированию

И REST, и UI — стейтлесс (cookie-сессия, HTMX), масштабируются воркерами за балансировщиком без sticky-сессий. Postgres — пул соединений; при росте: PgBouncer, реплики на чтение. Аутентификация вынесена в app/core/security.py — заменяется на Google OAuth без изменения остального кода.

Что не перенесено дословно

  • Хранилище: Firebase → PostgreSQL/SQLite (нормализованная реляционная схема).
  • Аутентификация: Firebase Google Auth → собственные cookie-сессии (задел под OAuth).
  • Время: используется наивное локальное (бизнес-время) для простоты арифметики календаря.