Merge pull request #1043 from consul/managers-sps
Management spending proposals
This commit is contained in:
@@ -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%;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
10
app/views/admin/shared/_spending_proposal_search.html.erb
Normal file
10
app/views/admin/shared/_spending_proposal_search.html.erb
Normal 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 %>
|
||||
@@ -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') %>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<%= render partial: 'spending_proposals/spending_proposal', locals: {spending_proposal: spending_proposal} %>
|
||||
2
app/views/management/spending_proposals/_votes.html.erb
Normal file
2
app/views/management/spending_proposals/_votes.html.erb
Normal file
@@ -0,0 +1,2 @@
|
||||
<%= render 'spending_proposals/votes',
|
||||
{ spending_proposal: spending_proposal, vote_url: vote_management_spending_proposal_path(spending_proposal, value: 'yes') } %>
|
||||
25
app/views/management/spending_proposals/index.html.erb
Normal file
25
app/views/management/spending_proposals/index.html.erb
Normal 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>
|
||||
1
app/views/management/spending_proposals/vote.js.erb
Normal file
1
app/views/management/spending_proposals/vote.js.erb
Normal file
@@ -0,0 +1 @@
|
||||
<%= render template: 'spending_proposals/vote' %>
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user