Add /quantity/ endpoint so cart +/- buttons work same-origin
Adds POST /quantity/<product_id>/ to set cart item quantity (or remove at 0), and registers cart_quantity_url Jinja global so the shared template uses it. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2
app.py
2
app.py
@@ -99,6 +99,8 @@ def create_app() -> "Quart":
|
||||
app.jinja_loader,
|
||||
])
|
||||
|
||||
app.jinja_env.globals["cart_quantity_url"] = lambda product_id: f"/quantity/{product_id}/"
|
||||
|
||||
# --- Page slug hydration (follows events/market app pattern) ---
|
||||
|
||||
@app.url_value_preprocessor
|
||||
|
||||
@@ -5,6 +5,7 @@ from __future__ import annotations
|
||||
from quart import Blueprint, g, request, render_template, redirect, url_for, make_response
|
||||
from sqlalchemy import select
|
||||
|
||||
from shared.models.market import CartItem
|
||||
from shared.models.order import Order
|
||||
from shared.models.market_place import MarketPlace
|
||||
from shared.services.registry import services
|
||||
@@ -53,6 +54,34 @@ def register(url_prefix: str) -> Blueprint:
|
||||
|
||||
return redirect(url_for("cart_overview.overview"))
|
||||
|
||||
@bp.post("/quantity/<int:product_id>/")
|
||||
async def update_quantity(product_id: int):
|
||||
ident = current_cart_identity()
|
||||
form = await request.form
|
||||
count = int(form.get("count", 0))
|
||||
|
||||
filters = [
|
||||
CartItem.deleted_at.is_(None),
|
||||
CartItem.product_id == product_id,
|
||||
]
|
||||
if ident["user_id"] is not None:
|
||||
filters.append(CartItem.user_id == ident["user_id"])
|
||||
else:
|
||||
filters.append(CartItem.session_id == ident["session_id"])
|
||||
|
||||
existing = await g.s.scalar(select(CartItem).where(*filters))
|
||||
|
||||
if existing:
|
||||
if count <= 0:
|
||||
await g.s.delete(existing)
|
||||
else:
|
||||
existing.quantity = count
|
||||
await g.s.flush()
|
||||
|
||||
resp = await make_response("", 200)
|
||||
resp.headers["HX-Refresh"] = "true"
|
||||
return resp
|
||||
|
||||
@bp.post("/checkout/")
|
||||
async def checkout():
|
||||
"""Legacy global checkout (for orphan items without page scope)."""
|
||||
|
||||
Reference in New Issue
Block a user