Implement associations

This commit is contained in:
Sebastiaan
2025-06-10 20:23:50 +02:00
parent 2cec60cce3
commit 13a1b4dd1e
9 changed files with 410 additions and 1 deletions

View File

@@ -0,0 +1,74 @@
from typing import TYPE_CHECKING
from sqlmodel import (
Session,
)
from . import mixin
from .base import (
BaseSQLModel,
)
# region # Association #########################################################
class AssociationBase(
mixin.Name,
mixin.Contact,
mixin.ScoutingId,
BaseSQLModel,
):
pass
# Properties to receive via API on creation
class AssociationCreate(AssociationBase):
pass
# Properties to receive via API on update, all are optional
class AssociationUpdate(AssociationBase):
pass
class Association(mixin.RowId, AssociationBase, table=True):
# --- database only items --------------------------------------------------
# --- read only items ------------------------------------------------------
# --- back_populates links -------------------------------------------------
# --- CRUD actions ---------------------------------------------------------
@classmethod
def create(cls, *, session: Session, create_obj: AssociationCreate) -> "Association":
data_obj = create_obj.model_dump(exclude_unset=True)
db_obj = cls.model_validate(data_obj)
session.add(db_obj)
session.commit()
session.refresh(db_obj)
return db_obj
@classmethod
def update(
cls, *, session: Session, db_obj: "Association", in_obj: AssociationUpdate
) -> "Association":
data_obj = in_obj.model_dump(exclude_unset=True)
db_obj.sqlmodel_update(data_obj)
session.add(db_obj)
session.commit()
session.refresh(db_obj)
return db_obj
# Properties to return via API, id is always required
class AssociationPublic(mixin.RowIdPublic, AssociationBase):
pass
class AssociationsPublic(BaseSQLModel):
data: list[AssociationPublic]
count: int
# endregion

View File

@@ -56,6 +56,7 @@ class ApiTags(DocumentedStrEnum):
EVENTS = "Events"
TEAMS = "Teams"
ASSOCIATIONS = "Associations"
# endregion

View File

@@ -54,7 +54,7 @@ class EmailUpdate(Email):
class ScoutingId(BaseModel):
scouting_id: str | None = Field(default=None, max_length=32)
scouting_id: str | None = Field(default=None, max_length=32, description="Association registration number")
class Password(BaseModel):

View File

@@ -27,6 +27,7 @@ class PermissionModule(DocumentedStrEnum):
USER = auto_enum()
EVENT = auto_enum()
TEAM = auto_enum()
ASSOCIATION = auto_enum()
class PermissionPart(DocumentedStrEnum):