def test_volunteer_conflict_sends_warning_to_areastaff(self): context = VolunteerContext() area = StaffAreaFactory(conference=context.conference, staff_lead=context.profile) EventLabelFactory( event=context.opp_event, text=area.slug) change_window = context.add_window() context.bid.available_windows.add(context.window) form = self.get_form(context) form['available_windows'] = [change_window.pk] url = reverse('volunteer_edit', urlconf='gbe.urls', args=[context.bid.pk]) login_as(context.profile, self) response = self.client.post( url, form, follow=True) assert_right_mail_right_addresses( 1, 3, "URGENT: Volunteer Schedule Conflict Occurred", [self.privileged_profile.contact_email, context.profile.contact_email])
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 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 test_edit_volunteer_profile_is_owner(self): context = VolunteerContext() add_window = context.add_window() url = reverse('volunteer_edit', urlconf='gbe.urls', args=[context.bid.pk]) login_as(context.profile, self) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTrue('I am Available....' in response.content)
def test_volunteer_edit_get_rank(self): context = VolunteerContext() add_window = context.add_window() url = reverse('volunteer_edit', urlconf='gbe.urls', args=[context.bid.pk]) login_as(self.privileged_user, self) response = self.client.get(url) assert_rank_choice_exists( response, context.interest, context.interest.rank)
def test_volunteer_edit_get_with_stuff(self): clear_conferences() context = VolunteerContext() add_window = context.add_window() url = reverse('volunteer_edit', urlconf='gbe.urls', args=[context.bid.pk]) login_as(self.privileged_user, self) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTrue('I am Available....' in response.content)
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 setUp(self): self.room = RoomFactory() self.show_volunteer = VolunteerContext() self.current_conference = self.show_volunteer.conference self.special_volunteer = VolunteerContext(event=GenericEventFactory( e_conference=self.current_conference)) self.staff_area = StaffAreaContext(conference=self.current_conference) self.url = reverse(self.view_name, args=[self.current_conference.conference_slug], urlconf='gbe.scheduling.urls') self.factory = RequestFactory() self.client = Client() self.privileged_user = ProfileFactory().user_object grant_privilege(self.privileged_user, 'Scheduling Mavens')
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_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_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_vol_opp_present(self): vol_context = VolunteerContext() vol_context.sched_event.max_volunteer = 7 vol_context.sched_event.save() vol_context.opp_event.set_locations([]) grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) self.url = reverse(self.view_name, args=[ vol_context.conference.conference_slug, vol_context.sched_event.pk ], urlconf='gbe.scheduling.urls') response = self.client.get(self.url, follow=True) self.assertContains( response, 'name="opp_event_id" type="hidden" value="%d" />' % (vol_context.opportunity.pk)) self.assertContains( response, 'name="opp_sched_id" type="hidden" value="%d" />' % (vol_context.opp_event.pk)) self.assertContains( response, '<option value="%d" selected="selected">%s</option>' % (vol_context.window.day.pk, vol_context.window.day.day.strftime("%b. %-d, %Y")), 3) self.assertContains(response, 'name="max_volunteer" type="number" value="2" />') self.assertContains( response, 'name="duration" step="any" type="number" value="1.0" />')
def test_vol_opp_present(self): vol_context = VolunteerContext() vol_context.sched_event.max_volunteer = 7 vol_context.sched_event.save() vol_context.opp_event.set_locations([]) grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) self.url = reverse(self.view_name, args=[ vol_context.conference.conference_slug, vol_context.sched_event.pk ], urlconf='gbe.scheduling.urls') response = self.client.get(self.url, follow=True) self.assertContains( response, 'type="hidden" name="opp_event_id" value="%d"' % (vol_context.opportunity.pk)) self.assertContains( response, 'type="hidden" name="opp_sched_id" value="%d"' % (vol_context.opp_event.pk)) assert_option_state(response, vol_context.conf_day.pk, vol_context.conf_day.day.strftime("%b. %-d, %Y"), True) self.assertContains(response, 'name="max_volunteer" value="2"') self.assertContains(response, 'name="duration" value="1.0"') self.assertContains(response, "Display Staff", 2)
def test_update_profile_post_valid_redirect(self): context = VolunteerContext() context.conference.accepting_bids = True context.conference.save() redirect = reverse('volunteer_create', urlconf='gbe.urls') response = self.post_profile(redirect=redirect) self.assertRedirects(response, redirect)
def test_pick_drop_in(self): special = GenericEventFactory(e_conference=self.context.conference, type="Drop-In") specialstaffcontext = VolunteerContext(event=special, role="Teacher") limited_profile = ProfileFactory() grant_privilege(limited_profile.user_object, "Registrar") login_as(limited_profile, self) data = { 'email-select-conference': [ self.context.conference.pk, ], 'email-select-roles': [ 'Teacher', ], 'event-select-event_collections': "Drop-In", 'refine': True, } response = self.client.post(self.url, data=data, follow=True) print response self.assertNotContains(response, self.context.teacher.contact.user_object.email) self.assertContains(response, specialstaffcontext.profile.user_object.email) self.assertNotContains(response, special.e_title) assert_checkbox(response, "event_collections", 1, "Drop-In", "All Drop-In Classes", prefix="event-select")
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_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_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_get_allocation_resource_type(self): context = VolunteerContext() response = self.client.get('/admin/scheduler/resourceallocation/', follow=True) self.assertContains(response, str("Profile")) self.assertContains(response, "Volunteer") self.assertContains(response, str(context.conference))
def test_post_event_change(self): VolunteerContext(conference=self.day.conference) login_as(self.profile, self) response = self.client.post( reverse("schedule_conference", urlconf="gbe.scheduling.urls", args=[self.day.pk]), data={'%d-day' % self.day.pk: self.day.day+timedelta(days=30)}, follow=True) self.assertEqual(response.status_code, 200) self.assertRedirects( response, ("%s?%s-calendar_type=0&%s-calendar_type=1&%s-calendar_type=2" + "&filter=Filter") % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls'), self.day.conference.conference_slug, self.day.conference.conference_slug, self.day.conference.conference_slug)) self.assertContains( response, "Moved Conference %s by %d days, change %d conference days" % ( self.day.conference.conference_slug, 30, 1)) self.assertContains( response, "Moved %d scheduled events by %d days" % ( 2, 30))
def edit_volunteer(self, rank=5): clear_conferences() pref = ProfilePreferencesFactory() context = VolunteerContext(profile=pref.profile) add_window = context.add_window() url = reverse('volunteer_edit', urlconf='gbe.urls', args=[context.bid.pk]) login_as(self.privileged_user, self) form = self.get_form(context, rank=rank) form['unavailable_windows'] = add_window.pk response = self.client.post( url, form, follow=True) return response, context
def setUp(self): Conference.objects.all().delete() self.client = Client() self.privileged_profile = ProfileFactory() self.privileged_user = self.privileged_profile.user_object grant_privilege(self.privileged_user, 'Volunteer Coordinator') self.context = VolunteerContext() self.url = reverse(self.view_name, urlconf='gbe.scheduling.urls')
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_delete_w_parent(self): vol_context = VolunteerContext() self.url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[vol_context.sched_event.pk]) login_as(self.privileged_profile, self) response = self.client.get(self.url, follow=True) self.assertContains(response, "PARENT_EVENT_DELETION")
def test_get_show(self, ): context = VolunteerContext() grant_privilege(self.profile, 'Act Reviewers') login_as(self.profile, self) response = self.client.get( reverse('staff_area', urlconf="gbe.reporting.urls"), data={'conf_slug': context.conference.conference_slug}) self.assertEqual(response.status_code, 200) self.assertContains(response, context.event.e_title)
def test_volunteer_edit_get(self): context = VolunteerContext() add_window = context.add_window() context.bid.b_title = "myTitle" context.bid.save() url = reverse('volunteer_edit', urlconf='gbe.urls', args=[context.bid.pk]) login_as(self.privileged_user, self) response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue('Volunteer at the Expo' in response.content) assert_hidden_value( response, "id_b_title", "b_title", context.bid.b_title, 128)
def setUp(self): self.show_volunteer = VolunteerContext() self.current_conference = self.show_volunteer.conference self.url = reverse(self.view_name, args=[self.current_conference.conference_slug], urlconf='gbe.scheduling.urls') self.client = Client() self.privileged_user = ProfileFactory().user_object grant_privilege(self.privileged_user, 'Scheduling Mavens')
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_show_approval_needed_event(self): context = VolunteerContext(event=self.context.show, sched_event=self.context.sched_event) context.opp_event.approval_needed = True context.opp_event.save() login_as(self.profile, self) response = self.client.get(self.url) self.assertContains(response, context.opportunity.e_title) self.assertContains(response, 'class="approval_needed"')
def test_show_approval_needed_event(self): show = ShowFactory() context = VolunteerContext(event=show) context.opp_event.approval_needed = True context.opp_event.save() grant_privilege(self.profile, 'Act Reviewers') login_as(self.profile, self) response = self.client.get(self.url) self.assertContains(response, context.opportunity.e_title) self.assertContains(response, 'class="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)
def test_set_uavailable_window_conflict(self): context = VolunteerContext() change_window = context.add_window() context.bid.available_windows.add(change_window.pk) form = self.get_form(context) form['unavailable_windows'] = [context.window.pk] url = reverse('volunteer_edit', urlconf='gbe.urls', args=[context.bid.pk]) login_as(context.profile, self) response = self.client.post( url, form, follow=True) assert 'Warning', "<li>%s working for %s - as %s" % ( context.window.start_time.strftime(DATETIME_FORMAT), str(context.opportunity), context.opportunity.child( ).volunteer_category_description ) in response.content
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 post_conflict(self, staff=True): context = VolunteerContext() change_window = context.add_window() if staff: worker = WorkerFactory( _item=context.profile, role='Staff Lead' ) ResourceAllocationFactory( event=context.sched_event, resource=worker) context.bid.available_windows.add(context.window) form = self.get_form(context) form['available_windows'] = [change_window.pk] url = reverse('volunteer_edit', urlconf='gbe.urls', args=[context.bid.pk]) login_as(context.profile, self) response = self.client.post( url, form, follow=True) return response, context
def setUp(self): self.context = VolunteerContext(event=GenericEventFactory()) self.context.sched_event.max_volunteer = 7 self.context.sched_event.save() self.context.event.duration = Duration(hours=1, minutes=30) self.context.event.save() self.room = self.context.room self.staff_lead = self.context.set_staff_lead() self.extra_day = ConferenceDayFactory( conference=self.context.conference, day=self.context.conf_day.day + timedelta(days=1)) self.url = reverse( self.view_name, args=[self.context.conference.conference_slug, self.context.opp_event.pk], urlconf='gbe.scheduling.urls') self.client = Client() self.privileged_user = ProfileFactory().user_object grant_privilege(self.privileged_user, 'Scheduling Mavens')
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(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 TestEditVolunteer(TestCase): view_name = 'edit_volunteer' def setUp(self): self.context = VolunteerContext(event=GenericEventFactory()) self.context.sched_event.max_volunteer = 7 self.context.sched_event.save() self.context.event.duration = Duration(hours=1, minutes=30) self.context.event.save() self.room = self.context.room self.staff_lead = self.context.set_staff_lead() self.extra_day = ConferenceDayFactory( conference=self.context.conference, day=self.context.conf_day.day + timedelta(days=1)) self.url = reverse( self.view_name, args=[self.context.conference.conference_slug, self.context.opp_event.pk], urlconf='gbe.scheduling.urls') self.client = Client() self.privileged_user = ProfileFactory().user_object grant_privilege(self.privileged_user, 'Scheduling Mavens') def edit_event(self): data = { 'type': 'Volunteer', 'e_title': "Test Event Wizard", 'e_description': 'Description', 'max_volunteer': 3, 'day': self.extra_day.pk, 'time': '11:00:00', 'duration': 2.5, 'location': self.room.pk, 'set_event': 'Any value', } return data def test_not_volunteer_redirect(self): self.url = reverse( self.view_name, args=[self.context.conference.conference_slug, self.context.sched_event.pk], urlconf='gbe.scheduling.urls') grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) response = self.client.get(self.url, follow=True) self.assertRedirects( response, reverse('edit_event', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug, self.context.sched_event.pk])) def test_authorized_user_can_access_event(self): login_as(self.privileged_user, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertNotContains(response, "Manage Volunteers") self.assertContains(response, "Finish") self.assertContains(response, self.context.opportunity.e_title) self.assertContains(response, self.context.opportunity.e_description) self.assertContains( response, '<option value="%d" selected="selected">%s</option>' % ( self.context.conf_day.pk, self.context.conf_day.day.strftime(DATE_FORMAT))) def test_authorized_user_can_also_get_volunteer_mgmt(self): 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 Allocation") self.assertContains(response, "Save and Continue") self.assertContains( response, '<option value="" selected="selected">---------</option>') self.assertContains( response, 'id="id_alloc_id" name="alloc_id" type="hidden" value="-1" />') def test_vol_is_booked(self): grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) response = self.client.get(self.url, follow=True) self.assertContains( response, '"id_alloc_id" name="alloc_id" type="hidden" value="%d" />' % ( self.context.allocation.pk) ) self.assertContains( response, '<option value="%d" selected="selected">%s</option>' % ( self.context.profile.pk, self.context.profile.display_name)) self.assertContains( response, '<option value="Volunteer" selected="selected">Volunteer</option>', 3) def test_bad_occurrence_id(self): login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.conference.conference_slug, self.context.sched_event.pk+1000], urlconf='gbe.scheduling.urls') response = self.client.get(self.url, follow=True) self.assertRedirects( response, reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug])) self.assertContains( response, "Occurrence id %d not found" % (self.context.sched_event.pk+1000)) def test_edit_event(self): login_as(self.privileged_user, self) data = self.edit_event() response = self.client.post( self.url, data=data, follow=True) self.assertRedirects( response, "%s?%s-day=%d&filter=Filter&new=[%dL]" % ( reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug]), self.context.conference.conference_slug, self.extra_day.pk, self.context.opp_event.pk)) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s 11:00 AM' % ( data['e_title'], self.extra_day.day.strftime(DATE_FORMAT)) ) self.assertContains( response, '<tr class="bid-table success">\n ' + '<td class="bid-table">%s</td>' % data['e_title']) def test_edit_event_and_continue(self): 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.assertRedirects( response, "%s?worker_open=True" % self.url) assert_alert_exists( response, 'success', 'Success', 'Occurrence has been updated.<br>%s, Start Time: %s 11:00 AM' % ( data['e_title'], self.extra_day.day.strftime(DATE_FORMAT)) ) self.assertContains(response, data['e_title']) self.assertContains(response, data['e_description']) self.assertContains( response, '<option value="%d" selected="selected">%s</option>' % ( self.extra_day.pk, self.extra_day.day.strftime(DATE_FORMAT))) self.assertContains(response, 'name="max_volunteer" type="number" value="3" />') self.assertContains( response, 'name="duration" step="any" type="number" value="2.5" />') def test_auth_user_bad_schedule_assign(self): login_as(self.privileged_user, self) data = self.edit_event() data['location'] = "" response = self.client.post( self.url, data=data, follow=True) self.assertContains(response, "This field is required.") def test_post_bad_occurrence(self): login_as(self.privileged_user, self) self.url = reverse( self.view_name, args=[self.context.conference.conference_slug, self.context.opp_event.pk+1000], urlconf='gbe.scheduling.urls') response = self.client.post(self.url, follow=True) self.assertRedirects( response, reverse('manage_event_list', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug])) self.assertContains( response, "Occurrence id %d not found" % (self.context.opp_event.pk+1000)) 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_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)