diff --git a/lego/apps/events/models.py b/lego/apps/events/models.py index d2ecac4cd..cc16264d8 100644 --- a/lego/apps/events/models.py +++ b/lego/apps/events/models.py @@ -30,7 +30,12 @@ from lego.apps.files.models import FileField 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.constants import ( + AUTUMN, + LATE_PRESENCE_PENALTY_WEIGHT, + PENALTY_TYPES, + SPRING, +) from lego.apps.users.models import AbakusGroup, Membership, Penalty, User from lego.utils.models import BasisModel from lego.utils.youtube_validator import youtube_validator @@ -935,8 +940,10 @@ def set_presence(self, presence: constants.PRESENCE_CHOICES) -> None: self.handle_user_penalty(presence) self.save() - def delete_penalties_for_event(self) -> None: - for penalty in self.user.penalties.filter(source_event=self.event): + def delete_presence_penalties_for_event(self) -> None: + for penalty in self.user.penalties.filter( + source_event=self.event, type=PENALTY_TYPES.PRESENCE + ): penalty.delete() def handle_user_penalty(self, presence: constants.PRESENCE_CHOICES) -> None: @@ -950,26 +957,25 @@ 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 ): - self.delete_penalties_for_event() + self.delete_presence_penalties_for_event() Penalty.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, + type=PENALTY_TYPES.PRESENCE, ) - elif ( - self.event.heed_penalties - and presence == constants.PRESENCE_CHOICES.TOO_LATE - ): - self.delete_penalties_for_event() + elif self.event.heed_penalties and presence == constants.PRESENCE_CHOICES.LATE: + self.delete_presence_penalties_for_event() Penalty.objects.create( user=self.user, reason=f"Møtte for sent opp på {self.event.title}.", - weight=1, + weight=LATE_PRESENCE_PENALTY_WEIGHT, source_event=self.event, + type=PENALTY_TYPES.PRESENCE, ) else: - self.delete_penalties_for_event() + self.delete_presence_penalties_for_event() def add_to_pool(self, pool: Pool) -> Registration: allowed: bool = False diff --git a/lego/apps/users/constants.py b/lego/apps/users/constants.py index 7f10738de..5d8001ef5 100644 --- a/lego/apps/users/constants.py +++ b/lego/apps/users/constants.py @@ -1,5 +1,7 @@ from enum import Enum +from django.db import models + MALE = "male" FEMALE = "female" OTHER = "other" @@ -95,8 +97,6 @@ def values(cls) -> list[str]: FSGroup.MSSECCLO: FOURTH_GRADE_KOMTEK, } -STUDENT_EMAIL_DOMAIN = "stud.ntnu.no" - GROUP_COMMITTEE = "komite" GROUP_INTEREST = "interesse" GROUP_BOARD = "styre" @@ -142,3 +142,12 @@ def values(cls) -> list[str]: (LIGHT_THEME, LIGHT_THEME), (DARK_THEME, DARK_THEME), ) + + +LATE_PRESENCE_PENALTY_WEIGHT = 1 + + +class PENALTY_TYPES(models.TextChoices): + PRESENCE = "presence" + PAYMENT = "payment" + OTHER = "other" diff --git a/lego/apps/users/migrations/0042_penalty_type.py b/lego/apps/users/migrations/0042_penalty_type.py new file mode 100644 index 000000000..7b4f6af4f --- /dev/null +++ b/lego/apps/users/migrations/0042_penalty_type.py @@ -0,0 +1,25 @@ +# Generated by Django 4.0.10 on 2024-03-14 10:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("users", "0041_user_linkedin_id_alter_user_github_username"), + ] + + operations = [ + migrations.AddField( + model_name="penalty", + name="type", + field=models.CharField( + choices=[ + ("presence", "Presence"), + ("payment", "Payment"), + ("other", "Other"), + ], + default="other", + max_length=50, + ), + ), + ] diff --git a/lego/apps/users/models.py b/lego/apps/users/models.py index d5797c3f9..7752a8b8a 100644 --- a/lego/apps/users/models.py +++ b/lego/apps/users/models.py @@ -537,6 +537,11 @@ class Penalty(BasisModel): source_event = models.ForeignKey( "events.Event", related_name="penalties", on_delete=models.CASCADE ) + type = models.CharField( + max_length=50, + choices=constants.PENALTY_TYPES.choices, + default=constants.PENALTY_TYPES.OTHER, + ) objects = UserPenaltyManager() # type: ignore