From 46e5d6a9faeac56154c3322db9698c464b0ea028 Mon Sep 17 00:00:00 2001 From: lalo Date: Thu, 9 May 2019 12:28:59 +0200 Subject: [PATCH 1/6] Create Legislation::PeopleProposal model --- app/models/comment.rb | 5 +- app/models/legislation/people_proposal.rb | 156 ++++++++++++++++++ app/models/legislation/process.rb | 12 +- app/models/user.rb | 1 + db/dev_seeds.rb | 1 + db/dev_seeds/legislation_people_proposals.rb | 13 ++ db/dev_seeds/legislation_processes.rb | 3 + ...roposals_phase_to_legislation_processes.rb | 7 + ...eate_legislation_people_proposals_table.rb | 35 ++++ ..._fields_to_legislation_people_proposals.rb | 11 ++ db/schema.rb | 65 ++++++-- spec/factories/legislations.rb | 42 ++++- .../legislation/people_proposals_spec.rb | 108 ++++++++++++ 13 files changed, 445 insertions(+), 14 deletions(-) create mode 100644 app/models/legislation/people_proposal.rb create mode 100644 db/dev_seeds/legislation_people_proposals.rb create mode 100644 db/migrate/20190423070619_add_people_proposals_phase_to_legislation_processes.rb create mode 100644 db/migrate/20190423072214_create_legislation_people_proposals_table.rb create mode 100644 db/migrate/20190426072056_add_contact_fields_to_legislation_people_proposals.rb create mode 100644 spec/models/legislation/people_proposals_spec.rb diff --git a/app/models/comment.rb b/app/models/comment.rb index 76e314c23..9323f9f17 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -4,8 +4,9 @@ class Comment < ApplicationRecord include Graphqlable include Notifiable - COMMENTABLE_TYPES = %w(Debate Proposal Budget::Investment Poll Topic Legislation::Question - Legislation::Annotation Legislation::Proposal).freeze + COMMENTABLE_TYPES = %w[Debate Proposal Budget::Investment Poll Topic + Legislation::Question Legislation::Annotation + Legislation::Proposal Legislation::PeopleProposal].freeze acts_as_paranoid column: :hidden_at include ActsAsParanoidAliases diff --git a/app/models/legislation/people_proposal.rb b/app/models/legislation/people_proposal.rb new file mode 100644 index 000000000..290ab72f3 --- /dev/null +++ b/app/models/legislation/people_proposal.rb @@ -0,0 +1,156 @@ +class Legislation::PeopleProposal < ActiveRecord::Base + include ActsAsParanoidAliases + include Flaggable + include Taggable + include Conflictable + include Measurable + include Sanitizable + include Searchable + include Filterable + include Followable + include Communitable + include Documentable + include Notifiable + include Imageable + include Randomizable + + documentable max_documents_allowed: 3, + max_file_size: 3.megabytes, + accepted_content_types: [ "application/pdf" ] + accepts_nested_attributes_for :documents, allow_destroy: true + + acts_as_votable + acts_as_paranoid column: :hidden_at + + belongs_to :process, class_name: "Legislation::Process", foreign_key: "legislation_process_id" + belongs_to :author, -> { with_hidden }, class_name: "User", foreign_key: "author_id" + has_many :comments, as: :commentable + + validates :title, presence: true + validates :summary, presence: true + validates :author, presence: true + validates :process, presence: true + + validates :title, length: { in: 4..Legislation::PeopleProposal.title_max_length } + validates :description, length: { maximum: Legislation::PeopleProposal.description_max_length } + + validates :terms_of_service, acceptance: { allow_nil: false }, on: :create + + before_validation :set_responsible_name + + before_save :calculate_hot_score, :calculate_confidence_score + + scope :for_render, -> { includes(:tags) } + scope :sort_by_hot_score, -> { reorder(hot_score: :desc) } + scope :sort_by_confidence_score, -> { reorder(confidence_score: :desc) } + scope :sort_by_created_at, -> { reorder(created_at: :desc) } + scope :sort_by_most_commented, -> { reorder(comments_count: :desc) } + scope :sort_by_title, -> { reorder(title: :asc) } + scope :sort_by_id, -> { reorder(id: :asc) } + scope :sort_by_supports, -> { reorder(cached_votes_score: :desc) } + scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } + scope :last_week, -> { where("people_proposals.created_at >= ?", 7.days.ago)} + scope :validated, -> { where(validated: true) } + scope :selected, -> { where(selected: true) } + scope :winners, -> { selected.sort_by_confidence_score } + + def to_param + "#{id}-#{title}".parameterize + end + + def searchable_values + { title => "A", + question => "B", + author.username => "B", + tag_list.join(" ") => "B", + summary => "C", + description => "D"} + end + + def self.search(terms) + by_code = search_by_code(terms.strip) + by_code.present? ? by_code : pg_search(terms) + end + + def self.search_by_code(terms) + matched_code = match_code(terms) + results = where(id: matched_code[1]) if matched_code + return results if results.present? && results.first.code == terms + end + + def self.match_code(terms) + /\A#{Setting["proposal_code_prefix"]}-\d\d\d\d-\d\d-(\d*)\z/.match(terms) + end + + def likes + cached_votes_up + end + + def dislikes + cached_votes_down + end + + def total_votes + cached_votes_total + end + + def votes_score + cached_votes_score + end + + def voters + User.active.where(id: votes_for.voters) + end + + def editable? + total_votes <= Setting["max_votes_for_people_proposal_edit"].to_i + end + + def editable_by?(user) + author_id == user.id && editable? + end + + def votable_by?(user) + user && user.level_two_or_three_verified? + end + + def register_vote(user, vote_value) + vote_by(voter: user, vote: vote_value) if votable_by?(user) + end + + def code + "#{Setting["proposal_code_prefix"]}-#{created_at.strftime("%Y-%m")}-#{id}" + end + + def after_commented + save # update cache when it has a new comment + end + + def calculate_hot_score + self.hot_score = ScoreCalculator.hot_score(self) + end + + def calculate_confidence_score + self.confidence_score = ScoreCalculator.confidence_score(total_votes, total_votes) + end + + def after_hide + tags.each{ |t| t.decrement_custom_counter_for("LegislationPeopleProposal") } + end + + def after_restore + tags.each{ |t| t.increment_custom_counter_for("LegislationPeopleProposal") } + end + + def contact_info + [phone, email, website].compact + end + + protected + + def set_responsible_name + if author && author.document_number? + self.responsible_name = author.document_number + end + end +end diff --git a/app/models/legislation/process.rb b/app/models/legislation/process.rb index 3f91ea27a..874af7b6c 100644 --- a/app/models/legislation/process.rb +++ b/app/models/legislation/process.rb @@ -17,7 +17,8 @@ class Legislation::Process < ApplicationRecord include Globalizable PHASES_AND_PUBLICATIONS = %i[homepage_phase draft_phase debate_phase allegations_phase - proposals_phase draft_publication result_publication].freeze + proposals_phase people_proposals_phase draft_publication + result_publication].freeze CSS_HEX_COLOR = /\A#?(?:[A-F0-9]{3}){1,2}\z/i @@ -31,6 +32,8 @@ class Legislation::Process < ApplicationRecord foreign_key: "legislation_process_id", dependent: :destroy has_many :proposals, -> { order(:id) }, class_name: "Legislation::Proposal", foreign_key: "legislation_process_id", dependent: :destroy + has_many :people_proposals, -> { order(:id) }, class_name: "Legislation::PeopleProposal", + foreign_key: "legislation_process_id", dependent: :destroy validates_translation :title, presence: true validates :start_date, presence: true @@ -42,6 +45,8 @@ class Legislation::Process < ApplicationRecord validates :allegations_start_date, presence: true, if: :allegations_end_date? validates :allegations_end_date, presence: true, if: :allegations_start_date? validates :proposals_phase_end_date, presence: true, if: :proposals_phase_start_date? + validates :people_proposals_phase_end_date, presence: true, + if: :people_proposals_phase_start_date? validate :valid_date_ranges validates :background_color, format: { allow_blank: true, with: CSS_HEX_COLOR } validates :font_color, format: { allow_blank: true, with: CSS_HEX_COLOR } @@ -77,6 +82,11 @@ class Legislation::Process < ApplicationRecord proposals_phase_end_date, proposals_phase_enabled) end + def people_proposals_phase + Legislation::Process::Phase.new(people_proposals_phase_start_date, + people_proposals_phase_end_date, people_proposals_phase_enabled) + end + def draft_publication Legislation::Process::Publication.new(draft_publication_date, draft_publication_enabled) end diff --git a/app/models/user.rb b/app/models/user.rb index 4e6b5f00c..6bf6fe155 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,6 +23,7 @@ class User < ApplicationRecord has_many :identities, dependent: :destroy has_many :debates, -> { with_hidden }, foreign_key: :author_id has_many :proposals, -> { with_hidden }, foreign_key: :author_id + has_many :people_proposals, -> { with_hidden }, foreign_key: :author_id has_many :budget_investments, -> { with_hidden }, foreign_key: :author_id, class_name: "Budget::Investment" has_many :comments, -> { with_hidden } has_many :failed_census_calls diff --git a/db/dev_seeds.rb b/db/dev_seeds.rb index f3c154b64..1d795b79e 100644 --- a/db/dev_seeds.rb +++ b/db/dev_seeds.rb @@ -39,6 +39,7 @@ require_relative "dev_seeds/notifications" require_relative "dev_seeds/widgets" require_relative "dev_seeds/admin_notifications" require_relative "dev_seeds/legislation_proposals" +require_relative "dev_seeds/legislation_people_proposals" require_relative "dev_seeds/milestones" require_relative "dev_seeds/pages" diff --git a/db/dev_seeds/legislation_people_proposals.rb b/db/dev_seeds/legislation_people_proposals.rb new file mode 100644 index 000000000..159c486a0 --- /dev/null +++ b/db/dev_seeds/legislation_people_proposals.rb @@ -0,0 +1,13 @@ +section "Creating legislation people proposals" do + 10.times do + Legislation::PeopleProposal.create!(title: Faker::Lorem.sentence(3).truncate(60), + description: Faker::Lorem.paragraphs.join("\n\n"), + question: Faker::Lorem.sentence(3), + summary: Faker::Lorem.paragraph, + author: User.all.sample, + process: Legislation::Process.all.sample, + terms_of_service: "1", + validated: rand <= 2.0 / 3, + selected: rand <= 1.0 / 3) + end +end diff --git a/db/dev_seeds/legislation_processes.rb b/db/dev_seeds/legislation_processes.rb index f932549f7..c718685f0 100644 --- a/db/dev_seeds/legislation_processes.rb +++ b/db/dev_seeds/legislation_processes.rb @@ -11,6 +11,8 @@ section "Creating collaborative legislation" do debate_end_date: Date.current + (i - 5).days, proposals_phase_start_date: Date.current + (i - 7).days, proposals_phase_end_date: Date.current + (i - 5).days, + people_proposals_phase_start_date: Date.current + (i - 7).days, + people_proposals_phase_end_date: Date.current + (i - 5).days, draft_publication_date: Date.current + (i - 3).days, allegations_start_date: Date.current + (i - 2).days, allegations_end_date: Date.current + (i - 1).days, @@ -20,6 +22,7 @@ section "Creating collaborative legislation" do draft_publication_enabled: true, result_publication_enabled: true, proposals_phase_enabled: true, + people_proposals_phase_enabled: true, published: true) end diff --git a/db/migrate/20190423070619_add_people_proposals_phase_to_legislation_processes.rb b/db/migrate/20190423070619_add_people_proposals_phase_to_legislation_processes.rb new file mode 100644 index 000000000..b8751761f --- /dev/null +++ b/db/migrate/20190423070619_add_people_proposals_phase_to_legislation_processes.rb @@ -0,0 +1,7 @@ +class AddPeopleProposalsPhaseToLegislationProcesses < ActiveRecord::Migration + def change + add_column :legislation_processes, :people_proposals_phase_start_date, :date + add_column :legislation_processes, :people_proposals_phase_end_date, :date + add_column :legislation_processes, :people_proposals_phase_enabled, :boolean + end +end diff --git a/db/migrate/20190423072214_create_legislation_people_proposals_table.rb b/db/migrate/20190423072214_create_legislation_people_proposals_table.rb new file mode 100644 index 000000000..d5ccbe112 --- /dev/null +++ b/db/migrate/20190423072214_create_legislation_people_proposals_table.rb @@ -0,0 +1,35 @@ +class CreateLegislationPeopleProposalsTable < ActiveRecord::Migration + def change + create_table :legislation_people_proposals, force: :cascade do |t| + t.integer "legislation_process_id" + t.string "title", limit: 80 + t.text "description" + t.string "question" + t.integer "author_id" + t.datetime "hidden_at" + t.integer "flags_count", default: 0 + t.datetime "ignored_flag_at" + t.integer "cached_votes_up", default: 0 + t.integer "comments_count", default: 0 + t.datetime "confirmed_hide_at" + t.integer "hot_score", limit: 8, default: 0 + t.integer "confidence_score", default: 0 + t.string "responsible_name", limit: 60 + t.text "summary" + t.string "video_url" + t.tsvector "tsv" + t.datetime "retired_at" + t.string "retired_reason" + t.text "retired_explanation" + t.integer "community_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "cached_votes_total", default: 0 + t.integer "cached_votes_down", default: 0 + t.boolean "selected" + t.boolean "validated" + t.integer "cached_votes_score", default: 0 + end + add_index "legislation_people_proposals", ["cached_votes_score"], name: "index_legislation_people_proposals_on_cached_votes_score", using: :btree + end +end diff --git a/db/migrate/20190426072056_add_contact_fields_to_legislation_people_proposals.rb b/db/migrate/20190426072056_add_contact_fields_to_legislation_people_proposals.rb new file mode 100644 index 000000000..ea976e5bd --- /dev/null +++ b/db/migrate/20190426072056_add_contact_fields_to_legislation_people_proposals.rb @@ -0,0 +1,11 @@ +class AddContactFieldsToLegislationPeopleProposals < ActiveRecord::Migration + def change + add_column :legislation_people_proposals, :email, :string + add_column :legislation_people_proposals, :phone, :string + add_column :legislation_people_proposals, :twitter, :string + add_column :legislation_people_proposals, :facebook, :string + add_column :legislation_people_proposals, :instagram, :string + add_column :legislation_people_proposals, :youtube, :string + add_column :legislation_people_proposals, :website, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index ef28f3f38..bb845574e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -667,6 +667,48 @@ ActiveRecord::Schema.define(version: 20190429125842) do t.index ["status"], name: "index_legislation_draft_versions_on_status", using: :btree end + create_table "legislation_people_proposals", force: :cascade do |t| + t.integer "legislation_process_id" + t.string "title", limit: 80 + t.text "description" + t.string "question" + t.integer "author_id" + t.datetime "hidden_at" + t.integer "flags_count", default: 0 + t.datetime "ignored_flag_at" + t.integer "cached_votes_up", default: 0 + t.integer "comments_count", default: 0 + t.datetime "confirmed_hide_at" + t.bigint "hot_score", default: 0 + t.integer "confidence_score", default: 0 + t.string "responsible_name", limit: 60 + t.text "summary" + t.string "video_url" + t.tsvector "tsv" + t.datetime "retired_at" + t.string "retired_reason" + t.text "retired_explanation" + t.integer "community_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "cached_votes_total", default: 0 + t.integer "cached_votes_down", default: 0 + t.boolean "selected" + t.boolean "validated" + t.integer "cached_votes_score", default: 0 + t.string "email" + t.string "phone" + t.string "twitter" + t.string "facebook" + t.string "instagram" + t.string "youtube" + t.string "website" + t.string "external_url" + t.integer "geozone_id" + t.index ["cached_votes_score"], name: "index_legislation_people_proposals_on_cached_votes_score", using: :btree + t.index ["geozone_id"], name: "index_legislation_people_proposals_on_geozone_id", using: :btree + end + create_table "legislation_process_translations", force: :cascade do |t| t.integer "legislation_process_id", null: false t.string "locale", null: false @@ -695,24 +737,27 @@ ActiveRecord::Schema.define(version: 20190429125842) do t.date "allegations_end_date" t.date "result_publication_date" t.datetime "hidden_at" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.text "summary" - t.boolean "debate_phase_enabled", default: false - t.boolean "allegations_phase_enabled", default: false - t.boolean "draft_publication_enabled", default: false - t.boolean "result_publication_enabled", default: false - t.boolean "published", default: true + t.boolean "debate_phase_enabled", default: false + t.boolean "allegations_phase_enabled", default: false + t.boolean "draft_publication_enabled", default: false + t.boolean "result_publication_enabled", default: false + t.boolean "published", default: true t.date "proposals_phase_start_date" t.date "proposals_phase_end_date" t.boolean "proposals_phase_enabled" t.text "proposals_description" t.date "draft_start_date" t.date "draft_end_date" - t.boolean "draft_phase_enabled", default: false - t.boolean "homepage_enabled", default: false + t.boolean "draft_phase_enabled", default: false + t.boolean "homepage_enabled", default: false t.text "background_color" t.text "font_color" + t.date "people_proposals_phase_start_date" + t.date "people_proposals_phase_end_date" + t.boolean "people_proposals_phase_enabled" t.index ["allegations_end_date"], name: "index_legislation_processes_on_allegations_end_date", using: :btree t.index ["allegations_start_date"], name: "index_legislation_processes_on_allegations_start_date", using: :btree t.index ["debate_end_date"], name: "index_legislation_processes_on_debate_end_date", using: :btree @@ -1423,10 +1468,10 @@ ActiveRecord::Schema.define(version: 20190429125842) do t.boolean "created_from_signature", default: false t.integer "failed_email_digests_count", default: 0 t.text "former_users_data_log", default: "" - t.integer "balloted_heading_id" t.boolean "public_interests", default: false t.boolean "recommended_debates", default: true t.boolean "recommended_proposals", default: true + t.integer "balloted_heading_id" t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree t.index ["email"], name: "index_users_on_email", unique: true, using: :btree t.index ["geozone_id"], name: "index_users_on_geozone_id", using: :btree diff --git a/spec/factories/legislations.rb b/spec/factories/legislations.rb index 204bc67e1..ff149c905 100644 --- a/spec/factories/legislations.rb +++ b/spec/factories/legislations.rb @@ -13,10 +13,13 @@ FactoryBot.define do allegations_end_date { Date.current + 3.days } proposals_phase_start_date { Date.current } proposals_phase_end_date { Date.current + 2.days } + people_proposals_phase_start_date { Date.current } + people_proposals_phase_end_date { Date.current + 2.days } result_publication_date { Date.current + 5.days } debate_phase_enabled true allegations_phase_enabled true proposals_phase_enabled true + people_proposals_phase_enabled true draft_publication_enabled true result_publication_enabled true published true @@ -63,6 +66,18 @@ FactoryBot.define do proposals_phase_enabled true end + trait :in_people_proposals_phase do + people_proposals_phase_start_date { Date.current - 1.day } + people_proposals_phase_end_date { Date.current + 2.days } + people_proposals_phase_enabled true + end + + trait :upcoming_people_proposals_phase do + people_proposals_phase_start_date { Date.current + 1.day } + people_proposals_phase_end_date { Date.current + 2.days } + people_proposals_phase_enabled true + end + trait :published do published true end @@ -86,15 +101,17 @@ FactoryBot.define do allegations_end_date nil proposals_phase_start_date nil proposals_phase_end_date nil + people_proposals_phase_start_date nil + people_proposals_phase_end_date nil result_publication_date nil debate_phase_enabled false allegations_phase_enabled false proposals_phase_enabled false + people_proposals_phase_enabled false draft_publication_enabled false result_publication_enabled false published true end - end factory :legislation_draft_version, class: "Legislation::DraftVersion" do @@ -162,4 +179,27 @@ LOREM_IPSUM process factory: :legislation_process author factory: :user end + + factory :legislation_people_proposal, class: "Legislation::PeopleProposal" do + sequence(:title) { |n| "People and group #{n} for a legislation" } + summary "This law should be implemented by..." + terms_of_service "1" + process factory: :legislation_process + author factory: :user + validated false + + trait :with_contact_info do + email "proposal@test.com" + website "https://proposal.io" + phone "666666666" + facebook "facebook.id" + twitter "TwitterId" + youtube "youtubechannelid" + instagram "instagramid" + end + + trait :validated do + validated true + end + end end diff --git a/spec/models/legislation/people_proposals_spec.rb b/spec/models/legislation/people_proposals_spec.rb new file mode 100644 index 000000000..c1aef7571 --- /dev/null +++ b/spec/models/legislation/people_proposals_spec.rb @@ -0,0 +1,108 @@ +require "rails_helper" + +describe Legislation::PeopleProposal do + let(:people_proposal) { build(:legislation_people_proposal) } + + it "is valid" do + expect(people_proposal).to be_valid + end + + it "is not valid without a process" do + people_proposal.process = nil + expect(people_proposal).not_to be_valid + end + + it "is not valid without an author" do + people_proposal.author = nil + expect(people_proposal).not_to be_valid + end + + it "is not valid without a title" do + people_proposal.title = nil + expect(people_proposal).not_to be_valid + end + + it "is not valid without a summary" do + people_proposal.summary = nil + expect(people_proposal).not_to be_valid + end + + describe "#hot_score" do + let(:now) { Time.current } + + it "period is correctly calculated to get exact votes per day" do + new_people_proposal = create(:legislation_people_proposal, created_at: 23.hours.ago) + 2.times { new_people_proposal.vote_by(voter: create(:user), vote: "yes") } + expect(new_people_proposal.hot_score).to be 2 + + old_people_proposal = create(:legislation_people_proposal, created_at: 25.hours.ago) + 2.times { old_people_proposal.vote_by(voter: create(:user), vote: "yes") } + expect(old_people_proposal.hot_score).to be 1 + + older_people_proposal = create(:legislation_people_proposal, created_at: 49.hours.ago) + 3.times { older_people_proposal.vote_by(voter: create(:user), vote: "yes") } + expect(old_people_proposal.hot_score).to be 1 + end + + it "remains the same for not voted people_proposals" do + new = create(:legislation_people_proposal, created_at: now) + old = create(:legislation_people_proposal, created_at: 1.day.ago) + older = create(:legislation_people_proposal, created_at: 2.month.ago) + expect(new.hot_score).to be 0 + expect(old.hot_score).to be 0 + expect(older.hot_score).to be 0 + end + + it "increases for people_proposals with more positive votes" do + more_positive_votes = create(:legislation_people_proposal) + 2.times { more_positive_votes.vote_by(voter: create(:user), vote: "yes") } + + less_positive_votes = create(:legislation_people_proposal) + less_positive_votes.vote_by(voter: create(:user), vote: "yes") + + expect(more_positive_votes.hot_score).to be > less_positive_votes.hot_score + end + + it "increases for people_proposals with the same amount of positive votes within less days" do + newer_people_proposal = create(:legislation_people_proposal, created_at: now) + 5.times { newer_people_proposal.vote_by(voter: create(:user), vote: "yes") } + + older_people_proposal = create(:legislation_people_proposal, created_at: 1.day.ago) + 5.times { older_people_proposal.vote_by(voter: create(:user), vote: "yes") } + + expect(newer_people_proposal.hot_score).to be > older_people_proposal.hot_score + end + + it "increases for people_proposals voted within the period (last month by default)" do + newer_people_proposal = create(:legislation_people_proposal, created_at: 2.months.ago) + 20.times { create(:vote, votable: newer_people_proposal, created_at: 3.days.ago) } + + older_people_proposal = create(:legislation_people_proposal, created_at: 2.months.ago) + 20.times { create(:vote, votable: older_people_proposal, created_at: 40.days.ago) } + + expect(newer_people_proposal.hot_score).to be > older_people_proposal.hot_score + end + + describe "actions which affect it" do + + let(:people_proposal) { create(:legislation_people_proposal) } + + before do + 5.times { people_proposal.vote_by(voter: create(:user), vote: "yes") } + 2.times { people_proposal.vote_by(voter: create(:user), vote: "no") } + end + + it "increases with positive votes" do + previous = people_proposal.hot_score + 3.times { people_proposal.vote_by(voter: create(:user), vote: "yes") } + expect(previous).to be < people_proposal.hot_score + end + + it "decreases with negative votes" do + previous = people_proposal.hot_score + 3.times { people_proposal.vote_by(voter: create(:user), vote: "no") } + expect(previous).to be > people_proposal.hot_score + end + end + end +end From 744824e26fdec15911e97b19d11268ffb3dd7f09 Mon Sep 17 00:00:00 2001 From: voodoorai2000 Date: Thu, 6 Jun 2019 11:04:46 +0200 Subject: [PATCH 2/6] Remove deprecated reference to documentable method We have done a little refactoring of documents. Now document settings are part of the admin interface[1]. [1] https://github.com/consul/consul/pull/3585/ --- app/models/legislation/people_proposal.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/models/legislation/people_proposal.rb b/app/models/legislation/people_proposal.rb index 290ab72f3..ffb5a41b4 100644 --- a/app/models/legislation/people_proposal.rb +++ b/app/models/legislation/people_proposal.rb @@ -14,9 +14,6 @@ class Legislation::PeopleProposal < ActiveRecord::Base include Imageable include Randomizable - documentable max_documents_allowed: 3, - max_file_size: 3.megabytes, - accepted_content_types: [ "application/pdf" ] accepts_nested_attributes_for :documents, allow_destroy: true acts_as_votable From f190edacbd39f507731ffcbc37a582731157b60b Mon Sep 17 00:00:00 2001 From: voodoorai2000 Date: Fri, 7 Jun 2019 12:28:23 +0200 Subject: [PATCH 3/6] Use Rails 5 ApplicationRecord instead of ActiveRecord::Base --- app/models/legislation/people_proposal.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/legislation/people_proposal.rb b/app/models/legislation/people_proposal.rb index ffb5a41b4..3b9c3d5b7 100644 --- a/app/models/legislation/people_proposal.rb +++ b/app/models/legislation/people_proposal.rb @@ -1,4 +1,4 @@ -class Legislation::PeopleProposal < ActiveRecord::Base +class Legislation::PeopleProposal < ApplicationRecord include ActsAsParanoidAliases include Flaggable include Taggable From 18cef27b8de9bf2a5dc16582ab32e9b7ab97aa98 Mon Sep 17 00:00:00 2001 From: voodoorai2000 Date: Fri, 7 Jun 2019 12:28:40 +0200 Subject: [PATCH 4/6] Add missing geozone relation --- app/models/legislation/people_proposal.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/legislation/people_proposal.rb b/app/models/legislation/people_proposal.rb index 3b9c3d5b7..473f00b2e 100644 --- a/app/models/legislation/people_proposal.rb +++ b/app/models/legislation/people_proposal.rb @@ -21,6 +21,7 @@ class Legislation::PeopleProposal < ApplicationRecord belongs_to :process, class_name: "Legislation::Process", foreign_key: "legislation_process_id" belongs_to :author, -> { with_hidden }, class_name: "User", foreign_key: "author_id" + belongs_to :geozone has_many :comments, as: :commentable validates :title, presence: true From 5699da671c021b966b0e14104c5fae12037d789e Mon Sep 17 00:00:00 2001 From: voodoorai2000 Date: Fri, 7 Jun 2019 12:28:55 +0200 Subject: [PATCH 5/6] Remove obsolete question attribute --- app/models/legislation/people_proposal.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/models/legislation/people_proposal.rb b/app/models/legislation/people_proposal.rb index 473f00b2e..0381872ed 100644 --- a/app/models/legislation/people_proposal.rb +++ b/app/models/legislation/people_proposal.rb @@ -58,7 +58,6 @@ class Legislation::PeopleProposal < ApplicationRecord def searchable_values { title => "A", - question => "B", author.username => "B", tag_list.join(" ") => "B", summary => "C", From d9cc72608576f53f123375894402c72a6a37d747 Mon Sep 17 00:00:00 2001 From: voodoorai2000 Date: Fri, 7 Jun 2019 12:29:30 +0200 Subject: [PATCH 6/6] Add setting for max votes to edit a people proposal --- app/models/setting.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/setting.rb b/app/models/setting.rb index e538c958a..6e87816dc 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -137,6 +137,7 @@ class Setting < ApplicationRecord "max_ratio_anon_votes_on_debates": 50, "max_votes_for_debate_edit": 1000, "max_votes_for_proposal_edit": 1000, + "max_votes_for_people_proposal_edit": 1000, "comments_body_max_length": 1000, "proposal_code_prefix": "CONSUL", "votes_for_proposal_success": 10000,