migrated models from fiber
This commit is contained in:
parent
ec9624c054
commit
50e08860e2
@ -11,3 +11,8 @@ dependencies = [
|
|||||||
[build-system]
|
[build-system]
|
||||||
requires = ["uv_build>=0.10.2,<0.11.0"]
|
requires = ["uv_build>=0.10.2,<0.11.0"]
|
||||||
build-backend = "uv_build"
|
build-backend = "uv_build"
|
||||||
|
|
||||||
|
[dependency-groups]
|
||||||
|
dev = [
|
||||||
|
"ruff>=0.15.1",
|
||||||
|
]
|
||||||
|
|||||||
@ -1 +1,7 @@
|
|||||||
from .test import *
|
from .person import PersonModel as PersonModel
|
||||||
|
from .non_members import (
|
||||||
|
FormerMemberModel as FormerMemberModel,
|
||||||
|
AlumnModel as AlumnModel,
|
||||||
|
ExternalModel as ExternalModel
|
||||||
|
)
|
||||||
|
from .member import MemberModel as MemberModel
|
||||||
|
|||||||
27
src/fiber_package/entities/enums.py
Normal file
27
src/fiber_package/entities/enums.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
from enum import StrEnum
|
||||||
|
|
||||||
|
class Membership(StrEnum):
|
||||||
|
member = "member"
|
||||||
|
alumn = "alumn"
|
||||||
|
extern = "extern"
|
||||||
|
|
||||||
|
class LanguageOption(StrEnum):
|
||||||
|
nl = "NL"
|
||||||
|
en = "EN"
|
||||||
|
|
||||||
|
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"
|
||||||
25
src/fiber_package/entities/member.py
Normal file
25
src/fiber_package/entities/member.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from typing import Annotated
|
||||||
|
from pydantic import Field
|
||||||
|
|
||||||
|
from .non_members import FormerMemberModel
|
||||||
|
from .enum import Membership, OnlineAlmanacField
|
||||||
|
from .submodels import Address, LoginInfo
|
||||||
|
|
||||||
|
class MemberModel(FormerMemberModel):
|
||||||
|
membership: Annotated[Membership, Field(pattern="member")]
|
||||||
|
|
||||||
|
login: LoginInfo
|
||||||
|
address: Address
|
||||||
|
contribution_paid: bool = False
|
||||||
|
active_member: bool = False
|
||||||
|
studying: bool = False
|
||||||
|
|
||||||
|
# preferences
|
||||||
|
receive_company_mail: bool = True
|
||||||
|
receive_spam_mail: bool = True
|
||||||
|
in_physical_almanac: bool = False
|
||||||
|
in_online_almanac: bool = True
|
||||||
|
online_almanac_fields: list[OnlineAlmanacField] = Field(default_factory=list)
|
||||||
|
# IT stuff
|
||||||
|
shell: str = "/bin/bash" # TODO: support other shells?
|
||||||
|
mail_token: str | None = None
|
||||||
24
src/fiber_package/entities/non_members.py
Normal file
24
src/fiber_package/entities/non_members.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
from typing import Annotated
|
||||||
|
from pydantic import Field
|
||||||
|
|
||||||
|
from .person import PersonModel
|
||||||
|
from .enum import HonoraryStatus, Membership, 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: Annotated[Membership, Field(pattern="alumn")]
|
||||||
|
|
||||||
|
graduated: bool = False
|
||||||
|
receive_spam_mail: bool = True
|
||||||
|
|
||||||
|
class ExternalModel(PersonModel):
|
||||||
|
membership: Annotated[Membership, Field(pattern="extern")]
|
||||||
|
# TODO... payment???
|
||||||
|
# TODO require login info??
|
||||||
27
src/fiber_package/entities/person.py
Normal file
27
src/fiber_package/entities/person.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
from pydantic import BaseModel, model_validator, EmailStr
|
||||||
|
from typing import Self
|
||||||
|
|
||||||
|
from .enum import Membership, LanguageOption
|
||||||
|
from .submodels import Address
|
||||||
|
|
||||||
|
class PersonModel(BaseModel):
|
||||||
|
membership: Membership
|
||||||
|
first_name: str
|
||||||
|
tussenvoegsels: str | None = None # only in Dutch names
|
||||||
|
last_name: str
|
||||||
|
full_name: str # first_name + tussenvoegsels + last_name
|
||||||
|
email: EmailStr
|
||||||
|
language: LanguageOption
|
||||||
|
|
||||||
|
# TODO: phone number
|
||||||
|
address: Address | None = None
|
||||||
|
|
||||||
|
@model_validator(mode="after")
|
||||||
|
def generate_full_name(self) -> Self:
|
||||||
|
full_name = self.first_name
|
||||||
|
if self.tussenvoegsels:
|
||||||
|
full_name += " " + self.tussenvoegsels
|
||||||
|
full_name += " " + self.last_name
|
||||||
|
self.full_name = full_name
|
||||||
|
return self
|
||||||
|
|
||||||
28
src/fiber_package/entities/submodels.py
Normal file
28
src/fiber_package/entities/submodels.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
from dataclass import dataclass, field
|
||||||
|
from datetime import date
|
||||||
|
|
||||||
|
# always use @dataclass with slots=True for better performance
|
||||||
|
|
||||||
|
@dataclass(slots=True)
|
||||||
|
class LoginInfo:
|
||||||
|
username: str
|
||||||
|
hashed_password: str
|
||||||
|
refresh_tokens: list[str] = field(default_factory=list)
|
||||||
|
disabled: bool = False
|
||||||
|
|
||||||
|
@dataclass(slots=True)
|
||||||
|
class Address:
|
||||||
|
street: str
|
||||||
|
house_number: str
|
||||||
|
postal_code: str
|
||||||
|
city: str
|
||||||
|
country: str | None
|
||||||
|
|
||||||
|
@dataclass(slots=True)
|
||||||
|
class PublicKey:
|
||||||
|
bits: int
|
||||||
|
fingerprint: str
|
||||||
|
name: str
|
||||||
|
key_type: str
|
||||||
|
key: str
|
||||||
|
expires: date
|
||||||
@ -1,4 +0,0 @@
|
|||||||
from pydantic import BaseModel
|
|
||||||
|
|
||||||
class Test(BaseModel):
|
|
||||||
bruh: str
|
|
||||||
33
uv.lock
generated
33
uv.lock
generated
@ -19,9 +19,17 @@ dependencies = [
|
|||||||
{ name = "pydantic" },
|
{ name = "pydantic" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[package.dev-dependencies]
|
||||||
|
dev = [
|
||||||
|
{ name = "ruff" },
|
||||||
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
requires-dist = [{ name = "pydantic", specifier = ">=2.12.5" }]
|
requires-dist = [{ name = "pydantic", specifier = ">=2.12.5" }]
|
||||||
|
|
||||||
|
[package.metadata.requires-dev]
|
||||||
|
dev = [{ name = "ruff", specifier = ">=0.15.1" }]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pydantic"
|
name = "pydantic"
|
||||||
version = "2.12.5"
|
version = "2.12.5"
|
||||||
@ -76,6 +84,31 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" },
|
{ url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ruff"
|
||||||
|
version = "0.15.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855, upload-time = "2026-02-12T23:09:09.998Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819, upload-time = "2026-02-12T23:09:03.598Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618, upload-time = "2026-02-12T23:09:22.928Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518, upload-time = "2026-02-12T23:08:58.339Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811, upload-time = "2026-02-12T23:09:31.865Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169, upload-time = "2026-02-12T23:09:17.306Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491, upload-time = "2026-02-12T23:09:25.503Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280, upload-time = "2026-02-12T23:09:19.88Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336, upload-time = "2026-02-12T23:09:14.907Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288, upload-time = "2026-02-12T23:09:07.475Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681, upload-time = "2026-02-12T23:08:55.43Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401, upload-time = "2026-02-12T23:09:27.927Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452, upload-time = "2026-02-12T23:09:12.147Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900, upload-time = "2026-02-12T23:09:34.418Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302, upload-time = "2026-02-12T23:09:36.536Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555, upload-time = "2026-02-12T23:09:29.899Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956, upload-time = "2026-02-12T23:09:01.157Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typing-extensions"
|
name = "typing-extensions"
|
||||||
version = "4.15.0"
|
version = "4.15.0"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user