From 2291caa3fd9b7677a43d6a6ea6ac4d9b0fad310b Mon Sep 17 00:00:00 2001 From: rgarcia Date: Sun, 21 Feb 2016 14:28:48 +0100 Subject: [PATCH 1/4] users can view their own spending proposals --- .../spending_proposals_controller.rb | 12 ++++----- spec/features/spending_proposals_spec.rb | 25 ++++++++++++++++++- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/app/controllers/spending_proposals_controller.rb b/app/controllers/spending_proposals_controller.rb index a07783d3d..17b7ad738 100644 --- a/app/controllers/spending_proposals_controller.rb +++ b/app/controllers/spending_proposals_controller.rb @@ -1,11 +1,11 @@ class SpendingProposalsController < ApplicationController include FeatureFlags - before_action :authenticate_user!, except: [:index] - before_action :verify_valuator, only: [:show] - load_and_authorize_resource + before_action :authenticate_user!, except: [:index] + before_action :verify_access, only: [:show] + feature_flag :spending_proposals def index @@ -20,7 +20,7 @@ class SpendingProposalsController < ApplicationController @spending_proposal.author = current_user if @spending_proposal.save_with_captcha - redirect_to spending_proposals_path, notice: t("flash.actions.create.spending_proposal") + redirect_to @spending_proposal, notice: t("flash.actions.create.spending_proposal") else render :new end @@ -32,8 +32,8 @@ class SpendingProposalsController < ApplicationController params.require(:spending_proposal).permit(:title, :description, :external_url, :geozone_id, :association_name, :terms_of_service, :captcha, :captcha_key) end - def verify_valuator - raise CanCan::AccessDenied unless current_user.try(:valuator?) || current_user.try(:administrator?) + def verify_access + raise CanCan::AccessDenied unless current_user.try(:valuator?) || current_user.try(:administrator?) || @spending_proposal.author == current_user end end diff --git a/spec/features/spending_proposals_spec.rb b/spec/features/spending_proposals_spec.rb index 9a4d56fd7..484444fbb 100644 --- a/spec/features/spending_proposals_spec.rb +++ b/spec/features/spending_proposals_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' feature 'Spending proposals' do - let(:author) { create(:user, :level_two) } + let(:author) { create(:user, :level_two, username: 'Isabel') } scenario 'Index' do visit spending_proposals_path @@ -33,6 +33,11 @@ feature 'Spending proposals' do click_button 'Create' expect(page).to have_content 'Spending proposal created successfully' + expect(page).to have_content('Build a skyscraper') + expect(page).to have_content('I want to live in a high tower over the clouds') + expect(page).to have_content('Isabel') + expect(page).to have_content('People of the neighbourhood') + expect(page).to have_content('All city') end scenario 'Captcha is required for proposal creation' do @@ -100,6 +105,24 @@ feature 'Spending proposals' do expect(page).to have_content(spending_proposal.geozone.name) end + scenario "Show (as author)" do + author = create(:user) + login_as(author) + + spending_proposal = create(:spending_proposal, + geozone: create(:geozone), + association_name: 'People of the neighbourhood', + author: author) + + visit spending_proposal_path(spending_proposal) + + expect(page).to have_content(spending_proposal.title) + expect(page).to have_content(spending_proposal.description) + expect(page).to have_content(spending_proposal.author.name) + expect(page).to have_content(spending_proposal.association_name) + expect(page).to have_content(spending_proposal.geozone.name) + end + scenario "Show (as user)" do user = create(:user) login_as(user) From 7699b996553ff07adbf0cd3255225814298b2360 Mon Sep 17 00:00:00 2001 From: rgarcia Date: Sun, 21 Feb 2016 17:27:54 +0100 Subject: [PATCH 2/4] allows authors and admins to view their spending proposals in my activity --- app/controllers/users_controller.rb | 22 ++++++++++-- app/models/spending_proposal.rb | 4 +++ app/views/comments/_flag_actions.html.erb | 36 ++++++++++++++----- app/views/users/_activity_page.html.erb | 1 + app/views/users/_spending_proposals.html.erb | 13 +++++++ app/views/users/show.html.erb | 16 ++++++--- config/locales/en.yml | 3 ++ config/locales/es.yml | 3 ++ spec/features/users_spec.rb | 37 ++++++++++++++++++++ 9 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 app/views/users/_spending_proposals.html.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index d505cef8c..5c5e68741 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,7 +1,8 @@ class UsersController < ApplicationController - has_filters %w{proposals debates comments}, only: :show + has_filters %w{proposals debates comments spending_proposals}, only: :show load_and_authorize_resource + helper_method :authorized_for_filter? def show load_filtered_activity if valid_access? @@ -12,7 +13,8 @@ class UsersController < ApplicationController @activity_counts = HashWithIndifferentAccess.new( proposals: Proposal.where(author_id: @user.id).count, debates: Debate.where(author_id: @user.id).count, - comments: Comment.not_as_admin_or_moderator.where(user_id: @user.id).count) + comments: Comment.not_as_admin_or_moderator.where(user_id: @user.id).count, + spending_proposals: SpendingProposal.where(author_id: @user.id).count) end def load_filtered_activity @@ -21,6 +23,7 @@ class UsersController < ApplicationController when "proposals" then load_proposals when "debates" then load_debates when "comments" then load_comments + when "spending_proposals" then load_spending_proposals else load_available_activity end end @@ -35,6 +38,9 @@ class UsersController < ApplicationController elsif @activity_counts[:comments] > 0 load_comments @current_filter = "comments" + elsif @activity_counts[:spending_proposals] > 0 && author_or_admin? + load_spending_proposals + @current_filter = "spending_proposals" end end @@ -50,11 +56,23 @@ class UsersController < ApplicationController @comments = Comment.not_as_admin_or_moderator.where(user_id: @user.id).includes(:commentable).order(created_at: :desc).page(params[:page]) end + def load_spending_proposals + @spending_proposals = SpendingProposal.where(author_id: @user.id).order(created_at: :desc).page(params[:page]) + end + def valid_access? @user.public_activity || authorized_current_user? end + def author_or_admin? + @author_or_admin ||= current_user && (current_user == @user || current_user.administrator?) + end + def authorized_current_user? @authorized_current_user ||= current_user && (current_user == @user || current_user.moderator? || current_user.administrator?) end + + def authorized_for_filter?(filter) + filter == "spending_proposals" ? author_or_admin? : true + end end diff --git a/app/models/spending_proposal.rb b/app/models/spending_proposal.rb index 90d2b06f6..c023f83f4 100644 --- a/app/models/spending_proposal.rb +++ b/app/models/spending_proposal.rb @@ -64,4 +64,8 @@ class SpendingProposal < ActiveRecord::Base end end + def description + super.try :html_safe + end + end diff --git a/app/views/comments/_flag_actions.html.erb b/app/views/comments/_flag_actions.html.erb index 007ab90b4..b68b31038 100644 --- a/app/views/comments/_flag_actions.html.erb +++ b/app/views/comments/_flag_actions.html.erb @@ -1,24 +1,44 @@ <% if show_flag_action? comment %>  |  - -