Merge pull request #1043 from consul/managers-sps

Management spending proposals
This commit is contained in:
Raimond Garcia
2016-04-06 14:55:26 +02:00
20 changed files with 239 additions and 11 deletions

View File

@@ -116,7 +116,7 @@ body.admin {
[class^="icon-"] {
display: inline-block;
font-size: rem-calc(24);
padding-right: rem-calc(24);
padding-right: rem-calc(12);
padding-top: rem-calc(4);
padding-left: 12px\9 !important;
padding-right: 12px\9 !important;
@@ -349,3 +349,9 @@ body.admin {
margin-bottom: 0;
}
body.admin {
.investment-projects-list.medium-9 {
width: 100%;
}
}

View File

@@ -1,6 +1,12 @@
class Management::SpendingProposalsController < Management::BaseController
before_action :check_verified_user
before_action :set_spending_proposal, only: [:vote, :show]
def index
@spending_proposals = apply_filters_and_search(SpendingProposal).page(params[:page]).for_render
set_spending_proposal_votes(@spending_proposals)
end
def new
@spending_proposal = SpendingProposal.new
@@ -18,12 +24,20 @@ class Management::SpendingProposalsController < Management::BaseController
end
def show
@spending_proposal = SpendingProposal.find(params[:id])
set_spending_proposal_votes(@spending_proposal)
end
def vote
@spending_proposal.register_vote(current_user, 'yes')
set_spending_proposal_votes(@spending_proposal)
end
private
def set_spending_proposal
@spending_proposal = SpendingProposal.find(params[:id])
end
def spending_proposal_params
params.require(:spending_proposal).permit(:title, :description, :external_url, :geozone_id, :terms_of_service, :captcha, :captcha_key)
end
@@ -43,4 +57,14 @@ class Management::SpendingProposalsController < Management::BaseController
@spending_proposal_votes = current_user ? current_user.spending_proposal_votes(spending_proposals) : {}
end
def apply_filters_and_search(target)
target = params[:unfeasible].present? ? target.unfeasible : target.not_unfeasible
if params[:geozone].present?
target = target.by_geozone(params[:geozone])
set_geozone_name
end
target = target.search(params[:search]) if params[:search].present?
target
end
end

View File

@@ -3,4 +3,14 @@ module SpendingProposalsHelper
def spending_proposal_tags_select_options
ActsAsTaggableOn::Tag.spending_proposal_tags.pluck(:name)
end
def namespaced_spending_proposal_path(spending_proposal, options={})
@namespace_spending_proposal_path ||= namespace
case @namespace_spending_proposal_path
when "management"
management_spending_proposal_path(spending_proposal, options)
else
spending_proposal_path(spending_proposal, options)
end
end
end

View File

@@ -0,0 +1,10 @@
<%= form_for(SpendingProposal.new, url: url, as: :spending_proposal, method: :get) do |f| %>
<div class="row">
<div class="small-12 medium-6 column">
<%= text_field_tag :search, "", placeholder: t("admin.shared.spending_proposal_search.placeholder") %>
</div>
<div class="form-inline small-12 medium-3 column end">
<%= f.submit t("admin.shared.spending_proposal_search.button"), class: "button success expanded" %>
</div>
</div>
<% end %>

View File

@@ -1,5 +1,5 @@
<% if managed_user.document_number.present? %>
<section class="small-12 medium-9 column margin-top">
<section class="small-12 medium-9 column">
<div class="account-info">
<%= link_to(t("management.account_info.change_user"), logout_management_users_path, method: :delete, class: 'float-right change-user') %>

View File

@@ -34,6 +34,13 @@
<% end %>
</li>
<li <%= "class=active" if controller_name == "spending_proposals" and action_name == "index" %>>
<%= link_to management_spending_proposals_path do %>
<span class="icon-like"></span>
<%= t("management.menu.support_spending_proposals") %>
<% end %>
</li>
<li <%= "class=active" if controller_name == "proposals" and action_name == "print" %>>
<%= link_to print_management_proposals_path do %>
<span class="icon-print"></span>

View File

@@ -0,0 +1 @@
<%= render partial: 'spending_proposals/spending_proposal', locals: {spending_proposal: spending_proposal} %>

View File

@@ -0,0 +1,2 @@
<%= render 'spending_proposals/votes',
{ spending_proposal: spending_proposal, vote_url: vote_management_spending_proposal_path(spending_proposal, value: 'yes') } %>

View File

@@ -0,0 +1,25 @@
<main>
<span class="not-print">
<%= render 'admin/shared/spending_proposal_search', url: management_spending_proposals_path %>
</span>
<div class="wrap row">
<div id="investment-projects" class="investment-projects-list small-12 medium-9 column">
<div class="small-12 search-results">
<%= content_tag(:h2, t("spending_proposals.index.unfeasible")) if params[:unfeasible].present? %>
<%= content_tag(:h2, t("spending_proposals.index.by_geozone", geozone: @geozone_name)) if @geozone_name.present? %>
<% if params[:search].present? %>
<h2>
<%= page_entries_info @spending_proposals %>
<%= t("spending_proposals.index.search_results", count: @spending_proposals.size, search_term: params[:search]) %>
</h2>
<% end %>
</div>
<%= render @spending_proposals %>
<%= paginate @spending_proposals %>
</div>
</div>
</main>

View File

@@ -0,0 +1 @@
<%= render template: 'spending_proposals/vote' %>

View File

@@ -8,7 +8,7 @@
<% cache [locale_and_user_status(spending_proposal), 'index', spending_proposal, spending_proposal.author] do %>
<span class="label-investment-project float-left"><%= t("spending_proposals.spending_proposal.spending_proposal") %></span>
<span class="icon-budget"></span>
<h3><%= link_to spending_proposal.title, spending_proposal_path(spending_proposal) %></h3>
<h3><%= link_to spending_proposal.title, namespaced_spending_proposal_path(spending_proposal) %></h3>
<p class="investment-project-info">
<%= l spending_proposal.created_at.to_date %>
@@ -42,7 +42,7 @@
<%= geozone_name(spending_proposal) %>
</p>
<div class="investment-project-description">
<p><%= link_to spending_proposal.description, spending_proposal_path(spending_proposal) %></p>
<p><%= link_to spending_proposal.description, namespaced_spending_proposal_path(spending_proposal) %></p>
<div class="truncate"></div>
</div>
<% end %>
@@ -50,7 +50,7 @@
</div>
<div id="<%= dom_id(spending_proposal) %>_votes" class="small-12 medium-3 column text-center">
<%= render 'spending_proposals/votes',
<%= render 'votes',
{ spending_proposal: spending_proposal, vote_url: vote_spending_proposal_path(spending_proposal, value: 'yes') } %>
</div>

View File

@@ -36,7 +36,7 @@
<h3><%= t("votes.supports") %></h3>
<div class="text-center">
<div id="<%= dom_id(@spending_proposal) %>_votes">
<%= render 'spending_proposals/votes',
<%= render 'votes',
{ spending_proposal: @spending_proposal, vote_url: vote_spending_proposal_path(@spending_proposal, value: 'yes') } %>
</div>
</div>

View File

@@ -145,6 +145,9 @@ en:
proposal_search:
button: Search
placeholder: Search proposals by title, code, description or question
spending_proposal_search:
button: Search
placeholder: Search spending proposals by title or description
user_search:
button: Search
placeholder: Search user by name or email'

View File

@@ -145,6 +145,9 @@ es:
proposal_search:
button: Buscar
placeholder: Buscar propuestas por título, código, descripción o pregunta
spending_proposal_search:
button: Buscar
placeholder: Buscar propuestas por título o descripción
user_search:
button: Buscar
placeholder: Buscar usuario por nombre o email

View File

@@ -41,6 +41,7 @@ en:
print_proposals: Print proposals
support_proposals: Support proposals
create_spending_proposal: Create spending proposal
support_spending_proposals: Support spending proposals
title: Management
users: Users
permissions:

View File

@@ -40,7 +40,8 @@ es:
create_proposal: Crear propuesta
print_proposals: Imprimir propuestas
support_proposals: Apoyar propuestas
create_spending_proposal: Crear propuesta de gasto
create_spending_proposal: Crear propuesta de inversión
support_spending_proposals: Apoyar propuestas de inversión
title: Gestión
users: Usuarios
permissions:
@@ -62,7 +63,7 @@ es:
spending_proposals:
alert:
unverified_user: Este usuario no está verificado
create: Crear propuesta de gasto
create: Crear propuesta de inversión
sessions:
signed_out: Has cerrado la sesión correctamente.
signed_out_managed_user: Se ha cerrado correctamente la sesión del usuario.

View File

@@ -252,7 +252,11 @@ Rails.application.routes.draw do
end
end
resources :spending_proposals, only: [:new, :create, :show]
resources :spending_proposals, only: [:index, :new, :create, :show] do
member do
post :vote
end
end
end
if Rails.env.development?

View File

@@ -46,6 +46,12 @@ moderator.create_moderator
valuator = create_user('valuator@madrid.es', 'valuator')
valuator.create_valuator
level_2 = create_user('leveltwo@madrid.es', 'level 2')
level_2.update(residence_verified_at: Time.now, confirmed_phone: Faker::PhoneNumber.phone_number, document_number: "2222222222", document_type: "1" )
verified = create_user('verified@madrid.es', 'verified')
verified.update(residence_verified_at: Time.now, confirmed_phone: Faker::PhoneNumber.phone_number, document_type: "1", verified_at: Time.now, document_number: "3333333333")
(1..10).each do |i|
org_name = Faker::Company.name
org_user = create_user("org#{i}@madrid.es", org_name)

View File

@@ -312,7 +312,7 @@ ActiveRecord::Schema.define(version: 20160329160106) do
t.integer "price_first_year", limit: 8
t.string "time_scope"
t.datetime "unfeasible_email_sent_at"
t.integer "cached_votes_up"
t.integer "cached_votes_up", default: 0
t.tsvector "tsv"
end

View File

@@ -51,4 +51,128 @@ feature 'Spending Proposals' do
end
end
context "Searching" do
scenario "by title" do
spending_proposal1 = create(:spending_proposal, title: "Show me what you got")
spending_proposal2 = create(:spending_proposal, title: "Get Schwifty")
user = create(:user, :level_two)
login_managed_user(user)
click_link "Support spending proposals"
fill_in "search", with: "what you got"
click_button "Search"
expect(current_path).to eq(management_spending_proposals_path)
within("#investment-projects") do
expect(page).to have_css('.investment-project', count: 1)
expect(page).to have_content(spending_proposal1.title)
expect(page).to_not have_content(spending_proposal2.title)
expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal1)}']", text: spending_proposal1.title)
expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal1)}']", text: spending_proposal1.description)
end
end
scenario "by district" do
spending_proposal1 = create(:spending_proposal, title: "Hey ho", geozone_id: create(:geozone, name: "District 9").id)
spending_proposal2 = create(:spending_proposal, title: "Let's go", geozone_id: create(:geozone, name: "Area 52").id)
user = create(:user, :level_two)
login_managed_user(user)
click_link "Support spending proposals"
fill_in "search", with: "Area 52"
click_button "Search"
expect(current_path).to eq(management_spending_proposals_path)
within("#investment-projects") do
expect(page).to have_css('.investment-project', count: 1)
expect(page).to_not have_content(spending_proposal1.title)
expect(page).to have_content(spending_proposal2.title)
expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal2)}']", text: spending_proposal2.title)
expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal2)}']", text: spending_proposal2.description)
end
end
end
scenario "Listing" do
spending_proposal1 = create(:spending_proposal, title: "Show me what you got")
spending_proposal2 = create(:spending_proposal, title: "Get Schwifty")
user = create(:user, :level_two)
login_managed_user(user)
click_link "Support spending proposals"
expect(current_path).to eq(management_spending_proposals_path)
within(".account-info") do
expect(page).to have_content "Identified as"
expect(page).to have_content "#{user.username}"
expect(page).to have_content "#{user.email}"
expect(page).to have_content "#{user.document_number}"
end
within("#investment-projects") do
expect(page).to have_css('.investment-project', count: 2)
expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal1)}']", text: spending_proposal1.title)
expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal1)}']", text: spending_proposal1.description)
expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal2)}']", text: spending_proposal2.title)
expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal2)}']", text: spending_proposal2.description)
end
end
context "Voting" do
scenario 'Voting spending proposals on behalf of someone in index view', :js do
spending_proposal = create(:spending_proposal)
user = create(:user, :level_two)
login_managed_user(user)
click_link "Support spending proposals"
within("#investment-projects") do
find('.in-favor a').click
expect(page).to have_content "1 support"
expect(page).to have_content "You have already supported this. Share it!"
end
expect(current_path).to eq(management_spending_proposals_path)
end
scenario 'Voting spending proposals on behalf of someone in show view', :js do
spending_proposal = create(:spending_proposal)
user = create(:user, :level_two)
login_managed_user(user)
click_link "Support spending proposals"
within("#investment-projects") do
click_link spending_proposal.title
end
find('.in-favor a').click
expect(page).to have_content "1 support"
expect(page).to have_content "You have already supported this. Share it!"
expect(current_path).to eq(management_spending_proposal_path(spending_proposal))
end
scenario "Should not allow unverified users to vote proposals" do
spending_proposal = create(:spending_proposal)
user = create(:user)
login_managed_user(user)
click_link "Support spending proposals"
expect(page).to have_content "User is not verified"
end
end
end