Add multi account support to shpping cart

This commit is contained in:
2026-02-14 11:44:34 +01:00
parent 8daf064e4d
commit de4167728d
3 changed files with 49 additions and 10 deletions

View File

@@ -1,6 +1,7 @@
from decimal import Decimal
from typing import Annotated
from fastapi import APIRouter, HTTPException, Request
from fastapi import APIRouter, Form, HTTPException, Request
from sqlalchemy import select
from starlette import status
from starlette.responses import RedirectResponse
@@ -29,17 +30,32 @@ async def get_cart(request: Request, session: SessionDep, user: UserDep):
return templates.TemplateResponse(
"order.html.jinja",
context={"request": request, "order": user.shopping_cart, "is_cart": True},
context={
"request": request,
"user": user,
"order": user.shopping_cart,
"is_cart": True,
},
)
@shop_router.get("/shop/finalize_order")
async def finalize_order(request: Request, session: SessionDep, user: UserDep):
@shop_router.post("/shop/finalize_order")
async def finalize_order(
request: Request,
session: SessionDep,
user: UserDep,
account_id: Annotated[float, Form()],
):
cart = user.shopping_cart
# TODO: Implement
cart.finalize(user.accounts[0])
for account in user.accounts:
if account.id == account_id:
break
else:
raise HTTPException(status_code=400, detail="Invalid account ID.")
cart.finalize(account)
return RedirectResponse(url=f"/", status_code=status.HTTP_302_FOUND)

View File

@@ -70,8 +70,20 @@
{% if is_cart %}
<div class="d-flex justify-content-between align-items-center mt-3">
<div>
<a href="/shop/finalize_order" class="btn btn-primary">Jetzt Buchen</a>
<div >
<form method="post" action="/shop/finalize_order" class="d-flex align-items-center">
{% if user.accounts|length > 1 %}
<select name="account_id" class="form-select form-select-sm me-2" required>
<option value="">-- Konto wählen --</option>
{% for account in user.accounts %}
<option value="{{ account.id }}">{{ account.name }} ({{ account.balance | format_number }} €)</option>
{% endfor %}
</select>
{% elif user.accounts|length == 1 %}
<input type="hidden" name="account_id" value="{{ user.accounts[0].id }}">
{% endif %}
<button type="submit" class="btn btn-primary">Jetzt Bezahlen</button>
</form>
</div>
</div>
{% endif %}