Coverage for website/pushnotifications/signals/pizzas.py: 92.96%
49 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.db.models.signals import post_save, pre_delete, pre_save
2from django.utils import timezone
4from events.models import EventRegistration
5from members.models import Member
6from utils.models.signals import suspendingreceiver
8from ..models import Category, FoodOrderReminderMessage
11@suspendingreceiver(
12 post_save,
13 sender="pizzas.FoodEvent",
14 dispatch_uid="schedule_food_order_reminder_pushnotification",
15)
16def schedule_food_order_reminder_pushnotification(sender, instance, **kwargs):
17 """Create, update or delete a scheduled message for the food event if necessary."""
18 message = getattr(instance, "end_reminder", None)
20 if not instance.send_notification:
21 # Remove existing not-sent notification if there is one.
22 if message is not None and not message.sent:
23 instance.end_reminder = None
24 message.delete()
25 else:
26 reminder_time = instance.end - timezone.timedelta(minutes=10)
28 # Delete reminder if the event is changed so that the reminder time has now passed.
29 if (
30 message is not None
31 and message.time != reminder_time
32 and reminder_time < timezone.now()
33 ):
34 instance.end_reminder = None
35 message.delete()
36 return
38 # Don't update if the message has already been sent or the reminder time has passed.
39 if (message is not None and message.sent) or reminder_time < timezone.now(): 39 ↛ 40line 39 didn't jump to line 40 because the condition on line 39 was never true
40 return
42 # Update existing notification or create new one.
43 if message is None: 43 ↛ 46line 43 didn't jump to line 46 because the condition on line 43 was always true
44 message = FoodOrderReminderMessage(food_event=instance)
46 message.title = f"{instance.event.title}: Order food"
47 message.body = "You can order food for 10 more minutes"
48 message.category = Category.objects.get(key=Category.PIZZA)
49 message.time = reminder_time
50 message.save()
52 if instance.event.registration_required:
53 message.users.set(
54 instance.event.registrations.filter(member__isnull=False)
55 .select_related("member")
56 .values_list("member", flat=True)
57 )
58 else:
59 message.users.set(Member.current_members.all())
62@suspendingreceiver(
63 post_save,
64 sender=EventRegistration,
65 dispatch_uid="add_registered_member_to_food_order_reminder",
66)
67def add_registered_member_to_food_order_reminder(sender, instance, **kwargs):
68 """Update members on food order reminder notification."""
69 if not instance.event.has_food_event:
70 return
72 message = getattr(instance.event.food_event, "end_reminder", None)
73 if message is not None and not message.sent and instance.member is not None:
74 if instance.date_cancelled:
75 message.users.remove(instance.member)
76 else:
77 message.users.add(instance.member)
80@suspendingreceiver(
81 pre_save,
82 sender="pizzas.FoodOrder",
83 dispatch_uid="remove_ordered_members_from_food_order_reminder",
84)
85def remove_ordered_members_from_food_order_reminder(sender, instance, **kwargs):
86 """Remove members from the food order reminder when they create an order."""
87 message = getattr(instance.food_event, "end_reminder", None)
88 if not instance.pk and message is not None and not message.sent: 88 ↛ exitline 88 didn't return from function 'remove_ordered_members_from_food_order_reminder' because the condition on line 88 was always true
89 message.users.remove(instance.member)
92@suspendingreceiver(
93 pre_delete,
94 sender="pizzas.FoodOrder",
95 dispatch_uid="add_member_to_food_order_reminder_on_order_deletion",
96)
97def add_member_to_food_order_reminder_on_order_deletion(sender, instance, **kwargs):
98 """Re-add user to food order reminder on order deletion."""
99 message = getattr(instance.food_event, "end_reminder", None)
100 if message is not None and not message.sent: 100 ↛ exitline 100 didn't return from function 'add_member_to_food_order_reminder_on_order_deletion' because the condition on line 100 was always true
101 message.users.add(instance.member)