Skip to content

Commit 680e169

Browse files
authored
Fix duplicate sanction badges with leader status change (#778)
1 parent 6cd80e5 commit 680e169

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

collectives/models/user/badge.py

+12
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,15 @@ def increment_warning_badges(self, registration: Registration):
171171
if self.is_suspended():
172172
return
173173

174+
# There is already a badge associated to this registration
175+
if any(
176+
badge
177+
for badge in registration.badges
178+
if badge.badge_id
179+
in (BadgeIds.Suspended, BadgeIds.UnjustifiedAbsenceWarning)
180+
):
181+
return
182+
174183
# Fetch the number of warning & suspended badges, whether valid or not
175184
num_valid_warning_badges = len(
176185
self.matching_badges([BadgeIds.UnjustifiedAbsenceWarning], valid_only=True)
@@ -229,6 +238,9 @@ def remove_warning_badges(self, registration: Registration):
229238
in (BadgeIds.Suspended, BadgeIds.UnjustifiedAbsenceWarning)
230239
]
231240

241+
if not registration_badges:
242+
return
243+
232244
if not any(
233245
badge
234246
for badge in registration_badges

tests/unit/test_badges.py

+26-5
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ def test_increment_warning_badges_no_updates(
106106
monkeypatch.setattr(user1, "has_badge", lambda x: False)
107107

108108
reg = event1_with_reg.existing_registrations(user1)[0]
109+
reg2 = Registration(
110+
user_id=user1.id,
111+
status=RegistrationStatus.UnJustifiedAbsentee,
112+
level=RegistrationLevels.Normal,
113+
is_self=True,
114+
)
109115

110116
user1.increment_warning_badges(reg)
111117

@@ -125,8 +131,15 @@ def test_increment_warning_badges_no_updates(
125131
lambda badge_ids: BadgeIds.UnjustifiedAbsenceWarning in badge_ids,
126132
)
127133

134+
# Same registration, should not double-count
128135
user1.increment_warning_badges(reg)
136+
# Verify database operations were performed
137+
assert len(session_monkeypatch["add"]) == 1 # New badge should be added
138+
assert session_monkeypatch["commit"] == 1 # New commit should occur
139+
assert session_monkeypatch["rollback"] == 0 # No rollback should occur
129140

141+
# other registration
142+
user1.increment_warning_badges(reg2)
130143
# Verify database operations were performed
131144
assert len(session_monkeypatch["add"]) == 2 # New badge should be added
132145
assert session_monkeypatch["commit"] == 2 # New commit should occur
@@ -182,11 +195,14 @@ def test_remove_sanction_badge(user1: User, event: Event):
182195
event.registrations.append(reg2)
183196
event.registrations.append(reg3)
184197

185-
user1.assign_badge(
186-
BadgeIds.UnjustifiedAbsenceWarning,
187-
expiration_date=expiration_date,
188-
registration=reg1,
189-
)
198+
user1.increment_warning_badges(reg1)
199+
assert not user1.has_a_valid_suspended_badge()
200+
assert user1.number_of_valid_warning_badges() == 1
201+
202+
user1.increment_warning_badges(reg1)
203+
assert not user1.has_a_valid_suspended_badge()
204+
assert user1.number_of_valid_warning_badges() == 1
205+
190206
user1.assign_badge(
191207
BadgeIds.UnjustifiedAbsenceWarning,
192208
expiration_date=expiration_date,
@@ -223,3 +239,8 @@ def test_remove_sanction_badge(user1: User, event: Event):
223239

224240
assert not user1.has_a_valid_suspended_badge()
225241
assert user1.number_of_valid_warning_badges() == 1
242+
243+
# no-op
244+
user1.remove_warning_badges(reg2)
245+
assert not user1.has_a_valid_suspended_badge()
246+
assert user1.number_of_valid_warning_badges() == 1

0 commit comments

Comments
 (0)