diff --git a/club/api.py b/club/api.py index 2e59d3e5..70dd4b40 100644 --- a/club/api.py +++ b/club/api.py @@ -1,4 +1,4 @@ -from typing import Annotated +from typing import Annotated, Optional from annotated_types import MinLen from django.db.models import Prefetch @@ -23,8 +23,35 @@ class ClubController(ControllerBase): url_name="search_club", ) @paginate(PageNumberPaginationExtra, page_size=50) - def search_club(self, search: Annotated[str, MinLen(1)]): - return Club.objects.filter(name__icontains=search).values() + def search_club( + self, + search: Annotated[Optional[str], MinLen(1), "filter by name"] = None, + club_id: Annotated[Optional[int], "filter by club id"] = None, + excluded_ids: Annotated[ + Optional[list[int]], "filter by excluded club ids" + ] = None, + is_active: Annotated[Optional[bool], "filter by club activity"] = None, + parent_id: Annotated[Optional[int], "filter by parent id"] = None, + parent_name: Annotated[ + Optional[str], MinLen(1), "filter by parent name" + ] = None, + ): + queryset = Club.objects.all() + + if search: + queryset = queryset.filter(name__icontains=search) + if club_id: + queryset = queryset.filter(id=club_id) + if is_active: + queryset = queryset.filter(is_active=is_active) + if parent_name: + queryset = queryset.filter(parent__name__icontains=parent_name) + if parent_id: + queryset = queryset.filter(parent_id=parent_id) + if excluded_ids: + queryset = queryset.exclude(id__in=excluded_ids) + + return queryset.values() @route.get( "/{int:club_id}",