diff --git a/app/communication/enums.py b/app/communication/enums.py index 60cb68ac1..d9c6fc606 100644 --- a/app/communication/enums.py +++ b/app/communication/enums.py @@ -15,3 +15,6 @@ class UserNotificationSettingType(models.TextChoices): FINE = "FINE", "Grupper - bot" GROUP_MEMBERSHIP = "GROUP_MEMBERSHIP", "Grupper - medlemsskap" OTHER = "OTHER", "Andre" + RESERVATION_NEW = "RESERVATION NEW", "Ny reservasjon" + RESERVATION_APPROVED = "RESERVATION APPROVED", "Godkjent reservasjon" + RESERVATION_CANCELLED = "RESERVATION CANCELLED", "Avslått reservasjon" diff --git a/app/communication/migrations/0010_alter_usernotificationsetting_notification_type.py b/app/communication/migrations/0010_alter_usernotificationsetting_notification_type.py new file mode 100644 index 000000000..87c08c700 --- /dev/null +++ b/app/communication/migrations/0010_alter_usernotificationsetting_notification_type.py @@ -0,0 +1,35 @@ +# Generated by Django 4.2.5 on 2024-04-10 16:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("communication", "0009_alter_usernotificationsetting_notification_type"), + ] + + operations = [ + migrations.AlterField( + model_name="usernotificationsetting", + name="notification_type", + field=models.CharField( + choices=[ + ("REGISTRATION", "Påmeldingsoppdateringer"), + ("UNREGISTRATION", "Avmeldingsoppdateringer"), + ("STRIKE", "Prikkoppdateringer"), + ("EVENT_SIGN_UP_START", "Arrangementer - påmeldingsstart"), + ("EVENT_SIGN_OFF_DEADLINE", "Arrangementer - avmeldingsfrist"), + ("EVENT_EVALUATION", "Arrangementer - evaluering"), + ("EVENT_INFO", "Arrangementer - info fra arrangør"), + ("FINE", "Grupper - bot"), + ("GROUP_MEMBERSHIP", "Grupper - medlemsskap"), + ("OTHER", "Andre"), + ("RESERVATION NEW", "Ny reservasjon"), + ("RESERVATION APPROVED", "Godkjent reservasjon"), + ("RESERVATION CANCELLED", "Avslått reservasjon"), + ], + max_length=30, + ), + ), + ] diff --git a/app/kontres/models/reservation.py b/app/kontres/models/reservation.py index f73fbc0a1..22f544cae 100644 --- a/app/kontres/models/reservation.py +++ b/app/kontres/models/reservation.py @@ -2,10 +2,12 @@ from django.db import models -from app.common.enums import AdminGroup, Groups +from app.common.enums import AdminGroup, Groups, MembershipType from app.common.permissions import BasePermissionModel, check_has_access +from app.communication.enums import UserNotificationSettingType +from app.communication.notifier import Notify from app.content.models import User -from app.group.models import Group +from app.group.models import Group, Membership from app.kontres.enums import ReservationStateEnum from app.kontres.models.bookable_item import BookableItem from app.util.models import BaseModel @@ -110,3 +112,44 @@ def has_object_update_permission(self, request): def is_own_reservation(self, request): return self.author == request.user + + def notify_admins_new_reservation(self): + formatted_start_time = self.start_time.strftime("%d/%m %H:%M") + + leader_membership = Membership.objects.filter( + group=Group.objects.get(pk="kontkom"), membership_type=MembershipType.LEADER + ).first() + + if leader_membership is None: + return + + notification_message = ( + f"En ny reservasjon er opprettet for {self.bookable_item.name}, " + f"planlagt til {formatted_start_time}." + ) + + Notify( + users=[leader_membership.user], + title="Ny Reservasjon Laget", + notification_type=UserNotificationSettingType.RESERVATION_NEW, + ).add_paragraph(notification_message).send() + + def notify_approved(self): + formatted_date_time = self.start_time.strftime("%d/%m %H:%M") + Notify( + [self.author], + f'Reservasjonssøknad for "{self.bookable_item.name} er godkjent."', + UserNotificationSettingType.RESERVATION_APPROVED, + ).add_paragraph( + f"Hei, {self.author.first_name}! Din søknad for å reservere {self.bookable_item.name}, den {formatted_date_time} har blitt godkjent." + ).send() + + def notify_denied(self): + formatted_date_time = self.start_time.strftime("%d/%m %H:%M") + Notify( + [self.author], + f'Reservasjonssøknad for "{self.bookable_item.name}" er avslått.', + UserNotificationSettingType.RESERVATION_CANCELLED, + ).add_paragraph( + f"Hei, {self.author.first_name}! Din søknad for å reservere {self.bookable_item.name}, den {formatted_date_time} har blitt avslått. Du kan ta kontakt med Kontor og Kiosk dersom du lurer på noe ifm. dette." + ).send() diff --git a/app/kontres/views/reservation.py b/app/kontres/views/reservation.py index d3ab071fe..1a0165fdc 100644 --- a/app/kontres/views/reservation.py +++ b/app/kontres/views/reservation.py @@ -59,17 +59,28 @@ def update(self, request, *args, **kwargs): serializer = self.get_serializer(reservation, data=request.data, partial=True) serializer.is_valid(raise_exception=True) - # Check if the state is being updated to CONFIRMED and set approved_by - if ( - "state" in serializer.validated_data - and serializer.validated_data["state"] == ReservationStateEnum.CONFIRMED - and reservation.state != ReservationStateEnum.CONFIRMED - ): - serializer.save(approved_by=request.user) - else: - serializer.save() + if serializer.is_valid(): + previous_state = reservation.state + new_state = serializer.validated_data.get("state") + + # Check if the state is being updated to CONFIRMED and set approved_by + if ( + new_state == ReservationStateEnum.CONFIRMED + and previous_state != ReservationStateEnum.CONFIRMED + ): + serializer.save(approved_by=request.user) + else: + serializer.save() + + if new_state and new_state != previous_state: + if new_state == ReservationStateEnum.CONFIRMED: + serializer.instance.notify_approved() + elif new_state == ReservationStateEnum.CANCELLED: + serializer.instance.notify_denied() - return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def destroy(self, request, *args, **kwargs): super().destroy(self, request, *args, **kwargs)