diff --git a/src/meal_manager/main.py b/src/meal_manager/main.py index d30ab17..bfc9a22 100644 --- a/src/meal_manager/main.py +++ b/src/meal_manager/main.py @@ -12,7 +12,7 @@ from fastapi.responses import FileResponse, RedirectResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from pydantic import BaseModel, BeforeValidator, validator -from sqlalchemy import create_engine, select +from sqlalchemy import create_engine, func, select from sqlalchemy.orm import Session from meal_manager.grist import sync_with_grist @@ -93,12 +93,13 @@ SessionDep = Annotated[Session, Depends(get_session)] UserDep = Annotated[dict, Depends(get_user)] StrictUserDep = Annotated[dict, Depends(partial(get_user, allow_none=False))] +PAGE_SIZE = 18 + @app.get("/") async def index(request: Request, session: SessionDep, user: UserDep): """Displays coming events and a button to register new ones""" now = datetime.now() - # TODO: Once we refactored to use SQLAlchemy directly, we can probably do a nicer filtering on the date alone statement = ( select(Event) .order_by(Event.event_time) @@ -108,7 +109,14 @@ async def index(request: Request, session: SessionDep, user: UserDep): return templates.TemplateResponse( request=request, name="index.html", - context={"events": events, "current_page": "home", "now": now, "user": user}, + context={ + "now": now, + "total_pages": 1, + "page": { + "page_number": 1, + "events": events, + }, + }, ) @@ -117,20 +125,39 @@ async def robots_txt(): return FileResponse("src/meal_manager/static/robots.txt", media_type="text/plain") -@app.get("/past_events") -async def past_events(request: Request, session: SessionDep): +@app.get("/past_events/{page_number}") +async def past_events(request: Request, session: SessionDep, page_number: int): + now = datetime.now() - # TODO: Once we refactored to use SQLAlchemy directly, we can probably do a nicer filtering on the date alone + statement = ( select(Event) - .order_by(Event.event_time) .where(Event.event_time < now - timedelta(days=1)) + .order_by(Event.event_time.desc()) + .offset((page_number - 1) * PAGE_SIZE) + .limit(PAGE_SIZE) ) events = session.scalars(statement) + + num_past_events = ( + session.query(func.count(Event.id)) + .where(Event.event_time < func.datetime("now", "-1 day")) + .scalar() + ) + assert num_past_events is not None, "num_past_events should not be None" + total_pages = num_past_events // PAGE_SIZE + 1 + return templates.TemplateResponse( request=request, name="index.html", - context={"events": events, "current_page": "past", "now": now}, + context={ + "now": now, + "total_pages": total_pages, + "page": { + "page_number": page_number, + "events": events, + }, + }, ) diff --git a/src/meal_manager/templates/base.html b/src/meal_manager/templates/base.html index ad01ab9..89c81f7 100644 --- a/src/meal_manager/templates/base.html +++ b/src/meal_manager/templates/base.html @@ -25,7 +25,7 @@ Kommende
{{ event.event_time.strftime('%A, %d.%m.%Y') }}
{{ event.description }}
- {% if event.registration_deadline > now %}Zur Anmeldung{% else %}Details ansehen{% endif %} + {% if event.registration_deadline > now %}Zur Anmeldung{% else %}Details ansehen{% endif %}