Compare commits

..

1 Commits

Author SHA1 Message Date
imperosol 8f15facd8f use election role name for membership description 2026-06-19 14:06:52 +02:00
4 changed files with 18 additions and 58 deletions
-52
View File
@@ -11,7 +11,6 @@ from club.models import Club, Membership
from club.schemas import ( from club.schemas import (
ClubSchema, ClubSchema,
ClubSearchFilterSchema, ClubSearchFilterSchema,
MembershipFilterSchema,
SimpleClubSchema, SimpleClubSchema,
UserMembershipSchema, UserMembershipSchema,
) )
@@ -63,54 +62,3 @@ 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,4 +1,3 @@
from datetime import datetime
from typing import Annotated from typing import Annotated
from django.db.models import Q from django.db.models import Q
@@ -80,8 +79,3 @@ 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,8 +251,12 @@ 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,6 +13,7 @@ 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
@@ -155,6 +156,19 @@ 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(