diff --git a/src/meal_manager/alembic/versions/2025_12_12_1226-914ebe23f071_add_billed_column.py b/src/meal_manager/alembic/versions/2025_12_12_1226-914ebe23f071_add_billed_column.py new file mode 100644 index 0000000..0a82aa1 --- /dev/null +++ b/src/meal_manager/alembic/versions/2025_12_12_1226-914ebe23f071_add_billed_column.py @@ -0,0 +1,49 @@ +"""add billing info and organizer name to event + +Revision ID: 914ebe23f071 +Revises: 13084c5c1f68 +Create Date: 2025-12-12 12:26:13.314293 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "914ebe23f071" +down_revision: Union[str, Sequence[str], None] = "13084c5c1f68" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "event", + sa.Column( + "billed", sa.Boolean(), nullable=False, server_default=sa.text("false") + ), + ) + op.add_column( + "event", + sa.Column( + "exclude_from_billing", + sa.Boolean(), + nullable=False, + server_default=sa.text("false"), + ), + ) + op.add_column("event", sa.Column("organizer_name", sa.String(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("event", "organizer_name") + op.drop_column("event", "exclude_from_billing") + op.drop_column("event", "billed") + # ### end Alembic commands ### diff --git a/src/meal_manager/main.py b/src/meal_manager/main.py index b93a90d..90380df 100644 --- a/src/meal_manager/main.py +++ b/src/meal_manager/main.py @@ -241,6 +241,8 @@ async def edit_event( event.description = form_data.get("eventDescription") event.recipe_link = form_data.get("recipeLink") event.ignore_subscriptions = form_data.get("ignoreSubscriptions") == "on" + event.organizer_name = form_data.get("organizerName") + event.exclude_from_billing = form_data.get("excludeFromBilling") == "on" session.commit() @@ -260,6 +262,8 @@ async def add_event(request: Request, session: SessionDep, user: StrictUserDep): description=form_data.get("eventDescription"), recipe_link=form_data.get("recipeLink"), ignore_subscriptions=form_data.get("ignoreSubscriptions") == "on", + organizer_name=form_data.get("organizerName"), + exclude_from_billing=form_data.get("excludeFromBilling") == "on", ) session.add(event) session.commit() @@ -448,8 +452,11 @@ def sync_with_grist_route(event_id: int, session: SessionDep, user: StrictUserDe event = session.scalars(statement).one() entries_written = sync_with_grist(event) + message = "Es wurden keine Einträge geschrieben." if entries_written > 0: + event.billed = True + session.commit() message = f"Erfolgreich {entries_written} Einträge geschrieben." return RedirectResponse( url=f"/event/{event_id}?message={quote_plus(message)}", diff --git a/src/meal_manager/models.py b/src/meal_manager/models.py index 7338e67..907713d 100644 --- a/src/meal_manager/models.py +++ b/src/meal_manager/models.py @@ -36,6 +36,11 @@ class Event(Base): subscriptions_applied: Mapped[bool] = mapped_column(default=False, nullable=False) ignore_subscriptions: Mapped[bool] = mapped_column(default=False, nullable=False) + billed: Mapped[bool] = mapped_column(default=False, nullable=False) + exclude_from_billing: Mapped[bool] = mapped_column(default=False, nullable=False) + + organizer_name: Mapped[str] = mapped_column(nullable=True) + registrations: Mapped[list["Registration"]] = relationship( "Registration", cascade="all, delete" ) diff --git a/src/meal_manager/templates/add_event.html b/src/meal_manager/templates/add_event.html index 6275725..4978477 100644 --- a/src/meal_manager/templates/add_event.html +++ b/src/meal_manager/templates/add_event.html @@ -9,7 +9,7 @@ - +
@@ -20,12 +20,18 @@ Leer lassen für Sonntag Abend vor dem Event
- + +
+ + + Name der Person, die das Event organisiert. +
+
- +
@@ -34,12 +40,19 @@
- - Aktivieren, um dauerhafte Anmeldungen für dieses Event zu ignorieren. Das sollte für alle Events getan werden, die keine offiziellen AG Kochen Kochabende sind. - + + Aktivieren, um dauerhafte Anmeldungen für dieses Event zu ignorieren. Das sollte für alle Events getan werden, die keine offiziellen AG Kochen Kochabende sind. + +
+ +
+ + + + Aktivieren, um dieses Event von der Abrechnung auszuschließen. +
-
diff --git a/src/meal_manager/templates/event.html b/src/meal_manager/templates/event.html index f0b4630..9827b76 100644 --- a/src/meal_manager/templates/event.html +++ b/src/meal_manager/templates/event.html @@ -18,6 +18,7 @@ {% block content %}

{{ event.title }}

{{ event.event_time.strftime('%A, %d.%m.%Y') }}

+{% if event.organizer_name %}

Organisiert von {{ event.organizer_name }}

{% endif %}

{{ event.description }}


{% if message %} @@ -28,7 +29,7 @@ {% endif %}
- +

Anmeldungen

{% if not user %}
@@ -59,7 +60,7 @@
{% if user -%} - + Event bearbeiten {% else -%} @@ -77,7 +78,7 @@
- + Abrechnen
diff --git a/src/meal_manager/templates/index.html b/src/meal_manager/templates/index.html index 8b69cc6..811aa48 100644 --- a/src/meal_manager/templates/index.html +++ b/src/meal_manager/templates/index.html @@ -33,18 +33,25 @@ {% for event in events %} -
-
-
-
{{ event.title }}
-

{{ event.event_time.strftime('%A, %d.%m.%Y') - }} -

-

{{ event.description }}

- {% if event.registration_deadline > now %}Zur Anmeldung{% else %}Details ansehen{% endif %} +
+
+
+
+
+
+ {{ event.title }} + {% if event.billed %}{% endif %} + {% if event.exclude_from_billing %}{% endif %} +
-
+ {% if event.organizer_name %}

{{ event.organizer_name }}

{% endif %} +
+

{{ event.event_time.strftime('%A, %d.%m.%Y') }}

+

{{ event.description }}

+ {% if event.registration_deadline > now %}Zur Anmeldung{% else %}Details ansehen{% endif %} +
+
{% endfor %}