mirror of
https://github.com/ae-utbm/sith.git
synced 2026-03-13 15:15:03 +00:00
66 lines
2.1 KiB
Python
66 lines
2.1 KiB
Python
from django.db.models import Prefetch
|
|
from ninja import Query
|
|
from ninja.security import SessionAuth
|
|
from ninja_extra import ControllerBase, api_controller, paginate, route
|
|
from ninja_extra.pagination import PageNumberPaginationExtra
|
|
from ninja_extra.schemas import PaginatedResponseSchema
|
|
|
|
from api.auth import ApiKeyAuth
|
|
from api.permissions import CanAccessLookup, CanView, HasPerm
|
|
from club.models import Club, Membership
|
|
from club.schemas import (
|
|
ClubSchema,
|
|
ClubSearchFilterSchema,
|
|
SimpleClubSchema,
|
|
UserMembershipSchema,
|
|
)
|
|
from core.models import User
|
|
|
|
|
|
@api_controller("/club")
|
|
class ClubController(ControllerBase):
|
|
@route.get(
|
|
"/search",
|
|
response=PaginatedResponseSchema[SimpleClubSchema],
|
|
auth=[ApiKeyAuth(), SessionAuth()],
|
|
permissions=[CanAccessLookup],
|
|
url_name="search_club",
|
|
)
|
|
@paginate(PageNumberPaginationExtra, page_size=50)
|
|
def search_club(self, filters: Query[ClubSearchFilterSchema]):
|
|
return filters.filter(Club.objects.all())
|
|
|
|
@route.get(
|
|
"/{int:club_id}",
|
|
response=ClubSchema,
|
|
auth=[ApiKeyAuth(), SessionAuth()],
|
|
permissions=[HasPerm("club.view_club")],
|
|
url_name="fetch_club",
|
|
)
|
|
def fetch_club(self, club_id: int):
|
|
prefetch = Prefetch(
|
|
"members", queryset=Membership.objects.ongoing().select_related("user")
|
|
)
|
|
return self.get_object_or_exception(
|
|
Club.objects.prefetch_related(prefetch), id=club_id
|
|
)
|
|
|
|
|
|
@api_controller("/user/{int:user_id}/club")
|
|
class UserClubController(ControllerBase):
|
|
@route.get(
|
|
"",
|
|
response=list[UserMembershipSchema],
|
|
auth=[ApiKeyAuth(), SessionAuth()],
|
|
permissions=[CanView],
|
|
url_name="fetch_user_clubs",
|
|
)
|
|
def fetch_user_clubs(self, user_id: int):
|
|
"""Get all the active memberships of the given user."""
|
|
user = self.get_object_or_exception(User, id=user_id)
|
|
return (
|
|
Membership.objects.ongoing()
|
|
.filter(user=user)
|
|
.select_related("club", "user")
|
|
)
|