Beispiel #1
0
 def test_staff_area_potential_display_completed(self):
     '''staff_area view should load everything but rejected
         same code for event & staff area, so not retesting
     '''
     context = StaffAreaContext()
     context.conference.status = "completed"
     context.conference.save()
     vol1, opp1 = context.book_volunteer()
     vol2, opp2 = context.book_volunteer(role="Pending Volunteer")
     vol3, opp3 = context.book_volunteer(role="Waitlisted")
     vol4, opp4 = context.book_volunteer(role="Rejected")
     grant_privilege(self.profile, 'Act Coordinator')
     login_as(self.profile, self)
     response = self.client.get(
         "%s?filter=Potential" %
         reverse('staff_area',
                 urlconf="gbe.reporting.urls",
                 args=[context.area.pk]))
     self.assertEqual(response.status_code, 200)
     self.assertContains(response, str(vol1))
     self.assertContains(response, str(vol2))
     self.assertContains(response, str(vol3))
     self.assertNotContains(response, str(vol4))
     self.assertContains(response, role_commit_map["Pending Volunteer"][1])
     self.assertContains(response, role_commit_map["Waitlisted"][1])
     self.assertContains(response, "?filter=Committed")
     self.assertNotContains(response, reverse("edit_staff",
                                              urlconf='gbe.scheduling.urls',
                                              args=[context.area.pk]))
Beispiel #2
0
 def test_send_email_failure_preserve_choices(self):
     staffcontext = StaffAreaContext(conference=self.context.conference)
     volunteer, booking = staffcontext.book_volunteer()
     showcontext = ShowContext(conference=self.context.conference)
     showcontext.set_producer(producer=staffcontext.staff_lead)
     login_as(self.privileged_profile, self)
     data = {
         'to': volunteer.user_object.email,
         'sender': "*****@*****.**",
         'html_message': "<p>Test Message</p>",
         'email-select-conference': [self.context.conference.pk],
         'email-select-roles': [
             "Interested",
         ],
         'event-select-events': showcontext.show.pk,
         'event-select-staff_areas': staffcontext.area.pk,
         'event-select-event_collections': "Volunteer",
         'send': True
     }
     response = self.client.post(self.url, data=data, follow=True)
     assert_checkbox(response, "conference", 0, self.context.conference.pk,
                     self.context.conference.conference_slug)
     assert_checkbox(response, "roles", 0, "Interested", "Interested")
     assert_checkbox(response,
                     "events",
                     0,
                     showcontext.show.pk,
                     showcontext.show.e_title,
                     prefix="event-select")
     assert_checkbox(response,
                     "event_collections",
                     2,
                     "Volunteer",
                     "All Volunteer Events",
                     prefix="event-select")
Beispiel #3
0
    def test_good_user_get_volunteer_w_teacher_as_persona(self):
        grant_privilege(self.privileged_user, 'Volunteer Coordinator')
        login_as(self.privileged_user, self)
        staff_context = StaffAreaContext()
        volunteer_sched_event = staff_context.add_volunteer_opp()
        volunteer_sched_event.approval_needed = True
        volunteer_sched_event.save()
        teacher = PersonaFactory()
        teacher, alloc = staff_context.book_volunteer(
            volunteer_sched_event=volunteer_sched_event,
            volunteer=teacher,
            role="Teacher")
        url = reverse(self.view_name,
                      urlconf="gbe.scheduling.urls",
                      args=[staff_context.conference.conference_slug,
                            volunteer_sched_event.pk])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<input type="checkbox" name="approval" ' +
            'id="id_approval" checked />',
            html=True)

        self.assertContains(
            response,
            '<option value="%d" selected>%s</option>' % (
                staff_context.area.pk,
                staff_context.area),
            html=True)
Beispiel #4
0
 def test_send_email_success_email_sent(self):
     staffcontext = StaffAreaContext(conference=self.context.conference)
     volunteer, booking = staffcontext.book_volunteer()
     showcontext = ShowContext(conference=self.context.conference)
     showcontext.set_producer(producer=staffcontext.staff_lead)
     login_as(staffcontext.staff_lead, self)
     data = {
         'to': volunteer.user_object.email,
         'sender': staffcontext.staff_lead.user_object.email,
         'subject': "Subject",
         'html_message': "<p>Test Message</p>",
         'email-select-conference': [self.context.conference.pk],
         'email-select-roles': [
             "Volunteer",
         ],
         'event-select-events': showcontext.show.pk,
         'event-select-staff_areas': staffcontext.area.pk,
         'event-select-event_collections': "Volunteer",
         'send': True
     }
     response = self.client.post(self.url, data=data, follow=True)
     assert_queued_email(
         [
             volunteer.user_object.email,
         ],
         data['subject'],
         data['html_message'],
         data['sender'],
     )
Beispiel #5
0
 def test_send_email_success_email_sent(self):
     staffcontext = StaffAreaContext(conference=self.context.conference)
     volunteer, booking = staffcontext.book_volunteer()
     showcontext = ShowContext(conference=self.context.conference)
     showcontext.set_producer(producer=staffcontext.staff_lead)
     login_as(staffcontext.staff_lead, self)
     data = {
         'to': volunteer.user_object.email,
         'sender': staffcontext.staff_lead.user_object.email,
         'subject': "Subject",
         'html_message': "<p>Test Message</p>",
         'email-select-conference': [self.context.conference.pk],
         'email-select-roles': ["Volunteer", ],
         'event-select-events': showcontext.show.pk,
         'event-select-staff_areas': staffcontext.area.pk,
         'event-select-event_collections': "Volunteer",
         'send': True
     }
     response = self.client.post(self.url, data=data, follow=True)
     assert_queued_email(
         [volunteer.user_object.email, ],
         data['subject'],
         data['html_message'],
         data['sender'],
         )
 def test_volunteer_changestate_gives_event_over_full_warning(self):
     ProfilePreferencesFactory(profile=self.volunteer.profile)
     context = StaffAreaContext(
         conference=self.volunteer.b_conference,
     )
     opp = context.add_volunteer_opp()
     context.book_volunteer(
         volunteer_sched_event=opp,
         volunteer=context.staff_lead)
     url = reverse(self.view_name,
                   args=[self.volunteer.pk],
                   urlconf='gbe.urls')
     login_as(self.privileged_user, self)
     data = {'conference': self.volunteer.b_conference,
             'events': [opp.pk],
             'accepted': 3}
     response = self.client.post(url, data=data, follow=True)
     self.assertContains(response, "OCCURRENCE_OVERBOOKED")
 def test_get_staff_area(self):
     staff_context = StaffAreaContext(conference=self.context.conference)
     volunteer, booking = staff_context.book_volunteer(
         role="Pending Volunteer")
     login_as(self.privileged_user, self)
     response = self.client.get(
         self.url, {'conf_slug': self.context.conference.conference_slug})
     self.assert_volunteer_state(response, booking)
     self.assertContains(response, str(staff_context.area))
Beispiel #8
0
 def test_staff_area_role_display(self):
     '''staff_area view should load only the actually assigned volunteer
     '''
     context = StaffAreaContext()
     vol1, opp1 = context.book_volunteer()
     vol2, opp2 = context.book_volunteer(role="Pending Volunteer")
     vol3, opp3 = context.book_volunteer(role="Waitlisted")
     vol4, opp4 = context.book_volunteer(role="Rejected")
     grant_privilege(self.profile, 'Act Reviewers')
     login_as(self.profile, self)
     response = self.client.get(self.url)
     self.assertEqual(response.status_code, 200)
     self.assertContains(response, str(vol1))
     self.assertContains(response, str(vol2))
     self.assertContains(response, str(vol3))
     self.assertNotContains(response, str(vol4))
     self.assertContains(
         response, reverse("review_pending", urlconf='gbe.scheduling.urls'))
     self.assertContains(response, context.area.title)
 def test_no_available_volunteers(self):
     context = StaffAreaContext()
     volunteer_opp = context.add_volunteer_opp()
     volunteer, alloc = context.book_volunteer(volunteer_opp)
     login_as(self.privileged_profile, self)
     response = self.client.get(reverse(
         self.view_name,
         args=[context.conference.conference_slug, volunteer_opp.pk],
         urlconf="gbe.scheduling.urls"),
                                follow=True)
     assert ("no available volunteers" in response.content)
 def test_no_available_volunteers(self):
     context = StaffAreaContext()
     volunteer_opp = context.add_volunteer_opp()
     volunteer, alloc = context.book_volunteer(
         volunteer_opp)
     login_as(self.privileged_profile, self)
     response = self.client.get(
         reverse(
             self.view_name,
             args=[context.conference.conference_slug,
                   volunteer_opp.pk],
             urlconf="gbe.scheduling.urls"),
         follow=True)
     assert ("no available volunteers" in response.content)
 def test_view_volunteers_waitlisted(self):
     context = StaffAreaContext(conference=self.conf)
     volunteer, booking = context.book_volunteer(role="Waitlisted")
     opportunity = booking.event
     opportunity.starttime = datetime.now() + timedelta(days=1)
     opportunity.save()
     login_as(volunteer, self)
     url = reverse("event_list",
                   urlconf="gbe.scheduling.urls",
                   args=["Volunteer"])
     response = self.client.get(
         url, data={"conference": self.conf.conference_slug})
     self.assertContains(response, opportunity.eventitem.e_title)
     self.assertContains(response, "You were waitlisted for this shift.")
Beispiel #12
0
 def test_staff_area_with_inactive(self):
     '''staff_area view should load
     '''
     context = StaffAreaContext()
     inactive = ProfileFactory(display_name="DON'T SEE THIS",
                               user_object__is_active=False)
     vol, opp = context.book_volunteer(volunteer=inactive)
     grant_privilege(self.profile, 'Act Reviewers')
     login_as(self.profile, self)
     response = self.client.get("%s?area=Staff" % reverse(
         'staff_area', urlconf="gbe.reporting.urls", args=[context.area.pk
                                                           ]))
     self.assertEqual(response.status_code, 200)
     self.assertTrue('<tr style="color:red;">' in response.content)
 def test_staff_area_role_display(self):
     vol_context = VolunteerContext(event=self.context.show,
                                    sched_event=self.context.sched_event)
     context = StaffAreaContext(conference=self.context.conference)
     EventLabelFactory(event=vol_context.opp_event, text=context.area.slug)
     vol1, opp1 = context.book_volunteer(
         volunteer_sched_event=vol_context.opp_event)
     vol2, opp2 = context.book_volunteer(
         volunteer_sched_event=vol_context.opp_event,
         role="Pending Volunteer")
     vol3, opp3 = context.book_volunteer(
         volunteer_sched_event=vol_context.opp_event, role="Waitlisted")
     vol4, opp4 = context.book_volunteer(
         volunteer_sched_event=vol_context.opp_event, role="Rejected")
     login_as(self.profile, self)
     response = self.client.get(self.url)
     self.assertEqual(response.status_code, 200)
     self.assertContains(response, str(vol1))
     self.assertContains(response, str(vol2))
     self.assertContains(response, str(vol3))
     self.assertNotContains(response, str(vol4))
     self.assertNotContains(
         response,
         reverse("approve_volunteer",
                 urlconf='gbe.scheduling.urls',
                 args=['approve', vol1.pk, opp1.pk]))
     self.assertContains(
         response,
         reverse("approve_volunteer",
                 urlconf='gbe.scheduling.urls',
                 args=['approve', vol2.pk, opp2.pk]))
     self.assertContains(
         response,
         reverse("approve_volunteer",
                 urlconf='gbe.scheduling.urls',
                 args=['approve', vol3.pk, opp3.pk]))
     self.assertContains(response, context.area.title)
Beispiel #14
0
 def test_good_user_get_volunteer_w_teacher_as_persona(self):
     grant_privilege(self.privileged_user, 'Volunteer Coordinator')
     login_as(self.privileged_user, self)
     staff_context = StaffAreaContext()
     volunteer_sched_event = staff_context.add_volunteer_opp()
     teacher = PersonaFactory()
     teacher, alloc = staff_context.book_volunteer(
         volunteer_sched_event=volunteer_sched_event,
         volunteer=teacher,
         role="Teacher")
     url = reverse(self.view_name,
                   urlconf="gbe.scheduling.urls",
                   args=[staff_context.conference.conference_slug,
                         volunteer_sched_event.pk])
     response = self.client.get(url)
Beispiel #15
0
 def test_staff_area_default_display(self):
     '''staff_area view should load only the actually assigned volunteer
     '''
     context = StaffAreaContext()
     vol1, opp1 = context.book_volunteer()
     vol2, opp2 = context.book_volunteer(role="Pending Volunteer")
     vol3, opp3 = context.book_volunteer(role="Waitlisted")
     vol4, opp4 = context.book_volunteer(role="Rejected")
     grant_privilege(self.profile, 'Act Coordinator')
     login_as(self.profile, self)
     response = self.client.get(
         reverse('staff_area',
                 urlconf="gbe.reporting.urls",
                 args=[context.area.pk]))
     self.assertEqual(response.status_code, 200)
     self.assertContains(response, str(vol1))
     self.assertContains(response, role_commit_map["Volunteer"][1])
     self.assertNotContains(response, str(vol2))
     self.assertNotContains(response, str(vol3))
     self.assertNotContains(response, str(vol4))
     self.assertContains(response, "?filter=Potential")
     self.assertContains(response, reverse("edit_staff",
                                           urlconf='gbe.scheduling.urls',
                                           args=[context.area.pk]))
Beispiel #16
0
 def test_pick_all_vol_reduced_priv(self):
     staffcontext = StaffAreaContext()
     volunteer, booking = staffcontext.book_volunteer()
     special = GenericEventFactory(
         e_conference=staffcontext.conference)
     specialstaffcontext = VolunteerContext(
         event=special,
     )
     login_as(staffcontext.staff_lead, self)
     data = {
         'email-select-conference': [staffcontext.conference.pk, ],
         'email-select-roles': ['Volunteer', ],
         'event-select-event_collections': "Volunteer",
         'refine': True,
     }
     response = self.client.post(self.url, data=data, follow=True)
     self.assertNotContains(
         response,
         self.context.teacher.contact.user_object.email)
     self.assertContains(
         response,
         volunteer.user_object.email)
     self.assertContains(
         response,
         specialstaffcontext.profile.user_object.email)
     assert_checkbox(
         response,
         "events",
         0,
         special.pk,
         special.e_title,
         checked=False,
         prefix="event-select")
     assert_checkbox(
         response,
         "staff_areas",
         0,
         staffcontext.area.pk,
         staffcontext.area.title,
         checked=False,
         prefix="event-select")
     assert_checkbox(
         response,
         "event_collections",
         0,
         "Volunteer",
         "All Volunteer Events",
         prefix="event-select")
    def test_staff_lead_button(self):
        show_context = ActTechInfoContext(schedule_rehearsal=True)
        vol_context = VolunteerContext(event=show_context.show,
                                       sched_event=show_context.sched_event)
        context = StaffAreaContext(conference=show_context.conference)
        EventLabelFactory(event=vol_context.opp_event,
                          text=context.area.slug)
        vol1, opp1 = context.book_volunteer(
            volunteer_sched_event=vol_context.opp_event,
            volunteer=context.staff_lead)
        self.profile = context.staff_lead

        response = self.get_landing_page()
        self.assertContains(response, reverse(
            'show_dashboard',
            urlconf='gbe.scheduling.urls',
            args=[show_context.sched_event.pk]))
 def test_view_volunteer_filled(self):
     staff_context = StaffAreaContext(conference=self.conf)
     volunteer, booking = staff_context.book_volunteer()
     opportunity = booking.event
     opportunity.starttime = datetime.now() + timedelta(days=1)
     opportunity.max_volunteers = 1
     opportunity.save()
     url = reverse("event_list",
                   urlconf="gbe.scheduling.urls",
                   args=["Volunteer"])
     response = self.client.get(
         url, data={"conference": self.conf.conference_slug})
     vol_link = reverse('set_volunteer',
                        args=[opportunity.pk, 'on'],
                        urlconf='gbe.scheduling.urls')
     self.assertContains(response, opportunity.eventitem.e_title)
     self.assertContains(response,
                         'This event has all the volunteers it needs.')
Beispiel #19
0
 def test_volunteer_approval_pending(self):
     context = StaffAreaContext()
     volunteer, booking = context.book_volunteer(role="Pending Volunteer")
     opportunity = booking.event
     opportunity.approval_needed = True
     opportunity.starttime = datetime.now() + timedelta(days=1)
     opportunity.save()
     login_as(volunteer, self)
     url = reverse(self.view_name,
                   urlconf="gbe.scheduling.urls",
                   args=[opportunity.eventitem_id])
     response = self.client.get(url)
     vol_link = reverse('set_volunteer',
                        args=[opportunity.pk, 'off'],
                        urlconf='gbe.scheduling.urls')
     self.assertContains(response, opportunity.eventitem.e_title)
     self.assertContains(response, vol_link)
     self.assertContains(response, 'awaiting_approval.gif')
Beispiel #20
0
 def test_send_email_failure_preserve_choices(self):
     staffcontext = StaffAreaContext(conference=self.context.conference)
     volunteer, booking = staffcontext.book_volunteer()
     showcontext = ShowContext(conference=self.context.conference)
     showcontext.set_producer(producer=staffcontext.staff_lead)
     login_as(self.privileged_profile, self)
     data = {
         'to': volunteer.user_object.email,
         'sender': "*****@*****.**",
         'html_message': "<p>Test Message</p>",
         'email-select-conference': [self.context.conference.pk],
         'email-select-roles': ["Interested", ],
         'event-select-events': showcontext.show.pk,
         'event-select-staff_areas': staffcontext.area.pk,
         'event-select-event_collections': "Volunteer",
         'send': True
     }
     response = self.client.post(self.url, data=data, follow=True)
     assert_checkbox(
         response,
         "conference",
         0,
         self.context.conference.pk,
         self.context.conference.conference_slug)
     assert_checkbox(
         response,
         "roles",
         0,
         "Interested",
         "Interested")
     assert_checkbox(
         response,
         "events",
         0,
         showcontext.show.pk,
         showcontext.show.e_title,
         prefix="event-select")
     assert_checkbox(
         response,
         "event_collections",
         2,
         "Volunteer",
         "All Volunteer Events",
         prefix="event-select")
Beispiel #21
0
 def test_send_email_success_status(self):
     staffcontext = StaffAreaContext(conference=self.context.conference)
     volunteer, booking = staffcontext.book_volunteer()
     login_as(self.privileged_profile, self)
     data = {
         'to': volunteer.user_object.email,
         'sender': self.privileged_profile.user_object.email,
         'subject': "Subject",
         'html_message': "<p>Test Message</p>",
         'email-select-conference': [self.context.conference.pk],
         'email-select-roles': ["Performer", "Volunteer"],
         'event-select-staff_areas': staffcontext.area.pk,
         'event-select-event_collections': "Volunteer",
         'send': True
     }
     response = self.client.post(self.url, data=data, follow=True)
     assert_alert_exists(
         response, 'success', 'Success',
         "%s%s" % (send_email_success_msg, volunteer.user_object.email))
Beispiel #22
0
 def test_staff_area_with_inactive(self):
     '''staff_area view should load
     '''
     context = StaffAreaContext()
     inactive = ProfileFactory(
         display_name="DON'T SEE THIS",
         user_object__is_active=False
     )
     vol, opp = context.book_volunteer(volunteer=inactive)
     grant_privilege(self.profile, 'Act Coordinator')
     login_as(self.profile, self)
     response = self.client.get(
         reverse('staff_area',
                 urlconf="gbe.reporting.urls",
                 args=[context.area.pk]))
     self.assertEqual(response.status_code, 200)
     self.assertContains(
         response,
         '<tr class="gbe-form-error">')
Beispiel #23
0
 def test_staff_area_conference_completed(self):
     '''staff_area view should load everything but rejected
         same code for event & staff area, so not retesting
     '''
     context = StaffAreaContext()
     context.conference.status = "completed"
     context.conference.save()
     vol1, opp1 = context.book_volunteer()
     grant_privilege(self.profile, 'Act Reviewers')
     login_as(self.profile, self)
     response = self.client.get(
         "%s?conf_slug=%s" % (self.url, context.conference.conference_slug))
     self.assertEqual(response.status_code, 200)
     self.assertContains(response, str(vol1))
     self.assertNotContains(
         response,
         reverse('edit_event',
                 urlconf='gbe.scheduling.urls',
                 args=[context.conference.conference_slug, opp1.event.pk]))
Beispiel #24
0
 def test_staff_area_with_inactive(self):
     '''staff_area view should load
     '''
     context = StaffAreaContext()
     inactive = ProfileFactory(
         display_name="DON'T SEE THIS",
         user_object__is_active=False
     )
     vol, opp = context.book_volunteer(volunteer=inactive)
     grant_privilege(self.profile, 'Act Reviewers')
     login_as(self.profile, self)
     response = self.client.get(
         "%s?area=Staff" %
         reverse('staff_area',
                 urlconf="gbe.reporting.urls",
                 args=[context.area.pk]))
     self.assertEqual(response.status_code, 200)
     self.assertTrue(
         '<tr style="color:red;">' in response.content)
Beispiel #25
0
 def test_pick_all_vol_reduced_priv(self):
     staffcontext = StaffAreaContext()
     volunteer, booking = staffcontext.book_volunteer()
     special = GenericEventFactory(e_conference=staffcontext.conference)
     specialstaffcontext = VolunteerContext(event=special, )
     login_as(staffcontext.staff_lead, self)
     data = {
         'email-select-conference': [
             staffcontext.conference.pk,
         ],
         'email-select-roles': [
             'Volunteer',
         ],
         'event-select-event_collections': "Volunteer",
         'refine': True,
     }
     response = self.client.post(self.url, data=data, follow=True)
     self.assertNotContains(response,
                            self.context.teacher.contact.user_object.email)
     self.assertContains(response, volunteer.user_object.email)
     self.assertContains(response,
                         specialstaffcontext.profile.user_object.email)
     assert_checkbox(response,
                     "events",
                     0,
                     special.pk,
                     special.e_title,
                     checked=False,
                     prefix="event-select")
     assert_checkbox(response,
                     "staff_areas",
                     0,
                     staffcontext.area.pk,
                     staffcontext.area.title,
                     checked=False,
                     prefix="event-select")
     assert_checkbox(response,
                     "event_collections",
                     0,
                     "Volunteer",
                     "All Volunteer Events",
                     prefix="event-select")
Beispiel #26
0
 def test_send_email_success_status(self):
     staffcontext = StaffAreaContext(conference=self.context.conference)
     volunteer, booking = staffcontext.book_volunteer()
     login_as(self.privileged_profile, self)
     data = {
         'to': volunteer.user_object.email,
         'sender': self.privileged_profile.user_object.email,
         'subject': "Subject",
         'html_message': "<p>Test Message</p>",
         'email-select-conference': [self.context.conference.pk],
         'email-select-roles': ["Performer", "Volunteer"],
         'event-select-staff_areas': staffcontext.area.pk,
         'event-select-event_collections': "Volunteer",
         'send': True
     }
     response = self.client.post(self.url, data=data, follow=True)
     assert_alert_exists(
         response, 'success', 'Success', "%s%s" % (
             send_email_success_msg,
             volunteer.user_object.email))
 def test_good_user_get_no_create_edit(self):
     old_conf_day = ConferenceDayFactory(
         conference__status="completed",
         day=self.day.day + timedelta(3))
     context = ClassContext(conference=old_conf_day.conference)
     vol_context = VolunteerContext(conference=old_conf_day.conference)
     staff_context = StaffAreaContext(conference=old_conf_day.conference)
     booking, self.vol_opp = staff_context.book_volunteer()
     data = {
         "%s-calendar_type" % old_conf_day.conference.conference_slug: [
             0, 1, 2],
         "filter": "Filter",
     }
     login_as(self.privileged_profile, self)
     url = reverse(self.view_name,
                   urlconf="gbe.scheduling.urls",
                   args=[old_conf_day.conference.conference_slug])
     response = self.client.get(url, data)
     self.assertContains(
         response,
         '<i class="fa fa-trash-o" aria-hidden="true">')
     self.assertNotContains(
         response,
         '<i class="fa fa-pencil" aria-hidden="true">')
     self.assertNotContains(
         response,
         '<i class="fa fa-plus" aria-hidden="true">')
     self.assertContains(response, vol_context.opportunity.e_title)
     self.assertContains(response, reverse(
         'detail_view',
         urlconf='gbe.scheduling.urls',
         args=[vol_context.event.eventitem_id]))
     self.assertContains(response, vol_context.event.e_title)
     self.assertNotContains(response, reverse(
         "edit_staff",
         urlconf="gbe.scheduling.urls",
         args=[staff_context.area.pk]))
class TestCalendarView(TestCase):

    def setUp(self):
        self.client = Client()
        clear_conferences()
        conference = ConferenceFactory()
        save_the_date = datetime(2016, 2, 6, 12, 0, 0)
        day = ConferenceDayFactory(
            conference=conference,
            day=date(2016, 2, 6))
        self.staffcontext = StaffAreaContext(
            conference=conference,
            starttime=save_the_date)
        self.showcontext = ShowContext(conference=conference,
                                       starttime=save_the_date)
        self.other_conference = ConferenceFactory(
            status='completed')
        self.other_conf_day = ConferenceDayFactory(
            conference=self.other_conference,
            day=date(2015, 2, 6))
        self.other_show = ShowContext(conference=self.other_conference)
        self.classcontext = ClassContext(
            conference=conference,
            starttime=save_the_date)
        self.volunteeropp = self.staffcontext.add_volunteer_opp()

    def test_calendar_generic_w_default_conf(self):
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<div class="col-lg-12">%s' % (
                self.showcontext.conference.conference_name))
        self.assertContains(response, self.showcontext.show.e_title)
        self.assertContains(
            response,
            self.showcontext.sched_event.starttime.strftime("%-I:%M %p"))
        self.assertContains(
            response,
            self.showcontext.sched_event.end_time.strftime("%-I:%M %p"))
        self.assertNotContains(response, self.other_show.show.e_title)
        self.assertNotContains(response, self.classcontext.bid.e_title)
        self.assertNotContains(response, self.volunteeropp.eventitem.e_title)
        self.assertNotContains(response, reverse(
            'show_dashboard',
            urlconf='gbe.scheduling.urls',
            args=[self.showcontext.sched_event.pk]))

    def test_calendar_priv_dash_link(self):
        profile = ProfileFactory()
        grant_privilege(profile, 'Schedule Mavens')
        login_as(profile, self)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        response = self.client.get(url)
        self.assertContains(response, self.showcontext.show.e_title)
        self.assertContains(response, reverse(
            'show_dashboard',
            urlconf='gbe.scheduling.urls',
            args=[self.showcontext.sched_event.pk]))

    def test_calendar_conference_w_default_conf(self):
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Conference'])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<div class="col-lg-12">%s' % (
                self.showcontext.conference.conference_name))
        self.assertNotContains(response, self.showcontext.show.e_title)
        self.assertNotContains(response, self.other_show.show.e_title)
        self.assertContains(response, self.classcontext.bid.e_title)
        self.assertContains(response, "Teacher:  %s" % (
            self.classcontext.bid.teacher.name))
        self.assertNotContains(response, self.volunteeropp.eventitem.e_title)

    def test_calendar_volunteer_w_default_conf(self):
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<div class="col-lg-12">%s' % (
                self.showcontext.conference.conference_name))
        self.assertNotContains(response, self.showcontext.show.e_title)
        self.assertNotContains(response, self.other_show.show.e_title)
        self.assertNotContains(response, self.classcontext.bid.e_title)
        self.assertContains(response, self.volunteeropp.eventitem.e_title)

    def test_calendar_conference_w_default_conf_public_days(self):
        conference_day = ConferenceDayFactory(
            conference=self.staffcontext.conference,
            day=date(2016, 2, 5),
            open_to_public=False)
        conference_day = ConferenceDayFactory(
            conference=self.staffcontext.conference,
            day=date(2016, 2, 7),
            open_to_public=False)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Conference'])
        response = self.client.get(url)
        self.assertContains(response, "btn disabled", 2)
        self.assertContains(response, "Feb. 6, 2016", 1)

    def test_calendar_volunteer_w_default_conf_public_days(self):
        conference_day = ConferenceDayFactory(
            conference=self.staffcontext.conference,
            day=date(2016, 2, 5),
            open_to_public=False)
        conference_day = ConferenceDayFactory(
            conference=self.staffcontext.conference,
            day=date(2016, 2, 7),
            open_to_public=False)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        data = {'day': "02-06-2016"}
        response = self.client.get(url, data=data)
        self.assertNotContains(response, "btn disabled")

    def test_calendar_shows_requested_conference(self):
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        data = {'conference': self.other_conference.conference_slug}
        response = self.client.get(url, data=data)
        self.assertNotContains(response, self.showcontext.show.e_title)
        self.assertContains(response, self.other_show.show.e_title)

    def test_no_conference_days(self):
        clear_conferences()
        ConferenceFactory(status='upcoming')
        url = reverse('calendar',
                      urlconf='gbe.scheduling.urls',
                      args=['Conference'])
        response = self.client.get(url)
        self.assertContains(
            response,
            'This calendar is not currently available.')

    def test_bad_day(self):
        '''
        There is a day, but that's not the day we're asking for.
        '''
        clear_conferences()
        conference = ConferenceFactory(status='upcoming')
        conference_day = ConferenceDayFactory(
            conference=conference,
            day=date(2016, 2, 6))
        url = reverse('calendar',
                      urlconf='gbe.scheduling.urls',
                      args=['Conference'])
        data = {'day': "02-02-2016"}
        response = self.client.get(url, data=data, follow=True)
        self.assertEqual(response.status_code, 404)

    def test_invalid_day(self):
        '''
        There is a day, but that's not the day we're asking for.
        '''
        url = reverse('calendar',
                      urlconf='gbe.scheduling.urls',
                      args=['Conference'])
        data = {'day': "DEADBEEF"}
        response = self.client.get(url, data=data, follow=True)
        self.assertEqual(response.status_code, 404)

    def test_bad_cal_type(self):
        url = reverse('calendar',
                      urlconf='gbe.scheduling.urls',
                      args=['Bad'])
        response = self.client.get(url, follow=True)
        self.assertEqual(response.status_code, 404)

    def test_one_day(self):
        '''
        There is no day but today, so no navigation
        '''
        clear_conferences()
        conference = ConferenceFactory(status='upcoming')
        conference_day = ConferenceDayFactory(
            conference=conference,
            day=date(2016, 2, 6))
        url = reverse('calendar',
                      urlconf='gbe.scheduling.urls',
                      args=['Conference'])
        data = {'day': "02-06-2016"}
        response = self.client.get(url, data=data)
        self.assertContains(response, "btn disabled", 2)

    def test_day_before(self):
        '''
        There is no day but today, so no navigation
        '''
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        ConferenceDayFactory(
            conference=self.other_conference,
            day=date(2015, 2, 7))
        data = {'day': "02-06-2015"}
        response = self.client.get(url, data=data)
        self.assertContains(
            response,
            '<a href="?day=02-07-2015" ' +
            'data-toggle="tooltip" title="02-07-2015">')

    def test_day_after(self):
        '''
        There is no day but today, so no navigation
        '''
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        ConferenceDayFactory(
            conference=self.other_conference,
            day=date(2015, 2, 7))
        data = {'day': "02-07-2015"}
        response = self.client.get(url, data=data)
        self.assertContains(
            response,
            '<a href="?day=02-06-2015" ' +
            'data-toggle="tooltip" title="02-06-2015">')

    def test_no_sched_events(self):
        '''
        There is a day, but that's not the day we're asking for.
        '''
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        ConferenceDayFactory(
            conference=self.other_conference,
            day=date(2015, 2, 7))
        data = {'day': "02-07-2015"}
        response = self.client.get(url, data=data)
        self.assertContains(
            response,
            "There are no general events scheduled for this day.")

    def test_calendar_1_event_per_hour(self):
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<div class="col-lg-12 col-md-12 col-sm-12 col-12">',
            1)

    def test_calendar_2_event_per_hour(self):
        two_opp = self.staffcontext.add_volunteer_opp()
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<div class="col-lg-6 col-md-6 col-sm-6 col-12">',
            2)
        self.assertContains(response, two_opp.eventitem.e_title)

    def test_calendar_3_event_per_hour(self):
        self.staffcontext.add_volunteer_opp()
        three_opp = self.staffcontext.add_volunteer_opp()
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<div class="col-lg-4 col-md-4 col-sm-6 col-12">',
            3)

    def test_calendar_4_event_per_hour(self):
        for n in range(0, 2):
            self.staffcontext.add_volunteer_opp()
        three_opp = self.staffcontext.add_volunteer_opp()
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<div class="col-lg-3 col-md-4 col-sm-6 col-12">',
            4)

    def test_calendar_6_event_per_hour(self):
        for n in range(0, 4):
            self.staffcontext.add_volunteer_opp()
        three_opp = self.staffcontext.add_volunteer_opp()
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<div class="col-lg-2 col-md-4 col-sm-6 col-12">',
            6)

    def test_calendar_10_event_per_hour(self):
        for n in range(0, 8):
            self.staffcontext.add_volunteer_opp()
        three_opp = self.staffcontext.add_volunteer_opp()
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        response = self.client.get(url)
        self.assertContains(
            response,
            '<div class="col-lg-2 col-md-4 col-sm-6 col-12">',
            10)

    def test_logged_in_no_interest(self):
        profile = ProfileFactory()
        login_as(profile, self)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        data = {'day': "02-06-2016"}
        response = self.client.get(url, data=data)
        set_fav_link = reverse(
            "set_favorite",
            args=[self.showcontext.sched_event.pk, "on"],
            urlconf="gbe.scheduling.urls")
        self.assertContains(response, "%s?next=%s" % (
            set_fav_link,
            url))

    def test_logged_in_have_interest(self):
        profile = self.showcontext.set_interest()
        login_as(profile, self)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        data = {'day': "02-06-2016"}
        response = self.client.get(url, data=data)
        set_fav_link = reverse(
            "set_favorite",
            args=[self.showcontext.sched_event.pk, "off"],
            urlconf="gbe.scheduling.urls")
        self.assertContains(response, "%s?next=%s" % (
            set_fav_link,
            url))
        self.assertContains(
            response,
            '<div class="col-lg-12 col-md-12 col-sm-12 col-12 interested">')

    def test_logged_in_no_profile(self):
        user = UserFactory()
        login_as(user, self)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        data = {'day': "02-06-2016"}
        response = self.client.get(url, data=data)
        set_fav_link = reverse(
            "set_favorite",
            args=[self.showcontext.sched_event.pk, "on"],
            urlconf="gbe.scheduling.urls")
        self.assertContains(response, "%s?next=%s" % (
            set_fav_link,
            url))

    def test_calendar_old_conference(self):
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        data = {'conference': self.other_conference.conference_slug}
        response = self.client.get(url, data=data)
        self.assertNotContains(response, self.showcontext.show.e_title)
        set_fav_link = reverse(
            "set_favorite",
            args=[self.showcontext.sched_event.pk, "off"],
            urlconf="gbe.scheduling.urls")
        self.assertNotContains(response, "%s?next=%s" % (
            set_fav_link,
            url))
        set_unfav_link = reverse(
            "set_favorite",
            args=[self.showcontext.sched_event.pk, "on"],
            urlconf="gbe.scheduling.urls")
        self.assertNotContains(response, "%s?next=%s" % (
            set_unfav_link,
            url))

    def test_logged_in_teacher(self):
        login_as(self.classcontext.teacher.performer_profile, self)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Conference'])
        data = {'day': "02-06-2016"}
        response = self.client.get(url, data=data)
        self.assertContains(
            response,
            '<a href="#" class="cal-favorite detail_link-disabled')
        self.assertContains(
            response,
            '<div class="col-lg-12 col-md-12 col-sm-12 col-12 teacher">')
        self.assertNotContains(response,
                               'fa-tachometer')

    def test_logged_in_performer(self):
        login_as(self.showcontext.performer.performer_profile, self)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['General'])
        data = {'day': "02-06-2016"}
        response = self.client.get(url, data=data)
        self.assertContains(
            response,
            '<a href="#" class="cal-favorite detail_link-disabled')
        self.assertContains(
            response,
            '<div class="col-lg-12 col-md-12 col-sm-12 col-12 performer">')

    def test_logged_in_volunteer(self):
        volunteer, booking = self.staffcontext.book_volunteer()
        opportunity = booking.event
        opportunity.starttime = datetime.now() + timedelta(days=1)
        opportunity.save()
        ConferenceDayFactory(conference=self.staffcontext.conference,
                             day=opportunity.starttime)
        login_as(volunteer, self)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        response = self.client.get(url, data={
            'day': opportunity.starttime.strftime('%m-%d-%Y')}, follow=True)
        self.assertContains(response, opportunity.eventitem.e_title)
        self.assertContains(response,
                            'class="volunteer-icon" alt="You\'ve signed up"/>')

    def test_volunteer_event_full(self):
        volunteer, booking = self.staffcontext.book_volunteer()
        opportunity = booking.event
        opportunity.starttime = datetime.now() + timedelta(days=1)
        opportunity.max_volunteers = 1
        opportunity.save()
        ConferenceDayFactory(conference=self.staffcontext.conference,
                             day=opportunity.starttime)
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Volunteer'])
        response = self.client.get(url, data={
            'day': opportunity.starttime.strftime('%m-%d-%Y')}, follow=True)
        self.assertContains(response, opportunity.eventitem.e_title)
        self.assertContains(
          response,
          'This event has all the volunteers it needs.')

    def test_disabled_eval(self):
        eval_profile = self.classcontext.set_eval_answerer()
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Conference'])
        login_as(eval_profile, self)
        data = {'day': "02-06-2016"}
        response = self.client.get(url, data=data)
        eval_link = reverse(
            "eval_event",
            args=[self.classcontext.sched_event.pk, ],
            urlconf="gbe.scheduling.urls")
        self.assertNotContains(response, "%s?next=%s" % (
            eval_link,
            url))
        self.assertContains(response, "You have already rated this class")

    def test_eval_ready(self):
        self.classcontext.setup_eval()
        url = reverse('calendar',
                      urlconf="gbe.scheduling.urls",
                      args=['Conference'])
        data = {'day': "02-06-2016"}
        response = self.client.get(url, data=data)
        eval_link = reverse(
            "eval_event",
            args=[self.classcontext.sched_event.pk, ],
            urlconf="gbe.scheduling.urls")
        self.assertContains(response, "%s?next=%s" % (
            eval_link,
            url))
class TestVolunteerSignupView(TestCase):
    def setUp(self):
        self.url = reverse('volunteer_signup', urlconf="gbe.scheduling.urls")
        self.client = Client()
        self.profile = ProfileFactory()
        clear_conferences()
        conference = ConferenceFactory()
        save_the_date = datetime(2016, 2, 6, 12, 0, 0)
        day = ConferenceDayFactory(conference=conference,
                                   day=date(2016, 0o2, 0o6))
        self.staffcontext = StaffAreaContext(conference=conference,
                                             starttime=save_the_date)
        self.volunteeropp = self.staffcontext.add_volunteer_opp()

    def basic_event_check(self,
                          response,
                          conference,
                          occurrence,
                          image,
                          action="on"):
        self.assertContains(response, conference.conference_name)
        self.assertContains(response, occurrence.eventitem.child().e_title)
        self.assertContains(response,
                            occurrence.start_time.strftime("%-I:%M %p"))
        self.assertContains(response,
                            occurrence.end_time.strftime("%-I:%M %p"))
        self.assertContains(response, image)
        self.assertContains(
            response,
            reverse('set_volunteer',
                    args=[occurrence.pk, action],
                    urlconf="gbe.scheduling.urls"))

    def test_signup_w_available_slot(self):
        other_conference = ConferenceFactory(status='completed')
        response = self.client.get(self.url)
        self.assertNotContains(response, other_conference.conference_name)
        self.basic_event_check(response, self.staffcontext.conference,
                               self.volunteeropp, "not_yet_volunteered.gif")
        self.assertContains(response, volunteer_instructions)
        self.assertContains(response, "btn btn-default disabled", 2)

    def test_signup_w_need_approval_slot(self):
        self.volunteeropp.approval_needed = True
        self.volunteeropp.save()
        response = self.client.get(self.url)
        self.basic_event_check(response, self.staffcontext.conference,
                               self.volunteeropp, "needs_approval.gif")
        self.assertContains(response, pending_note)

    def test_signup_w_signed_up_slot(self):
        UserMessage.objects.all().delete()
        msg = UserMessageFactory(view='VolunteerSignupView',
                                 code='VOLUNTEER_INSTRUCTIONS')
        self.staffcontext.book_volunteer(
            volunteer_sched_event=self.volunteeropp, volunteer=self.profile)
        login_as(self.profile, self)
        response = self.client.get(
            "%s?conference=%s" %
            (self.url, self.staffcontext.conference.conference_slug))
        self.basic_event_check(response,
                               self.staffcontext.conference,
                               self.volunteeropp,
                               "volunteered.gif",
                               action="off")
        self.assertContains(response, msg.description)

    def test_signup_w_approved_slot(self):
        UserMessage.objects.all().delete()
        msg = UserMessageFactory(view='VolunteerSignupView',
                                 code='PENDING_INSTRUCTIONS')
        self.volunteeropp.approval_needed = True
        self.volunteeropp.save()
        self.staffcontext.book_volunteer(
            volunteer_sched_event=self.volunteeropp, volunteer=self.profile)
        login_as(self.profile, self)
        response = self.client.get(self.url)
        self.basic_event_check(response,
                               self.staffcontext.conference,
                               self.volunteeropp,
                               "approved.gif",
                               action="off")
        self.assertContains(response, msg.description)

    def test_signup_w_pending_slot(self):
        self.volunteeropp.approval_needed = True
        self.volunteeropp.save()
        self.staffcontext.book_volunteer(
            volunteer_sched_event=self.volunteeropp,
            volunteer=self.profile,
            role="Pending Volunteer")
        login_as(self.profile, self)
        response = self.client.get(self.url)
        self.basic_event_check(response,
                               self.staffcontext.conference,
                               self.volunteeropp,
                               "awaiting_approval.gif",
                               action="off")
        self.assertContains(response, self.staffcontext.area.description)

    def test_signup_w_waitlisted_volunteer(self):
        self.volunteeropp.approval_needed = True
        self.volunteeropp.save()
        self.staffcontext.book_volunteer(
            volunteer_sched_event=self.volunteeropp,
            volunteer=self.profile,
            role="Waitlisted")
        login_as(self.profile, self)
        response = self.client.get(self.url)
        self.basic_event_check(response,
                               self.staffcontext.conference,
                               self.volunteeropp,
                               "awaiting_approval.gif",
                               action="off")
        self.assertContains(response, self.staffcontext.area.description)

    def test_other_days(self):
        earlier_day = ConferenceDayFactory(
            conference=self.staffcontext.conference, day=date(2016, 0o2, 0o5))
        later_day = ConferenceDayFactory(
            conference=self.staffcontext.conference, day=date(2016, 0o2, 0o7))
        login_as(self.profile, self)
        response = self.client.get("%s?day=02-06-2016" % self.url)
        self.assertContains(response, "?day=02-05-2016")
        self.assertContains(response, "?day=02-07-2016")

    def test_no_conference_days(self):
        clear_conferences()
        ConferenceFactory(status='upcoming')
        response = self.client.get(self.url)
        self.assertContains(response,
                            'This calendar is not currently available.')

    def test_bad_day(self):
        # There is a day, but that's not the day we're asking for.
        url = "%s?day=02-02-2016" % self.url
        response = self.client.get(url, follow=True)
        self.assertEqual(response.status_code, 404)

    def test_no_events(self):
        earlier_day = ConferenceDayFactory(
            conference=self.staffcontext.conference, day=date(2016, 0o2, 0o5))
        login_as(self.profile, self)
        response = self.client.get("%s?day=02-05-2016" % self.url)
        self.assertContains(
            response, "There are no volunteer events scheduled for this day.")

    def test_two_upcoming_conf(self):
        second_conference = ConferenceFactory()
        save_the_date = datetime(2017, 2, 6, 12, 0, 0)
        second_day = ConferenceDayFactory(conference=second_conference,
                                          day=date(2017, 0o2, 0o6))
        staffcontext = StaffAreaContext(conference=second_conference,
                                        starttime=save_the_date)
        volunteeropp = staffcontext.add_volunteer_opp()
        login_as(self.profile, self)
        response = self.client.get(
            "%s?conference=%s" % (self.url, second_conference.conference_slug))
        self.assertContains(response, staffcontext.conference.conference_name)
        self.assertContains(response, volunteeropp.eventitem.e_title)

    def test_no_space_in_event(self):
        full_opp = self.staffcontext.add_volunteer_opp()
        full_opp.max_volunteer = 0
        full_opp.save()

        response = self.client.get(self.url)
        self.assertNotContains(response, full_opp.eventitem.e_title)

    def test_user_is_rejected(self):
        self.staffcontext.book_volunteer(
            volunteer_sched_event=self.volunteeropp,
            volunteer=self.profile,
            role="Rejected")
        login_as(self.profile, self)
        response = self.client.get(self.url)
        self.assertNotContains(response, self.volunteeropp.eventitem.e_title)

    def test_slot_with_show(self):
        vol_context = VolunteerContext()
        login_as(vol_context.profile, self)
        response = self.client.get(
            "%s?conference=%s" %
            (self.url, vol_context.conference.conference_slug))
        self.basic_event_check(response,
                               vol_context.conference,
                               vol_context.opp_event,
                               "volunteered.gif",
                               action="off")
        self.assertContains(response, vol_context.event.e_title)
        self.assertContains(
            response,
            reverse("detail_view",
                    urlconf="gbe.scheduling.urls",
                    args=[vol_context.event.pk]))
Beispiel #30
0
class TestManageWorker(TestCase):
    view_name = "manage_workers"

    def setUp(self):
        self.client = Client()
        self.user = ProfileFactory.create().user_object
        self.privileged_profile = ProfileFactory()
        self.privileged_user = self.privileged_profile.user_object
        grant_privilege(self.privileged_user, 'Volunteer Coordinator')
        grant_privilege(self.privileged_user, 'Scheduling Mavens')
        self.context = StaffAreaContext()
        self.volunteer_opp = self.context.add_volunteer_opp()
        self.volunteer, self.alloc = self.context.book_volunteer(
            self.volunteer_opp)
        self.url = reverse(self.view_name,
                           args=[
                               self.context.conference.conference_slug,
                               self.volunteer_opp.pk
                           ],
                           urlconf="gbe.scheduling.urls")

    def get_edit_data(self):
        data = self.get_either_data()
        data['alloc_id'] = self.alloc.pk
        return data

    def get_create_data(self):
        data = self.get_either_data()
        data['alloc_id'] = -1
        return data

    def get_either_data(self):
        data = {
            'worker': self.volunteer.pk,
            'role': 'Volunteer',
            'label': 'Do these notes work?'
        }
        return data

    def assert_post_contents(self,
                             response,
                             volunteer_opp,
                             volunteer,
                             alloc,
                             notes,
                             role="Volunteer",
                             allocations=2):
        if volunteer == -1:
            self.assertContains(
                response,
                '<option value="" selected="selected">---------</option>')
        else:
            self.assertContains(
                response, '<option value="' + str(volunteer.pk) +
                '" selected="selected">' + str(volunteer) + '</option>')
        self.assertContains(
            response, '<option value="' + role + '" selected="selected">' +
            role + '</option>')
        self.assertContains(
            response,
            '<input id="id_alloc_id" name="alloc_id" type="hidden" value="' +
            str(alloc.pk) + '" />')
        self.assertContains(
            response,
            '<input id="id_label" maxlength="100" name="label" type="text" ' +
            'value="' + notes + '" />')
        self.assertContains(
            response, '<form method="POST" action="%s' %
            (reverse('manage_workers',
                     urlconf='gbe.scheduling.urls',
                     args=[
                         volunteer_opp.eventitem.e_conference.conference_slug,
                         volunteer_opp.pk
                     ])))

    def assert_good_post(self,
                         response,
                         volunteer_opp,
                         volunteer,
                         alloc,
                         notes,
                         role="Volunteer",
                         allocations=2):
        self.assertRedirects(
            response, "%s?worker_open=True&changed_id=%d" %
            (reverse('edit_volunteer',
                     urlconf='gbe.scheduling.urls',
                     args=[
                         volunteer_opp.eventitem.e_conference.conference_slug,
                         volunteer_opp.pk
                     ]), alloc.pk))
        self.assert_post_contents(
            response,
            volunteer_opp,
            volunteer,
            alloc,
            notes,
            role,
            allocations,
        )
        self.assertNotContains(response, '<ul class="errorlist">')

    def test_no_login_gives_error(self):
        response = self.client.get(self.url, follow=True)
        redirect_url = reverse('login',
                               urlconf='gbe.urls') + "/?next=" + self.url
        self.assertRedirects(response, redirect_url)
        self.assertTrue(is_login_page(response))

    def test_bad_user(self):
        login_as(ProfileFactory(), self)
        response = self.client.post(self.url, data=self.get_create_data())
        self.assertEqual(response.status_code, 403)

    def test_post_form_valid_make_new_allocation(self):
        context = StaffAreaContext()
        volunteer_opp = context.add_volunteer_opp()
        allocations = volunteer_opp.resources_allocated.all()
        volunteer = ProfileFactory()
        url = reverse(
            self.view_name,
            args=[context.conference.conference_slug, volunteer_opp.pk],
            urlconf="gbe.scheduling.urls")
        data = self.get_create_data()
        data['worker'] = volunteer.pk,

        login_as(self.privileged_profile, self)
        response = self.client.post(url, data=data, follow=True)
        alloc = volunteer_opp.resources_allocated.all().order_by(
            'pk').reverse().first()

        self.assertIsNotNone(alloc)
        self.assert_good_post(response,
                              volunteer_opp,
                              volunteer,
                              alloc,
                              'Do these notes work?',
                              allocations=3)
        assert len(volunteer.volunteering.all().filter(
            b_conference=volunteer_opp.eventitem.get_conference())) == 1

    def test_post_form_valid_make_new_allocation_volunteer_exists(self):
        context = StaffAreaContext()
        volunteer_opp = context.add_volunteer_opp()
        volunteer = VolunteerFactory(submitted=False,
                                     accepted=2,
                                     b_conference=context.conference)
        VolunteerInterestFactory(
            volunteer=volunteer,
            interest=volunteer_opp.as_subtype.volunteer_type)
        url = reverse(
            self.view_name,
            args=[context.conference.conference_slug, volunteer_opp.pk],
            urlconf="gbe.scheduling.urls")
        data = self.get_create_data()
        data['worker'] = volunteer.profile.pk,

        login_as(self.privileged_profile, self)
        response = self.client.post(url, data=data, follow=True)
        alloc = volunteer_opp.resources_allocated.all().order_by(
            'pk').reverse().first()
        self.assertIsNotNone(alloc)
        self.assert_good_post(response,
                              volunteer_opp,
                              volunteer.profile,
                              alloc,
                              'Do these notes work?',
                              allocations=3)
        assert len(volunteer.profile.volunteering.all().filter(
            b_conference=volunteer_opp.eventitem.get_conference())) == 1
        updated = get_object_or_404(Volunteer, pk=volunteer.pk)
        assert updated.submitted
        assert updated.accepted == 3

    def test_post_form_edit_exiting_allocation(self):
        new_volunteer = ProfileFactory()
        data = self.get_edit_data()
        data['worker'] = new_volunteer.pk,
        data['role'] = 'Producer',

        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assert_good_post(response, self.volunteer_opp, new_volunteer,
                              self.alloc, 'Do these notes work?', "Producer")

    def test_post_form_edit_bad_label(self):
        big_label = 'Do these notes work?Do these notes work?' + \
                    'Do these notes work?Do these notes work?' + \
                    'Do these notes work?Do these notes work?' + \
                    'Do these notes work?Do these notes work?'
        data = self.get_edit_data()
        data['label'] = big_label

        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_post_contents(response, self.volunteer_opp, self.volunteer,
                                  self.alloc, big_label)
        self.assertContains(
            response, '<li>Ensure this value has at most 100 characters ' +
            '(it has ' + str(len(big_label)) + ').</li>')

    def test_post_form_edit_bad_role(self):
        data = self.get_edit_data()
        data['role'] = ''

        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_post_contents(response, self.volunteer_opp, self.volunteer,
                                  self.alloc, 'Do these notes work?')
        self.assertContains(response, '<li>This field is required.</li>')

    def test_post_form_edit_bad_role_and_booking(self):
        data = self.get_edit_data()
        data['role'] = ''
        data['alloc_id'] = self.alloc.pk + 100
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response, 'danger', 'Error',
            'BOOKING_NOT_FOUND  Booking id %s for occurrence %d not found' %
            (self.alloc.pk + 100, self.volunteer_opp.pk))

    def test_post_form_create_bad_role(self):
        data = self.get_create_data()
        data['role'] = '',

        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_post_contents(response, self.volunteer_opp, self.volunteer,
                                  self.alloc, 'Do these notes work?')
        self.assertContains(response, '<li>This field is required.</li>')
        self.assertContains(
            response,
            '<a href="#" data-toggle="tooltip" title="Delete">',
            count=1)
        self.assertContains(response,
                            '<a href="#" data-toggle="tooltip" title="Edit">',
                            count=1)
        self.assertContains(
            response,
            '<a href="#" data-toggle="tooltip" title="Create New">',
            count=1)

    def test_post_form_valid_delete_allocation(self):
        data = self.get_edit_data()
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertRedirects(
            response, "%s?worker_open=True&changed_id=%d" %
            (reverse('edit_volunteer',
                     urlconf='gbe.scheduling.urls',
                     args=[
                         self.context.conference.conference_slug,
                         self.volunteer_opp.pk
                     ]), self.alloc.pk))
        self.assertNotContains(
            response, '<option value="' + str(self.volunteer.pk) +
            '" selected="selected">' + str(self.volunteer) + '</option>')
        self.assertNotContains(
            response,
            '<input id="id_alloc_id" name="alloc_id" type="hidden" value="' +
            str(self.alloc.pk) + '" />')
        self.assertContains(
            response, '<form method="POST" action="%s' %
            (reverse(self.view_name,
                     urlconf='gbe.scheduling.urls',
                     args=[
                         self.context.conference.conference_slug,
                         self.volunteer_opp.pk
                     ])))

    def test_post_form_valid_delete_allocation_sends_notification(self):
        data = self.get_edit_data()
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertRedirects(
            response, "%s?worker_open=True&changed_id=%d" %
            (reverse('edit_volunteer',
                     urlconf='gbe.scheduling.urls',
                     args=[
                         self.context.conference.conference_slug,
                         self.volunteer_opp.pk
                     ]), self.alloc.pk))
        msg = assert_email_template_used(
            "A change has been made to your Volunteer Schedule!")
        assert ("http://%s%s" % (Site.objects.get_current().domain,
                                 reverse('home', urlconf='gbe.urls'))
                in msg.body)

    def test_post_form_valid_notification_template_fail(self):
        EmailTemplateSenderFactory(
            from_email="*****@*****.**",
            template__name='volunteer schedule update',
            template__subject="test template",
            template__content="stuff {% url 'gbehome' %}  more stuff")
        data = self.get_edit_data()
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertRedirects(
            response, "%s?worker_open=True&changed_id=%d" %
            (reverse('edit_volunteer',
                     urlconf='gbe.scheduling.urls',
                     args=[
                         self.context.conference.conference_slug,
                         self.volunteer_opp.pk
                     ]), self.alloc.pk))
        self.assertContains(response, volunteer_allocate_email_fail_msg)

    def test_post_form_valid_delete_allocation_w_bad_data(self):
        data = self.get_edit_data()
        data['role'] = ''
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertContains(response, 'This field is required.')

    def test_post_form_valid_delete_allocation_w_no_alloc(self):
        data = self.get_edit_data()
        data['alloc_id'] = ''
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response, 'danger', 'Error',
            'NO_BOOKING  No booking id for occurrence id %d.' %
            (self.volunteer_opp.pk))

    def test_post_form_valid_delete_allocation_w_bad_alloc(self):
        data = self.get_edit_data()
        data['alloc_id'] = self.alloc.pk + 100
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response, 'danger', 'Error',
            'BOOKING_NOT_FOUND  Could not find booking id ' +
            '%d for occurrence id %d.' %
            (self.alloc.pk + 100, self.volunteer_opp.pk))

    def test_post_form_edit_exiting_allocation(self):
        new_volunteer = ProfileFactory()
        data = self.get_edit_data()
        data['worker'] = new_volunteer.pk,
        data['role'] = 'Producer',
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_email_template_used(
            "A change has been made to your Volunteer Schedule!")

    def test_post_form_edit_notification_template_fail(self):
        EmailTemplateSenderFactory(
            from_email="*****@*****.**",
            template__name='volunteer schedule update',
            template__subject="test template",
            template__content="stuff {% url 'gbehome' %}  more stuff")
        new_volunteer = ProfileFactory()
        data = self.get_edit_data()
        data['worker'] = new_volunteer.pk,
        data['role'] = 'Producer',
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertContains(response, volunteer_allocate_email_fail_msg)

    def test_post_form_valid_make_new_allocation_w_confict(self):
        data = self.get_create_data()
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response, 'warning', 'Warning',
            'SCHEDULE_CONFLICT  <br>- Affected user: %s<br>- ' %
            (self.volunteer.display_name) +
            'Conflicting booking: %s, Start Time: %s' %
            (self.volunteer_opp.eventitem.e_title, 'Fri, Feb 5 12:00 PM'))

    def test_post_form_valid_make_new_allocation_w_overfull(self):
        data = self.get_create_data()
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertContains(response, "Over booked by 1 volunteers")

    def test_post_form_edit_w_conflict(self):
        overbook_opp = self.context.add_volunteer_opp()
        self.context.book_volunteer(volunteer_sched_event=overbook_opp,
                                    volunteer=self.volunteer)
        data = self.get_edit_data()
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response, 'warning', 'Warning',
            'SCHEDULE_CONFLICT  <br>- Affected user: %s<br>- ' %
            (self.volunteer.display_name) +
            'Conflicting booking: %s, Start Time: %s' %
            (self.volunteer_opp.eventitem.e_title, 'Fri, Feb 5 12:00 PM'))
Beispiel #31
0
class TestEventList(TestCase):
    view_name = 'manage_event_list'

    def setUp(self):
        AvailableInterest.objects.all().delete()
        self.client = Client()
        self.user = ProfileFactory.create().user_object
        self.privileged_profile = ProfileFactory()
        self.privileged_user = self.privileged_profile.user_object
        grant_privilege(self.privileged_user, 'Scheduling Mavens')
        self.url = reverse(self.view_name,
                           urlconf="gbe.scheduling.urls")
        self.volunteer_context = VolunteerContext()
        self.day = self.volunteer_context.window.day
        self.class_context = ClassContext(conference=self.day.conference)
        self.another_interest = AvailableInterestFactory(interest="one more")
        self.show_context = ShowContext(conference=self.day.conference)
        self.staff_context = StaffAreaContext(conference=self.day.conference)
        booking, self.vol_opp = self.staff_context.book_volunteer()

    def assert_visible_input_selected(
            self,
            response,
            conf_slug,
            input_field,
            input_index,
            value,
            checked=True):
        if checked:
            checked = 'checked="checked" '
        else:
            checked = ''
        template_input = '<input %sid="id_%s-%s_%d" name="%s-%s" ' + \
                         'type="checkbox" value="%d" />'
        assert_string = template_input % (
            checked,
            conf_slug,
            input_field,
            input_index,
            conf_slug,
            input_field,
            value)
        self.assertContains(response, assert_string)

    def assert_hidden_input_selected(
            self,
            response,
            conf_slug,
            input_field,
            input_index,
            value,
            exists=True):
        template_input = '<input id="id_%s-%s_%d" name="%s-%s" ' + \
            'type="hidden" value="%d" />'
        assert_string = template_input % (
            conf_slug,
            input_field,
            input_index,
            conf_slug,
            input_field,
            value)
        if exists:
            self.assertContains(response, assert_string)
        else:
            self.assertNotContains(response, assert_string)

    def test_no_login_gives_error(self):
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 302)

    def test_bad_user(self):
        login_as(ProfileFactory(), self)
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 403)

    def test_good_user_get_success(self):
        old_conf_day = ConferenceDayFactory(
            conference__status="completed",
            day=self.day.day + timedelta(3))
        login_as(self.privileged_profile, self)
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 200)
        s = '<li role="presentation" class="active">\n' + \
            '   <a href = "%s?">%s</a></li>'
        self.assertContains(
            response,
            s % (reverse(self.view_name,
                         urlconf="gbe.scheduling.urls",
                         args=[self.day.conference.conference_slug]),
                 self.day.conference.conference_slug))
        s = '<li role="presentation" >\n   <a href = "%s?">%s</a></li>'
        self.assertContains(
            response,
            s % (reverse(self.view_name,
                         urlconf="gbe.scheduling.urls",
                         args=[old_conf_day.conference.conference_slug]),
                 old_conf_day.conference.conference_slug))
        self.assertContains(
            response,
            self.day.day.strftime(DATE_FORMAT))
        self.assertNotContains(
            response,
            old_conf_day.day.strftime(DATE_FORMAT))

    def test_good_user_get_interests(self):
        old_interest = AvailableInterestFactory(
            visible=False,
            interest="old interest")
        login_as(self.privileged_profile, self)
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            self.another_interest.interest)
        self.assertNotContains(
            response,
            old_interest.interest)

    def test_good_user_get_staff_area(self):
        other_staff_context = StaffAreaContext()
        login_as(self.privileged_profile, self)
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            self.staff_context.area.title)
        self.assertNotContains(
            response,
            other_staff_context.area.title)

    def test_good_user_get_create_edit(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-calendar_type" % self.day.conference.conference_slug: [
                0, 1, 2],
            "filter": "Filter",
        }
        response = self.client.get(self.url, data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            '<i class="fa fa-pencil" aria-hidden="true">')

    def test_good_user_get_success_pick_conf(self):
        old_conf_day = ConferenceDayFactory(
            conference__status="completed",
            day=self.day.day + timedelta(3))
        login_as(self.privileged_profile, self)
        url = reverse(self.view_name,
                      urlconf="gbe.scheduling.urls",
                      args=[old_conf_day.conference.conference_slug])
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        s = '<li role="presentation" class="active">\n' + \
            '   <a href = "%s?">%s</a></li>'
        self.assertContains(
            response,
            s % (url,
                 old_conf_day.conference.conference_slug))
        s = '<li role="presentation" >\n   <a href = "%s?">%s</a></li>'
        self.assertContains(
            response,
            s % (reverse(self.view_name,
                         urlconf="gbe.scheduling.urls",
                         args=[self.day.conference.conference_slug]),
                 self.day.conference.conference_slug))
        self.assertContains(
            response,
            old_conf_day.day.strftime(DATE_FORMAT))
        self.assertNotContains(
            response,
            self.day.day.strftime(DATE_FORMAT))

    def test_good_user_get_no_create_edit(self):
        old_conf_day = ConferenceDayFactory(
            conference__status="completed",
            day=self.day.day + timedelta(3))
        context = ClassContext(conference=old_conf_day.conference)
        data = {
            "%s-calendar_type" % old_conf_day.conference.conference_slug: [
                0, 1, 2],
            "filter": "Filter",
        }
        login_as(self.privileged_profile, self)
        url = reverse(self.view_name,
                      urlconf="gbe.scheduling.urls",
                      args=[old_conf_day.conference.conference_slug])
        response = self.client.get(url, data)
        self.assertContains(
            response,
            '<i class="fa fa-trash-o" aria-hidden="true">')
        self.assertNotContains(
            response,
            '<i class="fa fa-pencil" aria-hidden="true">')
        self.assertNotContains(
            response,
            '<i class="fa fa-plus" aria-hidden="true">')

    def test_good_user_get_conference_cal(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-calendar_type" % self.day.conference.conference_slug: 1,
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, self.class_context.bid.e_title)
        self.assert_visible_input_selected(
            response,
            self.day.conference.conference_slug,
            "calendar_type",
            1,
            1)
        self.assert_visible_input_selected(
            response,
            self.day.conference.conference_slug,
            "calendar_type",
            0,
            0,
            checked=False)

    def test_good_user_get_conference_bad_filter(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-calendar_type" % self.day.conference.conference_slug: "bad",
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            "Select a valid choice. bad is not one of the available choices.")

    def test_good_user_get_all_cals(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-calendar_type" % self.day.conference.conference_slug: [
                0, 1, 2],
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, self.class_context.bid.e_title)
        self.assertContains(response, self.show_context.show.e_title)
        self.assertContains(response, self.vol_opp.event.eventitem.e_title)
        self.assertContains(response, '<td class="bid-table">Volunteer</td>')
        for value in range(0, 2):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "calendar_type",
                1,
                1)

    def test_good_user_get_day(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-day" % self.day.conference.conference_slug: self.day.pk,
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, self.show_context.show.e_title)
        self.assertContains(response, self.class_context.bid.e_title)
        counter = 0
        for day in self.day.conference.conferenceday_set.all().order_by('day'):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "day",
                counter,
                day.pk,
                checked=(day == self.day))
            counter += 1
        for value in range(0, 2):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "calendar_type",
                1,
                1,
                checked=False)

    def test_good_user_get_empty_day(self):
        new_day = ConferenceDayFactory(conference=self.day.conference,
                                       day=self.day.day+timedelta(14))
        login_as(self.privileged_profile, self)
        data = {
            "%s-day" % self.day.conference.conference_slug: new_day.pk,
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, self.show_context.show.e_title)
        self.assertNotContains(response, self.class_context.bid.e_title)
        counter = 0
        for day in self.day.conference.conferenceday_set.all().order_by('day'):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "day",
                counter,
                day.pk,
                checked=(day == new_day))
            counter += 1

    def test_good_user_get_volunteer_type(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-volunteer_type" % self.day.conference.conference_slug:
                self.volunteer_context.interest.interest.pk,
            "filter": "Filter",
        }
        url = reverse(self.view_name,
                      urlconf="gbe.scheduling.urls",
                      args=[self.volunteer_context.conference.conference_slug])
        response = self.client.get(url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response,
                            self.volunteer_context.opportunity.e_title)
        self.assertNotContains(response, self.show_context.show.e_title)
        self.assertNotContains(response, self.class_context.bid.e_title)
        self.assert_visible_input_selected(
            response,
            self.day.conference.conference_slug,
            "volunteer_type",
            2,
            self.volunteer_context.interest.interest.pk)

    def test_good_user_get_bad_volunteer_type(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-volunteer_type" % self.day.conference.conference_slug:
                "bad",
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            '&quot;bad&quot; is not a valid value for a primary key')

    def test_good_user_filter_staff_area(self):
        other_staff_area = StaffAreaContext(
            conference=self.day.conference
        )
        login_as(self.privileged_profile, self)
        data = {
            "%s-staff_area" % self.day.conference.conference_slug: (
                self.staff_context.area.pk),
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, self.vol_opp.event.eventitem.e_title)
        index = 0
        for area in StaffArea.objects.filter(
                conference=self.day.conference).order_by('title'):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "staff_area",
                index,
                area.pk,
                checked=(area == self.staff_context.area))
            index += 1

    def test_switch_conf_keep_filter(self):
        old_conf_day = ConferenceDayFactory(
            conference__status="completed",
            day=self.day.day + timedelta(3))
        url = reverse(self.view_name,
                      urlconf="gbe.scheduling.urls",
                      args=[old_conf_day.conference.conference_slug])
        login_as(self.privileged_profile, self)
        data = {
            "%s-day" % self.day.conference.conference_slug: self.day.pk,
            "%s-calendar_type" % self.day.conference.conference_slug: 1,
            "%s-day" % old_conf_day.conference.conference_slug: (
                old_conf_day.pk),
            "%s-calendar_type" % old_conf_day.conference.conference_slug: 0,
            "%s-staff_area" % self.day.conference.conference_slug: (
                self.staff_context.area.pk),
            "filter": "Filter",
        }
        response = self.client.get(url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, self.show_context.show.e_title)
        self.assertNotContains(response, self.class_context.bid.e_title)
        for day in self.day.conference.conferenceday_set.all().order_by('day'):
            self.assert_hidden_input_selected(
                response,
                self.day.conference.conference_slug,
                "day",
                0,
                day.pk,
                exists=(day == self.day))
        self.assert_hidden_input_selected(
            response,
            self.day.conference.conference_slug,
            "calendar_type",
            0,
            1)
        self.assert_hidden_input_selected(
            response,
            self.day.conference.conference_slug,
            "calendar_type",
            0,
            0,
            False)
        self.assert_hidden_input_selected(
            response,
            self.day.conference.conference_slug,
            "staff_area",
            0,
            self.staff_context.area.pk)
Beispiel #32
0
class TestManageWorker(TestCase):
    view_name = "manage_workers"

    def setUp(self):
        self.client = Client()
        self.user = ProfileFactory.create().user_object
        self.privileged_profile = ProfileFactory()
        self.privileged_user = self.privileged_profile.user_object
        grant_privilege(self.privileged_user, 'Volunteer Coordinator')
        grant_privilege(self.privileged_user, 'Scheduling Mavens')
        self.context = StaffAreaContext()
        self.volunteer_opp = self.context.add_volunteer_opp()
        self.volunteer, self.alloc = self.context.book_volunteer(
            self.volunteer_opp)
        self.url = reverse(
            self.view_name,
            args=[self.context.conference.conference_slug,
                  self.volunteer_opp.pk],
            urlconf="gbe.scheduling.urls")

    def get_edit_data(self):
        data = self.get_either_data()
        data['alloc_id'] = self.alloc.pk
        return data

    def get_create_data(self):
        data = self.get_either_data()
        data['alloc_id'] = -1
        return data

    def get_either_data(self):
        data = {'worker': self.volunteer.pk,
                'role': 'Volunteer',
                'label': 'Do these notes work?'}
        return data

    def assert_post_contents(self,
                             response,
                             volunteer_opp,
                             volunteer,
                             alloc,
                             notes,
                             role="Volunteer",
                             allocations=2):
        if volunteer == -1:
            self.assertContains(
                response,
                '<option value="" selected="selected">---------</option>')
        else:
            self.assertContains(
                response,
                '<option value="' + str(volunteer.pk) +
                '" selected="selected">' + str(volunteer) + '</option>')
        self.assertContains(
            response,
            '<option value="' + role +
            '" selected="selected">' + role +
            '</option>')
        self.assertContains(
            response,
            '<input id="id_alloc_id" name="alloc_id" type="hidden" value="' +
            str(alloc.pk) + '" />')
        self.assertContains(
            response,
            '<input id="id_label" maxlength="100" name="label" type="text" ' +
            'value="' + notes + '" />')
        self.assertContains(
            response,
            '<form method="POST" action="%s' % (reverse(
                'manage_workers',
                urlconf='gbe.scheduling.urls',
                args=[volunteer_opp.eventitem.e_conference.conference_slug,
                      volunteer_opp.pk])))

    def assert_good_post(self,
                         response,
                         volunteer_opp,
                         volunteer,
                         alloc,
                         notes,
                         role="Volunteer",
                         allocations=2):
        self.assertRedirects(
            response,
            "%s?worker_open=True&changed_id=%d" % (
                reverse(
                    'edit_volunteer',
                    urlconf='gbe.scheduling.urls',
                    args=[volunteer_opp.eventitem.e_conference.conference_slug,
                          volunteer_opp.pk]),
                alloc.pk))
        self.assert_post_contents(response,
                                  volunteer_opp,
                                  volunteer,
                                  alloc,
                                  notes,
                                  role,
                                  allocations,)
        self.assertNotContains(response, '<ul class="errorlist">')

    def test_no_login_gives_error(self):
        response = self.client.get(self.url, follow=True)
        redirect_url = reverse(
            'login',
            urlconf='gbe.urls') + "/?next=" + self.url
        self.assertRedirects(response, redirect_url)
        self.assertTrue(is_login_page(response))

    def test_bad_user(self):
        login_as(ProfileFactory(), self)
        response = self.client.post(self.url, data=self.get_create_data())
        self.assertEqual(response.status_code, 403)

    def test_post_form_valid_make_new_allocation(self):
        context = StaffAreaContext()
        volunteer_opp = context.add_volunteer_opp()
        allocations = volunteer_opp.resources_allocated.all()
        volunteer = ProfileFactory()
        url = reverse(self.view_name,
                      args=[context.conference.conference_slug,
                            volunteer_opp.pk],
                      urlconf="gbe.scheduling.urls")
        data = self.get_create_data()
        data['worker'] = volunteer.pk,

        login_as(self.privileged_profile, self)
        response = self.client.post(url, data=data, follow=True)
        alloc = volunteer_opp.resources_allocated.all().order_by(
            'pk').reverse().first()

        self.assertIsNotNone(alloc)
        self.assert_good_post(
            response,
            volunteer_opp,
            volunteer,
            alloc,
            'Do these notes work?',
            allocations=3)
        assert len(volunteer.volunteering.all().filter(
            b_conference=volunteer_opp.eventitem.get_conference())) == 1

    def test_post_form_valid_make_new_allocation_volunteer_exists(self):
        context = StaffAreaContext()
        volunteer_opp = context.add_volunteer_opp()
        volunteer = VolunteerFactory(
            submitted=False,
            accepted=2,
            b_conference=context.conference)
        VolunteerInterestFactory(
            volunteer=volunteer,
            interest=volunteer_opp.as_subtype.volunteer_type)
        url = reverse(self.view_name,
                      args=[context.conference.conference_slug,
                            volunteer_opp.pk],
                      urlconf="gbe.scheduling.urls")
        data = self.get_create_data()
        data['worker'] = volunteer.profile.pk,

        login_as(self.privileged_profile, self)
        response = self.client.post(url, data=data, follow=True)
        alloc = volunteer_opp.resources_allocated.all().order_by(
            'pk').reverse().first()
        self.assertIsNotNone(alloc)
        self.assert_good_post(
            response,
            volunteer_opp,
            volunteer.profile,
            alloc,
            'Do these notes work?',
            allocations=3)
        assert len(volunteer.profile.volunteering.all().filter(
            b_conference=volunteer_opp.eventitem.get_conference())) == 1
        updated = get_object_or_404(Volunteer, pk=volunteer.pk)
        assert updated.submitted
        assert updated.accepted == 3

    def test_post_form_edit_exiting_allocation(self):
        new_volunteer = ProfileFactory()
        data = self.get_edit_data()
        data['worker'] = new_volunteer.pk,
        data['role'] = 'Producer',

        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assert_good_post(
            response,
            self.volunteer_opp,
            new_volunteer,
            self.alloc,
            'Do these notes work?',
            "Producer")

    def test_post_form_edit_bad_label(self):
        big_label = 'Do these notes work?Do these notes work?' + \
                    'Do these notes work?Do these notes work?' + \
                    'Do these notes work?Do these notes work?' + \
                    'Do these notes work?Do these notes work?'
        data = self.get_edit_data()
        data['label'] = big_label

        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_post_contents(
            response,
            self.volunteer_opp,
            self.volunteer,
            self.alloc,
            big_label)
        self.assertContains(
            response,
            '<li>Ensure this value has at most 100 characters ' +
            '(it has ' + str(len(big_label)) + ').</li>')

    def test_post_form_edit_bad_role(self):
        data = self.get_edit_data()
        data['role'] = ''

        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_post_contents(
            response,
            self.volunteer_opp,
            self.volunteer,
            self.alloc,
            'Do these notes work?')
        self.assertContains(
            response,
            '<li>This field is required.</li>')

    def test_post_form_edit_bad_role_and_booking(self):
        data = self.get_edit_data()
        data['role'] = ''
        data['alloc_id'] = self.alloc.pk + 100
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response,
            'danger',
            'Error',
            'BOOKING_NOT_FOUND  Booking id %s for occurrence %d not found' % (
                self.alloc.pk + 100,
                self.volunteer_opp.pk))

    def test_post_form_create_bad_role(self):
        data = self.get_create_data()
        data['role'] = '',

        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assert_post_contents(
            response,
            self.volunteer_opp,
            self.volunteer,
            self.alloc,
            'Do these notes work?')
        self.assertContains(
            response,
            '<li>This field is required.</li>')
        self.assertContains(
            response,
            '<a href="#" data-toggle="tooltip" title="Delete">',
            count=1)
        self.assertContains(
            response,
            '<a href="#" data-toggle="tooltip" title="Edit">',
            count=1)
        self.assertContains(
            response,
            '<a href="#" data-toggle="tooltip" title="Create New">',
            count=1)

    def test_post_form_valid_delete_allocation(self):
        data = self.get_edit_data()
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertRedirects(
            response,
            "%s?worker_open=True&changed_id=%d" % (
                reverse('edit_volunteer',
                        urlconf='gbe.scheduling.urls',
                        args=[self.context.conference.conference_slug,
                              self.volunteer_opp.pk]),
                self.alloc.pk))
        self.assertNotContains(
            response,
            '<option value="' + str(self.volunteer.pk) +
            '" selected="selected">' + str(self.volunteer) + '</option>')
        self.assertNotContains(
            response,
            '<input id="id_alloc_id" name="alloc_id" type="hidden" value="' +
            str(self.alloc.pk) + '" />')
        self.assertContains(
            response,
            '<form method="POST" action="%s' % (reverse(
                self.view_name,
                urlconf='gbe.scheduling.urls',
                args=[self.context.conference.conference_slug,
                      self.volunteer_opp.pk])))

    def test_post_form_valid_delete_allocation_sends_notification(self):
        data = self.get_edit_data()
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertRedirects(
            response,
            "%s?worker_open=True&changed_id=%d" % (
                reverse('edit_volunteer',
                        urlconf='gbe.scheduling.urls',
                        args=[self.context.conference.conference_slug,
                              self.volunteer_opp.pk]),
                self.alloc.pk))
        msg = assert_email_template_used(
            "A change has been made to your Volunteer Schedule!")
        assert("http://%s%s" % (
            Site.objects.get_current().domain,
            reverse('home', urlconf='gbe.urls')) in msg.body)

    def test_post_form_valid_notification_template_fail(self):
        EmailTemplateSenderFactory(
            from_email="*****@*****.**",
            template__name='volunteer schedule update',
            template__subject="test template",
            template__content="stuff {% url 'gbehome' %}  more stuff"
        )
        data = self.get_edit_data()
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertRedirects(
            response,
            "%s?worker_open=True&changed_id=%d" % (
                reverse('edit_volunteer',
                        urlconf='gbe.scheduling.urls',
                        args=[self.context.conference.conference_slug,
                              self.volunteer_opp.pk]),
                self.alloc.pk))
        self.assertContains(response,
                            volunteer_allocate_email_fail_msg)

    def test_post_form_valid_delete_allocation_w_bad_data(self):
        data = self.get_edit_data()
        data['role'] = ''
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertContains(
            response,
            'This field is required.')

    def test_post_form_valid_delete_allocation_w_no_alloc(self):
        data = self.get_edit_data()
        data['alloc_id'] = ''
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response,
            'danger',
            'Error',
            'NO_BOOKING  No booking id for occurrence id %d.' % (
                self.volunteer_opp.pk))

    def test_post_form_valid_delete_allocation_w_bad_alloc(self):
        data = self.get_edit_data()
        data['alloc_id'] = self.alloc.pk + 100
        data['delete'] = 1
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response,
            'danger',
            'Error',
            'BOOKING_NOT_FOUND  Could not find booking id ' +
            '%d for occurrence id %d.' % (self.alloc.pk + 100,
                                          self.volunteer_opp.pk))

    def test_post_form_edit_exiting_allocation(self):
        new_volunteer = ProfileFactory()
        data = self.get_edit_data()
        data['worker'] = new_volunteer.pk,
        data['role'] = 'Producer',
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_email_template_used(
            "A change has been made to your Volunteer Schedule!")

    def test_post_form_edit_notification_template_fail(self):
        EmailTemplateSenderFactory(
            from_email="*****@*****.**",
            template__name='volunteer schedule update',
            template__subject="test template",
            template__content="stuff {% url 'gbehome' %}  more stuff"
        )
        new_volunteer = ProfileFactory()
        data = self.get_edit_data()
        data['worker'] = new_volunteer.pk,
        data['role'] = 'Producer',
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertContains(response,
                            volunteer_allocate_email_fail_msg)

    def test_post_form_valid_make_new_allocation_w_confict(self):
        data = self.get_create_data()
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response,
            'warning',
            'Warning',
            'SCHEDULE_CONFLICT  <br>- Affected user: %s<br>- ' % (
                self.volunteer.display_name) +
            'Conflicting booking: %s, Start Time: %s' % (
                self.volunteer_opp.eventitem.e_title,
                'Fri, Feb 5 12:00 PM')
            )

    def test_post_form_valid_make_new_allocation_w_overfull(self):
        data = self.get_create_data()
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        self.assertContains(response, "Over booked by 1 volunteers")

    def test_post_form_edit_w_conflict(self):
        overbook_opp = self.context.add_volunteer_opp()
        self.context.book_volunteer(
            volunteer_sched_event=overbook_opp,
            volunteer=self.volunteer)
        data = self.get_edit_data()
        login_as(self.privileged_profile, self)
        response = self.client.post(self.url, data=data, follow=True)
        assert_alert_exists(
            response,
            'warning',
            'Warning',
            'SCHEDULE_CONFLICT  <br>- Affected user: %s<br>- ' % (
                self.volunteer.display_name) +
            'Conflicting booking: %s, Start Time: %s' % (
                self.volunteer_opp.eventitem.e_title,
                'Fri, Feb 5 12:00 PM')
            )
class TestManageEventList(TestCase):
    view_name = 'manage_event_list'
    conf_tab = (
        '<li role="presentation"><a href="%s?" class="gbe-tab%s">%s</a></li>')

    def setUp(self):
        self.client = Client()
        self.user = ProfileFactory.create().user_object
        self.privileged_profile = ProfileFactory()
        self.privileged_user = self.privileged_profile.user_object
        grant_privilege(self.privileged_user, 'Scheduling Mavens')
        self.url = reverse(self.view_name,
                           urlconf="gbe.scheduling.urls")
        self.volunteer_context = VolunteerContext()
        self.day = self.volunteer_context.conf_day
        self.class_context = ClassContext(conference=self.day.conference)
        self.show_context = ShowContext(conference=self.day.conference)
        self.staff_context = StaffAreaContext(conference=self.day.conference)
        booking, self.vol_opp = self.staff_context.book_volunteer()

    def assert_visible_input_selected(
            self,
            response,
            conf_slug,
            input_field,
            input_index,
            value,
            checked=True):
        if checked:
            checked = 'checked '
        else:
            checked = ''
        template_input = '<input type="checkbox" name="%s-%s" value="%d" ' + \
                         'class="form-check-input" id="id_%s-%s_%d" %s/>'
        assert_string = template_input % (
            conf_slug,
            input_field,
            value,
            conf_slug,
            input_field,
            input_index,
            checked)
        self.assertContains(response, assert_string, html=True)

    def assert_hidden_input_selected(
            self,
            response,
            conf_slug,
            input_field,
            input_index,
            value,
            exists=True):
        template_input = '<input type="hidden" name="%s-%s" value="%d"' + \
            ' id="id_%s-%s_%d" />'

        assert_string = template_input % (
            conf_slug,
            input_field,
            value,
            conf_slug,
            input_field,
            input_index)
        if exists:
            self.assertContains(response, assert_string, html=True)
        else:
            self.assertNotContains(response, assert_string, html=True)

    def test_no_login_gives_error(self):
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 302)

    def test_bad_user(self):
        login_as(ProfileFactory(), self)
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 403)

    def test_good_user_get_success(self):
        old_conf_day = ConferenceDayFactory(
            conference__status="completed",
            day=self.day.day + timedelta(3))
        login_as(self.privileged_profile, self)
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            self.conf_tab % (
                reverse(self.view_name,
                        urlconf="gbe.scheduling.urls",
                        args=[self.day.conference.conference_slug]),
                '-active',
                self.day.conference.conference_slug),
            html=True)
        self.assertContains(
            response,
            self.conf_tab % (
                reverse(self.view_name,
                        urlconf="gbe.scheduling.urls",
                        args=[old_conf_day.conference.conference_slug]),
                '',
                old_conf_day.conference.conference_slug),
            html=True)
        self.assertContains(
            response,
            self.day.day.strftime(GBE_DATE_FORMAT))
        self.assertNotContains(
            response,
            old_conf_day.day.strftime(GBE_DATE_FORMAT))

    def test_good_user_get_staff_area(self):
        other_staff_context = StaffAreaContext()
        login_as(self.privileged_profile, self)
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            self.staff_context.area.title)
        self.assertNotContains(
            response,
            other_staff_context.area.title)

    def test_good_user_get_create_edit(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-calendar_type" % self.day.conference.conference_slug: [
                0, 1, 2],
            "filter": "Filter",
        }
        response = self.client.get(self.url, data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            '<i class="fa fa-pencil" aria-hidden="true">')

    def test_good_user_get_success_pick_conf(self):
        old_conf_day = ConferenceDayFactory(
            conference__status="completed",
            day=self.day.day + timedelta(3))
        login_as(self.privileged_profile, self)
        url = reverse(self.view_name,
                      urlconf="gbe.scheduling.urls",
                      args=[old_conf_day.conference.conference_slug])
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            self.conf_tab % (
                url,
                '-active',
                old_conf_day.conference.conference_slug),
            html=True)
        self.assertContains(
            response,
            self.conf_tab % (
                reverse(self.view_name,
                        urlconf="gbe.scheduling.urls",
                        args=[self.day.conference.conference_slug]),
                '',
                self.day.conference.conference_slug),
            html=True)
        self.assertContains(
            response,
            old_conf_day.day.strftime(GBE_DATE_FORMAT))
        self.assertNotContains(
            response,
            self.day.day.strftime(GBE_DATE_FORMAT))

    def test_good_user_get_no_create_edit(self):
        old_conf_day = ConferenceDayFactory(
            conference__status="completed",
            day=self.day.day + timedelta(3))
        context = ClassContext(conference=old_conf_day.conference)
        vol_context = VolunteerContext(conference=old_conf_day.conference)
        staff_context = StaffAreaContext(conference=old_conf_day.conference)
        booking, self.vol_opp = staff_context.book_volunteer()
        data = {
            "%s-calendar_type" % old_conf_day.conference.conference_slug: [
                0, 1, 2],
            "filter": "Filter",
        }
        login_as(self.privileged_profile, self)
        url = reverse(self.view_name,
                      urlconf="gbe.scheduling.urls",
                      args=[old_conf_day.conference.conference_slug])
        response = self.client.get(url, data)
        self.assertContains(
            response,
            '<i class="fa fa-trash-o" aria-hidden="true">')
        self.assertNotContains(
            response,
            '<i class="fa fa-pencil" aria-hidden="true">')
        self.assertNotContains(
            response,
            '<i class="fa fa-plus" aria-hidden="true">')
        self.assertContains(response, vol_context.opportunity.e_title)
        self.assertContains(response, reverse(
            'detail_view',
            urlconf='gbe.scheduling.urls',
            args=[vol_context.event.eventitem_id]))
        self.assertContains(response, vol_context.event.e_title)
        self.assertNotContains(response, reverse(
            "edit_staff",
            urlconf="gbe.scheduling.urls",
            args=[staff_context.area.pk]))

    def test_good_user_get_conference_cal(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-calendar_type" % self.day.conference.conference_slug: 1,
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, self.class_context.bid.e_title)
        self.assert_visible_input_selected(
            response,
            self.day.conference.conference_slug,
            "calendar_type",
            1,
            1)
        self.assert_visible_input_selected(
            response,
            self.day.conference.conference_slug,
            "calendar_type",
            0,
            0,
            checked=False)
        # conference class bids do not yet have copy feature.
        self.assertNotContains(
            response,
            'href="%s" data-toggle="tooltip" title="Copy"' % (
                reverse("copy_event_schedule",
                        urlconf="gbe.scheduling.urls",
                        args=[self.class_context.sched_event.pk])))

    def test_good_user_get_conference_bad_filter(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-calendar_type" % self.day.conference.conference_slug: "bad",
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response,
            "Select a valid choice. bad is not one of the available choices.")

    def test_good_user_get_all_cals(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-calendar_type" % self.day.conference.conference_slug: [
                0, 1, 2],
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, self.class_context.bid.e_title)
        self.assertContains(response, self.show_context.show.e_title)
        self.assertContains(response, self.vol_opp.event.eventitem.e_title)
        self.assertContains(response, '<td>Volunteer</td>')
        self.assertContains(response,
                            self.volunteer_context.opportunity.e_title)
        self.assertContains(
            response,
            ('<a href="%s" class="gbe-table-link" data-toggle="tooltip" ' +
             'title="Edit">%s</a>') % (
                reverse('edit_event',
                        urlconf='gbe.scheduling.urls',
                        args=[self.day.conference.conference_slug,
                              self.volunteer_context.sched_event.pk]),
                self.volunteer_context.event.e_title),
            html=True)
        for value in range(0, 2):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "calendar_type",
                1,
                1)

    def test_good_user_get_day(self):
        login_as(self.privileged_profile, self)
        data = {
            "%s-day" % self.day.conference.conference_slug: self.day.pk,
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, self.show_context.show.e_title)
        self.assertContains(response, self.class_context.bid.e_title)
        counter = 0
        for day in self.day.conference.conferenceday_set.all().order_by('day'):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "day",
                counter,
                day.pk,
                checked=(day == self.day))
            counter += 1
        for value in range(0, 2):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "calendar_type",
                1,
                1,
                checked=False)

    def test_good_user_get_empty_day(self):
        new_day = ConferenceDayFactory(conference=self.day.conference,
                                       day=self.day.day+timedelta(14))
        login_as(self.privileged_profile, self)
        data = {
            "%s-day" % self.day.conference.conference_slug: new_day.pk,
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, self.show_context.show.e_title)
        self.assertNotContains(response, self.class_context.bid.e_title)
        counter = 0
        for day in self.day.conference.conferenceday_set.all().order_by('day'):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "day",
                counter,
                day.pk,
                checked=(day == new_day))
            counter += 1

    def test_good_user_filter_staff_area(self):
        other_staff_area = StaffAreaContext(
            conference=self.day.conference
        )
        login_as(self.privileged_profile, self)
        data = {
            "%s-staff_area" % self.day.conference.conference_slug: (
                self.staff_context.area.pk),
            "filter": "Filter",
        }
        response = self.client.get(self.url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, self.vol_opp.event.eventitem.e_title)
        self.assertContains(
            response,
            ('<a href="%s" class="gbe-table-link" data-toggle="tooltip" ' +
             'title="Edit">%s</a>') % (
                reverse("edit_staff",
                        urlconf="gbe.scheduling.urls",
                        args=[self.staff_context.area.pk]),
                self.staff_context.area.slug),
            html=True)
        index = 0
        for area in StaffArea.objects.filter(
                conference=self.day.conference).order_by('title'):
            self.assert_visible_input_selected(
                response,
                self.day.conference.conference_slug,
                "staff_area",
                index,
                area.pk,
                checked=(area == self.staff_context.area))
            index += 1

    def test_switch_conf_keep_filter(self):
        old_conf_day = ConferenceDayFactory(
            conference__status="completed",
            day=self.day.day + timedelta(3))
        url = reverse(self.view_name,
                      urlconf="gbe.scheduling.urls",
                      args=[old_conf_day.conference.conference_slug])
        login_as(self.privileged_profile, self)
        data = {
            "%s-day" % self.day.conference.conference_slug: self.day.pk,
            "%s-calendar_type" % self.day.conference.conference_slug: 1,
            "%s-day" % old_conf_day.conference.conference_slug: (
                old_conf_day.pk),
            "%s-calendar_type" % old_conf_day.conference.conference_slug: 0,
            "%s-staff_area" % self.day.conference.conference_slug: (
                self.staff_context.area.pk),
            "filter": "Filter",
        }
        response = self.client.get(url, data=data)
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, self.show_context.show.e_title)
        self.assertNotContains(response, self.class_context.bid.e_title)
        for day in self.day.conference.conferenceday_set.all().order_by('day'):
            self.assert_hidden_input_selected(
                response,
                self.day.conference.conference_slug,
                "day",
                0,
                day.pk,
                exists=(day == self.day))
        self.assert_hidden_input_selected(
            response,
            self.day.conference.conference_slug,
            "calendar_type",
            0,
            1)
        self.assert_hidden_input_selected(
            response,
            self.day.conference.conference_slug,
            "calendar_type",
            0,
            0,
            False)
        self.assert_hidden_input_selected(
            response,
            self.day.conference.conference_slug,
            "staff_area",
            0,
            self.staff_context.area.pk)
class TestSetVolunteer(TestCase):
    view_name = "set_volunteer"

    def setUp(self):
        self.client = Client()
        self.profile = ProfileFactory()
        self.context = StaffAreaContext()
        self.volunteeropp = self.context.add_volunteer_opp()
        self.url = reverse(self.view_name,
                           args=[self.volunteeropp.pk, "on"],
                           urlconf="gbe.scheduling.urls")
        self.unsub_link = Site.objects.get_current().domain + reverse(
            'email_update', urlconf='gbe.urls'
        ) + "?email_disable=send_schedule_change_notifications"

    def test_no_login_gives_error(self):
        response = self.client.get(self.url, follow=True)
        redirect_url = reverse('register',
                               urlconf='gbe.urls') + "?next=" + self.url
        self.assertRedirects(response, redirect_url)
        self.assertContains(response, "Create an Account")
        assert_alert_exists(
            response, 'warning', 'Warning', full_login_msg %
            (no_login_msg,
             reverse('login', urlconf='gbe.urls') + "?next=" + self.url))

    def test_unfinished_user(self):
        unfinished = UserFactory()
        login_as(unfinished, self)
        response = self.client.get(self.url, follow=True)
        redirect_url = reverse('register',
                               urlconf='gbe.urls') + "?next=" + self.url
        self.assertRedirects(response, redirect_url)
        self.assertContains(response, "Create an Account")
        assert_alert_exists(response, 'warning', 'Warning', no_profile_msg)

    def test_volunteer(self):
        login_as(self.profile, self)
        response = self.client.get(self.url, follow=True)
        redirect_url = reverse('home', urlconf="gbe.urls")
        self.assertRedirects(response, redirect_url)
        self.assertContains(response, self.volunteeropp.eventitem.e_title)
        assert_alert_exists(response, 'success', 'Success', set_volunteer_msg)
        msg = assert_email_template_used(
            "A change has been made to your Volunteer Schedule!",
            outbox_size=2)
        assert ("http://%s%s" % (Site.objects.get_current().domain,
                                 reverse('home', urlconf='gbe.urls'))
                in msg.body)
        assert_email_recipient([self.profile.user_object.email], outbox_size=2)
        staff_msg = assert_email_template_used("Volunteer Schedule Change",
                                               outbox_size=2,
                                               message_index=1)
        assert (self.volunteeropp.eventitem.e_title in staff_msg.body)
        assert_email_recipient(
            [self.context.staff_lead.profile.user_object.email],
            outbox_size=2,
            message_index=1)

    def test_remove_volunteer(self):
        self.url = reverse(self.view_name,
                           args=[self.volunteeropp.pk, "off"],
                           urlconf="gbe.scheduling.urls")
        self.context.book_volunteer(volunteer_sched_event=self.volunteeropp,
                                    volunteer=self.profile)
        redirect_url = reverse('volunteer_signup',
                               urlconf="gbe.scheduling.urls")
        login_as(self.profile, self)
        response = self.client.get("%s?next=%s" % (self.url, redirect_url),
                                   follow=True)
        self.assertRedirects(response, redirect_url)
        self.assertContains(response, self.volunteeropp.eventitem.e_title)
        assert_alert_exists(response, 'success', 'Success',
                            unset_volunteer_msg)
        msg = assert_email_template_used(
            "A change has been made to your Volunteer Schedule!",
            outbox_size=2)
        assert ("http://%s%s" % (Site.objects.get_current().domain,
                                 reverse('home', urlconf='gbe.urls'))
                in msg.body)
        assert_email_recipient([self.profile.user_object.email], outbox_size=2)
        staff_msg = assert_email_template_used("Volunteer Schedule Change",
                                               outbox_size=2,
                                               message_index=1)
        assert (self.volunteeropp.eventitem.e_title in staff_msg.body)
        assert_email_recipient(
            [self.context.staff_lead.profile.user_object.email],
            outbox_size=2,
            message_index=1)

    def test_volunteer_duplicate(self):
        self.context.book_volunteer(volunteer_sched_event=self.volunteeropp,
                                    volunteer=self.profile)
        login_as(self.profile, self)
        response = self.client.get(self.url, follow=True)
        self.assertContains(response, self.volunteeropp.eventitem.e_title)
        self.assertNotContains(response, set_volunteer_msg)

    def test_remove_interest_duplicate(self):
        self.url = reverse(self.view_name,
                           args=[self.volunteeropp.pk, "off"],
                           urlconf="gbe.scheduling.urls")
        login_as(self.profile, self)
        response = self.client.get(self.url, follow=True)
        self.assertNotContains(response, self.volunteeropp.eventitem.e_title)
        self.assertNotContains(response, unset_volunteer_msg)

    def test_show_interest_bad_event(self):
        self.url = reverse(self.view_name,
                           args=[self.volunteeropp.pk + 100, "on"],
                           urlconf="gbe.scheduling.urls")
        login_as(self.profile, self)
        response = self.client.get(self.url, follow=True)
        self.assertContains(
            response,
            "Occurrence id %d not found" % (self.volunteeropp.pk + 100))

    def test_volunteer_needs_approval(self):
        self.volunteeropp.approval_needed = True
        self.volunteeropp.save()
        login_as(self.profile, self)
        response = self.client.get(self.url, follow=True)
        redirect_url = reverse('home', urlconf="gbe.urls")
        self.assertRedirects(response, redirect_url)
        # absent because pending events not on schedule to begin with
        self.assertNotContains(response, self.volunteeropp.eventitem.e_title)
        assert_alert_exists(response, 'success', 'Success', set_pending_msg)

    def test_remove_pending_volunteer(self):
        self.volunteeropp.approval_needed = True
        self.volunteeropp.save()
        self.url = reverse(self.view_name,
                           args=[self.volunteeropp.pk, "off"],
                           urlconf="gbe.scheduling.urls")
        self.context.book_volunteer(volunteer_sched_event=self.volunteeropp,
                                    volunteer=self.profile,
                                    role="Pending Volunteer")
        redirect_url = reverse('volunteer_signup',
                               urlconf="gbe.scheduling.urls")
        login_as(self.profile, self)
        response = self.client.get("%s?next=%s" % (self.url, redirect_url),
                                   follow=True)
        self.assertRedirects(response, redirect_url)
        self.assertContains(response, self.volunteeropp.eventitem.e_title)
        assert_alert_exists(response, 'success', 'Success', unset_pending_msg)

    def test_volunteer_conflict(self):
        self.privileged_profile = ProfileFactory()
        self.privileged_user = self.privileged_profile.user_object
        grant_privilege(self.privileged_user, 'Volunteer Coordinator')
        class_context = ClassContext(
            conference=self.context.conference,
            teacher=PersonaFactory(performer_profile=self.profile),
            starttime=self.volunteeropp.starttime)
        login_as(self.profile, self)
        response = self.client.get(self.url, follow=True)
        redirect_url = reverse('home', urlconf="gbe.urls")
        msg = assert_email_template_used(
            "A change has been made to your Volunteer Schedule!",
            outbox_size=2)
        assert ("http://%s%s" % (Site.objects.get_current().domain,
                                 reverse('home', urlconf='gbe.urls'))
                in msg.body)
        assert_email_recipient([self.profile.user_object.email], outbox_size=2)
        staff_msg = assert_email_template_used("Volunteer Schedule Change",
                                               outbox_size=2,
                                               message_index=1)
        assert (self.volunteeropp.eventitem.e_title in staff_msg.body)
        conflict_msg = 'Conflicting booking: %s, Start Time: %s' % (
            class_context.bid.e_title,
            class_context.sched_event.starttime.strftime(GBE_DATETIME_FORMAT))
        assert (class_context.bid.e_title in staff_msg.body)
        assert_email_recipient([
            self.privileged_user.email,
            self.context.staff_lead.profile.user_object.email
        ],
                               outbox_size=2,
                               message_index=1)
        self.assertContains(response, conflict_msg)
        assert (conflict_msg in staff_msg.body)

    def test_parent_event(self):
        vol_context = VolunteerContext(conference=self.context.conference)
        lead = vol_context.set_staff_lead()
        class_context = ClassContext(
            conference=self.context.conference,
            teacher=PersonaFactory(performer_profile=self.profile),
            starttime=vol_context.opp_event.starttime)
        url = reverse(self.view_name,
                      args=[vol_context.opp_event.pk, "on"],
                      urlconf="gbe.scheduling.urls")
        login_as(self.profile, self)
        response = self.client.get(url, follow=True)
        staff_msg = assert_email_template_used("Volunteer Schedule Change",
                                               outbox_size=2,
                                               message_index=1)
        assert (vol_context.opportunity.e_title in staff_msg.body)
        conflict_msg = 'Conflicting booking: %s, Start Time: %s' % (
            class_context.bid.e_title,
            class_context.sched_event.starttime.strftime(GBE_DATETIME_FORMAT))
        assert (class_context.bid.e_title in staff_msg.body)
        assert_email_recipient([lead.user_object.email],
                               outbox_size=2,
                               message_index=1)
        self.assertContains(response, conflict_msg)
        assert (conflict_msg in staff_msg.body)

    def test_email_fail(self):
        self.context.area.staff_lead = self.profile
        self.context.area.save()
        template = EmailTemplateFactory(
            name='volunteer changed schedule',
            content="{% include 'gbe/email/bad.tmpl' %}")
        login_as(self.profile, self)
        response = self.client.get(self.url, follow=True)
        redirect_url = reverse('home', urlconf="gbe.urls")
        self.assertRedirects(response, redirect_url)
        self.assertContains(response, volunteer_allocate_email_fail_msg)