def test_send_custom_reminder_email(self, send_message): now = timezone.now() sg = StudyGroup.objects.get(pk=1) sg.timezone = now.strftime("%Z") sg.start_date = now - datetime.timedelta(days=5) sg.meeting_time = sg.start_date.time() sg.end_date = sg.start_date + datetime.timedelta(weeks=5) sg.save() sg = StudyGroup.objects.get(pk=1) data = self.APPLICATION_DATA data['study_group'] = sg application = Application(**data) accept_application(application) application.save() mail.outbox = [] generate_all_meetings(sg) reminder = Reminder( study_group=sg, email_subject='Custom reminder', email_body='Test for extra reminders sent by facilitators', sms_body='Nothing to say here') reminder.save() self.assertEqual(Reminder.objects.all().count(), 1) reminder = Reminder.objects.all()[0] self.assertEqual(len(mail.outbox), 0) send_reminder(reminder) self.assertEqual(len(mail.outbox), 1) self.assertEqual(len(mail.outbox[0].bcc), 2) self.assertEqual(mail.outbox[0].bcc[0], data['email']) self.assertFalse(send_message.called)
def test_send_reminder_email(self, send_message): now = timezone.now() sg = StudyGroup.objects.get(pk=1) sg.timezone = now.strftime("%Z") sg.start_date = now - datetime.timedelta(days=5) sg.meeting_time = sg.start_date.time() sg.end_date = sg.start_date + datetime.timedelta(weeks=5) sg.save() sg = StudyGroup.objects.get(pk=1) data = self.APPLICATION_DATA data['study_group'] = sg application = Application(**data) accept_application(application) application.save() generate_all_meetings(sg) generate_reminder(sg) self.assertEqual(Reminder.objects.all().count(), 1) reminder = Reminder.objects.all()[0] self.assertEqual(len(mail.outbox), 1) send_reminder(reminder) self.assertEqual(len(mail.outbox), 2) self.assertEqual(mail.outbox[1].to[0], data['email']) self.assertFalse(send_message.called) self.assertIn('https://example.net/{0}/rsvp/?user=test%40mail.com&study_group=1&meeting_date={1}&attending=yes&sig='.format(get_language(), urllib.quote(sg.next_meeting().meeting_datetime().isoformat())), mail.outbox[1].body) self.assertIn('https://example.net/{0}/rsvp/?user=test%40mail.com&study_group=1&meeting_date={1}&attending=no&sig='.format(get_language(), urllib.quote(sg.next_meeting().meeting_datetime().isoformat())), mail.outbox[1].body) self.assertIn('https://example.net/{0}/optout/confirm/?user='.format(get_language()), mail.outbox[1].body)
def message_send(request, study_group_id): # TODO - this piggy backs of Reminder, won't work of Reminder is coupled to Meeting study_group = get_object_or_404(StudyGroup, pk=study_group_id) form_class = modelform_factory(Reminder, exclude=['study_group_meeting', 'created_at', 'sent_at', 'sms_body'], widgets={'study_group': HiddenInput}) needs_mobile = study_group.application_set.active().exclude(mobile='').count() > 0 if needs_mobile: form_class = modelform_factory(Reminder, exclude=['study_group_meeting', 'created_at', 'sent_at'], widgets={'study_group': HiddenInput}) if request.method == 'POST': form = form_class(request.POST) if form.is_valid(): reminder = form.save() send_reminder(reminder) messages.success(request, 'Email successfully sent') url = reverse('studygroups_facilitator') return http.HttpResponseRedirect(url) else: form = form_class(initial={'study_group': study_group}) context = { 'study_group': study_group, 'course': study_group.course, 'form': form } return render(request, 'studygroups/email.html', context)
def send_reminders(): now = timezone.now() translation.activate(settings.LANGUAGE_CODE) # TODO - should this be set here or closer to where the language matters? # TODO - make sure both the StudyGroup and StudyGroupMeeting is still available for reminder in Reminder.objects.filter(sent_at__isnull=True, study_group__in=StudyGroup.objects.active(), study_group_meeting__in=StudyGroupMeeting.objects.active()): if reminder.study_group_meeting and reminder.study_group_meeting.meeting_datetime() - now < datetime.timedelta(days=2): send_reminder(reminder)
def send_reminders(): """ Send meeting reminders """ now = timezone.now() translation.activate(settings.LANGUAGE_CODE) # TODO - should this be set here or closer to where the language matters? # make sure both the StudyGroup and Meeting is still available reminders = Reminder.objects.filter( sent_at__isnull=True, study_group__in=StudyGroup.objects.published(), study_group_meeting__in=Meeting.objects.active()) for reminder in reminders: # don't send reminders older than the meeting meeting_datetime = reminder.study_group_meeting.meeting_datetime() if reminder.study_group_meeting and meeting_datetime - now < datetime.timedelta( days=2) and meeting_datetime > now: send_reminder(reminder)
def test_send_learner_reminder_ics(self, send_message): now = timezone.now() sg = StudyGroup.objects.get(pk=1) sg.timezone = now.strftime("%Z") sg.start_date = now - datetime.timedelta(days=5) sg.meeting_time = sg.start_date.time() sg.end_date = sg.start_date + datetime.timedelta(weeks=5) sg.attach_ics = True sg.save() sg = StudyGroup.objects.get(pk=1) data = self.APPLICATION_DATA data['study_group'] = sg application = Application(**data) accept_application(application) application.save() mail.outbox = [] generate_all_meetings(sg) generate_reminder(sg) self.assertEqual(Reminder.objects.all().count(), 1) reminder = Reminder.objects.all()[0] self.assertEqual(len(mail.outbox), 1) send_reminder(reminder) self.assertEqual(len(mail.outbox), 3) # should be sent to facilitator & application self.assertEqual(mail.outbox[1].to[0], data['email']) self.assertFalse(send_message.called) self.assertIn( 'https://example.net/{0}/rsvp/?user=test%40mail.com&study_group=1&meeting_date={1}&attending=yes&sig=' .format( get_language(), urllib.parse.quote( sg.next_meeting().meeting_datetime().isoformat())), mail.outbox[1].alternatives[0][0]) self.assertIn( 'https://example.net/{0}/rsvp/?user=test%40mail.com&study_group=1&meeting_date={1}&attending=no&sig=' .format( get_language(), urllib.parse.quote( sg.next_meeting().meeting_datetime().isoformat())), mail.outbox[1].alternatives[0][0]) self.assertIn( 'https://example.net/{0}/optout/confirm/?user='******'VEVENT', mail.outbox[1].attachments[0].get_payload())
def test_send_reminder_sms(self, send_message): now = timezone.now() sg = StudyGroup.objects.all()[0] sg.start_date = now - datetime.timedelta(days=5) sg.end_date = sg.start_date + datetime.timedelta(weeks=5) sg.save() data = self.APPLICATION_DATA data['study_group'] = sg data['contact_method'] = Application.TEXT application = Application(**data) application.save() generate_all_meetings(sg) generate_reminder(sg) self.assertEqual(Reminder.objects.all().count(), 1) reminder = Reminder.objects.all()[0] send_reminder(reminder) self.assertEqual(len(mail.outbox), 1) #self.assertEqual(mail.outbox[0].subject, mail_data['email_subject']) self.assertFalse(send_message.called)
def test_send_reminder_sms(self, send_message): now = timezone.now() sg = StudyGroup.objects.get(pk=1) sg.timezone = now.strftime("%Z") sg.start_date = now - datetime.timedelta(days=5) sg.meeting_time = sg.start_date.time() sg.end_date = sg.start_date + datetime.timedelta(weeks=5) sg.save() sg = StudyGroup.objects.get(pk=1) data = self.APPLICATION_DATA data['study_group'] = sg application = Application(**data) application.save() generate_all_meetings(sg) generate_reminder(sg) self.assertEqual(Reminder.objects.all().count(), 1) reminder = Reminder.objects.all()[0] send_reminder(reminder) self.assertEqual(len(mail.outbox), 1) #self.assertEqual(mail.outbox[0].subject, mail_data['email_subject']) self.assertFalse(send_message.called)
def test_send_reminder_email(self, send_message): now = timezone.now() sg = StudyGroup.objects.all()[0] sg.start_date = now - datetime.timedelta(days=5) sg.end_date = sg.start_date + datetime.timedelta(weeks=5) sg.save() data = self.APPLICATION_DATA data['study_group'] = sg application = Application(**data) accept_application(application) application.save() generate_all_meetings(sg) generate_reminder(sg) self.assertEqual(Reminder.objects.all().count(), 1) reminder = Reminder.objects.all()[0] self.assertEqual(len(mail.outbox), 1) send_reminder(reminder) self.assertEqual(len(mail.outbox), 2) self.assertEqual(mail.outbox[1].to[0], data['email']) self.assertFalse(send_message.called) self.assertIn('https://chicago.p2pu.org/{0}/rsvp/?user=test%40mail.com&study_group=1&meeting_date={1}&attending=yes&sig='.format(get_language(), urllib.quote(sg.next_meeting().meeting_time.isoformat())), mail.outbox[1].body) self.assertIn('https://chicago.p2pu.org/{0}/rsvp/?user=test%40mail.com&study_group=1&meeting_date={1}&attending=no&sig='.format(get_language(), urllib.quote(sg.next_meeting().meeting_time.isoformat())), mail.outbox[1].body)
def message_send(request, study_group_id): # TODO - this piggy backs of Reminder, won't work of Reminder is coupled to StudyGroupMeeting study_group = get_object_or_404(StudyGroup, pk=study_group_id) if request.method == 'POST': form = MessageForm(request.POST) if form.is_valid(): reminder = form.save() send_reminder(reminder) messages.success(request, 'Email successfully sent') url = reverse('studygroups_facilitator') return http.HttpResponseRedirect(url) else: form = MessageForm(initial={'study_group': study_group}) context = { 'study_group': study_group, 'course': study_group.course, 'form': form } return render_to_response('studygroups/email.html', context, context_instance=RequestContext(request))
def test_facilitator_reminder_email_links(self, send_message): now = timezone.now() sg = StudyGroup.objects.get(pk=1) sg.timezone = now.strftime("%Z") sg.start_date = now - datetime.timedelta(days=5) sg.meeting_time = sg.start_date.time() sg.end_date = sg.start_date + datetime.timedelta(weeks=5) sg.save() sg = StudyGroup.objects.get(pk=1) data = self.APPLICATION_DATA data['study_group'] = sg application = Application(**data) accept_application(application) application.save() mail.outbox = [] generate_all_meetings(sg) generate_reminder(sg) self.assertEqual(Reminder.objects.all().count(), 1) reminder = Reminder.objects.all()[0] self.assertEqual(len(mail.outbox), 1) mail.outbox = [] send_reminder(reminder) self.assertEqual(len(mail.outbox), 2) # should be sent to facilitator & application self.assertEqual(mail.outbox[0].to[0], data['email']) self.assertEqual(mail.outbox[1].to[0], sg.facilitator.email) self.assertFalse(send_message.called) self.assertNotIn( 'https://example.net/{0}/rsvp/'.format(get_language()), mail.outbox[1].body) self.assertIn( 'https://example.net/{0}/facilitator/'.format(get_language()), mail.outbox[1].body) self.assertNotIn( 'https://example.net/{0}/optout/confirm/?user='.format( get_language()), mail.outbox[1].body)
def send_reminders(): now = timezone.now() for reminder in Reminder.objects.filter(sent_at__isnull=True): if reminder.meeting_time - now < datetime.timedelta(days=2): send_reminder(reminder)