diff --git a/src/fiber_package/association.py b/src/fiber_package/association.py new file mode 100644 index 0000000..1948d2b --- /dev/null +++ b/src/fiber_package/association.py @@ -0,0 +1,11 @@ +from fiber_package.base import FiberBaseModel +from fiber_package.refs import EntityRefList, CommitteeRefList, GuildRefList +from enum import StrEnum + + +class AssociationModel(FiberBaseModel): + full_name: str + # short name used for visibility strings (think: DLF, Kaiser, CNB, etc...) + tag: str + + diff --git a/src/fiber_package/entity/enums.py b/src/fiber_package/entity/enums.py index ba27d87..6d09ef5 100644 --- a/src/fiber_package/entity/enums.py +++ b/src/fiber_package/entity/enums.py @@ -2,8 +2,8 @@ from enum import StrEnum class Membership(StrEnum): member = "member" + activity_goer = "activity_goer" alumn = "alumn" - extern = "extern" class LanguageOption(StrEnum): nl = "NL" @@ -12,16 +12,4 @@ class LanguageOption(StrEnum): class Gender(StrEnum): male = "m" female = "f" - nonbinary = "n" - -class HonoraryStatus(StrEnum): - merit = "merit" - honorary = "honorary" - -class OnlineAlmanacField(StrEnum): - address = "address" - birth_date = "birth_date" - email = "email" - phone_number = "phone_number" - study = "study" - gender = "gender" + nonbinary = "n" \ No newline at end of file diff --git a/src/fiber_package/entity/non_members.py b/src/fiber_package/entity/non_members.py index d3a53ab..828515d 100644 --- a/src/fiber_package/entity/non_members.py +++ b/src/fiber_package/entity/non_members.py @@ -2,22 +2,10 @@ from .person import PersonModel from .enums import HonoraryStatus, Gender -class FormerMemberModel(PersonModel): - title: str | None = None - gender: Gender | None = None - honorary_status: HonoraryStatus | None = None - # TODO: picture, study_start (year, month?), study_end - - # company emails? - -class AlumnModel(FormerMemberModel): - # membership: Literal[Membership.alumn] = Membership.alumn - +class AlumnModel(PersonModel): graduated: bool = False receive_spam_mail: bool = True class ExternalModel(PersonModel): - # membership: Literal[Membership.extern] = Membership.extern pass - # TODO... payment??? - # TODO require login info?? + \ No newline at end of file diff --git a/src/fiber_package/entity/person.py b/src/fiber_package/entity/person.py index d8f4a2c..8c9d4b0 100644 --- a/src/fiber_package/entity/person.py +++ b/src/fiber_package/entity/person.py @@ -2,28 +2,29 @@ from pydantic import model_validator, EmailStr from typing import Self, Literal from fiber_package.base import FiberBaseModel -from .enums import Membership, LanguageOption +from fiber_package.membership_tag import MembershipTag +from .enums import LanguageOption from .submodels import Address class PersonModel(FiberBaseModel): collection_name: Literal["entity"] = "entity" - membership: Membership + memberships: list[MembershipTag] first_name: str - tussenvoegsels: str | None = None # only in Dutch names + infix_name: str | None = None # tussenvoegsel in Dutch names last_name: str full_name: str | None = None # first_name + tussenvoegsels + last_name email: EmailStr language: LanguageOption - # TODO: phone number address: Address | None = None + phone_number: str | None = None @model_validator(mode="after") def generate_full_name(self) -> Self: full_name = self.first_name - if self.tussenvoegsels: - full_name += " " + self.tussenvoegsels + if self.infix_name: + full_name += " " + self.infix_name full_name += " " + self.last_name self.full_name = full_name return self diff --git a/src/fiber_package/membership_tag.py b/src/fiber_package/membership_tag.py new file mode 100644 index 0000000..9c50af7 --- /dev/null +++ b/src/fiber_package/membership_tag.py @@ -0,0 +1,19 @@ +from typing import Annotated +from pydantic import AfterValidator + +from entity.member import MembershipTag + +BARE_TAGS = ["public"] + +def validate_visibility_tag(v: str) -> str: + if v in BARE_TAGS: + return v + _, _, status = v.partition(":") + if status in MembershipType: + return v + raise ValueError(f"Invalid visibility tag: {v!r}") + +VisibilityTag = Annotated[str, AfterValidator(validate_visibility_tag)] + +def generate_tag(association_tag: str, membership_tag: MembershipTag): + return association_tag + ":" + membership_tag \ No newline at end of file diff --git a/src/fiber_package/refs.py b/src/fiber_package/refs.py index 3088c69..a8e77ea 100644 --- a/src/fiber_package/refs.py +++ b/src/fiber_package/refs.py @@ -26,8 +26,9 @@ class RefList[C: str]: def __contains__(self, item: UUID7) -> bool: return item in self.uuids -SystemRef = Ref[Literal["system"]] -SystemRefList = RefList[Literal["system"]] + +AssociationRef = Ref[Literal["association"]] +AssociationRefList = RefList[Literal["association"]] EntityRef = Ref[Literal["entity"]] EntityRefList = RefList[Literal["entity"]] diff --git a/src/fiber_package/system/root.py b/src/fiber_package/root.py similarity index 52% rename from src/fiber_package/system/root.py rename to src/fiber_package/root.py index 7b8bd6c..0225004 100644 --- a/src/fiber_package/system/root.py +++ b/src/fiber_package/root.py @@ -1,6 +1,6 @@ from fiber_package.base import FiberBaseModel -from fiber_package.refs import SystemRefList, EntityRefList +from fiber_package.refs import AssociationRefList, EntityRefList class RootGroupModel(FiberBaseModel): - associations: SystemRefList + associations: AssociationRefList sys_admins: EntityRefList diff --git a/src/fiber_package/system/association.py b/src/fiber_package/system/association.py deleted file mode 100644 index 857fcdf..0000000 --- a/src/fiber_package/system/association.py +++ /dev/null @@ -1,15 +0,0 @@ -from fiber_package.base import FiberBaseModel -from fiber_package.refs import EntityRefList, CommitteeRefList, GuildRefList - - -class AssociationModel(FiberBaseModel): - full_name: str - members: EntityRefList - committees: CommitteeRefList - guilds: GuildRefList - - - # TODO: also add former_members, alumns, etc... ? - # events: GroupList - # activities: GroupList - # mailings: GroupList