from pydantic import model_validator, Field, UUID7 from fiber_package.refs import EntityRefList from datetime import date from typing import Self, Literal from fiber_package.base import FiberBaseModel ''' Guilds are groups of members for an indefinite period. They have a list of members. Removing old members from last_active is done in fiber ''' class GuildModel(FiberBaseModel): collection_name: Literal["guild"] = "guild" short_name: str full_name_en: str full_name_nl: str description_en: str description_nl: str association_tag: str active: bool = True ldap_id: int | None = None members: EntityRefList = EntityRefList([], "entity") previous_members: EntityRefList = EntityRefList([], "entity") guild_masters: list[UUID7] = Field(default_factory=list) last_active: dict[UUID7, date] = Field(default_factory=dict) @model_validator(mode='after') def current_members_not_previous(self) -> Self: for member in self.members: if member in self.previous_members: raise ValueError( "There can be no overlap between members and previous members!" ) return self @model_validator(mode='after') def guild_masters_are_members(self) -> Self: for master in self.guild_masters: if master not in self.members: raise ValueError("All guild masters must be members!") return self @model_validator(mode='after') def guild_masters_always_active(self) -> Self: today = date.today() for uuid in self.guild_masters: self.last_active[uuid] = today return self