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 6a683ed..828515d 100644 --- a/src/fiber_package/entity/non_members.py +++ b/src/fiber_package/entity/non_members.py @@ -2,19 +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): +class AlumnModel(PersonModel): graduated: bool = False receive_spam_mail: bool = True class ExternalModel(PersonModel): 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 39e72a2..baf1c4d 100644 --- a/src/fiber_package/entity/person.py +++ b/src/fiber_package/entity/person.py @@ -3,23 +3,23 @@ from typing import Self, Literal from datetime import date 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: dict[str, Membership] = Field(default_factory=dict) - + memberships: list[MembershipTag] first_name: str - infix: str | None = None # mostly in Dutch names + infix_name: str | None = None # tussenvoegsel in Dutch names last_name: str full_name: str | None = None # first_name + infix + last_name email: EmailStr language: LanguageOption - # TODO: phone number address: Address | None = None + phone_number: str | None = None date_of_birth: date | None = None @@ -39,8 +39,13 @@ class PersonModel(FiberBaseModel): @model_validator(mode="after") def generate_full_name(self) -> Self: full_name = self.first_name +<<<<<<< HEAD if self.infix: full_name += " " + self.infix +======= + if self.infix_name: + full_name += " " + self.infix_name +>>>>>>> tiago/db_structure 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