From 5f459f9b7c1cfef2d9da0ae21a5f731a5828b88c Mon Sep 17 00:00:00 2001 From: TitouanDor Date: Sat, 20 Jun 2026 13:45:52 +0200 Subject: [PATCH] ajout requette api nouveau et ancien membre de club --- club/api.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ club/schemas.py | 6 ++++++ 2 files changed, 58 insertions(+) diff --git a/club/api.py b/club/api.py index 4a055e2c..52acb67a 100644 --- a/club/api.py +++ b/club/api.py @@ -11,6 +11,7 @@ from club.models import Club, Membership from club.schemas import ( ClubSchema, ClubSearchFilterSchema, + MembershipFilterSchema, SimpleClubSchema, UserMembershipSchema, ) @@ -62,3 +63,54 @@ class UserClubController(ControllerBase): .filter(user=user) .select_related("club", "user", "role") ) + + +@api_controller("/club_members/{since_date}") +class ClubMembersController(ControllerBase): + @route.get( + "/new", + response=list[UserMembershipSchema], + auth=[ApiKeyAuth(), SessionAuth()], + permissions=[HasPerm("club.view_club")], + url_name="get_new_club_members_since_date", + ) + def fetch_new_club_members(self, filters: Query[MembershipFilterSchema]): + """give all the members of a club that have joined since a given date""" + memberships = Membership.objects.ongoing().filter( + start_date__gte=filters.since_date, end_date__isnull=True + ) + club_ids = memberships.values_list("club_id") + clubs = Club.objects.filter(id__in=club_ids) + return [ + { + "club": club, + "user": membership.user, + "role": membership.role, + "joined_at": membership.start_date, + } + for club in clubs + for membership in memberships.filter(club=club) + ] + + @route.get( + "/former", + response=list[UserMembershipSchema], + auth=[ApiKeyAuth(), SessionAuth()], + permissions=[HasPerm("club.view_club")], + url_name="get_former_club_members_since_date", + ) + def fetch_former_club_members(self, filters: Query[MembershipFilterSchema]): + """give all the former members of a club that have left since a given date""" + memberships = Membership.objects.filter(end_date__gte=filters.since_date) + club_ids = memberships.values_list("club_id") + clubs = Club.objects.filter(id__in=club_ids) + return [ + { + "club": club, + "user": membership.user, + "role": membership.role, + "left_at": membership.end_date, + } + for club in clubs + for membership in memberships.filter(club=club) + ] diff --git a/club/schemas.py b/club/schemas.py index 99d05fc1..d2f7f455 100644 --- a/club/schemas.py +++ b/club/schemas.py @@ -1,3 +1,4 @@ +from datetime import datetime from typing import Annotated from django.db.models import Q @@ -79,3 +80,8 @@ class UserMembershipSchema(ModelSchema): club: SimpleClubSchema role: ClubRoleSchema + user: SimpleUserSchema + + +class MembershipFilterSchema(FilterSchema): + since_date: Annotated[datetime, FilterLookup("date__lte")] = None