From 43ee692609f89508508559c4e5f3053136d867aa Mon Sep 17 00:00:00 2001 From: Tiago Scholten Date: Thu, 12 Nov 2026 19:55:21 +0100 Subject: [PATCH] changed times of activities --- src/fiber_package/event/activity.py | 9 ++++++--- src/fiber_package/event/enums.py | 1 - src/fiber_package/event/submodels.py | 27 +++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/fiber_package/event/activity.py b/src/fiber_package/event/activity.py index 72a0734..569c2a5 100644 --- a/src/fiber_package/event/activity.py +++ b/src/fiber_package/event/activity.py @@ -4,7 +4,7 @@ from pydantic import model_validator from datetime import datetime from .communication import CommunicationModel -from .submodels import ActivityPaymentInfo +from .submodels import ActivityPaymentInfo, Occurrence from .enums import CommunicationCategory from fiber_package.refs import SignupRefList @@ -16,14 +16,17 @@ from fiber_package.signup.element.form_base_question import FormBaseQuestion from fiber_package.signup.element.types import FormElementUnion, FormTextUnion +# An activity = communication + slug + endtimes + + class ActivityModel(CommunicationModel): category: Literal[CommunicationCategory.activity] slug: str # unique short name used in the public URL - start_time: datetime - end_time: datetime + # Every occurance is either a timeframe (start time - end time) + # + occurances: list[Occurrence] = Field(min_length=1) payment_info: ActivityPaymentInfo | None = None diff --git a/src/fiber_package/event/enums.py b/src/fiber_package/event/enums.py index 84682d2..da8c01f 100644 --- a/src/fiber_package/event/enums.py +++ b/src/fiber_package/event/enums.py @@ -5,6 +5,5 @@ The category is only used to place the communication correctly in the weekly mailing and the board-website, it is not visible (or relevant) to readers ''' class CommunicationCategory(StrEnum): - announcement = "announcement" news = "news" activity = "activity" diff --git a/src/fiber_package/event/submodels.py b/src/fiber_package/event/submodels.py index ffc6f30..4afbd79 100644 --- a/src/fiber_package/event/submodels.py +++ b/src/fiber_package/event/submodels.py @@ -12,3 +12,30 @@ class ActivityPaymentInfo(BaseModel): ] = None +class TimedOccurrence(BaseModel): + kind: Literal["timed"] = "timed" + + start: datetime + end: datetime + + @model_validator(mode="after") + def validate_interval(self): + if self.end <= self.start: + raise ValueError("End must be after start") + return self + + +class AllDayOccurrence(BaseModel): + kind: Literal["all_day"] = "all_day" + + start_date: date + end_date: date # Exclusive! + + @model_validator(mode="after") + def validate_interval(self): + if self.end_date <= self.start_date: + raise ValueError("End date must be after start date") + return self + + +Occurrence = TimedOccurrence | AllDayOccurrence \ No newline at end of file