diff --git a/dev-server.sh b/dev-server.sh old mode 100644 new mode 100755 diff --git a/src/allmende_payment_system/api/__init__.py b/src/allmende_payment_system/api/__init__.py index e69de29..6fca777 100644 --- a/src/allmende_payment_system/api/__init__.py +++ b/src/allmende_payment_system/api/__init__.py @@ -0,0 +1,23 @@ +from fastapi import APIRouter, Request + +from allmende_payment_system.api.dependencies import SessionDep, UserDep +from allmende_payment_system.database import ensure_user +from allmende_payment_system.tools import get_jinja_renderer + +root_router = APIRouter() + +templates = get_jinja_renderer() + + +@root_router.get("/") +async def landing_page(request: Request, user_info: UserDep, session: SessionDep): + user = ensure_user(user_info, session) + print(f"User {user.username} ({user.display_name}) accessed landing page") + transactions = [] + for account in user.accounts: + transactions += account.transactions + transactions = sorted(transactions, key=lambda t: t.timestamp) + return templates.TemplateResponse( + "index.html.jinja", + context={"request": request, "user": user, "transactions": transactions}, + ) diff --git a/src/allmende_payment_system/api/dependencies.py b/src/allmende_payment_system/api/dependencies.py new file mode 100644 index 0000000..80a3b12 --- /dev/null +++ b/src/allmende_payment_system/api/dependencies.py @@ -0,0 +1,33 @@ +import os +from typing import Annotated + +from fastapi import Depends, HTTPException, Request +from sqlalchemy.orm import Session + +from allmende_payment_system.database import SessionLocal + + +async def get_user(request: Request) -> dict: + + if username := os.environ.get("APS_username", None): + return { + "username": username, + "display_name": os.environ.get("APS_display_name", "Missing Display Name"), + } + if "ynh_user" not in request.headers: + raise HTTPException(status_code=401, detail="Missing ynh_user header") + return {"username": request.headers["ynh_user"]} + + +UserDep = Annotated[dict, Depends(get_user)] + + +def get_session() -> Session: + db = SessionLocal() + try: + yield db + finally: + db.close() + + +SessionDep = Annotated[Session, Depends(get_session)] diff --git a/src/allmende_payment_system/api/shop.py b/src/allmende_payment_system/api/shop.py new file mode 100644 index 0000000..71be710 --- /dev/null +++ b/src/allmende_payment_system/api/shop.py @@ -0,0 +1,20 @@ +from fastapi import APIRouter, Request +from sqlalchemy import select + +from allmende_payment_system.api import SessionDep +from allmende_payment_system.models import Area +from allmende_payment_system.tools import get_jinja_renderer + +shop_router = APIRouter() + +templates = get_jinja_renderer() + + +@shop_router.get("/shop") +async def get_shop(request: Request, session: SessionDep): + query = select(Area) + areas = session.scalars(query).all() + return templates.TemplateResponse( + "shop.html.jinja", + context={"request": request, "areas": areas}, + ) diff --git a/src/allmende_payment_system/app.py b/src/allmende_payment_system/app.py index 1231e14..c51e0bf 100644 --- a/src/allmende_payment_system/app.py +++ b/src/allmende_payment_system/app.py @@ -1,32 +1,13 @@ -import os -from typing import Annotated - -from fastapi import Depends, FastAPI, HTTPException, Request +from fastapi import Depends, FastAPI from fastapi.staticfiles import StaticFiles -from fastapi.templating import Jinja2Templates -from sqlalchemy.orm import Session - -from allmende_payment_system.database import SessionLocal, ensure_user - - -async def get_user(request: Request) -> dict: - - if username := os.environ.get("APS_username", None): - return { - "username": username, - "display_name": os.environ.get("APS_display_name", "Missing Display Name"), - } - if "ynh_user" not in request.headers: - raise HTTPException(status_code=401, detail="Missing ynh_user header") - return {"username": request.headers["ynh_user"]} - - -UserDep = Annotated[dict, Depends(get_user)] +from allmende_payment_system.api import root_router +from allmende_payment_system.api.dependencies import get_user +from allmende_payment_system.api.shop import shop_router app = FastAPI(dependencies=[Depends(get_user)]) -templates = Jinja2Templates(directory="src/allmende_payment_system/templates") + app.mount( "/static", StaticFiles(directory="src/allmende_payment_system/static"), @@ -34,26 +15,5 @@ app.mount( ) -def get_session() -> Session: - db = SessionLocal() - try: - yield db - finally: - db.close() - - -SessionDep = Annotated[Session, Depends(get_session)] - - -@app.get("/") -async def landing_page(request: Request, user_info: UserDep, session: SessionDep): - user = ensure_user(user_info, session) - print(f"User {user.username} ({user.display_name}) accessed landing page") - transactions = [] - for account in user.accounts: - transactions += account.transactions - transactions = sorted(transactions, key=lambda t: t.timestamp) - return templates.TemplateResponse( - "index.html.jinja", - context={"request": request, "user": user, "transactions": transactions}, - ) +app.include_router(root_router) +app.include_router(shop_router) diff --git a/src/allmende_payment_system/models.py b/src/allmende_payment_system/models.py index c8005b8..b9bff74 100644 --- a/src/allmende_payment_system/models.py +++ b/src/allmende_payment_system/models.py @@ -52,6 +52,8 @@ class Area(Base): __tablename__ = TABLE_PREFIX + "area" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) name: Mapped[str] = mapped_column(nullable=False, unique=True) + description: Mapped[str] = mapped_column(nullable=True) + image_path: Mapped[str] = mapped_column(nullable=True) class Product(Base): diff --git a/src/allmende_payment_system/static/img/food-coop.jpg b/src/allmende_payment_system/static/img/food-coop.jpg new file mode 100644 index 0000000..d974bd1 Binary files /dev/null and b/src/allmende_payment_system/static/img/food-coop.jpg differ diff --git a/src/allmende_payment_system/static/img/gemeinsam-essen.jpg b/src/allmende_payment_system/static/img/gemeinsam-essen.jpg new file mode 100644 index 0000000..efdec28 Binary files /dev/null and b/src/allmende_payment_system/static/img/gemeinsam-essen.jpg differ diff --git a/src/allmende_payment_system/static/img/kaffeemaschine.jpg b/src/allmende_payment_system/static/img/kaffeemaschine.jpg new file mode 100644 index 0000000..06a3737 Binary files /dev/null and b/src/allmende_payment_system/static/img/kaffeemaschine.jpg differ diff --git a/src/allmende_payment_system/static/img/waschküche.jpg b/src/allmende_payment_system/static/img/waschküche.jpg new file mode 100644 index 0000000..04bf667 Binary files /dev/null and b/src/allmende_payment_system/static/img/waschküche.jpg differ diff --git a/src/allmende_payment_system/templates/base.html.jinja b/src/allmende_payment_system/templates/base.html.jinja index 895a22a..2cf7801 100644 --- a/src/allmende_payment_system/templates/base.html.jinja +++ b/src/allmende_payment_system/templates/base.html.jinja @@ -21,22 +21,22 @@
diff --git a/src/allmende_payment_system/templates/index.html.jinja b/src/allmende_payment_system/templates/index.html.jinja index b24287e..817ea01 100644 --- a/src/allmende_payment_system/templates/index.html.jinja +++ b/src/allmende_payment_system/templates/index.html.jinja @@ -45,7 +45,7 @@ {% for transaction in transactions[:10] %}In welchem Bereich möchtest du einkaufen?
+