updated guild

This commit is contained in:
Tiago Scholten 2026-09-12 20:49:59 +02:00
parent 3ca01ede8f
commit f9fd4db33c
11 changed files with 27 additions and 21 deletions

View File

@ -1,4 +1,6 @@
set -o pipefail #! /bin/bash
set -euo pipefail
uv run mypy src/ uv run mypy src/
uv run ruff check "$@" uv run ruff check "$@"

View File

@ -19,7 +19,7 @@ dev = [
] ]
[tool.mypy] [tool.mypy]
disable_error_code = ["import-untyped"] disable_error_code = ["import-untyped", "prop-decorator"]
[tool.ruff.lint] [tool.ruff.lint]
select = [ select = [

View File

@ -24,4 +24,4 @@ ListCommitteesResponse = list[BaseModel]
class ListCommitteeEditionsRequest(BaseModel): class ListCommitteeEditionsRequest(BaseModel):
committee: UUID7 committee: UUID7
ListCommitteeEditionsResponse = list[BaseModel] ListCommitteeEditionsResponse = list[BaseModel]

View File

@ -6,4 +6,4 @@ from .refs import CollectionName
class FiberBaseModel(BaseModel): class FiberBaseModel(BaseModel):
uuid: UUID7 uuid: UUID7
collection_name: CollectionName collection_name: CollectionName
last_change: datetime = Field(default_factory=lambda: datetime.now()) last_change: datetime = Field(default_factory=datetime.now)

View File

@ -3,8 +3,7 @@ from pydantic import model_validator, UUID7, computed_field
from fiber_package.refs import ( from fiber_package.refs import (
CommitteeEditionRef, CommitteeEditionRef,
CommitteeEditionRefList, CommitteeEditionRefList,
EntityRefList, EntityRefList
AssociationRef
) )
from fiber_package.base import FiberBaseModel from fiber_package.base import FiberBaseModel
@ -22,15 +21,13 @@ An edition is a definite group of members with functions and a timespan.
class CommitteeModel(FiberBaseModel): class CommitteeModel(FiberBaseModel):
collection_name: Literal["committee"] = "committee" collection_name: Literal["committee"] = "committee"
association_tag: str
short_name: str short_name: str
full_name_en: str full_name_en: str
full_name_nl: str full_name_nl: str
description_en: str = "" description_en: str = ""
description_nl: str = "" description_nl: str = ""
association_tag: str
committee_type: CommitteeType committee_type: CommitteeType
active: bool = True active: bool = True
ldap_id: int | None = None ldap_id: int | None = None

View File

@ -1,8 +1,6 @@
from pydantic import Field
from .person import PersonModel from .person import PersonModel
from .submodels import Address, LoginInfo from .submodels import Address, LoginInfo
from .enums import Study
# An associate is someone who frequents activities & receives weekly mailing # An associate is someone who frequents activities & receives weekly mailing
# However this person is not a full member, so no GMM rights # However this person is not a full member, so no GMM rights

View File

@ -15,4 +15,4 @@ class Study(StrEnum):
bsc_dsai = "Bachelor Data Science & AI" bsc_dsai = "Bachelor Data Science & AI"
msc_math = "Master Mathematics" msc_math = "Master Mathematics"
msc_phys = "Master Physics" msc_phys = "Master Physics"
min_dsai = "Minor Data Science & AI" min_dsai = "Minor Data Science & AI"

View File

@ -1,7 +1,6 @@
from pydantic import Field from pydantic import Field
from .associate import AssociateModel from .associate import AssociateModel
from .submodels import Address, LoginInfo
from .enums import Study from .enums import Study
class MemberModel(AssociateModel): class MemberModel(AssociateModel):

View File

@ -27,7 +27,7 @@ class PersonModel(FiberBaseModel):
date_of_birth: date | None = None date_of_birth: date | None = None
@computed_field @computed_field # type: ignore[prop-decorator]
@property @property
def underage(self) -> bool: def underage(self) -> bool:
if self.date_of_birth is None: if self.date_of_birth is None:
@ -50,5 +50,5 @@ class PersonModel(FiberBaseModel):
# Needed for dates, as pymongo cannot handle them # Needed for dates, as pymongo cannot handle them
@field_serializer("date_of_birth", when_used="always") @field_serializer("date_of_birth", when_used="always")
def serialize_date(self, value: date | None): def serialize_date(self, value: date | None) -> str | None:
return value.isoformat() if value else None return value.isoformat() if value else None

View File

@ -1,5 +1,5 @@
from pydantic import model_validator from pydantic import model_validator, Field, UUID7
from fiber_package.refs import EntityRefList, EntityRef from fiber_package.refs import EntityRefList
from datetime import date from datetime import date
@ -18,17 +18,20 @@ Removing old members from last_active is done in fiber
class GuildModel(FiberBaseModel): class GuildModel(FiberBaseModel):
collection_name: Literal["guild"] = "guild" collection_name: Literal["guild"] = "guild"
short_name: str
full_name_en: str full_name_en: str
full_name_nl: str full_name_nl: str
description_en: str description_en: str
description_nl: str description_nl: str
association_tag: str
ldap_id: int | None = None
members: EntityRefList members: EntityRefList
previous_members: EntityRefList previous_members: EntityRefList
guild_masters: list[UUID7]
guild_masters: EntityRefList last_active: dict[UUID7, date] = Field(default_factory=dict)
last_active: dict[EntityRef, date]
@model_validator(mode='after') @model_validator(mode='after')
def current_members_not_previous(self) -> Self: def current_members_not_previous(self) -> Self:
@ -45,3 +48,10 @@ class GuildModel(FiberBaseModel):
if master not in self.members: if master not in self.members:
raise ValueError("All guild masters must be members!") raise ValueError("All guild masters must be members!")
return self 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

View File

@ -8,7 +8,7 @@ class Membership(StrEnum):
member = "member" member = "member"
associate = "associate" associate = "associate"
alumn = "alumn" alumn = "alumn"
# extern is linked to association A if they ever visisted an activity of association A # extern is linked to association if they visited one of their activities
extern = "extern" extern = "extern"
def validate_visibility_tag(v: str) -> str: def validate_visibility_tag(v: str) -> str: