Skip to content

Commit

Permalink
Implement penalty group
Browse files Browse the repository at this point in the history
  • Loading branch information
Arashfa0301 committed Sep 28, 2023
1 parent a2295e2 commit d531414
Show file tree
Hide file tree
Showing 19 changed files with 648 additions and 247 deletions.
4 changes: 2 additions & 2 deletions lego/api/v1.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
PasswordResetPerformViewSet,
PasswordResetRequestViewSet,
)
from lego.apps.users.views.penalties import PenaltyViewSet
from lego.apps.users.views.penalties import PenaltyGroupViewSet
from lego.apps.users.views.registration import UserRegistrationRequestViewSet
from lego.apps.users.views.student_confirmation import (
StudentConfirmationPerformViewSet,
Expand Down Expand Up @@ -179,7 +179,7 @@
PasswordResetRequestViewSet,
basename="password-reset-request",
)
router.register(r"penalties", PenaltyViewSet)
router.register(r"penalties", PenaltyGroupViewSet)
router.register(r"podcasts", PodcastViewSet, basename="podcasts")
router.register(r"polls", PollViewSet, basename="polls")
router.register(r"quotes", QuoteViewSet)
Expand Down
18 changes: 11 additions & 7 deletions lego/apps/events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
from lego.apps.followers.models import FollowEvent
from lego.apps.permissions.models import ObjectPermissionsModel
from lego.apps.users.constants import AUTUMN, SPRING
from lego.apps.users.models import AbakusGroup, Penalty, User
from lego.apps.users.models import AbakusGroup, PenaltyGroup, User
from lego.utils.models import BasisModel
from lego.utils.youtube_validator import youtube_validator

Expand Down Expand Up @@ -389,8 +389,10 @@ def unregister(
and self.heed_penalties
and self.passed_unregistration_deadline
):
if not registration.user.penalties.filter(source_event=self).exists():
Penalty.objects.create(
if not registration.user.penalty_groups.filter(
source_event=self
).exists():
PenaltyGroup.objects.create(
user=registration.user,
reason=f"Meldte seg av {self.title} for sent.",
weight=1,
Expand Down Expand Up @@ -910,16 +912,18 @@ def handle_user_penalty(self, presence: constants.PRESENCE_CHOICES) -> None:
and presence == constants.PRESENCE_CHOICES.NOT_PRESENT
and self.event.penalty_weight_on_not_present
):
if not self.user.penalties.filter(source_event=self.event).exists():
Penalty.objects.create(
if not self.user.penalty_groups.filter(source_event=self.event).exists():
PenaltyGroup.objects.create(
user=self.user,
reason=f"Møtte ikke opp på {self.event.title}.",
weight=self.event.penalty_weight_on_not_present,
source_event=self.event,
)
else:
for penalty in self.user.penalties.filter(source_event=self.event):
penalty.delete()
for penalty_group in self.user.penalty_groups.filter(
source_event=self.event
):
penalty_group.delete()

def add_to_pool(self, pool: Pool) -> Registration:
allowed: bool = False
Expand Down
28 changes: 14 additions & 14 deletions lego/apps/events/tests/test_async_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
notify_user_when_payment_soon_overdue,
set_all_events_ready_and_bump,
)
from lego.apps.events.tests.utils import get_dummy_users, make_penalty_expire
from lego.apps.users.models import AbakusGroup, Penalty
from lego.apps.events.tests.utils import get_dummy_users, make_penalty_group_expire
from lego.apps.users.models import AbakusGroup, PenaltyGroup
from lego.utils.test_utils import BaseAPITestCase, BaseTestCase


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

p1 = Penalty.objects.create(
penalty_group = PenaltyGroup.objects.create(
user=user, reason="test", weight=3, source_event=self.event
)

Expand All @@ -359,7 +359,7 @@ def test_is_automatically_bumped_after_penalty_expiration(self):
]
async_register(registration.id)

make_penalty_expire(p1)
make_penalty_group_expire(penalty_group)
check_events_for_registrations_with_expired_penalties.delay()

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

p1 = Penalty.objects.create(
p1 = PenaltyGroup.objects.create(
user=user, reason="test", weight=2, source_event=self.event
)
Penalty.objects.create(
PenaltyGroup.objects.create(
user=user, reason="test2", weight=2, source_event=self.event
)

Expand All @@ -383,7 +383,7 @@ def test_is_bumped_with_multiple_penalties(self):
]
async_register(registration.id)

make_penalty_expire(p1)
make_penalty_group_expire(p1)
check_events_for_registrations_with_expired_penalties.delay()

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

p1 = Penalty.objects.create(
p1 = PenaltyGroup.objects.create(
user=users[1], reason="test", weight=3, source_event=self.event
)

Expand All @@ -406,7 +406,7 @@ def test_isnt_bumped_when_full(self):
)[0]
async_register(registration.id)

make_penalty_expire(p1)
make_penalty_group_expire(p1)
check_events_for_registrations_with_expired_penalties.delay()

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

p1 = Penalty.objects.create(
p1 = PenaltyGroup.objects.create(
user=users[2], reason="test", weight=3, source_event=self.event
)

Expand All @@ -432,7 +432,7 @@ def test_isnt_bumped_when_not_first_in_line(self):
)[0]
async_register(registration.id)

make_penalty_expire(p1)
make_penalty_group_expire(p1)
check_events_for_registrations_with_expired_penalties.delay()

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

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

Expand All @@ -458,7 +458,7 @@ def test_async_bump_post_merge(self):
)[0]
async_register(registration.id)

make_penalty_expire(p1)
make_penalty_group_expire(penalty_group)
check_events_for_registrations_with_expired_penalties.delay()

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

Penalty.objects.create(
PenaltyGroup.objects.create(
user=user, reason="test", weight=3, source_event=self.event
)

Expand Down
8 changes: 4 additions & 4 deletions lego/apps/events/tests/test_events_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
check_events_for_registrations_with_expired_penalties,
stripe_webhook_event,
)
from lego.apps.events.tests.utils import get_dummy_users, make_penalty_expire
from lego.apps.events.tests.utils import get_dummy_users, make_penalty_group_expire
from lego.apps.followers.models import FollowEvent
from lego.apps.surveys.models import Submission, Survey
from lego.apps.users.constants import GROUP_GRADE, PHOTO_CONSENT_DOMAINS
from lego.apps.users.models import AbakusGroup, Penalty, PhotoConsent, User
from lego.apps.users.models import AbakusGroup, PenaltyGroup, PhotoConsent, User
from lego.utils.test_utils import BaseAPITestCase, BaseAPITransactionTestCase

_test_event_data = [
Expand Down Expand Up @@ -1727,7 +1727,7 @@ def test_create_payment_intent_when_bump_from_waitlist(self, mock_notify):

self.client.force_authenticate(self.abakus_user_4)

p1 = Penalty.objects.create(
p1 = PenaltyGroup.objects.create(
user=self.abakus_user_4, reason="test", weight=3, source_event=self.event
)

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

make_penalty_expire(p1)
make_penalty_group_expire(p1)
check_events_for_registrations_with_expired_penalties.delay()

res = self.get_payment_intent()
Expand Down
30 changes: 16 additions & 14 deletions lego/apps/events/tests/test_penalties.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from datetime import timedelta
from django.conf import settings

from django.conf import settings
from django.utils import timezone

from lego.apps.events import constants
from lego.apps.events.models import Event, Registration
from lego.apps.users.models import AbakusGroup, Penalty
from lego.apps.users.models import AbakusGroup, PenaltyGroup
from lego.utils.test_utils import BaseTestCase

from .utils import get_dummy_users
Expand Down Expand Up @@ -35,7 +35,9 @@ def test_get_earliest_registration_time_ignore_penalties(self):

user = get_dummy_users(1)[0]
AbakusGroup.objects.get(name="Webkom").add_user(user)
Penalty.objects.create(user=user, reason="test", weight=1, source_event=event)
PenaltyGroup.objects.create(
user=user, reason="test", weight=1, source_event=event
)
penalties = user.number_of_penalties()

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

user = get_dummy_users(1)[0]
AbakusGroup.objects.get(name="Webkom").add_user(user)
Penalty.objects.create(
PenaltyGroup.objects.create(
user=user, reason="first test penalty", weight=1, source_event=event
)
penalties = user.number_of_penalties()
Expand All @@ -67,7 +69,7 @@ def test_get_earliest_registration_time_one_or_more_penalty(self):
earliest_reg,
current_time + timedelta(hours=settings.PENALTY_DELAY_DURATION),
)
Penalty.objects.create(
PenaltyGroup.objects.create(
user=user, reason="second test penalty", weight=2, source_event=event
)
penalties = user.number_of_penalties()
Expand All @@ -92,10 +94,10 @@ def test_cant_register_with_one_or_more_penalty_before_delay(self):

user = get_dummy_users(1)[0]
AbakusGroup.objects.get(name="Abakus").add_user(user)
Penalty.objects.create(
PenaltyGroup.objects.create(
user=user, reason="first test penalty", weight=1, source_event=event
)
Penalty.objects.create(
PenaltyGroup.objects.create(
user=user, reason="second test penalty", weight=2, source_event=event
)

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

user = get_dummy_users(1)[0]
AbakusGroup.objects.get(name="Abakus").add_user(user)
Penalty.objects.create(
PenaltyGroup.objects.create(
user=user, reason="first test penalty", weight=1, source_event=event
)
Penalty.objects.create(
PenaltyGroup.objects.create(
user=user, reason="second test penalty", weight=2, source_event=event
)

Expand Down Expand Up @@ -193,20 +195,20 @@ def test_only_correct_penalties_are_removed_on_presence_change(self):

registration.set_presence(constants.PRESENCE_CHOICES.NOT_PRESENT)
penalties_before = registration.user.number_of_penalties()
penalties_object_before = list(registration.user.penalties.all())
penalties_object_before = list(registration.user.penalty_groups.all())

Penalty.objects.create(
PenaltyGroup.objects.create(
user=registration.user,
reason="OTHER EVENT",
weight=2,
source_event=other_event,
)
penalties_during = registration.user.number_of_penalties()
penalties_objects_during = list(registration.user.penalties.all())
penalties_objects_during = list(registration.user.penalty_groups.all())

registration.set_presence(constants.PRESENCE_CHOICES.UNKNOWN)
penalties_after = registration.user.number_of_penalties()
penalties_object_after = list(registration.user.penalties.all())
penalties_object_after = list(registration.user.penalty_groups.all())

self.assertEqual(penalties_object_before[0].source_event, event)
self.assertEqual(penalties_object_after[0].source_event, other_event)
Expand All @@ -229,7 +231,7 @@ def test_able_to_register_when_not_heed_penalties_with_penalties(self):
event.save()
user = get_dummy_users(1)[0]
AbakusGroup.objects.get(name="Webkom").add_user(user)
Penalty.objects.create(
PenaltyGroup.objects.create(
user=user, reason="TEST", weight=3, source_event=other_event
)

Expand Down
7 changes: 3 additions & 4 deletions lego/apps/events/tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import stripe

from lego.apps.users.models import AbakusGroup, User
from lego.apps.users.models import AbakusGroup, PenaltyGroup, User


def get_dummy_users(n):
Expand Down Expand Up @@ -33,6 +33,5 @@ def create_token(number, cvc, year=None):
)


def make_penalty_expire(penalty):
penalty.created_at = timezone.now() - timedelta(days=365)
penalty.save()
def make_penalty_group_expire(penalty_group: PenaltyGroup) -> None:
penalty_group.delete()
25 changes: 11 additions & 14 deletions lego/apps/users/action_handlers.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from django.utils import timezone

from lego.apps.action_handlers.handler import Handler
from lego.apps.action_handlers.registry import register_handler
from lego.apps.feeds.activity import Activity
from lego.apps.feeds.feed_manager import feed_manager
from lego.apps.feeds.models import NotificationFeed, PersonalFeed, UserFeed
from lego.apps.feeds.verbs import GroupJoinVerb, PenaltyVerb
from lego.apps.users.constants import PUBLIC_GROUPS
from lego.apps.users.models import Membership, Penalty
from lego.apps.users.models import Membership, PenaltyGroup
from lego.apps.users.notifications import PenaltyNotification


Expand Down Expand Up @@ -43,31 +45,26 @@ def get_activity(self, membership):


class PenaltyHandler(Handler):
model = Penalty
model = PenaltyGroup
manager = feed_manager

def get_activity(self, penalty):
def get_activity(self, penalty_group):
return Activity(
actor=penalty.source_event,
actor=penalty_group.source_event,
verb=PenaltyVerb,
object=penalty,
target=penalty.user,
time=penalty.created_at,
object=penalty_group,
target=penalty_group.user,
time=penalty_group.created_at,
extra_context={
"reason": penalty.reason,
"weight": penalty.weight,
"expiration_date": penalty.exact_expiration.days,
"reason": penalty_group.reason,
"weight": penalty_group.weight,
},
)

def handle_create(self, instance, **kwargs):
activity = self.get_activity(instance)
self.manager.add_activity(activity, [instance.user.pk], [NotificationFeed])

# Send Notification
notification = PenaltyNotification(instance.user, penalty=instance)
notification.notify()

def handle_update(self, instance, **kwargs):
activity = self.get_activity(instance)
self.manager.add_activity(activity, [instance.user.pk], [NotificationFeed])
Expand Down
Loading

0 comments on commit d531414

Please sign in to comment.