diff --git a/src/meal_manager/main.py b/src/meal_manager/main.py index d20ed7e..09ab57c 100644 --- a/src/meal_manager/main.py +++ b/src/meal_manager/main.py @@ -36,7 +36,8 @@ def get_session(): with Session(engine) as session: yield session -def get_user(request: Request, allow_none: bool=True) -> dict | None: + +def get_user(request: Request, allow_none: bool = True) -> dict | None: """ Retrieve user information from the incoming request. @@ -68,6 +69,7 @@ def get_user(request: Request, allow_none: bool=True) -> dict | None: else: raise HTTPException(status_code=401, detail="Not logged in") + def create_db_and_tables(): Base.metadata.create_all(engine) @@ -87,8 +89,10 @@ SessionDep = Annotated[Session, Depends(get_session)] UserDep = Annotated[dict, Depends(get_user)] StrictUserDep = Annotated[dict, Depends(partial(get_user, allow_none=False))] + + @app.get("/") -async def index(request: Request, session: SessionDep, user : UserDep): +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 @@ -194,22 +198,46 @@ async def add_event_form(request: Request, user: StrictUserDep): return templates.TemplateResponse(request=request, name="add_event.html") +@app.get("/event/{event_id}/edit") +async def edit_event_form( + request: Request, event_id: int, session: SessionDep, user: StrictUserDep +): + statement = select(Event).where(Event.id == event_id) + event = session.scalars(statement).one() + + return templates.TemplateResponse( + request=request, + context={"event": event, "edit_mode": True}, + name="add_event.html", + ) + + +@app.post("/event/{event_id}/edit") +async def edit_event( + request: Request, event_id: int, session: SessionDep, user: StrictUserDep +): + statement = select(Event).where(Event.id == event_id) + event = session.scalars(statement).one() + + form_data = await request.form() + event_time, registration_deadline = await parse_event_times(form_data) + + event.title = form_data["eventName"] + event.event_time = event_time + event.registration_deadline = registration_deadline + event.description = form_data.get("eventDescription") + event.recipe_link = form_data.get("recipeLink") + + session.commit() + + return RedirectResponse(url=f"/event/{event.id}", status_code=status.HTTP_302_FOUND) + + @app.post("/event/add") async def add_event(request: Request, session: SessionDep, user: StrictUserDep): form_data = await request.form() - event_time = datetime.fromisoformat(form_data["eventTime"]) - registration_deadline = form_data.get("registrationDeadline") - if not registration_deadline: - # Find the last Sunday before event_time - deadline = event_time - while deadline.weekday() != 6: # 6 represents Sunday - deadline = deadline.replace(day=deadline.day - 1) - registration_deadline = deadline.replace( - hour=19, minute=30, second=0, microsecond=0 - ) - else: - registration_deadline = datetime.fromisoformat(registration_deadline) + event_time, registration_deadline = await parse_event_times(form_data) event = Event( title=form_data["eventName"], @@ -222,8 +250,27 @@ async def add_event(request: Request, session: SessionDep, user: StrictUserDep): session.commit() return RedirectResponse(url="/", status_code=status.HTTP_302_FOUND) + +async def parse_event_times(form_data): + event_time = datetime.fromisoformat(form_data["eventTime"]) + registration_deadline = form_data.get("registrationDeadline") + if not registration_deadline: + # Find the last Sunday before event_time + deadline = event_time + while deadline.weekday() != 6: # 6 represents Sunday + deadline = deadline.replace(day=deadline.day - 1) + registration_deadline = deadline.replace( + hour=19, minute=30, second=0, microsecond=0 + ) + else: + registration_deadline = datetime.fromisoformat(registration_deadline) + return event_time, registration_deadline + + @app.get("/event/{event_id}/delete") -async def delete_event(request: Request, session: SessionDep, event_id: int, user: StrictUserDep): +async def delete_event( + request: Request, session: SessionDep, event_id: int, user: StrictUserDep +): if not user["admin"]: raise HTTPException(status_code=403, detail="Not authorized") @@ -234,8 +281,11 @@ async def delete_event(request: Request, session: SessionDep, event_id: int, use session.commit() return RedirectResponse(url="/", status_code=status.HTTP_302_FOUND) + @app.get("/event/{event_id}") -async def read_event(request: Request, event_id: int, session: SessionDep, user: UserDep): +async def read_event( + request: Request, event_id: int, session: SessionDep, user: UserDep +): statement = select(Event).where(Event.id == event_id) event = session.scalars(statement).one() @@ -252,7 +302,12 @@ async def read_event(request: Request, event_id: int, session: SessionDep, user: return templates.TemplateResponse( request=request, name="event.html", - context={"event": event, "households": households, "now": datetime.now(), "user": user}, + context={ + "event": event, + "households": households, + "now": datetime.now(), + "user": user, + }, ) @@ -334,6 +389,7 @@ async def delete_team_registration( session.commit() return RedirectResponse(url=f"/event/{event_id}", status_code=status.HTTP_302_FOUND) + @app.get("/event/{event_id}/pdf") def get_event_attendance_pdf(event_id: int, session: SessionDep): @@ -347,7 +403,5 @@ def get_event_attendance_pdf(event_id: int, session: SessionDep): } return Response( - content=pdf_buffer.getvalue(), - media_type="application/pdf", - headers=headers - ) \ No newline at end of file + content=pdf_buffer.getvalue(), media_type="application/pdf", headers=headers + ) diff --git a/src/meal_manager/templates/add_event.html b/src/meal_manager/templates/add_event.html index 201ccdd..07e995e 100644 --- a/src/meal_manager/templates/add_event.html +++ b/src/meal_manager/templates/add_event.html @@ -3,35 +3,35 @@ {% block content %}