From 48c3cc580c2e7ca04820502e16cb5be7762de3c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Mon, 4 Apr 2016 20:05:01 +0200 Subject: [PATCH 1/8] adds namespaced helper for spending_proposal route --- app/helpers/spending_proposals_helper.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/helpers/spending_proposals_helper.rb b/app/helpers/spending_proposals_helper.rb index 43ef7311a..ba68ad42a 100644 --- a/app/helpers/spending_proposals_helper.rb +++ b/app/helpers/spending_proposals_helper.rb @@ -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 \ No newline at end of file From 3c37575f8845692acf3748899661ac6813b66f8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Mon, 4 Apr 2016 20:05:32 +0200 Subject: [PATCH 2/8] adds management spending proposals index to routes --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 0d704be04..e27d035f2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -252,7 +252,7 @@ Rails.application.routes.draw do end end - resources :spending_proposals, only: [:new, :create, :show] + resources :spending_proposals, only: [:index, :new, :create, :show] end if Rails.env.development? From cb052317941e5236cad5db5109b1f4b975442391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Wed, 6 Apr 2016 12:05:43 +0200 Subject: [PATCH 3/8] adds index/show/voting to management for sps --- .../spending_proposals_controller.rb | 26 +++- .../shared/_spending_proposal_search.html.erb | 10 ++ .../_spending_proposal.html.erb | 1 + .../spending_proposals/_votes.html.erb | 2 + .../spending_proposals/index.html.erb | 22 ++++ .../management/spending_proposals/vote.js.erb | 1 + .../_spending_proposal.html.erb | 6 +- app/views/spending_proposals/show.html.erb | 2 +- config/locales/admin.en.yml | 3 + config/locales/admin.es.yml | 3 + config/routes.rb | 6 +- .../management/spending_proposals_spec.rb | 124 ++++++++++++++++++ 12 files changed, 200 insertions(+), 6 deletions(-) create mode 100644 app/views/admin/shared/_spending_proposal_search.html.erb create mode 100644 app/views/management/spending_proposals/_spending_proposal.html.erb create mode 100644 app/views/management/spending_proposals/_votes.html.erb create mode 100644 app/views/management/spending_proposals/index.html.erb create mode 100644 app/views/management/spending_proposals/vote.js.erb diff --git a/app/controllers/management/spending_proposals_controller.rb b/app/controllers/management/spending_proposals_controller.rb index e6170722a..ee2c3c695 100644 --- a/app/controllers/management/spending_proposals_controller.rb +++ b/app/controllers/management/spending_proposals_controller.rb @@ -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 diff --git a/app/views/admin/shared/_spending_proposal_search.html.erb b/app/views/admin/shared/_spending_proposal_search.html.erb new file mode 100644 index 000000000..d017d2716 --- /dev/null +++ b/app/views/admin/shared/_spending_proposal_search.html.erb @@ -0,0 +1,10 @@ +<%= form_for(SpendingProposal.new, url: url, as: :spending_proposal, method: :get) do |f| %> +
+
+ <%= text_field_tag :search, "", placeholder: t("admin.shared.spending_proposal_search.placeholder") %> +
+
+ <%= f.submit t("admin.shared.spending_proposal_search.button"), class: "button success" %> +
+
+<% end %> \ No newline at end of file diff --git a/app/views/management/spending_proposals/_spending_proposal.html.erb b/app/views/management/spending_proposals/_spending_proposal.html.erb new file mode 100644 index 000000000..59b8bc675 --- /dev/null +++ b/app/views/management/spending_proposals/_spending_proposal.html.erb @@ -0,0 +1 @@ +<%= render partial: 'spending_proposals/spending_proposal', locals: {spending_proposal: spending_proposal} %> \ No newline at end of file diff --git a/app/views/management/spending_proposals/_votes.html.erb b/app/views/management/spending_proposals/_votes.html.erb new file mode 100644 index 000000000..6549aa204 --- /dev/null +++ b/app/views/management/spending_proposals/_votes.html.erb @@ -0,0 +1,2 @@ +<%= render 'spending_proposals/votes', + { spending_proposal: spending_proposal, vote_url: vote_management_spending_proposal_path(spending_proposal, value: 'yes') } %> \ No newline at end of file diff --git a/app/views/management/spending_proposals/index.html.erb b/app/views/management/spending_proposals/index.html.erb new file mode 100644 index 000000000..63f4c6ea2 --- /dev/null +++ b/app/views/management/spending_proposals/index.html.erb @@ -0,0 +1,22 @@ +
+ <%= render 'admin/shared/spending_proposal_search', url: management_spending_proposals_path %> + +
+
+ +
+ <%= 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? %> +

+ <%= page_entries_info @spending_proposals %> + <%= t("spending_proposals.index.search_results", count: @spending_proposals.size, search_term: params[:search]) %> +

+ <% end %> +
+ + <%= render @spending_proposals %> + <%= paginate @spending_proposals %> +
+
+
\ No newline at end of file diff --git a/app/views/management/spending_proposals/vote.js.erb b/app/views/management/spending_proposals/vote.js.erb new file mode 100644 index 000000000..2c789f995 --- /dev/null +++ b/app/views/management/spending_proposals/vote.js.erb @@ -0,0 +1 @@ +<%= render template: 'spending_proposals/vote' %> \ No newline at end of file diff --git a/app/views/spending_proposals/_spending_proposal.html.erb b/app/views/spending_proposals/_spending_proposal.html.erb index 7dff660fc..af59def70 100644 --- a/app/views/spending_proposals/_spending_proposal.html.erb +++ b/app/views/spending_proposals/_spending_proposal.html.erb @@ -8,7 +8,7 @@ <% cache [locale_and_user_status(spending_proposal), 'index', spending_proposal, spending_proposal.author] do %> <%= t("spending_proposals.spending_proposal.spending_proposal") %> -

<%= link_to spending_proposal.title, spending_proposal_path(spending_proposal) %>

+

<%= link_to spending_proposal.title, namespaced_spending_proposal_path(spending_proposal) %>

<%= l spending_proposal.created_at.to_date %> @@ -42,7 +42,7 @@ <%= geozone_name(spending_proposal) %>

-

<%= link_to spending_proposal.description, spending_proposal_path(spending_proposal) %>

+

<%= link_to spending_proposal.description, namespaced_spending_proposal_path(spending_proposal) %>

<% end %> @@ -50,7 +50,7 @@
- <%= render 'spending_proposals/votes', + <%= render 'votes', { spending_proposal: spending_proposal, vote_url: vote_spending_proposal_path(spending_proposal, value: 'yes') } %>
diff --git a/app/views/spending_proposals/show.html.erb b/app/views/spending_proposals/show.html.erb index ba80fc223..99aab4e17 100644 --- a/app/views/spending_proposals/show.html.erb +++ b/app/views/spending_proposals/show.html.erb @@ -36,7 +36,7 @@

<%= t("votes.supports") %>

- <%= render 'spending_proposals/votes', + <%= render 'votes', { spending_proposal: @spending_proposal, vote_url: vote_spending_proposal_path(@spending_proposal, value: 'yes') } %>
diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml index 47cbad031..33d3c8434 100755 --- a/config/locales/admin.en.yml +++ b/config/locales/admin.en.yml @@ -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' diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml index c8a710d72..ec0fa5483 100644 --- a/config/locales/admin.es.yml +++ b/config/locales/admin.es.yml @@ -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 diff --git a/config/routes.rb b/config/routes.rb index e27d035f2..f5e22b91a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -252,7 +252,11 @@ Rails.application.routes.draw do end end - resources :spending_proposals, only: [:index, :new, :create, :show] + resources :spending_proposals, only: [:index, :new, :create, :show] do + member do + post :vote + end + end end if Rails.env.development? diff --git a/spec/features/management/spending_proposals_spec.rb b/spec/features/management/spending_proposals_spec.rb index 52ea36801..9ee161fd8 100644 --- a/spec/features/management/spending_proposals_spec.rb +++ b/spec/features/management/spending_proposals_spec.rb @@ -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 \ No newline at end of file From 1e8204e6767136347bf561e492da12f93d17284d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Wed, 6 Apr 2016 12:06:07 +0200 Subject: [PATCH 4/8] adds support for spending proposals to mgmt menu --- app/views/management/_menu.html.erb | 7 +++++++ config/locales/management.en.yml | 1 + config/locales/management.es.yml | 1 + 3 files changed, 9 insertions(+) diff --git a/app/views/management/_menu.html.erb b/app/views/management/_menu.html.erb index 1810ab568..520cd9f8c 100644 --- a/app/views/management/_menu.html.erb +++ b/app/views/management/_menu.html.erb @@ -34,6 +34,13 @@ <% end %> +
  • > + <%= link_to management_spending_proposals_path do %> + + <%= t("management.menu.support_spending_proposals") %> + <% end %> +
  • +
  • > <%= link_to print_management_proposals_path do %> diff --git a/config/locales/management.en.yml b/config/locales/management.en.yml index 7d8a9f12e..1e8e99196 100644 --- a/config/locales/management.en.yml +++ b/config/locales/management.en.yml @@ -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: diff --git a/config/locales/management.es.yml b/config/locales/management.es.yml index 5c1fe68d9..991bd7741 100644 --- a/config/locales/management.es.yml +++ b/config/locales/management.es.yml @@ -41,6 +41,7 @@ es: print_proposals: Imprimir propuestas support_proposals: Apoyar propuestas create_spending_proposal: Crear propuesta de gasto + support_spending_proposals: Apoyar propuestas de gasto title: Gestión users: Usuarios permissions: From c71d09d3df370ff07ba8d53d55af2057ebea8118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baza=CC=81n?= Date: Wed, 6 Apr 2016 12:18:25 +0200 Subject: [PATCH 5/8] adds verified and level 2 users to dev_seeds --- db/dev_seeds.rb | 6 ++++++ db/schema.rb | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/db/dev_seeds.rb b/db/dev_seeds.rb index ac4695d0f..ffbc8237d 100644 --- a/db/dev_seeds.rb +++ b/db/dev_seeds.rb @@ -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) diff --git a/db/schema.rb b/db/schema.rb index 55021dfa0..a031c51f5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -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 From 9c6813b23c08b0a05d92024bcc5fe98dc4a5b445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Wed, 6 Apr 2016 12:40:19 +0200 Subject: [PATCH 6/8] changes i18n for spending proposals in management --- config/locales/management.es.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/locales/management.es.yml b/config/locales/management.es.yml index 991bd7741..f1de3cf88 100644 --- a/config/locales/management.es.yml +++ b/config/locales/management.es.yml @@ -40,8 +40,8 @@ es: create_proposal: Crear propuesta print_proposals: Imprimir propuestas support_proposals: Apoyar propuestas - create_spending_proposal: Crear propuesta de gasto - support_spending_proposals: Apoyar propuestas de gasto + create_spending_proposal: Crear propuesta de inversión + support_spending_proposals: Apoyar propuestas de inversión title: Gestión users: Usuarios permissions: @@ -63,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. From 5d22ea2daf7cb0338bef5dc665b5b1275e586e6e Mon Sep 17 00:00:00 2001 From: Alberto Garcia Cabeza Date: Wed, 6 Apr 2016 13:07:26 +0200 Subject: [PATCH 7/8] Improves layout for management spending proposals --- app/assets/stylesheets/admin.scss | 6 ++++++ app/views/admin/shared/_spending_proposal_search.html.erb | 4 ++-- app/views/management/_account_info.html.erb | 2 +- app/views/management/spending_proposals/index.html.erb | 5 ++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss index e01655f6d..6143c79d3 100644 --- a/app/assets/stylesheets/admin.scss +++ b/app/assets/stylesheets/admin.scss @@ -349,3 +349,9 @@ body.admin { margin-bottom: 0; } +body.admin { + + .investment-projects-list.medium-9 { + width: 100%; + } +} diff --git a/app/views/admin/shared/_spending_proposal_search.html.erb b/app/views/admin/shared/_spending_proposal_search.html.erb index d017d2716..c3e276ebe 100644 --- a/app/views/admin/shared/_spending_proposal_search.html.erb +++ b/app/views/admin/shared/_spending_proposal_search.html.erb @@ -3,8 +3,8 @@
    <%= text_field_tag :search, "", placeholder: t("admin.shared.spending_proposal_search.placeholder") %>
    -
    - <%= f.submit t("admin.shared.spending_proposal_search.button"), class: "button success" %> +
    + <%= f.submit t("admin.shared.spending_proposal_search.button"), class: "button success expanded" %>
    <% end %> \ No newline at end of file diff --git a/app/views/management/_account_info.html.erb b/app/views/management/_account_info.html.erb index d27f1524d..20a6bc24d 100644 --- a/app/views/management/_account_info.html.erb +++ b/app/views/management/_account_info.html.erb @@ -1,5 +1,5 @@ <% if managed_user.document_number.present? %> -
    +