From d5065fe02191fe4ec8b3f10fd685ffb4c917b1f3 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 14 Dec 2016 11:11:06 +0100 Subject: [PATCH 01/73] fixes typo: ammount -> amount --- Gemfile.lock | 3 --- app/models/budget.rb | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index fe1948752..47fae184e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -522,6 +522,3 @@ DEPENDENCIES unicorn (~> 5.1.0) web-console (= 3.3.0) whenever - -BUNDLED WITH - 1.13.6 diff --git a/app/models/budget.rb b/app/models/budget.rb index 28b37a896..3f9822964 100644 --- a/app/models/budget.rb +++ b/app/models/budget.rb @@ -59,7 +59,7 @@ class Budget < ActiveRecord::Base end def formatted_heading_price(heading) - formatted_ammount(heading_price(heading)) + formatted_amount(heading_price(heading)) end end From 4434a601d3c2fe996cd2fb7ed15a08a802720185 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 14 Dec 2016 11:49:16 +0100 Subject: [PATCH 02/73] Implements several helper methods for formatting amounts --- app/models/budget.rb | 4 ++++ app/models/budget/ballot.rb | 14 +++++++++++--- app/views/budgets/ballot/_ballot.html.erb | 4 ++-- app/views/budgets/ballot/_progress_bar.html.erb | 8 ++++---- app/views/budgets/investments/_sidebar.html.erb | 2 +- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/models/budget.rb b/app/models/budget.rb index 3f9822964..ae5bdf71e 100644 --- a/app/models/budget.rb +++ b/app/models/budget.rb @@ -61,5 +61,9 @@ class Budget < ActiveRecord::Base def formatted_heading_price(heading) formatted_amount(heading_price(heading)) end + + def formatted_heading_amount_spent(heading) + formatted_amount(amount_spent(heading)) + end end diff --git a/app/models/budget/ballot.rb b/app/models/budget/ballot.rb index fa7317dc8..79aa56ce7 100644 --- a/app/models/budget/ballot.rb +++ b/app/models/budget/ballot.rb @@ -16,12 +16,20 @@ class Budget investments.sum(:price).to_i end - def amount_spent(heading_id) - investments.by_heading(heading_id).sum(:price).to_i + def amount_spent(heading) + investments.by_heading(heading.id).sum(:price).to_i + end + + def formatted_amount_spent(heading) + budget.formatted_amount(amount_spent(heading)) end def amount_available(heading) - budget.heading_price(heading) - amount_spent(heading.id) + budget.heading_price(heading) - amount_spent(heading) + end + + def formatted_amount_available(heading) + budget.formatted_amount(amount_available(heading)) end def has_lines_in_group?(group) diff --git a/app/views/budgets/ballot/_ballot.html.erb b/app/views/budgets/ballot/_ballot.html.erb index 99fdcd5cd..7ed6851ae 100644 --- a/app/views/budgets/ballot/_ballot.html.erb +++ b/app/views/budgets/ballot/_ballot.html.erb @@ -28,7 +28,7 @@

<%= t("budgets.ballots.show.amount_spent") %> - <%= @budget.formatted_amount(@ballot.amount_spent(@ballot.heading_for_group(group).id))) %> + <%= @ballot.formatted_amount_spent(@ballot.heading_for_group(group)) %>

<% else %> @@ -47,7 +47,7 @@

<%= t("budgets.ballots.show.remaining", - amount_city: @budget.formatted_amount(@ballot.amount_available(@ballot.heading_for_group(group))))).html_safe %> + amount_city: @ballot.formatted_amount_available(@ballot.heading_for_group(group)).html_safe %>

<% end %> diff --git a/app/views/budgets/ballot/_progress_bar.html.erb b/app/views/budgets/ballot/_progress_bar.html.erb index 7c3190ba6..45c338b88 100644 --- a/app/views/budgets/ballot/_progress_bar.html.erb +++ b/app/views/budgets/ballot/_progress_bar.html.erb @@ -7,7 +7,7 @@
+ @ballot.amount_spent(@heading)) %>">
@@ -16,12 +16,12 @@ + @ballot.amount_spent(@heading)) %>">

- <%= @budget.format_amount(@ballot.amount_spent(@heading.id)) %> + <%= @ballot.formatted_amount_spent(@heading) %> <%= t("budget.progress_bar.available") %> - <%= @budget.format_amount(@ballot.amount_available(@heading)) %> + <%= @ballot.formatted_amount_available(@heading) %>

diff --git a/app/views/budgets/investments/_sidebar.html.erb b/app/views/budgets/investments/_sidebar.html.erb index baeb72bd6..5dc6c1aad 100644 --- a/app/views/budgets/investments/_sidebar.html.erb +++ b/app/views/budgets/investments/_sidebar.html.erb @@ -13,7 +13,7 @@ <%= t("budget.investments.index.sidebar.voted_html", count: @ballot.investments.by_heading(@heading.id).count, - amount_spent: @budget.format_amount(@ballot.amount_spent(@heading))) %> + amount_spent: @ballot.formatted_amount_spent(@heading)) %>

<% else %> From 8d60ea1d3c05a47237d10f9e586c7c3226c2638d Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 14 Dec 2016 13:39:54 +0100 Subject: [PATCH 03/73] Refactors apply_filters_and_search to inside investment model --- .../budgets/investments_controller.rb | 22 +------------------ .../budgets/investments_controller.rb | 15 +++++-------- app/models/budget/investment.rb | 7 ++++++ 3 files changed, 13 insertions(+), 31 deletions(-) diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index fafea9734..827e035c0 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -24,8 +24,8 @@ module Budgets respond_to :html, :js def index - @investments = apply_filters_and_search(@investments).send("sort_by_#{@current_order}").page(params[:page]).per(10).for_render set_budget_investment_votes(@investments) + @investments = @investments.apply_filters_and_search(params).send("sort_by_#{@current_order}").page(params[:page]).per(10).for_render end def new @@ -74,26 +74,6 @@ module Budgets params.require(:investment).permit(:title, :description, :external_url, :heading_id, :terms_of_service) end - def apply_filters_and_search(investments) - if params[:heading_id].blank? - @filter_heading_name = t('geozones.none') - else - @filter_heading = @budget.headings.find(params[:heading_id]) - @filter_heading_name = @filter_heading.name - end - - investments = investments.by_heading(params[:heading_id].presence || @budget.headings.first) - - if params[:unfeasible].present? - investments = investments.unfeasible - else - investments = @budget.balloting? ? investments.feasible.valuation_finished : investments.not_unfeasible - end - - investments = investments.search(params[:search]) if params[:search].present? - investments - end - def load_ballot @ballot = Budget::Ballot.where(user: current_user, budget: @budget).first_or_create end diff --git a/app/controllers/management/budgets/investments_controller.rb b/app/controllers/management/budgets/investments_controller.rb index e8c10ab50..8a058bbdc 100644 --- a/app/controllers/management/budgets/investments_controller.rb +++ b/app/controllers/management/budgets/investments_controller.rb @@ -4,10 +4,11 @@ class Management::Budgets::InvestmentsController < Management::BaseController load_resource :investment, through: :budget, class: 'Budget::Investment' before_action :only_verified_users, except: :print + before_action :load_heading, only: [:index, :show, :print] def index - @investments = apply_filters_and_search(@investments).page(params[:page]) set_investment_votes(@investments) + @investments = @investments.apply_filters_and_search(params).page(params[:page]) end def new @@ -35,8 +36,8 @@ class Management::Budgets::InvestmentsController < Management::BaseController end def print - @investments = apply_filters_and_search(@investments).order(cached_votes_up: :desc).for_render.limit(15) set_investment_votes(@investments) + @investments = @investments.apply_filters_and_search(params).order(cached_votes_up: :desc).for_render.limit(15) end private @@ -53,14 +54,8 @@ class Management::Budgets::InvestmentsController < Management::BaseController check_verified_user t("management.budget_investments.alert.unverified_user") end - def apply_filters_and_search(investments) - investments = params[:unfeasible].present? ? investments.unfeasible : investments.not_unfeasible - if params[:heading_id].present? - investments = investments.by_heading(params[:heading_id]) - @heading = Budget::Heading.find(params[:heading_id]) - end - investments = investments.search(params[:search]) if params[:search].present? - investments + def load_heading + @heading = @budget.headings.find(params[:heading_id]) if params[:heading_id].present? end end diff --git a/app/models/budget/investment.rb b/app/models/budget/investment.rb index aa86888fc..d16e8ef36 100644 --- a/app/models/budget/investment.rb +++ b/app/models/budget/investment.rb @@ -205,6 +205,13 @@ class Budget budget.formatted_amount(price) end + def self.apply_filters_and_search(params) + investments = params[:unfeasible].present? ? unfeasible : not_unfeasible + investments = investments.by_heading(params[:heading_id]) if params[:heading_id].present? + investments = investments.search(params[:search]) if params[:search].present? + investments + end + private def set_denormalized_ids From 2a258fc5583a6c41cb5f04a256653c7b9e75860c Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 14 Dec 2016 13:42:12 +0100 Subject: [PATCH 04/73] Refactors set_investment_votes --- app/controllers/application_controller.rb | 4 ---- .../budgets/investments_controller.rb | 17 ++++++++++++----- .../budgets/investments_controller.rb | 10 +++++----- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 62058141e..3e1b78d31 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -80,10 +80,6 @@ class ApplicationController < ActionController::Base @spending_proposal_votes = current_user ? current_user.spending_proposal_votes(spending_proposals) : {} end - def set_budget_investment_votes(budget_investments) - @budget_investment_votes = current_user ? current_user.budget_investment_votes(budget_investments) : {} - end - def set_comment_flags(comments) @comment_flags = current_user ? current_user.comment_flags(comments) : {} end diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index 827e035c0..803621cb8 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -24,8 +24,8 @@ module Budgets respond_to :html, :js def index - set_budget_investment_votes(@investments) @investments = @investments.apply_filters_and_search(params).send("sort_by_#{@current_order}").page(params[:page]).per(10).for_render + load_investment_votes(@investments) end def new @@ -35,15 +35,18 @@ module Budgets @commentable = @investment @comment_tree = CommentTree.new(@commentable, params[:page], @current_order) set_comment_flags(@comment_tree.comments) - set_budget_investment_votes(@investment) + load_investment_votes(@investment) end def create @investment.author = current_user if @investment.save - notice = t('flash.actions.create.budget_investment', activity: "#{t('layouts.header.my_activity_link')}") - redirect_to @investment, notice: notice, flash: { html_safe: true } + activity_link = view_context.link_to(t('layouts.header.my_activity_link'), + user_path(current_user, filter: :budget_investments)) + redirect_to @investment, + flash: { html_safe: true }, + notice: t('flash.actions.create.budget_investment', activity: activity_link) else render :new end @@ -56,11 +59,15 @@ module Budgets def vote @investment.register_selection(current_user) - set_budget_investment_votes(@investment) + load_investment_votes(@investment) end private + def load_investment_votes(investments) + @investment_votes = current_user ? current_user.budget_investment_votes(investments) : {} + end + def set_random_seed if params[:order] == 'random' || params[:order].blank? params[:random_seed] ||= rand(99)/100.0 diff --git a/app/controllers/management/budgets/investments_controller.rb b/app/controllers/management/budgets/investments_controller.rb index 8a058bbdc..d7d0789e4 100644 --- a/app/controllers/management/budgets/investments_controller.rb +++ b/app/controllers/management/budgets/investments_controller.rb @@ -7,8 +7,8 @@ class Management::Budgets::InvestmentsController < Management::BaseController before_action :load_heading, only: [:index, :show, :print] def index - set_investment_votes(@investments) @investments = @investments.apply_filters_and_search(params).page(params[:page]) + load_investment_votes(@investments) end def new @@ -27,22 +27,22 @@ class Management::Budgets::InvestmentsController < Management::BaseController end def show - set_investment_votes(@investment) + load_investment_votes(@investment) end def vote @investment.register_selection(managed_user) - set_investment_votes(@investment) + load_investment_votes(@investment) end def print - set_investment_votes(@investments) @investments = @investments.apply_filters_and_search(params).order(cached_votes_up: :desc).for_render.limit(15) + load_investment_votes(@investments) end private - def set_investment_votes(investments) + def load_investment_votes(investments) @investment_votes = managed_user ? managed_user.budget_investment_votes(investments) : {} end From 7f94cc1f3dd82ddc156fad9d95d38ccc582a0671 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 14 Dec 2016 13:42:26 +0100 Subject: [PATCH 05/73] Removes unneeded parameter from helper call --- app/helpers/budgets_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/budgets_helper.rb b/app/helpers/budgets_helper.rb index 6c1471c90..aa6684b2d 100644 --- a/app/helpers/budgets_helper.rb +++ b/app/helpers/budgets_helper.rb @@ -17,7 +17,7 @@ module BudgetsHelper when "management::budgets" management_budget_investment_path(investment.budget, investment, options) else - budget_investment_path(investment.budget, investment, options.merge(budget_id: investment.budget_id)) + budget_investment_path(investment.budget, investment, options) end end From dc3ceb25cc27b1308aeaacfafe6f7cb4c07a25b3 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 14 Dec 2016 13:42:55 +0100 Subject: [PATCH 06/73] Replaces @filter_heading_name by @heading.name in index --- app/views/budgets/investments/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/budgets/investments/index.html.erb b/app/views/budgets/investments/index.html.erb index 1709f3fd8..48ba92c32 100644 --- a/app/views/budgets/investments/index.html.erb +++ b/app/views/budgets/investments/index.html.erb @@ -24,7 +24,7 @@

<% end %> - <%= content_tag(:h2, t("budget.investments.index.by_heading", heading: @filter_heading_name)) if @filter_heading_name.present? %> + <%= content_tag(:h2, t("budget.investments.index.by_heading", heading: @heading.name)) if @heading.present? %> <% if params[:search].present? %>

<%= page_entries_info @investments %> From 6dd71cb5082b28198ab7edb6bf4b4ad5ce996d08 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 14 Dec 2016 13:43:59 +0100 Subject: [PATCH 07/73] Changes the parameters used for index and show partials --- app/views/budgets/investments/index.html.erb | 10 +++++++++- app/views/budgets/investments/show.html.erb | 7 +++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/views/budgets/investments/index.html.erb b/app/views/budgets/investments/index.html.erb index 48ba92c32..622921eab 100644 --- a/app/views/budgets/investments/index.html.erb +++ b/app/views/budgets/investments/index.html.erb @@ -35,7 +35,15 @@ <%= render('shared/order_links', i18n_namespace: "budget.investments.index") unless params[:unfeasible].present? %> - <%= render partial: 'investment', collection: @investments %> + <% @investments.each do |investment| %> + <%= render partial: '/budgets/investments/investment', locals: { + investment: investment, + investment_ids: @investment_ids, + investment_votes: @investment_votes, + investment_ballots: @investment_ballots + } %> + <% end %> + <%= paginate @investments %> diff --git a/app/views/budgets/investments/show.html.erb b/app/views/budgets/investments/show.html.erb index 735be8964..6d4b735e1 100644 --- a/app/views/budgets/investments/show.html.erb +++ b/app/views/budgets/investments/show.html.erb @@ -1,5 +1,8 @@ -<% provide :title do %><%= investment.title %><% end %> +<% provide :title do %><%= @investment.title %><% end %> -<%= render partial: '/budgets/investments/investment_show', locals: { investment: @investment, investment_votes: @investment_votes } %> +<%= render partial: '/budgets/investments/investment_show', locals: { + investment: @investment, + investment_votes: @investment_votes +} %> <%= render partial: '/comments/comment_tree', locals: { comment_tree: @comment_tree, comment_flags: @comment_flags } %> From 355e2866081df93d1eaac9390434a81846ff9e6d Mon Sep 17 00:00:00 2001 From: kikito Date: Thu, 15 Dec 2016 18:17:52 +0100 Subject: [PATCH 08/73] De-normalizes references in budgetballotline automatically --- app/models/budget/ballot/line.rb | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/models/budget/ballot/line.rb b/app/models/budget/ballot/line.rb index 31cdcd230..83dd240b8 100644 --- a/app/models/budget/ballot/line.rb +++ b/app/models/budget/ballot/line.rb @@ -2,15 +2,18 @@ class Budget class Ballot class Line < ActiveRecord::Base belongs_to :ballot - belongs_to :budget - belongs_to :group - belongs_to :heading belongs_to :investment + belongs_to :heading + belongs_to :group + belongs_to :budget + + validates :ballot_id, :investment_id, :heading_id, :group_id, :budget_id, presence: true validate :insufficient_funds #needed? validate :different_geozone, :if => :district_proposal? validate :unfeasible - #needed? validates :ballot_id, :budget_id, :group_id, :heading_id, :investment_id, presence: true + + before_validation :set_denormalized_ids def insufficient_funds errors.add(:money, "insufficient funds") if ballot.amount_available(investment.heading) < investment.price.to_i @@ -27,6 +30,14 @@ class Budget def heading_proposal? investment.heading_id.present? end + + private + + def set_denormalized_ids + self.heading_id ||= self.investment.heading_id + self.group_id ||= self.investment.group_id + self.budget_id ||= self.investment.budget_id + end end end end From 366a3e7552acb23c49f056b632e6650fc6a73ca2 Mon Sep 17 00:00:00 2001 From: kikito Date: Thu, 15 Dec 2016 18:18:31 +0100 Subject: [PATCH 09/73] simplifies factories now that we have denormalization in investment and ballot lines --- spec/factories.rb | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/spec/factories.rb b/spec/factories.rb index b5e800d65..5126a8643 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -227,9 +227,7 @@ FactoryGirl.define do factory :budget_investment, class: 'Budget::Investment' do sequence(:title) { |n| "Budget Investment #{n} title" } - budget - group { create :budget_group, budget: budget } - heading { create :budget_heading, group: group } + association :heading, factory: :budget_heading association :author, factory: :user description 'Spend money on this' price 10 @@ -261,11 +259,8 @@ FactoryGirl.define do end factory :budget_ballot_line, class: 'Budget::Ballot::Line' do - budget - ballot { create :budget_ballot, budget: budget } - group { create :budget_group, budget: budget } - heading { create :budget_heading, group: group } - investment { create :budget_investment, :feasible, heading: heading } + association :ballot, factory: :budget_ballot + association :investment, factory: :budget_investment end factory :vote do From 411cd674ff159f0a2647838ef107d4a926c93233 Mon Sep 17 00:00:00 2001 From: kikito Date: Thu, 15 Dec 2016 18:18:49 +0100 Subject: [PATCH 10/73] Activates and refactors budget/ballot/line_spec --- spec/models/budget/ballot/line_spec.rb | 90 ++++++-------------------- 1 file changed, 18 insertions(+), 72 deletions(-) diff --git a/spec/models/budget/ballot/line_spec.rb b/spec/models/budget/ballot/line_spec.rb index 1706cc149..885998eb1 100644 --- a/spec/models/budget/ballot/line_spec.rb +++ b/spec/models/budget/ballot/line_spec.rb @@ -1,104 +1,50 @@ require 'rails_helper' -xdescribe "Budget::Ballot::Line" do - - let(:ballot_line) { build(:budget_ballot_line) } +describe "Budget::Ballot::Line" do describe 'Validations' do + let(:budget){ create(:budget) } + let(:group){ create(:budget_group, budget: budget) } + let(:heading){ create(:budget_heading, group: group, price: 10000000) } + let(:investment){ create(:budget_investment, :feasible, price: 5000000, heading: heading) } + let(:ballot) { create(:budget_ballot, budget: budget) } + let(:ballot_line) { build(:budget_ballot_line, ballot: ballot, investment: investment) } - it "should be valid" do + it "should be valid and automatically denormallyze budget, group and heading when validated" do expect(ballot_line).to be_valid - end - - it "should be invalid if missing id from ballot|budget|group|heading|investment" do - budget = create(:budget) - group = create(:budget_group, budget: budget) - heading = create(:budget_heading, group: group, price: 10000000) - investment = create(:budget_investment, :feasible, price: 5000000, heading: heading) - ballot = create(:budget_ballot, budget: budget) - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: budget, group: group, heading: heading, investment: investment) - expect(ballot_line).to be_valid - - ballot_line = build(:budget_ballot_line, ballot: nil, budget: budget, group: group, heading: heading, investment: investment) - expect(ballot_line).to_not be_valid - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: nil, group: group, heading: heading, investment: investment) - expect(ballot_line).to_not be_valid - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: budget, group: nil, heading: heading, investment: investment) - expect(ballot_line).to_not be_valid - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: budget, group: group, heading: nil, investment: investment) - expect(ballot_line).to_not be_valid - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: budget, group: group, heading: heading, investment: nil) - expect(ballot_line).to_not be_valid + expect(ballot_line.budget).to eq(budget) + expect(ballot_line.group).to eq(group) + expect(ballot_line.heading).to eq(heading) end describe 'Money' do it "should not be valid if insufficient funds" do - budget = create(:budget) - group = create(:budget_group, budget: budget) - heading = create(:budget_heading, group: group, price: 10000000) - investment = create(:budget_investment, :feasible, price: heading.price + 1, heading: heading) - ballot = create(:budget_ballot, budget: budget) - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: budget, group: group, heading: heading, investment: investment) - + investment.update(price: heading.price + 1) expect(ballot_line).to_not be_valid end it "should be valid if sufficient funds" do - budget = create(:budget) - group = create(:budget_group, budget: budget) - heading = create(:budget_heading, group: group, price: 10000000) - investment = create(:budget_investment, :feasible, price: heading.price - 1, heading: heading, ) - ballot = create(:budget_ballot, budget: budget) - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: budget, group: group, heading: heading, investment: investment) - + investment.update(price: heading.price - 1) expect(ballot_line).to be_valid end end describe 'Feasibility' do it "should not be valid if investment is unfeasible" do - budget = create(:budget) - group = create(:budget_group, budget: budget) - heading = create(:budget_heading, group: group, price: 10000000) - investment = create(:budget_investment, :feasible, price: 20000, feasibility: "unfeasible") - ballot = create(:budget_ballot, budget: budget) - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: budget, group: group, heading: heading, investment: investment) - + investment.update(feasibility: "unfeasible") expect(ballot_line).to_not be_valid end it "should not be valid if investment feasibility is undecided" do - budget = create(:budget) - group = create(:budget_group, budget: budget) - heading = create(:budget_heading, group: group, price: 10000000) - investment = create(:budget_investment, price: 20000, feasibility: "undecided") - ballot = create(:budget_ballot, budget: budget) - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: budget, group: group, heading: heading, investment: investment) - + investment.update(feasibility: "undecided", price: 20000) expect(ballot_line).to_not be_valid end - xit "should be valid if investment is feasible" do - budget = create(:budget) - group = create(:budget_group, budget: budget) - heading = create(:budget_heading, group: group, price: 10000000) - investment = create(:budget_investment, price: 20000, feasibility: "feasible") - ballot = create(:budget_ballot, budget: budget) - - ballot_line = build(:budget_ballot_line, ballot: ballot, budget: budget, group: group, heading: heading, investment: investment) - + it "should be valid if investment is feasible" do + investment.update(feasibility: "feasible", price: 20000) expect(ballot_line).to be_valid end end end -end \ No newline at end of file +end From d98670216130234a26207887c8c71231bde32083 Mon Sep 17 00:00:00 2001 From: kikito Date: Thu, 15 Dec 2016 18:19:55 +0100 Subject: [PATCH 11/73] Activates and fixes specs in budget/ballot_spec --- spec/models/budget/ballot_spec.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/models/budget/ballot_spec.rb b/spec/models/budget/ballot_spec.rb index d9e394e54..97fa966fc 100644 --- a/spec/models/budget/ballot_spec.rb +++ b/spec/models/budget/ballot_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Budget::Ballot do describe "#amount_spent" do - xit "returns the total amount spent in investments" do + it "returns the total amount spent in investments" do budget = create(:budget) group1 = create(:budget_group, budget: budget) group2 = create(:budget_group, budget: budget) @@ -22,7 +22,7 @@ describe Budget::Ballot do expect(ballot.total_amount_spent).to eq 30000 end - xit "returns the amount spent on all investments assigned to a specific heading" do + it "returns the amount spent on all investments assigned to a specific heading" do heading = create(:budget_heading) budget = heading.group.budget inv1 = create(:budget_investment, :feasible, price: 10000, heading: heading) @@ -33,16 +33,16 @@ describe Budget::Ballot do ballot.add_investment inv1 ballot.add_investment inv2 - expect(ballot.amount_spent(heading.id)).to eq 10000 + expect(ballot.amount_spent(heading)).to eq 10000 ballot.add_investment inv3 - expect(ballot.amount_spent(heading.id)).to eq 50000 + expect(ballot.amount_spent(heading)).to eq 50000 end end describe "#amount_available" do - xit "returns how much is left after taking some investments" do + it "returns how much is left after taking some investments" do budget = create(:budget) group = create(:budget_group, budget: budget) heading1 = create(:budget_heading, group: group, price: 1000) From 2a9957cea075ca95ade1681b7dec4bb4480be108 Mon Sep 17 00:00:00 2001 From: kikito Date: Thu, 15 Dec 2016 19:36:13 +0100 Subject: [PATCH 12/73] Extracts budget investment form to partial --- app/views/budgets/investments/_form.html.erb | 25 +++++----- app/views/budgets/investments/new.html.erb | 8 ++++ .../budgets/investments/new.html.erb | 46 +------------------ 3 files changed, 20 insertions(+), 59 deletions(-) create mode 100644 app/views/budgets/investments/new.html.erb diff --git a/app/views/budgets/investments/_form.html.erb b/app/views/budgets/investments/_form.html.erb index 37de94a2c..ae5a3e536 100644 --- a/app/views/budgets/investments/_form.html.erb +++ b/app/views/budgets/investments/_form.html.erb @@ -1,7 +1,12 @@ -<%= form_for(@investment, url: form_url) do |f| %> +<%= form_for(@investment, url: form_url, method: :post) do |f| %> <%= render 'shared/errors', resource: @investment %>
+
+ <%= f.label :heading_id, t("budget.investments.form.heading") %> + <%= f.select :heading_id, budget_heading_select_options(@budget), {include_blank: t("budget.headings.none"), label: false} %> +
+
<%= f.label :title, t("budget.investments.form.title") %> <%= f.text_field :title, maxlength: SpendingProposal.title_max_length, placeholder: t("budget.investments.form.title"), label: false %> @@ -19,18 +24,9 @@ <%= f.text_field :external_url, placeholder: t("budget.investments.form.external_url"), label: false %>
-
- <%= f.label :heading_id, t("budget.investments.form.heading") %> - <%= f.select :heading_id, budget_heading_select_options(@budget), {include_blank: t("budget.headings.none"), label: false} %> -
+ <% unless current_user.manager? %> -
- <%= f.label :association_name, t("budget.investments.form.association_name_label") %> - <%= f.text_field :association_name, placeholder: t("budget.investments.form.association_name"), label: false %> -
- -
- <% if @investment.new_record? %> +
<%= f.label :terms_of_service do %> <%= f.check_box :terms_of_service, title: t('form.accept_terms_title'), label: false %> @@ -39,8 +35,9 @@ conditions: link_to(t("form.conditions"), "/conditions", target: "blank")).html_safe %> <% end %> - <% end %> -
+
+ + <% end %>
<%= f.submit(class: "button", value: t("budget.investments.form.submit_buttons.#{action_name}")) %> diff --git a/app/views/budgets/investments/new.html.erb b/app/views/budgets/investments/new.html.erb new file mode 100644 index 000000000..7695afdec --- /dev/null +++ b/app/views/budgets/investments/new.html.erb @@ -0,0 +1,8 @@ +
+ +
+

<%= t("management.budget_investments.create") %>

+ + <%= render '/budgets/investments/form', form_url: budget_investments_path(@budget) %> +
+
diff --git a/app/views/management/budgets/investments/new.html.erb b/app/views/management/budgets/investments/new.html.erb index bf8b83f90..20e27b9cc 100644 --- a/app/views/management/budgets/investments/new.html.erb +++ b/app/views/management/budgets/investments/new.html.erb @@ -7,50 +7,6 @@

<%= t("management.budget_investments.create") %>

- <%= form_for(@investment, url: management_budget_investments_path(@budget), method: :post) do |f| %> - <%= render 'shared/errors', resource: @investment %> - -
-
- <%= f.label :heading_id, t("budget.investments.form.heading") %> - <%= f.select :heading_id, budget_heading_select_options(@budget), {include_blank: t("budget.headings.none"), label: false} %> -
- -
- <%= f.label :title, t("budget.investments.form.title") %> - <%= f.text_field :title, maxlength: SpendingProposal.title_max_length, placeholder: t("budget.investments.form.title"), label: false %> -
- - <%= f.invisible_captcha :subtitle %> - -
- <%= f.label :description, t("budget.investments.form.description") %> - <%= f.cktext_area :description, maxlength: SpendingProposal.description_max_length, ckeditor: { language: I18n.locale }, label: false %> -
- -
- <%= f.label :external_url, t("budget.investments.form.external_url") %> - <%= f.text_field :external_url, placeholder: t("budget.investments.form.external_url"), label: false %> -
- - - -
- <%= f.label :terms_of_service do %> - <%= f.check_box :terms_of_service, title: t('form.accept_terms_title'), label: false %> - - <%= t("form.accept_terms", - policy: link_to(t("form.policy"), "/privacy", target: "blank"), - conditions: link_to(t("form.conditions"), "/conditions", target: "blank")).html_safe %> - - <% end %> -
- -
- <%= f.submit(class: "button", value: t("budget.investments.form.submit_buttons.#{action_name}")) %> -
-
- <% end %> - + <%= render '/budgets/investments/form', form_url: management_budget_investments_path(@budget) %>
From 316c0cff624af552eaef1288a131c0cc2cf09095 Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 16 Dec 2016 17:59:03 +0100 Subject: [PATCH 13/73] Adds missing method to budget --- app/models/budget.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/models/budget.rb b/app/models/budget.rb index ae5bdf71e..4d6f1341f 100644 --- a/app/models/budget.rb +++ b/app/models/budget.rb @@ -43,6 +43,10 @@ class Budget < ActiveRecord::Base phase == "finished" end + def current? + !finished? + end + def heading_price(heading) heading_ids.include?(heading.id) ? heading.price : -1 end From 19e19e5c43c266dae4ec33b908e3b99316c9bcd4 Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 16 Dec 2016 18:00:18 +0100 Subject: [PATCH 14/73] Fixes error when trying to denormalize a model whose dependent field is nil --- app/models/budget/ballot/line.rb | 6 +++--- app/models/budget/investment.rb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/models/budget/ballot/line.rb b/app/models/budget/ballot/line.rb index 83dd240b8..85434ad2d 100644 --- a/app/models/budget/ballot/line.rb +++ b/app/models/budget/ballot/line.rb @@ -34,9 +34,9 @@ class Budget private def set_denormalized_ids - self.heading_id ||= self.investment.heading_id - self.group_id ||= self.investment.group_id - self.budget_id ||= self.investment.budget_id + self.heading_id ||= self.investment.try(:heading_id) + self.group_id ||= self.investment.try(:group_id) + self.budget_id ||= self.investment.try(:budget_id) end end end diff --git a/app/models/budget/investment.rb b/app/models/budget/investment.rb index d16e8ef36..23586ec3a 100644 --- a/app/models/budget/investment.rb +++ b/app/models/budget/investment.rb @@ -215,8 +215,8 @@ class Budget private def set_denormalized_ids - self.group_id ||= self.heading.group_id - self.budget_id ||= self.heading.group.budget_id + self.group_id ||= self.heading.try(:group_id) + self.budget_id ||= self.heading.try(:group).try(:budget_id) end end end From e0c0b187573a3a37e487afc35f7117933365422e Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 16 Dec 2016 18:01:20 +0100 Subject: [PATCH 15/73] Sets partial locals correctly in use and management views --- app/views/budgets/investments/_ballot.html.erb | 6 +++--- app/views/budgets/investments/_investment.html.erb | 2 +- app/views/budgets/investments/_investment_show.html.erb | 6 +++++- app/views/budgets/investments/index.html.erb | 2 +- app/views/budgets/investments/show.html.erb | 4 +++- app/views/management/budgets/investments/index.html.erb | 2 +- app/views/management/budgets/investments/print.html.erb | 2 +- 7 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/views/budgets/investments/_ballot.html.erb b/app/views/budgets/investments/_ballot.html.erb index 32a788756..bbac474af 100644 --- a/app/views/budgets/investments/_ballot.html.erb +++ b/app/views/budgets/investments/_ballot.html.erb @@ -1,6 +1,6 @@ -<% reason = investment.reason_for_not_being_ballotable_by(current_user, investment_ballot) %> +<% reason = investment.reason_for_not_being_ballotable_by(current_user, ballot) %>
- <% if investment_ballot.has_investment?(investment) %> + <% if ballot.has_investment?(investment) %>
- <% if reason.present? && !investment_ballot.has_investment?(investment) %> + <% if reason.present? && !ballot.has_investment?(investment) %> diff --git a/app/views/budgets/investments/_investment_show.html.erb b/app/views/budgets/investments/_investment_show.html.erb index d5d371290..96fc74681 100644 --- a/app/views/budgets/investments/_investment_show.html.erb +++ b/app/views/budgets/investments/_investment_show.html.erb @@ -65,7 +65,11 @@
<% elsif investment.should_show_ballots? %>
- <%= render 'ballot', investment: investment %> + <%= render partial: 'ballot', locals: { + investment: investment, + investment_ids: investment_ids, + ballot: ballot, + } %>
<% end %>
diff --git a/app/views/budgets/investments/index.html.erb b/app/views/budgets/investments/index.html.erb index 622921eab..967bbb2e3 100644 --- a/app/views/budgets/investments/index.html.erb +++ b/app/views/budgets/investments/index.html.erb @@ -40,7 +40,7 @@ investment: investment, investment_ids: @investment_ids, investment_votes: @investment_votes, - investment_ballots: @investment_ballots + ballot: @ballot } %> <% end %> diff --git a/app/views/budgets/investments/show.html.erb b/app/views/budgets/investments/show.html.erb index 6d4b735e1..be33605b0 100644 --- a/app/views/budgets/investments/show.html.erb +++ b/app/views/budgets/investments/show.html.erb @@ -2,7 +2,9 @@ <%= render partial: '/budgets/investments/investment_show', locals: { investment: @investment, - investment_votes: @investment_votes + investment_ids: @investment_ids, + investment_votes: @investment_votes, + ballot: @ballot } %> <%= render partial: '/comments/comment_tree', locals: { comment_tree: @comment_tree, comment_flags: @comment_flags } %> diff --git a/app/views/management/budgets/investments/index.html.erb b/app/views/management/budgets/investments/index.html.erb index ad48c0578..41edb7bcd 100644 --- a/app/views/management/budgets/investments/index.html.erb +++ b/app/views/management/budgets/investments/index.html.erb @@ -22,7 +22,7 @@ investment: investment, investment_ids: @investment_ids, investment_votes: @investment_votes, - investment_ballots: @investment_ballots + ballot: @ballot } %> <% end %> diff --git a/app/views/management/budgets/investments/print.html.erb b/app/views/management/budgets/investments/print.html.erb index d2390879b..6bdd84713 100644 --- a/app/views/management/budgets/investments/print.html.erb +++ b/app/views/management/budgets/investments/print.html.erb @@ -27,7 +27,7 @@ investment: investment, investment_ids: @investment_ids, investment_votes: @investment_votes, - investment_ballots: @investment_ballots + ballot: @ballot } %> <% end %> From 3aeb9a1307dd014520cf4f15e565cce14a82591e Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 16 Dec 2016 18:02:06 +0100 Subject: [PATCH 16/73] Changes investment form so that nil heading means nil, not all headings --- app/views/budgets/investments/_form.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/budgets/investments/_form.html.erb b/app/views/budgets/investments/_form.html.erb index ae5a3e536..93461a873 100644 --- a/app/views/budgets/investments/_form.html.erb +++ b/app/views/budgets/investments/_form.html.erb @@ -4,7 +4,7 @@
<%= f.label :heading_id, t("budget.investments.form.heading") %> - <%= f.select :heading_id, budget_heading_select_options(@budget), {include_blank: t("budget.headings.none"), label: false} %> + <%= f.select :heading_id, budget_heading_select_options(@budget), {include_blank: true, label: false} %>
From a52ea70c3d71ba4075c641f9928a6079484c82c7 Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 16 Dec 2016 18:02:43 +0100 Subject: [PATCH 17/73] Fixes honeypot-related issues in specs --- app/controllers/budgets/investments_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index 803621cb8..38d8c7959 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -19,7 +19,7 @@ module Budgets has_orders %w{most_voted newest oldest}, only: :show has_orders ->(c){ c.instance_variable_get(:@budget).balloting? ? %w{random price} : %w{random confidence_score} }, only: :index - invisible_captcha only: [:create, :update], honeypot: :subtitle + invisible_captcha only: [:create, :update], honeypot: :subtitle, scope: :budget_investment respond_to :html, :js From 3bada69dd0958713cd51359b7f454148602f53d2 Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 16 Dec 2016 18:03:14 +0100 Subject: [PATCH 18/73] sets up the @investments variable n investments_controller --- app/controllers/budgets/investments_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index 38d8c7959..c5d410b1d 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -25,6 +25,7 @@ module Budgets def index @investments = @investments.apply_filters_and_search(params).send("sort_by_#{@current_order}").page(params[:page]).per(10).for_render + @investment_ids = @investments.pluck(:id) load_investment_votes(@investments) end @@ -36,6 +37,7 @@ module Budgets @comment_tree = CommentTree.new(@commentable, params[:page], @current_order) set_comment_flags(@comment_tree.comments) load_investment_votes(@investment) + @investment_ids = [@investment.id] end def create From ff13dee918b1d93e969d430b689100abced88ab7 Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 16 Dec 2016 18:03:36 +0100 Subject: [PATCH 19/73] Fixes incorrect path & params in bi controller --- app/controllers/budgets/investments_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index c5d410b1d..6ad781da6 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -46,7 +46,7 @@ module Budgets if @investment.save activity_link = view_context.link_to(t('layouts.header.my_activity_link'), user_path(current_user, filter: :budget_investments)) - redirect_to @investment, + redirect_to budget_investment_path(@budget, @investment), flash: { html_safe: true }, notice: t('flash.actions.create.budget_investment', activity: activity_link) else @@ -80,7 +80,7 @@ module Budgets end def investment_params - params.require(:investment).permit(:title, :description, :external_url, :heading_id, :terms_of_service) + params.require(:budget_investment).permit(:title, :description, :external_url, :heading_id, :terms_of_service) end def load_ballot From 9fe8358a1421324c547a594b2d78343125b50120 Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 16 Dec 2016 18:28:24 +0100 Subject: [PATCH 20/73] Simplifies spec using automatic denormalization --- spec/features/budgets/investments_spec.rb | 49 ++++++++++++----------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/spec/features/budgets/investments_spec.rb b/spec/features/budgets/investments_spec.rb index 6639c82fc..daa31f2a6 100644 --- a/spec/features/budgets/investments_spec.rb +++ b/spec/features/budgets/investments_spec.rb @@ -3,13 +3,13 @@ require 'rails_helper' feature 'Budget Investments' do let(:author) { create(:user, :level_two, username: 'Isabel') } - let(:budget) { create(:budget) } - let(:group) { create(:budget_group, budget: budget) } - let(:heading) { create(:budget_heading, group: group) } + let(:budget) { create(:budget, name: "Big Budget") } + let(:group) { create(:budget_group, name: "Health", budget: budget) } + let!(:heading) { create(:budget_heading, name: "More hospitals", group: group) } scenario 'Index' do - investments = [create(:budget_investment, budget: budget, group: group, heading: heading), create(:budget_investment, budget: budget, group: group, heading: heading), create(:budget_investment, :feasible, budget: budget, group: group, heading: heading)] - unfeasible_investment = create(:budget_investment, :unfeasible, budget: budget, group: group, heading: heading) + investments = [create(:budget_investment, heading: heading), create(:budget_investment, heading: heading), create(:budget_investment, :feasible, heading: heading)] + unfeasible_investment = create(:budget_investment, :unfeasible, heading: heading) visit budget_investments_path(budget, heading_id: heading.id) @@ -25,9 +25,9 @@ feature 'Budget Investments' do context("Search") do scenario 'Search by text' do - investment1 = create(:budget_investment, budget: budget, group: group, heading: heading, title: "Get Schwifty") - investment2 = create(:budget_investment, budget: budget, group: group, heading: heading, title: "Schwifty Hello") - investment3 = create(:budget_investment, budget: budget, group: group, heading: heading, title: "Do not show me") + investment1 = create(:budget_investment, heading: heading, title: "Get Schwifty") + investment2 = create(:budget_investment, heading: heading, title: "Schwifty Hello") + investment3 = create(:budget_investment, heading: heading, title: "Do not show me") visit budget_investments_path(budget, heading_id: heading.id) @@ -48,10 +48,10 @@ feature 'Budget Investments' do context("Filters") do scenario 'by unfeasibility' do - investment1 = create(:budget_investment, :unfeasible, budget: budget, group: group, heading: heading, valuation_finished: true) - investment2 = create(:budget_investment, :feasible, budget: budget, group: group, heading: heading) - investment3 = create(:budget_investment, budget: budget, group: group, heading: heading) - investment4 = create(:budget_investment, :feasible, budget: budget, group: group, heading: heading) + investment1 = create(:budget_investment, :unfeasible, heading: heading, valuation_finished: true) + investment2 = create(:budget_investment, :feasible, heading: heading) + investment3 = create(:budget_investment, heading: heading) + investment4 = create(:budget_investment, :feasible, heading: heading) visit budget_investments_path(budget_id: budget.id, heading_id: heading.id, unfeasible: 1) @@ -99,7 +99,7 @@ feature 'Budget Investments' do scenario 'Random order maintained with pagination', :js do per_page = Kaminari.config.default_per_page - (per_page + 2).times { create(:budget_investment, budget: budget, group: group, heading: heading) } + (per_page + 2).times { create(:budget_investment, heading: heading) } visit budget_investments_path(budget, heading_id: heading.id) @@ -116,9 +116,9 @@ feature 'Budget Investments' do end scenario 'Proposals are ordered by confidence_score', :js do - create(:budget_investment, budget: budget, group: group, heading: heading, title: 'Best proposal').update_column(:confidence_score, 10) - create(:budget_investment, budget: budget, group: group, heading: heading, title: 'Worst proposal').update_column(:confidence_score, 2) - create(:budget_investment, budget: budget, group: group, heading: heading, title: 'Medium proposal').update_column(:confidence_score, 5) + create(:budget_investment, heading: heading, title: 'Best proposal').update_column(:confidence_score, 10) + create(:budget_investment, heading: heading, title: 'Worst proposal').update_column(:confidence_score, 2) + create(:budget_investment, heading: heading, title: 'Medium proposal').update_column(:confidence_score, 5) visit budget_investments_path(budget, heading_id: heading.id) click_link 'highest rated' @@ -207,7 +207,7 @@ feature 'Budget Investments' do user = create(:user) login_as(user) - investment = create(:budget_investment, budget: budget, group: group, heading: heading) + investment = create(:budget_investment, heading: heading) visit budget_investment_path(budget_id: budget.id, id: investment.id) @@ -262,7 +262,7 @@ feature 'Budget Investments' do xscenario "Admin cannot destroy spending proposals" do admin = create(:administrator) user = create(:user, :level_two) - investment = create(:budget_investment, budget: budget, group: group, heading: heading, author: user) + investment = create(:budget_investment, heading: heading, author: user) login_as(admin.user) visit user_path(user) @@ -282,8 +282,8 @@ feature 'Budget Investments' do xscenario "Index" do user = create(:user, :level_two) - sp1 = create(:budget_investment, :feasible, :finished, budget: budget, group: group, heading: heading, price: 10000) - sp2 = create(:budget_investment, :feasible, :finished, budget: budget, group: group, heading: heading, price: 20000) + sp1 = create(:budget_investment, :feasible, :finished, heading: heading, price: 10000) + sp2 = create(:budget_investment, :feasible, :finished, heading: heading, price: 20000) login_as(user) visit root_path @@ -304,9 +304,10 @@ feature 'Budget Investments' do end xscenario 'Order by cost (only in phase3)' do - create(:budget_investment, :feasible, :finished, budget: budget, group: group, heading: heading, title: 'Build a nice house', price: 1000).update_column(:confidence_score, 10) - create(:budget_investment, :feasible, :finished, budget: budget, group: group, heading: heading, title: 'Build an ugly house', price: 1000).update_column(:confidence_score, 5) - create(:budget_investment, :feasible, :finished, budget: budget, group: group, heading: heading, title: 'Build a skyscraper', price: 20000) + scenario 'Order by cost (only in phase3)' do + create(:budget_investment, :feasible, :finished, heading: heading, title: 'Build a nice house', price: 1000).update_column(:confidence_score, 10) + create(:budget_investment, :feasible, :finished, heading: heading, title: 'Build an ugly house', price: 1000).update_column(:confidence_score, 5) + create(:budget_investment, :feasible, :finished, heading: heading, title: 'Build a skyscraper', price: 20000) visit budget_investments_path(budget, heading_id: heading.id) @@ -324,7 +325,7 @@ feature 'Budget Investments' do scenario "Show" do user = create(:user, :level_two) - sp1 = create(:budget_investment, :feasible, :finished, budget: budget, group: group, heading: heading, price: 10000) + sp1 = create(:budget_investment, :feasible, :finished, heading: heading, price: 10000) login_as(user) visit budget_investments_path(budget, heading_id: heading.id) From bb28fe5107e3d31e7861930a66ab539b6f8ee177 Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 16 Dec 2016 19:12:31 +0100 Subject: [PATCH 21/73] Fixes issue when voting --- app/views/budgets/investments/vote.js.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/budgets/investments/vote.js.erb b/app/views/budgets/investments/vote.js.erb index 848b432e0..56248ba68 100644 --- a/app/views/budgets/investments/vote.js.erb +++ b/app/views/budgets/investments/vote.js.erb @@ -1,4 +1,4 @@ $("#<%= dom_id(@investment) %>_votes").html('<%= j render("/budgets/investments/votes", investment: @investment, - investment_votes: @budget_investment_votes, + investment_votes: @investment_votes, vote_url: namespaced_budget_investment_vote_path(@investment, value: 'yes')) %>'); From 36ffa1922e0b61fc6fb23110daad4d8b054357dd Mon Sep 17 00:00:00 2001 From: kikito Date: Mon, 19 Dec 2016 19:03:18 +0100 Subject: [PATCH 22/73] Adds supports.js.coffee --- app/assets/javascripts/application.js | 2 ++ app/assets/javascripts/supports.js.coffee | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 app/assets/javascripts/supports.js.coffee diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 2eb3a93a6..7a6b87095 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -36,6 +36,7 @@ //= require tags //= require users //= require votes +//= require supports //= require annotatable //= require advanced_search //= require registration_form @@ -53,6 +54,7 @@ var initialize_modules = function() { App.Comments.initialize(); App.Users.initialize(); App.Votes.initialize(); + App.Supports.initialize(); App.Tags.initialize(); App.Dropdown.initialize(); App.LocationChanger.initialize(); diff --git a/app/assets/javascripts/supports.js.coffee b/app/assets/javascripts/supports.js.coffee new file mode 100644 index 000000000..78f7b258c --- /dev/null +++ b/app/assets/javascripts/supports.js.coffee @@ -0,0 +1,12 @@ +App.Supports = + + initialize: -> + $(document).on { + 'mouseenter focus': -> + $(this).find(".js-supports-not-allowed").show(); + $(this).find(".js-supports-allowed").hide(); + mouseleave: -> + $(this).find(".js-supports-not-allowed").hide(); + $(this).find(".js-supports-allowed").show(); + }, ".js-supports" + false From be2543cf61fde8bafddc1a483dfb1f64468b268f Mon Sep 17 00:00:00 2001 From: kikito Date: Mon, 19 Dec 2016 19:03:46 +0100 Subject: [PATCH 23/73] Uncomments ability section --- app/models/abilities/common.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/abilities/common.rb b/app/models/abilities/common.rb index fddf4918b..e324540d2 100644 --- a/app/models/abilities/common.rb +++ b/app/models/abilities/common.rb @@ -48,7 +48,7 @@ module Abilities can :create, Budget::Investment, budget: { phase: "accepting" } can :vote, Budget::Investment, budget: { phase: "selecting" } can [:show, :create], Budget::Ballot, budget: { phase: "balloting" } - can [:create, :destroy], Budget::Ballot::Line#, budget: { phase: "balloting" } + can [:create, :destroy], Budget::Ballot::Line, budget: { phase: "balloting" } can :create, DirectMessage can :show, DirectMessage, sender_id: user.id From eb5291d8a6d062c012f23d002deaadbe7ab6b5b9 Mon Sep 17 00:00:00 2001 From: kikito Date: Mon, 19 Dec 2016 19:10:49 +0100 Subject: [PATCH 24/73] Fixes budgets/votes_spec --- app/views/budgets/investments/_votes.html.erb | 4 ++-- config/locales/en.yml | 6 ++++++ spec/features/budgets/votes_spec.rb | 10 +++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/views/budgets/investments/_votes.html.erb b/app/views/budgets/investments/_votes.html.erb index 81acd9749..7a8a7826b 100644 --- a/app/views/budgets/investments/_votes.html.erb +++ b/app/views/budgets/investments/_votes.html.erb @@ -2,7 +2,7 @@ <% voting_allowed = true unless reason.presence == :not_voting_allowed %> <% user_voted_for = voted_for?(investment_votes, investment) %> -
+
<%= t("budget.investments.investment.supports", count: investment.total_votes) %> @@ -27,7 +27,7 @@
<% if reason.present? && !user_voted_for %> -