diff --git a/app.py b/app.py index bc74651..190fde1 100644 --- a/app.py +++ b/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 diff --git a/bp/cart/global_routes.py b/bp/cart/global_routes.py index d9fc6ca..bef45a1 100644 --- a/bp/cart/global_routes.py +++ b/bp/cart/global_routes.py @@ -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//") + 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)."""