def test_no_past_conference_details(self): '''only current conference events, and windows should be shown''' # horrible setup process. Need to fix data = self.set_basic_opportunity() past_context = StaffAreaContext(conference=ConferenceFactory( status='completed')) past_opp = past_context.add_volunteer_opp() past_opp.starttime = datetime(2015, 2, 25, 6, 0, 0, 0, pytz.utc) past_opp.eventitem.max_volunteer = 10 past_opp.eventitem.save() past_window = VolunteerWindowFactory( day__conference=past_context.conference) url = reverse(self.view_name, args=[data['volunteer'].pk], urlconf="gbe.urls") login_as(self.privileged_user, self) response = self.client.get(url) nt.assert_not_in( str(past_opp.eventitem), response.content, msg="Event Title for past_opportunity should not show up") nt.assert_not_in(date_format(past_opp.starttime, "SHORT_DATETIME_FORMAT"), response.content, msg="start time for past_sched shouldn't show up")
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(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_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)
def test_no_past_conference_details(self): '''only current conference events, and windows should be shown''' # horrible setup process. Need to fix data = self.set_basic_opportunity() past_context = StaffAreaContext( conference=ConferenceFactory( status='completed')) past_opp = past_context.add_volunteer_opp() past_opp.starttime = datetime(2015, 2, 25, 6, 0, 0, 0, pytz.utc) past_opp.eventitem.max_volunteer = 10 past_opp.eventitem.save() past_window = VolunteerWindowFactory( day__conference=past_context.conference) url = reverse(self.view_name, args=[data['volunteer'].pk], urlconf="gbe.urls") login_as(self.privileged_user, self) response = self.client.get(url) nt.assert_not_in( str(past_opp.eventitem), response.content, msg="Event Title for past_opportunity should not show up") nt.assert_not_in( date_format(past_opp.starttime, "SHORT_DATETIME_FORMAT"), response.content, msg="start time for past_sched shouldn't show up")
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_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_inactive_user_not_listed(self): staff_context = StaffAreaContext() volunteer_sched_event = staff_context.add_volunteer_opp() inactive_persona = PersonaFactory( contact__user_object__is_active=False) login_as(self.privileged_user, self) 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.assertNotIn(str(inactive_persona), response.content) self.assertNotIn(str(inactive_persona.contact), response.content)
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_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_past_event(self): staff_context = StaffAreaContext(conference=self.conf) opportunity = staff_context.add_volunteer_opp() 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.assertNotContains(response, vol_link) self.assertNotContains(response, 'class="volunteer-icon"')
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)
def test_authorized_user_get_set_staff_area(self): staff = StaffAreaContext() vol_sched_event = staff.add_volunteer_opp() login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[vol_sched_event.pk], urlconf='gbe.scheduling.urls') response = self.client.get(self.url) self.assertContains( response, '<option value="%d" selected>%s</option>' % ( staff.area.pk, staff.area.title), html=True)
def test_view_volunteers(self): staff_context = StaffAreaContext() opportunity = staff_context.add_volunteer_opp() opportunity.starttime = datetime.now() + timedelta(days=1) opportunity.save() 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, 'on'], urlconf='gbe.scheduling.urls') self.assertContains(response, opportunity.eventitem.e_title) self.assertContains(response, vol_link) self.assertContains(response, 'volunteered.gif" class="volunteer-icon-large"')
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 set_basic_opportunity(self): context = StaffAreaContext() current_sched = context.add_volunteer_opp() current_sched.starttime = datetime(2016, 2, 5, 12, 0, 0, 0, pytz.utc) current_sched.max_volunteer = 10 current_sched.save() current_window = VolunteerWindowFactory( day__conference=context.conference) volunteer = VolunteerFactory(b_conference=context.conference, submitted=True) volunteer.available_windows.add(current_window) volunteer.save() return { 'context': context, 'area': context.area, 'current_sched': current_sched, 'current_window': current_window, 'volunteer': volunteer }
def test_edit_event_unset_area(self): staff_context = StaffAreaContext() volunteer_sched_event = staff_context.add_volunteer_opp() volunteer_sched_event.approval_needed = True volunteer_sched_event.save() url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[staff_context.conference.conference_slug, volunteer_sched_event.pk]) grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) data = self.edit_event() data['edit_event'] = "Save and Continue" response = self.client.post( self.url, data=data, follow=True) self.assertContains( response, '<option value="%d">%s</option>' % ( staff_context.area.pk, staff_context.area), html=True)
def test_view_volunteers(self): this_class = ClassFactory.create(accepted=3, e_conference=self.conf, b_conference=self.conf) staff_context = StaffAreaContext(conference=self.conf) opportunity = staff_context.add_volunteer_opp() opportunity.starttime = datetime.now() + timedelta(days=1) opportunity.save() login_as(ProfileFactory(), self) 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, vol_link) self.assertContains(response, 'volunteered.gif" class="volunteer-icon"') self.assertNotContains(response, this_class.e_title) self.assertNotContains(response, 'fa-star') self.assertNotContains(response, 'fa-star-o')
def set_basic_opportunity(self): context = StaffAreaContext() current_sched = context.add_volunteer_opp() current_sched.starttime = datetime(2016, 2, 5, 12, 0, 0, 0, pytz.utc) current_sched.max_volunteer = 10 current_sched.save() current_window = VolunteerWindowFactory( day__conference=context.conference) volunteer = VolunteerFactory( b_conference=context.conference, submitted=True) volunteer.available_windows.add(current_window) volunteer.save() return { 'context': context, 'area': context.area, 'current_sched': current_sched, 'current_window': current_window, 'volunteer': volunteer }
class TestCopyOccurrence(TestCase): view_name = 'copy_staff_schedule' copy_date_format = "%a, %b %-d, %Y %-I:%M %p" def setUp(self): self.context = StaffAreaContext() self.vol_opp = self.context.add_volunteer_opp() self.url = reverse( self.view_name, args=[self.context.area.pk], urlconf='gbe.scheduling.urls') self.factory = RequestFactory() self.client = Client() self.privileged_user = ProfileFactory().user_object grant_privilege(self.privileged_user, 'Scheduling Mavens') def assert_good_mode_form(self, response, title): self.assertEqual(response.status_code, 200) self.assertContains(response, self.context.conf_day.day.strftime(DATE_FORMAT)) self.assertContains(response, copy_mode_choices[0][1]) self.assertContains(response, copy_mode_choices[1][1]) def test_create_event_unauthorized_user(self): login_as(ProfileFactory(), self) response = self.client.get(self.url) self.assertEqual(403, response.status_code) def test_authorized_user_can_access(self): login_as(self.privileged_user, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains(response, "Copying - %s" % self.context.area.title) def test_bad_area(self): url = reverse( self.view_name, args=[self.context.area.pk+100], urlconf='gbe.scheduling.urls') login_as(self.privileged_user, self) response = self.client.get(url) self.assertEqual(response.status_code, 404) def test_authorized_user_get_no_conf_days(self): alt_context = StaffAreaContext() login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[alt_context.area.pk], urlconf='gbe.scheduling.urls') response = self.client.get(self.url, follow=True) self.assertRedirects(response, reverse( 'manage_event_list', urlconf='gbe.scheduling.urls', args=[alt_context.conference.conference_slug])) assert_alert_exists( response, 'danger', 'Error', no_conf_day_msg) def test_authorized_user_get_no_children(self): alt_context = StaffAreaContext() ConferenceDayFactory(conference=alt_context.conference) login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[alt_context.area.pk], urlconf='gbe.scheduling.urls') response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 200) self.assertContains(response, self.context.conf_day.day.strftime(DATE_FORMAT)) self.assertNotContains(response, copy_mode_choices[0][1]) def test_authorized_user_get_w_child_events(self): login_as(self.privileged_user, self) response = self.client.get(self.url) self.assert_good_mode_form( response, self.context.area.title) def test_authorized_user_pick_mode_only_children(self): target_context = StaffAreaContext() delta = timedelta(days=340) target_day = ConferenceDayFactory( conference=target_context.conference, day=self.context.conf_day.day + delta) data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.area.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains( response, '<input checked="checked" id="id_copy_mode_0" name="copy_mode" ' + 'type="radio" value="copy_children_only" />') self.assertContains( response, '<option value="%d" selected="selected">' % ( target_context.area.pk)) self.assertContains(response, "Choose Sub-Events to be copied") self.assertContains(response, "%s - %s" % ( self.vol_opp.eventitem.e_title, (self.vol_opp.start_time + delta).strftime( self.copy_date_format))) def test_authorized_user_pick_mode_children_same_conf(self): target_context = StaffAreaContext(conference=self.context.conference) data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.area.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains( response, '<input checked="checked" id="id_copy_mode_0" name="copy_mode" ' + 'type="radio" value="copy_children_only" />') self.assertContains( response, '<option value="%d" selected="selected">' % ( target_context.area.pk)) self.assertContains(response, "Choose Sub-Events to be copied") self.assertContains(response, "%s - %s" % ( self.vol_opp.eventitem.e_title, self.vol_opp.start_time.strftime(self.copy_date_format))) def test_copy_child_event(self): target_context = StaffAreaContext() target_day = ConferenceDayFactory( conference=target_context.conference, day=self.context.conf_day.day + timedelta(days=340)) data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.area.pk, 'copied_event': self.vol_opp.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) max_pk = Event.objects.latest('pk').pk redirect_url = "%s?%s-day=%d&filter=Filter&new=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[target_context.conference.conference_slug]), target_context.conference.conference_slug, target_day.pk, str([max_pk]),) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( self.vol_opp.eventitem.e_title, datetime.combine( target_day.day, self.vol_opp.starttime.time()).strftime( DATETIME_FORMAT))) def test_copy_child_parent_events(self): another_day = ConferenceDayFactory() data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': self.vol_opp.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(self.url, data=data, follow=True) new_occurrences = [] for occurrence in Event.objects.filter(pk__gt=max_pk): new_occurrences += [occurrence.pk] redirect_url = "%s?%s-day=%d&filter=Filter&new=%s&alt_id=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_day.pk, replace(str(new_occurrences), " ", "%20"), self.context.area.pk+1) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'A new Staff Area was created.<br>Staff Area: %s' % ( self.context.area.title)) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( self.vol_opp.eventitem.e_title, datetime.combine( another_day.day, self.vol_opp.starttime.time()).strftime( DATETIME_FORMAT))) def test_copy_child_parent_events_same_conf(self): data = { 'copy_mode': 'include_parent', 'copy_to_day': self.context.conf_day.pk, 'copied_event': self.vol_opp.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(self.url, data=data, follow=True) new_occurrences = [] max_area = StaffArea.objects.latest('pk') for occurrence in Event.objects.filter(pk__gt=max_pk): new_occurrences += [occurrence.pk] redirect_url = "%s?%s-day=%d&filter=Filter&new=%s&alt_id=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug]), self.context.conference.conference_slug, self.context.conf_day.pk, replace(str(new_occurrences), " ", "%20"), max_area.pk) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'A new Staff Area was created.<br>Staff Area: %s' % ( max_area.title)) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( self.vol_opp.eventitem.e_title, datetime.combine( self.context.conf_day.day, self.vol_opp.starttime.time()).strftime( DATETIME_FORMAT))) def test_copy_only_parent_event(self): another_day = ConferenceDayFactory() data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) max_area = StaffArea.objects.latest('pk') redirect_url = "%s?%s-day=%d&filter=Filter&alt_id=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_day.pk, max_area.pk,) self.assertRedirects(response, redirect_url) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'A new Staff Area was created.<br>Staff Area: %s' % ( max_area.title)) def test_copy_child_event_fail_no_conf(self): target_context = StaffAreaContext() self.url = reverse( self.view_name, args=[target_context.area.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.area.pk, 'copied_event': self.vol_opp.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) self.assertRedirects(response, reverse( 'manage_event_list', urlconf='gbe.scheduling.urls', args=[target_context.conference.conference_slug])) assert_alert_exists( response, 'danger', 'Error', no_conf_day_msg)
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 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]))
class TestEditStaffAreaView(TestCase): '''This view edits classes that were made through the wizard''' view_name = 'edit_staff' def setUp(self): self.room = RoomFactory() self.context = StaffAreaContext() self.context.area.default_volunteers = 7 self.context.area.save() self.url = reverse( self.view_name, args=[self.context.area.pk], urlconf='gbe.scheduling.urls') self.client = Client() self.privileged_user = ProfileFactory().user_object grant_privilege(self.privileged_user, 'Scheduling Mavens') def edit_area(self): data = { 'title': "Test Edit Staff", 'slug': "New_slug", 'conference': self.context.conference.pk, 'description': 'Description', 'default_volunteers': 3, 'location': self.room.pk, 'staff_lead': self.privileged_user.profile.pk, 'edit_event': "Save and Return", } return data def test_edit_unauthorized_user(self): login_as(ProfileFactory(), self) response = self.client.get(self.url) self.assertEqual(403, response.status_code) def test_authorized_user_can_access(self): login_as(self.privileged_user, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertNotContains(response, "Volunteer Management") self.assertContains(response, "Edit Staff Area Details") self.assertContains(response, self.context.area.title) self.assertContains(response, self.context.area.description) self.assertContains( response, '<option value="%d" selected="selected">%s</option>' % ( self.context.staff_lead.profile.pk, str(self.context.staff_lead.profile))) self.assertContains( response, 'name="default_volunteers" type="number" value="7"') def test_authorized_user_can_get_volunteer_mgmt(self): self.context.area.default_location = self.room self.context.area.save() grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 200) self.assertContains(response, "Volunteer Management") self.assertContains(response, "Save and Continue") self.assertContains( response, 'name="new_opp-max_volunteer" type="number" value="7" />') self.assertContains( response, '<option value="%d" selected="selected">%s</option>' % ( self.room.pk, str(self.room)), 2) def test_vol_opp_present(self): self.context.area.default_room = self.room self.context.area.save() vol_opp = self.context.add_volunteer_opp() self.extra_day = ConferenceDayFactory( conference=self.context.conference, day=self.context.conf_day.day + timedelta(days=1)) grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) response = self.client.get(self.url, follow=True) self.assertContains( response, 'name="opp_event_id" type="hidden" value="%d" />' % ( vol_opp.eventitem.event_id) ) self.assertContains( response, 'name="opp_sched_id" type="hidden" value="%d" />' % ( vol_opp.pk) ) self.assertContains( response, '<option value="%d" selected="selected">%s</option>' % ( self.context.conf_day.pk, self.context.conf_day.day.strftime("%b. %-d, %Y"))) self.assertContains( response, 'name="max_volunteer" type="number" value="7" />') def test_bad_staff_area(self): login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.area.pk+1000], urlconf='gbe.scheduling.urls') response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 404) def test_edit_area(self): login_as(self.privileged_user, self) response = self.client.post( self.url, data=self.edit_area(), follow=True) self.assertRedirects( response, reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug])) assert_alert_exists( response, 'success', 'Success', 'Staff Area has been updated.<br>Title: Test Edit Staff') def test_edit_area_and_continue(self): grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) data = self.edit_area() data['edit_event'] = "Save and Continue" response = self.client.post( self.url, data=data, follow=True) self.assertRedirects( response, "%s?volunteer_open=True" % self.url) assert_alert_exists( response, 'success', 'Success', 'Staff Area has been updated.<br>Title: %s' % ( data['title'])) self.assertContains(response, data['title']) self.assertContains(response, data['description']) self.assertContains( response, '<option value="%d" selected="selected">%s</option>' % ( self.privileged_user.profile.pk, str(self.privileged_user.profile))) self.assertContains( response, 'name="default_volunteers" type="number" value="3" />') def test_auth_user_bad_user_assign(self): login_as(self.privileged_user, self) data = self.edit_area() data['staff_lead'] = "bad role" response = self.client.post( self.url, data=data, follow=True) self.assertContains( response, "That choice is not one of the available choices.")
class TestEditStaffAreaView(TestCase): '''This view edits classes that were made through the wizard''' view_name = 'edit_staff' def setUp(self): self.room = RoomFactory() self.context = StaffAreaContext() self.context.area.default_volunteers = 7 self.context.area.save() self.room.conferences.add(self.context.conference) self.url = reverse(self.view_name, args=[self.context.area.pk], urlconf='gbe.scheduling.urls') self.client = Client() self.privileged_user = ProfileFactory().user_object grant_privilege(self.privileged_user, 'Scheduling Mavens') def edit_area(self): data = { 'title': "Test Edit Staff", 'slug': "New_slug", 'conference': self.context.conference.pk, 'description': 'Description', 'default_volunteers': 3, 'location': self.room.pk, 'staff_lead': self.privileged_user.profile.pk, 'edit_event': "Save and Return", } return data def test_edit_unauthorized_user(self): login_as(ProfileFactory(), self) response = self.client.get(self.url) self.assertEqual(403, response.status_code) def test_authorized_user_can_access(self): login_as(self.privileged_user, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertNotContains(response, "Volunteer Management") self.assertContains(response, "Edit Staff Area Details") self.assertContains(response, self.context.area.title) self.assertContains(response, self.context.area.description) assert_option_state(response, self.context.staff_lead.profile.pk, str(self.context.staff_lead.profile), True) self.assertContains(response, 'name="default_volunteers" value="7"') def test_authorized_user_can_get_volunteer_mgmt(self): self.context.area.default_location = self.room self.context.area.save() grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 200) self.assertContains(response, "Volunteer Management") self.assertContains(response, "Save and Continue") self.assertContains(response, 'name="new_opp-max_volunteer" value="7"') self.assertContains( response, '<option value="%d" selected>%s</option>' % (self.room.pk, str(self.room)), 2) def test_vol_opp_present(self): self.context.area.default_room = self.room self.context.area.save() vol_opp = self.context.add_volunteer_opp() self.extra_day = ConferenceDayFactory( conference=self.context.conference, day=self.context.conf_day.day + timedelta(days=1)) grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) response = self.client.get(self.url, follow=True) self.assertContains( response, 'name="opp_event_id" value="%d"' % (vol_opp.eventitem.event_id)) self.assertContains(response, 'name="opp_sched_id" value="%d"' % (vol_opp.pk)) assert_option_state(response, self.context.conf_day.pk, self.context.conf_day.day.strftime("%b. %-d, %Y"), True) self.assertContains(response, 'name="max_volunteer" value="7"') self.assertContains(response, "Display Staff", 2) def test_bad_staff_area(self): login_as(self.privileged_user, self) self.url = reverse(self.view_name, args=[self.context.area.pk + 1000], urlconf='gbe.scheduling.urls') response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 404) def test_edit_area(self): login_as(self.privileged_user, self) response = self.client.post(self.url, data=self.edit_area(), follow=True) self.assertRedirects( response, reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug])) assert_alert_exists( response, 'success', 'Success', 'Staff Area has been updated.<br>Title: Test Edit Staff') def test_edit_area_and_continue(self): grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) data = self.edit_area() data['edit_event'] = "Save and Continue" response = self.client.post(self.url, data=data, follow=True) self.assertRedirects(response, "%s?volunteer_open=True" % self.url) assert_alert_exists( response, 'success', 'Success', 'Staff Area has been updated.<br>Title: %s' % (data['title'])) self.assertContains(response, data['title']) self.assertContains(response, data['description']) assert_option_state(response, self.privileged_user.profile.pk, str(self.privileged_user.profile), True) self.assertContains(response, 'name="default_volunteers" value="3"') def test_auth_user_bad_user_assign(self): login_as(self.privileged_user, self) data = self.edit_area() data['staff_lead'] = Profile.objects.aggregate( Max('pk'))['pk__max'] + 1 response = self.client.post(self.url, data=data, follow=True) self.assertContains( response, "That choice is not one of the available choices.") def test_create_not_avail_room_fails(self): not_now_room = RoomFactory() login_as(self.privileged_user, self) data = self.edit_area() data['default_location'] = not_now_room.pk response = self.client.post(self.url, data=data, follow=True) self.assertContains( response, "That choice is not one of the available choices.") def test_room_to_conf_mapping(self): not_now_room = RoomFactory() login_as(self.privileged_user, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains(response, self.room.name) self.assertNotContains(response, not_now_room.name)
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 TestCopyOccurrence(TestCase): view_name = 'copy_staff_schedule' copy_date_format = "%a, %b %-d, %Y %-I:%M %p" def setUp(self): self.context = StaffAreaContext() self.vol_opp = self.context.add_volunteer_opp() self.url = reverse(self.view_name, args=[self.context.area.pk], urlconf='gbe.scheduling.urls') self.factory = RequestFactory() self.client = Client() self.privileged_user = ProfileFactory().user_object grant_privilege(self.privileged_user, 'Scheduling Mavens') def assert_good_mode_form(self, response, title): self.assertEqual(response.status_code, 200) self.assertContains(response, self.context.conf_day.day.strftime(DATE_FORMAT)) self.assertContains(response, copy_mode_choices[0][1]) self.assertContains(response, copy_mode_choices[1][1]) def test_create_event_unauthorized_user(self): login_as(ProfileFactory(), self) response = self.client.get(self.url) self.assertEqual(403, response.status_code) def test_authorized_user_can_access(self): login_as(self.privileged_user, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains(response, "Copying - %s" % self.context.area.title) def test_bad_area(self): url = reverse(self.view_name, args=[self.context.area.pk + 100], urlconf='gbe.scheduling.urls') login_as(self.privileged_user, self) response = self.client.get(url) self.assertEqual(response.status_code, 404) def test_authorized_user_get_no_conf_days(self): alt_context = StaffAreaContext() login_as(self.privileged_user, self) self.url = reverse(self.view_name, args=[alt_context.area.pk], urlconf='gbe.scheduling.urls') response = self.client.get(self.url, follow=True) self.assertRedirects( response, reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[alt_context.conference.conference_slug])) assert_alert_exists(response, 'danger', 'Error', no_conf_day_msg) def test_authorized_user_get_no_children(self): alt_context = StaffAreaContext() ConferenceDayFactory(conference=alt_context.conference) login_as(self.privileged_user, self) self.url = reverse(self.view_name, args=[alt_context.area.pk], urlconf='gbe.scheduling.urls') response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 200) self.assertContains(response, self.context.conf_day.day.strftime(DATE_FORMAT)) self.assertNotContains(response, copy_mode_choices[0][1]) def test_authorized_user_get_w_child_events(self): login_as(self.privileged_user, self) response = self.client.get(self.url) self.assert_good_mode_form(response, self.context.area.title) def test_authorized_user_pick_mode_only_children(self): target_context = StaffAreaContext() delta = timedelta(days=340) target_day = ConferenceDayFactory(conference=target_context.conference, day=self.context.conf_day.day + delta) data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.area.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains( response, '<input checked="checked" id="id_copy_mode_0" name="copy_mode" ' + 'type="radio" value="copy_children_only" />') self.assertContains( response, '<option value="%d" selected="selected">' % (target_context.area.pk)) self.assertContains(response, "Choose Sub-Events to be copied") self.assertContains( response, "%s - %s" % (self.vol_opp.eventitem.e_title, (self.vol_opp.start_time + delta).strftime( self.copy_date_format))) def test_authorized_user_pick_mode_children_same_conf(self): target_context = StaffAreaContext(conference=self.context.conference) data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.area.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains( response, '<input checked="checked" id="id_copy_mode_0" name="copy_mode" ' + 'type="radio" value="copy_children_only" />') self.assertContains( response, '<option value="%d" selected="selected">' % (target_context.area.pk)) self.assertContains(response, "Choose Sub-Events to be copied") self.assertContains( response, "%s - %s" % (self.vol_opp.eventitem.e_title, self.vol_opp.start_time.strftime(self.copy_date_format))) def test_copy_child_event(self): target_context = StaffAreaContext() target_day = ConferenceDayFactory(conference=target_context.conference, day=self.context.conf_day.day + timedelta(days=340)) data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.area.pk, 'copied_event': self.vol_opp.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) max_pk = Event.objects.latest('pk').pk redirect_url = "%s?%s-day=%d&filter=Filter&new=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[target_context.conference.conference_slug]), target_context.conference.conference_slug, target_day.pk, str([max_pk]), ) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % (self.vol_opp.eventitem.e_title, datetime.combine( target_day.day, self.vol_opp.starttime.time()).strftime(DATETIME_FORMAT))) def test_copy_child_parent_events(self): another_day = ConferenceDayFactory() data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': self.vol_opp.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(self.url, data=data, follow=True) new_occurrences = [] for occurrence in Event.objects.filter(pk__gt=max_pk): new_occurrences += [occurrence.pk] redirect_url = "%s?%s-day=%d&filter=Filter&new=%s&alt_id=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[another_day.conference.conference_slug ]), another_day.conference.conference_slug, another_day.pk, replace(str(new_occurrences), " ", "%20"), self.context.area.pk + 1) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'A new Staff Area was created.<br>Staff Area: %s' % (self.context.area.title)) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % (self.vol_opp.eventitem.e_title, datetime.combine( another_day.day, self.vol_opp.starttime.time()).strftime(DATETIME_FORMAT))) def test_copy_child_parent_events_same_conf(self): data = { 'copy_mode': 'include_parent', 'copy_to_day': self.context.conf_day.pk, 'copied_event': self.vol_opp.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(self.url, data=data, follow=True) new_occurrences = [] max_area = StaffArea.objects.latest('pk') for occurrence in Event.objects.filter(pk__gt=max_pk): new_occurrences += [occurrence.pk] redirect_url = "%s?%s-day=%d&filter=Filter&new=%s&alt_id=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug]), self.context.conference.conference_slug, self.context.conf_day.pk, replace(str(new_occurrences), " ", "%20"), max_area.pk) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'A new Staff Area was created.<br>Staff Area: %s' % (max_area.title)) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % (self.vol_opp.eventitem.e_title, datetime.combine( self.context.conf_day.day, self.vol_opp.starttime.time()).strftime(DATETIME_FORMAT))) def test_copy_only_parent_event(self): another_day = ConferenceDayFactory() data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) max_area = StaffArea.objects.latest('pk') redirect_url = "%s?%s-day=%d&filter=Filter&alt_id=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_day.pk, max_area.pk, ) self.assertRedirects(response, redirect_url) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'A new Staff Area was created.<br>Staff Area: %s' % (max_area.title)) def test_copy_child_event_fail_no_conf(self): target_context = StaffAreaContext() self.url = reverse(self.view_name, args=[target_context.area.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.area.pk, 'copied_event': self.vol_opp.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(self.url, data=data, follow=True) self.assertRedirects( response, reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[target_context.conference.conference_slug])) assert_alert_exists(response, 'danger', 'Error', no_conf_day_msg)
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 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)