Implement shopping cart
This commit is contained in:
@@ -11,7 +11,6 @@ templates = get_jinja_renderer()
|
||||
|
||||
@root_router.get("/")
|
||||
async def landing_page(request: Request, user: UserDep, session: SessionDep):
|
||||
print(f"User {user.username} ({user.display_name}) accessed landing page")
|
||||
transactions = []
|
||||
for account in user.accounts:
|
||||
transactions += account.transactions
|
||||
|
||||
@@ -13,6 +13,7 @@ def get_session() -> Session:
|
||||
try:
|
||||
yield db
|
||||
finally:
|
||||
db.commit()
|
||||
db.close()
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from fastapi import APIRouter, Request
|
||||
from sqlalchemy import select
|
||||
from starlette import status
|
||||
from starlette.responses import RedirectResponse
|
||||
|
||||
from allmende_payment_system.api import SessionDep
|
||||
from allmende_payment_system.models import Area
|
||||
from allmende_payment_system.api.dependencies import SessionDep, UserDep
|
||||
from allmende_payment_system.models import Area, OrderItem, Product
|
||||
from allmende_payment_system.tools import get_jinja_renderer
|
||||
|
||||
shop_router = APIRouter()
|
||||
@@ -20,6 +24,26 @@ async def get_shop(request: Request, session: SessionDep):
|
||||
)
|
||||
|
||||
|
||||
@shop_router.get("/shop/cart")
|
||||
async def get_cart(request: Request, session: SessionDep, user: UserDep):
|
||||
|
||||
return templates.TemplateResponse(
|
||||
"cart.html.jinja",
|
||||
context={"request": request, "user": user},
|
||||
)
|
||||
|
||||
|
||||
@shop_router.get("/shop/finalize_order")
|
||||
async def get_cart(request: Request, session: SessionDep, user: UserDep):
|
||||
|
||||
cart = user.shopping_cart
|
||||
|
||||
# TODO: Implement
|
||||
cart.finalize_order()
|
||||
|
||||
return RedirectResponse(url=f"/", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
|
||||
@shop_router.get("/shop/area/{area_id}")
|
||||
async def get_shop(request: Request, session: SessionDep, area_id: int):
|
||||
query = select(Area).where(Area.id == area_id)
|
||||
@@ -28,3 +52,27 @@ async def get_shop(request: Request, session: SessionDep, area_id: int):
|
||||
"area.html.jinja",
|
||||
context={"request": request, "area": area},
|
||||
)
|
||||
|
||||
|
||||
@shop_router.post("/shop/cart/add")
|
||||
async def add_to_cart(request: Request, session: SessionDep, user: UserDep):
|
||||
form_data = await request.form()
|
||||
|
||||
query = select(Product).where(Product.id == form_data["product_id"])
|
||||
product = session.scalars(query).one()
|
||||
|
||||
quantity = Decimal(form_data["quantity"])
|
||||
total_amount = product.price * quantity
|
||||
|
||||
order_item = OrderItem(
|
||||
product=product, quantity=quantity, total_amount=total_amount
|
||||
)
|
||||
session.add(order_item)
|
||||
cart = user.shopping_cart
|
||||
cart.items.append(order_item)
|
||||
|
||||
session.flush()
|
||||
|
||||
return RedirectResponse(
|
||||
url=f"/shop/area/{form_data['area_id']}", status_code=status.HTTP_302_FOUND
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user