Compare commits

..

1 Commits

Author SHA1 Message Date
TitouanDor 5f459f9b7c ajout requette api nouveau et ancien membre de club 2026-06-20 13:45:52 +02:00
4 changed files with 58 additions and 18 deletions
+52
View File
@@ -11,6 +11,7 @@ from club.models import Club, Membership
from club.schemas import ( from club.schemas import (
ClubSchema, ClubSchema,
ClubSearchFilterSchema, ClubSearchFilterSchema,
MembershipFilterSchema,
SimpleClubSchema, SimpleClubSchema,
UserMembershipSchema, UserMembershipSchema,
) )
@@ -62,3 +63,54 @@ class UserClubController(ControllerBase):
.filter(user=user) .filter(user=user)
.select_related("club", "user", "role") .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)
]
+6
View File
@@ -1,3 +1,4 @@
from datetime import datetime
from typing import Annotated from typing import Annotated
from django.db.models import Q from django.db.models import Q
@@ -79,3 +80,8 @@ class UserMembershipSchema(ModelSchema):
club: SimpleClubSchema club: SimpleClubSchema
role: ClubRoleSchema role: ClubRoleSchema
user: SimpleUserSchema
class MembershipFilterSchema(FilterSchema):
since_date: Annotated[datetime, FilterLookup("date__lte")] = None
-4
View File
@@ -251,12 +251,8 @@ class ApplyElectionResultForm(forms.Form):
user_id=c.user_id, user_id=c.user_id,
club_id=c.role.club_role.club_id, club_id=c.role.club_role.club_id,
role=c.role.club_role, role=c.role.club_role,
description=(
c.role.title if c.role.title != c.role.club_role.name else ""
),
) )
for c in candidates for c in candidates
] ]
Membership.objects.bulk_create(memberships) Membership.objects.bulk_create(memberships)
Membership._add_club_groups(memberships) Membership._add_club_groups(memberships)
return memberships
-14
View File
@@ -13,7 +13,6 @@ from pytest_django.asserts import assertRedirects
from club.models import Club, ClubRole, Membership from club.models import Club, ClubRole, Membership
from core.baker_recipes import subscriber_user from core.baker_recipes import subscriber_user
from core.models import Group, User from core.models import Group, User
from election.forms import ApplyElectionResultForm
from election.models import Candidature, Election, ElectionList, Role, Vote from election.models import Candidature, Election, ElectionList, Role, Vote
@@ -156,19 +155,6 @@ class TestApplyResult(TestCase):
response = self.client.post(self.url, data={"candidates": ids}) response = self.client.post(self.url, data={"candidates": ids})
assert response.status_code == 403 assert response.status_code == 403
def test_membership_description(self):
"""Test that if club role name and election role name are different,
then the election role name is used as membership description.
"""
form = ApplyElectionResultForm(
election=self.election, data={"candidates": [self.candidatures[0].id]}
)
assert form.is_valid()
memberships = form.save()
assert len(memberships) == 1
assert memberships[0].role == self.club_roles[0]
assert memberships[0].description == "election role 1"
def test_no_result_to_apply(self): def test_no_result_to_apply(self):
self.election.roles.update(club_role=None) self.election.roles.update(club_role=None)
user = baker.make( user = baker.make(