added committees and guilds
This commit is contained in:
parent
649f10be3f
commit
1e1676952d
@ -1,4 +1,4 @@
|
||||
from typing import Annotated
|
||||
from typing import Literal
|
||||
from pydantic import Field
|
||||
|
||||
from .non_members import FormerMemberModel
|
||||
@ -7,7 +7,7 @@ from .submodels import Address, LoginInfo
|
||||
|
||||
class MemberModel(FormerMemberModel):
|
||||
# requires that Membership equals member
|
||||
membership: Annotated[Membership, Field(pattern="member")]
|
||||
membership: Literal[Membership.member] = Membership.member
|
||||
|
||||
login: LoginInfo
|
||||
address: Address
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from typing import Annotated
|
||||
from typing import Literal
|
||||
from pydantic import Field
|
||||
|
||||
from .person import PersonModel
|
||||
@ -13,12 +13,12 @@ class FormerMemberModel(PersonModel):
|
||||
# company emails?
|
||||
|
||||
class AlumnModel(FormerMemberModel):
|
||||
membership: Annotated[Membership, Field(pattern="alumn")]
|
||||
membership: Literal[Membership.alumn] = Membership.alumn
|
||||
|
||||
graduated: bool = False
|
||||
receive_spam_mail: bool = True
|
||||
|
||||
class ExternalModel(PersonModel):
|
||||
membership: Annotated[Membership, Field(pattern="extern")]
|
||||
membership: Literal[Membership.extern] = Membership.extern
|
||||
# TODO... payment???
|
||||
# TODO require login info??
|
||||
|
||||
@ -4,9 +4,9 @@ from fiber_package.util import EntityList
|
||||
|
||||
class AssociationModel(BaseModel):
|
||||
full_name: str
|
||||
members: EntityList = EntityList("member", [])
|
||||
# committees: GroupList("commmittee", 0) # type: ignore
|
||||
# events: GroupList("event", 0) # type: ignore
|
||||
# activities: GroupList("activity", 0) # type: ignore
|
||||
# mailings: GroupList("mailing", 0) # type: ignore
|
||||
# mailalias: GroupList("mailalias", 0) # type: ignore
|
||||
members: EntityList
|
||||
committees: GroupList
|
||||
guilds: GroupList
|
||||
# events: GroupList
|
||||
# activities: GroupList
|
||||
# mailings: GroupList
|
||||
@ -1,10 +1,15 @@
|
||||
from pydantic import BaseModel
|
||||
from pydantic import BaseModel, model_validator
|
||||
from fiber_package.util import EntityList, GroupList, GroupRef
|
||||
|
||||
from typing import Self
|
||||
from datetime import date
|
||||
|
||||
from .enums import CommitteeType
|
||||
|
||||
'''
|
||||
A committee represents any group of members
|
||||
Committees are groups of members for a definite period.
|
||||
Every committee has a list of editions.
|
||||
An edition is a definite group of members with functions and a timespan.
|
||||
'''
|
||||
|
||||
class CommitteeModel(BaseModel):
|
||||
@ -15,8 +20,8 @@ class CommitteeModel(BaseModel):
|
||||
|
||||
active: bool = True
|
||||
|
||||
editions: GroupList("committee_edition", [])
|
||||
current_edition: GroupRef("committee_edition", None)
|
||||
editions: GroupList
|
||||
current_edition: GroupRef
|
||||
|
||||
@model_validator(mode='after')
|
||||
def current_edition_in_editions(self) -> Self:
|
||||
@ -28,9 +33,12 @@ class CommitteeModel(BaseModel):
|
||||
return self
|
||||
|
||||
class CommitteeEditionModel(BaseModel):
|
||||
members: EntityList = EntityList("member", [])
|
||||
members: EntityList
|
||||
functions: dict[UUID4, str]
|
||||
|
||||
start_date: date
|
||||
end_date: date | None # None means ongoing
|
||||
|
||||
@model_validator(mode='after')
|
||||
def functions_to_members_only(self) -> Self:
|
||||
for uuid in self.functions.keys():
|
||||
|
||||
@ -2,8 +2,7 @@ from enum import StrEnum
|
||||
|
||||
class CommitteeType(StrEnum):
|
||||
board_committee: "Board committee"
|
||||
GMM_committee: "GMM committee"
|
||||
guild: "Guild"
|
||||
subassociation_board: "Subassociation board"
|
||||
gmm_committee: "GMM committee"
|
||||
board: "board"
|
||||
|
||||
|
||||
|
||||
42
src/fiber_package/groups/committees/guild.py
Normal file
42
src/fiber_package/groups/committees/guild.py
Normal file
@ -0,0 +1,42 @@
|
||||
from pydantic import BaseModel, model_validator
|
||||
from fiber_package.util import EntityList
|
||||
|
||||
from datetime import date
|
||||
|
||||
from typing import Self
|
||||
|
||||
|
||||
'''
|
||||
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(BaseModel):
|
||||
full_name_EN: str
|
||||
full_name_NL: str
|
||||
description_EN: str
|
||||
description_NL: str
|
||||
|
||||
members: EntityList
|
||||
previous_members: EntityList
|
||||
|
||||
guild_masters: EntityList
|
||||
|
||||
last_active: dict[EntityRef, date]
|
||||
|
||||
@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
|
||||
|
||||
@ -2,5 +2,5 @@ from pydantic import BaseModel
|
||||
from fiber_package.util import GroupList, EntityList
|
||||
|
||||
class RootGroupModel(BaseModel):
|
||||
associations: GroupList = GroupList("association", [])
|
||||
sys_admins: EntityList = EntityList("login", [])
|
||||
associations: GroupList
|
||||
sys_admins: EntityList
|
||||
@ -2,22 +2,32 @@ from dataclasses import dataclass, field
|
||||
|
||||
from pydantic import UUID4
|
||||
|
||||
'''
|
||||
(Entity/Group)(List/Ref) represents a list / single instance of entities / groups.
|
||||
This is for fiber to know in which Mongo collection to look.
|
||||
|
||||
the __iter__ function allows us to do things as
|
||||
"for member in edition.members"
|
||||
'''
|
||||
|
||||
@dataclass(slots=True)
|
||||
class EntityList:
|
||||
template: str
|
||||
uuids: list[UUID4] = field(default_factory=list)
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.uuids)
|
||||
|
||||
@dataclass(slots=True)
|
||||
class GroupList:
|
||||
template: str
|
||||
uuids: list[UUID4] = field(default_factory=list)
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.uuids)
|
||||
|
||||
@dataclass(slots=True)
|
||||
class EntityRef:
|
||||
template: str
|
||||
uuids: UUID4 | None = None
|
||||
uuids: UUID4
|
||||
|
||||
@dataclass(slots=True)
|
||||
class GroupRef:
|
||||
template: str
|
||||
uuids: UUID4 | None = None
|
||||
uuids: UUID4
|
||||
Loading…
x
Reference in New Issue
Block a user