diff --git a/app/controllers/admin/poll/booths_controller.rb b/app/controllers/admin/poll/booths_controller.rb
index 95057ce2f..1d05ddab5 100644
--- a/app/controllers/admin/poll/booths_controller.rb
+++ b/app/controllers/admin/poll/booths_controller.rb
@@ -8,6 +8,7 @@ class Admin::Poll::BoothsController < Admin::BaseController
end
def show
+ @officers = Poll::Officer.all
end
def new
@@ -35,7 +36,7 @@ class Admin::Poll::BoothsController < Admin::BaseController
private
def booth_params
- params.require(:poll_booth).permit(:name, :location)
+ params.require(:poll_booth).permit(:name, :location, officer_ids: [])
end
def load_polls
diff --git a/app/helpers/officers_helper.rb b/app/helpers/officers_helper.rb
new file mode 100644
index 000000000..f29bcf728
--- /dev/null
+++ b/app/helpers/officers_helper.rb
@@ -0,0 +1,7 @@
+module OfficersHelper
+
+ def officer_label(officer)
+ truncate([officer.name, officer.email].compact.join(' - '), length: 100)
+ end
+
+end
\ No newline at end of file
diff --git a/app/models/poll/booth.rb b/app/models/poll/booth.rb
index eb7d81b8c..74c4c3edb 100644
--- a/app/models/poll/booth.rb
+++ b/app/models/poll/booth.rb
@@ -2,6 +2,8 @@ class Poll
class Booth < ActiveRecord::Base
belongs_to :poll
has_many :voters
+ has_many :officing_booths, dependent: :destroy
+ has_many :officers, through: :officing_booths
validates :name, presence: true
end
diff --git a/app/models/poll/officing_booth.rb b/app/models/poll/officing_booth.rb
new file mode 100644
index 000000000..f0a64721a
--- /dev/null
+++ b/app/models/poll/officing_booth.rb
@@ -0,0 +1,6 @@
+class Poll
+ class OfficingBooth < ActiveRecord::Base
+ belongs_to :officer
+ belongs_to :booth
+ end
+end
diff --git a/app/views/admin/poll/booths/show.html.erb b/app/views/admin/poll/booths/show.html.erb
index 55f7d5504..cce704d2c 100644
--- a/app/views/admin/poll/booths/show.html.erb
+++ b/app/views/admin/poll/booths/show.html.erb
@@ -15,34 +15,32 @@
<%= t("admin.booths.show.officers_list") %>
-
-
- <%= t("admin.booths.show.no_officers") %>
-
-
-
-<%= link_to t("admin.booths.show.assign_officer"), "#", class: "button success" %>
+<% if @booth.officers.empty? %>
+
+ <%= t("admin.booths.show.no_officers") %>
+
+<% end %>
-
- <%# f.label :valuator_ids, t("admin.spending_proposals.edit.assigned_valuators") %>
+ <%= form_for @booth, url: admin_poll_booth_path(@poll, @booth) do |f| %>
- <%# f.collection_check_boxes :valuator_ids, @valuators, :id, :email do |b| %>
- <%# b.label(title: valuator_label(b.object)) { b.check_box + truncate(b.object.description_or_email, length: 60) } %>
- <%# end %>
+ <%= f.label :officer_ids, t("admin.spending_proposals.edit.assigned_valuators") %>
+ <%= f.collection_check_boxes :officer_ids, @officers, :id, :email do |b| %>
+ <% b.label { b.check_box + truncate(officer_label(b.object), length: 60) } %>
+ <% end %>
+
+ <%= f.submit t("admin.booths.show.assign_officer"), class: "button success" %>
+ <% end %>
-
- <%# @officers.each do |officer| %>
-
+
+ <% @booth.officers.each do |officer| %>
+
|
- <%# officer.name %>
- Admin
+ <%= officer.name %>
|
- admin@consul.dev
- <%# officer.email %>
+ <%= officer.email %>
|
<%= link_to t('admin.poll_officers.officer.delete'), "#", class: "button hollow alert" %>
@@ -53,5 +51,5 @@
%>
|
- <%# end %>
+ <% end %>
\ No newline at end of file
diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml
index ef294262d..c4a94a86e 100755
--- a/config/locales/admin.en.yml
+++ b/config/locales/admin.en.yml
@@ -208,7 +208,7 @@ en:
location: "Location"
assign_officer: "Assign officer"
officers_list: "List of officers"
- no_officers: "There is no officers in this booth."
+ no_officers: "There are no officers assigned to this booth"
officials:
edit:
destroy: Remove 'Official' status
diff --git a/db/migrate/20160928113143_create_officing_booths.rb b/db/migrate/20160928113143_create_officing_booths.rb
new file mode 100644
index 000000000..00483fe00
--- /dev/null
+++ b/db/migrate/20160928113143_create_officing_booths.rb
@@ -0,0 +1,9 @@
+class CreateOfficingBooths < ActiveRecord::Migration
+ def change
+ create_table :poll_officing_booths do |t|
+ t.belongs_to :officer
+ t.belongs_to :booth
+ t.timestamps null: false
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 2da00cfe2..313c6d1f1 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -280,8 +280,11 @@ ActiveRecord::Schema.define(version: 20161102133838) do
t.integer "user_id"
end
- create_table "poll_officers", force: :cascade do |t|
- t.integer "user_id"
+ create_table "poll_officing_booths", force: :cascade do |t|
+ t.integer "officer_id"
+ t.integer "booth_id"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
create_table "poll_voters", force: :cascade do |t|
diff --git a/spec/factories.rb b/spec/factories.rb
index 2ef46540e..b88af100c 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -267,6 +267,18 @@ FactoryGirl.define do
sequence(:name) { |n| "Poll #{n}" }
end
+<<<<<<< HEAD
+=======
+ factory :poll_officer, class: 'Poll::Officer' do
+ user
+ end
+
+ factory :officing_booth, class: 'Poll::OfficingBooth' do
+ association :officer, factory: :poll_officer
+ association :booth, factory: :poll_booth
+ end
+
+>>>>>>> assigns officers to booths
factory :poll_booth, class: 'Poll::Booth' do
sequence(:name) { |n| "Booth #{n}" }
sequence(:location) { |n| "Street #{n}" }
diff --git a/spec/features/admin/poll/officers_spec.rb b/spec/features/admin/poll/officers_spec.rb
index ed9ec545d..981b17f13 100644
--- a/spec/features/admin/poll/officers_spec.rb
+++ b/spec/features/admin/poll/officers_spec.rb
@@ -1,12 +1,13 @@
require 'rails_helper'
feature 'Admin poll officers' do
+
background do
@admin = create(:administrator)
@user = create(:user, username: 'Pedro Jose Garcia')
@officer = create(:poll_officer)
login_as(@admin.user)
- visit admin_poll_officers_path
+ visit admin_officers_path
end
scenario 'Index' do
@@ -15,7 +16,7 @@ feature 'Admin poll officers' do
expect(page).to_not have_content @user.name
end
- scenario 'Create poll officer', :js do
+ scenario 'Create', :js do
fill_in 'email', with: @user.email
click_button 'Search'
@@ -26,11 +27,133 @@ feature 'Admin poll officers' do
end
end
- scenario 'Delete poll officer' do
+ scenario 'Delete' do
click_link 'Delete'
within("#officers") do
expect(page).to_not have_content @officer.name
end
end
+
+ context "Booth" do
+
+ scenario 'No officers assigned to booth' do
+ poll = create(:poll)
+ booth = create(:poll_booth, poll: poll)
+
+ visit admin_poll_booth_path(poll, booth)
+
+ within("#assigned_officers") do
+ expect(page).to have_css ".officer", count: 0
+ end
+
+ expect(page).to have_content "There are no officers assigned to this booth"
+ end
+
+ scenario "Assigned to booth" do
+ john = create(:poll_officer)
+ isabel = create(:poll_officer)
+ eve = create(:poll_officer)
+
+ poll = create(:poll)
+ booth = create(:poll_booth, poll: poll)
+
+ officing_booth1 = create(:officing_booth, officer: john, booth: booth)
+ officing_booth2 = create(:officing_booth, officer: isabel, booth: booth)
+
+ visit admin_poll_booth_path(poll, booth)
+
+ within("#assigned_officers") do
+ expect(page).to have_css ".officer", count: 2
+ expect(page).to have_content john.name
+ expect(page).to have_content isabel.name
+
+ expect(page).to_not have_content eve.name
+ end
+
+ expect(page).to_not have_content "There are no officers assigned to this booth"
+ end
+
+ scenario 'Assign to booth' do
+ john = create(:poll_officer)
+ isabel = create(:poll_officer)
+
+ poll = create(:poll)
+ booth = create(:poll_booth, poll: poll)
+
+ visit admin_poll_booth_path(poll, booth)
+
+ check "#{john.name} - #{john.email}"
+ click_button "Assign officer"
+
+ expect(page).to have_content "Booth updated successfully."
+ within("#assigned_officers") do
+ expect(page).to have_css ".officer", count: 1
+ expect(page).to have_content john.name
+ end
+ end
+
+ scenario "Unassign from booth" do
+ john = create(:poll_officer)
+ isabel = create(:poll_officer)
+
+ poll = create(:poll)
+ booth = create(:poll_booth, poll: poll)
+
+ officing_booth = create(:officing_booth, officer: john, booth: booth)
+ officing_booth = create(:officing_booth, officer: isabel, booth: booth)
+
+ visit admin_poll_booth_path(poll, booth)
+
+ uncheck "#{john.name} - #{john.email}"
+ click_button "Assign officer"
+
+ expect(page).to have_content "Booth updated successfully."
+ within("#assigned_officers") do
+ expect(page).to have_css ".officer", count: 1
+ expect(page).to have_content isabel.name
+
+ expect(page).to_not have_content john.name
+ end
+ end
+
+ scenario "Assigned multiple officers to different booths" do
+ john = create(:poll_officer)
+ isabel = create(:poll_officer)
+ eve = create(:poll_officer)
+ peter = create(:poll_officer)
+
+ poll1 = create(:poll)
+ poll2 = create(:poll)
+
+ booth1 = create(:poll_booth, poll: poll1)
+ booth2 = create(:poll_booth, poll: poll1)
+ booth3 = create(:poll_booth, poll: poll2)
+
+ officing_booth = create(:officing_booth, officer: john, booth: booth1)
+ officing_booth = create(:officing_booth, officer: isabel, booth: booth1)
+ officing_booth = create(:officing_booth, officer: eve, booth: booth2)
+ officing_booth = create(:officing_booth, officer: peter, booth: booth3)
+
+ visit admin_poll_booth_path(poll1, booth1)
+ within("#assigned_officers") do
+ expect(page).to have_css ".officer", count: 2
+ expect(page).to have_content john.name
+ expect(page).to have_content isabel.name
+ end
+
+ visit admin_poll_booth_path(poll1, booth2)
+ within("#assigned_officers") do
+ expect(page).to have_css ".officer", count: 1
+ expect(page).to have_content eve.name
+ end
+
+ visit admin_poll_booth_path(poll2, booth3)
+ within("#assigned_officers") do
+ expect(page).to have_css ".officer", count: 1
+ expect(page).to have_content peter.name
+ end
+ end
+ end
+
end
\ No newline at end of file