diff --git a/app/controllers/admin/budget_investments_controller.rb b/app/controllers/admin/budget_investments_controller.rb index a5d2ee21a..e9291e78d 100644 --- a/app/controllers/admin/budget_investments_controller.rb +++ b/app/controllers/admin/budget_investments_controller.rb @@ -44,6 +44,7 @@ class Admin::BudgetInvestmentsController < Admin::BaseController end def update + authorize! :admin_update, @investment if @investment.update(budget_investment_params) redirect_to admin_budget_budget_investment_path(@budget, @investment, diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index 7e0107845..7bbec323e 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -20,7 +20,7 @@ module Budgets before_action :load_ballot, only: [:index, :show] before_action :load_heading, only: [:index, :show] before_action :set_random_seed, only: :index - before_action :load_categories, only: [:index, :new, :create] + before_action :load_categories, only: [:index, :new, :create, :edit, :update] before_action :set_default_budget_filter, only: :index before_action :set_view, only: :index before_action :load_content_blocks, only: :index @@ -76,6 +76,15 @@ module Budgets end end + def update + if @investment.update(investment_params) + redirect_to budget_investment_path(@budget, @investment), + notice: t("flash.actions.update.budget_investment") + else + render "edit" + end + end + def destroy @investment.destroy redirect_to user_path(current_user, filter: "budget_investments"), notice: t("flash.actions.destroy.budget_investment") diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb index fb4979be9..9f3d99973 100644 --- a/app/models/abilities/administrator.rb +++ b/app/models/abilities/administrator.rb @@ -62,7 +62,7 @@ module Abilities can [:index, :read, :new, :create, :update, :destroy, :calculate_winners, :assigned_users_translation], Budget can [:read, :create, :update, :destroy], Budget::Group can [:read, :create, :update, :destroy], Budget::Heading - can [:hide, :update, :toggle_selection], Budget::Investment + can [:hide, :admin_update, :toggle_selection], Budget::Investment can [:valuate, :comment_valuation], Budget::Investment can :create, Budget::ValuatorAssignment can [:edit_dossier], Budget::Investment diff --git a/app/models/abilities/common.rb b/app/models/abilities/common.rb index e670f86ca..04155f8fc 100644 --- a/app/models/abilities/common.rb +++ b/app/models/abilities/common.rb @@ -95,6 +95,8 @@ module Abilities can :create, Legislation::Answer can :create, Budget::Investment, budget: { phase: "accepting" } + can :edit, Budget::Investment, budget: { phase: "accepting" }, author_id: user.id + can :update, Budget::Investment, budget: { phase: "accepting" }, author_id: user.id can :suggest, Budget::Investment, budget: { phase: "accepting" } can :destroy, Budget::Investment, budget: { phase: ["accepting", "reviewing"] }, author_id: user.id can :vote, Budget::Investment, budget: { phase: "selecting" } diff --git a/app/views/budgets/investments/_form.html.erb b/app/views/budgets/investments/_form.html.erb index 138743669..c118611fd 100644 --- a/app/views/budgets/investments/_form.html.erb +++ b/app/views/budgets/investments/_form.html.erb @@ -1,4 +1,4 @@ -<%= translatable_form_for(@investment, url: form_url, method: :post, html: { multipart: true }) do |f| %> +<%= translatable_form_for(@investment, url: form_url, html: { multipart: true }) do |f| %> <%= render "shared/errors", resource: @investment %> diff --git a/app/views/budgets/investments/edit.html.erb b/app/views/budgets/investments/edit.html.erb new file mode 100644 index 000000000..ffdb0dcdf --- /dev/null +++ b/app/views/budgets/investments/edit.html.erb @@ -0,0 +1,6 @@ +
+
+

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

+ <%= render "/budgets/investments/form", form_url: budget_investment_path(@budget, @investment) %> +
+
diff --git a/app/views/users/_budget_investment.html.erb b/app/views/users/_budget_investment.html.erb index 5ce114cb3..4f29c94c1 100644 --- a/app/views/users/_budget_investment.html.erb +++ b/app/views/users/_budget_investment.html.erb @@ -8,5 +8,9 @@ method: :delete, class: "button hollow alert expanded", data: { confirm: "#{t("users.show.delete_alert")}" } %> <% end %> + <% if can? :update, budget_investment %> + <%= link_to t("shared.edit"), edit_budget_investment_path(budget_investment.budget, budget_investment), + class: "button hollow expanded" %> + <% end %> diff --git a/config/locales/en/management.yml b/config/locales/en/management.yml index b617bcb74..86d1635f0 100644 --- a/config/locales/en/management.yml +++ b/config/locales/en/management.yml @@ -96,6 +96,7 @@ en: alert: unverified_user: User is not verified create: Create a budget investment + edit: Edit budget investment filters: heading: Concept unfeasible: Unfeasible investment diff --git a/config/locales/es/management.yml b/config/locales/es/management.yml index b6ee0acb7..af88dd99f 100644 --- a/config/locales/es/management.yml +++ b/config/locales/es/management.yml @@ -96,6 +96,7 @@ es: alert: unverified_user: Usuario no verificado create: Crear nuevo proyecto + edit: Editar proyecto de gasto filters: heading: Concepto unfeasible: Proyectos no factibles diff --git a/config/routes/budget.rb b/config/routes/budget.rb index 143ed7409..f0742a99f 100644 --- a/config/routes/budget.rb +++ b/config/routes/budget.rb @@ -1,6 +1,6 @@ resources :budgets, only: [:show, :index] do resources :groups, controller: "budgets/groups", only: [:show] - resources :investments, controller: "budgets/investments", only: [:index, :new, :create, :show, :destroy] do + resources :investments, controller: "budgets/investments" do member do post :vote put :flag diff --git a/spec/features/budgets/investments_spec.rb b/spec/features/budgets/investments_spec.rb index 40b03d8dd..050a8a303 100644 --- a/spec/features/budgets/investments_spec.rb +++ b/spec/features/budgets/investments_spec.rb @@ -927,6 +927,54 @@ describe "Budget Investments" do expect(page).to have_content "Build a skyscraper" end + scenario "Edit", :js do + daniel = create(:user, :level_two) + + create(:budget_investment, heading: heading,title: "Get Schwifty", author: daniel, created_at: 1.day.ago) + + login_as(daniel) + + visit user_path(daniel, filter: "budget_investments") + + click_link("Edit", match: :first) + fill_in "Title", with: "Park improvements" + check "budget_investment_terms_of_service" + + click_button "Update Investment" + + expect(page).to have_content "Investment project updated succesfully" + expect(page).to have_content "Park improvements" + end + + scenario "Trigger validation errors in edit view" do + daniel = create(:user, :level_two) + message_error = "is too short (minimum is 4 characters), can't be blank" + create(:budget_investment, heading: heading,title: "Get SH", author: daniel, created_at: 1.day.ago) + + login_as(daniel) + + visit user_path(daniel, filter: "budget_investments") + click_link("Edit", match: :first) + fill_in "Title", with: "" + check "budget_investment_terms_of_service" + + click_button "Update Investment" + + expect(page).to have_content message_error + end + + scenario "Another User can't edit budget investment" do + message_error = "You do not have permission to carry out the action 'edit' on budget/investment" + admin = create(:administrator) + daniel = create(:user, :level_two) + investment = create(:budget_investment, heading: heading, author: daniel) + + login_as(admin.user) + visit edit_budget_investment_path(budget, investment) + + expect(page).to have_content message_error + end + scenario "Errors on create" do login_as(author) diff --git a/spec/models/abilities/administrator_spec.rb b/spec/models/abilities/administrator_spec.rb index 76961d4f0..295ed838c 100644 --- a/spec/models/abilities/administrator_spec.rb +++ b/spec/models/abilities/administrator_spec.rb @@ -73,7 +73,7 @@ describe Abilities::Administrator do it { should be_able_to(:create, Budget::ValuatorAssignment) } - it { should be_able_to(:update, Budget::Investment) } + it { should be_able_to(:admin_update, Budget::Investment) } it { should be_able_to(:hide, Budget::Investment) } it { should be_able_to(:valuate, create(:budget_investment, budget: create(:budget, :valuating))) } diff --git a/spec/models/abilities/common_spec.rb b/spec/models/abilities/common_spec.rb index 684547920..4e7b16ef6 100644 --- a/spec/models/abilities/common_spec.rb +++ b/spec/models/abilities/common_spec.rb @@ -259,6 +259,11 @@ describe Abilities::Common do it { should_not be_able_to(:destroy, own_investment_in_selecting_budget) } it { should_not be_able_to(:destroy, own_investment_in_balloting_budget) } + it { should be_able_to(:edit, own_investment_in_accepting_budget) } + it { should_not be_able_to(:edit, own_investment_in_reviewing_budget) } + it { should_not be_able_to(:edit, own_investment_in_selecting_budget) } + it { should_not be_able_to(:edit, own_investment_in_balloting_budget) } + it { should be_able_to(:create, ballot_in_balloting_budget) } it { should_not be_able_to(:create, ballot_in_accepting_budget) } it { should_not be_able_to(:create, ballot_in_selecting_budget) }