diff --git a/.ruby-version b/.ruby-version index 276cbf9e2..a6254504e 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.3.0 +2.3.1 \ No newline at end of file diff --git a/Capfile b/Capfile index 372653a5e..0f53b8e9a 100644 --- a/Capfile +++ b/Capfile @@ -9,7 +9,7 @@ require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' #require 'capistrano/passenger' -require 'capistrano/delayed-job' +require 'capistrano/delayed_job' require 'whenever/capistrano' # Load custom tasks from `lib/capistrano/tasks` if you have any defined diff --git a/Gemfile b/Gemfile index 50b9e37e9..2ea2eb5c4 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '4.2.6' +gem 'rails', '4.2.7' # Use PostgreSQL gem 'pg' # Use SCSS for stylesheets @@ -9,7 +9,7 @@ gem 'sass-rails', '~> 5.0', '>= 5.0.4' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # Use CoffeeScript for .coffee assets and views -gem 'coffee-rails', '~> 4.1.0' +gem 'coffee-rails', '~> 4.2.1' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'therubyracer', platforms: :ruby @@ -34,21 +34,21 @@ gem 'responders' gem 'foundation-rails' gem 'foundation_rails_helper' gem 'acts_as_votable' -gem 'ckeditor', '~> 4.1.5' -gem 'invisible_captcha', '~> 0.8.2' +gem 'ckeditor', '~> 4.2.0' +gem 'invisible_captcha', '~> 0.9.1' gem 'cancancan' -gem 'social-share-button', git: 'https://github.com/huacnlee/social-share-button.git', ref: 'e46a6a3e82b86023bc' +gem 'social-share-button' gem 'initialjs-rails', '0.2.0.1' gem 'unicorn', '~> 5.1.0' gem 'paranoia' gem 'rinku', require: 'rails_rinku' gem 'savon' gem 'dalli' -gem 'rollbar', '~> 2.11.0' +gem 'rollbar', '~> 2.12.0' gem 'delayed_job_active_record', '~> 4.1.0' gem 'daemons' gem 'devise-async' -gem 'newrelic_rpm', '~> 3.14' +gem 'newrelic_rpm', '~> 3.16' gem 'whenever', require: false gem 'pg_search' @@ -66,7 +66,7 @@ group :development, :test do # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-commands-rspec' - gem 'rspec-rails', '~> 3.3' + gem 'rspec-rails', '~> 3.5' gem 'capybara' gem 'factory_girl_rails' gem 'fuubar' @@ -74,9 +74,9 @@ group :development, :test do gem 'quiet_assets' gem 'letter_opener_web', '~> 1.3.0' gem 'i18n-tasks' - gem 'capistrano', '3.4.1', require: false + gem 'capistrano', '3.5.0', require: false gem "capistrano-bundler", '1.1.4', require: false - gem "capistrano-rails", '1.1.6', require: false + gem "capistrano-rails", '1.1.7', require: false gem "capistrano-rvm", require: false gem 'capistrano3-delayed-job', '~> 1.0' gem "bullet" @@ -92,5 +92,5 @@ end group :development do # Access an IRB console on exception pages or by using <%= console %> in views - gem 'web-console', '~> 3.0' + gem 'web-console', '3.3.0' end diff --git a/Gemfile.lock b/Gemfile.lock index b3c908001..ad24ae9ec 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,45 +1,36 @@ -GIT - remote: https://github.com/huacnlee/social-share-button.git - revision: e46a6a3e82b86023bc43b72c9379d3c6afe36b6b - ref: e46a6a3e82b86023bc - specs: - social-share-button (0.1.9) - coffee-rails - sass-rails - GEM remote: https://rubygems.org/ specs: - actionmailer (4.2.6) - actionpack (= 4.2.6) - actionview (= 4.2.6) - activejob (= 4.2.6) + actionmailer (4.2.7) + actionpack (= 4.2.7) + actionview (= 4.2.7) + activejob (= 4.2.7) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.6) - actionview (= 4.2.6) - activesupport (= 4.2.6) + actionpack (4.2.7) + actionview (= 4.2.7) + activesupport (= 4.2.7) rack (~> 1.6) rack-test (~> 0.6.2) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (4.2.6) - activesupport (= 4.2.6) + actionview (4.2.7) + activesupport (= 4.2.7) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - activejob (4.2.6) - activesupport (= 4.2.6) + activejob (4.2.7) + activesupport (= 4.2.7) globalid (>= 0.3.0) - activemodel (4.2.6) - activesupport (= 4.2.6) + activemodel (4.2.7) + activesupport (= 4.2.7) builder (~> 3.1) - activerecord (4.2.6) - activemodel (= 4.2.6) - activesupport (= 4.2.6) + activerecord (4.2.7) + activemodel (= 4.2.7) + activesupport (= 4.2.7) arel (~> 6.0) - activesupport (4.2.6) + activesupport (4.2.7) i18n (~> 0.7) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) @@ -49,7 +40,7 @@ GEM activerecord (>= 3.2, < 5) acts_as_votable (0.10.0) addressable (2.4.0) - ahoy_matey (1.4.0) + ahoy_matey (1.4.2) addressable browser (~> 2.0) geocoder @@ -57,9 +48,11 @@ GEM railties referer-parser (>= 0.3.0) request_store - safely_block + safely_block (>= 0.1.1) user_agent_parser uuidtools + airbrussh (1.0.2) + sshkit (>= 1.6.1, != 1.7.0) akami (1.3.1) gyoku (>= 0.4.0) nokogiri @@ -72,21 +65,24 @@ GEM babel-source (>= 4.0, < 6) execjs (~> 2.0) bcrypt (3.1.11) - browser (2.1.0) + browser (2.2.0) builder (3.2.2) - bullet (5.1.0) + bullet (5.1.1) activesupport (>= 3.0.0) uniform_notifier (~> 1.10.0) - byebug (9.0.4) - cancancan (1.14.0) - capistrano (3.4.1) + byebug (9.0.5) + cancancan (1.15.0) + capistrano (3.5.0) + airbrussh (>= 1.0.0) + capistrano-harrow i18n rake (>= 10.0.0) - sshkit (~> 1.3) + sshkit (>= 1.9.0) capistrano-bundler (1.1.4) capistrano (~> 3.1) sshkit (~> 1.2) - capistrano-rails (1.1.6) + capistrano-harrow (0.5.2) + capistrano-rails (1.1.7) capistrano (~> 3.1) capistrano-bundler (~> 1.1) capistrano-rvm (0.1.2) @@ -102,7 +98,7 @@ GEM rack-test (>= 0.5.4) xpath (~> 2.0) chronic (0.10.2) - ckeditor (4.1.6) + ckeditor (4.2.0) cocaine orm_adapter (~> 0.5.0) climate_control (0.0.3) @@ -110,17 +106,17 @@ GEM cliver (0.3.2) cocaine (0.5.8) climate_control (>= 0.0.3, < 1.0) - coffee-rails (4.1.1) + coffee-rails (4.2.1) coffee-script (>= 2.2.0) - railties (>= 4.0.0, < 5.1.x) + railties (>= 4.0.0, < 5.2.x) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.10.0) concurrent-ruby (1.0.2) - coveralls (0.8.13) - json (~> 1.8) - simplecov (~> 0.11.0) + coveralls (0.8.14) + json (>= 1.8, < 3) + simplecov (~> 0.12.0) term-ansicolor (~> 1.3) thor (~> 0.19.1) tins (~> 1.6.0) @@ -133,15 +129,15 @@ GEM delayed_job_active_record (4.1.1) activerecord (>= 3.0, < 5.1) delayed_job (>= 3.0, < 5) - devise (3.5.7) + devise (3.5.10) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 3.2.6, < 5) responders thread_safe (~> 0.1) warden (~> 1.2.3) - devise-async (0.10.1) - devise (~> 3.2) + devise-async (0.10.2) + devise (>= 3.2, < 4.0) diff-lcs (1.2.5) docile (1.1.5) easy_translate (0.5.0) @@ -154,33 +150,33 @@ GEM mail (~> 2.6.3) errbase (0.0.3) erubis (2.7.0) - execjs (2.6.0) + execjs (2.7.0) factory_girl (4.7.0) activesupport (>= 3.0.0) factory_girl_rails (4.7.0) factory_girl (~> 4.7.0) railties (>= 3.0.0) - faker (1.6.3) + faker (1.6.5) i18n (~> 0.5) faraday (0.9.2) multipart-post (>= 1.2, < 3) - foundation-rails (6.2.1.0) + foundation-rails (6.2.3.0) railties (>= 3.1.0) sass (>= 3.3.0, < 3.5) sprockets-es6 (>= 0.9.0) - foundation_rails_helper (1.1.0) - actionpack (~> 4.1) - activemodel (~> 4.1) - activesupport (~> 4.1) - railties (~> 4.1) + foundation_rails_helper (1.2.1) + actionpack (>= 4.1) + activemodel (>= 4.1) + activesupport (>= 4.1) + railties (>= 4.1) tzinfo (~> 1.2, >= 1.2.2) - fuubar (2.0.0) + fuubar (2.1.1) rspec (~> 3.0) ruby-progressbar (~> 1.4) - geocoder (1.3.4) + geocoder (1.3.7) globalid (0.3.6) activesupport (>= 4.1.0) - groupdate (2.5.3) + groupdate (3.0.1) activesupport (>= 3) gyoku (1.3.1) builder (>= 2.1.2) @@ -202,7 +198,7 @@ GEM terminal-table (>= 1.5.1) initialjs-rails (0.2.0.1) railties (>= 3.1, < 5.0) - invisible_captcha (0.8.2) + invisible_captcha (0.9.1) rails jquery-rails (4.1.1) rails-dom-testing (>= 1, < 3) @@ -212,7 +208,7 @@ GEM railties (>= 3.2.16) json (1.8.3) jwt (1.5.4) - kaminari (0.16.3) + kaminari (0.17.0) actionpack (>= 3.0.0) activesupport (>= 3.0.0) kgio (2.10.0) @@ -231,17 +227,18 @@ GEM mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) - mini_portile2 (2.0.0) + mini_portile2 (2.1.0) minitest (5.9.0) multi_json (1.12.1) multi_xml (0.5.5) multipart-post (2.0.0) net-scp (1.2.1) net-ssh (>= 2.6.5) - net-ssh (3.1.1) - newrelic_rpm (3.15.2.317) - nokogiri (1.6.7.2) - mini_portile2 (~> 2.0.0.rc2) + net-ssh (3.2.0) + newrelic_rpm (3.16.0.318) + nokogiri (1.6.8) + mini_portile2 (~> 2.1.0) + pkg-config (~> 1.1.7) nori (2.6.0) oauth (0.5.0) oauth2 (1.0.0) @@ -279,10 +276,10 @@ GEM activerecord (>= 3.1) activesupport (>= 3.1) arel - poltergeist (1.9.0) + pkg-config (1.1.7) + poltergeist (1.10.0) capybara (~> 2.1) cliver (~> 0.3.1) - multi_json (~> 1.0) websocket-driver (>= 0.2.0) quiet_assets (1.1.0) railties (>= 3.1, < 5.0) @@ -293,16 +290,16 @@ GEM rack rack-test (0.6.3) rack (>= 1.0) - rails (4.2.6) - actionmailer (= 4.2.6) - actionpack (= 4.2.6) - actionview (= 4.2.6) - activejob (= 4.2.6) - activemodel (= 4.2.6) - activerecord (= 4.2.6) - activesupport (= 4.2.6) + rails (4.2.7) + actionmailer (= 4.2.7) + actionpack (= 4.2.7) + actionview (= 4.2.7) + activejob (= 4.2.7) + activemodel (= 4.2.7) + activerecord (= 4.2.7) + activesupport (= 4.2.7) bundler (>= 1.3.0, < 2.0) - railties (= 4.2.6) + railties (= 4.2.7) sprockets-rails rails-deprecated_sanitizer (1.0.3) activesupport (>= 4.2.0.alpha) @@ -312,49 +309,49 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) - railties (4.2.6) - actionpack (= 4.2.6) - activesupport (= 4.2.6) + railties (4.2.7) + actionpack (= 4.2.7) + activesupport (= 4.2.7) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) raindrops (0.16.0) - rake (11.1.2) + rake (11.2.2) redcarpet (3.3.4) referer-parser (0.3.0) request_store (1.3.1) responders (2.2.0) railties (>= 4.2.0, < 5.1) rinku (2.0.0) - rollbar (2.11.3) + rollbar (2.12.0) multi_json - rspec (3.4.0) - rspec-core (~> 3.4.0) - rspec-expectations (~> 3.4.0) - rspec-mocks (~> 3.4.0) - rspec-core (3.4.4) - rspec-support (~> 3.4.0) - rspec-expectations (3.4.0) + rspec (3.5.0) + rspec-core (~> 3.5.0) + rspec-expectations (~> 3.5.0) + rspec-mocks (~> 3.5.0) + rspec-core (3.5.1) + rspec-support (~> 3.5.0) + rspec-expectations (3.5.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.4.0) - rspec-mocks (3.4.1) + rspec-support (~> 3.5.0) + rspec-mocks (3.5.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.4.0) - rspec-rails (3.4.2) - actionpack (>= 3.0, < 4.3) - activesupport (>= 3.0, < 4.3) - railties (>= 3.0, < 4.3) - rspec-core (~> 3.4.0) - rspec-expectations (~> 3.4.0) - rspec-mocks (~> 3.4.0) - rspec-support (~> 3.4.0) - rspec-support (3.4.1) - ruby-progressbar (1.7.5) + rspec-support (~> 3.5.0) + rspec-rails (3.5.1) + actionpack (>= 3.0) + activesupport (>= 3.0) + railties (>= 3.0) + rspec-core (~> 3.5.0) + rspec-expectations (~> 3.5.0) + rspec-mocks (~> 3.5.0) + rspec-support (~> 3.5.0) + rspec-support (3.5.0) + ruby-progressbar (1.8.1) safe_yaml (1.0.4) - safely_block (0.1.0) + safely_block (0.1.1) errbase sass (3.4.22) - sass-rails (5.0.4) - railties (>= 4.0.0, < 5.0) + sass-rails (5.0.5) + railties (>= 4.0.0, < 6) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) @@ -367,26 +364,29 @@ GEM nokogiri (>= 1.4.0) nori (~> 2.4) wasabi (~> 3.4) - simplecov (0.11.2) + simplecov (0.12.0) docile (~> 1.1.0) - json (~> 1.8) + json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.0) - spring (1.7.1) + social-share-button (0.3.1) + coffee-rails + sass-rails + spring (1.7.2) spring-commands-rspec (1.0.4) spring (>= 0.9.1) - sprockets (3.6.0) + sprockets (3.6.3) concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-es6 (0.9.0) babel-source (>= 5.8.11) babel-transpiler sprockets (>= 3.0.0) - sprockets-rails (3.0.4) + sprockets-rails (3.1.1) actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) - sshkit (1.10.0) + sshkit (1.11.1) net-scp (>= 1.1.2) net-ssh (>= 2.8.0) term-ansicolor (1.3.2) @@ -395,7 +395,7 @@ GEM thor (0.19.1) thread (0.2.2) thread_safe (0.3.5) - tilt (2.0.4) + tilt (2.0.5) tins (1.6.0) tolk (1.9.3) rails (>= 4.0, < 4.3) @@ -421,14 +421,14 @@ GEM wasabi (3.5.0) httpi (~> 2.0) nokogiri (>= 1.4.2) - web-console (3.1.1) + web-console (3.3.0) activemodel (>= 4.2) debug_inspector railties (>= 4.2) - websocket-driver (0.6.3) + websocket-driver (0.6.4) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.2) - whenever (0.9.4) + whenever (0.9.7) chronic (>= 0.6.3) xpath (2.0.0) nokogiri (~> 1.3) @@ -445,14 +445,14 @@ DEPENDENCIES bullet byebug cancancan - capistrano (= 3.4.1) + capistrano (= 3.5.0) capistrano-bundler (= 1.1.4) - capistrano-rails (= 1.1.6) + capistrano-rails (= 1.1.7) capistrano-rvm capistrano3-delayed-job (~> 1.0) capybara - ckeditor (~> 4.1.5) - coffee-rails (~> 4.1.0) + ckeditor (~> 4.2.0) + coffee-rails (~> 4.2.1) coveralls daemons dalli @@ -469,13 +469,13 @@ DEPENDENCIES groupdate i18n-tasks initialjs-rails (= 0.2.0.1) - invisible_captcha (~> 0.8.2) + invisible_captcha (~> 0.9.1) jquery-rails jquery-ui-rails kaminari launchy letter_opener_web (~> 1.3.0) - newrelic_rpm (~> 3.14) + newrelic_rpm (~> 3.16) omniauth omniauth-facebook (~> 3.0.0) omniauth-google-oauth2 (~> 0.4.0) @@ -485,15 +485,15 @@ DEPENDENCIES pg_search poltergeist quiet_assets - rails (= 4.2.6) + rails (= 4.2.7) redcarpet responders rinku - rollbar (~> 2.11.0) - rspec-rails (~> 3.3) + rollbar (~> 2.12.0) + rspec-rails (~> 3.5) sass-rails (~> 5.0, >= 5.0.4) savon - social-share-button! + social-share-button spring spring-commands-rspec tolk @@ -501,8 +501,8 @@ DEPENDENCIES turnout uglifier (>= 1.3.0) unicorn (~> 5.1.0) - web-console (~> 3.0) + web-console (= 3.3.0) whenever BUNDLED WITH - 1.12.4 + 1.12.5 diff --git a/README.md b/README.md index ba1c6cf21..7a92401f3 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,13 @@ Citizen Participation and Open Government Application [![Build Status](https://travis-ci.org/consul/consul.svg?branch=master)](https://travis-ci.org/consul/consul) [![Code Climate](https://codeclimate.com/github/consul/consul/badges/gpa.svg)](https://codeclimate.com/github/consul/consul) [![Dependency Status](https://gemnasium.com/consul/consul.svg)](https://gemnasium.com/consul/consul) -[![Coverage Status](https://coveralls.io/repos/consul/consul/badge.svg?branch=master&service=github)](https://coveralls.io/github/consul/consul?branch=master) +[![Coverage Status](https://coveralls.io/repos/github/consul/consul/badge.svg?branch=master)](https://coveralls.io/github/consul/consul?branch=master) This is the opensource code repository of the eParticipation website originally developed for the Madrid City government eParticipation website ## Current state -Development started on [2015 July 15th](https://github.com/consul/consul/commit/8db36308379accd44b5de4f680a54c41a0cc6fc6). Code was deployed to production on 2015 september 7th to [decide.madrid.es](https://decide.madrid.es). Since then new features are added often. You can take a look at a roadmap and future features in the [open issues list](https://github.com/consul/consul/issues). - -## Roadmap - -See [ROADMAP_ES.md](ROADMAP_ES.md) +Development started on [2015 July 15th](https://github.com/consul/consul/commit/8db36308379accd44b5de4f680a54c41a0cc6fc6). Code was deployed to production on 2015 september 7th to [decide.madrid.es](https://decide.madrid.es). Since then new features are added often. You can take a look at the current features in the [docs](https://github.com/consul/consul/tree/master/doc) and future features in the [open issues list](https://github.com/consul/consul/issues). ## Tech stack @@ -58,12 +54,12 @@ bin/rspec You can use the default admin user from the seeds file: - **user:** admin@madrid.es + **user:** admin@consul.dev **pass:** 12345678 But for some actions like voting, you will need a verified user, the seeds file also includes one: - **user:** verified@madrid.es + **user:** verified@consul.dev **pass:** 12345678 ### OAuth diff --git a/README_ES.md b/README_ES.md index 455215abe..489412299 100644 --- a/README_ES.md +++ b/README_ES.md @@ -8,17 +8,13 @@ Aplicación de Participación Ciudadana y Gobierno Abierto [![Build Status](https://travis-ci.org/consul/consul.svg?branch=master)](https://travis-ci.org/consul/consul) [![Code Climate](https://codeclimate.com/github/consul/consul/badges/gpa.svg)](https://codeclimate.com/github/consul/consul) [![Dependency Status](https://gemnasium.com/consul/consul.svg)](https://gemnasium.com/consul/consul) -[![Coverage Status](https://coveralls.io/repos/consul/consul/badge.svg?branch=master&service=github)](https://coveralls.io/github/consul/consul?branch=master) +[![Coverage Status](https://coveralls.io/repos/github/consul/consul/badge.svg?branch=master)](https://coveralls.io/github/consul/consul?branch=master) Este es el repositorio de código abierto de la Aplicación de Participación Ciudadana Consul, creada originariamente por el Ayuntamiento de Madrid. ## Estado del proyecto -El desarrollo de esta aplicación comenzó el [15 de Julio de 2015](https://github.com/consul/consul/commit/8db36308379accd44b5de4f680a54c41a0cc6fc6) y el código fue puesto en producción el día 7 de Septiembre de 2015 en [decide.madrid.es](https://decide.madrid.es). Desde entonces se le añaden mejoras y funcionalidades constantemente. La evolución y futura lista de funcionalidades a implementar se pueden consultar en la lista de [tareas por hacer](https://github.com/consul/consul/issues). - -## Hoja de ruta - -Ver fichero [ROADMAP_ES.md](ROADMAP_ES.md) +El desarrollo de esta aplicación comenzó el [15 de Julio de 2015](https://github.com/consul/consul/commit/8db36308379accd44b5de4f680a54c41a0cc6fc6) y el código fue puesto en producción el día 7 de Septiembre de 2015 en [decide.madrid.es](https://decide.madrid.es). Desde entonces se le añaden mejoras y funcionalidades constantemente. Las funcionalidades actuales se pueden consultar en la [documentación](https://github.com/consul/consul/tree/master/doc) y las siguientes funcionaliades en la lista de [tareas por hacer](https://github.com/consul/consul/issues). ## Tecnología @@ -57,12 +53,12 @@ bin/rspec Puedes usar el usuario administrador por defecto del fichero seeds: - **user:** admin@madrid.es + **user:** admin@consul.dev **pass:** 12345678 Pero para ciertas acciones, como apoyar, necesitarás un usuario verificado, el fichero seeds proporciona uno: - **user:** verified@madrid.es + **user:** verified@consul.dev **pass:** 12345678 diff --git a/ROADMAP_ES.md b/ROADMAP_ES.md deleted file mode 100644 index 9e53b53c8..000000000 --- a/ROADMAP_ES.md +++ /dev/null @@ -1,26 +0,0 @@ -## Hoja de ruta - -Las necesidades y líneas de desarrollo de Consul a corto plazo se actualizan continuamente, y son añadidas como Issues https://github.com/consul/consul/issues La hoja de ruta de desarrollo a medio plazo comprende lo siguiente: - -## Debates y propuestas - -Entre las mejoras a desarrollar destacamos las siguientes: -- Búsquedas avanzadas -- Notificaciones de usuarios -- Listas de correo informativas para los usuarios -- Clasificaciones temáticas y locales -- Mejora del sistema de etiquetado -- Sistema de identificación de propuestas similares -- Mejora de algoritmos de ordenación -- Ampliación de licencias de contenidos -- Añadido de idiomas disponibles -- Universalización del código, y facilitación de adaptación a diferentes sistemas locales -- Creación de sección de procesos participativos ad-hoc - -## Presupuestos participativos - -Este espacio permitirá que una cierta cantidad de dinero se distribuya por decisión ciudadana. Para ello permitirá: recibir propuestas para este fin; que dichas propuestas sean tasadas y evaluadas por un cierto perfil de usuarios mostrando dicho trabajo junto a las mismas; mostrar las propuestas de tal forma que los usuarios verificados puedan votar un conjunto de ellas acorde con la cantidad de dinero reservada. El mecanismo contemplará mecanismos de pre-selección y selección, además de categorizaciones geográficas o temáticas de las propuestas. - -## Legislación colaborativa - -Este módulo permitirá la participación ciudadana en todas las fases de un desarrollo legislativo. Desde la propuesta y selección de los redactores y expertos de la legislación, pasando por la fase de debate y propuesta asociada a la misma (que a su vez se dividirá en espacios de debate libre y mecanismos de pregunta-respuesta), hasta la redacción colaborativa y la revisión detallada del texto creado. El módulo permitirá activar independientemente las diferentes fases del proceso, de tal forma que su uso pueda extenderse mucho más allá del caso de la redacción colaborativa. diff --git a/app/assets/images/icon_mailer_comment.png b/app/assets/images/icon_mailer_comment.png new file mode 100644 index 000000000..d3c9bff73 Binary files /dev/null and b/app/assets/images/icon_mailer_comment.png differ diff --git a/app/assets/images/icon_mailer_reply.png b/app/assets/images/icon_mailer_reply.png new file mode 100644 index 000000000..0c9159e84 Binary files /dev/null and b/app/assets/images/icon_mailer_reply.png differ diff --git a/app/assets/images/icon_mailer_share.png b/app/assets/images/icon_mailer_share.png new file mode 100644 index 000000000..f95d44141 Binary files /dev/null and b/app/assets/images/icon_mailer_share.png differ diff --git a/app/assets/javascripts/votes.js.coffee b/app/assets/javascripts/votes.js.coffee index e4223c644..030b9cf46 100644 --- a/app/assets/javascripts/votes.js.coffee +++ b/app/assets/javascripts/votes.js.coffee @@ -1,20 +1,22 @@ App.Votes = hoverize: (votes) -> - $(votes).hover -> - $("div.anonymous-votes", votes).show(); - $("div.organizations-votes", votes).show(); - $("div.not-logged", votes).show(); - $("div.no-supports-allowed", votes).show(); - $("div.logged", votes).hide(); - , -> - $("div.anonymous-votes", votes).hide(); - $("div.organizations-votes", votes).hide(); - $("div.not-logged", votes).hide(); - $("div.no-supports-allowed", votes).hide(); - $("div.logged", votes).show(); + $(document).on { + 'mouseenter focus': -> + $("div.anonymous-votes", this).show(); + $("div.organizations-votes", this).show(); + $("div.not-logged", this).show(); + $("div.no-supports-allowed", this).show(); + $("div.logged", this).hide(); + mouseleave: -> + $("div.anonymous-votes", this).hide(); + $("div.organizations-votes", this).hide(); + $("div.not-logged", this).hide(); + $("div.no-supports-allowed", this).hide(); + $("div.logged", this).show(); + }, votes initialize: -> - App.Votes.hoverize votes for votes in $("div.votes") - App.Votes.hoverize votes for votes in $("div.supports") + App.Votes.hoverize "div.votes" + App.Votes.hoverize "div.supports" false diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss index 22e7ac8de..44433938b 100644 --- a/app/assets/stylesheets/_settings.scss +++ b/app/assets/stylesheets/_settings.scss @@ -3,6 +3,7 @@ // // Table of Contents: // +// 0. Custom variables // 1. Global // 2. Breakpoints // 3. The Grid @@ -43,6 +44,70 @@ @import 'util/util'; +// 0. Custom variables +// -------------------- + +$base-font-size: rem-calc(17); +$base-line-height: rem-calc(26); +$small-font-size: rem-calc(14); +$line-height: rem-calc(24); + +$brand: #004A83; +$body: #E9E9E9; +$background: #EDEFF0; +$border: #DEE0E3; +$dark: darken($brand, 10%); + +$text: #222222; +$text-medium: #999999; +$text-light: #CCCCCC; + +$link: #2895F1; +$link-hover: #2178BF; + +$debates: #008CCF; +$votes-bg: #26AEEE; +$votes-border: #1F94CB; + +$votes-like: #7BD2A8; +$votes-like-act: #5D9E7F; +$votes-unlike: #EF8585; +$votes-unlike-act: #BD6A6A; + +$delete: #F04124; +$check: #46DB91; + +$proposals: #FFA42D; +$proposals-border: #CC8425; + +$budget: #454372; +$budget-hover: #7571BF; + +$highlight: #E7F2FC; +$featured: #FED900; + +$footer-bg: #DEE0E2; +$footer-color: #171819; +$footer-link: #454A4C; +$footer-border: #BFC1C3; + +$success-bg: #DFF0D8; +$success-border: #D6E9C6; +$color-success: #3C763D; + +$info-bg: #D9EDF7; +$info-border: #BCE8F1; +$color-info: #31708F; + +$warning-bg: #FCF8E3; +$warning-border: #FAEBCC; +$color-warning: #8A6D3B; + +$alert-bg: #F2DEDE; +$alert-border: #EBCCD1; +$color-alert: #A94442; + + // 1. Global // --------- @@ -127,7 +192,7 @@ $header-color: inherit; $header-lineheight: 1.4; $header-margin-bottom: 0.5rem; $header-text-rendering: optimizeLegibility; -$small-font-size: 80%; +$small-font-size: rem-calc(14); $header-small-font-color: $medium-gray; $paragraph-lineheight: 1.6; $paragraph-margin-bottom: 1rem; @@ -194,12 +259,12 @@ $input-error-font-weight: $global-weight-bold; $accordion-background: $white; $accordion-plusminus: true; -$accordion-item-color: foreground($accordion-background, $primary-color); +$accordion-item-color: foreground($accordion-background, $text); $accordion-item-background-hover: $light-gray; $accordion-item-padding: 1.25rem 1rem; $accordion-content-background: $white; $accordion-content-border: 1px solid $light-gray; -$accordion-content-color: foreground($accordion-background, $primary-color); +$accordion-content-color: foreground($accordion-background, $text); $accordion-content-padding: 1rem; // 8. Accordion Menu @@ -510,13 +575,13 @@ $show-header-for-stacked: false; $tab-margin: 0; $tab-background: $white; -$tab-background-active: $light-gray; -$tab-item-font-size: rem-calc(12); +$tab-background-active: $white; +$tab-item-font-size: $base-font-size; $tab-item-background-hover: $white; -$tab-item-padding: 1.25rem 1.5rem; +$tab-item-padding: $line-height/2 0; $tab-expand-max: 6; $tab-content-background: $white; -$tab-content-border: $light-gray; +$tab-content-border: $border; $tab-content-color: foreground($tab-background, $primary-color); $tab-content-padding: 1rem; @@ -563,66 +628,3 @@ $topbar-submenu-background: $topbar-background; $topbar-title-spacing: 1rem; $topbar-input-width: 200px; $topbar-unstack-breakpoint: medium; - -// 37. Custom variables -// -------------------- - -$base-font-size: rem-calc(17); -$base-line-height: rem-calc(26); -$small-font-size: rem-calc(14); -$line-height: rem-calc(24); - -$brand: #004A83; -$body: #E9E9E9; -$background: #EDEFF0; -$border: #DEE0E3; -$dark: darken($brand, 10%); - -$text: #222222; -$text-medium: #999999; -$text-light: #CCCCCC; - -$link: #2895F1; -$link-hover: #2178BF; - -$debates: #008CCF; -$votes-bg: #26AEEE; -$votes-border: #1F94CB; - -$votes-like: #7BD2A8; -$votes-like-act: #5D9E7F; -$votes-unlike: #EF8585; -$votes-unlike-act: #BD6A6A; - -$delete: #F04124; -$check: #46DB91; - -$proposals: #FFA42D; -$proposals-border: #CC8425; - -$budget: #454372; -$budget-hover: #7571BF; - -$highlight: #E7F2FC; -$featured: #FED900; - -$footer-bg: #DEE0E2; -$footer-color: #171819; -$footer-link: #454A4C; -$footer-border: #BFC1C3; - -$success-bg: #DFF0D8; -$success-border: #D6E9C6; -$color-success: #3C763D; - -$info-bg: #D9EDF7; -$info-border: #BCE8F1; -$color-info: #31708F; - -$warning-bg: #FCF8E3; -$warning-border: #FAEBCC; -$color-warning: #8A6D3B; - -$alert-bg: #F2DEDE; -$alert-border: #EBCCD1; -$color-alert: #A94442; diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss index f52045c7b..cd8241fca 100644 --- a/app/assets/stylesheets/admin.scss +++ b/app/assets/stylesheets/admin.scss @@ -34,9 +34,6 @@ body.admin { } input[type="text"], textarea { - height: 48px\9; - line-height: 48px\9; - margin-bottom: 24px\9; width: 100%; } } @@ -111,6 +108,23 @@ body.admin { padding: $line-height !important; } +@include breakpoint(medium) { + + tr { + + .on-hover-block { + display: none; + } + + &:hover .on-hover-block { + display: block; + margin: 0; + margin-top: $line-height/2; + width: 100%; + } + } +} + @include breakpoint(medium) { tr { @@ -146,8 +160,6 @@ body.admin { font-size: rem-calc(24); padding-right: rem-calc(12); padding-top: rem-calc(4); - padding-left: 12px\9 !important; - padding-right: 12px\9 !important; vertical-align: middle; } diff --git a/app/assets/stylesheets/ie.scss b/app/assets/stylesheets/ie.scss new file mode 100644 index 000000000..2c494747b --- /dev/null +++ b/app/assets/stylesheets/ie.scss @@ -0,0 +1,199 @@ +// Stylesheet for Internet Explorer +// +// Table of Contents +// 01. Global styles +// 02. Admin +// + +// 01. Global styles +// ----------------- + +*, *:before, *:after { + box-sizing: border-box !important; +} + +.show-for-medium-down, +.show-for-medium, +.show-for-small { + display: none !important; +} + +.show-for-large-up, +.hide-for-medium-down { + display: block !important; +} + +.column, .columns { + display: inline-block !important; + float: none !important; + box-sizing: border-box !important; +} + +.small-1, .row .small-1 { width: 7.33333%; } +.small-2, .row .small-2 { width: 15.66667%; } +.small-3, .row .small-3 { width: 24%; } +.small-4, .row .small-4 { width: 32.33333%; } +.small-5, .row .small-5 { width: 40.66667%; } +.small-6, .row .small-6 { width: 49%; } +.small-7, .row .small-7 { width: 57.33333%; } +.small-8, .row .small-8 { width: 65.66667%; } +.small-9, .row .small-9 { width: 74%; } +.small-10, .row .small-10 { width: 82.33333%; } +.small-11, .row .small-11 { width: 90.66667%; } +.small-12, .row .small-12 { width: 99%; } + +.medium-1, .row .medium-1 { width: 7.33333%; } +.medium-2, .row .medium-2 { width: 15.66667%; } +.medium-3, .row .medium-3 { width: 24%; } +.medium-4, .row .medium-4 { width: 32.33333%; } +.medium-5, .row .medium-5 { width: 40.66667%; } +.medium-6, .row .medium-6 { width: 49%; } +.medium-7, .row .medium-7 { width: 57.33333%; } +.medium-8, .row .medium-8 { width: 65.66667%; } +.medium-9, .row .medium-9 { width: 74%; } +.medium-10, .row .medium-10 { width: 82.33333%; } +.medium-11, .row .medium-11 { width: 90.66667%; } +.medium-12, .row .medium-12 { width: 99%; } + +.large-1, .row .large-1 { width: 7.33333%; } +.large-2, .row .large-2 { width: 15.66667%; } +.large-3, .row .large-3 { width: 24%; } +.large-4, .row .large-4 { width: 32.33333%; } +.large-5, .row .large-5 { width: 40.66667%; } +.large-6, .row .large-6 { width: 49%; } +.large-7, .row .large-7 { width: 57.33333%; } +.large-8, .row .large-8 { width: 65.66667%; } +.large-9, .row .large-9 { width: 74%; } +.large-10, .row .large-10 { width: 82.33333%; } +.large-11, .row .large-11 { width: 90.66667%; } +.large-12, .row .large-12 { width: 99%; } + +.row .small-offset-1 { margin-left: 7.33333%; } +.row .small-offset-2 { margin-left: 15.66667%; } +.row .small-offset-3 { margin-left: 24%; } +.row .small-offset-4 { margin-left: 32.33333%; } +.row .small-offset-5 { margin-left: 40.66667%; } +.row .small-offset-6 { margin-left: 49%; } +.row .small-offset-7 { margin-left: 57.33333%; } +.row .small-offset-8 { margin-left: 65.66667%; } +.row .small-offset-9 { margin-left: 74%; } +.row .small-offset-10 { margin-left: 82.33333%; } +.row .small-offset-11 { margin-left: 90.66667%; } +.row .small-offset-12 { margin-left: 99%; } + +.row .medium-offset-1 { margin-left: 7.33333%; } +.row .medium-offset-2 { margin-left: 15.66667%; } +.row .medium-offset-3 { margin-left: 24%; } +.row .medium-offset-4 { margin-left: 32.33333%; } +.row .medium-offset-5 { margin-left: 40.66667%; } +.row .medium-offset-6 { margin-left: 49%; } +.row .medium-offset-7 { margin-left: 57.33333%; } +.row .medium-offset-8 { margin-left: 65.66667%; } +.row .medium-offset-9 { margin-left: 74%; } +.row .medium-offset-10 { margin-left: 82.33333%; } +.row .medium-offset-11 { margin-left: 90.66667%; } +.row .medium-offset-12 { margin-left: 99%; } + +.row .large-offset-1 { margin-left: 7.33333%; } +.row .large-offset-2 { margin-left: 15.66667%; } +.row .large-offset-3 { margin-left: 24%; } +.row .large-offset-4 { margin-left: 32.33333%; } +.row .large-offset-5 { margin-left: 40.66667%; } +.row .large-offset-6 { margin-left: 49%; } +.row .large-offset-7 { margin-left: 57.33333%; } +.row .large-offset-8 { margin-left: 65.66667%; } +.row .large-offset-9 { margin-left: 74%; } +.row .large-offset-10 { margin-left: 82.33333%; } +.row .large-offset-11 { margin-left: 90.66667%; } +.row .large-offset-12 { margin-left: 99%; } + +.top-bar { + clear: both !important; + height: 100px !important; +} + +.locale, .external-links { + background: #002d50 !important; +} + +.locale { + float: left !important; +} + +.external-links { + color: white !important; + float: right !important; +} + +.top-bar-title, .top-bar-title a, .top-bar-title a { + display: inline-block !important; + float: none !important; +} + +.top-bar-title a { + line-height: 24px !important; + width: 100% !important; +} + +.proposal .supports { + display: inline-block !important; + margin: 0 !important; + position: inherit !important; + + &:after { + content: none !important; + } +} + +form { + + input, textarea { + height: 48px !important; + line-height: 48px !important; + margin-bottom: 24px !important; + width: 100% !important; + } + + input[type="checkbox"], + input[type="radio"] { + height: auto !important; + line-height: inherit !important; + width: auto !important; + } + + input[type="radio"] { + width: 18px !important; + } +} + +.subnavigation { + display: block; + height: 60px !important; + width: 100%; + + ul li a { + margin-left: 10px !important; + margin-right: 10px !important; + } +} + +.truncate { + background: none; +} + +// 02. Admin +// --------- + +body.admin form { + + input[type="text"], textarea { + height: 48px !important; + line-height: 48px !important; + margin-bottom: 24px !important; + } +} + +.admin-sidebar ul [class^="icon-"] { + padding-left: 12px !important; + padding-right: 12px !important; +} diff --git a/app/assets/stylesheets/layout.scss b/app/assets/stylesheets/layout.scss index b5a7ff714..b99f0300a 100644 --- a/app/assets/stylesheets/layout.scss +++ b/app/assets/stylesheets/layout.scss @@ -219,10 +219,44 @@ a { float: left; } +.tabs-content { + border: 0; +} + +.tabs { + border: { + left: 0; + right: 0; + top: 0; + }; + margin-bottom: $line-height; + + .tabs-title > a { + color: $text-medium; + margin-bottom: rem-calc(-1); + margin-right: $line-height; + + &[aria-selected='true'], + &.is-active { + color: $brand; + border-bottom: 2px solid $brand; + font-weight: bold; + } + } + + h2 { + font-size: $base-font-size; + } +} + .no-max-width { max-width: none; } +.button.float-right ~ .button.float-right { + margin: 0 $line-height/2; +} + // 02. Header // ---------- @@ -362,8 +396,6 @@ header { color: $text; display: block; font-weight: bold; - margin-left: 18px\9; - margin-right: 18px\9; width: auto; &:hover { @@ -637,24 +669,9 @@ form { font-weight: bold; } - input, textarea { - height: 48px\9; - line-height: 48px\9; - margin-bottom: 24px\9; - width: 100%\9; - } - - input[type="checkbox"], - input[type="radio"] { - height: auto\9; - line-height: inherit\9; - width: auto\9; - } - input[type="radio"] { height: $line-height !important; vertical-align: top; - width: 18px\9; + label { font-weight: normal; @@ -1068,12 +1085,13 @@ table { } } -.social-share-button-twitter { +.ssb-twitter { background: #45B0E3; + background-image: none !important; color: white; - height: $line-height*2; + height: $line-height*2 !important; position: relative; - width: $line-height*2; + width: $line-height*2 !important; &:before { content: "f"; @@ -1107,12 +1125,13 @@ table { } } -.social-share-button-facebook { +.ssb-facebook { background: #3B5998; + background-image: none !important; color: white; - height: rem-calc(48); + height: rem-calc(48) !important; position: relative; - width: rem-calc(48); + width: rem-calc(48) !important; &:before { content: "A"; @@ -1146,12 +1165,13 @@ table { } } -.social-share-button-google_plus { +.ssb-google_plus { background: #DE4C34; + background-image: none !important; color: white; - height: $line-height*2; + height: $line-height*2 !important; position: relative; - width: $line-height*2; + width: $line-height*2 !important; &:before { content: "B"; @@ -1189,7 +1209,7 @@ table { display: inline-block; } - .social-share-button-twitter { + .ssb-twitter { background: none; color: white; height: $line-height; @@ -1212,7 +1232,7 @@ table { } } - .social-share-button-facebook { + .ssb-facebook { background: none; color: white; height: rem-calc(24); @@ -1235,7 +1255,7 @@ table { } } - .social-share-button-google_plus { + .ssb-google_plus { background: none; color: white; height: rem-calc(24); @@ -1464,7 +1484,6 @@ table { .comments { background: $white; background-repeat: repeat-x; - padding-top: $line-height; padding-bottom: $line-height*4; h2 { @@ -1488,7 +1507,7 @@ table { .comment-votes { color: $text-medium; - font-size: $small-font-size; + font-size: rem-calc(14); line-height: $line-height; a { @@ -1651,7 +1670,7 @@ table { &:first-child { padding-left: $line-height*1.5; - width: 80%; + width: 75%; } &:before { diff --git a/app/assets/stylesheets/participation.scss b/app/assets/stylesheets/participation.scss index 502fe62aa..ffe08617f 100644 --- a/app/assets/stylesheets/participation.scss +++ b/app/assets/stylesheets/participation.scss @@ -715,6 +715,16 @@ } } +.more-info { + clear: both; + color: $text-medium; + font-size: $small-font-size; + + a { + color: $text-medium; + } +} + .debate { .votes { @@ -890,9 +900,9 @@ .share-supported { - .social-share-button-twitter, - .social-share-button-facebook, - .social-share-button-google_plus { + .ssb-twitter, + .ssb-facebook, + .ssb-google_plus { color: $budget; } } @@ -1006,9 +1016,9 @@ .share-supported { - .social-share-button-twitter, - .social-share-button-facebook, - .social-share-button-google_plus { + .ssb-twitter, + .ssb-facebook, + .ssb-google_plus { height: rem-calc(33); &:before { diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 9a0f89bae..c3d814b38 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -25,7 +25,7 @@ class AccountController < ApplicationController if @account.organization? params.require(:account).permit(:phone_number, :email_on_comment, :email_on_comment_reply, :newsletter, organization_attributes: [:name, :responsible_name]) else - params.require(:account).permit(:username, :public_activity, :email_on_comment, :email_on_comment_reply, :newsletter) + params.require(:account).permit(:username, :public_activity, :email_on_comment, :email_on_comment_reply, :email_on_direct_message, :email_digest, :newsletter, :official_position_badge) end end diff --git a/app/controllers/admin/stats_controller.rb b/app/controllers/admin/stats_controller.rb index abfecdd7f..7e5b902e9 100644 --- a/app/controllers/admin/stats_controller.rb +++ b/app/controllers/admin/stats_controller.rb @@ -21,6 +21,15 @@ class Admin::StatsController < Admin::BaseController @user_ids_who_voted_proposals = ActsAsVotable::Vote.where(votable_type: 'Proposal').distinct.count(:voter_id) @user_ids_who_didnt_vote_proposals = @verified_users - @user_ids_who_voted_proposals @spending_proposals = SpendingProposal.count + end + def proposal_notifications + @proposal_notifications = ProposalNotification.all + @proposals_with_notifications = @proposal_notifications.select(:proposal_id).distinct.count + end + + def direct_messages + @direct_messages = DirectMessage.count + @users_who_have_sent_message = DirectMessage.select(:sender_id).distinct.count end end diff --git a/app/controllers/concerns/feature_flags.rb b/app/controllers/concerns/feature_flags.rb index 9c96db96e..ca3cd929e 100644 --- a/app/controllers/concerns/feature_flags.rb +++ b/app/controllers/concerns/feature_flags.rb @@ -3,7 +3,7 @@ module FeatureFlags class_methods do def feature_flag(name, *options) - before_filter(*options) do + before_action(*options) do check_feature_flag(name) end end diff --git a/app/controllers/direct_messages_controller.rb b/app/controllers/direct_messages_controller.rb new file mode 100644 index 000000000..07f39d941 --- /dev/null +++ b/app/controllers/direct_messages_controller.rb @@ -0,0 +1,36 @@ +class DirectMessagesController < ApplicationController + load_and_authorize_resource + + def new + @receiver = User.find(params[:user_id]) + @direct_message = DirectMessage.new(receiver: @receiver) + end + + def create + @sender = current_user + @receiver = User.find(params[:user_id]) + + @direct_message = DirectMessage.new(parsed_params) + if @direct_message.save + Mailer.direct_message_for_receiver(@direct_message).deliver_later + Mailer.direct_message_for_sender(@direct_message).deliver_later + redirect_to [@receiver, @direct_message], notice: I18n.t("flash.actions.create.direct_message") + else + render :new + end + end + + def show + @direct_message = DirectMessage.find(params[:id]) + end + + private + + def direct_message_params + params.require(:direct_message).permit(:title, :body) + end + + def parsed_params + direct_message_params.merge(sender: @sender, receiver: @receiver) + end +end \ No newline at end of file diff --git a/app/controllers/management/proposals_controller.rb b/app/controllers/management/proposals_controller.rb index 4f6ca18c4..2ce74d6d5 100644 --- a/app/controllers/management/proposals_controller.rb +++ b/app/controllers/management/proposals_controller.rb @@ -13,6 +13,7 @@ class Management::ProposalsController < Management::BaseController def show super + @notifications = @proposal.notifications redirect_to management_proposal_path(@proposal), status: :moved_permanently if request.path != management_proposal_path(@proposal) end diff --git a/app/controllers/management/user_invites_controller.rb b/app/controllers/management/user_invites_controller.rb new file mode 100644 index 000000000..cbe3d1914 --- /dev/null +++ b/app/controllers/management/user_invites_controller.rb @@ -0,0 +1,13 @@ +class Management::UserInvitesController < Management::BaseController + + def new + end + + def create + @emails = params[:emails].split(",").map(&:strip) + @emails.each do |email| + Mailer.user_invite(email).deliver_later + end + end + +end diff --git a/app/controllers/notifications_controller.rb b/app/controllers/notifications_controller.rb index a4ec31b50..ab346e802 100644 --- a/app/controllers/notifications_controller.rb +++ b/app/controllers/notifications_controller.rb @@ -9,7 +9,7 @@ class NotificationsController < ApplicationController def show @notification = current_user.notifications.find(params[:id]) - redirect_to url_for(@notification.notifiable) + redirect_to url_for(@notification.linkable_resource) end def mark_all_as_read diff --git a/app/controllers/proposal_notifications_controller.rb b/app/controllers/proposal_notifications_controller.rb new file mode 100644 index 000000000..fc9cdf3d8 --- /dev/null +++ b/app/controllers/proposal_notifications_controller.rb @@ -0,0 +1,33 @@ +class ProposalNotificationsController < ApplicationController + load_and_authorize_resource except: [:new] + + def new + @proposal = Proposal.find(params[:proposal_id]) + @notification = ProposalNotification.new(proposal_id: @proposal.id) + authorize! :new, @notification + end + + def create + @notification = ProposalNotification.new(proposal_notification_params) + @proposal = Proposal.find(proposal_notification_params[:proposal_id]) + if @notification.save + @proposal.voters.each do |voter| + Notification.add(voter.id, @notification) + end + redirect_to @notification, notice: I18n.t("flash.actions.create.proposal_notification") + else + render :new + end + end + + def show + @notification = ProposalNotification.find(params[:id]) + end + + private + + def proposal_notification_params + params.require(:proposal_notification).permit(:title, :body, :proposal_id) + end + +end \ No newline at end of file diff --git a/app/controllers/proposals_controller.rb b/app/controllers/proposals_controller.rb index 0b350f687..578395ab3 100644 --- a/app/controllers/proposals_controller.rb +++ b/app/controllers/proposals_controller.rb @@ -2,7 +2,6 @@ class ProposalsController < ApplicationController include CommentableActions include FlagActions - before_action :parse_search_terms, only: [:index, :suggest] before_action :parse_advanced_search_terms, only: :index before_action :parse_tag_filter, only: :index @@ -22,6 +21,7 @@ class ProposalsController < ApplicationController def show super + @notifications = @proposal.notifications redirect_to proposal_path(@proposal), status: :moved_permanently if request.path != proposal_path(@proposal) end diff --git a/app/controllers/spending_proposals_controller.rb b/app/controllers/spending_proposals_controller.rb index 3f590f414..5f8b04717 100644 --- a/app/controllers/spending_proposals_controller.rb +++ b/app/controllers/spending_proposals_controller.rb @@ -1,7 +1,7 @@ class SpendingProposalsController < ApplicationController include FeatureFlags - before_action :authenticate_user!, except: [:index] + before_action :authenticate_user!, except: [:index, :show] before_action -> { flash.now[:notice] = flash[:notice].html_safe if flash[:html_safe] && flash[:notice] } load_and_authorize_resource diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index af4005e06..fbd77f184 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -3,6 +3,7 @@ class UsersController < ApplicationController load_and_authorize_resource helper_method :authorized_for_filter? + helper_method :author? helper_method :author_or_admin? def show @@ -65,8 +66,12 @@ class UsersController < ApplicationController @user.public_activity || authorized_current_user? end + def author? + @author ||= current_user && (current_user == @user) + end + def author_or_admin? - @author_or_admin ||= current_user && (current_user == @user || current_user.administrator?) + @author_or_admin ||= current_user && (author? || current_user.administrator?) end def authorized_current_user? diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c5f2e6aca..1f52f0eea 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -35,4 +35,9 @@ module ApplicationHelper } Redcarpet::Markdown.new(renderer, extensions).render(text).html_safe end + + def author_of?(authorable, user) + return false if authorable.blank? || user.blank? + authorable.author_id == user.id + end end diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index 281163380..2b907535f 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -1,6 +1,4 @@ module NotificationsHelper - def notification_action(notification) - notification.notifiable_type == "Comment" ? "replies_to" : "comments_on" - end + end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index c1f3e4bb6..1dbc5baa2 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -1,5 +1,5 @@ class ApplicationMailer < ActionMailer::Base helper :settings - default from: "participacion@madrid.es" + default from: "Consul " layout 'mailer' end diff --git a/app/mailers/mailer.rb b/app/mailers/mailer.rb index 82abbb205..ad87359af 100644 --- a/app/mailers/mailer.rb +++ b/app/mailers/mailer.rb @@ -42,6 +42,38 @@ class Mailer < ApplicationMailer end end + def direct_message_for_receiver(direct_message) + @direct_message = direct_message + @receiver = @direct_message.receiver + + with_user(@receiver) do + mail(to: @receiver.email, subject: t('mailers.direct_message_for_receiver.subject')) + end + end + + def direct_message_for_sender(direct_message) + @direct_message = direct_message + @sender = @direct_message.sender + + with_user(@sender) do + mail(to: @sender.email, subject: t('mailers.direct_message_for_sender.subject')) + end + end + + def proposal_notification_digest(user) + @notifications = user.notifications.where(notifiable_type: "ProposalNotification") + + with_user(user) do + mail(to: user.email, subject: t('mailers.proposal_notification_digest.title', org_name: Setting['org_name'])) + end + end + + def user_invite(email) + I18n.with_locale(I18n.default_locale) do + mail(to: email, subject: t('mailers.user_invite.subject', org_name: Setting["org_name"])) + end + end + private def with_user(user, &block) diff --git a/app/models/abilities/common.rb b/app/models/abilities/common.rb index 0d1bfd4b9..ca3f7f2b6 100644 --- a/app/models/abilities/common.rb +++ b/app/models/abilities/common.rb @@ -47,14 +47,19 @@ module Abilities can :vote_featured, Proposal can :vote, SpendingProposal can :create, SpendingProposal + can :create, Budget::Investment, budget: { phase: "accepting" } can :vote, Budget::Investment, budget: { phase: "selecting" } can :create, Budget::Ballot, budget: { phase: "balloting" } + + can :create, DirectMessage + can :show, DirectMessage, sender_id: user.id end + can [:create, :show], ProposalNotification, proposal: { author_id: user.id } + can :create, Annotation can [:update, :destroy], Annotation, user_id: user.id - end end end diff --git a/app/models/abilities/everyone.rb b/app/models/abilities/everyone.rb index b2d60e97b..0246afeb2 100644 --- a/app/models/abilities/everyone.rb +++ b/app/models/abilities/everyone.rb @@ -11,6 +11,7 @@ module Abilities can :read, User can [:search, :read], Annotation can [:read], Budget + can :new, DirectMessage end end end diff --git a/app/models/direct_message.rb b/app/models/direct_message.rb new file mode 100644 index 000000000..476194aea --- /dev/null +++ b/app/models/direct_message.rb @@ -0,0 +1,22 @@ +class DirectMessage < ActiveRecord::Base + belongs_to :sender, class_name: 'User', foreign_key: 'sender_id' + belongs_to :receiver, class_name: 'User', foreign_key: 'receiver_id' + + validates :title, presence: true + validates :body, presence: true + validates :sender, presence: true + validates :receiver, presence: true + validate :max_per_day + + scope :today, lambda { where('DATE(created_at) = ?', Date.today) } + + def max_per_day + return if errors.any? + max = Setting[:direct_message_max_per_day] + + if sender.direct_messages_sent.today.count >= max.to_i + errors.add(:title, I18n.t('activerecord.errors.models.direct_message.attributes.max_per_day.invalid')) + end + end + +end diff --git a/app/models/notification.rb b/app/models/notification.rb index 1cb500ccf..9695c1b01 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -21,4 +21,30 @@ class Notification < ActiveRecord::Base Notification.create!(user_id: user_id, notifiable: notifiable) end end + + def notifiable_title + case notifiable.class.name + when "ProposalNotification" + notifiable.proposal.title + when "Comment" + notifiable.commentable.title + else + notifiable.title + end + end + + def notifiable_action + case notifiable_type + when "ProposalNotification" + "proposal_notification" + when "Comment" + "replies_to" + else + "comments_on" + end + end + + def linkable_resource + notifiable.is_a?(ProposalNotification) ? notifiable.proposal : notifiable + end end \ No newline at end of file diff --git a/app/models/proposal.rb b/app/models/proposal.rb index dd310dffa..b6a8ddb26 100644 --- a/app/models/proposal.rb +++ b/app/models/proposal.rb @@ -16,6 +16,7 @@ class Proposal < ActiveRecord::Base belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id' belongs_to :geozone has_many :comments, as: :commentable + has_many :proposal_notifications validates :title, presence: true validates :question, presence: true @@ -93,6 +94,10 @@ class Proposal < ActiveRecord::Base cached_votes_up + physical_votes end + def voters + votes_for.voters + end + def editable? total_votes <= Setting["max_votes_for_proposal_edit"].to_i end @@ -146,6 +151,10 @@ class Proposal < ActiveRecord::Base Setting['votes_for_proposal_success'].to_i end + def notifications + proposal_notifications + end + protected def set_responsible_name diff --git a/app/models/proposal_notification.rb b/app/models/proposal_notification.rb new file mode 100644 index 000000000..f73264318 --- /dev/null +++ b/app/models/proposal_notification.rb @@ -0,0 +1,17 @@ +class ProposalNotification < ActiveRecord::Base + belongs_to :author, class_name: 'User', foreign_key: 'author_id' + belongs_to :proposal + + validates :title, presence: true + validates :body, presence: true + validates :proposal, presence: true + validate :minimum_interval + + def minimum_interval + return true if proposal.try(:notifications).blank? + if proposal.notifications.last.created_at > (Time.now - Setting[:proposal_notification_minimum_interval_in_days].to_i.days).to_datetime + errors.add(:title, I18n.t('activerecord.errors.models.proposal_notification.attributes.minimum_interval.invalid', interval: Setting[:proposal_notification_minimum_interval_in_days])) + end + end + +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index 4839d3ced..4bb09c4a0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,6 +23,8 @@ class User < ActiveRecord::Base has_many :spending_proposals, foreign_key: :author_id has_many :failed_census_calls has_many :notifications + has_many :direct_messages_sent, class_name: 'DirectMessage', foreign_key: :sender_id + has_many :direct_messages_received, class_name: 'DirectMessage', foreign_key: :receiver_id belongs_to :geozone validates :username, presence: true, if: :username_required? @@ -50,6 +52,7 @@ class User < ActiveRecord::Base scope :officials, -> { where("official_level > 0") } scope :for_render, -> { includes(:organization) } scope :by_document, -> (document_type, document_number) { where(document_type: document_type, document_number: document_number) } + scope :email_digest, -> { where(email_digest: true) } before_validation :clean_document_number @@ -130,6 +133,16 @@ class User < ActiveRecord::Base update official_position: nil, official_level: 0 end + def has_official_email? + domain = Setting['email_domain_for_officials'] + !email.blank? && ( (email.end_with? "@#{domain}") || (email.end_with? ".#{domain}") ) + end + + def display_official_position_badge? + return true if official_level > 1 + official_position_badge? && official_level == 1 + end + def block debates_ids = Debate.where(author_id: id).pluck(:id) comments_ids = Comment.where(user_id: id).pluck(:id) @@ -194,11 +207,6 @@ class User < ActiveRecord::Base !erased? end - def has_official_email? - domain = Setting['email_domain_for_officials'] - !email.blank? && ( (email.end_with? "@#{domain}") || (email.end_with? ".#{domain}") ) - end - def locale self[:locale] ||= I18n.default_locale.to_s end diff --git a/app/views/account/show.html.erb b/app/views/account/show.html.erb index f0d2b6abc..247aa6024 100644 --- a/app/views/account/show.html.erb +++ b/app/views/account/show.html.erb @@ -34,7 +34,9 @@
<%= f.label :public_activity do %> <%= f.check_box :public_activity, title: t('account.show.public_activity_label'), label: false %> - <%= t("account.show.public_activity_label") %> + + <%= t("account.show.public_activity_label") %> + <% end %>
@@ -43,24 +45,61 @@
<%= f.label :email_on_comment do %> <%= f.check_box :email_on_comment, title: t('account.show.email_on_comment_label'), label: false %> - <%= t("account.show.email_on_comment_label") %> + + <%= t("account.show.email_on_comment_label") %> + <% end %>
<%= f.label :email_on_comment_reply do %> <%= f.check_box :email_on_comment_reply, title: t('account.show.email_on_comment_reply_label'), label: false %> - <%= t("account.show.email_on_comment_reply_label") %> + + <%= t("account.show.email_on_comment_reply_label") %> + <% end %>
<%= f.label :email_newsletter_subscribed do %> <%= f.check_box :newsletter, title: t('account.show.subscription_to_website_newsletter_label'), label: false %> - <%= t("account.show.subscription_to_website_newsletter_label") %> + + <%= t("account.show.subscription_to_website_newsletter_label") %> + <% end %>
+
+ <%= f.label :email_digest do %> + <%= f.check_box :email_digest, title: t('account.show.email_digest_label'), label: false %> + + <%= t("account.show.email_digest_label") %> + + <% end %> +
+ +
+ <%= f.label :email_on_direct_message do %> + <%= f.check_box :email_on_direct_message, title: t('account.show.email_on_direct_message_label'), label: false %> + + <%= t("account.show.email_on_direct_message_label") %> + + <% end %> +
+ + <% if @account.official_level == 1 %> +
+ <%= f.label :official_position_badge do %> + <%= f.check_box :official_position_badge, + title: t('account.show.official_position_badge_label'), + label: false %> + + <%= t("account.show.official_position_badge_label") %> + + <% end %> +
+ <% end %> + <%= f.submit t("account.show.save_changes_submit"), class: "button" %> diff --git a/app/views/admin/comments/index.html.erb b/app/views/admin/comments/index.html.erb index 4166be938..75493857c 100644 --- a/app/views/admin/comments/index.html.erb +++ b/app/views/admin/comments/index.html.erb @@ -20,12 +20,12 @@ restore_admin_comment_path(comment, request.query_parameters), method: :put, data: { confirm: t("admin.actions.confirm") }, - class: "button hollow on-hover" %> + class: "button hollow on-hover-block" %> <% unless comment.confirmed_hide? %> <%= link_to t("admin.actions.confirm_hide"), confirm_hide_admin_comment_path(comment, request.query_parameters), method: :put, - class: "button hollow warning on-hover" %> + class: "button hollow warning on-hover-block" %> <% end %> diff --git a/app/views/admin/dashboard/index.html.erb b/app/views/admin/dashboard/index.html.erb index 0b4fad794..793b4e407 100644 --- a/app/views/admin/dashboard/index.html.erb +++ b/app/views/admin/dashboard/index.html.erb @@ -1,4 +1,4 @@ -<%= link_to t("admin.dashboard.index.back") + " " + Setting['org_name'], root_path, class: "button float-right" %> +<%= link_to t("admin.dashboard.index.back") + " " + setting['org_name'], root_path, class: "button float-right" %>

<%= t("admin.dashboard.index.title") %>

diff --git a/app/views/admin/proposals/index.html.erb b/app/views/admin/proposals/index.html.erb index cbe1e6d74..d929843b1 100644 --- a/app/views/admin/proposals/index.html.erb +++ b/app/views/admin/proposals/index.html.erb @@ -27,12 +27,12 @@ restore_admin_proposal_path(proposal, request.query_parameters), method: :put, data: { confirm: t("admin.actions.confirm") }, - class: "button hollow on-hover" %> + class: "button hollow on-hover-block" %> <% unless proposal.confirmed_hide? %> <%= link_to t("admin.actions.confirm_hide"), confirm_hide_admin_proposal_path(proposal, request.query_parameters), method: :put, - class: "button hollow warning on-hover" %> + class: "button hollow warning on-hover-block" %> <% end %> diff --git a/app/views/admin/stats/direct_messages.html.erb b/app/views/admin/stats/direct_messages.html.erb new file mode 100644 index 000000000..b87e2b3e3 --- /dev/null +++ b/app/views/admin/stats/direct_messages.html.erb @@ -0,0 +1,21 @@ +<%= render 'shared/back_link' %> + +

<%= t("admin.stats.direct_messages.title")%>

+ +
+
+
+ +
+ +
+

+ <%= t("admin.stats.direct_messages.users_who_have_sent_message") %>
+ <%= @users_who_have_sent_message %> +

+
+
+
diff --git a/app/views/admin/stats/proposal_notifications.html.erb b/app/views/admin/stats/proposal_notifications.html.erb new file mode 100644 index 000000000..51130424d --- /dev/null +++ b/app/views/admin/stats/proposal_notifications.html.erb @@ -0,0 +1,41 @@ +<%= render 'shared/back_link' %> + +

<%= t("admin.stats.proposal_notifications.title")%>

+ +
+
+
+ +
+ +
+

+ <%= t("admin.stats.proposal_notifications.proposals_with_notifications") %>
+ + <%= @proposals_with_notifications %> + +

+
+
+
+ + + + <% @proposal_notifications.each do |notification| %> + + + + <% end %> + +
+

+ <%= notification.title %> + <%= link_to notification.proposal.title, proposal_path(notification.proposal) %> +

+

<%= notification.body %>

+
diff --git a/app/views/admin/stats/show.html.erb b/app/views/admin/stats/show.html.erb index 9a9ecbfa8..ef17536c3 100644 --- a/app/views/admin/stats/show.html.erb +++ b/app/views/admin/stats/show.html.erb @@ -1,10 +1,20 @@ <% content_for :head do %> <%= javascript_include_tag "stat_graphs", 'data-turbolinks-track' => true %> <% end %> -
+
-

<%= t "admin.stats.show.stats_title" %>

+

<%= t "admin.stats.show.stats_title" %>

+ +
+ <%= link_to t("admin.stats.show.direct_messages"), + direct_messages_admin_stats_path, class: "button hollow" %> + <%= link_to t("admin.stats.show.proposal_notifications"), + proposal_notifications_admin_stats_path, class: "button hollow" %> + +
+ +
diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 0e88614c5..7b5ff4b7d 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -36,7 +36,7 @@ <%= t("comments.comment.user_deleted") %> <% else %> <%= link_to comment.user.name, user_path(comment.user) %> - <% if comment.user.official? %> + <% if comment.user.display_official_position_badge? %>  •  <%= comment.user.official_position %> diff --git a/app/views/debates/_debate.html.erb b/app/views/debates/_debate.html.erb index c9807041b..09d7d79c0 100644 --- a/app/views/debates/_debate.html.erb +++ b/app/views/debates/_debate.html.erb @@ -24,7 +24,7 @@ <%= debate.author.name %> - <% if debate.author.official? %> + <% if debate.author.display_official_position_badge? %>  •  <%= debate.author.official_position %> diff --git a/app/views/direct_messages/new.html.erb b/app/views/direct_messages/new.html.erb new file mode 100644 index 000000000..3413f26f0 --- /dev/null +++ b/app/views/direct_messages/new.html.erb @@ -0,0 +1,47 @@ +
+
+ <%= render 'shared/back_link' %> + +

+ <%= t("users.direct_messages.new.title", receiver: @receiver.name) %> +

+ + <% if not current_user %> +
+

+ <%= t("users.direct_messages.new.authenticate", + signin: link_to(t("users.direct_messages.new.signin"), new_user_session_path), + signup: link_to(t("users.direct_messages.new.signup"), new_user_registration_path)).html_safe %> +

+
+ <% elsif not @receiver.email_on_direct_message? %> +
+

+ <%= t("users.direct_messages.new.direct_messages_bloqued") %> +

+
+ <% elsif can? :create, @direct_message %> + <%= form_for [@receiver, @direct_message] do |f| %> + <%= render "shared/errors", resource: @direct_message %> + + <%= f.label :title, t("users.direct_messages.new.title_label") %> + <%= f.text_field :title, label: false %> + + <%= f.label :body, t("users.direct_messages.new.body_label") %> + <%= f.text_area :body, label: false, rows: "3" %> + +
+ <%= f.submit t("users.direct_messages.new.submit_button"), class: "button expanded" %> +
+ <% end %> + <% else %> +
+

+ <%= t("users.direct_messages.new.verified_only", + verify_account: link_to( t("users.direct_messages.new.verify_account"), + verification_path )).html_safe %> +

+
+ <% end %> +
+
diff --git a/app/views/direct_messages/show.html.erb b/app/views/direct_messages/show.html.erb new file mode 100644 index 000000000..30a771a39 --- /dev/null +++ b/app/views/direct_messages/show.html.erb @@ -0,0 +1,18 @@ +
+
+ <%= link_to user_path(@direct_message.receiver), class: "back" do %> + + <%= t("shared.back") %> + <% end %> + +
+ +
+ <%= t("users.direct_messages.show.receiver", + receiver: @direct_message.receiver.name) %> +
+ +

<%= @direct_message.title %>

+

<%= @direct_message.body %>

+
+
diff --git a/app/views/layouts/_admin_header.html.erb b/app/views/layouts/_admin_header.html.erb index 2b15faaaa..095e351d6 100644 --- a/app/views/layouts/_admin_header.html.erb +++ b/app/views/layouts/_admin_header.html.erb @@ -8,7 +8,7 @@
- <%= link_to Setting['org_name'], admin_root_path, class: "logo show-for-small-only" %> + <%= link_to setting['org_name'], admin_root_path, class: "logo show-for-small-only" %> @@ -19,7 +19,7 @@
<%= link_to admin_root_path, class: "hide-for-small-only" do %> <%= image_tag('logo_header.png', class: 'hide-for-small-only float-left', size: '80x80', alt: t("layouts.header.logo")) %> - <%= Setting['org_name'] %> + <%= setting['org_name'] %>  | <%= t("admin.dashboard.index.title") %> <% end %>
diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 16c81fb50..2ad2303f8 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -5,7 +5,7 @@
- <%= link_to Setting['org_name'], root_path, class: "logo show-for-small-only" %> + <%= link_to setting['org_name'], root_path, class: "logo show-for-small-only" %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 269764328..35f8729c8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -7,6 +7,9 @@ <%=render "layouts/tracking_data"%> <%= content_for?(:title) ? yield(:title) : setting['org_name'] %> <%= stylesheet_link_tag "application" %> + <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> <%= favicon_link_tag "favicon.ico" %> diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb index e0533ca50..f90b8e39d 100644 --- a/app/views/layouts/mailer.html.erb +++ b/app/views/layouts/mailer.html.erb @@ -32,6 +32,10 @@

<%= setting['org_name'] %>

+ +

+ <%= t('mailers.no_reply') %>

+ diff --git a/app/views/layouts/management.html.erb b/app/views/layouts/management.html.erb index 2607f1b82..8e497bf24 100644 --- a/app/views/layouts/management.html.erb +++ b/app/views/layouts/management.html.erb @@ -25,7 +25,7 @@
- <%= link_to Setting['org_name'], management_root_path, class: "logo show-for-small-only" %> + <%= link_to setting['org_name'], management_root_path, class: "logo show-for-small-only" %> @@ -36,7 +36,7 @@
<%= link_to management_root_path, class: "hide-for-small-only" do %> <%= image_tag('logo_header.png', class: 'hide-for-small-only float-left', size: '80x80', alt: t("layouts.header.logo")) %> - <%= Setting['org_name'] %> + <%= setting['org_name'] %>  | <%= t("management.dashboard.index.title") %> <% end %>
diff --git a/app/views/mailer/direct_message_for_receiver.html.erb b/app/views/mailer/direct_message_for_receiver.html.erb new file mode 100644 index 000000000..2523f3502 --- /dev/null +++ b/app/views/mailer/direct_message_for_receiver.html.erb @@ -0,0 +1,37 @@ + +

+ <%= @direct_message.title %> +

+ +

+ <%= @direct_message.body %> +

+ + + + + + + +
+ <%= link_to user_url(@direct_message.sender), style: "font-family: 'Open Sans','Helvetica Neue',arial,sans-serif; background: #f7f5f2; border-radius: 6px; color: #3d3d66!important; font-weight: bold; margin: 0px; padding: 10px 15px; text-align: center; text-decoration: none; min-width: 200px; display: inline-block;", target: "_blank" do %> + <%= image_tag('icon_mailer_reply.png', style: "border: 0; display: inline-block; width: 100%; max-width: 12px; vertical-align: sub;", alt: "") %> + <%= t('mailers.direct_message_for_receiver.reply', + sender: @direct_message.sender.name) %> + <% end %> +
+ + + + + + + +
+

+ <%= t('mailers.direct_message_for_receiver.unsubscribe', + account: link_to(t('mailers.direct_message_for_receiver.unsubscribe_account'), + account_url, style: "color: #2895F1; text-decoration: none;")).html_safe %> +

+
+ diff --git a/app/views/mailer/direct_message_for_sender.html.erb b/app/views/mailer/direct_message_for_sender.html.erb new file mode 100644 index 000000000..4cf832414 --- /dev/null +++ b/app/views/mailer/direct_message_for_sender.html.erb @@ -0,0 +1,15 @@ + + +

+ <%= t('mailers.direct_message_for_sender.title_html', + receiver: @direct_message.receiver.name ) %> +

+ +

+ <%= @direct_message.title %> +

+ +

+ <%= @direct_message.body %> +

+ diff --git a/app/views/mailer/proposal_notification_digest.html.erb b/app/views/mailer/proposal_notification_digest.html.erb new file mode 100644 index 000000000..1a0ef1468 --- /dev/null +++ b/app/views/mailer/proposal_notification_digest.html.erb @@ -0,0 +1,72 @@ + + + + + + + +
+

+ <%= t('mailers.proposal_notification_digest.title', + org_name: Setting['org_name']) %> +

+

+ <%= t('mailers.proposal_notification_digest.info', + org_name: Setting['org_name']) %> +

+
+ + <% @notifications.each do |notification| %> + + + + + + +
+

+ <%= link_to notification.notifiable.title, notification_url(notification), style: "color: #2895F1; text-decoration: none;" %> +

+

+ <%= notification.notifiable.proposal.title %> •  + <%= notification.notifiable.proposal.created_at.to_date %> •  + <%= notification.notifiable.proposal.author.name %> +

+

+ <%= notification.notifiable.body %> +

+ + + + + + + +
+ <%= link_to proposal_url(notification.notifiable.proposal, anchor: "social-share"), style: "font-family: 'Open Sans','Helvetica Neue',arial,sans-serif; background: #f7f5f2; border-radius: 6px; color: #3d3d66!important; font-weight: bold; margin: 0px; padding: 10px 15px; text-align: center; text-decoration: none; min-width: 160px; display: inline-block;" do %> + <%= image_tag('icon_mailer_share.png', style: "border: 0; display: inline-block; width: 100%; max-width: 16px", alt: "") %> + <%= t('mailers.proposal_notification_digest.share') %> + <% end %> + + <%= link_to proposal_url(notification.notifiable.proposal, anchor: "comments"), style: "font-family: 'Open Sans','Helvetica Neue',arial,sans-serif; background: #f7f5f2; border-radius: 6px; color: #3d3d66!important; font-weight: bold; margin: 0px; padding: 10px 15px; text-align: center; text-decoration: none; min-width: 160px; display: inline-block; margin-left: 12px;" do %> + <%= image_tag('icon_mailer_comment.png', style: "border: 0; display: inline-block; width: 100%; max-width: 16px; vertical-align: middle;", alt: "") %> + <%= t('mailers.proposal_notification_digest.comment') %> + <% end %> +
+
+ <% end %> + + + + + + + +
+

+ <%= t('mailers.proposal_notification_digest.unsubscribe', + account: link_to(t('mailers.proposal_notification_digest.unsubscribe_account'), + account_url, style: "color: #2895F1; text-decoration: none;")).html_safe %> +

+
+ diff --git a/app/views/mailer/user_invite.html.erb b/app/views/mailer/user_invite.html.erb new file mode 100644 index 000000000..43b95626c --- /dev/null +++ b/app/views/mailer/user_invite.html.erb @@ -0,0 +1,23 @@ + +

+ <%= t('mailers.user_invite.title', + org: Setting['org_name']) %> +

+ +

+ <%= t('mailers.user_invite.text', + org: Setting['org_name']) %> +

+ +

+ <%= link_to t('mailers.user_invite.button'), new_user_registration_url, style: "font-family: 'Open Sans','Helvetica Neue',arial,sans-serif; background: #004A83; border-radius: 6px; color: #fff !important; font-weight: bold; margin: 0px; padding: 10px 15px; text-align: center; text-decoration: none; min-width: 160px; display: inline-block; margin-left: 12px;" %> +

+ +

+ <%= t('mailers.user_invite.ignore') %> +

+ +

+ <%= t('mailers.user_invite.thanks') %> +

+ diff --git a/app/views/management/_menu.html.erb b/app/views/management/_menu.html.erb index 00e3b0516..aa154212e 100644 --- a/app/views/management/_menu.html.erb +++ b/app/views/management/_menu.html.erb @@ -1,9 +1,5 @@
    -
  • - <%= link_to t("management.menu.title"), management_root_path %> -
  • -
  • > @@ -61,5 +57,12 @@ <%= t("management.menu.print_spending_proposals") %> <% end %>
  • + +
  • + <%= link_to new_management_user_invite_path do %> + + <%= t("management.menu.user_invites") %> + <% end %> +
diff --git a/app/views/management/document_verifications/invalid_document.html.erb b/app/views/management/document_verifications/invalid_document.html.erb index 58ddb221e..4e867b8f6 100644 --- a/app/views/management/document_verifications/invalid_document.html.erb +++ b/app/views/management/document_verifications/invalid_document.html.erb @@ -12,6 +12,5 @@

<%= t("management.document_verifications.has_no_account_html", - link: link_to('http://decide.madrid.es', 'http://decide.madrid.es'), - target: "_blank") %> + link: link_to(t('management.document_verifications.link'), root_path, target: "_blank")).html_safe %>

diff --git a/app/views/management/user_invites/create.html.erb b/app/views/management/user_invites/create.html.erb new file mode 100644 index 000000000..3d573532f --- /dev/null +++ b/app/views/management/user_invites/create.html.erb @@ -0,0 +1,9 @@ +
+ <%= render 'shared/back_link' %> + +

<%= t('management.user_invites.create.title') %>

+ +
+ <%= t('management.user_invites.create.success_html', count: @emails.count) %> +
+
diff --git a/app/views/management/user_invites/new.html.erb b/app/views/management/user_invites/new.html.erb new file mode 100644 index 000000000..a49a84538 --- /dev/null +++ b/app/views/management/user_invites/new.html.erb @@ -0,0 +1,12 @@ +
+

<%= t('management.user_invites.new.title') %>

+ + <%= form_tag management_user_invites_path do %> + +

<%= t('management.user_invites.new.info') %>

+ <%= text_area_tag "emails", nil, rows: 5, placeholder: t('management.user_invites.new.info') %> +
+ +
+ <% end %> +
diff --git a/app/views/moderation/dashboard/index.html.erb b/app/views/moderation/dashboard/index.html.erb index aa214c561..acdfa954a 100644 --- a/app/views/moderation/dashboard/index.html.erb +++ b/app/views/moderation/dashboard/index.html.erb @@ -1,4 +1,4 @@ -<%= link_to t("admin.dashboard.index.back") + " " + Setting['org_name'], root_path, class: "button float-right" %> +<%= link_to t("admin.dashboard.index.back") + " " + setting['org_name'], root_path, class: "button float-right" %>

<%= t("moderation.dashboard.index.title") %>

diff --git a/app/views/notifications/_notification.html.erb b/app/views/notifications/_notification.html.erb index 28def42f7..99b4b7def 100644 --- a/app/views/notifications/_notification.html.erb +++ b/app/views/notifications/_notification.html.erb @@ -1,9 +1,13 @@
  • <%= link_to notification do %>

    - <%= t("notifications.index.#{notification_action(notification)}", count: notification.counter) %> - <%= notification.notifiable.is_a?(Comment) ? notification.notifiable.commentable.title : notification.notifiable.title %> + + <%= t("notifications.index.#{notification.notifiable_action}", + count: notification.counter) %> + + <%= notification.notifiable_title %>

    +

    <%= l notification.timestamp, format: :datetime %>

    <% end %>
  • \ No newline at end of file diff --git a/app/views/pages/conditions.html.erb b/app/views/pages/conditions.html.erb index 642881be4..fbe53c1ca 100644 --- a/app/views/pages/conditions.html.erb +++ b/app/views/pages/conditions.html.erb @@ -4,95 +4,8 @@

    <%= t("pages.conditions") %>

    -

    AVISO LEGAL SOBRE LAS CONDICIONES DE USO, PRIVACIDAD Y PROTECCIÓN DE DATOS PERSONALES DEL PORTAL DE GOBIERNO ABIERTO DEL AYUNTAMIENTO DE MADRID

    - -

    1. Ámbito de aplicación de las condiciones de uso

    -

    La participación (entendiéndola como participación activa más allá de la lectura del contenido presente) en el Portal de Gobierno Abierto del Ayuntamiento de Madrid se regula por las presentes condiciones de uso que vinculan a todas las personas que participen en este sitio web. Por ello, cualquier persona que desee participar deberá registrarse, a cuyo fin se solicitará la aceptación de estas condiciones de uso.

    -

    El Ayuntamiento de Madrid se reserva la facultad de modificar las presentes condiciones de uso para la participación en el Portal de Gobierno Abierto del Ayuntamiento de Madrid, cuya última versión se publicará en este sitio web.

    -

    La participación en el Portal de Gobierno Abierto del Ayuntamiento de Madrid se regula por las presentes condiciones de uso que vinculan a todas las personas que participen en este sitio web. Cualquier persona que desee participar deberá registrarse, a cuyo fin se solicitará la aceptación de estas condiciones de uso.

    -

    El Ayuntamiento de Madrid se reserva la facultad de modificar las presentes condiciones de uso del Portal de Gobierno Abierto del Ayuntamiento de Madrid cuya última versión se publicará en este sitio web.

    - - -

    2. Objetivo de la iniciativa

    -

    A través del Portal de Gobierno Abierto, el Ayuntamiento de Madrid quiere fomentar la participación de los ciudadanos en la gestión de la ciudad, implicándoles en la generación de ideas y propuestas novedosas y viables, con el objeto de mejorar su calidad de vida. Es una apuesta decidida por una gestión más cercana a los ciudadanos que permitirá recibir sus propuestas y además, crear canales directos de comunicación con el gobierno municipal, contribuyendo a tomar las decisiones más acertadas para el interés general.

    -

    3. Cuestiones generales sobre la participación en el Portal de Gobierno Abierto del Ayuntamiento de Madrid

    -

    Podrá participar cualquier persona física a partir de los 16 años que se haya registrado previamente en el Portal de Gobierno Abierto. Mediante la aceptación de estas condiciones de uso se declara tener 16 años o más. Los mayores de edad a cuyo cargo se encuentran los menores, son los plenos responsables de la actuación que tengan éstos en el Portal de Gobierno Abierto. No existe limitación en cuanto al número de debates, comentarios o propuestas a presentar por los participantes.

    -

    Al introducir el título de las propuestas, se recomienda escribir una descripción breve y precisa con un máximo de 2000 caracteres. Para completar la argumentación se podrán asociar documentos adjuntos o de las Redes Sociales Vimeo, Youtube, Slideshare, Flickr o SoundCloud.

    - -

    4. Obligaciones de los usuarios del Portal de Gobierno Abierto

    -

    Al ser el Ayuntamiento de Madrid un punto de encuentro cuyo objetivo es debatir, y compartir y valorar propuestas relacionadas con la mejora de la ciudad, los usuarios están obligados a hacer un uso diligente y acorde a dicho objetivo.

    -

    El Ayuntamiento de Madrid no es responsable del uso incorrecto del Portal de Gobierno Abierto por los usuarios o de los contenidos localizados en el mismo, siendo cada usuario responsable de su uso correcto y de la legalidad de los contenidos y opiniones que haya compartido.

    -

    El Ayuntamiento de Madrid se reserva, por lo tanto, el derecho a limitar el acceso al Portal de Gobierno Abierto del Ayuntamiento de Madrid de opiniones, informaciones, comentarios o documentos que los usuarios quieran incorporar, pudiendo instalar filtros a tal efecto. Todo ello se realizará únicamente mientras tenga el fin de preservar el objetivo fundamental del Portal de Gobierno Abierto.

    -

    De acuerdo a la normativa legal vigente queda prohibida la utilización del Portal de Gobierno Abierto del Ayuntamiento de Madrid con fines distintos a los de debatir, compartir y valorar propuestas, y específicamente:

    -

    Compartir cualquier contenido que pueda ser considerado como una vulneración en cualquier forma de los derechos fundamentales al honor, imagen e intimidad personal y familiar de terceros o contra la dignidad de las personas.

    -

    Compartir imágenes o fotografías que recojan imágenes o datos personales de terceros sin haber obtenido el oportuno consentimiento de sus titulares.

    -

    Compartir cualquier contenido que vulnere el secreto en las comunicaciones, la infracción de derechos de propiedad industrial e intelectual o de las normas reguladoras de la protección de datos de carácter personal.

    -

    Reproducir, distribuir, compartir contenidos, informaciones o imágenes que hayan sido puestas a disposición por otros usuarios sin la autorización expresa de estos.

    -

    Su utilización con fines de publicidad.

    -

    La realización de cualquiera de los anteriores comportamientos permitirá al Ayuntamiento de Madrid suspender temporalmente la actividad de un participante, inhabilitar su cuenta o borrar su contenido, sin perjuicio de otras responsabilidades que puedan ser reclamadas.

    -

    En caso de que el contenido introducido por los usuarios incorpore un enlace a otro sitio web, el Ayuntamiento de Madrid no será responsable por los daños o perjuicios derivados del acceso al enlace o a sus contenidos.

    -

    En caso de litigio de cualquier clase o por cualquier motivo entre los participantes en el sitio web y/o un tercero, el Ayuntamiento de Madrid quedará exento de cualquier responsabilidad por reclamaciones, demandas o daños de cualquier naturaleza relacionados o derivados del litigio.

    - -

    5. Uso del Portal de Gobierno Abierto

    -

    Los participantes podrán acceder y navegar por el Portal de Gobierno Abierto libremente y de forma anónima. Sólo cuando quieran realizar alguna acción que implique la creación, apoyo o comentario de una propuesta, o a la participación en un debate, se le solicitará que introduzca sus credenciales, para cuya obtención será necesario registrarse previamente. El registro que permitirá participar comentando en cualquiera de las secciones, creando debates o propuestas, se realizará introduciendo los siguientes datos:

    -
      -
    • Nombre de usuario
    • -
    • Correo electrónico
    • -
    • Aceptación de las condiciones de uso de el Portal de Gobierno Abierto
    • -
    -

    El Portal de Gobierno Abierto también permite la identificación mediante el usuario de Facebook, Twitter y Google+.

    -

    Para participar apoyando propuestas, al usuario se le requerirá que verifique su cuenta cumpliendo que tiene 16 años o más y está empadronado en Madrid, para lo cual se le guiará a través de una serie de pasos donde se le solicitarán datos relativos al padrón y un medio de comunicación a través del cual facilitarle uno o dos códigos seguros para completar la verificación de su cuenta (dependiendo del medio de comunicación elegido por el usuario).

    - -

    El usuario podrá interactuar con la herramienta interviniendo, al menos, de las siguientes formas:

    -

    1. DEBATES

    -

    En el apartado de debates el usuario podrá participar:

    -
      -
    • Creando un debate. Cada usuario podrá abrir uno o más debates. Los debates serán publicados automáticamente.
    • -
    • Votando de manera positiva o negativa a los debates creadas por los usuarios. Los debates aparecerán con los votos positivos y negativos recibidos. Cada usuario podrá exclusivamente votar o bien positivo o bien negativo, y una vez a un mismo debate.
    • -
    • Comentando los debates del resto de usuarios. Cada debate podrá ser comentado por el resto de usuarios.
    • -
    -

    2. PROPUESTAS

    -

    En el apartado de propuestas ciudadanas el usuario podrá participar:

    -
      -
    • Creando una propuesta. Cada usuario podrá dar de alta una o más propuestas. Las propuestas serán publicadas automáticamente.
    • -
    • Apoyando las propuestas creadas por los usuarios. Las propuestas aparecerán con el número de apoyos recibidos. Cada usuario podrá exclusivamente apoyar una vez a una misma propuesta. Cuando una propuesta reciba apoyos equivalente al 2% del padrón de personas con 16 años o más, la propuesta pasará a una fase posterior donde durante una semana se invitará a la ciudadanía a aceptarla o rechazarla como propuesta colectiva.
    • -
    • Comentando las propuestas del resto de usuarios. Cada propuesta podrá ser comentada por el resto de usuarios, pudiendo argumentar las razones del apoyo o introducir mejoras a la misma.
    • -
    - -

    6. Condiciones para el tratamiento de los contenidos proporcionados por los usuarios

    -

    Las presentes condiciones regulan los términos aplicables al contenido remitido por los usuarios de esta plataforma a través del formulario correspondiente (en adelante, el contenido). Estas condiciones se aplican tanto al contenido inicialmente remitido al Portal de Gobierno Abierto como a cualquier contenido que se envíe con posterioridad o se manifieste al Ayuntamiento de Madrid, debiendo significarse lo siguiente:

    -
      -
    • A. No Confidencialidad: Todo el contenido remitido por el usuario al Ayuntamiento de Madrid deberá ser susceptible de ser conocido por el público en general. Por lo tanto, el Ayuntamiento de Madrid tratará el citado contenido como información no confidencial.
    • -
    • B. Procedimiento: En el caso de que el Ayuntamiento de Madrid esté interesado en el contenido remitido por el usuario, se pondrá en contacto con él para solicitarle información adicional. Dicha información tendrá asimismo carácter de no confidencial, sin perjuicio de que en el caso de que las partes consideren la necesidad de intercambiarse información de carácter confidencial se firme el correspondiente Acuerdo de Confidencialidad.

      - El Ayuntamiento de Madrid se reserva el derecho de no contactar con los usuarios que le hubieran remitido el contenido. Todo ello sin perjuicio de lo establecido en el apartado relativo a "Derechos de Propiedad Intelectual e industrial".

      - En el supuesto que el Ayuntamiento de Madrid, a su entera discreción, decidiera contactar con determinados usuarios, éstos conocen y aceptan que por ello el Ayuntamiento de Madrid no adquiere compromiso alguno.
    • - -
    • C. Publicidad o difusión de los contenidos presentados: Los participantes en el Portal de Gobierno Abierto del Ayuntamiento de Madrid declaran conocer y aceptar el hecho de que la información aportada podrá ser publicada en la web www.madrid.es, así como a través de otros medios que la organización considere oportunos para dar a conocer esta iniciativa.
    • - -
    • D. No devolución material: El Ayuntamiento de Madrid carece de obligación alguna de devolver el Contenido remitido por los usuarios.
    • -
    • E. Procedimiento de aviso y retirada: El Ayuntamiento de Madrid procesará las peticiones de eliminación o retirada de contenidos que incumplan las condiciones de uso que hayan añadido los participantes. Asimismo, cualquier persona, con motivos razonados si existe incumplimiento de las presentes condiciones de uso, podrá solicitar la retirada de contenidos al Ayuntamiento de Madrid. El Ayuntamiento de Madrid se reserva el derecho de hacer las comprobaciones o verificaciones oportunas con carácter previo a la retirada de cualquier contenido.
    • -
    - -

    7. Política de privacidad y protección de datos

    -
      -
    • A. Titularidad de los derechos de propiedad intelectual e industrial: El usuario que aporta el Contenido declara, con la aceptación de las presentes Condiciones, ser titular de los derechos de propiedad intelectual y/o industrial u ostentar derechos suficientes sobre dicho contenido y que además lo remite al Ayuntamiento de Madrid de forma voluntaria para su divulgación en el Portal de Gobierno Abierto del Ayuntamiento de Madrid.

      - La titularidad de todos y cada uno de los Contenidos presentados que se encuentren protegidos o sean susceptibles de encontrarse protegidos, por el Derecho de la Propiedad Industrial e Intelectual, corresponde a los autores y/o titulares de los mencionados Contenidos.

      - El Ayuntamiento de Madrid no asume responsabilidad alguna, ya sea directa o indirecta, respecto de cualquier tipo de controversia, disputa y/o litigio que pudiera derivarse de la publicación, divulgación y/o difusión de los contenidos aportados sin el preceptivo consentimiento de sus legítimos titulares.

      - El Ayuntamiento de Madrid respetará todos los Derechos de Propiedad Intelectual o Industrial sobre el contenido remitido por los usuarios. Cualquier vulneración de los Derechos de Propiedad Intelectual o Industrial será responsabilidad de la persona que aporte el contenido.

      - El Ayuntamiento de Madrid, por la mera recepción del contenido, no recibe del usuario licencia alguna de propiedad intelectual o industrial, por lo que no hará uso del contenido salvo aceptación expresa de su titular.
    • -
    • B. Protección de datos: Los datos personales aportados por los usuarios que se registren en el Portal de Gobierno Abierto, serán incorporados y tratados en el fichero Gestión de Procesos Participativos, cuya finalidad es gestionar los procesos participativos para el control de la habilitación de las personas que participan en los mismos y recuento meramente numérico y estadístico de los resultados derivados de los procesos de participación ciudadana. Gestión de Agendas para convocatorias y envío de información solicitada. El órgano responsable del fichero es la Dirección General competente en materia de Participación Ciudadana, ante la que la persona interesada podrá ejercer los derechos de acceso, rectificación, cancelación y oposición, todo lo cual se informa en cumplimiento del artículo 5 de la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.
    • -
    - -

    Como principio general, los datos personales no serán comunicados a terceros, excepto cuando la comunicación haya sido autorizada por el usuario, o la información sea requerida por la autoridad judicial, ministerio fiscal o la policía judicial, o se de alguno de los supuestos regulados en el artículo 11 de la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.

    -
      -
    • Los derechos de acceso, rectificación, cancelación y oposición, se podrán ejercitar dirigiendo una comunicación por escrito al Ayuntamiento de Madrid, Área de Gobierno de Participación Ciudadana, Transparencia y Gobierno Abierto, Dirección General de Participación Ciudadana.
    • -
    - -

    8. Normativa aplicable

    -

    Las normas del ordenamiento jurídico español rigen de manera exclusiva estas condiciones de uso. Cualquier disputa, controversia o reclamación derivada de estas condiciones de uso, o el incumplimiento, rescisión o invalidación de estas, se resolverán exclusivamente ante los juzgados competentes.

    - -

    9. Revisión de las condiciones de uso

    -

    El Ayuntamiento de Madrid se reserva el derecho de revisar las presentes condiciones de uso y la política de privacidad en cualquier momento y por cualquier razón. En dicho caso, los usuarios registrados serán avisados a través de este espacio en línea y, si continúan utilizando el Portal de Gobierno Abierto, se entenderán aceptadas las modificaciones introducidas.

    +

    AVISO LEGAL SOBRE LAS CONDICIONES DE USO, PRIVACIDAD Y PROTECCIÓN DE DATOS PERSONALES DEL PORTAL DE GOBIERNO ABIERTO

    +

    Página de información sobre las condiciones de uso, privacidad y protección de datos personales.

    -

    Soluciones a problemas técnicos (FAQ)

    -

    Te presentamos una lista de las soluciones a los problemas y dudas técnicas más frecuentes del Portal de Gobierno Abierto. Si esto no resuelve tu problema, puedes llamar al 010 (o a su versión grauita 915298210) o acercarte a cualquiera de las 26 Oficinas de Atención al Ciudadano que tienes en Madrid.

    +

    Preguntas Frecuentes (FAQ)

    -

    No me funciona la verificación de residencia.

    -

    Comprueba las siguientes posibilidades:

    -
      -
    • ¿Has puesto el DNI o documento con todos los caracteres juntos, incluyendo la letra al final?
    • -
    • ¿Estás seguro de que estás empadronado en el municipio de Madrid? (el municipio es geográficamente más pequeño que la Comunidad de Madrid).
    • -
    • Puede que haya algún problema en el registro de empadronamiento con tus datos. Por favor llama al 010 (o a su versión grauita 915298210) y confirma que tu información de Padrón es correcta.
    • -
    • Si todo lo anterior no soluciona el problema, puedes acercarte a cualquiera de las 26 Oficinas de Atención al Ciudadano que hay por todo Madrid, y te lo resolverán en el acto.
    • -
    +

    Pregunta frecuente 1

    +

    Texto de respuesta para la pregunta frecuente 1.

    -

    No estoy empadronado en Madrid ¿por qué no puedo participar?

    -

    El apoyo y votación de propuestas está limitado a la gente empadronada en Madrid, ya que se trata de tomar decisiones que afectarán al municipio y a los que viven en él, y por tanto nos parece que son ellos los que tienen que tomar la decisión final. Es cierto que hay personas que no están empadronadas en Madrid y que aun así les pueden afectar esas decisiones, pero el Padrón es el censo más amplio del que disponemos que nos permite que el proceso de participación sea seguro y lleguemos al máximo posible de personas. No obstante, sí que es posible participar aunque no se esté empadronado. La sección de debates está abierta a todo el mundo, y también es posible lanzar una propuesta, o comentar las propuestas existentes sin necesidad de estar empadronado. Sólo la decisión sobre las propuestas (apoyos y votaciones) están limitadas a la gente empadronada.

    +

    Pregunta frecuente 2

    +

    Texto de respuesta para la pregunta frecuente 2.

    -

    ¿Para qué sirve verificar mi cuenta? ¿qué es esto de la carta con un código que me vais a mandar?

    -

    Para usar la web necesitamos una cuenta de usuario, que podrá hacer más o menos cosas según esté más o menos verificada:

    -
      -
    • Si nos registramos en la web con nuestro correo electrónico y no damos ningún dato más (no hacemos el proceso de verificación de residencia) podremos:
    • -
    - -

    Participar en debates

    -

    Crear propuestas

    - -
      -
    • Si despues de registrarnos realizamos la verificación básica (a través de la web consiste en verificar la residencia y dar un móvil para que nos manden un código de confirmación; ver información detallada del proceso en la sección "¿Cómo creo y verifico mi cuenta?" será posible:
    • -
    - -

    Participar en debates

    -

    Crear propuestas

    -

    Apoyar propuestas

    - -
      -
    • Si realizamos la verificación completa de nuestra cuenta (esto se puede realizar presencialmente en cualquiera de las 26 Oficinas de Atención al Ciudadano que hay por todo Madrid, o después de realizar la verificación básica pulsando en el enlace "Solicitar una carta por correo postal" que nos mandará a casa una carta con un código y unas instrucciones muy sencillas para terminar de verificarnos completamente) nos será posible realizar todas las acciones:
    • -
    - -

    Participar en debates

    -

    Crear propuestas

    -

    Apoyar propuestas

    -

    Votar propuestas

    - -

    Recuerda que la votación de propuestas es un proceso muy concreto que sólo ocurre durante una semana una vez las propuestas han llegado al 2% de apoyos, por lo tanto por lo general será posible realizar todas las acciones en la web con la verificación básica de nuestra cuenta.

    - -

    También es importante recalcar que podemos crear y verificar completamente nuestra cuenta sin pasar por Internet, realizando el proceso completamente de manera presencial en cualquiera de las 26 Oficinas de Atención al Ciudadano que hay por todo Madrid. - -

    ¿Necesito teléfono móvil o acceso a Internet para poder participar?

    -

    No. Todas las acciones relacionadas con las propuestas, tanto crearlas, como apoyarlas, votarlas o informarnos sobre ellas, es algo que podemos hacer presencialmente en cualquiera de las 26 Oficinas de Atención al Ciudadano que hay por todo Madrid, simplemente presentando nuestro DNI, pasaporte o tarjeta de residencia (recuerda que para apoyar o votar propuestas es necesario estar empadronado en Madrid). Además podremos presentar hojas de firmas para apoyar una propuesta concreta. También podremos crearnos una cuenta de usuario completamente verificada, en caso de que optemos en algún momento por utilizar la web directamente. -

    - -

    ¿Cómo creo y verifico mi cuenta?

    -
      -
    • Lo primero es crear una cuenta básica. Para ello hacemos clic en el enlace Registrarse y rellenamos los datos que nos piden. Es un requisito marcar la casilla de aceptación de las condiciones de uso. Al crear una cuenta nos llegará un correo electrónico a la dirección que hayamos especificado, y tendremos que hacer click en el enlace que contiene (el enlace que pone "Confirmar mi cuenta") para terminar de crear la cuenta.
    • -
    • Una vez creada la cuenta básica, y tras entrar con nuestro correo y contraseña, el sistema nos dará la opción de realizar una verificación básica de la misma. Tanto este paso como el siguiente se pueden realizar presencialmente en cualquiera de las 26 Oficinas de Atención al Ciudadano que hay por todo Madrid. Si preferimos hacerlo a través de la web, hacemos click en el enlace "Mi cuenta" de la parte superior derecha, y luego en el botón "Verificar mi cuenta". Lo primero que se nos pedirá es que introduzcamos nuestros datos de residencia, para verificar que estamos empadronados en el municipio de Madrid (es importante introducir el número de documento con la letra; y marcar la casilla de aceptación de acceso al Padrón). Si los datos son correctos, se nos pedirá un teléfono móvil para mandarnos un código de confirmación, que introduciremos en la siguiente página que se nos presente. Este móvil no se utilizará para contactarnos ni para enviarnos nada en ningún momento, sólo es una medida de seguridad. Si preferimos no dar ningún teléfono móvil, podemos realizar el proceso sin necesidad de él en las Oficinas de Atención al Ciudadano, como comentamos anteriormente. Una vez introducido correctamente el código de confirmación, nuestra cuenta nos permitirá apoyar propuestas.
    • -
    • Para poder acceder a las votaciones finales de las propuestas, tendremos que verificar completamente nuestra cuenta. No obstante recuerda que la votación de propuestas es un proceso muy concreto que sólo ocurre durante una semana una vez las propuestas han llegado al 2% de apoyos, por lo tanto por lo general será posible realizar todas las acciones en la web con la anterior verificación básica de nuestracuenta. Para verificar completamente nuestra cuenta, podemos hacerlo presencialmente en cualquiera de las 26 Oficinas de Atención al Ciudadano, o bien a través de la web entrando con nuestro correo y contraseña, hacer clic en el enlace "Mi cuenta" de la parte superior derecha, pulsar el botón "Finalizar verificación", y finalmente hacer click en "Solicitar el envío de un correo postal". Una vez solicitado, nos llegará a nuestra dirección de empadronamiento una carta, con un código de seguridad y unas sencillas instrucciones para realizar la verificación.
    • -
    - -

    ¿Cómo puedo enviar una propuesta al Ayuntamiento? ¿Puedo mandaros directamente mi propuesta a alguno de los correos electrónico que aparecen en la web de participación?

    -

    El camino correcto para hacer una propuesta es añadirla uno mismo directamente en la web de participación dentro de la sección "Propuestas" (para ello es necesario primero crear una cuenta haciendo click en el enlace Registrarse, y una vez creada, hacer click en el botón "Crear propuesta" de la sección "Propuestas"), o presencialmente a través de cualquiera de las 26 Oficinas de Atención al Ciudadano que hay por todo Madrid. En caso de que lo que queremos presentar sea una sugerencia o reclamación, la información para presentarlas se encuentra en esta página. - -

    Hay muchas propuestas parecidas, ¿no se podrían unificar?

    -

    En breve implementaremos una nueva funcionalidad de la web que permitirá marcar propuestas similares como tales, y que se muestren al visualizar cualquiera de ellas. De esta forma la gente podrá decidir cuál de ellas apoyar tras compararlas, y ayudará a que no se dispersen tanto los apoyos y no se repitan tanto las mismas propuestas. También implementaremos un sistema que cuando creemos nuestra propuesta nos mostrará propuestas similares, por si la idea que queremos lanzar ya existiera en el portal de participación.

    - -

    Sobre la posibilidad de unificar propuestas, lo que pueden parecer pequeñas diferencias entre dos propuestas similares, pueden marcar grandes diferencias a la hora de hacerlas realidad. Por ello hay personas que pueden querer apoyar una de ellas y no otras. Es por eso que debemos respetar los apoyos particulares que haya dado la gente, y no unificar las propuestas. Esto es independiente de que los autores de las propuestas quieran unirlas. Una vez las propuestas están recibiendo apoyos pasan a ser tanto de la gente que las apoya como de sus autores.

    - -

    Me he olvidado de mi contraseña o no me funciona ¿qué puedo hacer?

    -
      -
    • Puedes hacer solicitar un nueva contraseña para que se te envíe una nueva contraseña a tu correo electrónico.
    • -
    • Si la anterior solución no funcionan, puedes acercarte a cualquiera de las 26 Oficinas de Atención al Ciudadano que hay por todo Madrid, donde te resolverán el problema presencialmente solucionando el problema asociado a tu cuenta o creándote una cuenta nueva.
    • -
    - -

    No consigo crear mi cuenta correctamente.

    - - -

    ¿Cómo puedo cambiar mi correo electrónico, mi nombre de usuario, mi contraseña, darme de baja o activar/desactivar las notificaciones que me llegan al correo electrónico?

    -

    Haz click en el enlace "Entrar", introduce tu correo electrónico y tu contraseña, y pulsa el botón "Entrar". Una vez hecho esto, haz click en el enlace "Mi cuenta" donde encontrarás todas las opciones que te permitirán cambiar tu correo electrónico, nombre de usuario, contraseña, darte de baja o activar/desactivar las notificaciones. Una vez realizado el cambio adecuado asegúrate de hacer click en el botón "Guardar cambios".

    +

    Pregunta frecuente 3

    +

    Texto de respuesta para la pregunta frecuente 3.

    diff --git a/app/views/pages/opendata.html.erb b/app/views/pages/opendata.html.erb index 496ae5938..aeee6b465 100644 --- a/app/views/pages/opendata.html.erb +++ b/app/views/pages/opendata.html.erb @@ -1,13 +1,10 @@ <% provide :title do %><%= t('pages.titles.opendata') %><% end %> -
    -
    +
    +

    <%= t("pages.opendata.title") %>

    -

    <%= t("pages.opendata.slogan_html") %>

    - <%= link_to t("pages.opendata.go_old"), t("layouts.header.external_link_opendata_url"), - title: t('shared.target_blank_html'), - target: "_blank", class: "button" %> +

    <%= t("pages.opendata.slogan") %>

    @@ -15,9 +12,3 @@
    - -
    -
    -

    <%= t('pages.while_unfinished_html') %>

    -
    -
    diff --git a/app/views/pages/participation.html.erb b/app/views/pages/participation.html.erb index 5e274986c..9d92140fb 100644 --- a/app/views/pages/participation.html.erb +++ b/app/views/pages/participation.html.erb @@ -6,79 +6,41 @@
  • I. Participación
  • II. Transparencia
  • -

    Participación y Transparencia en Madrid - Próximas novedades

    +

    Participación y Transparencia

    -

    Desde el nuevo gobierno del Ayuntamiento de Madrid ponemos en marcha un nuevo proyecto de participación y transparencia, desarrollado a través de la recién creada área de gobierno: Participación Ciudadana, Transparencia y Gobierno Abierto. El objetivo de este nuevo proyecto es claro: que los madrileños puedan decidir directamente la política de la ciudad, y que todo lo que ocurra en el Ayuntamiento, hasta el último rincón, esté a la vista de todos.

    - -

    Este nuevo área de gobierno también es la encargada de la atención al ciudadano, de las sugerencias y reclamaciones, de la evaluación y calidad de las políticas y gestión del Ayuntamiento, de la administración electrónica y otros temas relacionados con la relación entre ciudadanía e institución.

    - -

    Iremos publicando nuestros avances, las novedades y cualquier otra cosa que queramos compartir con vosotros en relación con el proyecto en nuestro blog.

    - -

    Podéis escribirnos para lo que queráis a ag.gobiernoabierto@madrid.es

    - -

    A continuación os presentamos algunas de las principales novedades que tenemos planeadas poner en marcha en relación con el proyecto de participación y transparencia, aparte de las que vayamos diseñando o se nos vayan proponiendo durante la legislatura:

    +

    Página de información sobre Participación y Transparencia.

    I. Participación.

    +
      -
    • I.1. Propuestas ciudadanas. Un espacio que permite que entre todos decidamos qué debe ser Madrid. Cualquiera puede presentar propuestas, que en caso de que sean aceptadas mayoritariamente se llevarán a cabo por parte del Ayuntamiento. Debate, propón, decide.
    • - -
    • I.2. Presupuestos participativos. Parte del presupuesto de inversión del Ayuntamiento (el que no está comprometido ya con necesidades básicas como pueden ser los servicios sociales o las emergencias), será reservado para ser decidido su uso por la ciudadanía. La gente hará propuestas, se tasarán las más apoyadas, y luego los ciudadanos decidirán en cuáles de esos proyectos priorizar el presupuesto reservado.
    • - -
    • I.3. Legislacion colaborativa. A través de diferentes fases de participación, la ciudadanía tendrá un papel fundamental colaborando directamente en la elaboración de las propuestas, reglamentos, decretos o cualquier otro tipo de trabajo político desarrollado por el gobierno municipal. Una participación real desde el principio al fin del proceso legislativo, desde decidir los expertos en la materia hasta revisar el texto final.
    • - -
    • I.4. Co-gobierno ciudadano. Mediante este sistema la ciudadanía podrá decidir las líneas prioritarias de actuación del Ayuntamiento a medio plazo.
    • - -
    • I.5. Participación sectorial. La participación ciudadana se va a tratar de manera transversal en todas las áreas de gobierno del Ayuntamiento, afectando a todos los procesos que se lleven a cabo. Un ejemplo de esto es el proceso de auditoría ciudadana de la deuda, que llevaremos a cabo con el Área de Gobierno de Economía y Hacienda.
    • - -
    • I.6. Inclusión, neutralidad y privacidad. Una de las misiones principales del área será velar por la inclusión de todo el mundo en los procesos participativos, para que todas las voces y voluntades formen parte de ellos y no se quede nadie fuera. Para ello, desarrollaremos una mesa de inclusión a la que invitaremos a todos los expertos, colectivos y asociaciones que trabajen con colectivos excluidos, para diseñar las maneras adecuadas de superar estas brechas. La protección de la participación se complementará con la protección de la neutralidad y privacidad en todos los procesos, para asegurar su legitimidad y confianza.
    • - -
    • I.7. Innovación social. Pretendemos crear un entorno que movilice la inteligencia colectiva existente en favor de una ciudad más hospitalaria e inclusiva. Espacios donde la sociedad se hable y piense con la administración, con la convicción de que son los ciudadanos quienes mejor conocen sus problemas, y es en lo colectivo donde están los expertos que pueden hallar las soluciones.
    • +
    • I.1. Participación. Información sobre Participación
    • +
    • I.1. Participación. Información sobre Participación
    • +
    • I.1. Participación. Información sobre Participación
    +

    II. Transparencia

    +
      -
    • II.1. Ordenanza de transparencia - Este ayuntamiento cree en la transparencia como medio para conseguir objetivos claves para el desarrollo de la democracia. En la práctica, el derecho de acceso a la información tiene un efecto disuasorio y preventivo sobre la corrupción. Además tiene un impacto directo sobre los derechos democráticos más esenciales como es el derecho a la participación, desde su concepción más básica como es votar en las elecciones, el derecho a una prensa libre e independiente o sobre todo nuestro derecho a obtener o a exigir una rendición de cuentas completa de lo público.
      - El Ayuntamiento de Madrid se propone aprobar una norma de transparencia que incluya los principios más avanzados en esta materia y que incluya la obligación de las instituciones públicas hacer pública, reactiva o proactivamente, toda la información, registrada, archivada, elaborada, recibida o en posesión de las autoridades públicas sea cual sea el formato. Se trata de explicar todo lo que afecte a una decisión sobre lo público: qué se hace, quién lo hace, por qué se hace, cómo se hace y cuánto cuesta. Además esta información debe ser publicada en formatos abiertos que la hagan más accesible y reutilizable por cualquiera.
    • - -
    • II.2. Portal de transparencia - En cumplimiento de la Ley 19/2013 de Transparencia, Acceso a la Información y Buen Gobierno, y de su futura implementación en una Ordenanza Municipal en Madrid, el Ayuntamiento de Madrid plantea el desarrollo y mejora del Portal de la Transparencia. El Ayuntamiento no se limitará a cumplir con las obligaciones que se adquieran cuando entre en vigor la ley 19/2013 sino que aprobará mediante su Ordenanza las obligaciones y derechos que posibiliten la publicación de una lista de la información más ambiciosa que debe encontrarse en el Portal de transparencia del Ayuntamiento siguiendo los mandatos legales.
      - El objetivo de esta mejora es no solo la publicación de un mayor volumen de información sino también la publicación de esta información en formatos que la hagan más accesible y fácil de entender para los ciudadanos.
    • - -
    • II.3. Datos abiertos - El Ayuntamiento tiene como objetivo compartir todos los datos que tienen en su poder en formatos abiertos y fomentar su reutilización por parte de la sociedad. El objetivo por tanto es doble, por un lado se trabajará en la mejora del portal de datos, en aumentar la cantidad, la calidad y la frecuencia en la publicación de datos, y por otro lado se abrirán canales de colaboración para promover las aplicaciones y los usos que resulten de la reutilización de los datos.
    • - -
    • II.4. Agendas públicas - En el moderno proceso de toma de decisiones por los responsables políticos, la publicación de las agendas de los cargos públicos es una medida fundamental para garantizar la transparencia de las instituciones. De esta forma, la ciudadanía puede tener una idea clara de quiénes participan en el proceso de toma de decisiones.
      - Esta necesidad de publicidad viene refrendada por destacados organismos internacionales, como el Grupo de Estados Contra la Corrupción del Consejo de Europa (GRECO), que la señala como uno de los estándares internacionales a tener en cuenta para incorporar al sistema parlamentario español; o la Organización para la Cooperación y el Desarrollo Económico (OCDE) que, en junio de 2013, destacaba que "en el despertar de una crisis global donde la protección del interés público ha sido cuestionada de forma mundial, hay una creciente necesidad de valorar el progreso alcanzado para garantizar un proceso de toma de decisiones abierto, balanceado y con un público informado".
      - En línea con este espíritu de apertura, y con la decidida voluntad de que exista fluidez en la información, se considera necesario hacer públicas las agendas de los Concejales como inicio de una política de transparencia y rendición de cuentas en el Ayuntamiento de Madrid, de forma que sea posible saber qué trabajo realizan los miembros del gobierno municipal y qué colectivos o circunstancias pueden tener repercusión en las decisiones que se toman.
      - Ya se pueden consultar las agendas de los concejales pero el Ayuntamiento está trabajando en una aplicación mejor que permita encontrar las reuniones más fácilmente.
    • - -
    • II.5. Transparencia del Lobby - Con el objetivo de hacer el proceso de toma de decisiones del Ayuntamiento de Madrid un proceso lo más transparente posible, se propone la creación de un registro de lobbies que obligue a todas las personas que quieran reunirse con el Gobierno para ejercer influencia sobre los asuntos públicos a estar registrada en el mismo. El objetivo de este registro es conocer a qué intereses representan las personas que se reúnen con los representantes públicos.
    • +
    • II.1. Transparencia Información sobre Transparencia
    • +
    • II.1. Transparencia Información sobre Transparencia
    • +
    • II.1. Transparencia Información sobre Transparencia
    - diff --git a/app/views/pages/participation_facts.html.erb b/app/views/pages/participation_facts.html.erb index 579638028..9a52f6a6c 100644 --- a/app/views/pages/participation_facts.html.erb +++ b/app/views/pages/participation_facts.html.erb @@ -1,13 +1,9 @@
    -
    +
    <%= render "shared/back_link" %>

    Hechos sobre participación ciudadana y democracia directa

    -
    - -
    -

    La democracia directa produce gente más informada y con más cultura política.

    El poner en marcha mecanismos de participación reales hace que la gente se preocupe por las decisiones que tiene que tomar, y que por lo tanto se informe sobre ellas. Esto se observa sistemáticamente al comparar diferentes regiones de un mismo país con diferentes grados de democracia directa, o en procesos particulares como por ejemplo la votación del Tratado por una Constitución para Europa, comparando los países que lo votaron en referéndum y los que no.

    En ocasiones se argumenta que no se deben crear mecanismos de decisión ciudadana, porque un posible bajo nivel cultural o de conocimiento político haría que se tomaran malas decisiones. Esto se ha argumentado tradicionalmente en contra del voto femenino, del voto inmigrante, del voto de la gente sin renta, etc. pero lo que se ha demostrado es que permitir a toda esa gente decidir ha sido precisamente lo que ha permitido que escaparan de su situación de desigualdad cultural y de derechos, o al menos que la mejoraran considerablemente.

    diff --git a/app/views/pages/participation_world.html.erb b/app/views/pages/participation_world.html.erb index 57ad94c7b..38ab0275d 100644 --- a/app/views/pages/participation_world.html.erb +++ b/app/views/pages/participation_world.html.erb @@ -10,13 +10,13 @@

    Participación ciudadana directa en el mundo

    -

    En el mundo existen sistemas de participación ciudadana muy similares al que vamos a implementar en Madrid, que llevan funcionando desde hace más de cien años y en países muy diferentes. La experiencia larga y variada de dichos sistemas demuestra que lo que ponemos en marcha en Madrid tendrá un impacto muy positivo en la sociedad, como ha tenido en esos otros países.

    +

    En el mundo existen sistemas de participación ciudadana que llevan funcionando desde hace más de cien años y en países muy diferentes. La experiencia larga y variada de dichos sistemas demuestra el impacto muy positivo en la sociedad que ha tenido en esos otros países.

    Además de los ejemplos clásicos, como Suiza, asistimos a un desarrollo muy fuerte de los sistemas de participación ciudadana en todo el mundo, en particular en los últimos años, gracias especialmente a las nuevas posibilidades que nos brinda Internet. Islandia, Finlandia, Brasil, Estados Unidos, son algunos de los países que más están apostando por una participación directa de la ciudadanía en la toma de decisiones.

    La nueva ola global de participación ciudadana

    -

    Las nuevas formas de participación se están dirigiendo principalmente a que sean la ciudadanía quien decida qué caminos debe tomar la política de su país, a través de mecanismos de iniciativas ciudadanas. Finlandia es uno de los países donde se están desarrollando nuevas herramientas similares al nuevo portal de gobierno abierto de Madrid. Su plataforma Open Ministry permite a la población presentar y apoyar propuestas, y ha conseguido por ejemplo que se apruebe gracias a él la ley de matrimonio igualitario. Islandia también ha tenido una gran repercusión desde 2011, cuando lanzaron su plataforma Better Reykjavik, que ha permitido que el 58% de la población participe en el proceso de propuestas, seleccionando cada mes las 15 ideas más votadas.

    +

    Las nuevas formas de participación se están dirigiendo principalmente a que sean la ciudadanía quien decida qué caminos debe tomar la política de su país, a través de mecanismos de iniciativas ciudadanas. Finlandia es uno de los países donde se están desarrollando nuevas herramientas similares al nuevo portal de gobierno abierto. Su plataforma Open Ministry permite a la población presentar y apoyar propuestas, y ha conseguido por ejemplo que se apruebe gracias a él la ley de matrimonio igualitario. Islandia también ha tenido una gran repercusión desde 2011, cuando lanzaron su plataforma Better Reykjavik, que ha permitido que el 58% de la población participe en el proceso de propuestas, seleccionando cada mes las 15 ideas más votadas.

    Estonia es uno de los países que gracias a una apuesta clara por las nuevas tecnologías, ha podido situarse en cabeza de Europa en el nivel de uso por parte de la ciudadanía de Internet para la interacción con el gobierno. No sólo los ciudadanos y ciudadanas resuelven diariamente todos sus trámites a través de Internet, sino que han puesto en marcha plataformas como Rahvakogu, donde después de los escándalos políticos de 2012, 50.000 personas (de un total de 1.3 millones) participaron proponiendo medidas para mejorar la situación democrática del país.

    diff --git a/app/views/pages/privacy.html.erb b/app/views/pages/privacy.html.erb index d78961d88..3ecbc0a4b 100644 --- a/app/views/pages/privacy.html.erb +++ b/app/views/pages/privacy.html.erb @@ -7,13 +7,13 @@

    AVISO DE PROTECCIÓN DE DATOS

      -
    1. La navegación por la informacion disponible en el Portal de Gobierno Abierto del Ayuntamiento de Madrid es anónima.
    2. -
    3. Para utilizar los servicios contenidos en el Portal de Gobierno Abierto del Ayuntamiento de Madrid el usuario deberá darse de alta y proporcionar previamente los datos de carácter personal segun la informacion especifica que consta en cada tipo de alta.
    4. -
    5. Los datos aportados serán incorporados y tratados por el Ayuntamiento de Madrid de acuerdo con la descripción del fichero siguiente: +
    6. La navegación por la informacion disponible en el Portal de Gobierno Abierto es anónima.
    7. +
    8. Para utilizar los servicios contenidos en el Portal de Gobierno Abierto el usuario deberá darse de alta y proporcionar previamente los datos de carácter personal segun la informacion especifica que consta en cada tipo de alta.
    9. +
    10. Los datos aportados serán incorporados y tratados por el Ayuntamiento de acuerdo con la descripción del fichero siguiente:
        -
      • Nombre del fichero/tratamiento: GESTIÓN DE PROCESOS PARTICIPATIVOS
      • +
      • Nombre del fichero/tratamiento: NOMBRE DEL FICHERO
      • Finalidad del fichero/tratamiento: Gestionar los procesos participativos para el control de la habilitación de las personas que participan en los mismos y recuento meramente numérico y estadístico de los resultados derivados de los procesos de participación ciudadana
      • -
      • Órgano responsable: DIRECCIÓN GENERAL DE PARTICIPACIÓN CIUDADANA (c/ Alcalá 45, 28014-Madrid)
      • +
      • Órgano responsable: ÓRGANO RESPONSABLE
    11. El interesado podrá ejercer los derechos de acceso, rectificación, cancelación y oposición, ante el órgano responsable indicado todo lo cual se informa en el cumplimiento del artículo 5 de la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.
    12. diff --git a/app/views/pages/proposals_info.html.erb b/app/views/pages/proposals_info.html.erb index ffe0eec32..09bf8585e 100644 --- a/app/views/pages/proposals_info.html.erb +++ b/app/views/pages/proposals_info.html.erb @@ -3,9 +3,7 @@ <%= render "shared/back_link" %>
    @@ -14,88 +12,17 @@

    El mecanismo de propuestas ciudadanas se resume en cuatro pasos muy sencillos:

    1. ¡Propones! Creas una propuesta en esta web.
    2. -
    3. ¡Apoyas! La gente hace click en el botón de apoyar tu propuesta (necesitas el apoyo del 2% de los empadronados mayores de 16 años para pasar a la siguiente fase).
    4. -
    5. ¡Decides! Si has conseguido suficientes apoyos, dejamos 45 días para que la gente pueda debatir sobre la propuesta, y después durante una semana se invita a toda la gente de Madrid a decidir si están a favor o en contra de tu propuesta, en esta misma web.
    6. -
    7. ¡Se hace! Si hay más gente a favor de tu propuesta que en contra, el gobierno del Ayuntamiento de Madrid asumirá como propia la propuesta y la llevará a cabo.
    8. +
    9. ¡Apoyas! La gente hace clic en el botón de apoyar tu propuesta (necesitas el apoyo del 2% de los empadronados mayores de 16 años para pasar a la siguiente fase).
    10. +
    11. ¡Decides! Si has conseguido suficientes apoyos, dejamos 45 días para que la gente pueda debatir sobre la propuesta, y después durante una semana se invita a toda la gente empadronada a decidir si están a favor o en contra de tu propuesta, en esta misma web.
    12. +
    13. ¡Se hace! Si hay más gente a favor de tu propuesta que en contra, el gobierno del Ayuntamiento asumirá como propia la propuesta y la llevará a cabo.
    -

    Además no hace falta ni que tengas Internet, todos los pasos se pueden hacer en cualquiera de las 26 Oficinas de Atención al Ciudadano que hay por todo Madrid.

    - -
    - -
    -

    Explicación detallada del proceso

      -
    1. Creación de una propuesta. Cualquier persona (sin necesidad siquiera de estar empadronada en Madrid) puede crear una propuesta. Lo único que hay que hacer es pulsar el botón “Crear una propuesta” y rellenar los campos requeridos. La propuesta puede ser tan sencilla como una simple frase, pero te recomendamos detallarla todo lo posible, incluso añadiendo material adicional, para que sea más completa e interesante. Una vez creada aparecerá en esta web para que cualquiera pueda apoyarla.
    2. -
    3. Apoyo de propuestas. Para apoyar una de las propuestas que aparece en la web, pulsamos el botón “apoyar esta propuesta” que aparece en cada una. Para este paso tendremos que estar empadronados en Madrid, así que al llevarlo a cabo por primera vez se nos pedirá que verifiquemos nuestra cuenta para estar seguros de este requerimiento. Se nos va a pedir que introduzcamos algunos datos para comprobar nuestra información de empadronamiento, y se nos enviará un código personal para que el proceso sea seguro. Las propuestas necesitan una cierta cantidad de apoyos para pasar a la siguiente fase; concretamente el 2% de los empadronados mayores de 16 años (que suponen 53.726 apoyos).
    4. -
    5. Decisión sobre propuestas. Cuando una propuesta consigue los apoyos necesarios, se anuncia en la web. Desde ese momento se dejan 45 días para que todo el mundo pueda debatir e informarse sobre la propuesta. Todas las otras propuestas que hayan conseguido los apoyos necesarios en los primeros 30 días del tiempo de debate se agruparán junto a la primera para decidir sobre ellas al mismo tiempo. Pasados los 45 días se exponen estas propuestas en un espacio especial de votación de la web, donde durante una semana cualquier persona empadronada en Madrid y mayor de 16 años podrá decidir si está a favor o rechaza la propuesta. Para participar en este paso tendrás que tener tu cuenta de usuario verificada completamente, de tal forma que nos aseguremos que cada persona no tiene más de una cuenta y el proceso es seguro.
    6. -
    7. Realización de las propuestas. En caso de que haya más gente a favor de una propuesta que rechazándola se aceptará como propuesta colectiva de la ciudadanía de Madrid, y el gobierno del Ayuntamiento de Madrid la asumirá como propia y la llevará a cabo. Para ello en un plazo máximo de un mes, se realizarán los informes técnicos correspondientes sobre su legalidad, viabilidad y coste económico, teniendo en cuenta a los sectores afectados y a la persona que haya lanzado la propuesta, para detallar la actuación correspondiente por parte del Ayuntamiento. Se publicarán en la web todos los informes realizados, y un seguimiento de las actuaciones que se lleven a cabo, para asegurar un correcto desarrollo de la propuesta.
    8. +
    9. Creación de una propuesta. Cualquier persona (sin necesidad siquiera de estar empadronada) puede crear una propuesta. Lo único que hay que hacer es pulsar el botón “Crear una propuesta” y rellenar los campos requeridos. La propuesta puede ser tan sencilla como una simple frase, pero te recomendamos detallarla todo lo posible, incluso añadiendo material adicional, para que sea más completa e interesante. Una vez creada aparecerá en esta web para que cualquiera pueda apoyarla.
    10. +
    11. Apoyo de propuestas. Para apoyar una de las propuestas que aparece en la web, pulsamos el botón “apoyar esta propuesta” que aparece en cada una. Para este paso tendremos que estar empadronados, así que al llevarlo a cabo por primera vez se nos pedirá que verifiquemos nuestra cuenta para estar seguros de este requerimiento. Se nos va a pedir que introduzcamos algunos datos para comprobar nuestra información de empadronamiento, y se nos enviará un código personal para que el proceso sea seguro. Las propuestas necesitan una cierta cantidad de apoyos para pasar a la siguiente fase; concretamente el 2% de los empadronados mayores de 16 años.
    12. +
    13. Decisión sobre propuestas. Cuando una propuesta consigue los apoyos necesarios, se anuncia en la web. Desde ese momento se dejan 45 días para que todo el mundo pueda debatir e informarse sobre la propuesta. Todas las otras propuestas que hayan conseguido los apoyos necesarios en los primeros 30 días del tiempo de debate se agruparán junto a la primera para decidir sobre ellas al mismo tiempo. Pasados los 45 días se exponen estas propuestas en un espacio especial de votación de la web, donde durante una semana cualquier persona empadronada y mayor de 16 años podrá decidir si está a favor o rechaza la propuesta. Para participar en este paso tendrás que tener tu cuenta de usuario verificada completamente, de tal forma que nos aseguremos que cada persona no tiene más de una cuenta y el proceso es seguro.
    14. +
    15. Realización de las propuestas. En caso de que haya más gente a favor de una propuesta que rechazándola se aceptará como propuesta colectiva de la ciudadanía, y el gobierno del Ayuntamiento la asumirá como propia y la llevará a cabo. Para ello en un plazo máximo de un mes, se realizarán los informes técnicos correspondientes sobre su legalidad, viabilidad y coste económico, teniendo en cuenta a los sectores afectados y a la persona que haya lanzado la propuesta, para detallar la actuación correspondiente por parte del Ayuntamiento. Se publicarán en la web todos los informes realizados, y un seguimiento de las actuaciones que se lleven a cabo, para asegurar un correcto desarrollo de la propuesta.
    - -

    Todas las acciones relacionadas con el proceso de propuestas ciudadanas pueden realizarse a través del portal de gobierno abierto, o presencialmente en cualquiera de las 26 Oficinas de Atención al Ciudadano existentes en Madrid.

    - -

    El proceso de recogida de apoyos de una propuesta puede realizarse también a través de hojas de firmas, cuyo modelo puede ser descargado en este documento PDF. Los apoyos recogidos de esta manera se sumarán a los apoyos ya existentes en el portal de gobierno abierto. Las hojas pueden ser entregadas en cualquiera de los Registros del Ayuntamiento, presentes en cada una de las Juntas de Distrito. Ver la lista completa de Oficinas de Registro.

    - -

    Las directrices aprobadas por el Ayuntamiento por las que se regulan las propuestas ciudadanas son las siguientes: Directrices sobre el derecho de propuesta (documento PDF).

    - -

    Preguntas Frecuentes

    -
      -
    1. ¿Cuáles son los requisitos que se solicitan para poder apoyar o votar propuestas?
      - Estar empadronado en Madrid y ser mayor de 16 años. En caso de que se haga a través de Internet se requerirá que se haya verificado la cuenta de usuario de la web (encontramos el botón de verificación en el apartado “Mi cuenta” en la esquina superior derecha), proporcionando la información del padrón, y un medio de comunicación para obtener un código seguro de participación que introduciremos en la web para validar nuestra cuenta. -
    2. - -
    3. ¿Cómo va a controlarse que cada persona vote una única vez por propuesta?
      - Las votaciones presenciales en las Oficinas de Atención al Ciudadano están controladas porque la persona tiene que presentar su DNI. Para la votación a través de Internet se verifica que la cuenta de usuario corresponde a un único ciudadano/a. Para ello se le facilita un código personal seguro de verificación de la cuenta que se comunica a través de canales de comunicación privados, como son teléfonos móviles que constan en el Ayuntamiento que pertenecen a la persona adecuada, o por correo a través del buzón que figura en la dirección de empadronamiento. De esta forma nos aseguramos de que sólo esa persona ha recibido el código. En caso de que dichos medios de comunicación no estén disponibles se solicitará a la persona que acuda presencialmente a alguna de las Oficinas de Atención al Ciudadano, para obtener su código. -
    4. - -
    5. ¿Se llevará a cabo cualquier propuesta que se acepte por mayoría en la web? ¿incluso aunque sean ilegales o atenten contra los derechos humanos? ¿y si no hay presupuesto para llevarla a cabo?
      - Se establecen una serie de criterios objetivos por los que una propuesta no podrá ser aceptada como, por ejemplo, que tenga fines delictivos o que atente contra derechos fundamentales y libertades públicas. Además se excluyen del proceso las propuestas sobre otras modalidades de participación tales como presupuestos participativos, procesos revocatorios, audiencia pública o iniciativas normativas populares. -
      Este mecanismo de participación no cambia los límites ya existentes para el Ayuntamiento, lo que hace es trasladar quién toma la decisión de lo que haya que hacer, incluyendo a toda la ciudadanía en el proceso de toma de decisiones. -
      En el caso de las propuestas que quedan fuera de las competencias municipales el Ayuntamiento no podrá llevarlas a cabo, pero emprenderá actuaciones alternativas dentro de sus capacidades que intenten cumplir con la decisión de la propuesta. Lo mismo sucede con el presupuesto para llevar a cabo la propuesta; el ayuntamiento utilizará los recursos necesarios en cuanto sea posible, de la misma manera que se costean las decisiones adoptadas sin participación ciudadana. -
      También puede ocurrir que la actuación requiera la aprobación del Pleno, por lo que el resultado dependerá del posicionamiento de todas las fuerzas políticas respecto a la actuación presentada.
    6. - -
    7. ¿Qué diferencia existe entre los debates y las propuestas?
      - Aunque ambos pueden ser apoyados, los primeros no activan ningún mecanismo de actuación concreto, mientras que las segundas pasan a una fase de decisión colectiva y en caso de que sean aprobadas, son asumidas por el Ayuntamiento.
    8. - -
    9. ¿Vota toda la gente de Madrid en cada propuesta? ¿incluso aunque haga referencia a un único distrito?
      - Sí. El mecanismo actual se desarrolla a nivel de toda la ciudad. Lo que no entra en colisión con que a nivel distrital se puedan desarrollar mecanismos de participación ciudadana que afecten únicamente a cada distrito.
    10. - -
    11. ¿Y si se presentan varias propuestas iguales? ¿Se plantea la posibilidad de unificarlas para evitar que se diversifiquen los apoyos y/o votos?
      - Propuestas similares pueden ser marcadas como tales en la plataforma, lo que se señala al visualizar cada una de ellas. Más allá de eso no se unifican, dejando que sea la gente la que decida si apoyar a una o a otra.
    12. - -
    13. ¿Durante cuanto tiempo se pueden recoger apoyos?
      - Las propuestas pueden recoger apoyos durante 12 meses. Si en ese tiempo no consiguen alcanzar el 2% de los apoyos necesarios dejan de poder recibir más apoyos.
    14. - -
    15. ¿Durante cuanto tiempo se votará cada propuesta?
      - Una vez que las propuestas reciben el apoyo del 2% pasan a la fase de decisión final donde la gente puede votar aceptando o rechazando la propuesta durante un plazo de una semana.
    16. - -
    17. ¿Pueden participar asociaciones, fundaciones y ONG´s? ¿Y empresas?
      - Las propuestas tienen que ser presentadas individualmente, sin problema de que la persona que la presenta represente a una organización de cualquier tipo. Al registrar una propuesta en la web existe la posibilidad de señalar este caso como registro de asociaciones/colectivos.
    18. - -
    19. ¿Cuánta gente tiene que votar una propuesta para que sea aprobada? ¿Qué quórum mínimo se necesita para que las votaciones sean vinculantes?
      - El quórum es el mínimo de participación necesaria para considerar una votación vinculante de manera legal. Ningún reglamento del Ayuntamiento puede hacer que este mecanismo sea vinculante juridicamente, porque eso está en contra de la legislación española. La vinculación con el mecanismo es política y se asume de manera personal por los concejales y la Alcaldesa. Por ello no se considerará ningún quórum.
    20. - -
    21. ¿Existen mecanismos presenciales para participar? ¿Se ha planteado llegar a los ciudadanos y ciudadanas con dificultades de acceso a Internet o en situación de exclusión?
      - Todas las acciones relacionadas con el proceso de propuestas ciudadanas pueden realizarse presencialmente en cualquiera de las 26 Oficinas de Atención al Ciudadano repartidas por todos los distritos de Madrid. Además, el proceso de recogida de apoyos de una propuesta puede realizarse también a través de hojas de firmas, cuyo modelo puede ser descargado en este documento PDF. -
      Adicionalmente se ha creado en el Área de Gobierno de Participación Ciudadana, Transparencia y Gobierno Abierto el Servicio de Inclusión, Neutralidad y Privacidad que pondrá en marcha una mesa de inclusión con personal del Ayuntamiento y asociaciones que trabajan con colectivos en situación de exclusión, para diseñar mecanismos especiales para que puedan participar dichos colectivos.
    22. - -
    23. ¿Cómo puede participar la gente que no esté empadronada en Madrid?
      - Presentando propuestas, participando en los debates, y difundiendo lo que ocurra en la plataforma.
    24. - -
    25. ¿El voto es secreto? ¿el Ayuntamiento podrá tener acceso a los votos de los ciudadanos?
      - El voto es totalmente secreto. Se encripta de manera conjunta con diferentes autoridades externas al Ayuntamiento, de tal manera que para poder conocer la identidad de un votante todas las autoridades tendrían que realizar fraude conjuntamente.
    26. - -
    27. ¿Al ser electrónico el voto no se aumenta el riesgo de fraude? - No, incluso lo reducimos. Hay una sensación subjetiva muy fuerte de diferencia de seguridad entre procesos en papel y procesos electrónicos que no se corresponde con la realidad. En las elecciones generales donde el voto es en papel, después de que las mesas hayan hecho el recuento, las papeletas de los votos se tiran a la basura, y la persona responsable se dirige en persona con el recuento en la mano al centro donde se comparten los datos. Y sin embargo pensemos por ejemplo en el sistema de tarjetas de crédito y cuentas bancarias, donde cada día confiamos la seguridad de nuestro dinero a un sistema electrónico. En el caso del Ayuntamiento, la votación está asegurada mediante diferentes entidades externas, y además cualquier votante puede tanto comprobar que su voto particular está en el recuento final, como realizar el recuento completo de todos los votos por su cuenta. Dos garantías de seguridad completamente imposibles en un votación tradicional.
    28. - -
    29. ¿Cómo se sabe que una propuesta se ha cumplido?
      - Cuando se aprueba una propuesta, el Ayuntamiento publica en la página web cuáles son los pasos que se van a realizar para ponerla en práctica, incluyendo los informes que las correspondientes áreas redacten y las acciones que se emprenden. La información es completa y transparente para que puedas hacer un seguimiento de cómo evoluciona cada propuesta ciudadana.
    30. -
    - -

    Hojas de firmas para recoger apoyos

    -

    El proceso de recogida de apoyos de una propuesta, además de en la web, puede realizarse a través de hojas de firmas, cuyo modelo puede ser descargado en este documento PDF.

    -

    La hoja debe contener en las casillas superiores el código de la propuesta y su título, según figura en la página web específica de la propuesta, dentro del Portal de Gobierno Abierto.

    -

    Los apoyos recogidos de esta manera se sumarán a los apoyos ya existentes en el portal de gobierno abierto. Las hojas pueden ser entregadas en cualquiera de los Registros del Ayuntamiento, presentes en cada una de las Juntas de Distrito. Ver la lista completa de Oficinas de Registro.

    diff --git a/app/views/proposal_notifications/new.html.erb b/app/views/proposal_notifications/new.html.erb new file mode 100644 index 000000000..678e00088 --- /dev/null +++ b/app/views/proposal_notifications/new.html.erb @@ -0,0 +1,36 @@ +
    +
    + <%= render 'shared/back_link' %> + +

    <%= t("proposal_notifications.new.title") %>

    + +
    +

    + <%= t("proposal_notifications.new.info_about_receivers_html", + count: @proposal.voters.count, + proposal_page: link_to(t("proposal_notifications.new.proposal_page"), + proposal_path(@proposal, anchor: "comments"))).html_safe %> +

    +
    +
    +
    + +
    +
    + <%= form_for @notification do |f| %> + <%= render "shared/errors", resource: @notification %> + + <%= f.label :title, t("proposal_notifications.new.title_label") %> + <%= f.text_field :title, label: false %> + + <%= f.label :body, t("proposal_notifications.new.body_label") %> + <%= f.text_area :body, label: false, rows: "3" %> + + <%= f.hidden_field :proposal_id, value: @proposal.id %> + +
    + <%= f.submit t("proposal_notifications.new.submit_button"), class: "button expanded" %> +
    + <% end %> +
    +
    diff --git a/app/views/proposal_notifications/show.html.erb b/app/views/proposal_notifications/show.html.erb new file mode 100644 index 000000000..379b361fb --- /dev/null +++ b/app/views/proposal_notifications/show.html.erb @@ -0,0 +1,11 @@ +
    +
    + <%= link_to user_path(current_user), class: "back" do %> + + <%= t("proposal_notifications.show.back") %> + <% end %> + +

    <%= @notification.title %>

    +

    <%= @notification.body %>

    +
    +
    diff --git a/app/views/proposals/_comments.html.erb b/app/views/proposals/_comments.html.erb index 31f1cb8ba..ed52b1b66 100644 --- a/app/views/proposals/_comments.html.erb +++ b/app/views/proposals/_comments.html.erb @@ -1,12 +1,7 @@ <% cache [locale_and_user_status, @current_order, commentable_cache_key(@proposal), @comment_tree.comments, @comment_tree.comment_authors, @proposal.comments_count, @comment_flags] do %> -
    +
    -

    - <%= t("proposals.show.comments_title") %> - (<%= @proposal.comments_count %>) -

    - <%= render 'shared/wide_order_selector', i18n_namespace: "comments" %> <% if user_signed_in? %> diff --git a/app/views/proposals/_filter_subnav.html.erb b/app/views/proposals/_filter_subnav.html.erb new file mode 100644 index 000000000..b7bc85dd6 --- /dev/null +++ b/app/views/proposals/_filter_subnav.html.erb @@ -0,0 +1,22 @@ +
    +
    +
      +
    • + <%= link_to "#tab-comments" do %> +

      + <%= t("proposals.show.comments_tab") %> + (<%= @proposal.comments_count %>) +

      + <% end %> +
    • +
    • + <%= link_to "#tab-notifications" do %> +

      + <%= t("proposals.show.notifications_tab") %> + (<%= @notifications.count %>) +

      + <% end %> +
    • +
    +
    +
    diff --git a/app/views/proposals/_notifications.html.erb b/app/views/proposals/_notifications.html.erb new file mode 100644 index 000000000..69389b2c5 --- /dev/null +++ b/app/views/proposals/_notifications.html.erb @@ -0,0 +1,17 @@ +
    +
    +
    + <% if @notifications.blank? %> +
    + <%= t('proposals.show.no_notifications') %> +
    + <% end %> + + <% @notifications.each do |notification| %> +

    <%= notification.title %>

    +

    <%= notification.created_at.to_date %>

    +

    <%= notification.body %>

    + <% end %> +
    +
    +
    diff --git a/app/views/proposals/_proposal.html.erb b/app/views/proposals/_proposal.html.erb index e1e5d36a0..70c2b9c89 100644 --- a/app/views/proposals/_proposal.html.erb +++ b/app/views/proposals/_proposal.html.erb @@ -26,7 +26,7 @@ <%= proposal.author.name %> - <% if proposal.author.official? %> + <% if proposal.author.display_official_position_badge? %>  •  <%= proposal.author.official_position %> diff --git a/app/views/proposals/show.html.erb b/app/views/proposals/show.html.erb index cb2773c65..3a9869d83 100644 --- a/app/views/proposals/show.html.erb +++ b/app/views/proposals/show.html.erb @@ -12,9 +12,13 @@
    <%= render "shared/back_link" %> + <% if author_of?(@proposal, current_user) %> + <%= link_to t("proposals.show.send_notification"), new_proposal_notification_path(proposal_id: @proposal.id), + class: 'button hollow float-right' %> + <% end %> + <% if current_user && @proposal.editable_by?(current_user) %> - <%= link_to edit_proposal_path(@proposal), class: 'edit-proposal button success small float-right' do %> - + <%= link_to edit_proposal_path(@proposal), class: 'edit-proposal button hollow float-right' do %> <%= t("proposals.show.edit_proposal_link") %> <% end %> <% end %> @@ -104,7 +108,7 @@ { proposal: @proposal, vote_url: vote_proposal_path(@proposal, value: 'yes') } %>
    - +

    <%= t("proposals.show.share") %>

    <% end %> -<%= render "proposals/comments" %> + +
    + <%= render "proposals/filter_subnav" %> + <%= render "proposals/notifications" %> + +
    + <%= render "proposals/comments" %> +
    +
    diff --git a/app/views/proposals/summary.html.erb b/app/views/proposals/summary.html.erb index 05ed7dac9..38c56c963 100644 --- a/app/views/proposals/summary.html.erb +++ b/app/views/proposals/summary.html.erb @@ -20,7 +20,7 @@ <%= t("proposals.show.author_deleted") %> <% else %> <%= proposal.author.name %> - <% if proposal.author.official? %> + <% if proposal.author.display_official_position_badge? %> <%= proposal.author.official_position %> diff --git a/app/views/shared/_author_info.html.erb b/app/views/shared/_author_info.html.erb index 1a0315341..d61317321 100644 --- a/app/views/shared/_author_info.html.erb +++ b/app/views/shared/_author_info.html.erb @@ -15,7 +15,7 @@ <% end %> - <% if resource.author.official? %> + <% if resource.author.display_official_position_badge? %>  •  <%= resource.author.official_position %> diff --git a/app/views/shared/_social_media_meta_tags.html.erb b/app/views/shared/_social_media_meta_tags.html.erb index 5a2efbd04..50a2efec9 100644 --- a/app/views/shared/_social_media_meta_tags.html.erb +++ b/app/views/shared/_social_media_meta_tags.html.erb @@ -1,6 +1,6 @@ - + diff --git a/app/views/shared/_top_links.html.erb b/app/views/shared/_top_links.html.erb index 07973ee60..be6afb0d7 100644 --- a/app/views/shared/_top_links.html.erb +++ b/app/views/shared/_top_links.html.erb @@ -2,12 +2,12 @@
    <%= render "shared/locale_switcher" %>