Coverage for website/pushnotifications/signals/events.py: 89.92%
81 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from django.conf import settings
2from django.db.models.signals import post_delete, post_save
3from django.utils import timezone
5from events.models import Event, EventRegistration
6from events.signals import user_left_queue
7from members.models import Member
8from utils.models.signals import suspendingreceiver
10from ..models import (
11 Category,
12 EventStartReminderMessage,
13 Message,
14 RegistrationReminderMessage,
15)
18@suspendingreceiver(
19 post_save, sender=Event, dispatch_uid="schedule_event_start_reminder"
20)
21def schedule_event_start_reminder(sender, instance, **kwargs):
22 """Create, update or delete a scheduled start reminder for the event if necessary."""
23 message = getattr(instance, "start_reminder", None)
25 if not instance.published:
26 # Remove existing not-sent notification if the event isn't published.
27 if message is not None and not message.sent:
28 instance.start_reminder = None
29 message.delete()
30 else:
31 reminder_time = instance.start - timezone.timedelta(hours=1)
33 # Delete reminder if the event is changed so that the reminder time has now passed.
34 if (
35 message is not None
36 and message.time != reminder_time
37 and reminder_time < timezone.now()
38 ):
39 instance.start_reminder = None
40 message.delete()
41 return
43 # Don't update if the message has already been sent or the reminder time has passed.
44 if (message is not None and message.sent) or reminder_time < timezone.now():
45 return
47 if message is None:
48 message = EventStartReminderMessage(event=instance)
50 message.title = "Event"
51 message.body = f"'{instance.title}' starts in 1 hour"
52 message.url = f"{settings.BASE_URL}{instance.get_absolute_url()}"
53 message.category = Category.objects.get(key=Category.EVENT)
54 message.time = reminder_time
55 message.save()
57 if instance.registration_required:
58 message.users.set([r.member for r in instance.participants if r.member])
59 else:
60 message.users.set(Member.current_members.all())
63@suspendingreceiver(
64 post_save, sender=Event, dispatch_uid="schedule_registration_reminder"
65)
66def schedule_registration_reminder(sender, instance, **kwargs):
67 """Create, update or delete a registration reminder for the event if necessary."""
68 message = getattr(instance, "registration_reminder", None)
70 if not instance.published or not instance.registration_required:
71 # Remove existing not-sent notification if the event
72 # isn't published or registration isn't required.
73 if message is not None and not message.sent:
74 instance.registration_reminder = None
75 message.delete()
76 else:
77 reminder_time = instance.registration_start - timezone.timedelta(hours=1)
79 # Delete reminder if the event is changed so that the reminder time has now passed.
80 if (
81 message is not None
82 and message.time != reminder_time
83 and reminder_time < timezone.now()
84 ):
85 instance.registration_reminder = None
86 message.delete()
87 return
89 # Don't update if the message has already been sent or the reminder time has passed.
90 if (message is not None and message.sent) or reminder_time < timezone.now():
91 return
93 if message is None: 93 ↛ 96line 93 didn't jump to line 96 because the condition on line 93 was always true
94 message = RegistrationReminderMessage(event=instance)
96 message.title = "Event registration"
97 message.body = f"Registration for '{instance.title}' starts in 1 hour"
98 message.url = f"{settings.BASE_URL}{instance.get_absolute_url()}"
99 message.category = Category.objects.get(key=Category.EVENT)
100 message.time = reminder_time
101 message.save()
103 message.users.set(Member.current_members.all())
106@suspendingreceiver(
107 post_save,
108 sender=EventRegistration,
109 dispatch_uid="update_event_start_reminder_users_on_registration_save",
110)
111def update_event_start_reminder_users_on_registration_save(sender, instance, **kwargs):
112 """Add or remove the member from the event start reminder."""
113 message = getattr(instance.event, "start_reminder", None)
115 if message is None or message.sent:
116 return
118 if instance.member is not None: 118 ↛ exitline 118 didn't return from function 'update_event_start_reminder_users_on_registration_save' because the condition on line 118 was always true
119 if instance.event.registration_required:
120 if instance.date_cancelled:
121 message.users.remove(instance.member)
122 else:
123 message.users.add(instance.member)
126@suspendingreceiver(
127 post_delete,
128 sender=EventRegistration,
129 dispatch_uid="update_event_start_reminder_users_on_registration_delete",
130)
131def update_event_start_reminder_users_on_registration_delete(
132 sender, instance, **kwargs
133):
134 """Remove the member from the event start reminder if registration is required."""
135 message = getattr(instance.event, "start_reminder", None)
137 if message is None or message.sent: 137 ↛ 138line 137 didn't jump to line 138 because the condition on line 137 was never true
138 return
140 if instance.member is not None: 140 ↛ exitline 140 didn't return from function 'update_event_start_reminder_users_on_registration_delete' because the condition on line 140 was always true
141 if instance.event.registration_required:
142 message.users.remove(instance.member)
145@suspendingreceiver(
146 user_left_queue,
147 dispatch_uid="send_queue_notification_when_user_left_queue",
148)
149def send_queue_notification(sender, event, first_waiting: EventRegistration, **kwargs):
150 """Send a notification when a registration is cancelled and a new user can participate."""
151 if first_waiting.member is None:
152 return
153 message = Message.objects.create(
154 title=event.title,
155 body="Someone cancelled, so you can now participate!",
156 url=settings.BASE_URL + event.get_absolute_url(),
157 category=Category.objects.get(key=Category.EVENT),
158 )
159 message.users.set([first_waiting.member])
160 message.send()