@@ -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):
|
||||
)
|
||||
|
||||
|
||||
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 = 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")
|
||||
|
||||
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()
|
||||
|
||||
@@ -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}")
|
||||
|
||||
@@ -89,6 +89,17 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Kommentar</label>
|
||||
<p class="text-muted small mb-2">
|
||||
Dieser Kommentar wird bei jeder Anmeldung hinzugefügt.
|
||||
</p>
|
||||
<div class="d-flex flex-wrap gap-3">
|
||||
<input name="comment" id="InputComment" class="form-control"
|
||||
aria-label="Kommentar">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
@@ -134,6 +145,14 @@
|
||||
<div class="fw-bold small">{{ sub.day_string_de() }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% if sub.comment %}
|
||||
<div class="row g-2">
|
||||
<div class="col-12">
|
||||
<div class="text-muted" style="font-size: 0.7rem;">Kommentar</div>
|
||||
<div class="fw-bold small">{{ sub.comment }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
@@ -39,6 +39,7 @@ def test_subscriptions(db_session):
|
||||
num_adult_meals=2,
|
||||
num_children_meals=1,
|
||||
num_small_children_meals=0,
|
||||
comment="test",
|
||||
)
|
||||
)
|
||||
db_session.commit()
|
||||
@@ -54,3 +55,5 @@ def test_subscriptions(db_session):
|
||||
assert not event1.subscriptions_applied
|
||||
assert not ignore.subscriptions_applied
|
||||
assert event2.subscriptions_applied
|
||||
assert event2.registrations[0].comment is not None
|
||||
assert "test" in event2.registrations[0].comment
|
||||
|
||||
Reference in New Issue
Block a user