Files
TestingWebApp/flask_app/app/config.py
T
Константин Лебединский 4b0d56ff0e feat(flask): E1.0–E1.3, E1.8 — миграция на Python/Flask + AI v2
Этап 1 миграции TestingWebApp на целевой стек (Python/Flask/Jinja),
БД остаётся clinic_tests.

E1.0 — База Flask-приложения: SQLAlchemy/psycopg2 пул, Flask sessions,
фабрика create_app, blueprint main с / и /health, base.html в стиле
кабинета HR (Tailwind CDN + Manrope + Material Symbols), 404/500.

E1.1 — Auth + /api/me: Flask sessions (signed cookie) вместо JWT,
bcrypt + Werkzeug, опц. HR_AUTH=1 с UPSERT в clinic_tests.users по
staff_id. UI /login, JSON /api/auth/{login,logout,me}, декораторы
@login_required / @require_role.

E1.2 — Тесты: список + редактор. 10 эндпоинтов, сервисы test_draft,
test_access, test_chain, ai_editor, llm_client, draft_validator,
editor_content. UI /tests (каталог + создание) и /tests/<id>/edit
(редактор с AI). Полный мобильный UX (аккордеоны/drag-n-drop) — в E1.7.

E1.3 — Импорт документов: pypdf + python-docx, эндпоинт
POST /api/tests/import/document, кнопка «Импорт документа» в
AI-панели редактора, лимит 16 МБ.

E1.8 — AI v2: страница /settings (статус ENV-ключа + ping),
ai/generate-by-title (без сетки), ai/check (рецензия), ai/improve
(массовое было→стало с чекбоксами). Унифицированный ответ AI-ошибок:
{ error, code, settingsUrl }.

Docker:
- docker-compose.dev.yml: добавлены DATABASE_URL, HR_AUTH/HR_DATABASE_URL,
  DEEPSEEK_API_KEY/OPENAI_API_KEY/LLM_BASE_URL/LLM_MODEL и сеть postgres
  для testing-flask.

Документация:
- docs/migration-final.md — двух-этапный план (Этап 1: унификация
  стека внутри TestingWebApp; Этап 2: слияние с tgFlaskForm).
- docs/migration-final-inventory.md — карта 22 эндпоинтов Express.

Made-with: Cursor
2026-04-27 23:29:26 +05:00

40 lines
1.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Точечные настройки и feature-флаги (1:1 с Express-бэкендом)."""
from __future__ import annotations
import os
HR_MANAGED_PASSWORD_PLACEHOLDER = '$HR$MANAGED$NO_LOCAL$'
"""Заглушка пароля для пользователей, попавших в clinic_tests через HR-апсёрт.
При локальном входе compare всегда даёт False (см. authenticate_local)."""
def _truthy(val: str | None) -> bool:
return (val or '').strip().lower() in ('1', 'true', 'yes', 'on')
def is_hr_auth_enabled() -> bool:
"""`HR_AUTH=1` → логин через `hr_bot_test.users` (Werkzeug)."""
return _truthy(os.environ.get('HR_AUTH'))
def is_assignment_feature_enabled() -> bool:
"""API/UI назначения тестов сотрудникам (см. backend/src/config/featureFlags.js)."""
if (os.environ.get('FLASK_ENV') or '').lower() == 'development':
return True
if (os.environ.get('FLASK_DEBUG') or '').strip() == '1':
return True
raw = (os.environ.get('CLINIC_ASSIGNMENT_ENABLED') or '').strip().lower()
if raw in ('1', 'true', 'yes'):
return True
if raw in ('0', 'false', 'no'):
return False
return False
def is_dev_ui() -> bool:
"""В Express это `NODE_ENV=development`. У нас — FLASK_ENV/FLASK_DEBUG."""
if (os.environ.get('FLASK_ENV') or '').lower() == 'development':
return True
return (os.environ.get('FLASK_DEBUG') or '').strip() == '1'