mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-10 20:09:25 +00:00
reservable rooms API
This commit is contained in:
63
reservation/api.py
Normal file
63
reservation/api.py
Normal file
@ -0,0 +1,63 @@
|
||||
from datetime import timedelta
|
||||
from typing import Any, Literal
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
from ninja import Query
|
||||
from ninja_extra import ControllerBase, api_controller, paginate, route
|
||||
from ninja_extra.pagination import PageNumberPaginationExtra
|
||||
from ninja_extra.schemas import PaginatedResponseSchema
|
||||
from pydantic import FutureDatetime
|
||||
|
||||
from api.permissions import HasPerm
|
||||
from reservation.models import ReservationSlot, Room
|
||||
from reservation.schemas import (
|
||||
RoomFilterSchema,
|
||||
RoomSchema,
|
||||
SlotFilterSchema,
|
||||
SlotSchema,
|
||||
)
|
||||
|
||||
|
||||
@api_controller("/reservation/room")
|
||||
class ReservableRoomController(ControllerBase):
|
||||
@route.get(
|
||||
"",
|
||||
response=list[RoomSchema],
|
||||
permissions=[HasPerm("reservation.viem_room")],
|
||||
url_name="fetch_reservable_rooms",
|
||||
)
|
||||
def fetch_rooms(self, filters: Query[RoomFilterSchema]):
|
||||
return filters.filter(Room.objects.select_related("club"))
|
||||
|
||||
|
||||
@api_controller("/reservation/slot")
|
||||
class ReservationSlotController(ControllerBase):
|
||||
@route.get(
|
||||
"",
|
||||
response=PaginatedResponseSchema[SlotSchema],
|
||||
permissions=[HasPerm("reservation.view_reservationslot")],
|
||||
)
|
||||
@paginate(PageNumberPaginationExtra)
|
||||
def fetch_slots(self, filters: Query[SlotFilterSchema]):
|
||||
return filters.filter(
|
||||
ReservationSlot.objects.select_related("author").order_by("start_at")
|
||||
)
|
||||
|
||||
@route.patch(
|
||||
"/reservation/slot/{int:slot_id}",
|
||||
permissions=[HasPerm("reservation.change_reservationslot")],
|
||||
response={
|
||||
200: None,
|
||||
409: dict[Literal["detail"], dict[str, list[str]]],
|
||||
422: dict[Literal["detail"], list[dict[str, Any]]],
|
||||
},
|
||||
)
|
||||
def update_slot(self, start: FutureDatetime, duration: timedelta, slot_id: int):
|
||||
slot = self.get_object_or_exception(ReservationSlot, id=slot_id)
|
||||
slot.start_at = start
|
||||
slot.end_at = start + duration
|
||||
try:
|
||||
slot.full_clean()
|
||||
slot.save()
|
||||
except ValidationError as e:
|
||||
return self.create_response({"detail": dict(e)}, status_code=409)
|
Reference in New Issue
Block a user