Skip to content

Commit

Permalink
Feat(kontres)/add notification (#790)
Browse files Browse the repository at this point in the history
* created methods for sending notification to admin and user

* endpoint will now send notification if needed

* add migrations for new notification types
  • Loading branch information
eriskjel committed Apr 10, 2024
1 parent 9e4ff76 commit 0544b2f
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 12 deletions.
3 changes: 3 additions & 0 deletions app/communication/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Original file line number Diff line number Diff line change
@@ -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,
),
),
]
47 changes: 45 additions & 2 deletions app/kontres/models/reservation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
31 changes: 21 additions & 10 deletions app/kontres/views/reservation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 0544b2f

Please sign in to comment.