From 278c32dcf3f184c13115612722f7201880dbd544 Mon Sep 17 00:00:00 2001 From: Alexander Loeser Date: Tue, 22 Nov 2016 10:37:24 +0000 Subject: [PATCH 01/42] Failing Test for #29, Task 1 and 2 --- spec/controllers/workshops_controller_spec.rb | 6 ++++++ spec/models/workshop_spec.rb | 8 ++++++++ spec/views/workshops/show.html.erb_spec.rb | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/spec/controllers/workshops_controller_spec.rb b/spec/controllers/workshops_controller_spec.rb index 4dc5bc17..813bd7ea 100644 --- a/spec/controllers/workshops_controller_spec.rb +++ b/spec/controllers/workshops_controller_spec.rb @@ -46,6 +46,12 @@ get :show, id: workshop.to_param, session: valid_session expect(assigns(:workshop)).to eq(workshop) end + + it "assigns the number of free places as @free_places" do + workshop = Workshop.create! valid_attributes + get :show, id: workshop.to_param, session: valid_session + expect(assigns(:free_places)).to eq(workshop.compute_free_places) + end end describe "GET #new" do diff --git a/spec/models/workshop_spec.rb b/spec/models/workshop_spec.rb index cc61aa8f..8e310354 100644 --- a/spec/models/workshop_spec.rb +++ b/spec/models/workshop_spec.rb @@ -19,4 +19,12 @@ workshop = FactoryGirl.build(:workshop) expect(workshop).to be_valid end + + it "computes the number of free places" do + workshop = FactoryGirl.create(:workshop) + application_letter = FactoryGirl.create(:application_letter, user: FactoryGirl.create(:user), workshop: workshop) + workshop.application_letters.push(application_letter) + + expect(workshop.compute_free_places).to eq(workshop.max_participants - workshop.application_letters.count) #TODO: count only those that are accepted + end end diff --git a/spec/views/workshops/show.html.erb_spec.rb b/spec/views/workshops/show.html.erb_spec.rb index 5b086af4..0a8a8d0f 100644 --- a/spec/views/workshops/show.html.erb_spec.rb +++ b/spec/views/workshops/show.html.erb_spec.rb @@ -16,6 +16,12 @@ expect(rendered).to have_text(@workshop.max_participants) end + it "displays counter" do + free_places = assign(:free_places, @workshop.compute_free_places) + render + expect(rendered).to have_text(free_places.to_s + " Plätze frei") + end + it "renders applicants table" do render expect(rendered).to have_table("applicants") From 9d64c17d7d449c89f6e30a9470bd076a2f6d7dcd Mon Sep 17 00:00:00 2001 From: Alexander Loeser Date: Tue, 22 Nov 2016 10:38:36 +0000 Subject: [PATCH 02/42] Implements #29 Task 1 and 2 --- app/controllers/workshops_controller.rb | 1 + app/models/workshop.rb | 4 ++++ app/views/workshops/show.html.erb | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/controllers/workshops_controller.rb b/app/controllers/workshops_controller.rb index cf9fef99..19ede3d0 100644 --- a/app/controllers/workshops_controller.rb +++ b/app/controllers/workshops_controller.rb @@ -8,6 +8,7 @@ def index # GET /workshops/1 def show + @free_places = @workshop.compute_free_places end # GET /workshops/new diff --git a/app/models/workshop.rb b/app/models/workshop.rb index b4bff067..bd95867d 100644 --- a/app/models/workshop.rb +++ b/app/models/workshop.rb @@ -14,4 +14,8 @@ class Workshop < ActiveRecord::Base has_many :application_letters validates :max_participants, numericality: { only_integer: true, greater_than: 0 } + + def compute_free_places + max_participants - application_letters.count # TODO: only count free places + end end diff --git a/app/views/workshops/show.html.erb b/app/views/workshops/show.html.erb index 226be951..aa84a2d8 100644 --- a/app/views/workshops/show.html.erb +++ b/app/views/workshops/show.html.erb @@ -15,7 +15,7 @@

Bewerber für <%= @workshop.name %>

-
Noch [Anzahl] freie Plätze (#29 US_3.6 Counter)
+
<%= @free_places %> Plätze frei
From 0a5f919c81c6a3874397814dfca463b1fb822fb7 Mon Sep 17 00:00:00 2001 From: Alexander Loeser Date: Tue, 22 Nov 2016 12:30:50 +0000 Subject: [PATCH 03/42] updated test for #29 to include occupied places counter --- spec/controllers/workshops_controller_spec.rb | 6 ++++++ spec/models/workshop_spec.rb | 10 +++++++++- spec/views/workshops/show.html.erb_spec.rb | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/spec/controllers/workshops_controller_spec.rb b/spec/controllers/workshops_controller_spec.rb index 813bd7ea..0d0c9b2d 100644 --- a/spec/controllers/workshops_controller_spec.rb +++ b/spec/controllers/workshops_controller_spec.rb @@ -52,6 +52,12 @@ get :show, id: workshop.to_param, session: valid_session expect(assigns(:free_places)).to eq(workshop.compute_free_places) end + + it "assigns the number of occupied places as @occupied_places" do + workshop = Workshop.create! valid_attributes + get :show, id: workshop.to_param, session: valid_session + expect(assigns(:occupied_places)).to eq(workshop.compute_occupied_places) + end end describe "GET #new" do diff --git a/spec/models/workshop_spec.rb b/spec/models/workshop_spec.rb index 8e310354..3dfe1632 100644 --- a/spec/models/workshop_spec.rb +++ b/spec/models/workshop_spec.rb @@ -25,6 +25,14 @@ application_letter = FactoryGirl.create(:application_letter, user: FactoryGirl.create(:user), workshop: workshop) workshop.application_letters.push(application_letter) - expect(workshop.compute_free_places).to eq(workshop.max_participants - workshop.application_letters.count) #TODO: count only those that are accepted + expect(workshop.compute_free_places).to eq(workshop.max_participants - workshop.compute_occupied_places) + end + + it "computes the number of occupied places" do + workshop = FactoryGirl.create(:workshop) + application_letter = FactoryGirl.create(:application_letter, user: FactoryGirl.create(:user), workshop: workshop) + workshop.application_letters.push(application_letter) + + expect(workshop.compute_occupied_places).to eq(workshop.application_letters.count) #TODO: count only those that are accepted end end diff --git a/spec/views/workshops/show.html.erb_spec.rb b/spec/views/workshops/show.html.erb_spec.rb index 0a8a8d0f..1edef4dd 100644 --- a/spec/views/workshops/show.html.erb_spec.rb +++ b/spec/views/workshops/show.html.erb_spec.rb @@ -18,8 +18,10 @@ it "displays counter" do free_places = assign(:free_places, @workshop.compute_free_places) + occupied_places = assign(:occupied_places, @workshop.compute_occupied_places) render expect(rendered).to have_text(free_places.to_s + " Plätze frei") + expect(rendered).to have_text(occupied_places.to_s + " Plätze belegt") end it "renders applicants table" do From ca5223b44ac370054459d83f2373fd31d0c1107b Mon Sep 17 00:00:00 2001 From: Alexander Loeser Date: Tue, 22 Nov 2016 12:31:30 +0000 Subject: [PATCH 04/42] added occupied places logic #29 --- app/controllers/workshops_controller.rb | 1 + app/models/workshop.rb | 6 +++++- app/views/workshops/show.html.erb | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/workshops_controller.rb b/app/controllers/workshops_controller.rb index 19ede3d0..84a2d607 100644 --- a/app/controllers/workshops_controller.rb +++ b/app/controllers/workshops_controller.rb @@ -9,6 +9,7 @@ def index # GET /workshops/1 def show @free_places = @workshop.compute_free_places + @occupied_places = @workshop.compute_occupied_places end # GET /workshops/new diff --git a/app/models/workshop.rb b/app/models/workshop.rb index bd95867d..5ee6023e 100644 --- a/app/models/workshop.rb +++ b/app/models/workshop.rb @@ -16,6 +16,10 @@ class Workshop < ActiveRecord::Base validates :max_participants, numericality: { only_integer: true, greater_than: 0 } def compute_free_places - max_participants - application_letters.count # TODO: only count free places + max_participants - compute_occupied_places + end + + def compute_occupied_places + application_letters.count # TODO: only count free places end end diff --git a/app/views/workshops/show.html.erb b/app/views/workshops/show.html.erb index aa84a2d8..b684ece7 100644 --- a/app/views/workshops/show.html.erb +++ b/app/views/workshops/show.html.erb @@ -16,6 +16,7 @@

Bewerber für <%= @workshop.name %>

<%= @free_places %> Plätze frei
+
<%= @occupied_places %> Plätze belegt
From f7f6a635b7ea64f814bf1b5d409c1108dab3b2f4 Mon Sep 17 00:00:00 2001 From: Frederike Ramin Date: Fri, 25 Nov 2016 10:27:58 +0100 Subject: [PATCH 05/42] Failing test for #29 --- spec/models/workshop_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/models/workshop_spec.rb b/spec/models/workshop_spec.rb index 3dfe1632..aa85c4f4 100644 --- a/spec/models/workshop_spec.rb +++ b/spec/models/workshop_spec.rb @@ -33,6 +33,6 @@ application_letter = FactoryGirl.create(:application_letter, user: FactoryGirl.create(:user), workshop: workshop) workshop.application_letters.push(application_letter) - expect(workshop.compute_occupied_places).to eq(workshop.application_letters.count) #TODO: count only those that are accepted + expect(workshop.compute_occupied_places).to eq(workshop.application_letters.where(status: 1).count) end end From 9d4895d5892522abd7f497a145551f940cc09923 Mon Sep 17 00:00:00 2001 From: Frederike Ramin Date: Fri, 25 Nov 2016 10:28:43 +0100 Subject: [PATCH 06/42] Implements #29 Task 6 --- app/models/workshop.rb | 2 +- db/schema.rb | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/models/workshop.rb b/app/models/workshop.rb index 5ee6023e..f1890839 100644 --- a/app/models/workshop.rb +++ b/app/models/workshop.rb @@ -20,6 +20,6 @@ def compute_free_places end def compute_occupied_places - application_letters.count # TODO: only count free places + application_letters.where(status: 1).count end end diff --git a/db/schema.rb b/db/schema.rb index 5476baf8..f470bc36 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: 20161120123250) do +ActiveRecord::Schema.define(version: 20161122144126) do create_table "application_letters", force: :cascade do |t| t.string "motivation" @@ -25,6 +25,15 @@ add_index "application_letters", ["user_id"], name: "index_application_letters_on_user_id" add_index "application_letters", ["workshop_id"], name: "index_application_letters_on_workshop_id" + create_table "application_notes", force: :cascade do |t| + t.text "note" + t.integer "application_letter_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "application_notes", ["application_letter_id"], name: "index_application_notes_on_application_letter_id" + create_table "profiles", force: :cascade do |t| t.string "cv" t.integer "user_id", null: false From 860f37551c09d508f2551ea7c24dbcdc5b941da0 Mon Sep 17 00:00:00 2001 From: Frederike Ramin Date: Fri, 25 Nov 2016 11:25:24 +0100 Subject: [PATCH 07/42] change application status to use boolean #29 --- app/models/event.rb | 2 +- app/views/events/show.html.erb | 1 - spec/factories/application_letters.rb | 7 +++++++ spec/models/event_spec.rb | 22 +++++++++++++--------- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/models/event.rb b/app/models/event.rb index a7908ef4..00dd6855 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -20,6 +20,6 @@ def compute_free_places end def compute_occupied_places - application_letters.where(status: 1).count + application_letters.where(status: true).count end end diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb index 297138c8..aa2e6af8 100644 --- a/app/views/events/show.html.erb +++ b/app/views/events/show.html.erb @@ -66,4 +66,3 @@ :method => 'delete', :data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) }, :class => 'btn btn-danger' %> ->>>>>>> origin/dev:app/views/events/show.html.erb diff --git a/spec/factories/application_letters.rb b/spec/factories/application_letters.rb index 26a2583b..75ca0e63 100644 --- a/spec/factories/application_letters.rb +++ b/spec/factories/application_letters.rb @@ -17,4 +17,11 @@ event status nil end + + factory :application_letter_accepted, class: :application_letter do + motivation "MyString" + user + event + status true + end end \ No newline at end of file diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index e8dd85d8..e28af697 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -21,18 +21,22 @@ end it "computes the number of free places" do - workshop = FactoryGirl.create(:event) - application_letter = FactoryGirl.create(:application_letter, user: FactoryGirl.create(:user), event: workshop) - workshop.application_letters.push(application_letter) + event = FactoryGirl.create(:event) + application_letter = FactoryGirl.create(:application_letter, user: FactoryGirl.create(:user), event: event) + event.application_letters.push(application_letter) - expect(workshop.compute_free_places).to eq(workshop.max_participants - workshop.compute_occupied_places) + expect(event.compute_free_places).to eq(event.max_participants - event.compute_occupied_places) end it "computes the number of occupied places" do - workshop = FactoryGirl.create(:event) - application_letter = FactoryGirl.create(:application_letter, user: FactoryGirl.create(:user), event: workshop) - workshop.application_letters.push(application_letter) - - expect(workshop.compute_occupied_places).to eq(workshop.application_letters.where(status: 1).count) + event = FactoryGirl.create(:event) + application_letter = FactoryGirl.create(:application_letter, user: FactoryGirl.create(:user), event: event) + application_letter_accepted = FactoryGirl.create(:application_letter_accepted, user: FactoryGirl.create(:user), event: event) + event.application_letters.push(application_letter) + event.application_letters.push(application_letter_accepted) + expect(event.compute_occupied_places).to eq(1) + application_letter_accepted_2 = FactoryGirl.create(:application_letter_accepted, user: FactoryGirl.create(:user), event: event) + event.application_letters.push(application_letter_accepted_2) + expect(event.compute_occupied_places).to eq(2) end end From f11ecd7611bcafe0fb9dda6a17ef6a2f8819b7cc Mon Sep 17 00:00:00 2001 From: Frederike Ramin Date: Fri, 25 Nov 2016 14:48:18 +0100 Subject: [PATCH 08/42] Add i18n for #29 --- app/views/events/show.html.erb | 4 ++-- config/locales/de.events.yml | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb index c39b8d39..db77919c 100644 --- a/app/views/events/show.html.erb +++ b/app/views/events/show.html.erb @@ -15,8 +15,8 @@

<%= t(:title, scope: 'events.participation') %> <%= @event.name %>

-
<%= @free_places %> Plätze frei
-
<%= @occupied_places %> Plätze belegt
+
<%= t '.free_places', places: @free_places %>
+
<%= t '.occupied_places', places: @occupied_places %>
diff --git a/config/locales/de.events.yml b/config/locales/de.events.yml index b572d466..4e5725b4 100644 --- a/config/locales/de.events.yml +++ b/config/locales/de.events.yml @@ -2,6 +2,9 @@ de: events: + show: + free_places: '%{places} Plätze frei' + occupied_places: '%{places} Plätze belegt' participation: title: "Bewerber für" accepted_rejected: "angenommen / abgelehnt" From 13a5cdb64fc00f0faf43d6d14d336064505fe707 Mon Sep 17 00:00:00 2001 From: Frederike Ramin Date: Sun, 27 Nov 2016 10:49:53 +0100 Subject: [PATCH 09/42] Failing tests for #29 Task access rights --- spec/features/events_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/features/events_spec.rb b/spec/features/events_spec.rb index b557fd3f..6de4967f 100644 --- a/spec/features/events_spec.rb +++ b/spec/features/events_spec.rb @@ -4,16 +4,22 @@ scenario "logged in as Pupil can not see overview" do login(:pupil) expect(page).to_not have_table("applicants") + expect(page).to_not have_css("div#free_places") + expect(page).to_not have_css("div#occupied_places") end scenario "logged in as Coach can see overview" do login(:tutor) expect(page).to have_table("applicants") + expect(page).to have_css("div#free_places") + expect(page).to have_css("div#occupied_places") end scenario "logged in as Organizer can see overview" do login(:organizer) expect(page).to have_table("applicants") + expect(page).to have_css("div#free_places") + expect(page).to have_css("div#occupied_places") end From f9d6944441b2baefe28e193d0d70e7dd53adb636 Mon Sep 17 00:00:00 2001 From: Frederike Ramin Date: Sun, 27 Nov 2016 10:50:46 +0100 Subject: [PATCH 10/42] Implement #29 Task access rights --- app/views/events/_applicants_overview.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/events/_applicants_overview.html.erb b/app/views/events/_applicants_overview.html.erb index 382b9b11..b1c69130 100644 --- a/app/views/events/_applicants_overview.html.erb +++ b/app/views/events/_applicants_overview.html.erb @@ -1,6 +1,6 @@

<%= t('.title', title: @event.name) %>

-
<%= t '.free_places', places: @free_places %>
-
<%= t '.occupied_places', places: @occupied_places %>
+
<%= t '.free_places', places: @free_places %>
+
<%= t '.occupied_places', places: @occupied_places %>
From a1d5547f2a83a76153fda051b857dcf8bbb7ae69 Mon Sep 17 00:00:00 2001 From: Frederike Ramin Date: Sun, 27 Nov 2016 11:24:16 +0100 Subject: [PATCH 11/42] Add feature test to #29 --- spec/features/events_spec.rb | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/spec/features/events_spec.rb b/spec/features/events_spec.rb index 6de4967f..18f48aaf 100644 --- a/spec/features/events_spec.rb +++ b/spec/features/events_spec.rb @@ -1,27 +1,46 @@ require "rails_helper" RSpec.feature "Event Applicant Overview", :type => :feature do - scenario "logged in as Pupil can not see overview" do + scenario "logged in as Pupil I can not see overview" do login(:pupil) expect(page).to_not have_table("applicants") expect(page).to_not have_css("div#free_places") expect(page).to_not have_css("div#occupied_places") end - scenario "logged in as Coach can see overview" do + scenario "logged in as Coach I can see overview" do login(:tutor) expect(page).to have_table("applicants") expect(page).to have_css("div#free_places") expect(page).to have_css("div#occupied_places") end - scenario "logged in as Organizer can see overview" do + scenario "logged in as Organizer I can see overview" do login(:organizer) expect(page).to have_table("applicants") expect(page).to have_css("div#free_places") expect(page).to have_css("div#occupied_places") end + scenario "logged in as Organizer I can see the correct count of free/occupied places" do + login(:organizer) + @event.update!(max_participants: 1) + expect(page).to have_text(I18n.t "free_places", places: @event.max_participants, scope: [:events, :applicants_overview]) + expect(page).to have_text(I18n.t "occupied_places", places: 0, scope: [:events, :applicants_overview]) + @pupil = FactoryGirl.create(:profile) + @pupil.user.role = :pupil + @application_letter = FactoryGirl.create(:application_letter_accepted, event: @event, user: @pupil.user) + visit event_path(@event) + expect(page).to have_text(I18n.t "free_places", places: @event.max_participants - 1, scope: [:events, :applicants_overview]) + expect(page).to have_text(I18n.t "occupied_places", places: 1, scope: [:events, :applicants_overview]) + # test negative amount of free places + @pupil = FactoryGirl.create(:profile) + @pupil.user.role = :pupil + @application_letter = FactoryGirl.create(:application_letter_accepted, event: @event, user: @pupil.user) + visit event_path(@event) + expect(page).to have_text(I18n.t "free_places", places: @event.max_participants - 2, scope: [:events, :applicants_overview]) + expect(page).to have_text(I18n.t "occupied_places", places: 2, scope: [:events, :applicants_overview]) + end def login(role) @event = FactoryGirl.create(:event) From b53f530bbc64d9197392a00626e3716c320e52ab Mon Sep 17 00:00:00 2001 From: Frederike Ramin Date: Sun, 27 Nov 2016 11:39:42 +0100 Subject: [PATCH 12/42] Internationalize counter #29 --- app/views/events/_applicants_overview.html.erb | 4 ++-- config/locales/de.events.yml | 8 ++++++-- spec/features/events_spec.rb | 12 ++++++------ spec/views/events/show.html.erb_spec.rb | 4 ++-- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/views/events/_applicants_overview.html.erb b/app/views/events/_applicants_overview.html.erb index b1c69130..dfcfd64e 100644 --- a/app/views/events/_applicants_overview.html.erb +++ b/app/views/events/_applicants_overview.html.erb @@ -1,6 +1,6 @@

<%= t('.title', title: @event.name) %>

-
<%= t '.free_places', places: @free_places %>
-
<%= t '.occupied_places', places: @occupied_places %>
+
<%= t '.free_places', count: @free_places %>
+
<%= t '.occupied_places', count: @occupied_places %>
diff --git a/config/locales/de.events.yml b/config/locales/de.events.yml index dd6cdc15..1ac88f12 100644 --- a/config/locales/de.events.yml +++ b/config/locales/de.events.yml @@ -8,8 +8,12 @@ de: accepted_rejected: "angenommen / abgelehnt" status: "Status" details: "Details" - free_places: '%{places} Plätze frei' - occupied_places: '%{places} Plätze belegt' + free_places: + one: '%{count} Platz frei' + other: '%{count} Plätze frei' + occupied_places: + one: '%{count} Platz belegt' + other: '%{count} Plätze belegt' activerecord: models: diff --git a/spec/features/events_spec.rb b/spec/features/events_spec.rb index 18f48aaf..cb29ca35 100644 --- a/spec/features/events_spec.rb +++ b/spec/features/events_spec.rb @@ -25,21 +25,21 @@ scenario "logged in as Organizer I can see the correct count of free/occupied places" do login(:organizer) @event.update!(max_participants: 1) - expect(page).to have_text(I18n.t "free_places", places: @event.max_participants, scope: [:events, :applicants_overview]) - expect(page).to have_text(I18n.t "occupied_places", places: 0, scope: [:events, :applicants_overview]) + expect(page).to have_text(I18n.t "free_places", count: (@event.max_participants).to_i, scope: [:events, :applicants_overview]) + expect(page).to have_text(I18n.t "occupied_places", count: 0, scope: [:events, :applicants_overview]) @pupil = FactoryGirl.create(:profile) @pupil.user.role = :pupil @application_letter = FactoryGirl.create(:application_letter_accepted, event: @event, user: @pupil.user) visit event_path(@event) - expect(page).to have_text(I18n.t "free_places", places: @event.max_participants - 1, scope: [:events, :applicants_overview]) - expect(page).to have_text(I18n.t "occupied_places", places: 1, scope: [:events, :applicants_overview]) + expect(page).to have_text(I18n.t "free_places", count: @event.max_participants - 1, scope: [:events, :applicants_overview]) + expect(page).to have_text(I18n.t "occupied_places", count: 1, scope: [:events, :applicants_overview]) # test negative amount of free places @pupil = FactoryGirl.create(:profile) @pupil.user.role = :pupil @application_letter = FactoryGirl.create(:application_letter_accepted, event: @event, user: @pupil.user) visit event_path(@event) - expect(page).to have_text(I18n.t "free_places", places: @event.max_participants - 2, scope: [:events, :applicants_overview]) - expect(page).to have_text(I18n.t "occupied_places", places: 2, scope: [:events, :applicants_overview]) + expect(page).to have_text(I18n.t "free_places", count: @event.max_participants - 2, scope: [:events, :applicants_overview]) + expect(page).to have_text(I18n.t "occupied_places", count: 2, scope: [:events, :applicants_overview]) end def login(role) diff --git a/spec/views/events/show.html.erb_spec.rb b/spec/views/events/show.html.erb_spec.rb index ad6a18a0..70374d13 100644 --- a/spec/views/events/show.html.erb_spec.rb +++ b/spec/views/events/show.html.erb_spec.rb @@ -20,8 +20,8 @@ free_places = assign(:free_places, @event.compute_free_places) occupied_places = assign(:occupied_places, @event.compute_occupied_places) render - expect(rendered).to have_text(free_places.to_s + " Plätze frei") - expect(rendered).to have_text(occupied_places.to_s + " Plätze belegt") + expect(rendered).to have_text(I18n.t 'free_places', count: free_places, scope: [:events, :applicants_overview]) + expect(rendered).to have_text(I18n.t 'occupied_places', count: occupied_places, scope: [:events, :applicants_overview]) end it "renders applicants table" do From 82d5cebea63521a20992e18e9ccfd680afe26f63 Mon Sep 17 00:00:00 2001 From: Frederike Ramin Date: Sun, 27 Nov 2016 13:26:34 +0100 Subject: [PATCH 13/42] Add documentation for #29 --- app/models/event.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/models/event.rb b/app/models/event.rb index 00dd6855..e3d3554b 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -15,10 +15,18 @@ class Event < ActiveRecord::Base validates :max_participants, numericality: { only_integer: true, greater_than: 0 } + # Returns the number of free places of the event, this value may be negative + # + # @param none + # @return [Int] for number of free places available def compute_free_places max_participants - compute_occupied_places end + # Returns the number of already occupied places of the event + # + # @param none + # @return [Int] for number of occupied places def compute_occupied_places application_letters.where(status: true).count end From 484aed2760b55b78ca2779f9ea01c248d947285b Mon Sep 17 00:00:00 2001 From: Lando-L Date: Sun, 27 Nov 2016 13:42:54 +0100 Subject: [PATCH 14/42] Featured Issue #22 Added failing test --- .../events/_applicants_overview.html.erb | 4 ++-- spec/features/events_spec.rb | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/views/events/_applicants_overview.html.erb b/app/views/events/_applicants_overview.html.erb index cf0f0d81..95213b15 100644 --- a/app/views/events/_applicants_overview.html.erb +++ b/app/views/events/_applicants_overview.html.erb @@ -37,8 +37,8 @@ <%= link_to "Alle drucken (#30 US_3.7 Print all at once)", events_path, :class => 'btn btn-default'%> -<%= link_to "Zusagen verschicken (#22 US_3.2 Send emails in a bundle)", +<%= link_to "Zusagen verschicken", events_path, :class => 'btn btn-default'%> -<%= link_to "Absagen verschicken (#22 US_3.2 Send emails in a bundle)", +<%= link_to "Absagen verschicken", events_path, :class => 'btn btn-default'%> diff --git a/spec/features/events_spec.rb b/spec/features/events_spec.rb index b557fd3f..52eac1ed 100644 --- a/spec/features/events_spec.rb +++ b/spec/features/events_spec.rb @@ -16,6 +16,26 @@ expect(page).to have_table("applicants") end + scenario "Emails can not be send if there is any unclassified application left" do + login(:organizer) + expect(page).to have_button("Zusagen verschicken", disabled: true) + expect(page).to have_button("Absagen verschicken", disabled: true) + end + + scenario "Emails can not be send if there is a negative number of free places left" do + login(:organizer) + page.choose("Accept") + expect(page).to have_button("Zusagen verschicken", disabled: true) + expect(page).to have_button("Absagen verschicken", disabled: true) + end + + scenario "Clicking on sending emails button opens a modal" do + login(:organizer) + page.choose("Accept") + expect(page).to have_button("Zusagen verschicken", disabled: false) + expect(page).to have_button("Absagen verschicken", disabled: false) + end + def login(role) @event = FactoryGirl.create(:event) From e4116bf7ba512cc90e6de980f3c060ff7a1b73d5 Mon Sep 17 00:00:00 2001 From: Lando-L Date: Sun, 27 Nov 2016 15:40:29 +0100 Subject: [PATCH 15/42] Featured Issue #22 updated events feature tests --- spec/features/events_spec.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spec/features/events_spec.rb b/spec/features/events_spec.rb index 52eac1ed..c6a0d2d1 100644 --- a/spec/features/events_spec.rb +++ b/spec/features/events_spec.rb @@ -31,9 +31,8 @@ scenario "Clicking on sending emails button opens a modal" do login(:organizer) - page.choose("Accept") - expect(page).to have_button("Zusagen verschicken", disabled: false) - expect(page).to have_button("Absagen verschicken", disabled: false) + click_button "Zusagen verschicken" + expect(page).to have_selector('div', :id => 'send-emails-modal') end From ded4a15de095542693991dfad62ce0c17218cde2 Mon Sep 17 00:00:00 2001 From: Lando-L Date: Sun, 27 Nov 2016 15:44:02 +0100 Subject: [PATCH 16/42] Featured Issue #22 added send emails modal to overview page --- app/assets/javascripts/events.js | 27 ++++++++++++++++++ app/models/event.rb | 4 +++ .../events/_applicants_overview.html.erb | 28 ++++++++++++++++--- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/events.js b/app/assets/javascripts/events.js index dee720fa..0cd40491 100644 --- a/app/assets/javascripts/events.js +++ b/app/assets/javascripts/events.js @@ -1,2 +1,29 @@ // Place all the behaviors and hooks related to the matching controller here. // All this logic will automatically be available in application.js. + +jQuery(function() { + $('#send-emails-modal').on('show.bs.modal', function (event) { + var button = $(event.relatedTarget); + var header = button.data('header'); + var list = button.data('list'); + var modal = $(this); + modal.find('.modal-title').text(header); + modal.find('#send-emails-mailto').attr('href', 'mailto:' + list); + modal.find('#send-emails-list').val(list); + }); + + $('#send-emails-clipboard').click(function () { + var $temp = $(""); + $('body').append($temp); + $temp.val($('#send-emails-list').val()).select(); + try { + var successful = document.execCommand('copy'); + var msg = successful ? 'successful' : 'unsuccessful'; + console.log('Copying emails to the clipboard was ' + msg); + } + catch (err) { + console.log('Unable to copy emails to the clipboard'); + } + $temp.remove(); + }); +}); \ No newline at end of file diff --git a/app/models/event.rb b/app/models/event.rb index bf2da58f..1b2f4128 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -14,4 +14,8 @@ class Event < ActiveRecord::Base has_many :application_letters validates :max_participants, numericality: { only_integer: true, greater_than: 0 } + + def applicationsClassified? + application_letters.all? &:blank? + end end diff --git a/app/views/events/_applicants_overview.html.erb b/app/views/events/_applicants_overview.html.erb index 95213b15..7500efc2 100644 --- a/app/views/events/_applicants_overview.html.erb +++ b/app/views/events/_applicants_overview.html.erb @@ -36,9 +36,29 @@ <%= link_to "Alle drucken (#30 US_3.7 Print all at once)", events_path, :class => 'btn btn-default'%> +<%= button_tag "Zusagen verschicken", type: 'button', class: 'btn btn-default', data: {toggle: 'modal', target: '#send-emails-modal', header: 'Zusagen verschicken', list: 'zusage1@hpi.de,zusage2@hpi.de,zusage3@hpi.de'}, disabled: @event.applicationsClassified? %> -<%= link_to "Zusagen verschicken", - events_path, :class => 'btn btn-default'%> +<%= button_tag "Absagen verschicken", type: 'button', class: 'btn btn-default', data: {toggle: 'modal', target: '#send-emails-modal', header: 'Absagen verschicken', list: 'absage1@hpi.de,absage2@hpi.de,absage3@hpi.de'}, disabled: @event.applicationsClassified? %> -<%= link_to "Absagen verschicken", - events_path, :class => 'btn btn-default'%> + + \ No newline at end of file From 68b6ff2d47e1f504212161a1121e2327338db5b8 Mon Sep 17 00:00:00 2001 From: Lando-L Date: Sun, 27 Nov 2016 17:09:38 +0100 Subject: [PATCH 17/42] Featured Issue #22 before merge with Issue #29 commit --- app/models/event.rb | 2 +- spec/features/events_spec.rb | 31 +++++++++++++++++++++++++++---- spec/models/event_spec.rb | 11 +++++++++++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/app/models/event.rb b/app/models/event.rb index 1b2f4128..44b3d2ef 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -16,6 +16,6 @@ class Event < ActiveRecord::Base validates :max_participants, numericality: { only_integer: true, greater_than: 0 } def applicationsClassified? - application_letters.all? &:blank? + application_letters.all? { |application_letter| !application_letter.status.nil? } end end diff --git a/spec/features/events_spec.rb b/spec/features/events_spec.rb index c6a0d2d1..d66bef81 100644 --- a/spec/features/events_spec.rb +++ b/spec/features/events_spec.rb @@ -16,21 +16,44 @@ expect(page).to have_table("applicants") end - scenario "Emails can not be send if there is any unclassified application left" do + scenario "logged in as Organizer I want to be unable to send emails if there is any unclassified application left" do login(:organizer) + @event.update!(max_participants: 1) + @pupil1 = FactoryGirl.create(:profile) + @pupil1.user.role = :pupil + @nilApplication = FactoryGirl.create(:application_letter, :event => @event, :user => @pupil1.user, :status => nil) + visit event_path(@event) expect(page).to have_button("Zusagen verschicken", disabled: true) expect(page).to have_button("Absagen verschicken", disabled: true) end - scenario "Emails can not be send if there is a negative number of free places left" do + scenario "logged in as Organizer I want to be unable to send emails if there is a negative number of free places left" do login(:organizer) - page.choose("Accept") + @event.update!(max_participants: 1) + @pupil1 = FactoryGirl.create(:profile) + @pupil1.user.role = :pupil + @pupil2 = FactoryGirl.create(:profile) + @pupil2.user.role = :pupil + @pupil3 = FactoryGirl.create(:profile) + @pupil3.user.role = :pupil + @nilApplication = FactoryGirl.create(:application_letter, :event => @event, :user => @pupil1.user, :status => nil) + @acceptedApplication = FactoryGirl.create(:application_letter, :event => @event, :user => @pupil1.user, :status => true) + @acceptedApplication2 = FactoryGirl.create(:application_letter, :event => @event, :user => @pupil2.user, :status => true) + visit event_path(@event) expect(page).to have_button("Zusagen verschicken", disabled: true) expect(page).to have_button("Absagen verschicken", disabled: true) end - scenario "Clicking on sending emails button opens a modal" do + scenario "logged in as Organizer I want to open a modal by clicking on sending emails" do login(:organizer) + @event.update!(max_participants: 3) + @pupil1 = FactoryGirl.create(:profile) + @pupil1.user.role = :pupil + @pupil2 = FactoryGirl.create(:profile) + @pupil2.user.role = :pupil + @acceptedApplication = FactoryGirl.create(:application_letter, :event => @event, :user => @pupil1.user, :status => true) + @rejectedApplication = FactoryGirl.create(:application_letter, :event => @event, :user => @pupil2.user, :status => false) + visit event_path(@event) click_button "Zusagen verschicken" expect(page).to have_selector('div', :id => 'send-emails-modal') end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index 0b96996d..f5cdfb61 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -19,4 +19,15 @@ event = FactoryGirl.build(:event) expect(event).to be_valid end + + it "checks if there are unclassified applications_letters" do + event = FactoryGirl.create(:event) + acceptedApplicationLetter = FactoryGirl.create(:application_letter, :event => event, :user => FactoryGirl.create(:user), :status => true) + event.application_letters.push(acceptedApplicationLetter) + expect(event.applicationsClassified?).to eq(true) + + rejectedApplicationLetter = FactoryGirl.create(:application_letter, :event => event, :user => FactoryGirl.create(:user), :status => nil) + event.application_letters.push(rejectedApplicationLetter) + expect(event.applicationsClassified?).to eq(false) + end end From c904cf45812b1967508ec471d703ba5dc1590f9d Mon Sep 17 00:00:00 2001 From: Lando-L Date: Sun, 27 Nov 2016 18:52:16 +0100 Subject: [PATCH 18/42] Featured Issue #22 updated tests and _applicants_overview view --- app/models/event.rb | 1 + app/views/events/_applicants_overview.html.erb | 4 ++-- spec/features/events_spec.rb | 14 +++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/models/event.rb b/app/models/event.rb index 4f52051e..9a0cbbdc 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -18,6 +18,7 @@ class Event < ActiveRecord::Base def applicationsClassified? application_letters.all? { |application_letter| !application_letter.status.nil? } end + # Returns the number of free places of the event, this value may be negative # # @param none diff --git a/app/views/events/_applicants_overview.html.erb b/app/views/events/_applicants_overview.html.erb index 2824ed29..53a05d81 100644 --- a/app/views/events/_applicants_overview.html.erb +++ b/app/views/events/_applicants_overview.html.erb @@ -37,9 +37,9 @@ <%= link_to "Alle drucken (#30 US_3.7 Print all at once)", events_path, :class => 'btn btn-default'%> -<%= button_tag "Zusagen verschicken", type: 'button', class: 'btn btn-default', data: {toggle: 'modal', target: '#send-emails-modal', header: 'Zusagen verschicken', list: 'zusage1@hpi.de,zusage2@hpi.de,zusage3@hpi.de'}, disabled: @event.applicationsClassified? %> +<%= button_tag "Zusagen verschicken", type: 'button', class: 'btn btn-default', data: {toggle: 'modal', target: '#send-emails-modal', header: 'Zusagen verschicken', list: 'zusage1@hpi.de,zusage2@hpi.de,zusage3@hpi.de'}, disabled: !@event.applicationsClassified? || @event.compute_free_places < 0 %> -<%= button_tag "Absagen verschicken", type: 'button', class: 'btn btn-default', data: {toggle: 'modal', target: '#send-emails-modal', header: 'Absagen verschicken', list: 'absage1@hpi.de,absage2@hpi.de,absage3@hpi.de'}, disabled: @event.applicationsClassified? %> +<%= button_tag "Absagen verschicken", type: 'button', class: 'btn btn-default', data: {toggle: 'modal', target: '#send-emails-modal', header: 'Absagen verschicken', list: 'absage1@hpi.de,absage2@hpi.de,absage3@hpi.de'}, disabled: !@event.applicationsClassified? || @event.compute_free_places < 0 %>