Skip to content

Commit a036bfc

Browse files
committed
Implement penalty group
1 parent a2295e2 commit a036bfc

19 files changed

+654
-242
lines changed

lego/api/v1.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
PasswordResetPerformViewSet,
7171
PasswordResetRequestViewSet,
7272
)
73-
from lego.apps.users.views.penalties import PenaltyViewSet
73+
from lego.apps.users.views.penalties import PenaltyGroupViewSet
7474
from lego.apps.users.views.registration import UserRegistrationRequestViewSet
7575
from lego.apps.users.views.student_confirmation import (
7676
StudentConfirmationPerformViewSet,
@@ -179,7 +179,8 @@
179179
PasswordResetRequestViewSet,
180180
basename="password-reset-request",
181181
)
182-
router.register(r"penalties", PenaltyViewSet)
182+
router.register(r"penalties", PenaltyGroupViewSet)
183+
router.register(r"penaltie", PenaltyGroupViewSet)
183184
router.register(r"podcasts", PodcastViewSet, basename="podcasts")
184185
router.register(r"polls", PollViewSet, basename="polls")
185186
router.register(r"quotes", QuoteViewSet)

lego/apps/events/models.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
from lego.apps.followers.models import FollowEvent
3333
from lego.apps.permissions.models import ObjectPermissionsModel
3434
from lego.apps.users.constants import AUTUMN, SPRING
35-
from lego.apps.users.models import AbakusGroup, Penalty, User
35+
from lego.apps.users.models import AbakusGroup, PenaltyGroup, User, Penalty
3636
from lego.utils.models import BasisModel
3737
from lego.utils.youtube_validator import youtube_validator
3838

@@ -389,8 +389,10 @@ def unregister(
389389
and self.heed_penalties
390390
and self.passed_unregistration_deadline
391391
):
392-
if not registration.user.penalties.filter(source_event=self).exists():
393-
Penalty.objects.create(
392+
if not registration.user.penalty_groups.filter(
393+
source_event=self
394+
).exists():
395+
PenaltyGroup.objects.create(
394396
user=registration.user,
395397
reason=f"Meldte seg av {self.title} for sent.",
396398
weight=1,
@@ -910,16 +912,28 @@ def handle_user_penalty(self, presence: constants.PRESENCE_CHOICES) -> None:
910912
and presence == constants.PRESENCE_CHOICES.NOT_PRESENT
911913
and self.event.penalty_weight_on_not_present
912914
):
913-
if not self.user.penalties.filter(source_event=self.event).exists():
914-
Penalty.objects.create(
915+
if not self.user.penalty_groups.filter(source_event=self.event).exists():
916+
PenaltyGroup.objects.create(
915917
user=self.user,
916918
reason=f"Møtte ikke opp på {self.event.title}.",
917919
weight=self.event.penalty_weight_on_not_present,
918920
source_event=self.event,
919921
)
920922
else:
921-
for penalty in self.user.penalties.filter(source_event=self.event):
922-
penalty.delete()
923+
# print("\n\n\n\n\n\n\n")
924+
# print(len(self.user.penalty_groups.filter(source_event=self.event)))
925+
# print(len(Penalty.objects.filter(penalty_group__user=self.user).all()))
926+
# print("\n\n\n\n\n\n\n")
927+
928+
for penalty_group in self.user.penalty_groups.filter(
929+
source_event=self.event
930+
):
931+
penalty_group.delete()
932+
933+
# print("\n\n\n\n\n\n\n")
934+
# print(len(self.user.penalty_groups.filter(source_event=self.event)))
935+
# print(len(Penalty.objects.filter(penalty_group__user=self.user).all()))
936+
# print("\n\n\n\n\n\n\n")
923937

924938
def add_to_pool(self, pool: Pool) -> Registration:
925939
allowed: bool = False

lego/apps/events/tests/test_async_tasks.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
notify_user_when_payment_soon_overdue,
2020
set_all_events_ready_and_bump,
2121
)
22-
from lego.apps.events.tests.utils import get_dummy_users, make_penalty_expire
23-
from lego.apps.users.models import AbakusGroup, Penalty
22+
from lego.apps.events.tests.utils import get_dummy_users, make_penalty_group_expire
23+
from lego.apps.users.models import AbakusGroup, PenaltyGroup
2424
from lego.utils.test_utils import BaseAPITestCase, BaseTestCase
2525

2626

@@ -350,7 +350,7 @@ def test_is_automatically_bumped_after_penalty_expiration(self):
350350
user = get_dummy_users(1)[0]
351351
AbakusGroup.objects.get(name="Abakus").add_user(user)
352352

353-
p1 = Penalty.objects.create(
353+
penalty_group = PenaltyGroup.objects.create(
354354
user=user, reason="test", weight=3, source_event=self.event
355355
)
356356

@@ -359,7 +359,7 @@ def test_is_automatically_bumped_after_penalty_expiration(self):
359359
]
360360
async_register(registration.id)
361361

362-
make_penalty_expire(p1)
362+
make_penalty_group_expire(penalty_group)
363363
check_events_for_registrations_with_expired_penalties.delay()
364364

365365
self.assertIsNotNone(Registration.objects.get(id=registration.id).pool)
@@ -371,10 +371,10 @@ def test_is_bumped_with_multiple_penalties(self):
371371
user = get_dummy_users(1)[0]
372372
AbakusGroup.objects.get(name="Abakus").add_user(user)
373373

374-
p1 = Penalty.objects.create(
374+
p1 = PenaltyGroup.objects.create(
375375
user=user, reason="test", weight=2, source_event=self.event
376376
)
377-
Penalty.objects.create(
377+
PenaltyGroup.objects.create(
378378
user=user, reason="test2", weight=2, source_event=self.event
379379
)
380380

@@ -383,7 +383,7 @@ def test_is_bumped_with_multiple_penalties(self):
383383
]
384384
async_register(registration.id)
385385

386-
make_penalty_expire(p1)
386+
make_penalty_group_expire(p1)
387387
check_events_for_registrations_with_expired_penalties.delay()
388388

389389
self.assertIsNotNone(Registration.objects.get(id=registration.id).pool)
@@ -396,7 +396,7 @@ def test_isnt_bumped_when_full(self):
396396
for user in users:
397397
AbakusGroup.objects.get(name="Abakus").add_user(user)
398398

399-
p1 = Penalty.objects.create(
399+
p1 = PenaltyGroup.objects.create(
400400
user=users[1], reason="test", weight=3, source_event=self.event
401401
)
402402

@@ -406,7 +406,7 @@ def test_isnt_bumped_when_full(self):
406406
)[0]
407407
async_register(registration.id)
408408

409-
make_penalty_expire(p1)
409+
make_penalty_group_expire(p1)
410410
check_events_for_registrations_with_expired_penalties.delay()
411411

412412
self.assertIsNone(Registration.objects.get(user=users[1]).pool)
@@ -422,7 +422,7 @@ def test_isnt_bumped_when_not_first_in_line(self):
422422
for user in users:
423423
AbakusGroup.objects.get(name="Abakus").add_user(user)
424424

425-
p1 = Penalty.objects.create(
425+
p1 = PenaltyGroup.objects.create(
426426
user=users[2], reason="test", weight=3, source_event=self.event
427427
)
428428

@@ -432,7 +432,7 @@ def test_isnt_bumped_when_not_first_in_line(self):
432432
)[0]
433433
async_register(registration.id)
434434

435-
make_penalty_expire(p1)
435+
make_penalty_group_expire(p1)
436436
check_events_for_registrations_with_expired_penalties.delay()
437437

438438
self.assertIsNone(Registration.objects.get(user=users[1]).pool)
@@ -448,7 +448,7 @@ def test_async_bump_post_merge(self):
448448
for user in users:
449449
AbakusGroup.objects.get(name="Abakus").add_user(user)
450450

451-
p1 = Penalty.objects.create(
451+
penalty_group = PenaltyGroup.objects.create(
452452
user=users[1], reason="test", weight=3, source_event=self.event
453453
)
454454

@@ -458,7 +458,7 @@ def test_async_bump_post_merge(self):
458458
)[0]
459459
async_register(registration.id)
460460

461-
make_penalty_expire(p1)
461+
make_penalty_group_expire(penalty_group)
462462
check_events_for_registrations_with_expired_penalties.delay()
463463

464464
self.assertIsNotNone(Registration.objects.get(user=users[1]).pool)
@@ -526,7 +526,7 @@ def test_initiate_payment_in_waiting_list(self, mock_initiate_payment):
526526
user = get_dummy_users(1)[0]
527527
AbakusGroup.objects.get(name="Abakus").add_user(user)
528528

529-
Penalty.objects.create(
529+
PenaltyGroup.objects.create(
530530
user=user, reason="test", weight=3, source_event=self.event
531531
)
532532

lego/apps/events/tests/test_events_api.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
check_events_for_registrations_with_expired_penalties,
1919
stripe_webhook_event,
2020
)
21-
from lego.apps.events.tests.utils import get_dummy_users, make_penalty_expire
21+
from lego.apps.events.tests.utils import get_dummy_users, make_penalty_group_expire
2222
from lego.apps.followers.models import FollowEvent
2323
from lego.apps.surveys.models import Submission, Survey
2424
from lego.apps.users.constants import GROUP_GRADE, PHOTO_CONSENT_DOMAINS
25-
from lego.apps.users.models import AbakusGroup, Penalty, PhotoConsent, User
25+
from lego.apps.users.models import AbakusGroup, PenaltyGroup, PhotoConsent, User
2626
from lego.utils.test_utils import BaseAPITestCase, BaseAPITransactionTestCase
2727

2828
_test_event_data = [
@@ -1727,7 +1727,7 @@ def test_create_payment_intent_when_bump_from_waitlist(self, mock_notify):
17271727

17281728
self.client.force_authenticate(self.abakus_user_4)
17291729

1730-
p1 = Penalty.objects.create(
1730+
p1 = PenaltyGroup.objects.create(
17311731
user=self.abakus_user_4, reason="test", weight=3, source_event=self.event
17321732
)
17331733

@@ -1742,7 +1742,7 @@ def test_create_payment_intent_when_bump_from_waitlist(self, mock_notify):
17421742
res = self.get_payment_intent()
17431743
self.assertEqual(res.status_code, status.HTTP_403_FORBIDDEN)
17441744

1745-
make_penalty_expire(p1)
1745+
make_penalty_group_expire(p1)
17461746
check_events_for_registrations_with_expired_penalties.delay()
17471747

17481748
res = self.get_payment_intent()

lego/apps/events/tests/test_penalties.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from datetime import timedelta
2-
from django.conf import settings
32

3+
from django.conf import settings
44
from django.utils import timezone
55

66
from lego.apps.events import constants
77
from lego.apps.events.models import Event, Registration
8-
from lego.apps.users.models import AbakusGroup, Penalty
8+
from lego.apps.users.models import AbakusGroup, PenaltyGroup
99
from lego.utils.test_utils import BaseTestCase
1010

1111
from .utils import get_dummy_users
@@ -35,7 +35,9 @@ def test_get_earliest_registration_time_ignore_penalties(self):
3535

3636
user = get_dummy_users(1)[0]
3737
AbakusGroup.objects.get(name="Webkom").add_user(user)
38-
Penalty.objects.create(user=user, reason="test", weight=1, source_event=event)
38+
PenaltyGroup.objects.create(
39+
user=user, reason="test", weight=1, source_event=event
40+
)
3941
penalties = user.number_of_penalties()
4042

4143
earliest_reg = event.get_earliest_registration_time(
@@ -55,7 +57,7 @@ def test_get_earliest_registration_time_one_or_more_penalty(self):
5557

5658
user = get_dummy_users(1)[0]
5759
AbakusGroup.objects.get(name="Webkom").add_user(user)
58-
Penalty.objects.create(
60+
PenaltyGroup.objects.create(
5961
user=user, reason="first test penalty", weight=1, source_event=event
6062
)
6163
penalties = user.number_of_penalties()
@@ -67,7 +69,7 @@ def test_get_earliest_registration_time_one_or_more_penalty(self):
6769
earliest_reg,
6870
current_time + timedelta(hours=settings.PENALTY_DELAY_DURATION),
6971
)
70-
Penalty.objects.create(
72+
PenaltyGroup.objects.create(
7173
user=user, reason="second test penalty", weight=2, source_event=event
7274
)
7375
penalties = user.number_of_penalties()
@@ -92,10 +94,10 @@ def test_cant_register_with_one_or_more_penalty_before_delay(self):
9294

9395
user = get_dummy_users(1)[0]
9496
AbakusGroup.objects.get(name="Abakus").add_user(user)
95-
Penalty.objects.create(
97+
PenaltyGroup.objects.create(
9698
user=user, reason="first test penalty", weight=1, source_event=event
9799
)
98-
Penalty.objects.create(
100+
PenaltyGroup.objects.create(
99101
user=user, reason="second test penalty", weight=2, source_event=event
100102
)
101103

@@ -117,10 +119,10 @@ def test_can_register_with_one_or_more_penalty_after_delay(self):
117119

118120
user = get_dummy_users(1)[0]
119121
AbakusGroup.objects.get(name="Abakus").add_user(user)
120-
Penalty.objects.create(
122+
PenaltyGroup.objects.create(
121123
user=user, reason="first test penalty", weight=1, source_event=event
122124
)
123-
Penalty.objects.create(
125+
PenaltyGroup.objects.create(
124126
user=user, reason="second test penalty", weight=2, source_event=event
125127
)
126128

@@ -193,20 +195,20 @@ def test_only_correct_penalties_are_removed_on_presence_change(self):
193195

194196
registration.set_presence(constants.PRESENCE_CHOICES.NOT_PRESENT)
195197
penalties_before = registration.user.number_of_penalties()
196-
penalties_object_before = list(registration.user.penalties.all())
198+
penalties_object_before = list(registration.user.penalty_groups.all())
197199

198-
Penalty.objects.create(
200+
PenaltyGroup.objects.create(
199201
user=registration.user,
200202
reason="OTHER EVENT",
201203
weight=2,
202204
source_event=other_event,
203205
)
204206
penalties_during = registration.user.number_of_penalties()
205-
penalties_objects_during = list(registration.user.penalties.all())
207+
penalties_objects_during = list(registration.user.penalty_groups.all())
206208

207209
registration.set_presence(constants.PRESENCE_CHOICES.UNKNOWN)
208210
penalties_after = registration.user.number_of_penalties()
209-
penalties_object_after = list(registration.user.penalties.all())
211+
penalties_object_after = list(registration.user.penalty_groups.all())
210212

211213
self.assertEqual(penalties_object_before[0].source_event, event)
212214
self.assertEqual(penalties_object_after[0].source_event, other_event)
@@ -229,7 +231,7 @@ def test_able_to_register_when_not_heed_penalties_with_penalties(self):
229231
event.save()
230232
user = get_dummy_users(1)[0]
231233
AbakusGroup.objects.get(name="Webkom").add_user(user)
232-
Penalty.objects.create(
234+
PenaltyGroup.objects.create(
233235
user=user, reason="TEST", weight=3, source_event=other_event
234236
)
235237

lego/apps/events/tests/utils.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import stripe
66

7-
from lego.apps.users.models import AbakusGroup, User
7+
from lego.apps.users.models import AbakusGroup, PenaltyGroup, User
88

99

1010
def get_dummy_users(n):
@@ -33,6 +33,5 @@ def create_token(number, cvc, year=None):
3333
)
3434

3535

36-
def make_penalty_expire(penalty):
37-
penalty.created_at = timezone.now() - timedelta(days=365)
38-
penalty.save()
36+
def make_penalty_group_expire(penalty_group: PenaltyGroup) -> None:
37+
penalty_group.delete()

lego/apps/users/action_handlers.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
from django.utils import timezone
2+
13
from lego.apps.action_handlers.handler import Handler
24
from lego.apps.action_handlers.registry import register_handler
35
from lego.apps.feeds.activity import Activity
46
from lego.apps.feeds.feed_manager import feed_manager
57
from lego.apps.feeds.models import NotificationFeed, PersonalFeed, UserFeed
68
from lego.apps.feeds.verbs import GroupJoinVerb, PenaltyVerb
79
from lego.apps.users.constants import PUBLIC_GROUPS
8-
from lego.apps.users.models import Membership, Penalty
10+
from lego.apps.users.models import Membership, Penalty, PenaltyGroup
911
from lego.apps.users.notifications import PenaltyNotification
1012

1113

@@ -43,20 +45,20 @@ def get_activity(self, membership):
4345

4446

4547
class PenaltyHandler(Handler):
46-
model = Penalty
48+
model = PenaltyGroup
4749
manager = feed_manager
4850

49-
def get_activity(self, penalty):
51+
def get_activity(self, penalty_group):
5052
return Activity(
51-
actor=penalty.source_event,
53+
actor=penalty_group.source_event,
5254
verb=PenaltyVerb,
53-
object=penalty,
54-
target=penalty.user,
55-
time=penalty.created_at,
55+
object=penalty_group,
56+
target=penalty_group.user,
57+
time=penalty_group.created_at,
5658
extra_context={
57-
"reason": penalty.reason,
58-
"weight": penalty.weight,
59-
"expiration_date": penalty.exact_expiration.days,
59+
"reason": penalty_group.reason,
60+
"weight": penalty_group.weight,
61+
"source_event": penalty_group.source_event.company.name,
6062
},
6163
)
6264

0 commit comments

Comments
 (0)