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

1from django.db.models.signals import post_save, pre_delete, pre_save 

2from django.utils import timezone 

3 

4from events.models import EventRegistration 

5from members.models import Member 

6from utils.models.signals import suspendingreceiver 

7 

8from ..models import Category, FoodOrderReminderMessage 

9 

10 

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) 

19 

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) 

27 

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 

37 

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 

41 

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) 

45 

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() 

51 

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()) 

60 

61 

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 

71 

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) 

78 

79 

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) 

90 

91 

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)