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 (
ClubSchema,
ClubSearchFilterSchema,
MembershipFilterSchema,
SimpleClubSchema,
UserMembershipSchema,
)
@@ -63,54 +62,3 @@ 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)
]
-6
View File
@@ -1,4 +1,3 @@
from datetime import datetime
from typing import Annotated
from django.db.models import Q
@@ -80,8 +79,3 @@ class UserMembershipSchema(ModelSchema):
club: SimpleClubSchema
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,
club_id=c.role.club_role.club_id,
role=c.role.club_role,
description=(
c.role.title if c.role.title != c.role.club_role.name else ""
),
)
for c in candidates
]
Membership.objects.bulk_create(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 core.baker_recipes import subscriber_user
from core.models import Group, User
from election.forms import ApplyElectionResultForm
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})
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):
self.election.roles.update(club_role=None)
user = baker.make(