diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE index 64c1da1be..ff14fef2f 100644 --- a/.github/PULL_REQUEST_TEMPLATE +++ b/.github/PULL_REQUEST_TEMPLATE @@ -1,5 +1,3 @@ -PR_TITLE_GOES_HERE - Where ===== * **Related Issue:** LINK_OR_#_REF @@ -7,24 +5,24 @@ Where What ==== -> Whats the objective of this changes ? +- Whats the objective of this changes ? How === -> How you implemented/achieved the objective ? +- How you implemented/achieved the objective ? Screenshots =========== -> If changes affect UI just show them drag&dropping images here +- If changes affect UI just show them drag&dropping images here Test ==== -> Is manual test needed or you just increased/fixed coverage? +- Is manual test needed or you just increased/fixed coverage? Deployment ========== -> Any details to remember when this feature is deployed? +- Any details to remember when this feature is deployed? Warnings ======== -> Some caveats or important things to notice? +- Some caveats or important things to notice? diff --git a/.rubocop.yml b/.rubocop.yml index 58cf10d34..c23172921 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -22,6 +22,9 @@ Metrics/LineLength: Layout/IndentationConsistency: EnforcedStyle: rails +Style/EmptyMethod: + Enabled: false + Style/StringLiterals: Enabled: false @@ -31,6 +34,9 @@ Style/FrozenStringLiteralComment: Style/PercentLiteralDelimiters: Enabled: false +Style/SymbolArray: + Enabled: false + Layout/EmptyLinesAroundClassBody: Enabled: false diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 19e3a59a6..a29c06239 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -86,14 +86,6 @@ Performance/RedundantMatch: - 'app/controllers/valuation/spending_proposals_controller.rb' - 'app/helpers/embed_videos_helper.rb' -# Offense count: 2 -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: strict, flexible -Rails/Date: - Exclude: - - 'app/controllers/concerns/commentable_actions.rb' - - 'app/models/direct_message.rb' - # Offense count: 4 # Cop supports --auto-correct. # Configuration parameters: Whitelist. @@ -138,35 +130,6 @@ Rails/OutputSafety: - 'app/helpers/users_helper.rb' - 'app/helpers/valuation_helper.rb' -# Offense count: 6 -# Cop supports --auto-correct. -Rails/PluralizationGrammar: - Exclude: - - 'spec/features/admin/banners_spec.rb' - - 'spec/features/debates_spec.rb' - - 'spec/features/proposals_spec.rb' - - 'spec/models/residence_spec.rb' - -# Offense count: 11 -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: strict, flexible -Rails/TimeZone: - Exclude: - - 'lib/score_calculator.rb' - - 'spec/controllers/admin/api/stats_controller_spec.rb' - - 'spec/models/ahoy/data_source_spec.rb' - -# Offense count: 7 -# Cop supports --auto-correct. -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/Validation: - Exclude: - - 'app/models/comment.rb' - - 'app/models/spending_proposal.rb' - - 'app/models/verification/residence.rb' - - 'app/models/verification/sms.rb' - # Offense count: 9 Style/AccessorMethodName: Exclude: @@ -202,29 +165,6 @@ Layout/AlignParameters: - 'spec/models/user_spec.rb' - 'spec/rails_helper.rb' -# Offense count: 2 -# Cop supports --auto-correct. -Layout/BlockEndNewline: - Exclude: - - 'app/models/banner.rb' - - 'spec/features/users_auth_spec.rb' - -# Offense count: 19 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: braces, no_braces, context_dependent -Style/BracesAroundHashParameters: - Exclude: - - 'app/controllers/valuation/spending_proposals_controller.rb' - - 'app/models/concerns/searchable.rb' - - 'app/models/verification/residence.rb' - - 'lib/manager_authenticator.rb' - - 'spec/controllers/management/users_controller_spec.rb' - - 'spec/features/admin/spending_proposals_spec.rb' - - 'spec/lib/manager_authenticator_spec.rb' - - 'spec/models/residence_spec.rb' - - 'spec/models/user_spec.rb' - # Offense count: 57 # Configuration parameters: EnforcedStyle, SupportedStyles. # SupportedStyles: nested, compact @@ -276,32 +216,6 @@ Style/EmptyCaseCondition: Exclude: - 'app/models/concerns/verification.rb' -# Offense count: 9 -# Cop supports --auto-correct. -Layout/EmptyLines: - Exclude: - - 'app/models/concerns/search_cache.rb' - - 'app/models/notification.rb' - - 'spec/features/admin/spending_proposals_spec.rb' - - 'spec/features/admin/verifications_spec.rb' - - 'spec/features/debates_spec.rb' - - 'spec/features/registration_form_spec.rb' - - 'spec/features/users_auth_spec.rb' - - 'spec/features/verification/verified_user_spec.rb' - - 'spec/support/verifiable.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/EmptyLinesAroundAccessModifier: - Exclude: - - 'app/controllers/users_controller.rb' - -# Offense count: 29 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment, ForceEqualSignAlignment. -Layout/ExtraSpacing: - Enabled: false - # Offense count: 1 # Cop supports --auto-correct. # Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth. @@ -315,15 +229,6 @@ Layout/FirstParameterIndentation: Style/GuardClause: Enabled: false -# Offense count: 10 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols. -# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys -Style/HashSyntax: - Exclude: - - 'lib/sms_api.rb' - - 'spec/factories.rb' - # Offense count: 6 # Cop supports --auto-correct. # Configuration parameters: MaxLineLength. @@ -607,111 +512,6 @@ Style/RescueModifier: - 'app/controllers/concerns/commentable_actions.rb' - 'app/controllers/verification/sms_controller.rb' -# Offense count: 2 -# Cop supports --auto-correct. -Layout/SpaceAfterColon: - Exclude: - - 'spec/models/user_spec.rb' - -# Offense count: 14 -# Cop supports --auto-correct. -Layout/SpaceAfterComma: - Exclude: - - 'app/models/ahoy/data_source.rb' - - 'app/models/banner.rb' - - 'app/models/concerns/search_cache.rb' - - 'app/models/concerns/taggable.rb' - - 'app/models/spending_proposal.rb' - - 'app/models/user.rb' - - 'spec/features/valuation/spending_proposals_spec.rb' - - 'spec/lib/census_api_spec.rb' - - 'spec/models/abilities/moderator_spec.rb' - - 'spec/models/verification/management/email_spec.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/SpaceAfterNot: - Exclude: - - 'app/models/flag.rb' - -# Offense count: 20 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: space, no_space -Layout/SpaceAroundEqualsInParameterDefault: - Exclude: - - 'app/helpers/cache_keys_helper.rb' - - 'app/helpers/proposals_helper.rb' - - 'app/helpers/spending_proposals_helper.rb' - - 'app/helpers/stats_helper.rb' - - 'app/helpers/tracks_helper.rb' - - 'app/helpers/valuation_helper.rb' - - 'app/mailers/devise_mailer.rb' - - 'app/models/comment.rb' - - 'app/models/tag_cloud.rb' - - 'app/models/verification/residence.rb' - - 'lib/acts_as_paranoid_aliases.rb' - - 'lib/capistrano/template.rb' - - 'lib/census_api.rb' - - 'lib/manager_authenticator.rb' - - 'spec/support/common_actions.rb' - -# Offense count: 66 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment. -Layout/SpaceAroundOperators: - Enabled: false - -# Offense count: 6 -# Cop supports --auto-correct. -Layout/SpaceBeforeComma: - Exclude: - - 'app/models/proposal.rb' - - 'spec/controllers/management/sessions_controller_spec.rb' - - 'spec/controllers/management/users_controller_spec.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment. -Layout/SpaceBeforeFirstArg: - Exclude: - - 'spec/factories.rb' - -# Offense count: 9 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: require_no_space, require_space -Layout/SpaceInLambdaLiteral: - Exclude: - - 'app/models/concerns/filterable.rb' - - 'app/models/spending_proposal.rb' - - 'app/models/user.rb' - - 'app/models/verified_user.rb' - -# Offense count: 8 -# Cop supports --auto-correct. -Layout/SpaceInsideParens: - Exclude: - - 'app/models/user.rb' - - 'lib/manager_authenticator.rb' - - 'spec/features/proposals_spec.rb' - - 'spec/models/abilities/moderator_spec.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Layout/SpaceInsidePercentLiteralDelimiters: - Exclude: - - 'app/models/activity.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiteralsInInterpolation: - Exclude: - - 'app/controllers/stats_controller.rb' - - 'app/models/proposal.rb' - # Offense count: 9 # Cop supports --auto-correct. # Configuration parameters: IgnoredMethods. @@ -724,12 +524,6 @@ Style/SymbolProc: - 'lib/manager_authenticator.rb' - 'spec/factories.rb' -# Offense count: 2 -# Cop supports --auto-correct. -Layout/TrailingWhitespace: - Exclude: - - 'app/controllers/admin/api/stats_controller.rb' - # Offense count: 31 # Cop supports --auto-correct. Style/UnneededInterpolation: @@ -759,6 +553,8 @@ Style/WordArray: # Offense count: 1 # Cop supports --auto-correct. -Style/ZeroLengthPredicate: +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: braces, no_braces, context_dependent +Style/BracesAroundHashParameters: Exclude: - - 'app/models/concerns/verification.rb' + - 'app/models/concerns/searchable.rb' diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..a487eadb4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,38 @@ +### 0.9 - 2017-06-15 + +* New features + * Budgets + * Basic polls + * Collaborative legistlation + * Custom pages + * GraphQL API + * Improved admin section +* Enhancements + * Improved admin section + * Rails 4.2.8 + * Ruby 2.3.2 +* Bug fixes + * CKEditor locale compilation fixed + * Fixed bugs in mobile layouts +* Deprecations + * SpendingProposals are deprecated now in favor of Budgets + +### 0.8 - 2016-07-21 + +* New features + * Support for customization schema, vía specific custom files, assets and folders +* Enhancements + * Rails 2.4.7 + * Ruby 2.3.1 +* Bug fixes + * Fixed bug causing errors on user deletion + +### 0.7 - 2016-04-25 + +* New features + * Debates + * Proposals + * Basic Spending Proposals +* Enhancements + * Rails 2.4.6 + * Ruby 2.2.3 \ No newline at end of file diff --git a/CODE_OF_CONDUCT_EN.md b/CODE_OF_CONDUCT.md similarity index 100% rename from CODE_OF_CONDUCT_EN.md rename to CODE_OF_CONDUCT.md diff --git a/CONTRIBUTING_EN.md b/CONTRIBUTING.md similarity index 77% rename from CONTRIBUTING_EN.md rename to CONTRIBUTING.md index 2c5f6a591..fabf10a0a 100644 --- a/CONTRIBUTING_EN.md +++ b/CONTRIBUTING.md @@ -1,15 +1,16 @@ # How to Contribute to this Project -## Team members +## Core team members -* Raimond Garcia [github](https://github.com/voodoorai2000) | [twitter](https://twitter.com/voodoorai2000) +* Raimond García [github](https://github.com/voodoorai2000) | [twitter](https://twitter.com/voodoorai2000) * Juanjo Bazán [github](https://github.com/xuanxu) | [twitter](https://twitter.com/xuanxu) * Enrique García Cota [github](https://github.com/kikito) | [twitter](https://twitter.com/otikik) -* Alberto Garcia Cabeza [github](https://github.com/decabeza) | [twitter](https://twitter.com/decabeza) +* Alberto García Cabeza [github](https://github.com/decabeza) | [twitter](https://twitter.com/decabeza) +* Alberto Calderón [github](https://github.com/bertocq) | [twitter](https://twitter.com/bertocq) ## Code of conduct -The team members and the project's community adopts an inclusive Code of Conduct that you can read in the [CODE_OF_CONDUCT_EN.md](CODE_OF_CONDUCT_EN.md) file. +The core team members and the project's community adopts an inclusive Code of Conduct that you can read in the [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) file. ## Report an issue @@ -34,7 +35,9 @@ If you want to contribute code to solve an issue: * Commit there your code to solve the issue. * Make sure all test are passing (and add specs to test any new feature if needed). * Follow these [best practices](https://github.com/styleguide/ruby) -* Open a *pull request* to the main repository describing what issue you are addressing. +* Open a *pull request* to the main repository describing what issue you are addressing. + +**Working on your first Pull Request?** You can learn how from this *free* series [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github) ## Cleaning up diff --git a/CONTRIBUTING_ES.md b/CONTRIBUTING_ES.md index 6be8be9cd..6b77c0f42 100644 --- a/CONTRIBUTING_ES.md +++ b/CONTRIBUTING_ES.md @@ -2,10 +2,11 @@ ## Miembros del equipo -* Raimond Garcia [github](https://github.com/voodoorai2000) | [twitter](https://twitter.com/voodoorai2000) +* Raimond García [github](https://github.com/voodoorai2000) | [twitter](https://twitter.com/voodoorai2000) * Juanjo Bazán [github](https://github.com/xuanxu) | [twitter](https://twitter.com/xuanxu) * Enrique García Cota [github](https://github.com/kikito) | [twitter](https://twitter.com/otikik) -* Alberto Garcia Cabeza [github](https://github.com/decabeza) | [twitter](https://twitter.com/decabeza) +* Alberto García Cabeza [github](https://github.com/decabeza) | [twitter](https://twitter.com/decabeza) +* Alberto Calderón [github](https://github.com/bertocq) | [twitter](https://twitter.com/bertocq) ## Código de conducta @@ -34,7 +35,10 @@ Cuando quieras resolver una incidencia mediante código: * Añade el código necesario para resolver la incidencia en tantos commits como sea preciso * Asegúrate de que los tests pasan (y escribe más tests para probar la nueva funcionalidad si fuera preciso) * Sigue estas [buenas prácticas](https://github.com/styleguide/ruby) -* Envía una *pull request* al repositorio principal indicando la incidencia que se está arreglando +* Envía una *pull request* al repositorio principal indicando la incidencia que se está arreglando. + +**¿Es tu primer Pull Request?** Puedes aprender en este curso gratuito (en inglés) sobre [cómo contribuir a un proyecto OpenSource en GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github) + ## Limpiar diff --git a/Gemfile b/Gemfile index 86ac55fd3..0f00da1ba 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.8' +gem 'rails', '4.2.9' # Use PostgreSQL gem 'pg', '~> 0.20.0' # Use SCSS for stylesheets @@ -88,10 +88,10 @@ group :development, :test do gem 'quiet_assets' gem 'letter_opener_web', '~> 1.3.1' gem 'i18n-tasks', '~> 0.9.15' - gem 'capistrano', '~> 3.8.1', require: false - gem 'capistrano-bundler', '~> 1.2', require: false - gem "capistrano-rails", '~> 1.2.3', require: false - gem 'rvm1-capistrano3', require: false + gem 'capistrano', '~> 3.8.1', require: false + gem 'capistrano-bundler', '~> 1.2', require: false + gem "capistrano-rails", '~> 1.2.3', require: false + gem 'rvm1-capistrano3', require: false gem 'capistrano3-delayed-job', '~> 1.7.3' gem "bullet", '~> 5.5.1' gem "faker", '~> 1.7.3' diff --git a/Gemfile.lock b/Gemfile.lock index 6a9d8a1ce..de9002e3a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,36 +2,36 @@ GEM remote: https://rubygems.org/ remote: https://rails-assets.org/ specs: - actionmailer (4.2.8) - actionpack (= 4.2.8) - actionview (= 4.2.8) - activejob (= 4.2.8) + actionmailer (4.2.9) + actionpack (= 4.2.9) + actionview (= 4.2.9) + activejob (= 4.2.9) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.8) - actionview (= 4.2.8) - activesupport (= 4.2.8) + actionpack (4.2.9) + actionview (= 4.2.9) + activesupport (= 4.2.9) 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.8) - activesupport (= 4.2.8) + actionview (4.2.9) + activesupport (= 4.2.9) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (4.2.8) - activesupport (= 4.2.8) + activejob (4.2.9) + activesupport (= 4.2.9) globalid (>= 0.3.0) - activemodel (4.2.8) - activesupport (= 4.2.8) + activemodel (4.2.9) + activesupport (= 4.2.9) builder (~> 3.1) - activerecord (4.2.8) - activemodel (= 4.2.8) - activesupport (= 4.2.8) + activerecord (4.2.9) + activemodel (= 4.2.9) + activesupport (= 4.2.9) arel (~> 6.0) - activesupport (4.2.8) + activesupport (4.2.9) i18n (~> 0.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) @@ -174,8 +174,8 @@ GEM rspec-core (~> 3.0) ruby-progressbar (~> 1.4) geocoder (1.4.3) - globalid (0.3.7) - activesupport (>= 4.1.0) + globalid (0.4.0) + activesupport (>= 4.2.0) graphiql-rails (1.4.1) rails graphql (1.6.3) @@ -188,7 +188,7 @@ GEM htmlentities (4.3.4) httpi (2.4.1) rack - i18n (0.8.1) + i18n (0.8.4) i18n-tasks (0.9.15) activesupport (>= 4.0.2) ast (>= 2.1.0) @@ -248,8 +248,8 @@ GEM mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) mimemagic (0.3.2) - mini_portile2 (2.1.0) - minitest (5.10.1) + mini_portile2 (2.2.0) + minitest (5.10.2) mixlib-cli (1.7.0) mixlib-config (2.2.4) multi_json (1.12.1) @@ -259,8 +259,8 @@ GEM net-ssh (>= 2.6.5) net-ssh (4.1.0) newrelic_rpm (4.1.0.333) - nokogiri (1.7.2) - mini_portile2 (~> 2.1.0) + nokogiri (1.8.0) + mini_portile2 (~> 2.2.0) nori (2.6.0) oauth (0.5.1) oauth2 (1.3.1) @@ -313,23 +313,23 @@ GEM public_suffix (2.0.5) quiet_assets (1.1.0) railties (>= 3.1, < 5.0) - rack (1.6.5) + rack (1.6.8) rack-accept (0.4.5) rack (>= 0.4) rack-attack (5.0.1) rack rack-test (0.6.3) rack (>= 1.0) - rails (4.2.8) - actionmailer (= 4.2.8) - actionpack (= 4.2.8) - actionview (= 4.2.8) - activejob (= 4.2.8) - activemodel (= 4.2.8) - activerecord (= 4.2.8) - activesupport (= 4.2.8) + rails (4.2.9) + actionmailer (= 4.2.9) + actionpack (= 4.2.9) + actionview (= 4.2.9) + activejob (= 4.2.9) + activemodel (= 4.2.9) + activerecord (= 4.2.9) + activesupport (= 4.2.9) bundler (>= 1.3.0, < 2.0) - railties (= 4.2.8) + railties (= 4.2.9) sprockets-rails rails-assets-markdown-it (8.2.1) rails-deprecated_sanitizer (1.0.3) @@ -340,9 +340,9 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) - railties (4.2.8) - actionpack (= 4.2.8) - activesupport (= 4.2.8) + railties (4.2.9) + actionpack (= 4.2.9) + activesupport (= 4.2.9) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rainbow (2.2.2) @@ -541,7 +541,7 @@ DEPENDENCIES pg_search poltergeist (~> 1.15.0) quiet_assets - rails (= 4.2.8) + rails (= 4.2.9) rails-assets-markdown-it! redcarpet (~> 3.4.0) responders (~> 2.4.0) diff --git a/README.md b/README.md index a9ec82550..8dbfcd281 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ Citizen Participation and Open Government Application [](https://rocketvalidator.com/opensource) [](https://gitter.im/consul/consul?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[](https://github.com/consul/consul/issues?q=is%3Aissue+is%3Aopen+label%3APRs-welcome) This is the opensource code repository of the eParticipation website originally developed for the Madrid City government eParticipation website @@ -51,7 +52,7 @@ Run the app locally: bin/rails s ``` -Prerequisites for testing: install PhantomJS >= 1.9.8 +Prerequisites for testing: install PhantomJS >= 2.1.1 Run the tests with: @@ -65,6 +66,8 @@ If you add SCSS code you can check it with: scss-lint ``` +To maintain accesibility level, if you add new colors use a [Color contrast checker](http://webaim.org/resources/contrastchecker/) (WCAG AA is mandatory, WCAG AAA is recommended) + If you work on Coffeescript code you can check it with [coffeelint](http://www.coffeelint.org/) (install with `npm install -g coffeelint`) : ``` @@ -100,4 +103,4 @@ Code published under AFFERO GPL v3 (see [LICENSE-AGPLv3.txt](LICENSE-AGPLv3.txt) ## Contributions -See [CONTRIBUTING_EN.md](CONTRIBUTING_EN.md) +See [CONTRIBUTING.md](CONTRIBUTING.md) diff --git a/README_ES.md b/README_ES.md index 81a7ba465..7b9267351 100644 --- a/README_ES.md +++ b/README_ES.md @@ -15,6 +15,7 @@ Aplicación de Participación Ciudadana y Gobierno Abierto [](https://rocketvalidator.com/opensource) [](https://gitter.im/consul/consul?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[](https://github.com/consul/consul/issues?q=is%3Aissue+is%3Aopen+label%3APRs-welcome) Este es el repositorio de código abierto de la Aplicación de Participación Ciudadana Consul, creada originariamente por el Ayuntamiento de Madrid. @@ -51,7 +52,7 @@ Para ejecutar la aplicación en local: bin/rails s ``` -Prerequisitos para los tests: tener instalado PhantomJS >= 1.9.8 +Prerequisitos para los tests: tener instalado PhantomJS >= 2.1.1 Para ejecutar los tests: @@ -65,6 +66,8 @@ Si añades código SCSS puedes revisarlo con: scss-lint ``` +Para mantener el nivel de accesibilidad, si añades colores nuevos utiliza un [Comprobador de contraste de color](http://webaim.org/resources/contrastchecker/) (WCAG AA es obligatorio, WCAG AAA es recomendable) + Si trabajas en código coffeescript puedes revisarlo con [coffeelint](http://www.coffeelint.org/) (instalalo con `npm install -g coffeelint`) : ``` diff --git a/app/assets/stylesheets/annotator_overrides.scss b/app/assets/stylesheets/annotator_overrides.scss index 9bf27f22c..c2cbe68ff 100644 --- a/app/assets/stylesheets/annotator_overrides.scss +++ b/app/assets/stylesheets/annotator_overrides.scss @@ -102,27 +102,47 @@ .annotator-hl { cursor: pointer; - background: rgba(255, 255, 10, 0.2); -} + background: rgba(255, 249, 218, 0.75); -.annotator-hl.weight-1 { - background: #fff9da; -} + &.weight-1 { + background: hsla(50, 100, 93, 0.5); -.annotator-hl.weight-2 { - background: #fff5bc; -} + .weight-1 { + background: hsla(50, 100, 93, 0.75); + } + } -.annotator-hl.weight-3 { - background: #fff1a2; -} + &.weight-2 { + background: hsla(63, 78, 86, 0.5); -.annotator-hl.weight-4 { - background: #ffef8c; -} + .weight-2 { + background: hsla(63, 78, 86, 0.75); + } + } -.annotator-hl.weight-5 { - background: #ffe95f; + &.weight-3 { + background: hsla(52, 100, 85, 0.5); + + .weight-3 { + background: hsla(52, 100, 85, 0.75); + } + } + + &.weight-4 { + background: hsla(51, 91, 75, 0.5); + + .weight-4 { + background: hsla(51, 91, 75, 0.75); + } + } + + &.weight-5 { + background: hsla(46, 83, 60, 0.5); + + .weight-5 { + background: hsla(46, 83, 60, 0.5); + } + } } .current-annotation { diff --git a/app/assets/stylesheets/layout.scss b/app/assets/stylesheets/layout.scss index 4359a2a31..9673cdc88 100644 --- a/app/assets/stylesheets/layout.scss +++ b/app/assets/stylesheets/layout.scss @@ -806,7 +806,7 @@ form { } } - [type]:not([type=submit]):not([type=file]):not([type=checkbox]):not([type=radio]) { + [type]:not([type=submit]):not([type=file]):not([type=checkbox]):not([type=radio]):not(.close-button) { background: #f8f8f8; height: $line-height * 2; margin-bottom: rem-calc(16); @@ -825,23 +825,6 @@ form { margin: $line-height / 2 0 $line-height / 2 $line-height / 4; } - .note, - .note-marked { - display: block; - font-size: rem-calc(13); - margin-bottom: $line-height / 2; - } - - .note-marked { - background: #ff0; - display: inline-block; - - em { - background: #fff; - display: block; - } - } - .ckeditor { min-height: $line-height * 13; } @@ -893,7 +876,7 @@ form { .callout { font-size: $small-font-size; - a { + a:not(.button) { font-weight: bold; text-decoration: underline; } @@ -945,6 +928,14 @@ form { } } +.callout { + + &.highlight, + &.light { + border: 0; + } +} + // 08. User account // ---------------- diff --git a/app/assets/stylesheets/participation.scss b/app/assets/stylesheets/participation.scss index a9cde9f55..8af8071ea 100644 --- a/app/assets/stylesheets/participation.scss +++ b/app/assets/stylesheets/participation.scss @@ -494,6 +494,109 @@ } } +.tab-milestones ul { + margin-top: rem-calc(40); + position: relative; + + li { + margin: 0 auto; + position: relative; + width: 0; + } + + li::before { + background: $budget; + border-radius: rem-calc(20); + content: ''; + height: rem-calc(20); + position: absolute; + top: 5px; + transform: translateX(-50%); + width: rem-calc(20); + z-index: 2; + } + + li::after { + background: $light-gray; + bottom: 100%; + content: ''; + height: 100%; + position: absolute; + top: 25px; + width: 1px; + z-index: 1; + } +} + +.tab-milestones ul .milestone-content { + padding: $line-height / 6 $line-height / 2; + position: relative; + + h3 { + margin-bottom: 0; + } + + .milestone-date { + color: $text-medium; + font-size: $small-font-size; + } +} + +.tab-milestones .timeline ul li:nth-child(odd), +.tab-milestones .timeline ul li:nth-child(even) { + + .milestone-content { + + @include breakpoint(medium) { + width: rem-calc(300); + } + + @include breakpoint(large) { + width: rem-calc(450); + } + } +} + +.tab-milestones .timeline ul li:nth-child(odd) { + + .milestone-content { + text-align: right; + + @include breakpoint(medium) { + margin-left: rem-calc(-315); + } + + @include breakpoint(large) { + margin-left: rem-calc(-465); + } + } +} + +.tab-milestones .timeline ul li:nth-child(even) { + + .milestone-content { + left: 15px; + } +} + +.tab-milestones { + @include breakpoint(small only) { + + .timeline ul li { + width: 100%; + + &:nth-child(odd), + &:nth-child(even) { + + .milestone-content { + left: 15px; + text-align: left; + } + } + } + } +} + // 04. List participation // ---------------------- diff --git a/app/controllers/admin/budget_headings_controller.rb b/app/controllers/admin/budget_headings_controller.rb index 56903b744..eea93716f 100644 --- a/app/controllers/admin/budget_headings_controller.rb +++ b/app/controllers/admin/budget_headings_controller.rb @@ -12,7 +12,7 @@ class Admin::BudgetHeadingsController < Admin::BaseController private def budget_heading_params - params.require(:budget_heading).permit(:name, :price, :geozone_id) + params.require(:budget_heading).permit(:name, :price, :population) end -end \ No newline at end of file +end diff --git a/app/controllers/admin/budget_investment_milestones_controller.rb b/app/controllers/admin/budget_investment_milestones_controller.rb new file mode 100644 index 000000000..a4b8acc5d --- /dev/null +++ b/app/controllers/admin/budget_investment_milestones_controller.rb @@ -0,0 +1,55 @@ +class Admin::BudgetInvestmentMilestonesController < Admin::BaseController + + before_action :load_budget_investment, only: [:index, :new, :create, :edit, :update, :destroy] + before_action :load_budget_investment_milestone, only: [:edit, :update, :destroy] + + def index + end + + def new + @milestone = Budget::Investment::Milestone.new + end + + def create + @milestone = Budget::Investment::Milestone.new(milestone_params) + @milestone.investment = @investment + if @milestone.save + redirect_to admin_budget_budget_investment_path(@investment.budget, @investment), notice: t('admin.milestones.create.notice') + else + render :new + end + end + + def edit + end + + def update + if @milestone.update(milestone_params) + redirect_to admin_budget_budget_investment_path(@investment.budget, @investment), notice: t('admin.milestones.update.notice') + else + render :edit + end + end + + def destroy + @milestone.destroy + redirect_to admin_budget_budget_investment_path(@investment.budget, @investment), notice: t('admin.milestones.delete.notice') + end + + private + + def milestone_params + params.require(:budget_investment_milestone) + .permit(:title, :description, :budget_investment_id) + end + + def load_budget_investment + @investment = Budget::Investment.find params[:budget_investment_id] + end + + def load_budget_investment_milestone + @milestone = Budget::Investment::Milestone.find params[:id] + end + + +end diff --git a/app/controllers/admin/budgets_controller.rb b/app/controllers/admin/budgets_controller.rb index 0b373c0bd..b37351028 100644 --- a/app/controllers/admin/budgets_controller.rb +++ b/app/controllers/admin/budgets_controller.rb @@ -14,10 +14,15 @@ class Admin::BudgetsController < Admin::BaseController @budget = Budget.includes(groups: :headings).find(params[:id]) end - def new - end + def new; end - def edit + def edit; end + + def calculate_winners + return unless @budget.balloting_process? + @budget.headings.each { |heading| Budget::Result.new(@budget, heading).calculate_winners } + redirect_to admin_budget_budget_investments_path(budget_id: @budget.id, filter: 'winners'), + notice: I18n.t("admin.budgets.winners.calculated") end def update diff --git a/app/controllers/admin/poll/polls_controller.rb b/app/controllers/admin/poll/polls_controller.rb index eda5736b0..cad91f218 100644 --- a/app/controllers/admin/poll/polls_controller.rb +++ b/app/controllers/admin/poll/polls_controller.rb @@ -60,13 +60,14 @@ class Admin::Poll::PollsController < Admin::BaseController end def search_questions - @questions = ::Poll::Question.where("poll_id IS ? OR poll_id != ?", nil, @poll.id).search({search: @search}).order(title: :asc) + @questions = ::Poll::Question.where("poll_id IS ? OR poll_id != ?", nil, @poll.id).search(search: @search).order(title: :asc) respond_to do |format| format.js end end private + def load_geozones @geozones = Geozone.all.order(:name) end diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index f17afff4c..63ec8cf52 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -1,7 +1,7 @@ class Admin::SettingsController < Admin::BaseController def index - all_settings = (Setting.all).group_by { |s| s.type } + all_settings = (Setting.all).group_by { |s| s.type } @settings = all_settings['common'] @feature_flags = all_settings['feature'] @banner_styles = all_settings['banner-style'] diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index d1dd1c79c..e36a6a4f0 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -4,7 +4,7 @@ class Admin::UsersController < Admin::BaseController def index if params[:search] s = params[:search] - @users = User.where("username ILIKE ? OR email ILIKE ? OR document_number ILIKE ?", "%#{s}%","%#{s}%","%#{s}%").page(params[:page]) + @users = User.where("username ILIKE ? OR email ILIKE ? OR document_number ILIKE ?", "%#{s}%", "%#{s}%", "%#{s}%").page(params[:page]) else @users = @users.page(params[:page]) end diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index f6bba1200..9ad48c1b7 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -93,7 +93,7 @@ module Budgets def set_random_seed if params[:order] == 'random' || params[:order].blank? - params[:random_seed] ||= rand(99)/100.0 + params[:random_seed] ||= rand(99) / 100.0 seed = Float(params[:random_seed]) rescue 0 Budget::Investment.connection.execute("select setseed(#{seed})") else diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb index 762239dc8..5f3fd0a9f 100644 --- a/app/controllers/graphql_controller.rb +++ b/app/controllers/graphql_controller.rb @@ -36,7 +36,7 @@ class GraphqlController < ApplicationController def query_string if request.headers["CONTENT_TYPE"] == 'application/graphql' - request.body.string # request.body.class => StringIO + request.body.string # request.body.class => StringIO else params[:query] end diff --git a/app/controllers/legislation/answers_controller.rb b/app/controllers/legislation/answers_controller.rb index 6d3c33580..36f87de1f 100644 --- a/app/controllers/legislation/answers_controller.rb +++ b/app/controllers/legislation/answers_controller.rb @@ -19,13 +19,14 @@ class Legislation::AnswersController < Legislation::BaseController end else respond_to do |format| - format.js { render json: {} , status: :not_found } + format.js { render json: {}, status: :not_found } format.html { redirect_to legislation_process_question_path(@process, @question), alert: t('legislation.questions.participation.phase_not_open') } end end end private + def answer_params params.require(:legislation_answer).permit( :legislation_question_option_id, diff --git a/app/controllers/management/budgets/investments_controller.rb b/app/controllers/management/budgets/investments_controller.rb index 6c1e1bfcd..d4ecac8d4 100644 --- a/app/controllers/management/budgets/investments_controller.rb +++ b/app/controllers/management/budgets/investments_controller.rb @@ -20,7 +20,7 @@ class Management::Budgets::InvestmentsController < Management::BaseController @investment.author = managed_user if @investment.save - notice= t('flash.actions.create.notice', resource_name: Budget::Investment.model_name.human, count: 1) + notice = t('flash.actions.create.notice', resource_name: Budget::Investment.model_name.human, count: 1) redirect_to management_budget_investment_path(@budget, @investment), notice: notice else render :new diff --git a/app/controllers/officing/final_recounts_controller.rb b/app/controllers/officing/final_recounts_controller.rb index e381240e7..8be6e1a91 100644 --- a/app/controllers/officing/final_recounts_controller.rb +++ b/app/controllers/officing/final_recounts_controller.rb @@ -28,6 +28,7 @@ class Officing::FinalRecountsController < Officing::BaseController end private + def load_poll @poll = Poll.expired.find(params[:poll_id]) end diff --git a/app/controllers/officing/recounts_controller.rb b/app/controllers/officing/recounts_controller.rb index 1c66e57fd..9e3989c05 100644 --- a/app/controllers/officing/recounts_controller.rb +++ b/app/controllers/officing/recounts_controller.rb @@ -27,6 +27,7 @@ class Officing::RecountsController < Officing::BaseController end private + def load_poll @poll = Poll.find(params[:poll_id]) end diff --git a/app/controllers/sandbox_controller.rb b/app/controllers/sandbox_controller.rb index 12b5dd91e..b1a143f54 100644 --- a/app/controllers/sandbox_controller.rb +++ b/app/controllers/sandbox_controller.rb @@ -14,10 +14,10 @@ class SandboxController < ApplicationController def show if params[:template].index('.') # CVE-2014-0130 - render :action => "index" + render action: "index" elsif lookup_context.exists?("sandbox/#{params[:template]}") if params[:template] == "index" - render :action => "index" + render action: "index" else render "sandbox/#{params[:template]}" end @@ -25,7 +25,7 @@ class SandboxController < ApplicationController elsif lookup_context.exists?("sandbox/#{params[:template]}/index") render "sandbox/#{params[:template]}/index" else - render :action => "index" + render action: "index" end end diff --git a/app/controllers/stats_controller.rb b/app/controllers/stats_controller.rb index ab6bedd6e..cd2efac6b 100644 --- a/app/controllers/stats_controller.rb +++ b/app/controllers/stats_controller.rb @@ -23,6 +23,6 @@ class StatsController < ApplicationController private def daily_cache(key, &block) - Rails.cache.fetch("public_stats/#{Time.current.strftime("%Y-%m-%d")}/#{key}", &block) + Rails.cache.fetch("public_stats/#{Time.current.strftime('%Y-%m-%d')}/#{key}", &block) end end diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index cbe43390b..ef1ef31de 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -30,7 +30,7 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController identity = Identity.first_or_create_from_oauth(auth) @user = current_user || identity.user || User.first_or_initialize_for_oauth(auth) - if save_user(@user) + if save_user identity.update(user: @user) sign_in_and_redirect @user, event: :authentication set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format? @@ -40,8 +40,8 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController end end - def save_user(user) + def save_user @user.save || @user.save_requiring_finish_signup end -end \ No newline at end of file +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9bd98aedd..e99102396 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -10,6 +10,7 @@ class UsersController < ApplicationController end private + def set_activity_counts @activity_counts = HashWithIndifferentAccess.new( proposals: Proposal.where(author_id: @user.id).count, @@ -24,7 +25,7 @@ class UsersController < ApplicationController when "proposals" then load_proposals when "debates" then load_debates when "budget_investments" then load_budget_investments - when "comments" then load_comments + when "comments" then load_comments else load_available_activity end end diff --git a/app/controllers/valuation/spending_proposals_controller.rb b/app/controllers/valuation/spending_proposals_controller.rb index 623c9ac46..1273b80b6 100644 --- a/app/controllers/valuation/spending_proposals_controller.rb +++ b/app/controllers/valuation/spending_proposals_controller.rb @@ -58,7 +58,7 @@ class Valuation::SpendingProposalsController < Valuation::BaseController end def params_for_current_valuator - params.merge({valuator_id: current_user.valuator.id}) + params.merge(valuator_id: current_user.valuator.id) end def restrict_access_to_assigned_items diff --git a/app/helpers/ballots_helper.rb b/app/helpers/ballots_helper.rb index ece1be9fa..8bdc5f231 100644 --- a/app/helpers/ballots_helper.rb +++ b/app/helpers/ballots_helper.rb @@ -1,7 +1,7 @@ module BallotsHelper def progress_bar_width(amount_available, amount_spent) - (amount_spent/amount_available.to_f * 100).to_s + "%" + (amount_spent / amount_available.to_f * 100).to_s + "%" end end \ No newline at end of file diff --git a/app/helpers/cache_keys_helper.rb b/app/helpers/cache_keys_helper.rb index 566b3cd81..75fc4a0ea 100644 --- a/app/helpers/cache_keys_helper.rb +++ b/app/helpers/cache_keys_helper.rb @@ -1,11 +1,11 @@ module CacheKeysHelper - def locale_and_user_status(authorable=nil) + def locale_and_user_status(authorable = nil) @cache_key_user ||= calculate_user_status(authorable) "#{I18n.locale}/#{@cache_key_user}" end - def calculate_user_status(authorable=nil) + def calculate_user_status(authorable = nil) user_status = "user" if user_signed_in? diff --git a/app/helpers/embed_videos_helper.rb b/app/helpers/embed_videos_helper.rb index cb077ef36..1034a7a59 100644 --- a/app/helpers/embed_videos_helper.rb +++ b/app/helpers/embed_videos_helper.rb @@ -11,7 +11,7 @@ module EmbedVideosHelper if server == "Vimeo" reg_exp = /vimeo.*(staffpicks\/|channels\/|videos\/|video\/|\/)([^#\&\?]*).*/ - src = "https://player.vimeo.com/video/" + src = "https://player.vimeo.com/video/" elsif server == "YouTube" reg_exp = /youtu.*(be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/ src = "https://www.youtube.com/embed/" diff --git a/app/helpers/officing_helper.rb b/app/helpers/officing_helper.rb index f5bdb26ea..8ee97cf52 100644 --- a/app/helpers/officing_helper.rb +++ b/app/helpers/officing_helper.rb @@ -13,7 +13,7 @@ module OfficingHelper officer_assignments.each do |oa| options << [oa.booth_assignment.booth.name.to_s, oa.id] end - options.sort! {|x, y| x[0]<=>y[0]} + options.sort! {|x, y| x[0] <=> y[0]} options_for_select(options, params[:oa]) end diff --git a/app/helpers/poll_recounts_helper.rb b/app/helpers/poll_recounts_helper.rb index c47402163..60e3da6d7 100644 --- a/app/helpers/poll_recounts_helper.rb +++ b/app/helpers/poll_recounts_helper.rb @@ -9,7 +9,7 @@ module PollRecountsHelper end def booth_assignment_sum_final_recounts(ba) - ba.final_recounts.any? ? ba.final_recounts.to_a.sum(&:count) :nil + ba.final_recounts.any? ? ba.final_recounts.to_a.sum(&:count) : nil end end \ No newline at end of file diff --git a/app/helpers/proposals_helper.rb b/app/helpers/proposals_helper.rb index 578cd1d8e..37425d573 100644 --- a/app/helpers/proposals_helper.rb +++ b/app/helpers/proposals_helper.rb @@ -18,7 +18,7 @@ module ProposalsHelper end end - def namespaced_proposal_path(proposal, options={}) + def namespaced_proposal_path(proposal, options = {}) @namespace_proposal_path ||= namespace case @namespace_proposal_path when "management" diff --git a/app/helpers/spending_proposals_helper.rb b/app/helpers/spending_proposals_helper.rb index 26026952f..81d16e5fd 100644 --- a/app/helpers/spending_proposals_helper.rb +++ b/app/helpers/spending_proposals_helper.rb @@ -4,7 +4,7 @@ module SpendingProposalsHelper ActsAsTaggableOn::Tag.spending_proposal_tags.pluck(:name) end - def namespaced_spending_proposal_path(spending_proposal, options={}) + def namespaced_spending_proposal_path(spending_proposal, options = {}) @namespace_spending_proposal_path ||= namespace case @namespace_spending_proposal_path when "management" diff --git a/app/helpers/stats_helper.rb b/app/helpers/stats_helper.rb index d8eff0ac2..19b54a5a2 100644 --- a/app/helpers/stats_helper.rb +++ b/app/helpers/stats_helper.rb @@ -1,27 +1,27 @@ module StatsHelper - def events_chart_tag(events, opt={}) + def events_chart_tag(events, opt = {}) events = events.join(',') if events.is_a? Array opt[:data] ||= {} opt[:data][:graph] = admin_api_stats_path(events: events) content_tag :div, "", opt end - def visits_chart_tag(opt={}) + def visits_chart_tag(opt = {}) events = events.join(',') if events.is_a? Array opt[:data] ||= {} opt[:data][:graph] = admin_api_stats_path(visits: true) content_tag :div, "", opt end - def spending_proposals_chart_tag(opt={}) + def spending_proposals_chart_tag(opt = {}) events = events.join(',') if events.is_a? Array opt[:data] ||= {} opt[:data][:graph] = admin_api_stats_path(spending_proposals: true) content_tag :div, "", opt end - def budget_investments_chart_tag(opt={}) + def budget_investments_chart_tag(opt = {}) events = events.join(',') if events.is_a? Array opt[:data] ||= {} opt[:data][:graph] = admin_api_stats_path(budget_investments: true) diff --git a/app/helpers/tracks_helper.rb b/app/helpers/tracks_helper.rb index 557d71802..0d6793e08 100644 --- a/app/helpers/tracks_helper.rb +++ b/app/helpers/tracks_helper.rb @@ -1,6 +1,6 @@ module TracksHelper - def track_event(data={}) + def track_event(data = {}) track_data = "" prefix = " data-track-event-" data.each do |key, value| diff --git a/app/helpers/valuation_helper.rb b/app/helpers/valuation_helper.rb index ded5fa0ed..4913b3d00 100644 --- a/app/helpers/valuation_helper.rb +++ b/app/helpers/valuation_helper.rb @@ -1,6 +1,6 @@ module ValuationHelper - def valuator_select_options(valuator=nil) + def valuator_select_options(valuator = nil) if valuator.present? Valuator.where.not(id: valuator.id).order("description ASC").order("users.email ASC").includes(:user).collect { |v| [ v.description_or_email, v.id ] }.prepend([valuator.description_or_email, valuator.id]) else diff --git a/app/helpers/verification_helper.rb b/app/helpers/verification_helper.rb index 62be1a5a8..44f921264 100644 --- a/app/helpers/verification_helper.rb +++ b/app/helpers/verification_helper.rb @@ -18,7 +18,7 @@ module VerificationHelper data_to_mask = match[2] email_provider = match[3] - data_to_display + "*"*data_to_mask.size + "@" + email_provider + data_to_display + "*" * data_to_mask.size + "@" + email_provider end end diff --git a/app/mailers/devise_mailer.rb b/app/mailers/devise_mailer.rb index 6c053cb52..a914477fe 100644 --- a/app/mailers/devise_mailer.rb +++ b/app/mailers/devise_mailer.rb @@ -5,7 +5,7 @@ class DeviseMailer < Devise::Mailer protected - def devise_mail(record, action, opts={}) + def devise_mail(record, action, opts = {}) I18n.with_locale record.locale do super(record, action, opts) end diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb index 1aba9dd7c..9d779299d 100644 --- a/app/models/abilities/administrator.rb +++ b/app/models/abilities/administrator.rb @@ -44,7 +44,7 @@ module Abilities can [:read, :update, :valuate, :destroy, :summary], SpendingProposal - can [:index, :read, :new, :create, :update, :destroy], Budget + can [:index, :read, :new, :create, :update, :destroy, :calculate_winners], Budget can [:read, :create, :update, :destroy], Budget::Group can [:read, :create, :update, :destroy], Budget::Heading can [:hide, :update, :toggle_selection], Budget::Investment diff --git a/app/models/abilities/common.rb b/app/models/abilities/common.rb index 16747c8a7..71e839d3d 100644 --- a/app/models/abilities/common.rb +++ b/app/models/abilities/common.rb @@ -48,7 +48,7 @@ module Abilities can :create, Budget::Investment, budget: { phase: "accepting" } can :suggest, Budget::Investment, budget: { phase: "accepting" } can :destroy, Budget::Investment, budget: { phase: ["accepting", "reviewing"] }, author_id: user.id - can :vote, Budget::Investment, budget: { phase: "selecting" } + can :vote, Budget::Investment, budget: { phase: "selecting" } can [:show, :create], Budget::Ballot, budget: { phase: "balloting" } can [:create, :destroy], Budget::Ballot::Line, budget: { phase: "balloting" } diff --git a/app/models/activity.rb b/app/models/activity.rb index 0fc35ad11..6c357d891 100644 --- a/app/models/activity.rb +++ b/app/models/activity.rb @@ -1,8 +1,8 @@ class Activity < ActiveRecord::Base - belongs_to :actionable, -> { with_hidden }, polymorphic: true + belongs_to :actionable, -> { with_hidden }, polymorphic: true belongs_to :user, -> { with_hidden } - VALID_ACTIONS = %w( hide block restore valuate ) + VALID_ACTIONS = %w(hide block restore valuate) validates :action, inclusion: {in: VALID_ACTIONS} diff --git a/app/models/ahoy/data_source.rb b/app/models/ahoy/data_source.rb index 2d52063bb..5c69af755 100644 --- a/app/models/ahoy/data_source.rb +++ b/app/models/ahoy/data_source.rb @@ -10,7 +10,7 @@ module Ahoy # chart def add(name, collection) collections.push data: collection, name: name - collection.each{ |k,v| add_key k } + collection.each{ |k, v| add_key k } end def build diff --git a/app/models/banner.rb b/app/models/banner.rb index c4f2295e6..8e816d446 100644 --- a/app/models/banner.rb +++ b/app/models/banner.rb @@ -5,16 +5,15 @@ class Banner < ActiveRecord::Base validates :title, presence: true, length: { minimum: 2 } - validates :description, presence: true + validates :description, presence: true validates :target_url, presence: true validates :style, presence: true validates :image, presence: true validates :post_started_at, presence: true validates :post_ended_at, presence: true - scope :with_active, -> {where("post_started_at <= ?", Time.current). - where("post_ended_at >= ?", Time.current) } + scope :with_active, -> { where("post_started_at <= ?", Time.current).where("post_ended_at >= ?", Time.current) } - scope :with_inactive,-> {where("post_started_at > ? or post_ended_at < ?", Time.current, Time.current) } + scope :with_inactive, -> { where("post_started_at > ? or post_ended_at < ?", Time.current, Time.current) } end diff --git a/app/models/budget.rb b/app/models/budget.rb index a5932921c..bc7231f29 100644 --- a/app/models/budget.rb +++ b/app/models/budget.rb @@ -67,8 +67,12 @@ class Budget < ActiveRecord::Base phase == "finished" end + def balloting_process? + balloting? || reviewing_ballots? + end + def balloting_or_later? - balloting? || reviewing_ballots? || finished? + balloting_process? || finished? end def on_hold? diff --git a/app/models/budget/investment.rb b/app/models/budget/investment.rb index b3b51996c..0d9c738b9 100644 --- a/app/models/budget/investment.rb +++ b/app/models/budget/investment.rb @@ -20,13 +20,14 @@ class Budget has_many :valuator_assignments, dependent: :destroy has_many :valuators, through: :valuator_assignments has_many :comments, as: :commentable + has_many :milestones validates :title, presence: true validates :author, presence: true validates :description, presence: true validates :heading_id, presence: true - validates_presence_of :unfeasibility_explanation, if: :unfeasibility_explanation_required? - validates_presence_of :price, if: :price_required? + validates :unfeasibility_explanation, presence: { if: :unfeasibility_explanation_required? } + validates :price, presence: { if: :price_required? } validates :title, length: { in: 4..Budget::Investment.title_max_length } validates :description, length: { maximum: Budget::Investment.description_max_length } @@ -59,7 +60,7 @@ class Budget scope :by_tag, ->(tag_name) { tagged_with(tag_name) } scope :by_valuator, ->(valuator_id) { where("budget_valuator_assignments.valuator_id = ?", valuator_id).joins(:valuator_assignments) } - scope :for_render, -> { includes(:heading) } + scope :for_render, -> { includes(:heading) } before_save :calculate_confidence_score before_validation :set_responsible_name @@ -204,8 +205,8 @@ class Budget end def should_show_aside? - (budget.selecting? && !unfeasible?) || - (budget.balloting? && feasible?) || + (budget.selecting? && !unfeasible?) || + (budget.balloting? && feasible?) || (budget.valuating? && !unfeasible?) end diff --git a/app/models/budget/investment/milestone.rb b/app/models/budget/investment/milestone.rb new file mode 100644 index 000000000..9ecbe4dc3 --- /dev/null +++ b/app/models/budget/investment/milestone.rb @@ -0,0 +1,14 @@ +class Budget + class Investment + class Milestone < ActiveRecord::Base + belongs_to :investment + + validates :title, presence: true + validates :investment, presence: true + + def self.title_max_length + 80 + end + end + end +end diff --git a/app/models/budget/result.rb b/app/models/budget/result.rb index f29bc72cc..f835bce0c 100644 --- a/app/models/budget/result.rb +++ b/app/models/budget/result.rb @@ -12,11 +12,10 @@ class Budget reset_winners investments.each do |investment| @current_investment = investment - if inside_budget? - set_winner - end + set_winner if inside_budget? end end + handle_asynchronously :calculate_winners def investments heading.investments.selected.sort_by_ballots @@ -52,4 +51,4 @@ class Budget end end -end \ No newline at end of file +end diff --git a/app/models/comment.rb b/app/models/comment.rb index ffa02d09c..5c7f4dd4e 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -13,7 +13,7 @@ class Comment < ActiveRecord::Base validates :body, presence: true validates :user, presence: true - validates_inclusion_of :commentable_type, in: ["Debate", "Proposal", "Budget::Investment", "Poll::Question", "Legislation::Question", "Legislation::Annotation"] + validates :commentable_type, inclusion: { in: ["Debate", "Proposal", "Budget::Investment", "Poll::Question", "Legislation::Question", "Legislation::Annotation"] } validate :validate_body_length @@ -44,7 +44,7 @@ class Comment < ActiveRecord::Base after_create :call_after_commented - def self.build(commentable, user, body, p_id=nil) + def self.build(commentable, user, body, p_id = nil) new commentable: commentable, user_id: user.id, body: body, @@ -64,7 +64,7 @@ class Comment < ActiveRecord::Base end def author=(author) - self.user= author + self.user = author end def total_votes diff --git a/app/models/concerns/conflictable.rb b/app/models/concerns/conflictable.rb index a1926aa36..b362ef1d1 100644 --- a/app/models/concerns/conflictable.rb +++ b/app/models/concerns/conflictable.rb @@ -3,7 +3,7 @@ module Conflictable def conflictive? return false unless flags_count > 0 && cached_votes_up > 0 - cached_votes_up/flags_count.to_f < 5 + cached_votes_up / flags_count.to_f < 5 end end diff --git a/app/models/concerns/filterable.rb b/app/models/concerns/filterable.rb index 68e844782..c5402d9b2 100644 --- a/app/models/concerns/filterable.rb +++ b/app/models/concerns/filterable.rb @@ -2,8 +2,8 @@ module Filterable extend ActiveSupport::Concern included do - scope :by_official_level, -> (official_level) { where(users: { official_level: official_level }).joins(:author) } - scope :by_date_range, -> (date_range) { where(created_at: date_range) } + scope :by_official_level, ->(official_level) { where(users: { official_level: official_level }).joins(:author) } + scope :by_date_range, ->(date_range) { where(created_at: date_range) } end class_methods do diff --git a/app/models/concerns/search_cache.rb b/app/models/concerns/search_cache.rb index a5b7acb5f..9b9e62024 100644 --- a/app/models/concerns/search_cache.rb +++ b/app/models/concerns/search_cache.rb @@ -14,7 +14,7 @@ module SearchCache def searchable_values_sql searchable_values - .select{ |k,_| k.present? } + .select{ |k, _| k.present? } .collect{ |value, weight| set_tsvector(value, weight) } .join(" || ") end @@ -31,5 +31,4 @@ module SearchCache ActionController::Base.helpers.sanitize(value, tags: []) end - end diff --git a/app/models/concerns/searchable.rb b/app/models/concerns/searchable.rb index 147a37fbc..6694df114 100644 --- a/app/models/concerns/searchable.rb +++ b/app/models/concerns/searchable.rb @@ -16,4 +16,4 @@ module Searchable } end -end \ No newline at end of file +end diff --git a/app/models/concerns/taggable.rb b/app/models/concerns/taggable.rb index 9126e271a..57a30414d 100644 --- a/app/models/concerns/taggable.rb +++ b/app/models/concerns/taggable.rb @@ -9,7 +9,7 @@ module Taggable def tag_list_with_limit(limit = nil) return tags if limit.blank? - tags.sort{|a,b| b.taggings_count <=> a.taggings_count}[0, limit] + tags.sort{|a, b| b.taggings_count <=> a.taggings_count}[0, limit] end def tags_count_out_of_limit(limit = nil) diff --git a/app/models/concerns/verification.rb b/app/models/concerns/verification.rb index 4eb933204..a4770117e 100644 --- a/app/models/concerns/verification.rb +++ b/app/models/concerns/verification.rb @@ -7,7 +7,7 @@ module Verification scope :level_two_verified, -> { where("users.level_two_verified_at IS NOT NULL OR (users.confirmed_phone IS NOT NULL AND users.residence_verified_at IS NOT NULL) AND verified_at IS NULL") } scope :level_two_or_three_verified, -> { where("users.verified_at IS NOT NULL OR users.level_two_verified_at IS NOT NULL OR (users.confirmed_phone IS NOT NULL AND users.residence_verified_at IS NOT NULL)") } scope :unverified, -> { where("users.verified_at IS NULL AND (users.level_two_verified_at IS NULL AND (users.residence_verified_at IS NULL OR users.confirmed_phone IS NULL))") } - scope :incomplete_verification, -> { where("(users.residence_verified_at IS NULL AND users.failed_census_calls_count > ?) OR (users.residence_verified_at IS NOT NULL AND (users.unconfirmed_phone IS NULL OR users.confirmed_phone IS NULL))", 0) } + scope :incomplete_verification, -> { where("(users.residence_verified_at IS NULL AND users.failed_census_calls_count > ?) OR (users.residence_verified_at IS NOT NULL AND (users.unconfirmed_phone IS NULL OR users.confirmed_phone IS NULL))", 0) } end def verification_email_sent? @@ -47,7 +47,7 @@ module Verification end def failed_residence_verification? - !residence_verified? && failed_census_calls.size > 0 + !residence_verified? && !failed_census_calls.empty? end def no_phone_available? diff --git a/app/models/flag.rb b/app/models/flag.rb index 735ef89e9..824175b07 100644 --- a/app/models/flag.rb +++ b/app/models/flag.rb @@ -23,7 +23,7 @@ class Flag < ActiveRecord::Base def self.flagged?(user, flaggable) return false unless user - !! by_user_and_flaggable(user, flaggable).try(:first) + !!by_user_and_flaggable(user, flaggable).try(:first) end end diff --git a/app/models/geozone.rb b/app/models/geozone.rb index ad0fe9cd5..a52ab5d15 100644 --- a/app/models/geozone.rb +++ b/app/models/geozone.rb @@ -1,7 +1,7 @@ class Geozone < ActiveRecord::Base include Graphqlable - + has_many :proposals has_many :spending_proposals has_many :debates diff --git a/app/models/legislation/annotation.rb b/app/models/legislation/annotation.rb index 92fa9dd86..f2d419200 100644 --- a/app/models/legislation/annotation.rb +++ b/app/models/legislation/annotation.rb @@ -35,7 +35,7 @@ class Legislation::Annotation < ActiveRecord::Base selector_end = "/html/body/#{range_end}" el_end = doc.at_xpath(selector_end) - remainder_el_start = el_start.text[0 .. range_start_offset-1] unless range_start_offset.zero? + remainder_el_start = el_start.text[0 .. range_start_offset - 1] unless range_start_offset.zero? remainder_el_end = el_end.text[range_end_offset .. -1] self.context = "#{remainder_el_start}#{quote}#{remainder_el_end}" diff --git a/app/models/legislation/question.rb b/app/models/legislation/question.rb index 4381b752a..09449b449 100644 --- a/app/models/legislation/question.rb +++ b/app/models/legislation/question.rb @@ -9,7 +9,7 @@ class Legislation::Question < ActiveRecord::Base has_many :answers, class_name: 'Legislation::Answer', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :question has_many :comments, as: :commentable, dependent: :destroy - accepts_nested_attributes_for :question_options, :reject_if => proc { |attributes| attributes[:value].blank? }, allow_destroy: true + accepts_nested_attributes_for :question_options, reject_if: proc { |attributes| attributes[:value].blank? }, allow_destroy: true validates :process, presence: true validates :title, presence: true diff --git a/app/models/notification.rb b/app/models/notification.rb index bbbb18942..d08baecf2 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -7,7 +7,6 @@ class Notification < ActiveRecord::Base scope :not_emailed, -> { where(emailed_at: nil) } scope :for_render, -> { includes(:notifiable) } - def timestamp notifiable.created_at end diff --git a/app/models/officing/residence.rb b/app/models/officing/residence.rb index 92333cc80..b0fc56078 100644 --- a/app/models/officing/residence.rb +++ b/app/models/officing/residence.rb @@ -6,14 +6,14 @@ class Officing::Residence before_validation :call_census_api - validates_presence_of :document_number - validates_presence_of :document_type - validates_presence_of :year_of_birth + validates :document_number, presence: true + validates :document_type, presence: true + validates :year_of_birth, presence: true validate :allowed_age validate :residence_in_madrid - def initialize(attrs={}) + def initialize(attrs = {}) super clean_document_number end @@ -43,14 +43,13 @@ class Officing::Residence end def store_failed_census_call - FailedCensusCall.create({ + FailedCensusCall.create( user: user, document_number: document_number, - document_type: document_type, - year_of_birth: year_of_birth, - poll_officer: officer - }) - + document_type: document_type, + year_of_birth: year_of_birth, + poll_officer: officer + ) end def user_exists? diff --git a/app/models/organization.rb b/app/models/organization.rb index 94ef986a1..f3f8956d5 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -1,7 +1,7 @@ class Organization < ActiveRecord::Base include Graphqlable - + belongs_to :user, touch: true validates :name, presence: true diff --git a/app/models/poll.rb b/app/models/poll.rb index c6be3073a..6d033f514 100644 --- a/app/models/poll.rb +++ b/app/models/poll.rb @@ -18,7 +18,7 @@ class Poll < ActiveRecord::Base scope :current, -> { where('starts_at <= ? and ? <= ends_at', Time.current, Time.current) } scope :incoming, -> { where('? < starts_at', Time.current) } scope :expired, -> { where('ends_at < ?', Time.current) } - scope :published, -> { where('published = ?', true) } + scope :published, -> { where('published = ?', true) } scope :by_geozone_id, ->(geozone_id) { where(geozones: {id: geozone_id}.joins(:geozones)) } scope :sort_for_list, -> { order(:geozone_restricted, :starts_at, :name) } diff --git a/app/models/poll/null_result.rb b/app/models/poll/null_result.rb index d1724037b..bdd708504 100644 --- a/app/models/poll/null_result.rb +++ b/app/models/poll/null_result.rb @@ -2,7 +2,7 @@ class Poll::NullResult < ActiveRecord::Base VALID_ORIGINS = %w{web booth} - belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id' + belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id' belongs_to :booth_assignment belongs_to :officer_assignment diff --git a/app/models/poll/question.rb b/app/models/poll/question.rb index dd4eae3bc..a1d949d42 100644 --- a/app/models/poll/question.rb +++ b/app/models/poll/question.rb @@ -19,7 +19,7 @@ class Poll::Question < ActiveRecord::Base validates :title, length: { minimum: 4 } validates :description, length: { maximum: Poll::Question.description_max_length } - scope :by_poll_id, ->(poll_id) { where(poll_id: poll_id) } + scope :by_poll_id, ->(poll_id) { where(poll_id: poll_id) } scope :sort_for_list, -> { order('poll_questions.proposal_id IS NULL', :created_at)} scope :for_render, -> { includes(:author, :proposal) } diff --git a/app/models/poll/white_result.rb b/app/models/poll/white_result.rb index 6ca613d05..3f41795b3 100644 --- a/app/models/poll/white_result.rb +++ b/app/models/poll/white_result.rb @@ -2,7 +2,7 @@ class Poll::WhiteResult < ActiveRecord::Base VALID_ORIGINS = %w{web booth} - belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id' + belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id' belongs_to :booth_assignment belongs_to :officer_assignment diff --git a/app/models/proposal.rb b/app/models/proposal.rb index f37dff3d5..8c7e2065a 100644 --- a/app/models/proposal.rb +++ b/app/models/proposal.rb @@ -38,8 +38,8 @@ class Proposal < ActiveRecord::Base before_save :calculate_hot_score, :calculate_confidence_score - scope :for_render, -> { includes(:tags) } - scope :sort_by_hot_score , -> { reorder(hot_score: :desc) } + scope :for_render, -> { includes(:tags) } + scope :sort_by_hot_score, -> { reorder(hot_score: :desc) } scope :sort_by_confidence_score, -> { reorder(confidence_score: :desc) } scope :sort_by_created_at, -> { reorder(created_at: :desc) } scope :sort_by_most_commented, -> { reorder(comments_count: :desc) } @@ -128,7 +128,7 @@ class Proposal < ActiveRecord::Base end def code - "#{Setting["proposal_code_prefix"]}-#{created_at.strftime('%Y-%m')}-#{id}" + "#{Setting['proposal_code_prefix']}-#{created_at.strftime('%Y-%m')}-#{id}" end def after_commented diff --git a/app/models/setting.rb b/app/models/setting.rb index 9010abba5..34c45aeed 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -2,8 +2,8 @@ class Setting < ActiveRecord::Base validates :key, presence: true, uniqueness: true default_scope { order(id: :asc) } - scope :banner_style, -> { where("key ilike ?", "banner-style.%")} - scope :banner_img, -> { where("key ilike ?", "banner-img.%")} + scope :banner_style, -> { where("key ilike ?", "banner-style.%")} + scope :banner_img, -> { where("key ilike ?", "banner-img.%")} def type if feature_flag? diff --git a/app/models/spending_proposal.rb b/app/models/spending_proposal.rb index 223e9adfe..8026a3b9f 100644 --- a/app/models/spending_proposal.rb +++ b/app/models/spending_proposal.rb @@ -15,7 +15,7 @@ class SpendingProposal < ActiveRecord::Base validates :title, presence: true validates :author, presence: true validates :description, presence: true - validates_presence_of :feasible_explanation, if: :feasible_explanation_required? + validates :feasible_explanation, presence: { if: :feasible_explanation_required? } validates :title, length: { in: 4..SpendingProposal.title_max_length } validates :description, length: { maximum: SpendingProposal.description_max_length } @@ -31,11 +31,11 @@ class SpendingProposal < ActiveRecord::Base scope :not_unfeasible, -> { where("feasible IS ? OR feasible = ?", nil, true) } scope :with_supports, -> { where('cached_votes_up > 0') } - scope :by_admin, -> (admin) { where(administrator_id: admin.presence) } - scope :by_tag, -> (tag_name) { tagged_with(tag_name) } - scope :by_valuator, -> (valuator) { where("valuation_assignments.valuator_id = ?", valuator.presence).joins(:valuation_assignments) } + scope :by_admin, ->(admin) { where(administrator_id: admin.presence) } + scope :by_tag, ->(tag_name) { tagged_with(tag_name) } + scope :by_valuator, ->(valuator) { where("valuation_assignments.valuator_id = ?", valuator.presence).joins(:valuation_assignments) } - scope :for_render, -> { includes(:geozone) } + scope :for_render, -> { includes(:geozone) } before_validation :set_responsible_name @@ -44,7 +44,7 @@ class SpendingProposal < ActiveRecord::Base end def self.filter_params(params) - params.select{|x,_| %w{geozone_id administrator_id tag_name valuator_id}.include? x.to_s } + params.select{|x, _| %w{geozone_id administrator_id tag_name valuator_id}.include? x.to_s } end def self.scoped_filter(params, current_filter) diff --git a/app/models/tag_cloud.rb b/app/models/tag_cloud.rb index 107ecbf1a..b0882af82 100644 --- a/app/models/tag_cloud.rb +++ b/app/models/tag_cloud.rb @@ -2,7 +2,7 @@ class TagCloud attr_accessor :resource_model, :scope - def initialize(resource_model, scope=nil) + def initialize(resource_model, scope = nil) @resource_model = resource_model @scope = scope end diff --git a/app/models/user.rb b/app/models/user.rb index 219671349..9df08c014 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -56,7 +56,7 @@ class User < ActiveRecord::Base scope :officials, -> { where("official_level > 0") } scope :newsletter, -> { where(newsletter: true) } scope :for_render, -> { includes(:organization) } - scope :by_document, -> (document_type, document_number) { where(document_type: document_type, document_number: document_number) } + scope :by_document, ->(document_type, document_number) { where(document_type: document_type, document_number: document_number) } scope :email_digest, -> { where(email_digest: true) } scope :active, -> { where(erased_at: nil) } scope :erased, -> { where.not(erased_at: nil) } @@ -74,7 +74,7 @@ class User < ActiveRecord::Base username: auth.info.name || auth.uid, email: oauth_email, oauth_email: oauth_email, - password: Devise.friendly_token[0,20], + password: Devise.friendly_token[0, 20], terms_of_service: '1', confirmed_at: oauth_email_confirmed ? DateTime.current : nil ) @@ -156,7 +156,7 @@ class User < ActiveRecord::Base def has_official_email? domain = Setting['email_domain_for_officials'] - email.present? && ( (email.end_with? "@#{domain}") || (email.end_with? ".#{domain}") ) + email.present? && ((email.end_with? "@#{domain}") || (email.end_with? ".#{domain}")) end def display_official_position_badge? diff --git a/app/models/verification/residence.rb b/app/models/verification/residence.rb index bafff129b..7fa7f74b4 100644 --- a/app/models/verification/residence.rb +++ b/app/models/verification/residence.rb @@ -7,17 +7,17 @@ class Verification::Residence before_validation :call_census_api - validates_presence_of :document_number - validates_presence_of :document_type - validates_presence_of :date_of_birth - validates_presence_of :postal_code + validates :document_number, presence: true + validates :document_type, presence: true + validates :date_of_birth, presence: true + validates :postal_code, presence: true validates :terms_of_service, acceptance: { allow_nil: false } validates :postal_code, length: { is: 5 } validate :allowed_age validate :document_number_uniqueness - def initialize(attrs={}) + def initialize(attrs = {}) self.date_of_birth = parse_date('date_of_birth', attrs) attrs = remove_date('date_of_birth', attrs) super @@ -47,13 +47,13 @@ class Verification::Residence end def store_failed_attempt - FailedCensusCall.create({ + FailedCensusCall.create( user: user, document_number: document_number, - document_type: document_type, - date_of_birth: date_of_birth, - postal_code: postal_code - }) + document_type: document_type, + date_of_birth: date_of_birth, + postal_code: postal_code + ) end def geozone diff --git a/app/models/verification/sms.rb b/app/models/verification/sms.rb index 1a013f1d8..7c1a1bfa6 100644 --- a/app/models/verification/sms.rb +++ b/app/models/verification/sms.rb @@ -3,7 +3,7 @@ class Verification::Sms attr_accessor :user, :phone, :confirmation_code - validates_presence_of :phone + validates :phone, presence: true validates :phone, format: { with: /\A[\d \+]+\z/ } validate :uniqness_phone diff --git a/app/models/verified_user.rb b/app/models/verified_user.rb index b0c5afd0c..6b0ddb822 100644 --- a/app/models/verified_user.rb +++ b/app/models/verified_user.rb @@ -1,8 +1,8 @@ class VerifiedUser < ActiveRecord::Base - scope :by_user, -> (user) { where(document_number: user.document_number) } + scope :by_user, ->(user) { where(document_number: user.document_number) } - scope :by_email, -> (email) { where(email: email) } - scope :by_phone, -> (phone) { where(phone: phone) } + scope :by_email, ->(email) { where(email: email) } + scope :by_phone, ->(phone) { where(phone: phone) } def self.phone?(user) by_user(user).by_phone(user.unconfirmed_phone).first.present? diff --git a/app/views/admin/budget_investment_milestones/_form.html.erb b/app/views/admin/budget_investment_milestones/_form.html.erb new file mode 100644 index 000000000..95237c2ca --- /dev/null +++ b/app/views/admin/budget_investment_milestones/_form.html.erb @@ -0,0 +1,7 @@ +<%= form_for [:admin, @investment.budget, @investment, @milestone] do |f| %> + + <%= f.text_field :title, maxlength: Budget::Investment::Milestone.title_max_length %> + <%= f.text_area :description, rows: 5 %> + + <%= f.submit nil, class: "button success" %> +<% end %> diff --git a/app/views/admin/budget_investment_milestones/edit.html.erb b/app/views/admin/budget_investment_milestones/edit.html.erb new file mode 100644 index 000000000..c72cd840a --- /dev/null +++ b/app/views/admin/budget_investment_milestones/edit.html.erb @@ -0,0 +1,5 @@ +<%= back_link_to admin_budget_budget_investment_path(@investment.budget, @investment) %> + +
| <%= t("admin.milestones.index.table_id") %> | +<%= t("admin.milestones.index.table_title") %> | +<%= t("admin.milestones.index.table_description") %> | +<%= t("admin.milestones.index.table_actions") %> | +
|---|---|---|---|
| + <%= milestone.id %> + | ++ <%= link_to milestone.title, edit_admin_budget_budget_investment_budget_investment_milestone_path(@investment.budget, @investment, milestone) %> + | ++ <%= milestone.description %> + | ++ <%= link_to t("admin.milestones.index.delete"), admin_budget_budget_investment_budget_investment_milestone_path(@investment.budget, @investment, milestone), + method: :delete, + class: 'button hollow alert expanded' %> + | +
+ <%= t('admin.milestones.index.no_milestones') %> +
+<% end %> diff --git a/app/views/admin/budget_investments/show.html.erb b/app/views/admin/budget_investments/show.html.erb index a58110c94..f220c0955 100644 --- a/app/views/admin/budget_investments/show.html.erb +++ b/app/views/admin/budget_investments/show.html.erb @@ -47,3 +47,12 @@ <%= link_to t("admin.budget_investments.show.edit_dossier"), edit_valuation_budget_budget_investment_path(@budget, @investment) %> ++ <%= link_to t("admin.budget_investments.show.new_milestone"), new_admin_budget_budget_investment_budget_investment_milestone_path(@budget, @investment) %> +
diff --git a/app/views/admin/budgets/_form.html.erb b/app/views/admin/budgets/_form.html.erb index 5d323b45c..58a56d564 100644 --- a/app/views/admin/budgets/_form.html.erb +++ b/app/views/admin/budgets/_form.html.erb @@ -16,5 +16,15 @@ <%= f.select :currency_symbol, budget_currency_symbol_select_options %> - <%= f.submit nil, class: "button success" %> +| + | <%= group.name %> <%= link_to t("admin.budgets.form.add_heading"), "#", class: "button float-right js-toggle-link", data: { "toggle-selector" => "#group-#{group.id}-new-heading-form" } %> | @@ -21,6 +21,7 @@|||
|---|---|---|---|---|
| <%= t("admin.budgets.form.table_heading") %> | <%= t("admin.budgets.form.table_amount") %> | +<%= t("admin.budgets.form.table_population") %> | <%= heading.price %> | ++ <%= heading.population %> + | <% end %> diff --git a/app/views/admin/poll/questions/_form.html.erb b/app/views/admin/poll/questions/_form.html.erb index 0da36913a..959aa4ddf 100644 --- a/app/views/admin/poll/questions/_form.html.erb +++ b/app/views/admin/poll/questions/_form.html.erb @@ -17,8 +17,8 @@ <%= f.text_field :title, maxlength: Poll::Question.title_max_length %> <%= f.label :valid_answers %> -
- <%= comment_tree_title_text(commentable) %> - (<%= commentable.comments_count %>) -
+ <% if display_comments_count %> ++ <%= comment_tree_title_text(commentable) %> + (<%= commentable.comments_count %>) +
+ <% end %> <%= render 'shared/wide_order_selector', i18n_namespace: "comments" %> diff --git a/app/views/debates/_form.html.erb b/app/views/debates/_form.html.erb index c88045f26..96a5337ca 100644 --- a/app/views/debates/_form.html.erb +++ b/app/views/debates/_form.html.erb @@ -17,11 +17,12 @@<%= t("debates.form.tags_instructions") %>
+<%= t("debates.form.tags_instructions") %>
<%= f.text_field :tag_list, value: @debate.tag_list.to_s, label: false, - placeholder: t("debates.form.tags_placeholder") %> + placeholder: t("debates.form.tags_placeholder"), + aria: {describedby: "tag-list-help-text"} %>