Merge pull request #3343 from consul/backport-budget_poll_menu
Display 'Validate document' menu item only when applicable
This commit is contained in:
@@ -65,12 +65,32 @@ class Poll < ActiveRecord::Base
|
||||
.where('geozone_restricted = ? OR geozones_polls.geozone_id = ?', false, user.geozone_id)
|
||||
end
|
||||
|
||||
def votable_by?(user)
|
||||
!document_has_voted?(user.document_number, user.document_type)
|
||||
def self.votable_by(user)
|
||||
answerable_by(user).
|
||||
not_voted_by(user)
|
||||
end
|
||||
|
||||
def document_has_voted?(document_number, document_type)
|
||||
voters.where(document_number: document_number, document_type: document_type).exists?
|
||||
def votable_by?(user)
|
||||
answerable_by?(user) &&
|
||||
not_voted_by?(user)
|
||||
end
|
||||
|
||||
def self.not_voted_by(user)
|
||||
where("polls.id not in (?)", poll_ids_voted_by(user))
|
||||
end
|
||||
|
||||
def self.poll_ids_voted_by(user)
|
||||
return -1 if Poll::Voter.where(user: user).empty?
|
||||
|
||||
Poll::Voter.where(user: user).pluck(:poll_id)
|
||||
end
|
||||
|
||||
def not_voted_by?(user)
|
||||
Poll::Voter.where(poll: self, user: user).empty?
|
||||
end
|
||||
|
||||
def voted_by?(user)
|
||||
Poll::Voter.where(poll: self, user: user).exists?
|
||||
end
|
||||
|
||||
def voted_in_booth?(user)
|
||||
@@ -81,10 +101,6 @@ class Poll < ActiveRecord::Base
|
||||
Poll::Voter.where(poll: self, user: user, origin: "web").exists?
|
||||
end
|
||||
|
||||
def voted_by?(user)
|
||||
Poll::Voter.where(poll: self, user: user).exists?
|
||||
end
|
||||
|
||||
def date_range
|
||||
unless starts_at.present? && ends_at.present? && starts_at <= ends_at
|
||||
errors.add(:starts_at, I18n.t('errors.messages.invalid_date_range'))
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
<div class="admin-sidebar" data-equalizer-watch>
|
||||
<ul id="officing_menu">
|
||||
<% if vote_collection_shift? %>
|
||||
<li <%= "class=is-active" if controller_name == "voters" %>>
|
||||
<li class="<%= "js-vote-collection" %>
|
||||
<%= " is-active" if controller_name == "voters" %>
|
||||
<%= " is-hidden" if controller_name == "voters" && Poll.votable_by(@user).any? %>">
|
||||
<%= link_to new_officing_residence_path do %>
|
||||
<span class="icon-user"></span>
|
||||
<%= t("officing.menu.voters") %>
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
$("#<%= dom_id(@poll) %> #actions").html('<%= j render("voted") %>');
|
||||
$("#<%= dom_id(@poll) %> #can_vote_callout").hide();
|
||||
$(".js-vote-collection").removeClass("is-hidden");
|
||||
|
||||
@@ -164,6 +164,48 @@ feature "Voter" do
|
||||
expect(Poll::Voter.count).to eq(1)
|
||||
end
|
||||
|
||||
end
|
||||
context "Side menu" do
|
||||
scenario "'Validate document' menu item with votable polls", :js do
|
||||
login_through_form_as_officer(officer.user)
|
||||
|
||||
visit new_officing_residence_path
|
||||
officing_verify_residence
|
||||
|
||||
expect(page).to have_content poll.name
|
||||
|
||||
within("#side_menu") do
|
||||
expect(page).not_to have_content("Validate document")
|
||||
end
|
||||
|
||||
within("#poll_#{poll.id}") do
|
||||
click_button("Confirm vote")
|
||||
expect(page).to have_content "Vote introduced!"
|
||||
end
|
||||
|
||||
within("#side_menu") do
|
||||
expect(page).to have_content("Validate document")
|
||||
end
|
||||
end
|
||||
|
||||
scenario "'Validate document' menu item without votable polls", :js do
|
||||
create(:poll_voter, poll: poll, user: create(:user, :in_census))
|
||||
|
||||
login_through_form_as_officer(officer.user)
|
||||
|
||||
visit new_officing_residence_path
|
||||
officing_verify_residence
|
||||
|
||||
expect(page).to have_content poll.name
|
||||
|
||||
within("#poll_#{poll.id}") do
|
||||
expect(page).to have_content "Has already participated in this poll"
|
||||
end
|
||||
|
||||
within("#side_menu") do
|
||||
expect(page).to have_content("Validate document")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -147,6 +147,70 @@ describe Poll do
|
||||
end
|
||||
end
|
||||
|
||||
describe "votable_by" do
|
||||
it "returns polls that have not been voted by a user" do
|
||||
user = create(:user, :level_two)
|
||||
|
||||
poll1 = create(:poll)
|
||||
poll2 = create(:poll)
|
||||
poll3 = create(:poll)
|
||||
|
||||
create(:poll_voter, user: user, poll: poll1)
|
||||
|
||||
expect(Poll.votable_by(user)).to include(poll2)
|
||||
expect(Poll.votable_by(user)).to include(poll3)
|
||||
expect(Poll.votable_by(user)).not_to include(poll1)
|
||||
end
|
||||
|
||||
it "returns polls that are answerable by a user" do
|
||||
user = create(:user, :level_two, geozone: nil)
|
||||
poll1 = create(:poll)
|
||||
poll2 = create(:poll)
|
||||
|
||||
allow(Poll).to receive(:answerable_by).and_return(Poll.where(id: poll1))
|
||||
|
||||
expect(Poll.votable_by(user)).to include(poll1)
|
||||
expect(Poll.votable_by(user)).not_to include(poll2)
|
||||
end
|
||||
|
||||
it "returns polls even if there are no voters yet" do
|
||||
user = create(:user, :level_two)
|
||||
poll = create(:poll)
|
||||
|
||||
expect(Poll.votable_by(user)).to include(poll)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#votable_by" do
|
||||
it "returns false if the user has already voted the poll" do
|
||||
user = create(:user, :level_two)
|
||||
poll = create(:poll)
|
||||
|
||||
create(:poll_voter, user: user, poll: poll)
|
||||
|
||||
expect(poll.votable_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if the poll is not answerable by the user" do
|
||||
user = create(:user, :level_two)
|
||||
poll = create(:poll)
|
||||
|
||||
allow_any_instance_of(Poll).to receive(:answerable_by?).and_return(false)
|
||||
|
||||
expect(poll.votable_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "return true if a poll is answerable and has not been voted by the user" do
|
||||
user = create(:user, :level_two)
|
||||
poll = create(:poll)
|
||||
|
||||
allow_any_instance_of(Poll).to receive(:answerable_by?).and_return(true)
|
||||
|
||||
expect(poll.votable_by?(user)).to eq(true)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#voted_by?" do
|
||||
it "return false if the user has not voted for this poll" do
|
||||
user = create(:user, :level_two)
|
||||
|
||||
Reference in New Issue
Block a user