From 00a361c08c945a24291e1f8494bd09d5079fdb98 Mon Sep 17 00:00:00 2001 From: Travis Grathwell Date: Sat, 6 Dec 2014 20:01:44 -0800 Subject: [PATCH] Event sessions can now be marked as 'volunteers only' Volunteer only sessions do not show up on student RSVP forms An event cannot be both 'volunteers only' and 'required for students' --- app/assets/javascripts/events.js.coffee | 10 ++++++ app/assets/stylesheets/events/_form.css.scss | 4 +++ app/models/event_session.rb | 7 ++++- app/models/rsvp.rb | 9 ++++++ app/views/events/_form.html.erb | 8 +++-- app/views/rsvps/_form.html.erb | 2 +- ...3_add_volunteers_only_to_event_sessions.rb | 5 +++ db/schema.rb | 9 +++--- spec/models/event_session_spec.rb | 7 +++++ spec/models/rsvp_spec.rb | 31 +++++++++++++++++++ 10 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 db/migrate/20141205091133_add_volunteers_only_to_event_sessions.rb diff --git a/app/assets/javascripts/events.js.coffee b/app/assets/javascripts/events.js.coffee index 40994666d..a8fd185a4 100644 --- a/app/assets/javascripts/events.js.coffee +++ b/app/assets/javascripts/events.js.coffee @@ -20,6 +20,14 @@ setUpDatePicker = ($el) -> $el.on('change', dateChanged) $el.datepicker() +setUpExclusiveCheckboxes = ($el) -> + $el.find('.exclusive-checkbox').on 'change', (e) -> + $target = $(e.target) + if ($target.prop('checked')) + $target.closest('.form-group').find('.exclusive-checkbox').each (ix, checkbox) -> + if (checkbox.id != e.target.id) + $(checkbox).prop('checked', false) + setupRemoveSessions = -> if $('.remove-session').length $(document).on 'click', '.remove-session > a', (e)-> @@ -37,6 +45,7 @@ jQuery -> $('.select2-dropdown').select2(width: 'element') setUpDatePicker($('.datepicker')) + setUpExclusiveCheckboxes($('body')) rsvpTypesChanged = -> $el = $('.workshop-only') @@ -54,6 +63,7 @@ jQuery -> $field = event.field $dateField = $field.find('.datepicker') setUpDatePicker($dateField) + setUpExclusiveCheckboxes($field) cocChanged = -> $el = $('#coc') diff --git a/app/assets/stylesheets/events/_form.css.scss b/app/assets/stylesheets/events/_form.css.scss index 19347acc1..7e7e9e0e3 100644 --- a/app/assets/stylesheets/events/_form.css.scss +++ b/app/assets/stylesheets/events/_form.css.scss @@ -37,5 +37,9 @@ margin: 0; } } + + .session-checkboxes label { + margin-right: 12px; + } } diff --git a/app/models/event_session.rb b/app/models/event_session.rb index 9a426a197..00cf38031 100644 --- a/app/models/event_session.rb +++ b/app/models/event_session.rb @@ -1,5 +1,5 @@ class EventSession < ActiveRecord::Base - PERMITTED_ATTRIBUTES = [:starts_at, :ends_at, :name, :required_for_students] + PERMITTED_ATTRIBUTES = [:starts_at, :ends_at, :name, :required_for_students, :volunteers_only] validates_presence_of :starts_at, :ends_at, :name validates_uniqueness_of :name, scope: [:event_id] @@ -13,6 +13,11 @@ class EventSession < ActiveRecord::Base errors.add(:ends_at, 'must be after session start time') end end + validate do + if required_for_students && volunteers_only + errors.add(:base, "A session cannot be both Required for Students and Volunteers Only") + end + end belongs_to :event, inverse_of: :event_sessions has_many :rsvp_sessions, dependent: :destroy diff --git a/app/models/rsvp.rb b/app/models/rsvp.rb index 628731674..a3a4b48a2 100644 --- a/app/models/rsvp.rb +++ b/app/models/rsvp.rb @@ -62,6 +62,15 @@ def setup_for_role(role) end end + def selectable_sessions + sessions = event.event_sessions.order('starts_at ASC') + if role == Role::VOLUNTEER + sessions + elsif role == Role::STUDENT + sessions.where(volunteers_only: false) + end + end + def operating_system_title operating_system.try(:title) end diff --git a/app/views/events/_form.html.erb b/app/views/events/_form.html.erb index 87e017a58..9e73f0f54 100644 --- a/app/views/events/_form.html.erb +++ b/app/views/events/_form.html.erb @@ -53,9 +53,13 @@ - <%= event_sessions_form.time_select :ends_at, {:ampm => true, :minute_step => 15}, {class: "input-small end_time form-control"} %> -
+
<%= event_sessions_form.label :required_for_students do %> - <%= event_sessions_form.check_box :required_for_students %> Required for Students? + <%= event_sessions_form.check_box :required_for_students, class: 'exclusive-checkbox' %> Required for Students? + <% end %> + + <%= event_sessions_form.label :volunteers_only do %> + <%= event_sessions_form.check_box :volunteers_only, class: 'exclusive-checkbox' %> Volunteers Only! <% end %>
<% end %> diff --git a/app/views/rsvps/_form.html.erb b/app/views/rsvps/_form.html.erb index ddedd23b3..bb9dce87e 100644 --- a/app/views/rsvps/_form.html.erb +++ b/app/views/rsvps/_form.html.erb @@ -83,7 +83,7 @@ <% if @rsvp.event.event_sessions.length > 1 %>

Sessions you're attending

<%= f.collection_check_boxes(:event_session_ids, - @event.event_sessions.order('starts_at ASC'), + @rsvp.selectable_sessions, :id, -> (session) { "#{session.name}: #{formatted_session_date(session)} #{formatted_session_timerange(session)}" }, { diff --git a/db/migrate/20141205091133_add_volunteers_only_to_event_sessions.rb b/db/migrate/20141205091133_add_volunteers_only_to_event_sessions.rb new file mode 100644 index 000000000..ecc999973 --- /dev/null +++ b/db/migrate/20141205091133_add_volunteers_only_to_event_sessions.rb @@ -0,0 +1,5 @@ +class AddVolunteersOnlyToEventSessions < ActiveRecord::Migration + def change + add_column :event_sessions, :volunteers_only, :boolean, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index f7fae683f..d75eed54a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20141115223733) do +ActiveRecord::Schema.define(version: 20141205091133) do create_table "authentications", force: true do |t| t.integer "user_id" @@ -72,10 +72,11 @@ t.datetime "starts_at" t.datetime "ends_at" t.integer "event_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "name", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "name", null: false t.boolean "required_for_students", default: true + t.boolean "volunteers_only", default: false end add_index "event_sessions", ["event_id", "name"], name: "index_event_sessions_on_event_id_and_name", unique: true diff --git a/spec/models/event_session_spec.rb b/spec/models/event_session_spec.rb index 719bf68ac..4de23e590 100644 --- a/spec/models/event_session_spec.rb +++ b/spec/models/event_session_spec.rb @@ -26,6 +26,13 @@ session.should have(0).errors_on(:starts_at) end + it 'does not allow required_for_students and volunteers_only simultaneously' do + session = create(:event_session) + session.volunteers_only = true + session.required_for_students = true + session.should have(1).error_on(:base) + end + describe "#update_event_times" do it "denormalizes starts_at and ends_at onto the event" do event = create(:event) diff --git a/spec/models/rsvp_spec.rb b/spec/models/rsvp_spec.rb index bb94555bf..9067addd3 100644 --- a/spec/models/rsvp_spec.rb +++ b/spec/models/rsvp_spec.rb @@ -127,6 +127,37 @@ end end + describe "#selectable_sessions" do + let(:event) do + build(:event_with_no_sessions).tap do |event| + @session_no_options = build(:event_session, event: event, required_for_students: false, volunteers_only: false) + event.event_sessions << @session_no_options + event.save! + end + end + + before do + @session_required_for_students = create(:event_session, event: event, required_for_students: true, volunteers_only: false) + @session_volunteers_only = create(:event_session, event: event, required_for_students: false, volunteers_only: true) + end + + describe "for students" do + let(:rsvp) { create(:student_rsvp, event: event) } + + it "returns only those sessions which are not marked as volunteer only" do + rsvp.selectable_sessions.pluck(:id).should =~ [@session_no_options.id, @session_required_for_students.id] + end + end + + describe "for volunteers" do + let(:rsvp) { create(:volunteer_rsvp, event: event) } + + it "returns all sessions" do + rsvp.selectable_sessions.pluck(:id).should =~ [@session_no_options.id, @session_required_for_students.id, @session_volunteers_only.id] + end + end + end + describe "#as_json" do before do @user = create(:user, first_name: 'Bill', last_name: 'Blank')