Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions api_schemas/tool_booking_schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from typing import Annotated
from api_schemas.tool_schema import SimpleToolRead
from api_schemas.user_schemas import SimpleUserRead
from helpers.types import datetime_utc
from pydantic import StringConstraints
from api_schemas.base_schema import BaseSchema
from helpers.constants import MAX_TOOL_BOOKING_DESC


class ToolBookingCreate(BaseSchema):
tool_id: int
amount: int
start_time: datetime_utc
end_time: datetime_utc
description: Annotated[str, StringConstraints(max_length=MAX_TOOL_BOOKING_DESC)]


class ToolBookingRead(BaseSchema):
id: int
tool: SimpleToolRead
user: SimpleUserRead
start_time: datetime_utc
end_time: datetime_utc
description: str

class SimpleToolBookingRead(BaseSchema):
id: int
tool: SimpleToolRead
start_time: datetime_utc
end_time: datetime_utc
description: str


class ToolBookingUpdate(BaseSchema):
amount: int | None = None
start_time: datetime_utc | None = None
end_time: datetime_utc | None = None
description: Annotated[str, StringConstraints(max_length=MAX_TOOL_BOOKING_DESC)] | None = None
35 changes: 35 additions & 0 deletions api_schemas/tool_schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from api_schemas.base_schema import BaseSchema
from typing import Annotated
from pydantic import StringConstraints

from helpers.constants import MAX_TOOL_DESC


class ToolCreate(BaseSchema):
name_sv: str
name_en: str
amount: int
description_sv: Annotated[str, StringConstraints(max_length=MAX_TOOL_DESC)] | None = None
description_en: Annotated[str, StringConstraints(max_length=MAX_TOOL_DESC)] | None = None


class ToolRead(BaseSchema):
id: int
name_sv: str
name_en: str
amount: int
description_sv: str | None
description_en: str | None


class ToolUpdate(BaseSchema):
name_sv: str
name_en: str
amount: int
description_sv: Annotated[str, StringConstraints(max_length=MAX_TOOL_DESC)] | None = None
description_en: Annotated[str, StringConstraints(max_length=MAX_TOOL_DESC)] | None = None


class SimpleToolRead(BaseSchema):
id: int
amount: int
31 changes: 31 additions & 0 deletions db_models/tool_booking_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from helpers.constants import MAX_TOOL_BOOKING_DESC
from .base_model import BaseModel_DB
from sqlalchemy.orm import mapped_column, Mapped, relationship
from typing import TYPE_CHECKING, Optional
from sqlalchemy import ForeignKey, String
from helpers.types import datetime_utc

if TYPE_CHECKING:
from .user_model import User_DB
from .tool_model import Tool_DB


class ToolBooking_DB(BaseModel_DB):
__tablename__ = "tool_booking_table"

id: Mapped[int] = mapped_column(primary_key=True, init=False)

amount: Mapped[int] = mapped_column()

start_time: Mapped[datetime_utc] = mapped_column()
end_time: Mapped[datetime_utc] = mapped_column()

tool_id: Mapped[int] = mapped_column(ForeignKey("tool_table.id"))
tool: Mapped["Tool_DB"] = relationship(back_populates="bookings", init=False)

user_id: Mapped[Optional[int]] = mapped_column(ForeignKey("user_table.id"))
user: Mapped[Optional["User_DB"]] = relationship(back_populates="tool_bookings", init=False)

description: Mapped[Optional[str]] = mapped_column(String(MAX_TOOL_BOOKING_DESC), default=None)

pass
29 changes: 29 additions & 0 deletions db_models/tool_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from helpers.constants import MAX_TOOL_NAME, MAX_TOOL_DESC
from .base_model import BaseModel_DB
from .tool_booking_model import ToolBooking_DB
from sqlalchemy.orm import mapped_column, Mapped, relationship
from typing import TYPE_CHECKING, Optional
from sqlalchemy import String, Integer

if TYPE_CHECKING:
from .tool_booking_model import ToolBooking_DB


class Tool_DB(BaseModel_DB):
__tablename__ = "tool_table"

id: Mapped[int] = mapped_column(primary_key=True, init=False)

name_sv: Mapped[str] = mapped_column(String(MAX_TOOL_NAME))
name_en: Mapped[str] = mapped_column(String(MAX_TOOL_NAME))

amount: Mapped[int] = mapped_column(Integer)

bookings: Mapped[list["ToolBooking_DB"]] = relationship(
back_populates="tool", cascade="all, delete-orphan", init=False
)

description_sv: Mapped[Optional[str]] = mapped_column(String(MAX_TOOL_DESC), default=None)
description_en: Mapped[Optional[str]] = mapped_column(String(MAX_TOOL_DESC), default=None)

pass
6 changes: 6 additions & 0 deletions db_models/user_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from helpers.types import datetime_utc
from .ad_model import BookAd_DB
from .car_booking_model import CarBooking_DB
from .tool_booking_model import ToolBooking_DB
from helpers.types import datetime_utc

if TYPE_CHECKING:
Expand All @@ -29,6 +30,7 @@
from .news_model import News_DB
from .ad_model import BookAd_DB
from .cafe_shift_model import CafeShift_DB
from .tool_booking_model import ToolBooking_DB


# called by SQLAlchemy when user.posts.append(some_post)
Expand Down Expand Up @@ -91,6 +93,10 @@ class User_DB(BaseModel_DB, SQLAlchemyBaseUserTable[int]):

cafe_shifts: Mapped[list["CafeShift_DB"]] = relationship(back_populates="user", init=False)

tool_bookings: Mapped[list["ToolBooking_DB"]] = relationship(
back_populates="user", cascade="all, delete-orphan", passive_deletes=True, init=False
)

accesses: Mapped[list["UserDoorAccess_DB"]] = relationship(
back_populates="user", cascade="all, delete-orphan", init=False
)
Expand Down
4 changes: 4 additions & 0 deletions helpers/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@
MAX_GUILD_MEETING_DESC = 10000
MAX_GUILD_MEETING_TITLE = 200

# Tool booking
MAX_TOOL_NAME = 100
MAX_TOOL_DESC = 1000
MAX_TOOL_BOOKING_DESC = 1000

# Keyval, used for example for storing the links to different very important documents (e.g. reglementet)
MAX_KEYVAL_KEY = 100
Expand Down
2 changes: 2 additions & 0 deletions helpers/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ def force_utc(date: datetime):
"EncloseMoose",
"MailAlias",
"GuildMeeting",
"Tools",
"ToolBookings",
"Keyvals",
]

Expand Down
5 changes: 5 additions & 0 deletions routes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
from .sub_election_router import sub_election_router
from .nomination_router import nomination_router
from .guild_meeting_router import guild_meeting_router
from .tool_router import tool_router
from .tool_booking_router import tool_booking_router
from .keyval_router import keyval_router
from .prereg_member_router import prereg_member_router

Expand Down Expand Up @@ -100,6 +102,9 @@

main_router.include_router(guild_meeting_router, prefix="/guild-meeting", tags=["guild meeting"])

main_router.include_router(tool_router, prefix="/tools", tags=["tools"])

main_router.include_router(tool_booking_router, prefix="/tool-booking", tags=["tool booking"])
main_router.include_router(keyval_router, prefix="/keyvals", tags=["keyvals"])

main_router.include_router(prereg_member_router, prefix="/prereg-members", tags=["prereg members"])
Loading
Loading