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

1from django.conf import settings 

2from django.db.models.signals import post_delete, post_save 

3from django.utils import timezone 

4 

5from events.models import Event, EventRegistration 

6from events.signals import user_left_queue 

7from members.models import Member 

8from utils.models.signals import suspendingreceiver 

9 

10from ..models import ( 

11 Category, 

12 EventStartReminderMessage, 

13 Message, 

14 RegistrationReminderMessage, 

15) 

16 

17 

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) 

24 

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) 

32 

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 

42 

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 

46 

47 if message is None: 

48 message = EventStartReminderMessage(event=instance) 

49 

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

56 

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

61 

62 

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) 

69 

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) 

78 

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 

88 

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 

92 

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) 

95 

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

102 

103 message.users.set(Member.current_members.all()) 

104 

105 

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) 

114 

115 if message is None or message.sent: 

116 return 

117 

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) 

124 

125 

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) 

136 

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 

139 

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) 

143 

144 

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