Exemple #1
0
 def test_generate_all_meetings(self):
     now = timezone.now()
     self.assertEqual(Reminder.objects.all().count(), 0)
     sg = StudyGroup.objects.all()[0]
     sg.start_date = now - datetime.timedelta(days=3)
     sg.end_date = sg.start_date + datetime.timedelta(weeks=5)
     sg.save()
     self.assertEqual(StudyGroupMeeting.objects.all().count(),0)
     generate_all_meetings(sg)
     self.assertEqual(StudyGroupMeeting.objects.all().count(),6)
Exemple #2
0
 def test_dont_generate_reminder_4days_before(self):
     # Make sure we don't generate a reminder more than 3 days before
     now = timezone.now()
     self.assertEqual(Reminder.objects.all().count(), 0)
     sg = StudyGroup.objects.all()[0]
     sg.start_date = now - datetime.timedelta(days=3)
     sg.end_date = sg.start_date + datetime.timedelta(weeks=5)
     sg.save()
     generate_all_meetings(sg)
     generate_reminder(sg)
     self.assertEqual(Reminder.objects.all().count(), 0)
Exemple #3
0
    def test_no_reminders_for_future_studygroups(self):
        now = timezone.now()
        self.assertEqual(Reminder.objects.all().count(), 0)

        # Make sure we don't generate a reminder for future study groups
        sg = StudyGroup.objects.all()[0]
        sg.start_date = now + datetime.timedelta(days=2, weeks=1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=5)
        sg.save()
        generate_all_meetings(sg)
        generate_reminder(sg)
        self.assertEqual(Reminder.objects.all().count(), 0)
Exemple #4
0
    def test_no_reminders_for_old_studygroups(self):
        now = timezone.now()
        self.assertEqual(Reminder.objects.all().count(), 0)

        # Make sure we don't generate a reminder for old study groups
        sg = StudyGroup.objects.get(pk=1)
        sg.timezone = now.strftime("%Z")
        sg.start_date = now - datetime.timedelta(days=5, weeks=7)
        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)
        generate_all_meetings(sg)
        generate_reminder(sg)
        self.assertEqual(Reminder.objects.all().count(), 0)
Exemple #5
0
    def test_get_learning_circles_last_meeting(self):
        sg = StudyGroup.objects.get(pk=1)
        sg.start_date = datetime.date(2019,5,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        c = Client()

        resp = c.get('/api/learningcircles/?scope=completed')
        data = resp.json()
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.json()["count"], 1)
        self.assertEqual(data["items"][0]["last_meeting_date"], "2019-05-15")
 def test_application_welcome_message(self):
     c = Client()
     study_group = StudyGroup.objects.get(pk=1)
     study_group.timezone = 'America/Chicago'
     with freeze_time("2015-03-06 18:55:34"):
         generate_all_meetings(study_group)
         resp = c.post('/en/signup/foo-bob-1/', self.APPLICATION_DATA)
     self.assertRedirects(resp, '/en/signup/1/success/')
     self.assertEqual(Application.objects.active().count(), 1)
     # Make sure notification was sent
     self.assertEqual(len(mail.outbox), 1)
     self.assertEqual(mail.outbox[0].to[0], self.APPLICATION_DATA['email'])
     self.assertEqual(mail.outbox[0].cc[0], study_group.facilitator.email)
     self.assertIn(
         'The first meeting will be on Monday, 23 March at 6:30 p.m.',
         mail.outbox[0].body)
Exemple #7
0
    def post(self, request, *args, **kwargs):
        study_group = self.get_object()
        profile = study_group.facilitator.profile
        if profile.email_confirmed_at is None:
            messages.warning(self.request, _("You need to confirm your email address before you can publish a learning circle."));
        else:
            messages.success(self.request, _("Your learning circle has been published."));
            study_group.draft = False
            study_group.save()
            generate_all_meetings(study_group)


        url = reverse_lazy('studygroups_view_study_group', args=(self.kwargs.get('study_group_id'),))
        if self.get_object().facilitator == self.request.user:
            url = reverse_lazy('studygroups_facilitator')
        return http.HttpResponseRedirect(url)
 def test_generate_all_meetings(self):
     now = timezone.now()
     self.assertEqual(Reminder.objects.all().count(), 0)
     sg = StudyGroup.objects.get(pk=1)
     sg.timezone = 'US/Central'
     sg.start_date = now.date() + datetime.timedelta(days=3)
     sg.meeting_time = datetime.time(16,0)
     sg.end_date = sg.start_date + datetime.timedelta(weeks=5)
     sg.save()
     sg = StudyGroup.objects.get(pk=1)
     self.assertEqual(StudyGroupMeeting.objects.all().count(),0)
     generate_all_meetings(sg)
     self.assertEqual(StudyGroupMeeting.objects.all().count(),6)
     self.assertEqual(sg.next_meeting().meeting_datetime().tzinfo.zone, 'US/Central')
     for meeting in StudyGroupMeeting.objects.all():
         self.assertEqual(meeting.meeting_datetime().time(), datetime.time(16,0))
Exemple #9
0
    def test_dont_send_automatic_reminder_for_old_meeting(self, send_message):
        now = timezone.now()
        sg = StudyGroup.objects.get(pk=1)
        sg.timezone = now.strftime("%Z")
        sg.start_date = datetime.date(2010, 3, 10)
        sg.meeting_time = datetime.time(18, 0)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=5)
        sg.save()
        sg = StudyGroup.objects.get(pk=1)

        with freeze_time("2010-03-06 18:55:34"):
            generate_all_meetings(sg)

        data = self.APPLICATION_DATA
        data['study_group'] = sg
        application = Application(**data)
        application.save()
        accept_application(application)

        # There should be 6 unsent reminders
        self.assertEqual(
            Reminder.objects.filter(sent_at__isnull=True).count(), 6)

        mail.outbox = []
        with freeze_time("2010-03-08 18:55:34"):
            send_reminders()
        self.assertEqual(len(mail.outbox), 2)
        self.assertEqual(mail.outbox[0].to[0], data['email'])
        self.assertEqual(mail.outbox[1].to[0], '*****@*****.**')
        self.assertFalse(send_message.called)
        # Only 5 unsent reminders now
        self.assertEqual(
            Reminder.objects.filter(sent_at__isnull=True).count(), 5)

        reminder = Reminder.objects.filter(sent_at__isnull=True).order_by(
            'study_group_meeting__meeting_date').first()
        self.assertEqual(reminder.study_group_meeting.meeting_date,
                         datetime.date(2010, 3, 17))

        # Make sure we don't send unsent reminders after a meeting has happened
        mail.outbox = []
        with freeze_time("2010-03-18 18:55:34"):
            send_reminders()
        self.assertEqual(len(mail.outbox), 0)
        self.assertEqual(
            Reminder.objects.filter(sent_at__isnull=True).count(), 5)
Exemple #10
0
    def post(self, request, *args, **kwargs):
        study_group = self.get_object()
        post_schema = _make_learning_circle_schema(request)
        data = json.loads(request.body)
        data, errors = schema.validate(post_schema, data)
        if errors != {}:
            return json_response(request, {"status": "error", "errors": errors})

        # update learning circle
        end_date = data.get('start_date') + datetime.timedelta(weeks=data.get('weeks') - 1)

        published = False
        # only publish a learning circle for a user with a verified email address
        draft = data.get('draft', True)
        if draft == False and request.user.profile.email_confirmed_at != None:
            published = study_group.draft == True
            study_group.draft = False

        study_group.course = data.get('course')
        study_group.description = data.get('description')
        study_group.venue_name = data.get('venue_name')
        study_group.venue_address = data.get('venue_address')
        study_group.venue_details = data.get('venue_details')
        study_group.venue_website = data.get('venue_website', '')
        study_group.city = data.get('city')
        study_group.latitude = data.get('latitude')
        study_group.longitude = data.get('longitude')
        study_group.place_id = data.get('place_id', '')
        study_group.start_date = data.get('start_date')
        study_group.end_date = end_date
        study_group.meeting_time = data.get('meeting_time')
        study_group.duration = data.get('duration')
        study_group.timezone = data.get('timezone')
        study_group.image = data.get('image')
        study_group.signup_question = data.get('signup_question', '')
        study_group.facilitator_goal = data.get('facilitator_goal', '')
        study_group.facilitator_concerns = data.get('facilitator_concerns', '')
        study_group.save()

        # generate all meetings if the learning circle has been published
        if published:
            generate_all_meetings(study_group)

        study_group_url = settings.DOMAIN + reverse('studygroups_signup', args=(slugify(study_group.venue_name, allow_unicode=True), study_group.id,))
        return json_response(request, { "status": "updated", "url": study_group_url });
Exemple #11
0
 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(
         '{0}/{1}/rsvp/?user=test%40mail.com&study_group=1&meeting_date={2}&attending=yes&sig='
         .format(
             settings.DOMAIN, get_language(),
             urllib.parse.quote(
                 sg.next_meeting().meeting_datetime().isoformat())),
         mail.outbox[1].alternatives[0][0])
     self.assertIn(
         '{0}/{1}/rsvp/?user=test%40mail.com&study_group=1&meeting_date={2}&attending=no&sig='
         .format(
             settings.DOMAIN, get_language(),
             urllib.parse.quote(
                 sg.next_meeting().meeting_datetime().isoformat())),
         mail.outbox[1].alternatives[0][0])
     self.assertIn(
         '{0}/{1}/optout/confirm/?user='******'VEVENT', mail.outbox[1].attachments[0].get_payload())
Exemple #12
0
    def test_generate_reminder_3days_before(self):
        # Make sure we generate a reminder less than three days before
        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()
        generate_all_meetings(sg)
        generate_reminder(sg)
        self.assertEqual(Reminder.objects.all().count(), 1)
        reminder = Reminder.objects.all()[0]
        self.assertEqual(reminder.study_group_meeting.meeting_time, next_meeting_date(sg))
        #TODO check that email was sent to site admin
        #TODO test with unicode in generated email subject

        # Make sure we do it only once
        generate_reminder(sg)
        self.assertEqual(Reminder.objects.all().count(), 1)
Exemple #13
0
 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_receive_sms(self):
        # Test receiving a message
        signup_data = self.APPLICATION_DATA.copy()

        signup_data['mobile'] = '+12812347890'
        c = Client()
        resp = c.post('/en/signup/foo-bob-1/', signup_data)
        self.assertRedirects(resp, '/en/signup/1/success/')
        self.assertEqual(Application.objects.active().count(), 1)

        mail.outbox = []
        url = '/en/receive_sms/'
        sms_data = {
            'Body':
            'The first study group for GED® Prep Math will meet next Thursday, May 7th, from 6:00 pm-7:45 pm at Edgewater on the 2nd floor. Feel free to bring a study buddy!',
            'From': '+12812347890'
        }

        sg = StudyGroup.objects.get(pk=1)
        sg.meeting_set.delete()
        sg.start_date = datetime.date(2017, 10, 1)
        sg.end_date = datetime.date(2017, 10, 1) + datetime.timedelta(weeks=6)
        generate_all_meetings(sg)

        with freeze_time("2017-10-24 17:55:34"):
            resp = c.post(url, sms_data)

        self.assertEqual(len(mail.outbox), 1)
        self.assertTrue(mail.outbox[0].subject.find(signup_data['name']) > 0)
        self.assertTrue(mail.outbox[0].subject.find(signup_data['mobile']) > 0)
        self.assertIn(
            StudyGroup.objects.get(pk=1).facilitator.email, mail.outbox[0].to)
        self.assertIn('admin@localhost', mail.outbox[0].bcc)

        mail.outbox = []
        with freeze_time("2018-10-24 17:55:34"):
            resp = c.post(url, sms_data)

        self.assertEqual(len(mail.outbox), 1)
        self.assertTrue(mail.outbox[0].subject.find(signup_data['mobile']) > 0)
        self.assertNotIn(
            StudyGroup.objects.get(pk=1).facilitator.email, mail.outbox[0].to)
        self.assertIn('admin@localhost', mail.outbox[0].to)
Exemple #15
0
    def post(self, request):
        post_schema = _make_learning_circle_schema(request)
        data = json.loads(request.body)
        data, errors = schema.validate(post_schema, data)
        if errors != {}:
            return json_response(request, {"status": "error", "errors": errors})

        # create learning circle
        end_date = data.get('start_date') + datetime.timedelta(weeks=data.get('weeks') - 1)
        study_group = StudyGroup(
            course=data.get('course'),
            facilitator=request.user,
            description=data.get('description'),
            venue_name=data.get('venue_name'),
            venue_address=data.get('venue_address'),
            venue_details=data.get('venue_details'),
            venue_website=data.get('venue_website', ''),
            city=data.get('city'),
            latitude=data.get('latitude'),
            longitude=data.get('longitude'),
            place_id=data.get('place_id', ''),
            start_date=data.get('start_date'),
            end_date=end_date,
            meeting_time=data.get('meeting_time'),
            duration=data.get('duration'),
            timezone=data.get('timezone'),
            image=data.get('image'),
            signup_question=data.get('signup_question', ''),
            facilitator_goal=data.get('facilitator_goal', ''),
            facilitator_concerns=data.get('facilitator_concerns', '')
        )
        # only update value for draft if the use verified their email address
        if request.user.profile.email_confirmed_at != None:
            study_group.draft = data.get('draft', True)
        study_group.save()

        # generate all meetings if the learning circle has been published
        if study_group.draft == False:
            generate_all_meetings(study_group)

        study_group_url = settings.DOMAIN + reverse('studygroups_signup', args=(slugify(study_group.venue_name, allow_unicode=True), study_group.id,))
        return json_response(request, { "status": "created", "url": study_group_url });
 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_generate_reminder_4days_before(self):
        # Make sure we generate a reminder less than 4 days before
        now = timezone.now()
        sg = StudyGroup.objects.get(pk=1)
        sg.timezone = now.strftime("%Z")
        sg.start_date = now.date() + datetime.timedelta(days=3)
        sg.meeting_time = now.time()
        sg.end_date = now.date() + datetime.timedelta(weeks=5, days=3)
        sg.save()
        sg = StudyGroup.objects.get(pk=1)
        generate_all_meetings(sg)
        self.assertEqual(sg.studygroupmeeting_set.active().count(), 6)
        self.assertTrue(sg.next_meeting().meeting_datetime() - now < datetime.timedelta(days=4))
        generate_reminder(sg)
        self.assertEqual(Reminder.objects.all().count(), 1)
        reminder = Reminder.objects.all()[0]
        #TODO check that email was sent to site admin
        #TODO test with unicode in generated email subject

        # Make sure we do it only once
        generate_reminder(sg)
        self.assertEqual(Reminder.objects.all().count(), 1)
Exemple #18
0
 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)
Exemple #19
0
    def test_get_learning_circles_no_meetings(self):
        # has meetings
        sg = StudyGroup.objects.get(pk=1)
        sg.start_date = datetime.date(2019,6,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        # no meetings, start_date in past
        sg = StudyGroup.objects.get(pk=2)
        sg.start_date = datetime.date(2019,5,30)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()
        sg.refresh_from_db()

        # no meetings, start_date in future
        sg = StudyGroup.objects.get(pk=3)
        sg.start_date = datetime.date(2019,6,2)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()
        sg.refresh_from_db()

        c = Client()
        resp = c.get('/api/learningcircles/?signup=open')
        result = resp.json()

        print(result)
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(result["count"], 2)

        self.assertEqual(result["items"][0]["id"], 1)
        self.assertEqual(result["items"][0]["last_meeting_date"], '2019-06-15')
        self.assertEqual(result["items"][1]["id"], 3)
        self.assertEqual(result["items"][1]["last_meeting_date"], '2019-06-02')
Exemple #20
0
    def test_send_facilitator_learner_survey_prompt(self):
        now = timezone.now()
        sg = StudyGroup.objects.get(pk=1)
        sg.timezone = now.strftime("%Z")
        sg.start_date = datetime.date(2010, 1, 1)
        sg.meeting_time = datetime.time(18, 15)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=5)
        sg.save()
        sg = StudyGroup.objects.get(pk=1)
        generate_all_meetings(sg)

        last_meeting = sg.meeting_set.active().order_by(
            'meeting_date', 'meeting_time').last()
        self.assertEqual(last_meeting.meeting_date, datetime.date(2010, 2, 5))
        self.assertEqual(last_meeting.meeting_time, datetime.time(18, 15))
        self.assertEqual(sg.meeting_set.active().count(), 6)
        self.assertEqual(Reminder.objects.all().count(), 0)

        with freeze_time("2010-02-06 18:30:00"):
            send_facilitator_learner_survey_prompt(sg)
            self.assertEqual(len(mail.outbox), 0)

        with freeze_time("2010-02-07 17:30:00"):
            send_facilitator_learner_survey_prompt(sg)
            self.assertEqual(len(mail.outbox), 0)

        with freeze_time("2010-02-07 19:30:00"):
            send_facilitator_learner_survey_prompt(sg)
            self.assertEqual(len(mail.outbox), 0)

        with freeze_time("2010-02-07 18:30:00"):
            send_facilitator_learner_survey_prompt(sg)
            self.assertEqual(len(mail.outbox), 1)
            self.assertIn(
                '{0}/en/studygroup/{1}/facilitator_survey/'.format(
                    settings.DOMAIN, sg.uuid), mail.outbox[0].body)
            self.assertIn(sg.facilitator.email, mail.outbox[0].to)
    def test_generate_reminder_with_long_name_and_location(self):
        # Make sure we generate a reminder less than 4 days before
        now = timezone.now()
        sg = StudyGroup.objects.get(pk=1)
        sg.timezone = now.strftime("%Z")
        sg.venue_name = 'This is a very long venue name to test for sms reminders that are longer than a 160 caracters long'
        sg.venue_details = 'This is an even longer venue detail field. I am almost 100% certain this will be cut off. What do you think'
        sg.start_date = now.date() + datetime.timedelta(days=3)
        sg.meeting_time = now.time()
        sg.end_date = now.date() + datetime.timedelta(weeks=5, days=3)
        sg.save()
        sg = StudyGroup.objects.get(pk=1)
        generate_all_meetings(sg)
        self.assertEqual(sg.studygroupmeeting_set.active().count(), 6)
        self.assertTrue(sg.next_meeting().meeting_datetime() - now < datetime.timedelta(days=4))
        generate_reminder(sg)
        self.assertEqual(Reminder.objects.all().count(), 1)
        reminder = Reminder.objects.all()[0]
        #TODO check that email was sent to site admin
        #TODO test with unicode in generated email subject

        # Make sure we do it only once
        generate_reminder(sg)
        self.assertEqual(Reminder.objects.all().count(), 1)
    def test_generate_finished_studygroup_survey_email(self):
        now = timezone.now()
        sg = StudyGroup.objects.get(pk=1)
        sg.timezone = now.strftime("%Z")
        sg.start_date = datetime.date(2010, 1, 1)
        sg.meeting_time = datetime.time(18, 0)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=5)
        sg.save()
        sg = StudyGroup.objects.get(pk=1)
        generate_all_meetings(sg)

        last_meeting = sg.meeting_set.active().order_by(
            'meeting_date', 'meeting_time').last()
        self.assertEqual(last_meeting.meeting_date, datetime.date(2010, 2, 5))
        self.assertEqual(last_meeting.meeting_time, datetime.time(18, 0))
        self.assertEqual(sg.meeting_set.active().count(), 6)
        self.assertEqual(Reminder.objects.all().count(), 0)

        # freeze time to 6 days after last
        with freeze_time("2010-02-11 17:55:34"):
            send_facilitator_survey(sg)
            self.assertEqual(len(mail.outbox), 0)

        # freeze time to 8 days after last
        with freeze_time("2010-02-13 17:55:34"):
            send_facilitator_survey(sg)
            self.assertEqual(len(mail.outbox), 0)

        # freeze time to 7 days after last
        with freeze_time("2010-02-12 17:55:34"):
            send_facilitator_survey(sg)
            self.assertEqual(len(mail.outbox), 1)
            self.assertIn(
                'https://example.net/en/studygroup/{0}/facilitator_survey/'.
                format(sg.id), mail.outbox[0].body)
            self.assertIn(sg.facilitator.email, mail.outbox[0].to)
 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)
Exemple #24
0
    def test_get_learning_circles_signup_open(self):
        # open for signup
        sg = StudyGroup.objects.get(pk=1)
        sg.start_date = datetime.date(2019,6,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        # closed for signup because it's set as closed
        sg = StudyGroup.objects.get(pk=2)
        sg.start_date = datetime.date(2019,5,30)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = False
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        # closed for signup because the last meeting is in the past
        sg = StudyGroup.objects.get(pk=3)
        sg.start_date = datetime.date(2019,5,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        # doesn't show up in results because it's in draft
        sg = StudyGroup.objects.get(pk=4)
        sg.start_date = datetime.date(2019,5,30)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.draft = True
        sg.save()

        c = Client()

        # open for signup
        resp = c.get('/api/learningcircles/?signup=open')
        result = resp.json()
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(result["count"], 1)
        self.assertEqual(result["signup_open_count"], 1)
        self.assertEqual(result["signup_closed_count"], 2)
        self.assertEqual(result['items'][0]['signup_open'], True)

        # closed for signup
        resp = c.get('/api/learningcircles/?signup=closed')
        self.assertEqual(resp.status_code, 200)
        result = resp.json()
        self.assertEqual(result["count"], 2)
        self.assertEqual(result["signup_open_count"], 1)
        self.assertEqual(result["signup_closed_count"], 2)
        self.assertEqual(result['items'][0]['signup_open'], False)
        self.assertEqual(result['items'][1]['signup_open'], False)
Exemple #25
0
    def test_get_learning_cirlces_order(self):
        sg = StudyGroup.objects.get(pk=1)
        sg.start_date = datetime.date(2019,5,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        sg = StudyGroup.objects.get(pk=2)
        sg.start_date = datetime.date(2019,5,8)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        sg = StudyGroup.objects.get(pk=3)
        sg.start_date = datetime.date(2019,5,15)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        sg = StudyGroup.objects.get(pk=4)
        sg.start_date = datetime.date(2019,5,30)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()

        c = Client()

        # ordered by first meeting date (asc)
        resp = c.get('/api/learningcircles/?order=first_meeting_date')
        result = resp.json()
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(result["count"], 4)
        self.assertEqual(result['items'][0]['id'], 1)
        self.assertEqual(result['items'][1]['id'], 2)

        # ordered by last meeting date (desc)
        resp = c.get('/api/learningcircles/?order=last_meeting_date')
        self.assertEqual(resp.status_code, 200)
        result = resp.json()
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(result["count"], 4)
        self.assertEqual(result['items'][0]['id'], 4)
        self.assertEqual(result['items'][1]['id'], 3)
Exemple #26
0
    def test_get_learning_circles_status_closed_completed(self):
        # closed upcoming
        sg = StudyGroup.objects.get(pk=1)
        sg.start_date = datetime.date(2019,6,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = False
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        # closed in progress
        sg = StudyGroup.objects.get(pk=2)
        sg.start_date = datetime.date(2019,5,30)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = False
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        # closed in past (should be completed status)
        sg = StudyGroup.objects.get(pk=3)
        sg.start_date = datetime.date(2019,4,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = False
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        # open in past (should be completed status)
        sg = StudyGroup.objects.get(pk=4)
        sg.start_date = datetime.date(2019,4,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.signup_open = True
        sg.save()

        c = Client()

        resp = c.get('/api/learningcircles/')
        result = resp.json()
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(result["count"], 4)
        self.assertEqual(result["signup_open_count"], 0)
        self.assertEqual(result["signup_closed_count"], 4)
        self.assertEqual(result['items'][0]['status'], 'closed')
        self.assertEqual(result['items'][1]['status'], 'closed')
        self.assertEqual(result['items'][2]['status'], 'completed')
        self.assertEqual(result['items'][3]['status'], 'completed')
    def test_send_learner_surveys(self):
        now = timezone.now()
        sg = StudyGroup.objects.get(pk=1)
        sg.timezone = now.strftime("%Z")
        sg.start_date = datetime.date(2010, 1, 1)
        sg.meeting_time = datetime.time(18, 0)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=6)
        sg.save()
        sg = StudyGroup.objects.get(pk=1)
        generate_all_meetings(sg)

        data = dict(self.APPLICATION_DATA)
        data['study_group'] = sg
        data['email'] = '*****@*****.**'
        application = Application(**data)
        application.save()
        accept_application(application)

        data = dict(self.APPLICATION_DATA)
        data['study_group'] = sg
        data['email'] = '*****@*****.**'
        application = Application(**data)
        accept_application(application)
        application.save()

        mail.outbox = []

        last_meeting = sg.meeting_set.active().order_by(
            'meeting_date', 'meeting_time').last()
        self.assertEqual(last_meeting.meeting_date, datetime.date(2010, 2, 12))
        self.assertEqual(last_meeting.meeting_time, datetime.time(18))
        self.assertEqual(sg.meeting_set.active().count(), 7)
        self.assertEqual(sg.application_set.active().count(), 2)

        # freeze time to 5 minutes before
        with freeze_time("2010-02-05 17:55:34"):
            send_learner_surveys(sg)
            self.assertEqual(len(mail.outbox), 0)

        # 10 minutes after start
        with freeze_time("2010-02-05 18:10:34"):
            send_learner_surveys(sg)
            self.assertEqual(len(mail.outbox), 0)

        # 25 minutes after start
        with freeze_time("2010-02-05 18:25:34"):
            send_learner_surveys(sg)
            self.assertEqual(len(mail.outbox), 2)
            self.assertIn('*****@*****.**',
                          mail.outbox[0].to + mail.outbox[1].to)
            self.assertIn('*****@*****.**',
                          mail.outbox[0].to + mail.outbox[1].to)
            a1 = Application.objects.get(email=mail.outbox[0].to[0])
            self.assertIn(
                'https://example.net/en/studygroup/{}/survey/?learner={}'.
                format(sg.uuid, a1.uuid), mail.outbox[0].body)

        mail.outbox = []
        # 40 minutes after start
        with freeze_time("2010-02-05 18:40:34"):
            send_learner_surveys(sg)
            self.assertEqual(len(mail.outbox), 0)
Exemple #28
0
    def test_send_final_learning_circle_report_email(self):
        organizer = create_user('*****@*****.**', 'organ', 'test', '1234',
                                False)
        facilitator = create_user('*****@*****.**', 'faci', 'test', 'password',
                                  False)
        StudyGroup.objects.filter(pk=1).update(facilitator=facilitator)

        team = Team.objects.create(name='test team')
        TeamMembership.objects.create(team=team,
                                      user=organizer,
                                      role=TeamMembership.ORGANIZER)
        TeamMembership.objects.create(team=team,
                                      user=facilitator,
                                      role=TeamMembership.MEMBER)

        now = timezone.now()
        sg = StudyGroup.objects.get(pk=1)
        sg.timezone = now.strftime("%Z")
        sg.start_date = datetime.date(2010, 1, 1)
        sg.meeting_time = datetime.time(18, 0)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=5)
        sg.save()
        sg = StudyGroup.objects.get(pk=1)
        generate_all_meetings(sg)

        data = dict(self.APPLICATION_DATA)
        data['study_group'] = sg
        data['email'] = '*****@*****.**'
        application = Application(**data)
        application.save()
        accept_application(application)

        mail.outbox = []

        last_meeting = sg.meeting_set.active().order_by(
            'meeting_date', 'meeting_time').last()
        self.assertEqual(last_meeting.meeting_date, datetime.date(2010, 2, 5))
        self.assertEqual(last_meeting.meeting_time, datetime.time(18, 0))
        self.assertEqual(sg.meeting_set.active().count(), 6)
        self.assertEqual(Reminder.objects.all().count(), 0)

        # send time is 7 days after the last meeting
        with freeze_time("2010-02-12 17:30:00"):
            send_final_learning_circle_report(sg)
            self.assertEqual(len(mail.outbox), 0)

        # freeze time to 2 hours after send time
        with freeze_time("2010-02-12 19:30:00"):
            send_final_learning_circle_report(sg)
            self.assertEqual(len(mail.outbox), 0)

        # freeze time to 30 minutes after send time
        with freeze_time("2010-02-12 18:30:00"):
            send_final_learning_circle_report(sg)
            self.assertIn(application.email, mail.outbox[0].bcc)
            self.assertIn(facilitator.email, mail.outbox[0].bcc)
            self.assertIn(organizer.email, mail.outbox[0].bcc)
            self.assertEqual(len(mail.outbox[0].bcc), 3)
            self.assertIn(
                '{0}/en/studygroup/{1}/report/'.format(settings.DOMAIN, sg.id),
                mail.outbox[0].body)
Exemple #29
0
    def test_send_learner_surveys(self):
        now = timezone.now()
        sg = StudyGroup.objects.get(pk=1)
        sg.timezone = now.strftime("%Z")
        sg.start_date = datetime.date(2010, 1, 1)
        sg.meeting_time = datetime.time(18, 0)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=6)
        sg.save()
        sg = StudyGroup.objects.get(pk=1)
        generate_all_meetings(sg)

        data = dict(self.APPLICATION_DATA)
        data['study_group'] = sg
        data['email'] = '*****@*****.**'
        application = Application(**data)
        application.save()
        accept_application(application)

        data = dict(self.APPLICATION_DATA)
        data['study_group'] = sg
        data['email'] = '*****@*****.**'
        application = Application(**data)
        accept_application(application)
        application.save()

        mail.outbox = []

        last_meeting = sg.meeting_set.active().order_by(
            'meeting_date', 'meeting_time').last()
        self.assertEqual(last_meeting.meeting_date, datetime.date(2010, 2, 12))
        self.assertEqual(last_meeting.meeting_time, datetime.time(18))
        self.assertEqual(sg.meeting_set.active().count(), 7)
        self.assertEqual(sg.application_set.active().count(), 2)

        # too soon
        with freeze_time("2010-02-12 16:30:00"):
            send_learner_surveys(sg)
            self.assertEqual(len(mail.outbox), 0)

        # too late
        with freeze_time("2010-02-12 18:30:00"):
            send_learner_surveys(sg)
            self.assertEqual(len(mail.outbox), 0)

        with freeze_time("2010-02-12 17:30:00"):
            send_learner_surveys(sg)
            self.assertEqual(len(mail.outbox), 2)
            self.assertIn('*****@*****.**',
                          mail.outbox[0].to + mail.outbox[1].to)
            self.assertIn('*****@*****.**',
                          mail.outbox[0].to + mail.outbox[1].to)
            a1 = Application.objects.get(email=mail.outbox[0].to[0])
            self.assertIn(
                '{0}/en/studygroup/{1}/survey/?learner={2}'.format(
                    settings.DOMAIN, sg.uuid, a1.uuid), mail.outbox[0].body)

        mail.outbox = []
        # way too late
        with freeze_time("2010-02-13 19:00:00"):
            send_learner_surveys(sg)
            self.assertEqual(len(mail.outbox), 0)
 def form_valid(self, form):
     return_value = super().form_valid(form)
     if form.date_changed and self.object.draft == False:
         self.object.meeting_set.delete()
         generate_all_meetings(self.object)
     return return_value
 def form_valid(self, form):
     self.object = form.save()
     generate_all_meetings(self.object)
     return http.HttpResponseRedirect(self.get_success_url())
Exemple #32
0
    def test_get_learning_circles_by_scope(self):
        sg = StudyGroup.objects.get(pk=1)
        sg.start_date = datetime.date(2019,6,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        sg = StudyGroup.objects.get(pk=2)
        sg.start_date = datetime.date(2019,5,30)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        sg = StudyGroup.objects.get(pk=3)
        sg.start_date = datetime.date(2019,5,1)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.save()
        sg.refresh_from_db()
        generate_all_meetings(sg)

        sg = StudyGroup.objects.get(pk=4)
        sg.start_date = datetime.date(2019,5,30)
        sg.end_date = sg.start_date + datetime.timedelta(weeks=2)
        sg.draft = True
        sg.save()

        c = Client()

        # active scope
        resp = c.get('/api/learningcircles/?scope=active&draft=true')
        data = resp.json()
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(data["count"], 3)
        self.assertEqual(data["items"][0]["id"], 1)
        self.assertEqual(data["items"][1]["id"], 2)
        self.assertEqual(data["items"][2]["id"], 4)
        self.assertEqual(data["items"][2]["draft"], True)

        # upcoming scope
        resp = c.get('/api/learningcircles/?scope=upcoming&draft=true')
        data = resp.json()
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(data["count"], 2)
        self.assertEqual(data["items"][0]["id"], 1)
        self.assertEqual(data["items"][1]["id"], 4)

        # current scope
        resp = c.get('/api/learningcircles/?scope=current')
        data = resp.json()
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.json()["count"], 1)
        self.assertEqual(data["items"][0]["id"], 2)

        # completed scope
        resp = c.get('/api/learningcircles/?scope=completed')
        data = resp.json()
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.json()["count"], 1)
        self.assertEqual(data["items"][0]["id"], 3)