def test_authorized_user_get_w_child_events_special(self): original_event = GenericEventFactory(type='Special') target_event = GenericEventFactory(type='Special') target_context = VolunteerContext(event=target_event) original_context = VolunteerContext(event=original_event) original_context.add_opportunity() url = reverse( self.view_name, args=[original_context.sched_event.pk], urlconf='gbe.scheduling.urls') login_as(self.privileged_user, self) response = self.client.get(url) self.assert_good_mode_form( response, target_context.event.e_title, target_context.sched_event.start_time) assert_option_state( response, target_context.room.pk, target_context.room.name) self.assertContains(response, target_event.e_title)
def test_volunteer_changestate_gives_overbook_warning(self): ProfilePreferencesFactory(profile=self.volunteer.profile) context = VolunteerContext( profile=self.volunteer.profile) x, opp = context.add_opportunity() url = reverse(self.view_name, args=[self.volunteer.pk], urlconf='gbe.urls') login_as(self.privileged_user, self) data = {'conference': context.conference, 'events': [opp.pk], 'accepted': 3} response = self.client.post(url, data=data, follow=True) self.assertContains(response, "SCHEDULE_CONFLICT")
def test_copy_child_not_like_parent(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() opportunity, opp_sched = show_context.add_opportunity( start_time=show_context.sched_event.starttime + timedelta(1.3)) opp_sched.approval_needed = True opp_sched.save() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': opp_sched.pk, 'room': self.context.room.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(url, data=data, follow=True) new_occurrences = [] for occurrence in Event.objects.filter(pk__gt=max_pk).order_by('pk'): new_occurrences += [occurrence.pk] redirect_url = "%s?%s-day=%d&filter=Filter&new=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_day.pk, str(new_occurrences).replace(" ", "%20")) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( opportunity.e_title, datetime.combine( another_day.day + timedelta(1), opp_sched.starttime.time()).strftime( GBE_DATETIME_FORMAT))) new_vol_opp = Event.objects.get(pk=max_pk) self.assertEqual(new_vol_opp.max_volunteer, opp_sched.max_volunteer) self.assertEqual(new_vol_opp.location, opp_sched.location) self.assertTrue(new_vol_opp.approval_needed)
def test_copy_child_not_like_parent(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() opportunity, opp_sched = show_context.add_opportunity( start_time=show_context.sched_event.starttime + timedelta(1.3)) url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': opp_sched.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(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" % ( 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.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( opportunity.e_title, datetime.combine( another_day.day + timedelta(1), opp_sched.starttime.time()).strftime( DATETIME_FORMAT))) new_vol_opp = Event.objects.get(pk=max_pk) self.assertEqual(new_vol_opp.max_volunteer, opp_sched.max_volunteer) self.assertEqual(new_vol_opp.location, opp_sched.location)
class TestShowVolunteers(TestCase): view_name = 'edit_volunteer' 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 = VolunteerContext() self.url = reverse(self.view_name, args=[ self.context.conference.conference_slug, self.context.opp_event.pk ], urlconf="gbe.scheduling.urls") 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_volunteer_has_conflict(self): login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" not in response.content) assert_link(response, self.url) def test_volunteer_has_class_conflict(self): class_context = ClassContext( conference=self.context.conference, teacher=PersonaFactory(performer_profile=self.context.profile), starttime=self.context.opp_event.start_time) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" not in response.content) assert_link( response, reverse(self.view_name, args=[ self.context.conference.conference_slug, class_context.sched_event.pk ], urlconf="gbe.scheduling.urls")) def test_volunteer_has_show_conflict(self): show_context = ShowContext( conference=self.context.conference, performer=PersonaFactory(performer_profile=self.context.profile), starttime=self.context.opp_event.start_time) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" not in response.content) assert_link( response, reverse(self.view_name, args=[ self.context.conference.conference_slug, show_context.sched_event.pk ], urlconf="gbe.scheduling.urls")) def test_volunteer_has_earlier_conflict(self): opportunity, opp_event = self.context.add_opportunity( start_time=self.context.opp_event.start_time - timedelta(minutes=30)) conflict = ResourceAllocationFactory(resource=self.context.worker, event=opp_event) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" not in response.content) assert_link( response, reverse( self.view_name, args=[self.context.conference.conference_slug, opp_event.pk], urlconf="gbe.scheduling.urls")) def test_volunteer_is_available(self): self.context.bid.available_windows.add(self.context.window) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" not in response.content) assert ('<td class="bid-table">Available</td>' in response.content) def test_volunteer_is_not_available(self): login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" not in response.content) assert ('<td class="bid-table">Not Available</td>' in response.content) def test_volunteer_is_really_not_available(self): self.context.bid.unavailable_windows.add(self.context.window) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" in response.content) def test_volunteer_is_interested(self): login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ('4 - Somewhat interested' in response.content) def test_volunteer_is_not(self): self.context.interest.rank = 0 self.context.interest.save() login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ('4 - Somewhat interested' not in response.content) assert ("no available volunteers" not in response.content) def test_volunteer_has_no_rank(self): self.context.interest.delete() login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ('4 - Somewhat interested' not in response.content) assert ("no available volunteers" not in response.content)
class TestCopyOccurrence(TestGBE): view_name = 'copy_event_schedule' copy_date_format = "%a, %b %-d, %Y %-I:%M %p" def setUp(self): self.context = VolunteerContext() self.url = reverse( self.view_name, args=[self.context.sched_event.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, date): self.assertEqual(response.status_code, 200) self.assertContains( response, self.context.conf_day.day.strftime(GBE_DATE_FORMAT)) self.assertContains(response, copy_mode_choices[0][1]) self.assertContains(response, copy_mode_choices[1][1]) self.assertContains(response, "%s - %s" % ( title, date.strftime(GBE_DATETIME_FORMAT))) def get_solo_data(self): another_day = ConferenceDayFactory( conference=self.context.conference, day=self.context.conf_day.day + timedelta(days=1)) other_room = RoomFactory() other_room.conferences.add(another_day.conference) data = { 'copy_to_day': another_day.pk, 'room': other_room.pk, 'copy_mode': ['choose_day'], 'pick_mode': "Next", } return data, another_day, other_room 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: %s" % ( self.context.event.e_title, self.context.sched_event.starttime.strftime( self.copy_date_format))) def test_authorized_user_get_no_child_event(self): login_as(self.privileged_user, self) staff = StaffAreaContext() self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains( response, self.context.conf_day.day.strftime(GBE_DATE_FORMAT)) self.assertContains(response, copy_mode_solo_choices[0][1]) self.assertContains(response, staff.area.title) self.assertContains(response, self.context.event.e_title) 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_authorized_user_get_right_rooms(self): not_this_room = RoomFactory() login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains( response, self.context.conf_day.day.strftime(GBE_DATE_FORMAT)) self.assertNotContains(response, not_this_room.name) assert_option_state( response, self.context.room.pk, self.context.room.name, True) def test_authorized_user_get_w_child_events(self): target_event = VolunteerContext() self.context.add_opportunity() login_as(self.privileged_user, self) response = self.client.get(self.url) self.assert_good_mode_form( response, target_event.event.e_title, target_event.sched_event.start_time) assert_option_state( response, target_event.room.pk, target_event.room.name) def test_authorized_user_get_w_child_events_special(self): original_event = GenericEventFactory(type='Special') target_event = GenericEventFactory(type='Special') target_context = VolunteerContext(event=target_event) original_context = VolunteerContext(event=original_event) original_context.add_opportunity() url = reverse( self.view_name, args=[original_context.sched_event.pk], urlconf='gbe.scheduling.urls') login_as(self.privileged_user, self) response = self.client.get(url) self.assert_good_mode_form( response, target_context.event.e_title, target_context.sched_event.start_time) assert_option_state( response, target_context.room.pk, target_context.room.name) self.assertContains(response, target_event.e_title) def test_bad_occurrence(self): url = reverse( self.view_name, args=[self.context.sched_event.pk+100], urlconf='gbe.scheduling.urls') login_as(self.privileged_user, self) response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 404) def test_authorized_user_get_show(self): show_context = VolunteerContext() target_context = ShowContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') login_as(self.privileged_user, self) response = self.client.get(url) self.assert_good_mode_form( response, target_context.show.e_title, target_context.sched_event.start_time) def test_authorized_user_get_class(self): copy_class = ClassFactory() vol_context = VolunteerContext(event=copy_class) target_context = ClassContext() url = reverse( self.view_name, args=[vol_context.sched_event.pk], urlconf='gbe.scheduling.urls') login_as(self.privileged_user, self) response = self.client.get(url) # copying ONLY volunteer events is OK, but copying the class is not self.assertEqual(403, response.status_code) def test_copy_single_event(self): login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') data, another_day, other_room = self.get_solo_data() 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=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_day.pk, str([max_pk]),) self.assertRedirects(response, redirect_url) self.assertContains(response, other_room.name) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( self.context.opportunity.e_title, datetime.combine( another_day.day, self.context.opp_event.starttime.time()).strftime( GBE_DATETIME_FORMAT))) def test_copy_single_event_date_wins(self): login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') data, another_day, other_room = self.get_solo_data() data['copy_mode'] = ['copy_to_parent', 'choose_day'] data['target_event'] = self.context.sched_event.pk 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=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_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.context.opportunity.e_title, datetime.combine( another_day.day, self.context.opp_event.starttime.time()).strftime( GBE_DATETIME_FORMAT))) def test_copy_single_set_area(self): data, another_day, other_room = self.get_solo_data() staff = StaffAreaContext(conference=another_day.conference) data['copy_mode'] = ['copy_to_area', 'choose_day'] data['area'] = staff.area.pk login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') 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=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_day.pk, str([max_pk]),) self.assertRedirects(response, redirect_url) self.assertContains(response, other_room.name) self.assertContains(response, reverse( 'edit_staff', urlconf='gbe.scheduling.urls', args=[staff.area.pk])) def test_copy_single_set_parent(self): data = { 'target_event': self.context.sched_event.pk, 'room': self.context.room.pk, 'copy_mode': ['copy_to_parent'], 'pick_mode': "Next", } login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') 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=[self.context.conference.conference_slug]), self.context.conference.conference_slug, self.context.conf_day.pk, str([max_pk]),) self.assertRedirects(response, redirect_url) self.assertContains(response, self.context.room.name, 3) self.assertContains(response, self.context.event.e_title, 3) def test_copy_single_no_delta(self): data, another_day, other_room = self.get_solo_data() staff = StaffAreaContext(conference=another_day.conference) data['copy_mode'] = ['copy_to_area'] data['area'] = staff.area.pk login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, copy_errors['no_delta']) def test_copy_single_no_area(self): data = { 'target_event': self.context.sched_event.pk, 'room': self.context.room.pk, 'copy_mode': ['copy_to_parent', 'copy_to_area'], 'pick_mode': "Next", } login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, copy_errors['no_area']) def test_copy_single_no_parent(self): data = { 'room': self.context.room.pk, 'copy_mode': ['copy_to_parent'], 'pick_mode': "Next", } login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, copy_errors['no_target']) def test_copy_single_no_date(self): data = { 'room': self.context.room.pk, 'copy_mode': ['choose_day'], 'pick_mode': "Next", } login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, copy_errors['no_day']) def test_copy_single_no_mode(self): data = { 'room': self.context.room.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, copy_solo_mode_errors['required']) def test_copy_single_event_room_conf_mismatch(self): another_day = ConferenceDayFactory( day=self.context.conf_day.day + timedelta(days=1)) data = { 'copy_to_day': another_day.pk, 'room': self.context.room.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, copy_errors['room_conf_mismatch']) def test_authorized_user_pick_mode_include_parent(self): another_day = ConferenceDayFactory(conference=self.context.conference) show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'room': self.context.room.pk, 'pick_mode': "Next", } delta = another_day.day - show_context.sched_event.starttime.date() login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains( response, '<input type="radio" name="copy_mode" value="include_parent" ' + 'id="id_copy_mode_1" required checked />', html=True) self.assertContains( response, '<input type="radio" name="copy_mode" value="include_parent" ' + 'id="id_copy_mode_1" required checked />', html=True) self.assertContains( response, '<option value="%d" selected>' % another_day.pk) self.assert_hidden_value( response, "id_room", "room", self.context.room.pk) self.assertContains(response, "Choose Sub-Events to be copied") self.assertContains(response, "%s - %s" % ( show_context.opportunity.e_title, (show_context.opp_event.start_time + delta).strftime( self.copy_date_format))) def test_authorized_user_pick_mode_bad_input(self): another_day = ConferenceDayFactory(conference=self.context.conference) show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk + 100, 'room': self.context.room.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains( response, 'Select a valid choice.') def test_authorized_user_pick_mode_no_day(self): show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'room': self.context.room.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains( response, copy_errors['no_day']) def test_authorized_user_pick_mode_no_event(self): show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'room': self.context.room.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains( response, copy_errors['no_target']) def test_authorized_user_pick_mode_only_children(self): show_context = VolunteerContext() target_context = ShowContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.sched_event.pk, 'room': target_context.room.pk, 'pick_mode': "Next", } delta = target_context.sched_event.starttime.date( ) - show_context.sched_event.starttime.date() login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains( response, '<input type="radio" name="copy_mode" ' + 'value="copy_children_only" ' + 'id="id_copy_mode_0" required checked />', html=True) self.assertContains( response, '<option value="%d" selected>' % ( target_context.sched_event.pk)) self.assertContains(response, "Choose Sub-Events to be copied") self.assertContains(response, "%s - %s" % ( show_context.opportunity.e_title, (show_context.opp_event.start_time + delta).strftime( self.copy_date_format))) def test_authorized_user_pick_mode_parent_room_mismatch(self): show_context = VolunteerContext() target_context = ShowContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.sched_event.pk, 'room': self.context.room.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains(response, copy_errors['room_target_mismatch']) def test_copy_child_event_preserve_room(self): show_context = VolunteerContext() target_context = ShowContext(room=show_context.room) url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.sched_event.pk, 'copied_event': show_context.opp_event.pk, 'room': self.context.room.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(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_context.days[0].pk, str([max_pk]),) self.assertRedirects(response, redirect_url) self.assertContains(response, show_context.room.name) self.assertNotContains(response, self.context.room.name) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( show_context.opportunity.e_title, datetime.combine( target_context.days[0].day, show_context.opp_event.starttime.time()).strftime( GBE_DATETIME_FORMAT))) def test_copy_child_change_room(self): show_context = VolunteerContext() target_context = ShowContext() show_context.conference.status_code = 'completed' show_context.conference.save() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.sched_event.pk, 'copied_event': show_context.opp_event.pk, 'room': target_context.room.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains(response, target_context.room.name, 2) self.assertNotContains(response, show_context.room.name) def test_copy_child_parent_events(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': show_context.opp_event.pk, 'room': self.context.room.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(url, data=data, follow=True) new_occurrences = [] for occurrence in Event.objects.filter(pk__gt=max_pk).order_by('pk'): new_occurrences += [occurrence.pk] redirect_url = "%s?%s-day=%d&filter=Filter&new=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_day.pk, str(new_occurrences).replace(" ", "%20")) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( show_context.opportunity.e_title, datetime.combine( another_day.day, show_context.opp_event.starttime.time()).strftime( GBE_DATETIME_FORMAT))) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( show_context.event.e_title, datetime.combine( another_day.day, show_context.sched_event.starttime.time()).strftime( GBE_DATETIME_FORMAT))) self.assertNotContains(response, "approval_needed") def test_copy_child_not_like_parent(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() opportunity, opp_sched = show_context.add_opportunity( start_time=show_context.sched_event.starttime + timedelta(1.3)) opp_sched.approval_needed = True opp_sched.save() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': opp_sched.pk, 'room': self.context.room.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(url, data=data, follow=True) new_occurrences = [] for occurrence in Event.objects.filter(pk__gt=max_pk).order_by('pk'): new_occurrences += [occurrence.pk] redirect_url = "%s?%s-day=%d&filter=Filter&new=%s" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_day.pk, str(new_occurrences).replace(" ", "%20")) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( opportunity.e_title, datetime.combine( another_day.day + timedelta(1), opp_sched.starttime.time()).strftime( GBE_DATETIME_FORMAT))) new_vol_opp = Event.objects.get(pk=max_pk) self.assertEqual(new_vol_opp.max_volunteer, opp_sched.max_volunteer) self.assertEqual(new_vol_opp.location, opp_sched.location) self.assertTrue(new_vol_opp.approval_needed) def test_copy_only_parent_event(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'room': self.context.room.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(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=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_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' % ( show_context.event.e_title, datetime.combine( another_day.day, show_context.sched_event.starttime.time()).strftime( GBE_DATETIME_FORMAT))) self.assertContains(response, "Occurrence has been updated.<br>", 1) def test_copy_parent_w_area(self): show_context = VolunteerContext() staff = StaffAreaContext(conference=show_context.conference) EventLabelFactory(event=show_context.sched_event, text=staff.area.slug) url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': show_context.conf_day.pk, 'room': self.context.room.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(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=[show_context.conference.conference_slug]), show_context.conference.conference_slug, show_context.conf_day.pk, str(max_pk),) self.assertContains(response, reverse( 'edit_staff', urlconf='gbe.scheduling.urls', args=[staff.area.pk])) def test_copy_bad_second_form(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() url = reverse(self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': "bad", 'room': self.context.room.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains(response, "bad is not one of the available choices.") def test_copy_class_not_supported(self): another_day = ConferenceDayFactory() target_context = ClassContext() url = reverse(self.view_name, args=[target_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertEqual(403, response.status_code)
class TestCopyOccurrence(TestCase): view_name = 'copy_event_schedule' copy_date_format = "%a, %b %-d, %Y %-I:%M %p" def setUp(self): self.context = VolunteerContext() self.url = reverse( self.view_name, args=[self.context.sched_event.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, date): 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]) self.assertContains(response, "%s - %s" % ( title, date.strftime(DATETIME_FORMAT))) 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: %s" % ( self.context.event.e_title, self.context.sched_event.starttime.strftime( self.copy_date_format))) def test_authorized_user_get_no_child_event(self): login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') response = self.client.get(self.url) 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): target_event = VolunteerContext() self.context.add_opportunity() login_as(self.privileged_user, self) response = self.client.get(self.url) self.assert_good_mode_form( response, target_event.event.e_title, target_event.sched_event.start_time) def test_bad_occurrence(self): url = reverse( self.view_name, args=[self.context.sched_event.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_show(self): show_context = VolunteerContext() target_context = ShowContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') login_as(self.privileged_user, self) response = self.client.get(url) self.assert_good_mode_form( response, target_context.show.e_title, target_context.sched_event.start_time) def test_authorized_user_get_class(self): copy_class = ClassFactory() vol_context = VolunteerContext(event=copy_class) target_context = ClassContext() url = reverse( self.view_name, args=[vol_context.sched_event.pk], urlconf='gbe.scheduling.urls') login_as(self.privileged_user, self) response = self.client.get(url) self.assert_good_mode_form( response, target_context.bid.e_title, target_context.sched_event.start_time) def test_copy_single_event(self): another_day = ConferenceDayFactory( conference=self.context.conference, day=self.context.conf_day.day + timedelta(days=1)) data = { 'copy_to_day': another_day.pk, 'pick_mode': "Next", } login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.opp_event.pk], urlconf='gbe.scheduling.urls') 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=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_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.context.opportunity.e_title, datetime.combine( another_day.day, self.context.opp_event.starttime.time()).strftime( DATETIME_FORMAT))) def test_authorized_user_pick_mode_include_parent(self): another_day = ConferenceDayFactory(conference=self.context.conference) show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'pick_mode': "Next", } delta = another_day.day - show_context.sched_event.starttime.date() login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains( response, '<input checked="checked" id="id_copy_mode_1" name="copy_mode" ' + 'type="radio" value="include_parent" />') self.assertContains( response, '<option value="%d" selected="selected">' % another_day.pk) self.assertContains(response, "Choose Sub-Events to be copied") self.assertContains(response, "%s - %s" % ( show_context.opportunity.e_title, (show_context.opp_event.start_time + delta).strftime( self.copy_date_format))) def test_authorized_user_pick_mode_bad_input(self): another_day = ConferenceDayFactory(conference=self.context.conference) show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk + 100, 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains( response, 'Select a valid choice.') def test_authorized_user_pick_mode_no_day(self): show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains( response, 'Must choose a day when copying all events.') def test_authorized_user_pick_mode_no_event(self): show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'pick_mode': "Next", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains( response, 'Must choose the target event when copying sub-events.') def test_authorized_user_pick_mode_only_children(self): show_context = VolunteerContext() target_context = ShowContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.sched_event.pk, 'pick_mode': "Next", } delta = target_context.sched_event.starttime.date( ) - show_context.sched_event.starttime.date() login_as(self.privileged_user, self) response = self.client.post(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.sched_event.pk)) self.assertContains(response, "Choose Sub-Events to be copied") self.assertContains(response, "%s - %s" % ( show_context.opportunity.e_title, (show_context.opp_event.start_time + delta).strftime( self.copy_date_format))) def test_copy_child_event(self): show_context = VolunteerContext() target_context = ShowContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'copy_children_only', 'target_event': target_context.sched_event.pk, 'copied_event': show_context.opp_event.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(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_context.days[0].pk, str([max_pk]),) self.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( show_context.opportunity.e_title, datetime.combine( target_context.days[0].day, show_context.opp_event.starttime.time()).strftime( DATETIME_FORMAT))) def test_copy_child_parent_events(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': show_context.opp_event.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(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" % ( 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.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( show_context.opportunity.e_title, datetime.combine( another_day.day, show_context.opp_event.starttime.time()).strftime( DATETIME_FORMAT))) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( show_context.event.e_title, datetime.combine( another_day.day, show_context.sched_event.starttime.time()).strftime( DATETIME_FORMAT))) def test_copy_child_not_like_parent(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() opportunity, opp_sched = show_context.add_opportunity( start_time=show_context.sched_event.starttime + timedelta(1.3)) url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': opp_sched.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) max_pk = Event.objects.latest('pk').pk response = self.client.post(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" % ( 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.assertRedirects(response, redirect_url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s' % ( opportunity.e_title, datetime.combine( another_day.day + timedelta(1), opp_sched.starttime.time()).strftime( DATETIME_FORMAT))) new_vol_opp = Event.objects.get(pk=max_pk) self.assertEqual(new_vol_opp.max_volunteer, opp_sched.max_volunteer) self.assertEqual(new_vol_opp.location, opp_sched.location) def test_copy_only_parent_event(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() url = reverse( self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) max_pk = Event.objects.latest('pk').pk redirect_url = "%s?%s-day=%d&filter=Filter&new=[%sL]" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[another_day.conference.conference_slug]), another_day.conference.conference_slug, another_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' % ( show_context.event.e_title, datetime.combine( another_day.day, show_context.sched_event.starttime.time()).strftime( DATETIME_FORMAT))) self.assertContains(response, "Occurrence has been updated.<br>", 1) def test_copy_bad_second_form(self): another_day = ConferenceDayFactory() show_context = VolunteerContext() url = reverse(self.view_name, args=[show_context.sched_event.pk], urlconf='gbe.scheduling.urls') data = { 'copy_mode': 'include_parent', 'copy_to_day': another_day.pk, 'copied_event': "bad", 'pick_event': "Finish", } login_as(self.privileged_user, self) response = self.client.post(url, data=data, follow=True) self.assertContains(response, "bad is not one of the available choices.")
class TestShowVolunteers(TestCase): view_name = 'edit_volunteer' 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 = VolunteerContext() self.url = reverse( self.view_name, args=[self.context.conference.conference_slug, self.context.opp_event.pk], urlconf="gbe.scheduling.urls") 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_volunteer_has_conflict(self): login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert("no available volunteers" not in response.content) assert_link(response, self.url) def test_volunteer_has_class_conflict(self): class_context = ClassContext( conference=self.context.conference, teacher=PersonaFactory(performer_profile=self.context.profile), starttime=self.context.opp_event.start_time) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert("no available volunteers" not in response.content) assert_link(response, reverse( self.view_name, args=[self.context.conference.conference_slug, class_context.sched_event.pk], urlconf="gbe.scheduling.urls")) def test_volunteer_has_show_conflict(self): show_context = ShowContext( conference=self.context.conference, performer=PersonaFactory(performer_profile=self.context.profile), starttime=self.context.opp_event.start_time) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert("no available volunteers" not in response.content) assert_link(response, reverse( self.view_name, args=[self.context.conference.conference_slug, show_context.sched_event.pk], urlconf="gbe.scheduling.urls")) def test_volunteer_has_earlier_conflict(self): opportunity, opp_event = self.context.add_opportunity( start_time=self.context.opp_event.start_time-timedelta(minutes=30)) conflict = ResourceAllocationFactory(resource=self.context.worker, event=opp_event) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert("no available volunteers" not in response.content) assert_link(response, reverse( self.view_name, args=[self.context.conference.conference_slug, opp_event.pk], urlconf="gbe.scheduling.urls")) def test_volunteer_is_available(self): self.context.bid.available_windows.add(self.context.window) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" not in response.content) assert('<td class="bid-table">Available</td>' in response.content) def test_volunteer_is_not_available(self): login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" not in response.content) assert('<td class="bid-table">Not Available</td>' in response.content) def test_volunteer_is_really_not_available(self): self.context.bid.unavailable_windows.add(self.context.window) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert ("no available volunteers" in response.content) def test_volunteer_is_interested(self): login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert('4 - Somewhat interested' in response.content) def test_volunteer_is_not(self): self.context.interest.rank = 0 self.context.interest.save() login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert('4 - Somewhat interested' not in response.content) assert("no available volunteers" not in response.content) def test_volunteer_has_no_rank(self): self.context.interest.delete() login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) assert('4 - Somewhat interested' not in response.content) assert("no available volunteers" not in response.content)