From 009733a43b3a37bbfbf41ba57265a4f211cbd3dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Wed, 17 Feb 2016 17:46:59 +0100 Subject: [PATCH 1/2] adds Valuator --- app/models/user.rb | 5 +++++ app/models/valuator.rb | 6 ++++++ db/migrate/20160217101004_create_valuators.rb | 7 +++++++ db/schema.rb | 16 +++++++++++++++- spec/factories.rb | 5 ++++- spec/models/user_spec.rb | 13 ++++++++++++- 6 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 app/models/valuator.rb create mode 100644 db/migrate/20160217101004_create_valuators.rb diff --git a/app/models/user.rb b/app/models/user.rb index e0b20ff28..2daa64ec2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -12,6 +12,7 @@ class User < ActiveRecord::Base has_one :administrator has_one :moderator + has_one :valuator has_one :organization has_one :lock has_many :flags @@ -92,6 +93,10 @@ class User < ActiveRecord::Base moderator.present? end + def valuator? + valuator.present? + end + def organization? organization.present? end diff --git a/app/models/valuator.rb b/app/models/valuator.rb new file mode 100644 index 000000000..c513e997e --- /dev/null +++ b/app/models/valuator.rb @@ -0,0 +1,6 @@ +class Valuator < ActiveRecord::Base + belongs_to :user, touch: true + delegate :name, :email, to: :user + + validates :user_id, presence: true, uniqueness: true +end diff --git a/db/migrate/20160217101004_create_valuators.rb b/db/migrate/20160217101004_create_valuators.rb new file mode 100644 index 000000000..d7c6d659f --- /dev/null +++ b/db/migrate/20160217101004_create_valuators.rb @@ -0,0 +1,7 @@ +class CreateValuators < ActiveRecord::Migration + def change + create_table :valuators do |t| + t.belongs_to :user, index: true, foreign_key: true + end + end +end diff --git a/db/schema.rb b/db/schema.rb index a0d23496c..bbfaf7fa6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160216121051) do +ActiveRecord::Schema.define(version: 20160217101004) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -415,6 +415,18 @@ ActiveRecord::Schema.define(version: 20160216121051) do add_index "users", ["hidden_at"], name: "index_users_on_hidden_at", using: :btree add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree + create_table "validators", force: :cascade do |t| + t.integer "user_id" + end + + add_index "validators", ["user_id"], name: "index_validators_on_user_id", using: :btree + + create_table "valuators", force: :cascade do |t| + t.integer "user_id" + end + + add_index "valuators", ["user_id"], name: "index_valuators_on_user_id", using: :btree + create_table "verified_users", force: :cascade do |t| t.string "document_number" t.string "document_type" @@ -484,4 +496,6 @@ ActiveRecord::Schema.define(version: 20160216121051) do add_foreign_key "moderators", "users" add_foreign_key "notifications", "users" add_foreign_key "organizations", "users" + add_foreign_key "validators", "users" + add_foreign_key "valuators", "users" end diff --git a/spec/factories.rb b/spec/factories.rb index 70ed26a1d..52abc82cc 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -1,5 +1,4 @@ FactoryGirl.define do - sequence(:document_number) { |n| "#{n.to_s.rjust(8, '0')}X" } factory :user do @@ -251,6 +250,10 @@ FactoryGirl.define do user end + factory :valuator do + user + end + factory :organization do user responsible_name "Johnny Utah" diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 6b65fcb0e..a081f3ff8 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -109,6 +109,18 @@ describe User do end end + describe "valuator?" do + it "is false when the user is not a valuator" do + expect(subject.valuator?).to be false + end + + it "is true when the user is a valuator" do + subject.save + create(:valuator, user: subject) + expect(subject.valuator?).to be true + end + end + describe "organization?" do it "is false when the user is not an organization" do expect(subject.organization?).to be false @@ -291,7 +303,6 @@ describe User do expect { user.organization.verify } .to change { user.reload.updated_at} end - end describe "document_number" do From 11d6d0b6d6e14adb4c89e7fff262a9a074db3aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baza=CC=81n?= Date: Thu, 18 Feb 2016 18:54:49 +0100 Subject: [PATCH 2/2] adds spending proposal show for valuator and admin --- app/controllers/spending_proposals_controller.rb | 5 +++++ app/models/abilities/valuator.rb | 9 +++++++++ app/models/ability.rb | 2 ++ config/routes.rb | 2 +- db/schema.rb | 7 ------- 5 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 app/models/abilities/valuator.rb diff --git a/app/controllers/spending_proposals_controller.rb b/app/controllers/spending_proposals_controller.rb index 0ac839434..e82ad3eef 100644 --- a/app/controllers/spending_proposals_controller.rb +++ b/app/controllers/spending_proposals_controller.rb @@ -2,6 +2,7 @@ class SpendingProposalsController < ApplicationController include FeatureFlags before_action :authenticate_user!, except: [:index] + before_action :verify_valuator, only: [:show] load_and_authorize_resource @@ -31,4 +32,8 @@ class SpendingProposalsController < ApplicationController params.require(:spending_proposal).permit(:title, :description, :external_url, :geozone_id, :terms_of_service, :captcha, :captcha_key) end + def verify_valuator + raise CanCan::AccessDenied unless current_user.try(:valuator?) || current_user.try(:administrator?) + end + end diff --git a/app/models/abilities/valuator.rb b/app/models/abilities/valuator.rb new file mode 100644 index 000000000..edb542e4b --- /dev/null +++ b/app/models/abilities/valuator.rb @@ -0,0 +1,9 @@ +module Abilities + class Valuator + include CanCan::Ability + + def initialize(user) + can :manage, SpendingProposal + end + end +end \ No newline at end of file diff --git a/app/models/ability.rb b/app/models/ability.rb index 3d5c15d91..98ff4e55c 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -7,6 +7,8 @@ class Ability alias_action :hide_in_moderation_screen, to: :hide if user # logged-in users + self.merge Abilities::Valuator.new(user) if user.valuator? + if user.administrator? self.merge Abilities::Administrator.new(user) elsif user.moderator? diff --git a/config/routes.rb b/config/routes.rb index c9e4023ad..6b2558951 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -69,7 +69,7 @@ Rails.application.routes.draw do end end - resources :spending_proposals, only: [:index, :new, :create] + resources :spending_proposals, only: [:index, :new, :create, :show] resources :stats, only: [:index] diff --git a/db/schema.rb b/db/schema.rb index bbfaf7fa6..5b3a8831e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -415,12 +415,6 @@ ActiveRecord::Schema.define(version: 20160217101004) do add_index "users", ["hidden_at"], name: "index_users_on_hidden_at", using: :btree add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree - create_table "validators", force: :cascade do |t| - t.integer "user_id" - end - - add_index "validators", ["user_id"], name: "index_validators_on_user_id", using: :btree - create_table "valuators", force: :cascade do |t| t.integer "user_id" end @@ -496,6 +490,5 @@ ActiveRecord::Schema.define(version: 20160217101004) do add_foreign_key "moderators", "users" add_foreign_key "notifications", "users" add_foreign_key "organizations", "users" - add_foreign_key "validators", "users" add_foreign_key "valuators", "users" end