From 05bc812b8de7976f9f39f48e28b33baa6f95efa5 Mon Sep 17 00:00:00 2001 From: trobbi Date: Wed, 14 May 2025 20:23:58 +0000 Subject: [PATCH 01/19] added dress code as a field in event --- api_schemas/event_schemas.py | 3 +++ db_models/event_model.py | 2 ++ seed.py | 1 + services/event_service.py | 1 + 4 files changed, 7 insertions(+) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index 1016a6f..fb0b7cb 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -35,6 +35,7 @@ class EventRead(BaseSchema): can_signup: bool drink_package: bool is_nollning_event: bool + dress_code: str # we dont need to be as strict about out data as in data. @@ -64,6 +65,7 @@ class EventCreate(BaseSchema): can_signup: bool drink_package: bool is_nollning_event: bool + dress_code: str class EventUpdate(BaseSchema): @@ -87,6 +89,7 @@ class EventUpdate(BaseSchema): can_signup: bool | None = None drink_package: bool | None = None is_nollning_event: bool | None = None + dresscode: str | None class AddEventTag(BaseSchema): diff --git a/db_models/event_model.py b/db_models/event_model.py index 38aa79d..61431d0 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -35,6 +35,8 @@ class Event_DB(BaseModel_DB): location: Mapped[str] = mapped_column(String(MAX_EVENT_LOCATION)) + dress_code: Mapped[str] = mapped_column(String(MAX_EVENT_TITLE)) + max_event_users: Mapped[int] = mapped_column(default=0) event_users: Mapped[list["EventUser_DB"]] = relationship( diff --git a/seed.py b/seed.py index fb0de14..8e58692 100644 --- a/seed.py +++ b/seed.py @@ -233,6 +233,7 @@ def seed_events(db: Session, one_council: Council_DB): signup_start=signup_start, signup_end=signup_end, location="Mattehuset", + dress_code="vad du vill", ) db.add(event) db.commit() diff --git a/services/event_service.py b/services/event_service.py index ba1c2b5..d842201 100644 --- a/services/event_service.py +++ b/services/event_service.py @@ -47,6 +47,7 @@ def create_new_event(data: EventCreate, db: Session): drink_package=data.drink_package, location=data.location, is_nollning_event=data.is_nollning_event, + dress_code=data.dress_code, ) db.add(event) # This adds the event itself to the session db.flush() # This is optional but can be helpful to ensure 'event.id' is set if used immediately after From fd00ffdf3387c8837439540a379749431cb4b86e Mon Sep 17 00:00:00 2001 From: trobbi Date: Wed, 14 May 2025 20:37:16 +0000 Subject: [PATCH 02/19] also added event price --- api_schemas/event_schemas.py | 3 +++ db_models/event_model.py | 2 ++ seed.py | 1 + services/event_service.py | 1 + 4 files changed, 7 insertions(+) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index fb0b7cb..b46e29a 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -36,6 +36,7 @@ class EventRead(BaseSchema): drink_package: bool is_nollning_event: bool dress_code: str + price: str # we dont need to be as strict about out data as in data. @@ -66,6 +67,7 @@ class EventCreate(BaseSchema): drink_package: bool is_nollning_event: bool dress_code: str + price: str class EventUpdate(BaseSchema): @@ -90,6 +92,7 @@ class EventUpdate(BaseSchema): drink_package: bool | None = None is_nollning_event: bool | None = None dresscode: str | None + price: str | None class AddEventTag(BaseSchema): diff --git a/db_models/event_model.py b/db_models/event_model.py index 61431d0..f942fce 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -37,6 +37,8 @@ class Event_DB(BaseModel_DB): dress_code: Mapped[str] = mapped_column(String(MAX_EVENT_TITLE)) + price: Mapped[str] = mapped_column(String(MAX_EVENT_TITLE)) + max_event_users: Mapped[int] = mapped_column(default=0) event_users: Mapped[list["EventUser_DB"]] = relationship( diff --git a/seed.py b/seed.py index 8e58692..e392bd5 100644 --- a/seed.py +++ b/seed.py @@ -234,6 +234,7 @@ def seed_events(db: Session, one_council: Council_DB): signup_end=signup_end, location="Mattehuset", dress_code="vad du vill", + price="gratis bror", ) db.add(event) db.commit() diff --git a/services/event_service.py b/services/event_service.py index d842201..daa5297 100644 --- a/services/event_service.py +++ b/services/event_service.py @@ -48,6 +48,7 @@ def create_new_event(data: EventCreate, db: Session): location=data.location, is_nollning_event=data.is_nollning_event, dress_code=data.dress_code, + price=data.price, ) db.add(event) # This adds the event itself to the session db.flush() # This is optional but can be helpful to ensure 'event.id' is set if used immediately after From c6b5a929ae7c39a827fd575b711664e57422f507 Mon Sep 17 00:00:00 2001 From: trobbi Date: Wed, 14 May 2025 20:42:11 +0000 Subject: [PATCH 03/19] changed to int, should be better --- api_schemas/event_schemas.py | 6 +++--- db_models/event_model.py | 2 +- seed.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index b46e29a..1f2cd3e 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -36,7 +36,7 @@ class EventRead(BaseSchema): drink_package: bool is_nollning_event: bool dress_code: str - price: str + price: int # we dont need to be as strict about out data as in data. @@ -67,7 +67,7 @@ class EventCreate(BaseSchema): drink_package: bool is_nollning_event: bool dress_code: str - price: str + price: int class EventUpdate(BaseSchema): @@ -92,7 +92,7 @@ class EventUpdate(BaseSchema): drink_package: bool | None = None is_nollning_event: bool | None = None dresscode: str | None - price: str | None + price: int | None class AddEventTag(BaseSchema): diff --git a/db_models/event_model.py b/db_models/event_model.py index f942fce..41b628c 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -37,7 +37,7 @@ class Event_DB(BaseModel_DB): dress_code: Mapped[str] = mapped_column(String(MAX_EVENT_TITLE)) - price: Mapped[str] = mapped_column(String(MAX_EVENT_TITLE)) + price: Mapped[int] = mapped_column() max_event_users: Mapped[int] = mapped_column(default=0) diff --git a/seed.py b/seed.py index e392bd5..c11b0dd 100644 --- a/seed.py +++ b/seed.py @@ -234,7 +234,7 @@ def seed_events(db: Session, one_council: Council_DB): signup_end=signup_end, location="Mattehuset", dress_code="vad du vill", - price="gratis bror", + price=123, ) db.add(event) db.commit() From 75e1ddc149d2801781035e3093d886b53a2b67cf Mon Sep 17 00:00:00 2001 From: trobbi Date: Mon, 19 May 2025 18:28:00 +0000 Subject: [PATCH 04/19] removed cash field and added less than 0 price check :trollface: --- api_schemas/event_schemas.py | 3 --- db_models/event_model.py | 1 - services/event_service.py | 7 ++++++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index 1f2cd3e..8e2298a 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -30,7 +30,6 @@ class EventRead(BaseSchema): recurring: bool drink: bool food: bool - cash: bool closed: bool can_signup: bool drink_package: bool @@ -61,7 +60,6 @@ class EventCreate(BaseSchema): recurring: bool drink: bool food: bool - cash: bool closed: bool can_signup: bool drink_package: bool @@ -86,7 +84,6 @@ class EventUpdate(BaseSchema): recurring: bool | None = None drink: bool | None = None food: bool | None = None - cash: bool | None = None closed: bool | None = None can_signup: bool | None = None drink_package: bool | None = None diff --git a/db_models/event_model.py b/db_models/event_model.py index 41b628c..118a090 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -58,7 +58,6 @@ class Event_DB(BaseModel_DB): recurring: Mapped[bool] = mapped_column(default=False) drink: Mapped[bool] = mapped_column(default=False) food: Mapped[bool] = mapped_column(default=False) - cash: Mapped[bool] = mapped_column(default=False) closed: Mapped[bool] = mapped_column(default=False) can_signup: Mapped[bool] = mapped_column(default=False) drink_package: Mapped[bool] = mapped_column(default=False) diff --git a/services/event_service.py b/services/event_service.py index daa5297..c8a4403 100644 --- a/services/event_service.py +++ b/services/event_service.py @@ -25,6 +25,9 @@ def create_new_event(data: EventCreate, db: Session): if council is None: raise HTTPException(status.HTTP_404_NOT_FOUND, "That council does not exist") + if data.price < 0: + raise HTTPException(400, detail="Price cannot be lower than 0") + event = Event_DB( starts_at=start, ends_at=end, @@ -41,7 +44,6 @@ def create_new_event(data: EventCreate, db: Session): recurring=data.recurring, drink=data.drink, food=data.food, - cash=data.cash, closed=data.closed, can_signup=data.can_signup, drink_package=data.drink_package, @@ -83,6 +85,9 @@ def update_event(event_id: int, data: EventUpdate, db: Session): if not event: raise HTTPException(status.HTTP_404_NOT_FOUND) + if data.price is not None and data.price < 0: + raise HTTPException(400, detail="Price cannot be lower than 0") + for var, value in vars(data).items(): setattr(event, var, value) if value is not None else None From 53245b1398eb52e717f24ed30eea6bd11c04eb67 Mon Sep 17 00:00:00 2001 From: trobbi Date: Mon, 19 May 2025 19:36:12 +0000 Subject: [PATCH 05/19] =?UTF-8?q?added=20check=20to=20see=20if=20me=20is?= =?UTF-8?q?=20signed=20up=20=F0=9F=91=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/event_signup_router.py | 11 ++++++++++- services/event_signup_service.py | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/routes/event_signup_router.py b/routes/event_signup_router.py index 9874ec1..f279b29 100644 --- a/routes/event_signup_router.py +++ b/routes/event_signup_router.py @@ -5,7 +5,7 @@ from db_models.event_model import Event_DB from db_models.event_user_model import EventUser_DB from db_models.user_model import User_DB -from services.event_signup_service import signup_to_event, signoff_from_event, update_event_signup +from services.event_signup_service import signup_to_event, signoff_from_event, update_event_signup, check_me_signup from user.permission import Permission from api_schemas.event_signup_schemas import EventSignupCreate, EventSignupRead, EventSignupUpdate, EventSignupDelete from pydantic_extra_types.phone_numbers import PhoneNumber @@ -82,6 +82,15 @@ def update_event_signup_route( return update_event_signup(event, data, data.user_id, manage_permission, db) +@event_signup_router.get("/me-signup/{event_id}", response_model=EventSignupRead) +def get_me_event_signup(event_id: int, me: Annotated[User_DB, Permission.member()], db: DB_dependency): + event = db.query(Event_DB).filter_by(id=event_id).one_or_none() + if event is None: + raise HTTPException(404, detail="Event not found") + + return check_me_signup(event_id, me, db) + + # @event_signup_router.get("/{event_id}", response_model=list[EventSignupRead]) # def get_all_signups(event_id: int, db: DB_dependency): # signups = db.query(EventUser_DB).filter(EventUser_DB.event_id == event_id).all() diff --git a/services/event_signup_service.py b/services/event_signup_service.py index 74cfc39..86531cf 100644 --- a/services/event_signup_service.py +++ b/services/event_signup_service.py @@ -62,3 +62,12 @@ def update_event_signup(event: Event_DB, data: EventSignupUpdate, user_id: int, db.commit() db.refresh(event) return signup + + +def check_me_signup(event_id: int, me: User_DB, db: Session): + signup = db.query(EventUser_DB).filter_by(user_id=me.id, event_id=event_id).one_or_none() + + if not signup: + raise HTTPException(404, detail="Signup not found") + + return signup From e16909aeb8315a53e08faa0c34cae37410e8e534 Mon Sep 17 00:00:00 2001 From: trobbi Date: Mon, 26 May 2025 07:49:30 +0000 Subject: [PATCH 06/19] fixed alcohol event type :beers: --- api_schemas/event_schemas.py | 8 ++++---- db_models/event_model.py | 4 ++-- helpers/types.py | 2 ++ seed.py | 1 + services/event_service.py | 4 ++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index 3b21e5c..a7869d4 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -3,7 +3,7 @@ from api_schemas.event_signup_schemas import EventSignupRead from db_models.priority_model import Priority_DB from helpers.constants import MAX_EVENT_DESC, MAX_EVENT_TITLE -from helpers.types import MEMBER_ROLES, datetime_utc +from helpers.types import ALCOHOL_EVENT_TYPES, MEMBER_ROLES, datetime_utc from pydantic import StringConstraints if TYPE_CHECKING: @@ -28,13 +28,13 @@ class EventRead(BaseSchema): all_day: bool signup_not_opened_yet: bool recurring: bool - drink: bool food: bool cash: bool closed: bool can_signup: bool drink_package: bool is_nollning_event: bool + alcohol_event_type: str # we dont need to be as strict about out data as in data. @@ -57,13 +57,13 @@ class EventCreate(BaseSchema): all_day: bool signup_not_opened_yet: bool recurring: bool - drink: bool food: bool cash: bool closed: bool can_signup: bool drink_package: bool is_nollning_event: bool + alcohol_event_type: ALCOHOL_EVENT_TYPES class EventUpdate(BaseSchema): @@ -81,13 +81,13 @@ class EventUpdate(BaseSchema): all_day: bool | None = None signup_not_opened_yet: bool | None = None recurring: bool | None = None - drink: bool | None = None food: bool | None = None cash: bool | None = None closed: bool | None = None can_signup: bool | None = None drink_package: bool | None = None is_nollning_event: bool | None = None + alcohol_event_type: ALCOHOL_EVENT_TYPES | None = None class AddEventTag(BaseSchema): diff --git a/db_models/event_model.py b/db_models/event_model.py index 38aa79d..f689603 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -1,4 +1,4 @@ -from helpers.types import datetime_utc +from helpers.types import ALCOHOL_EVENT_TYPES, datetime_utc from typing import TYPE_CHECKING from sqlalchemy import ForeignKey, String from sqlalchemy.orm import mapped_column, Mapped, relationship @@ -52,7 +52,7 @@ class Event_DB(BaseModel_DB): all_day: Mapped[bool] = mapped_column(default=False) signup_not_opened_yet: Mapped[bool] = mapped_column(default=True) recurring: Mapped[bool] = mapped_column(default=False) - drink: Mapped[bool] = mapped_column(default=False) + alcohol_event_type: Mapped[ALCOHOL_EVENT_TYPES] = mapped_column(default=False) food: Mapped[bool] = mapped_column(default=False) cash: Mapped[bool] = mapped_column(default=False) closed: Mapped[bool] = mapped_column(default=False) diff --git a/helpers/types.py b/helpers/types.py index b1f8997..5af1b38 100644 --- a/helpers/types.py +++ b/helpers/types.py @@ -66,3 +66,5 @@ def force_utc(date: datetime): FOOD_PREFERENCES = Literal["Vegetarian", "Vegan", "Pescetarian", "Mjölkallergi", "Gluten"] DRINK_PACKAGES = Literal["None", "AlcoholFree", "Alcohol"] + +ALCOHOL_EVENT_TYPES = Literal["Alcohol", "Alcohol-Served", "None"] diff --git a/seed.py b/seed.py index fb0de14..7932951 100644 --- a/seed.py +++ b/seed.py @@ -233,6 +233,7 @@ def seed_events(db: Session, one_council: Council_DB): signup_start=signup_start, signup_end=signup_end, location="Mattehuset", + alcohol_event_type="None", ) db.add(event) db.commit() diff --git a/services/event_service.py b/services/event_service.py index ba1c2b5..26e7b43 100644 --- a/services/event_service.py +++ b/services/event_service.py @@ -39,7 +39,6 @@ def create_new_event(data: EventCreate, db: Session): all_day=data.all_day, signup_not_opened_yet=data.signup_not_opened_yet, recurring=data.recurring, - drink=data.drink, food=data.food, cash=data.cash, closed=data.closed, @@ -47,6 +46,7 @@ def create_new_event(data: EventCreate, db: Session): drink_package=data.drink_package, location=data.location, is_nollning_event=data.is_nollning_event, + alcohol_event_type=data.alcohol_event_type, ) db.add(event) # This adds the event itself to the session db.flush() # This is optional but can be helpful to ensure 'event.id' is set if used immediately after @@ -79,7 +79,7 @@ def update_event(event_id: int, data: EventUpdate, db: Session): event = db.query(Event_DB).filter_by(id=event_id).one_or_none() if not event: - raise HTTPException(status.HTTP_404_NOT_FOUND) + raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Event not found") for var, value in vars(data).items(): setattr(event, var, value) if value is not None else None From 2168f39016e7db9f4d0b19167cfb8e20d829f1a4 Mon Sep 17 00:00:00 2001 From: trobbi Date: Mon, 26 May 2025 08:20:43 +0000 Subject: [PATCH 07/19] fix i mission groups osv, added so missions are either accepted or not --- api_schemas/group_mission_schema.py | 6 ++++-- db_models/group_mission_model.py | 2 ++ routes/nollning_router.py | 19 ++++++++++++++++++- services/adventure_mission_service.py | 4 ++-- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/api_schemas/group_mission_schema.py b/api_schemas/group_mission_schema.py index 6fef50d..862d21a 100644 --- a/api_schemas/group_mission_schema.py +++ b/api_schemas/group_mission_schema.py @@ -13,11 +13,13 @@ class GroupMissionCreate(BaseSchema): class GroupMissionEdit(BaseSchema): - points: int - adventure_mission_id: int + points: int | None = None + adventure_mission_id: int | None = None + is_accepted: bool | None = None class GroupMissionRead(BaseSchema): points: int adventure_mission: AdventureMissionRead nollning_group: NollningGroupRead + is_accepted: bool diff --git a/db_models/group_mission_model.py b/db_models/group_mission_model.py index 70c1c6f..91fbfd3 100644 --- a/db_models/group_mission_model.py +++ b/db_models/group_mission_model.py @@ -30,3 +30,5 @@ class GroupMission_DB(BaseModel_DB): nollning_group: Mapped["NollningGroup_DB"] = relationship(back_populates="group_missions") nollning_group_id: Mapped[int] = mapped_column(ForeignKey("nollning_group_table.id"), primary_key=True) + + is_accepted: Mapped[bool] = mapped_column(default=False, init=False) diff --git a/routes/nollning_router.py b/routes/nollning_router.py index 8c84e43..9b550c2 100644 --- a/routes/nollning_router.py +++ b/routes/nollning_router.py @@ -1,5 +1,6 @@ -from fastapi import APIRouter +from fastapi import APIRouter, HTTPException from sqlalchemy import desc +from api_schemas.group_schema import GroupRead from api_schemas.nollning_schema import ( NollningCreate, NollningRead, @@ -9,6 +10,7 @@ ) from database import DB_dependency from db_models.nollning_model import Nollning_DB +from db_models.nollning_group_model import NollningGroup_DB from services.nollning_service import ( add_g_to_nollning, create_nollning, @@ -70,3 +72,18 @@ def get_all_nollning_groups(db: DB_dependency, id: int): ) def delete_group_mission(db: DB_dependency, id: int, data: NollningDeleteMission): return delete_group_m(db, id, data) + + +@nollning_router.delete( + "/remove_group/{group_id}", dependencies=[Permission.require("manage", "Nollning")], response_model=GroupRead +) +def remove_group_from_nollning(db: DB_dependency, group_id: int): + nollning_group = db.query(NollningGroup_DB).filter_by(id=group_id).one_or_none() + + if not nollning_group: + raise HTTPException(404, detail="Group not in nollning") + + db.delete(nollning_group) + db.commit() + + return nollning_group diff --git a/services/adventure_mission_service.py b/services/adventure_mission_service.py index 3dc7739..5d2fe95 100644 --- a/services/adventure_mission_service.py +++ b/services/adventure_mission_service.py @@ -25,8 +25,8 @@ def create_adventure_mission(db: Session, data: AdventureMissionCreate): if data.max_points < 1: raise HTTPException(400, detail="Max points has to be atleast 1") - if data.min_points < 1: - raise HTTPException(400, detail="Min points has to be atleast 1") + if data.min_points < 0: + raise HTTPException(400, detail="Min points has to be atleast 0") new_adventure_mission = AdventureMission_DB( nollning_id=data.nollning_id, From b096657dacdfeee5688b7c17bd046454a9ee54ee Mon Sep 17 00:00:00 2001 From: trobbi Date: Mon, 26 May 2025 08:39:59 +0000 Subject: [PATCH 08/19] fixed remove route --- routes/nollning_router.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/routes/nollning_router.py b/routes/nollning_router.py index 9b550c2..cdecd4d 100644 --- a/routes/nollning_router.py +++ b/routes/nollning_router.py @@ -1,5 +1,5 @@ from fastapi import APIRouter, HTTPException -from sqlalchemy import desc +from sqlalchemy import and_, desc from api_schemas.group_schema import GroupRead from api_schemas.nollning_schema import ( NollningCreate, @@ -11,6 +11,7 @@ from database import DB_dependency from db_models.nollning_model import Nollning_DB from db_models.nollning_group_model import NollningGroup_DB +from group_mission_model import GroupMission_DB from services.nollning_service import ( add_g_to_nollning, create_nollning, @@ -75,14 +76,21 @@ def delete_group_mission(db: DB_dependency, id: int, data: NollningDeleteMission @nollning_router.delete( - "/remove_group/{group_id}", dependencies=[Permission.require("manage", "Nollning")], response_model=GroupRead + "/remove_group/{nollning_group_id}", + dependencies=[Permission.require("manage", "Nollning")], + response_model=NollningGroupRead, ) -def remove_group_from_nollning(db: DB_dependency, group_id: int): - nollning_group = db.query(NollningGroup_DB).filter_by(id=group_id).one_or_none() +def remove_group_from_nollning(db: DB_dependency, nollning_group_id: int): + nollning_group = db.query(NollningGroup_DB).filter_by(id=nollning_group_id).one_or_none() if not nollning_group: raise HTTPException(404, detail="Group not in nollning") + completed_missions = db.query(GroupMission_DB).filter_by(nollning_group_id=nollning_group.id).all() + + if completed_missions: + raise HTTPException(409, detail="Group has missions in nollning and therefore cannot be unlinked") + db.delete(nollning_group) db.commit() From 470b3644e0a08c191fc8d7e109681e1b91cec8ff Mon Sep 17 00:00:00 2001 From: trobbi Date: Tue, 27 May 2025 13:23:33 +0000 Subject: [PATCH 09/19] =?UTF-8?q?added=20so=20event=20has=20a=20field=20fo?= =?UTF-8?q?r=20the=20confirmed=20users=20and=20a=20route=20for=20adding=20?= =?UTF-8?q?all=20the=20confirmed=20users=C2=9F=20:pray:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api_schemas/event_schemas.py | 4 ++++ db_models/event_model.py | 4 ++++ routes/event_router.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index 3b21e5c..a848ca3 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -35,6 +35,8 @@ class EventRead(BaseSchema): can_signup: bool drink_package: bool is_nollning_event: bool + confirmed_event_users: list[EventSignupRead] | None + reserve_event_users: list[EventSignupRead] | None # we dont need to be as strict about out data as in data. @@ -88,6 +90,8 @@ class EventUpdate(BaseSchema): can_signup: bool | None = None drink_package: bool | None = None is_nollning_event: bool | None = None + confirmed_event_users: list[EventSignupRead] | None = None + reserve_event_users: list[EventSignupRead] | None = None class AddEventTag(BaseSchema): diff --git a/db_models/event_model.py b/db_models/event_model.py index 38aa79d..8125db7 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -64,3 +64,7 @@ class Event_DB(BaseModel_DB): ) is_nollning_event: Mapped[bool] = mapped_column(default=False) + + confirmed_event_users: Mapped[list["EventUser_DB"]] = relationship(init=False, back_populates="event") + + reserve_event_users: Mapped[list["EventUser_DB"]] = relationship(init=False, back_populates="event") diff --git a/routes/event_router.py b/routes/event_router.py index 17c0172..097703c 100644 --- a/routes/event_router.py +++ b/routes/event_router.py @@ -110,6 +110,34 @@ def get_random_event_signup(event_id: int, db: DB_dependency): return users +@event_router.patch( + "/event-confirm-event-users/{event_id}", + dependencies=[Permission.require("manage", "Event")], + response_model=EventRead, +) +def confirm_event_users(db: DB_dependency, event_id: int, confirmed_users: list[UserRead]): + event = db.query(Event_DB).filter_by(id=event_id).one_or_none() + + if not event: + raise HTTPException(404, detail="Event not found") + + if len(confirmed_users) > event.max_event_users: + raise HTTPException(400, detail="Too many users for chosen event") + + confirmed_user_ids = [user.id for user in confirmed_users] + + for event_user in event.event_users: + if event_user.user_id in confirmed_user_ids: + event.confirmed_event_users.append(event_user) + else: + event.reserve_event_users.append(event_user) + + db.commit() + db.refresh(event) + + return event + + @event_router.post("/add-tag", dependencies=[Permission.require("manage", "Event")], response_model=AddEventTag) def add_tag_to_event(data: AddEventTag, db: DB_dependency): From 0c16d748c61314f60afdcb39816100b2eabd69fe Mon Sep 17 00:00:00 2001 From: trobbi Date: Sun, 15 Jun 2025 20:44:05 +0000 Subject: [PATCH 10/19] the other solution was poop, this is better --- db_models/event_model.py | 4 ---- db_models/event_user_model.py | 6 +++++- routes/event_router.py | 4 +--- routes/nollning_router.py | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/db_models/event_model.py b/db_models/event_model.py index 999d3b7..f689603 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -64,7 +64,3 @@ class Event_DB(BaseModel_DB): ) is_nollning_event: Mapped[bool] = mapped_column(default=False) - - confirmed_event_users: Mapped[list["EventUser_DB"]] = relationship(init=False, back_populates="event") - - reserve_event_users: Mapped[list["EventUser_DB"]] = relationship(init=False, back_populates="event") diff --git a/db_models/event_user_model.py b/db_models/event_user_model.py index 31ffa2d..b84b801 100644 --- a/db_models/event_user_model.py +++ b/db_models/event_user_model.py @@ -1,5 +1,5 @@ from typing import TYPE_CHECKING, Optional -from sqlalchemy import Column, DateTime, ForeignKey +from sqlalchemy import Column, DateTime, Enum, ForeignKey # from helpers.types import MEMBER_TYPE from .base_model import BaseModel_DB @@ -22,6 +22,10 @@ class EventUser_DB(BaseModel_DB): event: Mapped["Event_DB"] = relationship(back_populates="event_users") event_id: Mapped[int] = mapped_column(ForeignKey("event_table.id"), primary_key=True) + confirmed_status: Mapped[str] = mapped_column( + Enum("confirmed", "unconfirmed", name="confirmed_enum"), default="unconfirmed" + ) + group_name: Mapped[Optional[str]] = mapped_column(default=None) priority: Mapped[str] = mapped_column(default="Övrigt") drinkPackage: Mapped[str] = mapped_column(default="None") diff --git a/routes/event_router.py b/routes/event_router.py index 097703c..5693589 100644 --- a/routes/event_router.py +++ b/routes/event_router.py @@ -128,9 +128,7 @@ def confirm_event_users(db: DB_dependency, event_id: int, confirmed_users: list[ for event_user in event.event_users: if event_user.user_id in confirmed_user_ids: - event.confirmed_event_users.append(event_user) - else: - event.reserve_event_users.append(event_user) + event_user.confirmed_status = "confirmed" db.commit() db.refresh(event) diff --git a/routes/nollning_router.py b/routes/nollning_router.py index cdecd4d..332ec27 100644 --- a/routes/nollning_router.py +++ b/routes/nollning_router.py @@ -11,7 +11,7 @@ from database import DB_dependency from db_models.nollning_model import Nollning_DB from db_models.nollning_group_model import NollningGroup_DB -from group_mission_model import GroupMission_DB +from db_models.group_mission_model import GroupMission_DB from services.nollning_service import ( add_g_to_nollning, create_nollning, From 5837b24e8884ff35887161fbbd466d57208988a7 Mon Sep 17 00:00:00 2001 From: trobbi Date: Sun, 15 Jun 2025 20:59:58 +0000 Subject: [PATCH 11/19] changed how event prices work, for free, put 0 --- api_schemas/event_schemas.py | 6 +++--- db_models/event_model.py | 2 +- services/event_service.py | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index 8152f7f..8775e6c 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -29,7 +29,7 @@ class EventRead(BaseSchema): signup_not_opened_yet: bool recurring: bool food: bool - cash: bool + price: int closed: bool can_signup: bool drink_package: bool @@ -60,7 +60,7 @@ class EventCreate(BaseSchema): signup_not_opened_yet: bool recurring: bool food: bool - cash: bool + price: int closed: bool can_signup: bool drink_package: bool @@ -84,7 +84,7 @@ class EventUpdate(BaseSchema): signup_not_opened_yet: bool | None = None recurring: bool | None = None food: bool | None = None - cash: bool | None = None + price: int | None = None closed: bool | None = None can_signup: bool | None = None drink_package: bool | None = None diff --git a/db_models/event_model.py b/db_models/event_model.py index f689603..5d0d66d 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -54,7 +54,7 @@ class Event_DB(BaseModel_DB): recurring: Mapped[bool] = mapped_column(default=False) alcohol_event_type: Mapped[ALCOHOL_EVENT_TYPES] = mapped_column(default=False) food: Mapped[bool] = mapped_column(default=False) - cash: Mapped[bool] = mapped_column(default=False) + price: Mapped[int] = mapped_column(default=False) closed: Mapped[bool] = mapped_column(default=False) can_signup: Mapped[bool] = mapped_column(default=False) drink_package: Mapped[bool] = mapped_column(default=False) diff --git a/services/event_service.py b/services/event_service.py index 26e7b43..236a142 100644 --- a/services/event_service.py +++ b/services/event_service.py @@ -20,6 +20,9 @@ def create_new_event(data: EventCreate, db: Session): if start < datetime.now(UTC): raise HTTPException(status.HTTP_400_BAD_REQUEST, detail="Event start cannot be in the past, silly.") + if data.price < 0: + raise HTTPException(400, detail="price cannot be lower than 0") + # Check if council exists. It's just some extra validation council = db.query(Council_DB).filter_by(id=data.council_id).one_or_none() if council is None: @@ -40,7 +43,7 @@ def create_new_event(data: EventCreate, db: Session): signup_not_opened_yet=data.signup_not_opened_yet, recurring=data.recurring, food=data.food, - cash=data.cash, + price=data.price, closed=data.closed, can_signup=data.can_signup, drink_package=data.drink_package, From 21c2d93bb78f756e482ba7c9c0817636a309ff56 Mon Sep 17 00:00:00 2001 From: trobbi Date: Sun, 15 Jun 2025 21:14:58 +0000 Subject: [PATCH 12/19] fixed some errors --- db_models/event_model.py | 3 ++- seed.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/db_models/event_model.py b/db_models/event_model.py index 490cf45..7a7ab2c 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -39,6 +39,8 @@ class Event_DB(BaseModel_DB): price: Mapped[int] = mapped_column() + alcohol_event_type: Mapped[ALCOHOL_EVENT_TYPES] = mapped_column() + max_event_users: Mapped[int] = mapped_column(default=0) event_users: Mapped[list["EventUser_DB"]] = relationship( @@ -56,7 +58,6 @@ class Event_DB(BaseModel_DB): all_day: Mapped[bool] = mapped_column(default=False) signup_not_opened_yet: Mapped[bool] = mapped_column(default=True) recurring: Mapped[bool] = mapped_column(default=False) - alcohol_event_type: Mapped[ALCOHOL_EVENT_TYPES] = mapped_column(default=False) food: Mapped[bool] = mapped_column(default=False) closed: Mapped[bool] = mapped_column(default=False) can_signup: Mapped[bool] = mapped_column(default=False) diff --git a/seed.py b/seed.py index c11b0dd..edb61be 100644 --- a/seed.py +++ b/seed.py @@ -235,6 +235,7 @@ def seed_events(db: Session, one_council: Council_DB): location="Mattehuset", dress_code="vad du vill", price=123, + alcohol_event_type="Alcohol", ) db.add(event) db.commit() From 296d7b2f02c73e8105d84c1f9416de191bc424b0 Mon Sep 17 00:00:00 2001 From: trobbi Date: Sun, 15 Jun 2025 22:02:37 +0000 Subject: [PATCH 13/19] added so event has a field for how many are signed up, idk if this is the best way to do it though --- api_schemas/event_schemas.py | 1 + db_models/event_model.py | 2 ++ services/event_signup_service.py | 7 +++++++ 3 files changed, 10 insertions(+) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index ddbbea8..6d2f9d1 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -36,6 +36,7 @@ class EventRead(BaseSchema): alcohol_event_type: str dress_code: str price: int + signup_count: int # we dont need to be as strict about out data as in data. diff --git a/db_models/event_model.py b/db_models/event_model.py index 7a7ab2c..1e5e3c8 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -39,6 +39,8 @@ class Event_DB(BaseModel_DB): price: Mapped[int] = mapped_column() + signup_count: Mapped[int] = mapped_column(init=False, default=0) + alcohol_event_type: Mapped[ALCOHOL_EVENT_TYPES] = mapped_column() max_event_users: Mapped[int] = mapped_column(default=0) diff --git a/services/event_signup_service.py b/services/event_signup_service.py index 86531cf..0b73d56 100644 --- a/services/event_signup_service.py +++ b/services/event_signup_service.py @@ -26,7 +26,11 @@ def signup_to_event(event: Event_DB, user: User_DB, data: EventSignupCreate, man setattr(signup, var, value) if value else None db.add(signup) + + event.signup_count += 1 + db.commit() + return signup @@ -44,6 +48,9 @@ def signoff_from_event( raise HTTPException(status.HTTP_404_NOT_FOUND) db.delete(signup) + + event.signup_count -= 1 + db.commit() return signup From 57cebaa3e8b646d3f67cf2c58c1dfb0a23401026 Mon Sep 17 00:00:00 2001 From: trobbi Date: Wed, 25 Jun 2025 15:52:04 +0000 Subject: [PATCH 14/19] changed the signoff route --- api_schemas/event_signup_schemas.py | 2 +- routes/event_signup_router.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api_schemas/event_signup_schemas.py b/api_schemas/event_signup_schemas.py index 05b1bc1..3515072 100644 --- a/api_schemas/event_signup_schemas.py +++ b/api_schemas/event_signup_schemas.py @@ -28,4 +28,4 @@ class EventSignupUpdate(BaseSchema): class EventSignupDelete(BaseSchema): - user_id: int | None = None + user_id: int diff --git a/routes/event_signup_router.py b/routes/event_signup_router.py index f279b29..b1d960a 100644 --- a/routes/event_signup_router.py +++ b/routes/event_signup_router.py @@ -43,7 +43,7 @@ def event_signup_route( @event_signup_router.delete("/{event_id}", response_model=EventSignupRead) def event_signoff_route( event_id: int, - data: EventSignupDelete, + user_id: int, me: Annotated[User_DB, Permission.member()], manage_permission: Annotated[bool, Permission.check("manage", "Event")], db: DB_dependency, @@ -52,13 +52,13 @@ def event_signoff_route( if event is None: raise HTTPException(status.HTTP_404_NOT_FOUND) - if data.user_id is None or data.user_id == me.id: + if user_id == me.id: return signoff_from_event(event, me.id, manage_permission, db) if manage_permission == False: raise HTTPException(status.HTTP_400_BAD_REQUEST, "Check your permissions mate") - return signoff_from_event(event, data.user_id, manage_permission, db) + return signoff_from_event(event, user_id, manage_permission, db) @event_signup_router.patch("/{event_id}", response_model=EventSignupRead) From a6fda6f52f7d6c6424b54cdc4b784ee31187f93d Mon Sep 17 00:00:00 2001 From: trobbi Date: Wed, 25 Jun 2025 16:42:13 +0000 Subject: [PATCH 15/19] added some checks in signup and removed signup_not_opened_yet --- api_schemas/event_schemas.py | 3 --- db_models/event_model.py | 1 - services/event_service.py | 1 - services/event_signup_service.py | 9 ++++++++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index 6d2f9d1..2935fee 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -26,7 +26,6 @@ class EventRead(BaseSchema): max_event_users: int priorities: list[Priority_DB] all_day: bool - signup_not_opened_yet: bool recurring: bool food: bool closed: bool @@ -57,7 +56,6 @@ class EventCreate(BaseSchema): max_event_users: int priorities: list[MEMBER_ROLES] all_day: bool - signup_not_opened_yet: bool recurring: bool food: bool closed: bool @@ -82,7 +80,6 @@ class EventUpdate(BaseSchema): location: str max_event_users: int | None = None all_day: bool | None = None - signup_not_opened_yet: bool | None = None recurring: bool | None = None food: bool | None = None closed: bool | None = None diff --git a/db_models/event_model.py b/db_models/event_model.py index 1e5e3c8..bf93d8b 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -58,7 +58,6 @@ class Event_DB(BaseModel_DB): ) all_day: Mapped[bool] = mapped_column(default=False) - signup_not_opened_yet: Mapped[bool] = mapped_column(default=True) recurring: Mapped[bool] = mapped_column(default=False) food: Mapped[bool] = mapped_column(default=False) closed: Mapped[bool] = mapped_column(default=False) diff --git a/services/event_service.py b/services/event_service.py index 0cf1bc6..84d24c5 100644 --- a/services/event_service.py +++ b/services/event_service.py @@ -43,7 +43,6 @@ def create_new_event(data: EventCreate, db: Session): signup_end=signup_end, max_event_users=data.max_event_users, all_day=data.all_day, - signup_not_opened_yet=data.signup_not_opened_yet, recurring=data.recurring, food=data.food, closed=data.closed, diff --git a/services/event_signup_service.py b/services/event_signup_service.py index 0b73d56..3ffd9a2 100644 --- a/services/event_signup_service.py +++ b/services/event_signup_service.py @@ -10,7 +10,14 @@ def signup_to_event(event: Event_DB, user: User_DB, data: EventSignupCreate, manage_permission: bool, db: Session): now = datetime.now(UTC) - if event.signup_end < now and manage_permission == False: + + if (event.closed) and (manage_permission == False): + raise HTTPException(400, detail="Event is closed") + + if (event.signup_start > now) and (manage_permission == False): + raise HTTPException(400, detail="Event signup has not opened yet") + + if (event.signup_end < now) and (manage_permission == False): raise HTTPException(status.HTTP_400_BAD_REQUEST, detail="Event signup deadline is passed") if ( From c78ac5f7d22dad304df161451df9f62989aa5402 Mon Sep 17 00:00:00 2001 From: trobbi Date: Wed, 25 Jun 2025 16:54:01 +0000 Subject: [PATCH 16/19] added field in schema --- api_schemas/event_signup_schemas.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/api_schemas/event_signup_schemas.py b/api_schemas/event_signup_schemas.py index 3515072..95b6167 100644 --- a/api_schemas/event_signup_schemas.py +++ b/api_schemas/event_signup_schemas.py @@ -18,6 +18,7 @@ class EventSignupRead(BaseSchema): priority: str group_name: str drinkPackage: DRINK_PACKAGES + confirmed_status: bool class EventSignupUpdate(BaseSchema): @@ -27,5 +28,5 @@ class EventSignupUpdate(BaseSchema): drinkPackage: DRINK_PACKAGES | None = None -class EventSignupDelete(BaseSchema): - user_id: int +# class EventSignupDelete(BaseSchema): +# user_id: int From 0f6f22bfec5fa0057b5f1aea5b06ebef7caca391 Mon Sep 17 00:00:00 2001 From: trobbi Date: Wed, 25 Jun 2025 16:55:39 +0000 Subject: [PATCH 17/19] bruh --- routes/event_signup_router.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/event_signup_router.py b/routes/event_signup_router.py index b1d960a..8c6ca36 100644 --- a/routes/event_signup_router.py +++ b/routes/event_signup_router.py @@ -7,7 +7,7 @@ from db_models.user_model import User_DB from services.event_signup_service import signup_to_event, signoff_from_event, update_event_signup, check_me_signup from user.permission import Permission -from api_schemas.event_signup_schemas import EventSignupCreate, EventSignupRead, EventSignupUpdate, EventSignupDelete +from api_schemas.event_signup_schemas import EventSignupCreate, EventSignupRead, EventSignupUpdate from pydantic_extra_types.phone_numbers import PhoneNumber from api_schemas.event_schemas import EventRead From b313db9b6b297b2701a0638ae22526dbffb76429 Mon Sep 17 00:00:00 2001 From: trobbi Date: Wed, 25 Jun 2025 17:51:15 +0000 Subject: [PATCH 18/19] skjut mig --- api_schemas/event_schemas.py | 13 +++++++++---- db_models/event_model.py | 8 ++++++-- helpers/types.py | 2 ++ seed.py | 2 ++ services/event_signup_service.py | 3 +++ 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/api_schemas/event_schemas.py b/api_schemas/event_schemas.py index 2935fee..b767c1e 100644 --- a/api_schemas/event_schemas.py +++ b/api_schemas/event_schemas.py @@ -3,7 +3,7 @@ from api_schemas.event_signup_schemas import EventSignupRead from db_models.priority_model import Priority_DB from helpers.constants import MAX_EVENT_DESC, MAX_EVENT_TITLE -from helpers.types import ALCOHOL_EVENT_TYPES, MEMBER_ROLES, datetime_utc +from helpers.types import ALCOHOL_EVENT_TYPES, EVENT_DOT_TYPES, MEMBER_ROLES, datetime_utc from pydantic import StringConstraints if TYPE_CHECKING: @@ -36,6 +36,8 @@ class EventRead(BaseSchema): dress_code: str price: int signup_count: int + dot: str + lottery: bool # we dont need to be as strict about out data as in data. @@ -65,6 +67,8 @@ class EventCreate(BaseSchema): alcohol_event_type: ALCOHOL_EVENT_TYPES dress_code: str price: int + dot: EVENT_DOT_TYPES + lottery: bool class EventUpdate(BaseSchema): @@ -77,7 +81,7 @@ class EventUpdate(BaseSchema): title_en: Annotated[str, StringConstraints(max_length=MAX_EVENT_TITLE)] | None = None description_sv: Annotated[str, StringConstraints(max_length=MAX_EVENT_DESC)] | None = None description_en: Annotated[str, StringConstraints(max_length=MAX_EVENT_DESC)] | None = None - location: str + location: str | None = None max_event_users: int | None = None all_day: bool | None = None recurring: bool | None = None @@ -87,8 +91,9 @@ class EventUpdate(BaseSchema): drink_package: bool | None = None is_nollning_event: bool | None = None alcohol_event_type: ALCOHOL_EVENT_TYPES | None = None - dresscode: str | None - price: int | None + dresscode: str | None = None + price: int | None = None + dot: EVENT_DOT_TYPES | None = None class AddEventTag(BaseSchema): diff --git a/db_models/event_model.py b/db_models/event_model.py index bf93d8b..2fbfc50 100644 --- a/db_models/event_model.py +++ b/db_models/event_model.py @@ -1,6 +1,6 @@ -from helpers.types import ALCOHOL_EVENT_TYPES, datetime_utc +from helpers.types import ALCOHOL_EVENT_TYPES, EVENT_DOT_TYPES, datetime_utc from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey, String +from sqlalchemy import ForeignKey, String, Enum from sqlalchemy.orm import mapped_column, Mapped, relationship from helpers.constants import MAX_EVENT_DESC, MAX_EVENT_LOCATION, MAX_EVENT_TITLE from .base_model import BaseModel_DB @@ -69,3 +69,7 @@ class Event_DB(BaseModel_DB): ) is_nollning_event: Mapped[bool] = mapped_column(default=False) + + dot: Mapped[EVENT_DOT_TYPES] = mapped_column(default="None") + + lottery: Mapped[bool] = mapped_column(default=False) diff --git a/helpers/types.py b/helpers/types.py index 5af1b38..d8b9e05 100644 --- a/helpers/types.py +++ b/helpers/types.py @@ -68,3 +68,5 @@ def force_utc(date: datetime): DRINK_PACKAGES = Literal["None", "AlcoholFree", "Alcohol"] ALCOHOL_EVENT_TYPES = Literal["Alcohol", "Alcohol-Served", "None"] + +EVENT_DOT_TYPES = Literal["None", "Single", "Double"] diff --git a/seed.py b/seed.py index edb61be..c33878d 100644 --- a/seed.py +++ b/seed.py @@ -236,6 +236,8 @@ def seed_events(db: Session, one_council: Council_DB): dress_code="vad du vill", price=123, alcohol_event_type="Alcohol", + dot="Double", + lottery=False, ) db.add(event) db.commit() diff --git a/services/event_signup_service.py b/services/event_signup_service.py index 3ffd9a2..e407c4d 100644 --- a/services/event_signup_service.py +++ b/services/event_signup_service.py @@ -32,6 +32,9 @@ def signup_to_event(event: Event_DB, user: User_DB, data: EventSignupCreate, man for var, value in vars(data).items(): setattr(signup, var, value) if value else None + if event.lottery == False: + signup.confirmed_status = "confirmed" + db.add(signup) event.signup_count += 1 From cf9a37a5c79f867c94e41848bdad438a374792cf Mon Sep 17 00:00:00 2001 From: trobbi Date: Wed, 25 Jun 2025 20:03:54 +0000 Subject: [PATCH 19/19] frogor --- services/event_service.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/event_service.py b/services/event_service.py index 84d24c5..dc4909f 100644 --- a/services/event_service.py +++ b/services/event_service.py @@ -53,6 +53,8 @@ def create_new_event(data: EventCreate, db: Session): dress_code=data.dress_code, price=data.price, alcohol_event_type=data.alcohol_event_type, + dot=data.dot, + lottery=data.lottery, ) db.add(event) # This adds the event itself to the session db.flush() # This is optional but can be helpful to ensure 'event.id' is set if used immediately after