diff --git a/src/meal_manager/main.py b/src/meal_manager/main.py index c4b629f..01ee1ba 100644 --- a/src/meal_manager/main.py +++ b/src/meal_manager/main.py @@ -7,10 +7,11 @@ from typing import Annotated from urllib.parse import quote_plus import starlette.status as status -from fastapi import Depends, FastAPI, HTTPException, Request, Response +from fastapi import Depends, FastAPI, Form, HTTPException, Request, Response 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.orm import Session @@ -64,7 +65,7 @@ def get_user(request: Request, allow_none: bool = True) -> dict | None: return { "username": request.headers["ynh_user"], # TODO: This should obviously be replaced with a role based check - "admin": request.headers["ynh_user"] in ["niklas.m", "martin.k"] + "admin": request.headers["ynh_user"] in ["niklas.m", "martin.k"], } if allow_none: return None @@ -156,35 +157,43 @@ async def subscribe(request: Request, session: SessionDep, user: UserDep): ) -@app.post("/subscribe") -async def add_subscribe(request: Request, session: SessionDep): - form_data = await request.form() - # TODO: Make this return a nicer error message - try: - num_adult_meals = int(form_data["numAdults"]) if form_data["numAdults"] else 0 - num_children_meals = int(form_data["numKids"]) if form_data["numKids"] else 0 - num_small_children_meals = ( - int(form_data["numSmallKids"]) if form_data["numSmallKids"] else 0 - ) - except ValueError: - raise ValueError("All number fields must be integers") +def empty_string_to_zero(value): + if value == "": + return 0 + else: + return value + +class SubscriptionForm(BaseModel): + household: int + days: list[str] + comment: str + numAdults: Annotated[int, BeforeValidator(empty_string_to_zero)] = 0 + numKids: Annotated[int, BeforeValidator(empty_string_to_zero)] = 0 + numSmallKids: Annotated[int, BeforeValidator(empty_string_to_zero)] = 0 + + +@app.post("/subscribe") +async def add_subscribe( + request: Request, + session: SessionDep, + form_data: Annotated[SubscriptionForm, Form()], +): subscription = Subscription( - household_id=form_data["household"], - num_adult_meals=num_adult_meals, - num_children_meals=num_children_meals, - num_small_children_meals=num_small_children_meals, + household_id=form_data.household, + num_adult_meals=form_data.numAdults, + num_children_meals=form_data.numKids, + num_small_children_meals=form_data.numSmallKids, + comment=form_data.comment, ) - selected_days = form_data.getlist("days") - if selected_days: - subscription.monday = "1" in selected_days - subscription.tuesday = "2" in selected_days - subscription.wednesday = "3" in selected_days - subscription.thursday = "4" in selected_days - subscription.friday = "5" in selected_days - subscription.saturday = "6" in selected_days - subscription.sunday = "7" in selected_days + subscription.monday = "1" in form_data.days + subscription.tuesday = "2" in form_data.days + subscription.wednesday = "3" in form_data.days + subscription.thursday = "4" in form_data.days + subscription.friday = "5" in form_data.days + subscription.saturday = "6" in form_data.days + subscription.sunday = "7" in form_data.days session.add(subscription) session.commit() diff --git a/src/meal_manager/scripts.py b/src/meal_manager/scripts.py index 5f02412..534d08e 100644 --- a/src/meal_manager/scripts.py +++ b/src/meal_manager/scripts.py @@ -31,7 +31,9 @@ def run_nightly_tasks(): print("Done running nightly tasks.") -def apply_subscriptions(session: Session, event: Event = None, dry_run: bool = False): +def apply_subscriptions( + session: Session, event: Event | None = None, dry_run: bool = False +): subscriptions = session.scalars(select(Subscription)).all() @@ -76,13 +78,18 @@ def apply_subscriptions(session: Session, event: Event = None, dry_run: bool = F f"There is already a registration for {subscription.household.name}. Skipping subscription." ) continue + + comment = "Dauerhafte Anmeldung" + if subscription.comment: + comment += f" mit Kommentar: {subscription.comment}" + reg = Registration( event_id=event.id, household_id=subscription.household_id, num_adult_meals=subscription.num_adult_meals, num_children_meals=subscription.num_children_meals, num_small_children_meals=subscription.num_small_children_meals, - comment="Dauerhafte Anmeldung", + comment=comment, ) if dry_run: print(f"DRY RUN: Would register {subscription.household.name}") diff --git a/src/meal_manager/templates/subscribe.html b/src/meal_manager/templates/subscribe.html index f5c8439..8b88542 100644 --- a/src/meal_manager/templates/subscribe.html +++ b/src/meal_manager/templates/subscribe.html @@ -89,6 +89,17 @@ {% endfor %} + +
+ Dieser Kommentar wird bei jeder Anmeldung hinzugefügt. +
+