diff --git a/new-registration-app/main.py b/new-registration-app/main.py index 9852b33..23c94df 100644 --- a/new-registration-app/main.py +++ b/new-registration-app/main.py @@ -164,6 +164,7 @@ async def add_team_registration(request: Request, event_id: int, session: Sessio statement = select(TeamRegistration).where( TeamRegistration.person_name == person, TeamRegistration.work_type == work_type ) + # if the person has already registered for the same work type, just ignore if session.exec(statement).one_or_none() is None: registration = TeamRegistration( person_name=person, diff --git a/new-registration-app/models.py b/new-registration-app/models.py index 27c5927..8efc803 100644 --- a/new-registration-app/models.py +++ b/new-registration-app/models.py @@ -1,8 +1,10 @@ +import typing from datetime import datetime -from typing import Literal from sqlmodel import Field, Relationship, SQLModel, String +WorkTypes = typing.Literal["cooking", "dishes", "tables"] + class Event(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) @@ -19,20 +21,45 @@ class Event(SQLModel, table=True): team_dishes_min: int = 3 team_dishes_max: int = 5 + # Todo: Rename to "table" team_prep_min: int = 1 team_prep_max: int = 1 registrations: list["Registration"] = Relationship() team: list["TeamRegistration"] = Relationship() + def team_min_reached(self, work_type: WorkTypes): + threshold = { + "cooking": self.team_cooking_min, + "dishes": self.team_dishes_min, + "tables": self.team_prep_min, + }[work_type] + return sum(1 for t in self.team if t.work_type == work_type) >= threshold + + def team_max_reached(self, work_type: WorkTypes): + threshold = { + "cooking": self.team_cooking_max, + "dishes": self.team_dishes_max, + "tables": self.team_prep_max, + }[work_type] + return sum(1 for t in self.team if t.work_type == work_type) >= threshold + + def all_teams_min(self): + return all( + self.team_min_reached(work_type) for work_type in typing.get_args(WorkTypes) + ) + + def all_teams_max(self): + return all( + self.team_max_reached(work_type) for work_type in typing.get_args(WorkTypes) + ) + class TeamRegistration(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) event_id: int | None = Field(default=None, foreign_key="event.id") person_name: str = Field(nullable=False) - work_type: Literal["cooking", "dishes", "tables"] = Field( - nullable=False, sa_type=String - ) + work_type: WorkTypes = Field(nullable=False, sa_type=String) comment: str | None diff --git a/new-registration-app/templates/event.html b/new-registration-app/templates/event.html index cb03742..4714ddf 100644 --- a/new-registration-app/templates/event.html +++ b/new-registration-app/templates/event.html @@ -24,7 +24,7 @@ - {% if event.recipe_link %} @@ -41,7 +41,7 @@
Dienste
- Kochen: {% if event.team | selectattr("work_type", "equalto", "cooking") | list | count >= 3 %}✅{% endif %} + Kochen: {% if event.team_min_reached("cooking") %}✅{% endif %}
{{ teamEntries(event, "cooking") }} @@ -50,7 +50,7 @@
- Spülen: {% if event.team | selectattr("work_type", "equalto", "dishes") | list | count >= 3 %}✅{% endif %} + Spülen: {% if event.team_min_reached("dishes") %}✅{% endif %}
{{ teamEntries(event, "dishes") }} @@ -59,7 +59,7 @@
- Tische vorbereiten: {% if event.team | selectattr("work_type", "equalto", "tables") | list | count >= 1 %}✅{% endif %} + Tische vorbereiten: {% if event.team_min_reached("tables") %}✅{% endif %}
{{ teamEntries(event, "tables") }} @@ -188,9 +188,9 @@