Merge pull request #1721 from consul/feature/add_slugs_to_budget_related

Add slugs to budget related
This commit is contained in:
BertoCQ
2017-07-05 13:16:24 +02:00
committed by GitHub
11 changed files with 126 additions and 5 deletions

View File

@@ -1,13 +1,15 @@
class Budget < ActiveRecord::Base class Budget < ActiveRecord::Base
include Measurable include Measurable
include Sluggable
PHASES = %w(accepting reviewing selecting valuating balloting reviewing_ballots finished).freeze PHASES = %w(accepting reviewing selecting valuating balloting reviewing_ballots finished).freeze
CURRENCY_SYMBOLS = %w(€ $ £ ¥).freeze CURRENCY_SYMBOLS = %w(€ $ £ ¥).freeze
validates :name, presence: true validates :name, presence: true, uniqueness: true
validates :phase, inclusion: { in: PHASES } validates :phase, inclusion: { in: PHASES }
validates :currency_symbol, presence: true validates :currency_symbol, presence: true
validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/
has_many :investments, dependent: :destroy has_many :investments, dependent: :destroy
has_many :ballots, dependent: :destroy has_many :ballots, dependent: :destroy

View File

@@ -1,10 +1,14 @@
class Budget class Budget
class Group < ActiveRecord::Base class Group < ActiveRecord::Base
include Sluggable
belongs_to :budget belongs_to :budget
has_many :headings, dependent: :destroy has_many :headings, dependent: :destroy
validates :budget_id, presence: true validates :budget_id, presence: true
validates :name, presence: true validates :name, presence: true, uniqueness: { scope: :budget }
validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/
end end
end end

View File

@@ -1,12 +1,15 @@
class Budget class Budget
class Heading < ActiveRecord::Base class Heading < ActiveRecord::Base
include Sluggable
belongs_to :group belongs_to :group
has_many :investments has_many :investments
validates :group_id, presence: true validates :group_id, presence: true
validates :name, presence: true validates :name, presence: true, uniqueness: { if: :name_exists_in_budget_headings }
validates :price, presence: true validates :price, presence: true
validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/
delegate :budget, :budget_id, to: :group, allow_nil: true delegate :budget, :budget_id, to: :group, allow_nil: true
@@ -16,5 +19,9 @@ class Budget
"#{group.name}: #{name}" "#{group.name}: #{name}"
end end
def name_exists_in_budget_headings
group.budget.headings.where(name: name).any?
end
end end
end end

View File

@@ -0,0 +1,11 @@
module Sluggable
extend ActiveSupport::Concern
included do
before_validation :generate_slug
end
def generate_slug
self.slug = name.to_s.parameterize
end
end

View File

@@ -0,0 +1,7 @@
class AddSlugsToBudgetHeadingGroup < ActiveRecord::Migration
def change
add_column :budgets, :slug, :string
add_column :budget_groups, :slug, :string
add_column :budget_headings, :slug, :string
end
end

View File

@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170703120055) do ActiveRecord::Schema.define(version: 20170704105112) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@@ -103,6 +103,7 @@ ActiveRecord::Schema.define(version: 20170703120055) do
create_table "budget_groups", force: :cascade do |t| create_table "budget_groups", force: :cascade do |t|
t.integer "budget_id" t.integer "budget_id"
t.string "name", limit: 50 t.string "name", limit: 50
t.string "slug"
end end
add_index "budget_groups", ["budget_id"], name: "index_budget_groups_on_budget_id", using: :btree add_index "budget_groups", ["budget_id"], name: "index_budget_groups_on_budget_id", using: :btree
@@ -112,6 +113,7 @@ ActiveRecord::Schema.define(version: 20170703120055) do
t.string "name", limit: 50 t.string "name", limit: 50
t.integer "price", limit: 8 t.integer "price", limit: 8
t.integer "population" t.integer "population"
t.string "slug"
end end
add_index "budget_headings", ["group_id"], name: "index_budget_headings_on_group_id", using: :btree add_index "budget_headings", ["group_id"], name: "index_budget_headings_on_group_id", using: :btree
@@ -196,6 +198,7 @@ ActiveRecord::Schema.define(version: 20170703120055) do
t.text "description_balloting" t.text "description_balloting"
t.text "description_reviewing_ballots" t.text "description_reviewing_ballots"
t.text "description_finished" t.text "description_finished"
t.string "slug"
end end
create_table "campaigns", force: :cascade do |t| create_table "campaigns", force: :cascade do |t|

8
lib/tasks/slugs.rake Normal file
View File

@@ -0,0 +1,8 @@
namespace :slugs do
desc "Generate slug attribute for objects from classes that use Sluggable concern"
task generate: :environment do
%w(Budget Budget::Heading Budget::Group).each do |class_name|
class_name.constantize.all.each(&:generate_slug)
end
end
end

View File

@@ -0,0 +1,23 @@
require 'rails_helper'
describe Budget::Group do
it_behaves_like "sluggable"
let(:budget) { create(:budget) }
describe "name" do
before do
create(:budget_group, budget: budget, name: 'object name')
end
it "can be repeatead in other budget's groups" do
expect(build(:budget_group, budget: create(:budget), name: 'object name')).to be_valid
end
it "must be unique among all budget's groups" do
expect(build(:budget_group, budget: budget, name: 'object name')).not_to be_valid
end
end
end

View File

@@ -0,0 +1,28 @@
require 'rails_helper'
describe Budget::Heading do
it_behaves_like "sluggable"
let(:budget) { create(:budget) }
let(:group) { create(:budget_group, budget: budget) }
describe "name" do
before do
create(:budget_heading, group: group, name: 'object name')
end
it "can be repeatead in other budget's groups" do
expect(build(:budget_heading, group: create(:budget_group), name: 'object name')).to be_valid
end
it "must be unique among all budget's groups" do
expect(build(:budget_heading, group: create(:budget_group, budget: budget), name: 'object name')).not_to be_valid
end
it "must be unique among all it's group" do
expect(build(:budget_heading, group: group, name: 'object name')).not_to be_valid
end
end
end

View File

@@ -2,6 +2,18 @@ require 'rails_helper'
describe Budget do describe Budget do
it_behaves_like "sluggable"
describe "name" do
before do
create(:budget, name: 'object name')
end
it "is validated for uniqueness" do
expect(build(:budget, name: 'object name')).not_to be_valid
end
end
describe "description" do describe "description" do
it "changes depending on the phase" do it "changes depending on the phase" do
budget = create(:budget) budget = create(:budget)

View File

@@ -0,0 +1,16 @@
require 'spec_helper'
shared_examples_for 'sluggable' do
describe 'generate_slug' do
before do
create(described_class.name.parameterize.tr('-', '_').to_sym, name: "Marlo Brañido Carlo")
end
context "when a new sluggable is created" do
it "gets a slug string" do
expect(described_class.last.slug).to eq("marlo-branido-carlo")
end
end
end
end