mirror of
https://github.com/ae-utbm/sith.git
synced 2025-05-04 16:44:07 +00:00
reservable rooms API
This commit is contained in:
parent
c896640923
commit
3ebd4b1a0b
37
reservation/api.py
Normal file
37
reservation/api.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
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 core.auth.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"))
|
37
reservation/schemas.py
Normal file
37
reservation/schemas.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from ninja import FilterSchema, ModelSchema
|
||||||
|
from pydantic import Field
|
||||||
|
|
||||||
|
from club.schemas import ClubSchema
|
||||||
|
from core.schemas import SimpleUserSchema
|
||||||
|
from reservation.models import ReservationSlot, Room
|
||||||
|
|
||||||
|
|
||||||
|
class RoomFilterSchema(FilterSchema):
|
||||||
|
club: set[int] | None = Field(None, q="club_id__in")
|
||||||
|
|
||||||
|
|
||||||
|
class RoomSchema(ModelSchema):
|
||||||
|
class Meta:
|
||||||
|
model = Room
|
||||||
|
fields = ["id", "name", "description", "address"]
|
||||||
|
|
||||||
|
club: ClubSchema
|
||||||
|
|
||||||
|
|
||||||
|
class SlotFilterSchema(FilterSchema):
|
||||||
|
after: datetime = Field(default=None, q="end_at__gt")
|
||||||
|
before: datetime = Field(default=None, q="start_at__lt")
|
||||||
|
room: set[int] | None = None
|
||||||
|
club: set[int] | None = None
|
||||||
|
|
||||||
|
|
||||||
|
class SlotSchema(ModelSchema):
|
||||||
|
class Meta:
|
||||||
|
model = ReservationSlot
|
||||||
|
fields = ["id", "room", "nb_people", "comment"]
|
||||||
|
|
||||||
|
start: datetime = Field(alias="start_at")
|
||||||
|
end: datetime = Field(alias="end_at")
|
||||||
|
author: SimpleUserSchema
|
@ -1 +0,0 @@
|
|||||||
# Create your tests here.
|
|
0
reservation/tests/__init__.py
Normal file
0
reservation/tests/__init__.py
Normal file
28
reservation/tests/test_room_api.py
Normal file
28
reservation/tests/test_room_api.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import pytest
|
||||||
|
from model_bakery import baker
|
||||||
|
from ninja_extra.testing import TestClient
|
||||||
|
from pytest_django.asserts import assertNumQueries
|
||||||
|
|
||||||
|
from reservation.api import ReservableRoomController
|
||||||
|
from reservation.models import Room
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
class TestFetchRoom:
|
||||||
|
def test_fetch_simple(self):
|
||||||
|
rooms = baker.make(Room, _quantity=3, _bulk_create=True)
|
||||||
|
response = TestClient(ReservableRoomController).get("")
|
||||||
|
assert response.json() == [
|
||||||
|
{
|
||||||
|
"id": room.id,
|
||||||
|
"name": room.name,
|
||||||
|
"description": room.description,
|
||||||
|
"address": room.address,
|
||||||
|
"club": {"id": room.club.id, "name": room.club.name},
|
||||||
|
}
|
||||||
|
for room in rooms
|
||||||
|
]
|
||||||
|
|
||||||
|
def test_nb_queries(self):
|
||||||
|
with assertNumQueries(1):
|
||||||
|
TestClient(ReservableRoomController).get("")
|
39
reservation/tests/test_slot_api.py
Normal file
39
reservation/tests/test_slot_api.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import pytest
|
||||||
|
from model_bakery import baker
|
||||||
|
from ninja_extra.testing import TestClient
|
||||||
|
from pytest_django.asserts import assertNumQueries
|
||||||
|
|
||||||
|
from reservation.api import ReservableRoomController, ReservationSlotController
|
||||||
|
from reservation.models import ReservationSlot
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
class TestFetchRoom:
|
||||||
|
def test_fetch_simple(self):
|
||||||
|
slots = baker.make(ReservationSlot, _quantity=5, _bulk_create=True)
|
||||||
|
response = TestClient(ReservationSlotController).get("")
|
||||||
|
assert response.json() == [
|
||||||
|
{
|
||||||
|
"id": slot.id,
|
||||||
|
"room": slot.room_id,
|
||||||
|
"comment": slot.comment,
|
||||||
|
"nb_people": slot.nb_people,
|
||||||
|
"start": slot.start_at.isoformat(timespec="milliseconds").replace(
|
||||||
|
"+00:00", "Z"
|
||||||
|
),
|
||||||
|
"end": slot.end_at.isoformat(timespec="milliseconds").replace(
|
||||||
|
"+00:00", "Z"
|
||||||
|
),
|
||||||
|
"author": {
|
||||||
|
"id": slot.author.id,
|
||||||
|
"first_name": slot.author.first_name,
|
||||||
|
"last_name": slot.author.last_name,
|
||||||
|
"nick_name": slot.author.nick_name,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for slot in slots
|
||||||
|
]
|
||||||
|
|
||||||
|
def test_nb_queries(self):
|
||||||
|
with assertNumQueries(1):
|
||||||
|
TestClient(ReservableRoomController).get("")
|
Loading…
x
Reference in New Issue
Block a user