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_loader,
|
||||||
])
|
])
|
||||||
|
|
||||||
|
app.jinja_env.globals["cart_quantity_url"] = lambda product_id: f"/quantity/{product_id}/"
|
||||||
|
|
||||||
# --- Page slug hydration (follows events/market app pattern) ---
|
# --- Page slug hydration (follows events/market app pattern) ---
|
||||||
|
|
||||||
@app.url_value_preprocessor
|
@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 quart import Blueprint, g, request, render_template, redirect, url_for, make_response
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select
|
||||||
|
|
||||||
|
from shared.models.market import CartItem
|
||||||
from shared.models.order import Order
|
from shared.models.order import Order
|
||||||
from shared.models.market_place import MarketPlace
|
from shared.models.market_place import MarketPlace
|
||||||
from shared.services.registry import services
|
from shared.services.registry import services
|
||||||
@@ -53,6 +54,34 @@ def register(url_prefix: str) -> Blueprint:
|
|||||||
|
|
||||||
return redirect(url_for("cart_overview.overview"))
|
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/")
|
@bp.post("/checkout/")
|
||||||
async def checkout():
|
async def checkout():
|
||||||
"""Legacy global checkout (for orphan items without page scope)."""
|
"""Legacy global checkout (for orphan items without page scope)."""
|
||||||
|
|||||||
Reference in New Issue
Block a user