Files
evo-sync/web/routes/sync.py

76 lines
2.1 KiB
Python
Raw Normal View History

"""Sync settings page."""
from datetime import datetime, timezone
from fastapi import APIRouter, Depends, Request
from fastapi.responses import RedirectResponse
from sqlalchemy.orm import Session
from web.auth.session import get_current_user
from web.config import settings
from web.database import get_db
from web.models.connections import SyncConfig
from web.templates_env import templates
router = APIRouter()
def _render(request: Request, ctx: dict):
ctx["request"] = request
ctx.setdefault("jivosite_widget_id", settings.JIVOSITE_WIDGET_ID)
return templates.TemplateResponse(ctx.pop("request"), "sync.html", ctx)
def _now():
return datetime.now(timezone.utc).replace(tzinfo=None)
@router.get("/sync")
async def sync_get(request: Request, db: Session = Depends(get_db)):
try:
user = get_current_user(request, db)
except Exception:
return RedirectResponse("/login", 303)
config = db.query(SyncConfig).filter_by(user_id=user.id).first()
return _render(request, {
"user": user,
"config": config,
"saved": request.query_params.get("saved"),
})
@router.post("/sync/settings")
async def sync_settings_post(request: Request, db: Session = Depends(get_db)):
try:
user = get_current_user(request, db)
except Exception:
return RedirectResponse("/login", 303)
form = await request.form()
raw_multiplier = str(form.get("price_multiplier", "1")).strip()
postfix = str(form.get("description_postfix", "")).strip() or None
try:
multiplier = float(raw_multiplier)
if multiplier <= 0:
raise ValueError
except ValueError:
multiplier = 1.0
config = db.query(SyncConfig).filter_by(user_id=user.id).first()
if config:
config.price_multiplier = multiplier
config.description_postfix = postfix
else:
config = SyncConfig(
user_id=user.id,
is_enabled=False,
price_multiplier=multiplier,
description_postfix=postfix,
)
db.add(config)
db.commit()
return RedirectResponse("/sync?saved=1", 303)