FastAPI + Jinja2 + MariaDB web application with registration, login, profile, password reset, and email confirmation flows. All UI in Russian. Styled with Evotor brand colors. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
from fastapi import APIRouter, Request, Depends
|
||
from fastapi.responses import RedirectResponse
|
||
from fastapi.templating import Jinja2Templates
|
||
from sqlalchemy.orm import Session
|
||
|
||
from web.auth import get_current_user
|
||
from web.database import get_db
|
||
from web.models import User
|
||
from web.schemas import validate_profile
|
||
|
||
router = APIRouter()
|
||
templates = Jinja2Templates(directory="web/templates")
|
||
|
||
|
||
@router.get("/profile")
|
||
def profile_view(request: Request, user: User | None = Depends(get_current_user)):
|
||
if not user:
|
||
return RedirectResponse("/login", 303)
|
||
return templates.TemplateResponse("profile.html", {"request": request, "user": user})
|
||
|
||
|
||
@router.post("/profile")
|
||
async def profile_update(
|
||
request: Request,
|
||
db: Session = Depends(get_db),
|
||
user: User | None = Depends(get_current_user),
|
||
):
|
||
if not user:
|
||
return RedirectResponse("/login", 303)
|
||
|
||
form = await request.form()
|
||
data = dict(form)
|
||
|
||
errors = validate_profile(data)
|
||
|
||
if not errors:
|
||
existing = db.query(User).filter(
|
||
User.phone == data["phone"].strip(), User.id != user.id
|
||
).first()
|
||
if existing:
|
||
errors.append("Пользователь с таким телефоном уже существует")
|
||
|
||
if errors:
|
||
return templates.TemplateResponse("profile.html", {
|
||
"request": request, "user": user, "errors": errors, "form": data,
|
||
})
|
||
|
||
user.first_name = data["first_name"].strip()
|
||
user.last_name = data["last_name"].strip()
|
||
user.phone = data["phone"].strip()
|
||
db.commit()
|
||
|
||
return templates.TemplateResponse("profile.html", {
|
||
"request": request, "user": user, "success": "Профиль обновлен",
|
||
})
|