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": "Профиль обновлен",
|
|||
|
|
})
|