diff --git a/app/controllers/users/confirmations_controller.rb b/app/controllers/users/confirmations_controller.rb index e4ababb7d..04a028232 100644 --- a/app/controllers/users/confirmations_controller.rb +++ b/app/controllers/users/confirmations_controller.rb @@ -53,7 +53,7 @@ class Users::ConfirmationsController < Devise::ConfirmationsController private def set_official_position - resource.add_official_position! (Setting.value_for 'official_level_1_name'), 1 + resource.add_official_position! (Setting['official_level_1_name']), 1 end end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index faf9b2302..2e4ab08f3 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -7,7 +7,7 @@ module AdminHelper def official_level_options options = [["",0]] (1..5).each do |i| - options << [[t("admin.officials.level_#{i}"), Setting.value_for("official_level_#{i}_name")].compact.join(': '), i] + options << [[t("admin.officials.level_#{i}"), Setting["official_level_#{i}_name"]].compact.join(': '), i] end options end diff --git a/app/models/debate.rb b/app/models/debate.rb index 7b264d036..670f28e87 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -75,7 +75,7 @@ class Debate < ActiveRecord::Base end def editable? - total_votes <= Setting.value_for('max_votes_for_debate_edit').to_i + total_votes <= Setting['max_votes_for_debate_edit'].to_i end def editable_by?(user) @@ -93,8 +93,8 @@ class Debate < ActiveRecord::Base return false unless user total_votes <= 100 || !user.unverified? || - Setting.value_for('max_ratio_anon_votes_on_debates').to_i == 100 || - anonymous_votes_ratio < Setting.value_for('max_ratio_anon_votes_on_debates').to_i || + Setting['max_ratio_anon_votes_on_debates'].to_i == 100 || + anonymous_votes_ratio < Setting['max_ratio_anon_votes_on_debates'].to_i || user.voted_for?(self) end diff --git a/app/models/proposal.rb b/app/models/proposal.rb index 86d063a36..179f97a79 100644 --- a/app/models/proposal.rb +++ b/app/models/proposal.rb @@ -80,7 +80,7 @@ class Proposal < ActiveRecord::Base end def editable? - total_votes <= Setting.value_for("max_votes_for_proposal_edit").to_i + total_votes <= Setting["max_votes_for_proposal_edit"].to_i end def editable_by?(user) @@ -98,7 +98,7 @@ class Proposal < ActiveRecord::Base end def code - "#{Setting.value_for("proposal_code_prefix")}-#{created_at.strftime('%Y-%m')}-#{id}" + "#{Setting["proposal_code_prefix"]}-#{created_at.strftime('%Y-%m')}-#{id}" end def after_commented @@ -129,7 +129,7 @@ class Proposal < ActiveRecord::Base end def self.votes_needed_for_success - Setting.value_for('votes_for_proposal_success').to_i + Setting['votes_for_proposal_success'].to_i end protected diff --git a/app/models/setting.rb b/app/models/setting.rb index 2d0926418..9cf6fa3a2 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -3,7 +3,16 @@ class Setting < ActiveRecord::Base default_scope { order(id: :asc) } - def self.value_for(key) - where(key: key).pluck(:value).first + class << self + def [](key) + where(key: key).pluck(:value).first + end + + def []=(key, value) + setting = where(key: key).first || new(key: key) + setting.value = value + setting.save! + value + end end -end \ No newline at end of file +end diff --git a/app/models/user.rb b/app/models/user.rb index 276598bf2..070af3840 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -202,7 +202,7 @@ class User < ActiveRecord::Base end def has_official_email? - domain = Setting.value_for 'email_domain_for_officials' + domain = Setting['email_domain_for_officials'] !email.blank? && ( (email.end_with? "@#{domain}") || (email.end_with? ".#{domain}") ) end diff --git a/app/views/layouts/_admin_header.html.erb b/app/views/layouts/_admin_header.html.erb index 7dcdabc77..797797aa6 100644 --- a/app/views/layouts/_admin_header.html.erb +++ b/app/views/layouts/_admin_header.html.erb @@ -11,7 +11,7 @@
  • <%= link_to root_path do %> <%= image_tag('header_logo_madrid.png', class: 'left', size: '96x96', alt: t("layouts.header.logo")) %> - <%= t("layouts.header.participation_html") %> | <%= t("admin.dashboard.index.title") %> + <%= Setting['org_name'] %> | <%= t("admin.dashboard.index.title") %> <% end %>
  • diff --git a/app/views/layouts/_footer.html.erb b/app/views/layouts/_footer.html.erb index 6f1bd3f81..d7c31d6da 100644 --- a/app/views/layouts/_footer.html.erb +++ b/app/views/layouts/_footer.html.erb @@ -53,21 +53,29 @@
    - <%= link_to "https://twitter.com/abriendomadrid", target: "_blank", title: t("social.twitter") do %> - <%= t("social.twitter") %> - + <% if Setting['twitter_handle'] %> + <%= link_to "https://twitter.com/#{Setting['twitter_handle']}", target: "_blank", title: t("social.twitter") do %> + <%= t("social.twitter") %> + + <% end %> <% end %> - <%= link_to "https://www.facebook.com/Abriendo-Madrid-1475577616080350/", target: "_blank", title: t("social.facebook") do %> - <%= t("social.facebook") %> - + <% if Setting['facebook_handle'] %> + <%= link_to "https://www.facebook.com/#{Setting['facebook_handle']}/", target: "_blank", title: t("social.facebook") do %> + <%= t("social.facebook") %> + + <% end %> <% end %> - <%= link_to "/blog", target: "_blank", title: t("social.blog") do %> - <%= t("social.blog") %> - + <% if Setting['blog_url'] %> + <%= link_to Setting['blog_url'], target: "_blank", title: t("social.blog") do %> + <%= t("social.blog") %> + + <% end %> <% end %> - <%= link_to "https://www.youtube.com/channel/UCFmaChI9quIY7lwHplnacfg", target: "_blank", title: t("social.youtube") do %> - <%= t("social.youtube") %> - + <% if Setting['youtube_handle'] %> + <%= link_to "https://www.youtube.com/#{Setting['youtube_handle']}", target: "_blank", title: t("social.youtube") do %> + <%= t("social.youtube") %> + + <% end %> <% end %>
    diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index a48ff8dbd..75e41c192 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -3,7 +3,7 @@
    <%= render "shared/locale_switcher" %> @@ -21,7 +21,7 @@ <%= t("layouts.header.open_gov", open: "#{t('layouts.header.open')}") %> | <%= t("layouts.header.open_data") %> <% else %> - <%= t("layouts.header.participation_html") %> + <%= Setting['org_name'] %> <% end %> <% end %> @@ -39,9 +39,11 @@ <%= link_to t("layouts.header.proposals"), proposals_path, class: ("active" if controller_name == "proposals") %> <%= link_to t("layouts.header.spending_proposals"), spending_proposals_path, class: ("active" if controller_name == "spending_proposals") %> <%= link_to t("layouts.header.more_information"), page_path('more_information'), class: ("active" if current_page?("/more_information")) %> - <%= link_to t("layouts.header.external_link_blog_url"), target: "_blank" do %> - <%= t("layouts.header.external_link_blog") %> - + <% if Setting['blog_url'] %> + <%= link_to Setting['blog_url'], target: "_blank" do %> + <%= t("layouts.header.external_link_blog") %> + + <% end %> <% end %>
    diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a03649616..c0050e107 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -4,7 +4,7 @@ - <%= content_for?(:title) ? yield(:title) : "Gobierno abierto" %> + <%= content_for?(:title) ? yield(:title) : Setting['org_name'] %> <%= stylesheet_link_tag "application" %> <%= javascript_include_tag "vendor/modernizr" %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> @@ -16,7 +16,7 @@ type: "image/png" %> <%= content_for :social_media_meta_tags %> - <%= Setting.value_for(:per_page_code).try(:html_safe) %> + <%= Setting['per_page_code'].try(:html_safe) %> diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb index 015afafc9..94fc4d231 100644 --- a/app/views/layouts/mailer.html.erb +++ b/app/views/layouts/mailer.html.erb @@ -14,7 +14,7 @@ - <%= image_tag('logo_email_gobierno_abierto.png', style: "border: 0; display: block; width: 100%;max-width: 370px", alt: "Ayuntamiento de Madrid - Participación ciudadana, transparencia y gobierno abierto") %> + <%= image_tag('logo_email_gobierno_abierto.png', style: "border: 0; display: block; width: 100%;max-width: 370px", alt: Setting['org_name']) %> @@ -31,7 +31,7 @@

    - Ayuntamiento de Madrid

    + <%= Setting['org_name'] %>

    diff --git a/app/views/layouts/management.html.erb b/app/views/layouts/management.html.erb index d2bf19a84..31d674ec4 100644 --- a/app/views/layouts/management.html.erb +++ b/app/views/layouts/management.html.erb @@ -29,7 +29,7 @@
  • <%= link_to management_root_path do %> <%= image_tag('header_logo_madrid.png', class: 'left', size: '96x96') %> - <%= t("layouts.header.participation_html") %> | <%= t("management.dashboard.index.title") %> + <%= Setting['org_name'] %> | <%= t("management.dashboard.index.title") %> <% end %>
  • diff --git a/app/views/proposals/_featured_votes.html.erb b/app/views/proposals/_featured_votes.html.erb index bda617e96..e828b7fb5 100644 --- a/app/views/proposals/_featured_votes.html.erb +++ b/app/views/proposals/_featured_votes.html.erb @@ -35,8 +35,10 @@ <% end %> <% if voted_for?(@featured_proposals_votes, proposal) %> -
    - <%= social_share_button_tag(proposal.title, url: proposal_url(proposal), via: "AbriendoMadrid") %> -
    + <% if Setting['twitter_handle'] %> +
    + <%= social_share_button_tag(proposal.title, url: proposal_url(proposal), via: Setting['twitter_handle']) %> +
    + <% end %> <% end %> -
    \ No newline at end of file + diff --git a/app/views/proposals/_votes.html.erb b/app/views/proposals/_votes.html.erb index 7d0116599..9a7c18dce 100644 --- a/app/views/proposals/_votes.html.erb +++ b/app/views/proposals/_votes.html.erb @@ -51,9 +51,9 @@ <% end %> - <% if voted_for?(@proposal_votes, proposal) %> + <% if voted_for?(@proposal_votes, proposal) && Setting['twitter_handle'] %>
    - <%= social_share_button_tag(proposal.title, url: proposal_url(proposal), via: "AbriendoMadrid") %> + <%= social_share_button_tag(proposal.title, url: proposal_url(proposal), via: Setting['twitter_handle']) %>
    <% end %> diff --git a/app/views/shared/_social_media_meta_tags.html.erb b/app/views/shared/_social_media_meta_tags.html.erb index 57d43fe2f..07dff0ed8 100644 --- a/app/views/shared/_social_media_meta_tags.html.erb +++ b/app/views/shared/_social_media_meta_tags.html.erb @@ -6,11 +6,15 @@ - - +<% if Setting['url'] %> + +<% end %> +<% if Setting['facebook_handle'] %> + +<% end %> - + - \ No newline at end of file + diff --git a/config/locales/en.yml b/config/locales/en.yml index dd62006d5..06c2be639 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -184,7 +184,6 @@ en: administration: Administration debates: Debates external_link_blog: Blog - external_link_blog_url: "/blog" external_link_opendata: Open data external_link_opendata_url: http://datos.madrid.es external_link_transparency: Transparency @@ -204,7 +203,6 @@ en: open_city_title: Love the city, and it will become a city you love. open_data: Open data open_gov: Open government - participation_html: Madrid Decide proposals: Proposals see_all: See proposals spending_proposals: Spending proposals diff --git a/config/locales/es.yml b/config/locales/es.yml index 6bcb7c4af..3a7ab7669 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -184,7 +184,6 @@ es: administration: Administrar debates: Debates external_link_blog: Blog - external_link_blog_url: "/blog" external_link_opendata: Datos abiertos external_link_opendata_url: http://datos.madrid.es external_link_transparency: Transparencia @@ -204,7 +203,6 @@ es: open_city_title: La ciudad que quieres será la ciudad que quieras. open_data: Datos abiertos open_gov: Gobierno %{open} - participation_html: Madrid Decide proposals: Propuestas see_all: Ver propuestas spending_proposals: Presupuestos ciudadanos diff --git a/db/seeds.rb b/db/seeds.rb index d6295d0a8..c8c0351de 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,3 +1,4 @@ +# coding: utf-8 # Default admin user (change password after first deploy to a server!) if Administrator.count == 0 && !Rails.env.test? admin = User.create!(username: 'admin', email: 'admin@madrid.es', password: '12345678', password_confirmation: '12345678', confirmed_at: Time.now, terms_of_service: "1") @@ -6,30 +7,45 @@ end # Names for the moderation console, as a hint for moderators # to know better how to assign users with official positions -Setting.create(key: 'official_level_1_name', value: 'Empleados públicos') -Setting.create(key: 'official_level_2_name', value: 'Organización Municipal') -Setting.create(key: 'official_level_3_name', value: 'Directores generales') -Setting.create(key: 'official_level_4_name', value: 'Concejales') -Setting.create(key: 'official_level_5_name', value: 'Alcaldesa') +Setting["official_level_1_name"] = "Empleados públicos" +Setting["official_level_2_name"] = "Organización Municipal" +Setting["official_level_3_name"] = "Directores generales" +Setting["official_level_4_name"] = "Concejales" +Setting["official_level_5_name"] = "Alcaldesa" # Max percentage of allowed anonymous votes on a debate -Setting.create(key: 'max_ratio_anon_votes_on_debates', value: '50') +Setting["max_ratio_anon_votes_on_debates"] = 50 # Max votes where a debate is still editable -Setting.create(key: 'max_votes_for_debate_edit', value: '1000') +Setting["max_votes_for_debate_edit"] = 1000 # Max votes where a proposal is still editable -Setting.create(key: 'max_votes_for_proposal_edit', value: '1000') +Setting["max_votes_for_proposal_edit"] = 1000 # Prefix for the Proposal codes -Setting.create(key: 'proposal_code_prefix', value: 'MAD') +Setting["proposal_code_prefix"] = 'MAD' # Number of votes needed for proposal success -Setting.create(key: 'votes_for_proposal_success', value: '53726') +Setting["votes_for_proposal_success"] = 53726 # Users with this email domain will automatically be marked as level 1 officials # Emails under the domain's subdomains will also be included -Setting.create(key: 'email_domain_for_officials', value: '') +Setting["email_domain_for_officials"] = '' # Code to be included at the top (header) of every page (useful for tracking) -Setting.create(key: 'per_page_code', value: '') +Setting['per_page_code'] = '' + +# Social settings +Setting["twitter_handle"] = nil +Setting["facebook_handle"] = nil +Setting["youtube_handle"] = nil +Setting["blog_url"] = nil + +# Public-facing URL of the app. +Setting["url"] = "http://example.com" + +# Consul installation's organization name +Setting["org_name"] = "Consul" + +# Consul installation place name (City, Country...) +Setting["place_name"] = "Consul-land" diff --git a/lib/tasks/users.rake b/lib/tasks/users.rake index 7f82979f0..1094f329b 100644 --- a/lib/tasks/users.rake +++ b/lib/tasks/users.rake @@ -7,7 +7,7 @@ namespace :users do desc "Assigns official level to users with the officials' email domain" task check_for_official_emails: :environment do - domain = Setting.value_for 'email_domain_for_officials' + domain = Setting['email_domain_for_officials'] # We end the task if there is no email domain configured if !domain.blank? @@ -15,7 +15,7 @@ namespace :users do # The real check will be done by check_if_official_email, however. User.where('official_level = 0 and email like ?', "%#{domain}").find_each do |user| if user.has_official_email? - user.add_official_position! (Setting.value_for 'official_level_1_name'), 1 + user.add_official_position! (Setting['official_level_1_name']), 1 puts "#{user.username} (#{user.email}) is now a level-1 official." end end diff --git a/spec/controllers/debates_controller_spec.rb b/spec/controllers/debates_controller_spec.rb index b5d46abac..85bf9bd1c 100644 --- a/spec/controllers/debates_controller_spec.rb +++ b/spec/controllers/debates_controller_spec.rb @@ -24,7 +24,7 @@ describe DebatesController do describe "Vote with too many anonymous votes" do it 'should allow vote if user is allowed' do - Setting.find_by(key: "max_ratio_anon_votes_on_debates").update(value: 100) + Setting["max_ratio_anon_votes_on_debates"] = 100 debate = create(:debate) sign_in create(:user) @@ -34,7 +34,7 @@ describe DebatesController do end it 'should not allow vote if user is not allowed' do - Setting.find_by(key: "max_ratio_anon_votes_on_debates").update(value: 0) + Setting["max_ratio_anon_votes_on_debates"] = 0 debate = create(:debate, cached_votes_total: 1000) sign_in create(:user) diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 6ef03d06e..db3e721b4 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -1,3 +1,4 @@ +# coding: utf-8 require 'rails_helper' feature 'Debates' do @@ -255,7 +256,7 @@ feature 'Debates' do scenario 'Update should not be posible if debate is not editable' do debate = create(:debate) - Setting.find_by(key: "max_votes_for_debate_edit").update(value: 2) + Setting["max_votes_for_debate_edit"] = 2 3.times { create(:vote, votable: debate) } expect(debate).to_not be_editable diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index e6938a432..2350f427d 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -1,3 +1,4 @@ +# coding: utf-8 require 'rails_helper' feature 'Proposals' do @@ -342,7 +343,7 @@ feature 'Proposals' do scenario 'Update should not be posible if proposal is not editable' do proposal = create(:proposal) - Setting.find_by(key: "max_votes_for_proposal_edit").update(value: 10) + Setting["max_votes_for_proposal_edit"] = 10 11.times { create(:vote, votable: proposal) } expect(proposal).to_not be_editable diff --git a/spec/features/votes_spec.rb b/spec/features/votes_spec.rb index 776cfabb4..986f643e0 100644 --- a/spec/features/votes_spec.rb +++ b/spec/features/votes_spec.rb @@ -304,7 +304,7 @@ feature 'Votes' do user = create(:user) debate = create(:debate) - Setting.find_by(key: "max_ratio_anon_votes_on_debates").update(value: 50) + Setting["max_ratio_anon_votes_on_debates"] = 50 debate.update(cached_anonymous_votes_total: 520, cached_votes_total: 1000) login_as(user) diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb index 6be6b0ac9..83129485b 100644 --- a/spec/models/debate_spec.rb +++ b/spec/models/debate_spec.rb @@ -1,3 +1,4 @@ +# coding: utf-8 require 'rails_helper' describe Debate do @@ -82,7 +83,7 @@ describe Debate do describe "#editable?" do let(:debate) { create(:debate) } - before(:each) { Setting.find_by(key: "max_votes_for_debate_edit").update(value: 3) } + before(:each) { Setting["max_votes_for_debate_edit"] = 3 } it "should be true if debate has no votes yet" do expect(debate.total_votes).to eq(0) @@ -104,7 +105,7 @@ describe Debate do describe "#editable_by?" do let(:debate) { create(:debate) } - before(:each) { Setting.find_by(key: "max_votes_for_debate_edit").update(value: 1) } + before(:each) { Setting["max_votes_for_debate_edit"] = 1 } it "should be true if user is the author and debate is editable" do expect(debate.editable_by?(debate.author)).to be true @@ -124,7 +125,7 @@ describe Debate do let(:debate) { create(:debate) } before(:each) do - Setting.find_by(key: "max_ratio_anon_votes_on_debates").update(value: 50) + Setting["max_ratio_anon_votes_on_debates"] = 50 end it "should be true for level two verified users" do @@ -160,7 +161,7 @@ describe Debate do let(:debate) { create(:debate) } before(:each) do - Setting.find_by(key: "max_ratio_anon_votes_on_debates").update(value: 50) + Setting["max_ratio_anon_votes_on_debates"] = 50 end describe "from level two verified users" do diff --git a/spec/models/proposal_spec.rb b/spec/models/proposal_spec.rb index 1a6994622..4bb198f1c 100644 --- a/spec/models/proposal_spec.rb +++ b/spec/models/proposal_spec.rb @@ -1,3 +1,4 @@ +# coding: utf-8 require 'rails_helper' describe Proposal do @@ -134,14 +135,14 @@ describe Proposal do end it "should have a code" do - Setting.find_by(key: "proposal_code_prefix").update(value: "TEST") + Setting["proposal_code_prefix"] = "TEST" proposal = create(:proposal) expect(proposal.code).to eq "TEST-#{proposal.created_at.strftime('%Y-%m')}-#{proposal.id}" end describe "#editable?" do let(:proposal) { create(:proposal) } - before(:each) {Setting.find_by(key: "max_votes_for_proposal_edit").update(value: 5)} + before(:each) {Setting["max_votes_for_proposal_edit"] = 5} it "should be true if proposal has no votes yet" do expect(proposal.total_votes).to eq(0) diff --git a/spec/models/setting_spec.rb b/spec/models/setting_spec.rb index 82ecab088..1344b0c7d 100644 --- a/spec/models/setting_spec.rb +++ b/spec/models/setting_spec.rb @@ -1,15 +1,19 @@ require 'rails_helper' describe Setting do - - it "should be accesible by key" do - create(:setting, key: "Important Setting", value: "42") - - expect(Setting.value_for("Important Setting")).to eq("42") + before do + Setting["official_level_1_name"] = 'Stormtrooper' end - it "should be nil if key does not exist" do - expect(Setting.value_for("Undefined key")).to be_nil + it "should return the overriden setting" do + expect(Setting['official_level_1_name']).to eq('Stormtrooper') end -end \ No newline at end of file + it "should should return nil" do + expect(Setting['undefined_key']).to eq(nil) + end + + it "should persist a setting on the db" do + expect(Setting.where(key: 'official_level_1_name', value: 'Stormtrooper')).to exist + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index a3327c5aa..7d44a202b 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -250,7 +250,7 @@ describe User do it "checks if the mail address has the officials domain" do # We will use empleados.madrid.es as the officials' domain # Subdomains are also accepted - Setting.find_by(key: 'email_domain_for_officials').update(value: 'officials.madrid.es') + Setting['email_domain_for_officials'] = 'officials.madrid.es' user1 = create(:user, email: "john@officials.madrid.es", confirmed_at: Time.now) user2 = create(:user, email: "john@yes.officials.madrid.es", confirmed_at: Time.now)