From a6f5f037571ed4e42375b10813c9f084ea7461e0 Mon Sep 17 00:00:00 2001 From: Anna Topalidi Date: Thu, 2 Nov 2023 09:58:59 +0100 Subject: [PATCH 001/167] add census type radio buttons --- Gemfile | 2 +- Gemfile.lock | 468 +++++++++--------- .../admin/decidim_vocdoni_admin.js | 1 + app/packs/src/decidim/vocdoni/admin/census.js | 26 + .../vocdoni/admin/election_calendar.js | 10 +- .../vocdoni/admin/census/index.html.erb | 24 +- config/locales/en.yml | 6 +- lib/decidim/vocdoni/version.rb | 2 +- package-lock.json | 46 +- package.json | 8 +- 10 files changed, 323 insertions(+), 270 deletions(-) create mode 100644 app/packs/src/decidim/vocdoni/admin/census.js diff --git a/Gemfile b/Gemfile index cd02eedd..49c4bc5c 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,7 @@ source "https://rubygems.org" ruby RUBY_VERSION -DECIDIM_VERSION = "0.27.1" +DECIDIM_VERSION = "0.27.4" gem "decidim", DECIDIM_VERSION gem "decidim-vocdoni", path: "." diff --git a/Gemfile.lock b/Gemfile.lock index e916f215..400a94bd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,46 +1,46 @@ PATH remote: . specs: - decidim-vocdoni (0.27.1) - decidim-core (= 0.27.1) + decidim-vocdoni (0.27.4) + decidim-core (= 0.27.4) GEM remote: https://rubygems.org/ specs: - actioncable (6.1.7) - actionpack (= 6.1.7) - activesupport (= 6.1.7) + actioncable (6.1.7.6) + actionpack (= 6.1.7.6) + activesupport (= 6.1.7.6) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.7) - actionpack (= 6.1.7) - activejob (= 6.1.7) - activerecord (= 6.1.7) - activestorage (= 6.1.7) - activesupport (= 6.1.7) + actionmailbox (6.1.7.6) + actionpack (= 6.1.7.6) + activejob (= 6.1.7.6) + activerecord (= 6.1.7.6) + activestorage (= 6.1.7.6) + activesupport (= 6.1.7.6) mail (>= 2.7.1) - actionmailer (6.1.7) - actionpack (= 6.1.7) - actionview (= 6.1.7) - activejob (= 6.1.7) - activesupport (= 6.1.7) + actionmailer (6.1.7.6) + actionpack (= 6.1.7.6) + actionview (= 6.1.7.6) + activejob (= 6.1.7.6) + activesupport (= 6.1.7.6) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.7) - actionview (= 6.1.7) - activesupport (= 6.1.7) + actionpack (6.1.7.6) + actionview (= 6.1.7.6) + activesupport (= 6.1.7.6) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.7) - actionpack (= 6.1.7) - activerecord (= 6.1.7) - activestorage (= 6.1.7) - activesupport (= 6.1.7) + actiontext (6.1.7.6) + actionpack (= 6.1.7.6) + activerecord (= 6.1.7.6) + activestorage (= 6.1.7.6) + activesupport (= 6.1.7.6) nokogiri (>= 1.8.5) - actionview (6.1.7) - activesupport (= 6.1.7) + actionview (6.1.7.6) + activesupport (= 6.1.7.6) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -48,22 +48,22 @@ GEM active_link_to (1.0.5) actionpack addressable - activejob (6.1.7) - activesupport (= 6.1.7) + activejob (6.1.7.6) + activesupport (= 6.1.7.6) globalid (>= 0.3.6) - activemodel (6.1.7) - activesupport (= 6.1.7) - activerecord (6.1.7) - activemodel (= 6.1.7) - activesupport (= 6.1.7) - activestorage (6.1.7) - actionpack (= 6.1.7) - activejob (= 6.1.7) - activerecord (= 6.1.7) - activesupport (= 6.1.7) + activemodel (6.1.7.6) + activesupport (= 6.1.7.6) + activerecord (6.1.7.6) + activemodel (= 6.1.7.6) + activesupport (= 6.1.7.6) + activestorage (6.1.7.6) + actionpack (= 6.1.7.6) + activejob (= 6.1.7.6) + activerecord (= 6.1.7.6) + activesupport (= 6.1.7.6) marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (6.1.7) + activesupport (6.1.7.6) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -71,10 +71,10 @@ GEM zeitwerk (~> 2.3) acts_as_list (0.9.19) activerecord (>= 3.0) - addressable (2.8.1) + addressable (2.8.5) public_suffix (>= 2.0.2, < 6.0) ast (2.4.2) - axe-core-api (4.5.1) + axe-core-api (4.8.0) dumb_delegator virtus axe-core-rspec (4.1.0) @@ -85,8 +85,9 @@ GEM descendants_tracker (~> 0.0.4) ice_nine (~> 0.11.0) thread_safe (~> 0.3, >= 0.3.1) + base64 (0.1.1) batch-loader (1.5.0) - bcrypt (3.1.18) + bcrypt (3.1.19) better_html (1.0.16) actionview (>= 4.0) activesupport (>= 4.0) @@ -96,12 +97,12 @@ GEM parser (>= 2.4) smart_properties bindex (0.8.1) - bootsnap (1.15.0) + bootsnap (1.17.0) msgpack (~> 1.2) browser (2.7.1) builder (3.2.4) byebug (11.1.3) - capybara (3.38.0) + capybara (3.39.2) addressable matrix mini_mime (>= 0.1.3) @@ -110,7 +111,7 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - carrierwave (2.2.3) + carrierwave (2.2.4) activemodel (>= 5.0.0) activesupport (>= 5.0.0) addressable (~> 2.6) @@ -130,7 +131,7 @@ GEM actionpack (>= 5.0) cells (>= 4.1.6, < 5.0.0) charlock_holmes (0.7.7) - chef-utils (18.0.185) + chef-utils (18.3.0) concurrent-ruby childprocess (4.1.0) codecov (0.6.0) @@ -144,66 +145,67 @@ GEM coffee-script-source execjs coffee-script-source (1.12.2) - commonmarker (0.23.6) - concurrent-ruby (1.1.10) + commonmarker (0.23.10) + concurrent-ruby (1.2.2) crack (0.4.5) rexml crass (1.0.6) - css_parser (1.12.0) + css_parser (1.16.0) addressable + date (3.3.3) date_validator (0.12.0) activemodel (>= 3) activesupport (>= 3) db-query-matchers (0.10.0) activesupport (>= 4.0, < 7) rspec (~> 3.0) - decidim (0.27.1) - decidim-accountability (= 0.27.1) - decidim-admin (= 0.27.1) - decidim-api (= 0.27.1) - decidim-assemblies (= 0.27.1) - decidim-blogs (= 0.27.1) - decidim-budgets (= 0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-debates (= 0.27.1) - decidim-forms (= 0.27.1) - decidim-generators (= 0.27.1) - decidim-meetings (= 0.27.1) - decidim-pages (= 0.27.1) - decidim-participatory_processes (= 0.27.1) - decidim-proposals (= 0.27.1) - decidim-sortitions (= 0.27.1) - decidim-surveys (= 0.27.1) - decidim-system (= 0.27.1) - decidim-templates (= 0.27.1) - decidim-verifications (= 0.27.1) - decidim-accountability (0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-admin (0.27.1) + decidim (0.27.4) + decidim-accountability (= 0.27.4) + decidim-admin (= 0.27.4) + decidim-api (= 0.27.4) + decidim-assemblies (= 0.27.4) + decidim-blogs (= 0.27.4) + decidim-budgets (= 0.27.4) + decidim-comments (= 0.27.4) + decidim-core (= 0.27.4) + decidim-debates (= 0.27.4) + decidim-forms (= 0.27.4) + decidim-generators (= 0.27.4) + decidim-meetings (= 0.27.4) + decidim-pages (= 0.27.4) + decidim-participatory_processes (= 0.27.4) + decidim-proposals (= 0.27.4) + decidim-sortitions (= 0.27.4) + decidim-surveys (= 0.27.4) + decidim-system (= 0.27.4) + decidim-templates (= 0.27.4) + decidim-verifications (= 0.27.4) + decidim-accountability (0.27.4) + decidim-comments (= 0.27.4) + decidim-core (= 0.27.4) + decidim-admin (0.27.4) active_link_to (~> 1.0) - decidim-core (= 0.27.1) + decidim-core (= 0.27.4) devise (~> 4.7) devise-i18n (~> 1.2) devise_invitable (~> 2.0) - decidim-api (0.27.1) + decidim-api (0.27.4) graphql (~> 1.12, < 1.13) graphql-docs (~> 2.1.0) rack-cors (~> 1.0) - decidim-assemblies (0.27.1) - decidim-core (= 0.27.1) - decidim-blogs (0.27.1) - decidim-admin (= 0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-budgets (0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-comments (0.27.1) - decidim-core (= 0.27.1) + decidim-assemblies (0.27.4) + decidim-core (= 0.27.4) + decidim-blogs (0.27.4) + decidim-admin (= 0.27.4) + decidim-comments (= 0.27.4) + decidim-core (= 0.27.4) + decidim-budgets (0.27.4) + decidim-comments (= 0.27.4) + decidim-core (= 0.27.4) + decidim-comments (0.27.4) + decidim-core (= 0.27.4) redcarpet (~> 3.5, >= 3.5.1) - decidim-core (0.27.1) + decidim-core (0.27.4) active_link_to (~> 1.0) acts_as_list (~> 0.9) batch-loader (~> 1.2) @@ -213,7 +215,7 @@ GEM cells-rails (~> 0.1.3) charlock_holmes (~> 0.7) date_validator (~> 0.12.0) - decidim-api (= 0.27.1) + decidim-api (= 0.27.4) devise (~> 4.7) devise-i18n (~> 1.2) diffy (~> 3.3) @@ -226,7 +228,7 @@ GEM hashdiff (>= 0.4.0, < 2.0.0) invisible_captcha (~> 0.12) kaminari (~> 1.2, >= 1.2.1) - loofah (~> 2.3.1) + loofah (~> 2.19.0) mime-types (>= 1.16, < 4.0) mini_magick (~> 4.9) mustache (~> 1.1.0) @@ -254,15 +256,15 @@ GEM webpacker (= 6.0.0.rc.5) webpush (~> 1.1) wisper (~> 2.0) - decidim-debates (0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-dev (0.27.1) + decidim-debates (0.27.4) + decidim-comments (= 0.27.4) + decidim-core (= 0.27.4) + decidim-dev (0.27.4) axe-core-rspec (~> 4.1.0) byebug (~> 11.0) capybara (~> 3.24) db-query-matchers (~> 0.10.0) - decidim (= 0.27.1) + decidim (= 0.27.4) erb_lint (~> 0.0.35) factory_bot_rails (~> 4.8) i18n-tasks (~> 0.9.18) @@ -285,68 +287,68 @@ GEM w3c_rspec_validators (~> 0.3.0) webmock (~> 3.6) wisper-rspec (~> 1.0) - decidim-forms (0.27.1) - decidim-core (= 0.27.1) + decidim-forms (0.27.4) + decidim-core (= 0.27.4) wicked_pdf (~> 2.1) wkhtmltopdf-binary (~> 0.12) - decidim-generators (0.27.1) - decidim-core (= 0.27.1) - decidim-meetings (0.27.1) - decidim-core (= 0.27.1) - decidim-forms (= 0.27.1) + decidim-generators (0.27.4) + decidim-core (= 0.27.4) + decidim-meetings (0.27.4) + decidim-core (= 0.27.4) + decidim-forms (= 0.27.4) icalendar (~> 2.5) - decidim-pages (0.27.1) - decidim-core (= 0.27.1) - decidim-participatory_processes (0.27.1) - decidim-core (= 0.27.1) - decidim-proposals (0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) + decidim-pages (0.27.4) + decidim-core (= 0.27.4) + decidim-participatory_processes (0.27.4) + decidim-core (= 0.27.4) + decidim-proposals (0.27.4) + decidim-comments (= 0.27.4) + decidim-core (= 0.27.4) doc2text (~> 0.4.5) redcarpet (~> 3.5, >= 3.5.1) - decidim-sortitions (0.27.1) - decidim-admin (= 0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-proposals (= 0.27.1) - decidim-surveys (0.27.1) - decidim-core (= 0.27.1) - decidim-forms (= 0.27.1) - decidim-templates (= 0.27.1) - decidim-system (0.27.1) + decidim-sortitions (0.27.4) + decidim-admin (= 0.27.4) + decidim-comments (= 0.27.4) + decidim-core (= 0.27.4) + decidim-proposals (= 0.27.4) + decidim-surveys (0.27.4) + decidim-core (= 0.27.4) + decidim-forms (= 0.27.4) + decidim-templates (= 0.27.4) + decidim-system (0.27.4) active_link_to (~> 1.0) - decidim-core (= 0.27.1) + decidim-core (= 0.27.4) devise (~> 4.7) devise-i18n (~> 1.2) devise_invitable (~> 2.0) - decidim-templates (0.27.1) - decidim-core (= 0.27.1) - decidim-forms (= 0.27.1) - decidim-verifications (0.27.1) - decidim-core (= 0.27.1) + decidim-templates (0.27.4) + decidim-core (= 0.27.4) + decidim-forms (= 0.27.4) + decidim-verifications (0.27.4) + decidim-core (= 0.27.4) declarative-builder (0.1.0) declarative-option (< 0.2.0) declarative-option (0.1.0) descendants_tracker (0.0.4) thread_safe (~> 0.3, >= 0.3.1) - devise (4.8.1) + devise (4.9.3) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-i18n (1.10.2) - devise (>= 4.8.0) - devise_invitable (2.0.6) + devise-i18n (1.12.0) + devise (>= 4.9.0) + devise_invitable (2.0.9) actionmailer (>= 5.0) devise (>= 4.6) diff-lcs (1.5.0) diffy (3.4.2) - doc2text (0.4.5) - nokogiri (>= 1.13.2, < 1.14.0) + doc2text (0.4.6) + nokogiri (>= 1.13.2, < 1.15.0) rubyzip (~> 2.3.0) docile (1.4.0) - doorkeeper (5.6.2) + doorkeeper (5.6.6) railties (>= 5) doorkeeper-i18n (4.0.1) dumb_delegator (1.0.0) @@ -360,10 +362,10 @@ GEM smart_properties erbse (0.1.4) temple - erubi (1.11.0) + erubi (1.12.0) escape_utils (1.3.0) - excon (0.94.0) - execjs (2.8.1) + excon (0.104.0) + execjs (2.9.1) extended-markdown-filter (0.7.0) html-pipeline (~> 2.9) factory_bot (4.11.1) @@ -373,11 +375,12 @@ GEM railties (>= 3.0.0) faker (2.23.0) i18n (>= 1.8.11, < 2) - faraday (2.7.1) + faraday (2.7.11) + base64 faraday-net_http (>= 2.0, < 3.1) ruby2_keywords (>= 0.0.4) faraday-net_http (3.0.2) - ffi (1.15.5) + ffi (1.16.3) file_validators (3.0.0) activemodel (>= 3.2) mime-types (>= 1.0) @@ -395,9 +398,9 @@ GEM activesupport (>= 4.1, < 7.1) railties (>= 4.1, < 7.1) gemoji (3.0.1) - geocoder (1.8.1) - globalid (1.0.0) - activesupport (>= 5.0) + geocoder (1.8.2) + globalid (1.2.1) + activesupport (>= 6.1) graphql (1.12.24) graphql-docs (2.1.0) commonmarker (~> 0.16) @@ -409,14 +412,14 @@ GEM sass (~> 3.4) hashdiff (1.0.1) hashie (5.0.0) - highline (2.0.3) + highline (2.1.0) hkdf (0.3.0) html-pipeline (2.14.3) activesupport (>= 2) nokogiri (>= 1.4) html_tokenizer (0.0.7) htmlentities (4.3.4) - i18n (1.12.0) + i18n (1.14.1) concurrent-ruby (~> 1.0) i18n-tasks (0.9.37) activesupport (>= 4.0.2) @@ -428,7 +431,7 @@ GEM rails-i18n rainbow (>= 2.2.2, < 4.0) terminal-table (>= 1.5.1) - icalendar (2.8.0) + icalendar (2.9.0) ice_cube (~> 0.16) ice_cube (0.16.4) ice_nine (0.11.2) @@ -438,7 +441,7 @@ GEM invisible_captcha (0.13.0) rails (>= 3.2.0) json (2.6.3) - jwt (2.5.0) + jwt (2.7.1) kaminari (1.2.2) activesupport (>= 4.1.0) kaminari-actionview (= 1.2.2) @@ -455,8 +458,8 @@ GEM rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - launchy (2.5.0) - addressable (~> 2.7) + launchy (2.5.2) + addressable (~> 2.8) letter_opener (1.8.1) launchy (>= 2.2, < 3) letter_opener_web (2.0.0) @@ -464,54 +467,51 @@ GEM letter_opener (~> 1.7) railties (>= 5.2) rexml - listen (3.7.1) + listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.3.1) + loofah (2.19.1) crass (~> 1.0.2) nokogiri (>= 1.5.9) - mail (2.8.0) + mail (2.8.1) mini_mime (>= 0.1.1) net-imap net-pop net-smtp marcel (1.0.2) matrix (0.4.2) - mdl (0.12.0) + mdl (0.13.0) kramdown (~> 2.3) kramdown-parser-gfm (~> 1.1) mixlib-cli (~> 2.1, >= 2.1.1) mixlib-config (>= 2.2.1, < 4) mixlib-shellout method_source (1.0.0) - mime-types (3.4.1) + mime-types (3.5.1) mime-types-data (~> 3.2015) - mime-types-data (3.2022.0105) - mini_magick (4.11.0) - mini_mime (1.1.2) - minitest (5.16.3) + mime-types-data (3.2023.1003) + mini_magick (4.12.0) + mini_mime (1.1.5) + minitest (5.20.0) mixlib-cli (2.1.8) mixlib-config (3.0.27) tomlrb mixlib-shellout (3.2.7) chef-utils - msgpack (1.6.0) + msgpack (1.7.2) multi_xml (0.6.0) mustache (1.1.1) - net-imap (0.3.1) + net-imap (0.4.3) + date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.0) + net-protocol (0.2.1) timeout - net-smtp (0.3.3) + net-smtp (0.4.0) net-protocol - nio4r (2.5.8) - nokogiri (1.13.10-arm64-darwin) - racc (~> 1.4) - nokogiri (1.13.10-x86_64-darwin) - racc (~> 1.4) - nokogiri (1.13.10-x86_64-linux) + nio4r (2.5.9) + nokogiri (1.14.5-x86_64-darwin) racc (~> 1.4) oauth (1.1.0) oauth-tty (~> 1.0, >= 1.0.1) @@ -526,7 +526,7 @@ GEM rack (>= 1.2, < 4) snaky_hash (~> 2.0) version_gem (~> 1.1) - omniauth (2.1.0) + omniauth (2.1.1) hashie (>= 3.4.6) rack (>= 2.2.3) rack-protection @@ -553,16 +553,17 @@ GEM paper_trail (12.3.0) activerecord (>= 5.2) request_store (~> 1.1) - parallel (1.22.1) + parallel (1.23.0) parallel_tests (3.13.0) parallel - parser (3.1.3.0) + parser (3.2.2.4) ast (~> 2.4.1) + racc pg (1.1.4) pg_search (2.3.6) activerecord (>= 5.2) activesupport (>= 5.2) - premailer (1.18.0) + premailer (1.21.0) addressable css_parser (>= 1.12.0) htmlentities (>= 4.0.0) @@ -570,56 +571,57 @@ GEM actionmailer (>= 3) net-smtp premailer (~> 1.7, >= 1.7.9) - public_suffix (5.0.0) - puma (5.6.5) + public_suffix (5.0.3) + puma (5.6.7) nio4r (~> 2.0) - racc (1.7.1) - rack (2.2.4) - rack-attack (6.6.1) - rack (>= 1.0, < 3) + racc (1.7.2) + rack (2.2.8) + rack-attack (6.7.0) + rack (>= 1.0, < 4) rack-cors (1.1.1) rack (>= 2.0.0) - rack-protection (3.0.4) + rack-protection (3.1.0) + rack (~> 2.2, >= 2.2.4) + rack-proxy (0.7.7) rack - rack-proxy (0.7.4) - rack - rack-test (2.0.2) + rack-test (2.1.0) rack (>= 1.3) - rails (6.1.7) - actioncable (= 6.1.7) - actionmailbox (= 6.1.7) - actionmailer (= 6.1.7) - actionpack (= 6.1.7) - actiontext (= 6.1.7) - actionview (= 6.1.7) - activejob (= 6.1.7) - activemodel (= 6.1.7) - activerecord (= 6.1.7) - activestorage (= 6.1.7) - activesupport (= 6.1.7) + rails (6.1.7.6) + actioncable (= 6.1.7.6) + actionmailbox (= 6.1.7.6) + actionmailer (= 6.1.7.6) + actionpack (= 6.1.7.6) + actiontext (= 6.1.7.6) + actionview (= 6.1.7.6) + activejob (= 6.1.7.6) + activemodel (= 6.1.7.6) + activerecord (= 6.1.7.6) + activestorage (= 6.1.7.6) + activesupport (= 6.1.7.6) bundler (>= 1.15.0) - railties (= 6.1.7) + railties (= 6.1.7.6) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) activesupport (>= 5.0.1.rc1) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest nokogiri (>= 1.6) rails-html-sanitizer (1.4.3) loofah (~> 2.3) rails-i18n (6.0.0) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 7) - railties (6.1.7) - actionpack (= 6.1.7) - activesupport (= 6.1.7) + railties (6.1.7.6) + actionpack (= 6.1.7.6) + activesupport (= 6.1.7.6) method_source rake (>= 12.2) thor (~> 1.0) rainbow (3.1.1) - rake (13.0.6) + rake (13.1.0) ransack (2.4.2) activerecord (>= 5.2.4) activesupport (>= 5.2.4) @@ -627,15 +629,15 @@ GEM rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - redcarpet (3.5.1) - redis (4.8.0) - regexp_parser (2.6.1) + redcarpet (3.6.0) + redis (4.8.1) + regexp_parser (2.8.2) request_store (1.5.1) rack (>= 1.4) - responders (3.0.1) - actionpack (>= 5.0) - railties (>= 5.0) - rexml (3.2.5) + responders (3.1.1) + actionpack (>= 5.2) + railties (>= 5.2) + rexml (3.2.6) rspec (3.12.0) rspec-core (~> 3.12.0) rspec-expectations (~> 3.12.0) @@ -643,15 +645,15 @@ GEM rspec-cells (0.3.8) cells (>= 4.0.0, < 6.0.0) rspec-rails (>= 3.0.0, < 6.1.0) - rspec-core (3.12.0) + rspec-core (3.12.2) rspec-support (~> 3.12.0) - rspec-expectations (3.12.0) + rspec-expectations (3.12.3) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) rspec-html-matchers (0.9.4) nokogiri (~> 1) rspec (>= 3.0.0.a, < 4) - rspec-mocks (3.12.0) + rspec-mocks (3.12.6) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) rspec-rails (4.1.2) @@ -664,7 +666,7 @@ GEM rspec-support (~> 3.10) rspec-retry (0.6.2) rspec-core (> 3.3) - rspec-support (3.12.0) + rspec-support (3.12.1) rspec_junit_formatter (0.3.0) rspec-core (>= 2, < 4, != 2.12.0) rubocop (1.28.2) @@ -676,8 +678,8 @@ GEM rubocop-ast (>= 1.17.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.24.0) - parser (>= 3.1.1.0) + rubocop-ast (1.30.0) + parser (>= 3.2.1.0) rubocop-faker (1.1.0) faker (>= 2.12.0) rubocop (>= 0.82.0) @@ -687,8 +689,8 @@ GEM rubocop (>= 1.7.0, < 2.0) rubocop-rspec (2.11.1) rubocop (~> 1.19) - ruby-progressbar (1.11.0) - ruby-vips (2.1.4) + ruby-progressbar (1.13.0) + ruby-vips (2.2.0) ffi (~> 1.12) ruby2_keywords (0.0.5) rubyXL (3.4.25) @@ -725,30 +727,30 @@ GEM spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (4.1.1) + sprockets (4.2.1) concurrent-ruby (~> 1.0) - rack (> 1, < 3) + rack (>= 2.2.4, < 4) sprockets-rails (3.4.2) actionpack (>= 5.2) activesupport (>= 5.2) sprockets (>= 3.0.0) - ssrf_filter (1.1.1) - temple (0.9.1) + ssrf_filter (1.1.2) + temple (0.10.3) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - thor (1.2.1) + thor (1.3.0) thread_safe (0.3.6) - tilt (2.0.11) - timeout (0.3.1) + tilt (2.3.0) + timeout (0.4.0) tomlrb (2.0.3) - tzinfo (2.0.5) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - unicode-display_width (2.3.0) + unicode-display_width (2.5.0) valid_email2 (2.3.1) activemodel (>= 3.2) mail (~> 2.5) - version_gem (1.1.1) + version_gem (1.1.3) virtus (2.0.0) axiom-types (~> 0.1) coercible (~> 1.0) @@ -763,12 +765,12 @@ GEM rexml (~> 3.2) warden (1.2.9) rack (>= 2.0.9) - web-console (4.2.0) + web-console (4.2.1) actionview (>= 6.0.0) activemodel (>= 6.0.0) bindex (>= 0.4.0) railties (>= 6.0.0) - webmock (3.18.1) + webmock (3.19.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -780,29 +782,27 @@ GEM webpush (1.1.0) hkdf (~> 0.2) jwt (~> 2.0) - websocket-driver (0.7.5) + websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - wicked_pdf (2.6.3) + wicked_pdf (2.7.0) activesupport wisper (2.0.1) wisper-rspec (1.1.0) wkhtmltopdf-binary (0.12.6.6) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.6) + zeitwerk (2.6.12) PLATFORMS - arm64-darwin-22 - x86_64-darwin-22 - x86_64-linux + x86_64-darwin-23 DEPENDENCIES bootsnap (~> 1.7) byebug (~> 11.0) codecov (~> 0.6.0) - decidim (= 0.27.1) - decidim-dev (= 0.27.1) + decidim (= 0.27.4) + decidim-dev (= 0.27.4) decidim-vocdoni! faker (~> 2.14) i18n-tasks (~> 0.9.37) @@ -818,4 +818,4 @@ RUBY VERSION ruby 3.0.5p211 BUNDLED WITH - 2.3.20 + 2.4.21 diff --git a/app/packs/entrypoints/admin/decidim_vocdoni_admin.js b/app/packs/entrypoints/admin/decidim_vocdoni_admin.js index 601c6fb6..95d882b0 100644 --- a/app/packs/entrypoints/admin/decidim_vocdoni_admin.js +++ b/app/packs/entrypoints/admin/decidim_vocdoni_admin.js @@ -6,6 +6,7 @@ import "src/decidim/vocdoni/admin/steps/setup_election" import "src/decidim/vocdoni/admin/steps/vote" import "src/decidim/vocdoni/admin/steps/vote_ended" import "src/decidim/vocdoni/admin/election_calendar" +import "src/decidim/vocdoni/admin/census" // Images require.context("../../images", true) diff --git a/app/packs/src/decidim/vocdoni/admin/census.js b/app/packs/src/decidim/vocdoni/admin/census.js new file mode 100644 index 00000000..4750ee63 --- /dev/null +++ b/app/packs/src/decidim/vocdoni/admin/census.js @@ -0,0 +1,26 @@ +function toggleSectionsBasedOnRadioButton() { + const csvRadioButton = document.getElementById("csv_radio_button"); + const permissionsRadioButton = document.getElementById("permissions_radio_button"); + const csvUploadDiv = document.getElementById("csv_upload"); + const permissionsSelectDiv = document.getElementById("permissions_select"); + + if (!csvRadioButton || !permissionsRadioButton || !csvUploadDiv || !permissionsSelectDiv) { + return; + } + + const toggleSections = () => { + if (csvRadioButton.checked) { + csvUploadDiv.style.display = "block"; + permissionsSelectDiv.style.display = "none"; + } else { + csvUploadDiv.style.display = "none"; + permissionsSelectDiv.style.display = "block"; + } + }; + + csvRadioButton.addEventListener("change", toggleSections); + permissionsRadioButton.addEventListener("change", toggleSections); + toggleSections(); +} + +document.addEventListener("DOMContentLoaded", toggleSectionsBasedOnRadioButton); diff --git a/app/packs/src/decidim/vocdoni/admin/election_calendar.js b/app/packs/src/decidim/vocdoni/admin/election_calendar.js index d722aae5..d4be0510 100644 --- a/app/packs/src/decidim/vocdoni/admin/election_calendar.js +++ b/app/packs/src/decidim/vocdoni/admin/election_calendar.js @@ -1,8 +1,8 @@ -document.addEventListener("DOMContentLoaded", () => { +function toggleStartTimeFieldBasedOnCheckbox() { const manualStartCheckbox = document.getElementById("election_calendar_manual_start"); const startTimeField = document.getElementById("election_calendar_start_time"); - if (manualStartCheckbox === null || startTimeField === null) { + if (!manualStartCheckbox || !startTimeField) { return; } @@ -10,8 +10,10 @@ document.addEventListener("DOMContentLoaded", () => { const isManualStartChecked = manualStartCheckbox.checked; startTimeField.disabled = isManualStartChecked; startTimeField.classList.toggle("text-muted", isManualStartChecked); - } + }; manualStartCheckbox.addEventListener("change", toggleStartTimeField); toggleStartTimeField(); -}); +} + +document.addEventListener("DOMContentLoaded", toggleStartTimeFieldBasedOnCheckbox); diff --git a/app/views/decidim/vocdoni/admin/census/index.html.erb b/app/views/decidim/vocdoni/admin/census/index.html.erb index b42ce652..e7563a3b 100644 --- a/app/views/decidim/vocdoni/admin/census/index.html.erb +++ b/app/views/decidim/vocdoni/admin/census/index.html.erb @@ -17,6 +17,13 @@ <%= t("index.info", scope: "decidim.vocdoni.admin.census") %>

+
+ <%= radio_button_tag "census_type", "csv", true, id: "csv_radio_button" %> + <%= label_tag "csv_radio_button", t("census_type.csv", scope: "decidim.vocdoni.admin.census") %> + + <%= radio_button_tag "census_type", "permissions", false, id: "permissions_radio_button" %> + <%= label_tag "permissions_radio_button", t("census_type.permissions", scope: "decidim.vocdoni.admin.census") %> +
<% end %> @@ -53,7 +60,7 @@ <% end %> <% if @status.pending_upload? %> -
+

<%= t("new.title", scope: "decidim.vocdoni.admin.census") %> @@ -63,6 +70,21 @@ <%= render partial: "upload_form", locals: { form: @form, election: election } %>

+ + <% end %> <% unless status.name == "ready" %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index e1f63678..7fa78ac1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -75,6 +75,9 @@ en: invalid: There was a problem updating this answer success: Answer successfully updated census: + census_type: + permissions: Decidim permissions + csv: CSV confirm: submit: Confirm the census data create: @@ -91,8 +94,7 @@ en: index: census_warning: The census is not ready yet. You can upload and confirm it from the census page. - info: For setting up the census for a Vocdoni Election, you need to upload - the census and confirm it. + info: You need to choose if you want a CSV file as census or to use the Decidim's verifications systems. title: Census for a Vocdoni election new: file: ".csv file with emails data" diff --git a/lib/decidim/vocdoni/version.rb b/lib/decidim/vocdoni/version.rb index f4279118..72e2b937 100644 --- a/lib/decidim/vocdoni/version.rb +++ b/lib/decidim/vocdoni/version.rb @@ -4,7 +4,7 @@ module Decidim # This holds the decidim-meetings version. module Vocdoni def self.version - "0.27.1" + "0.27.4" end end end diff --git a/package-lock.json b/package-lock.json index fd573757..84312e5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "decidim-vocdoni", - "version": "0.27.1", + "version": "0.27.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "decidim-vocdoni", - "version": "0.27.1", + "version": "0.27.4", "license": "AGPL-3.0", "dependencies": { "@ethersproject/wallet": "^5.7.0", @@ -22,9 +22,9 @@ "@babel/plugin-transform-runtime": "^7.19.6", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", - "@decidim/dev": "0.27.1", - "@decidim/eslint-config": "0.27.1", - "@decidim/stylelint-config": "0.27.1", + "@decidim/dev": "0.27.4", + "@decidim/eslint-config": "0.27.4", + "@decidim/stylelint-config": "0.27.4", "eslint-config-prettier": "^8.5.0", "eslint-config-standard": "^11.0.0", "eslint-plugin-import": "^2.22.0", @@ -2017,18 +2017,18 @@ } }, "node_modules/@decidim/dev": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@decidim/dev/-/dev-0.27.1.tgz", - "integrity": "sha512-zHgwSUuvCWqav5QO6Bzr0LuhieJBE9fCep196I21q9+Rj7/1FRwRQqcdtvh+w+ldjJLnU0NTW7Jeb1eem2o+mQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@decidim/dev/-/dev-0.27.4.tgz", + "integrity": "sha512-85RoZQBsBs30emj9Ajo8lDOHKgcj9D7JtOYXoUFQmF5CfG6MSCDBSRVt9SV42ixcZV/ZkgBni4eod3JnkWy6RQ==", "dev": true, "dependencies": { "axe-core": "^4.1.4" } }, "node_modules/@decidim/eslint-config": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@decidim/eslint-config/-/eslint-config-0.27.1.tgz", - "integrity": "sha512-NqWjOF2Se0/klVejagAZQl1hPwKwBYem255lbTdUJ/CkrgqyBzgHET5HX+9IZrN7DJg436ofJQTFgFJ0itzuYA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@decidim/eslint-config/-/eslint-config-0.27.4.tgz", + "integrity": "sha512-ZRXqtfROkeEy4HLdlNqK22gWk71H5RPwlULNSeCNFpahk1yq/r7uF4VU3AHwbusk9J2CGULqn2m8lXAo5NGNpQ==", "dev": true, "peerDependencies": { "eslint": "^7.25.0", @@ -2043,9 +2043,9 @@ } }, "node_modules/@decidim/stylelint-config": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@decidim/stylelint-config/-/stylelint-config-0.27.1.tgz", - "integrity": "sha512-gSFa9lJGsRRwG3WXfcl/Dbx9Wvz2MdssjowS1adT8ysWIssGAPnIMHV82HQZD0LYRG/kXqTXa4EF8lufLJdWKg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@decidim/stylelint-config/-/stylelint-config-0.27.4.tgz", + "integrity": "sha512-K2mlm2JWHkFKiIsosFi00h2sQ9dolb/zJmw0WvwAiJXr5BShDxmypfdydePHviMS6+MnvfNLi6Hxz94WK/HUxQ==", "dev": true, "peerDependencies": { "stylelint": "13.11.0" @@ -9947,25 +9947,25 @@ } }, "@decidim/dev": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@decidim/dev/-/dev-0.27.1.tgz", - "integrity": "sha512-zHgwSUuvCWqav5QO6Bzr0LuhieJBE9fCep196I21q9+Rj7/1FRwRQqcdtvh+w+ldjJLnU0NTW7Jeb1eem2o+mQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@decidim/dev/-/dev-0.27.4.tgz", + "integrity": "sha512-85RoZQBsBs30emj9Ajo8lDOHKgcj9D7JtOYXoUFQmF5CfG6MSCDBSRVt9SV42ixcZV/ZkgBni4eod3JnkWy6RQ==", "dev": true, "requires": { "axe-core": "^4.1.4" } }, "@decidim/eslint-config": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@decidim/eslint-config/-/eslint-config-0.27.1.tgz", - "integrity": "sha512-NqWjOF2Se0/klVejagAZQl1hPwKwBYem255lbTdUJ/CkrgqyBzgHET5HX+9IZrN7DJg436ofJQTFgFJ0itzuYA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@decidim/eslint-config/-/eslint-config-0.27.4.tgz", + "integrity": "sha512-ZRXqtfROkeEy4HLdlNqK22gWk71H5RPwlULNSeCNFpahk1yq/r7uF4VU3AHwbusk9J2CGULqn2m8lXAo5NGNpQ==", "dev": true, "requires": {} }, "@decidim/stylelint-config": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@decidim/stylelint-config/-/stylelint-config-0.27.1.tgz", - "integrity": "sha512-gSFa9lJGsRRwG3WXfcl/Dbx9Wvz2MdssjowS1adT8ysWIssGAPnIMHV82HQZD0LYRG/kXqTXa4EF8lufLJdWKg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@decidim/stylelint-config/-/stylelint-config-0.27.4.tgz", + "integrity": "sha512-K2mlm2JWHkFKiIsosFi00h2sQ9dolb/zJmw0WvwAiJXr5BShDxmypfdydePHviMS6+MnvfNLi6Hxz94WK/HUxQ==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 42557434..4ab991ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "decidim-vocdoni", - "version": "0.27.1", + "version": "0.27.4", "description": "An elections component for decidim's participatory spaces based on the Vocdoni SDK", "main": "index.js", "directories": { @@ -36,9 +36,9 @@ "@babel/plugin-transform-runtime": "^7.19.6", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", - "@decidim/dev": "0.27.1", - "@decidim/eslint-config": "0.27.1", - "@decidim/stylelint-config": "0.27.1", + "@decidim/dev": "0.27.4", + "@decidim/eslint-config": "0.27.4", + "@decidim/stylelint-config": "0.27.4", "eslint-config-prettier": "^8.5.0", "eslint-config-standard": "^11.0.0", "eslint-plugin-import": "^2.22.0", From ec6ad1631b79388dd1d0c6bf3a4ccc9e4ee62820 Mon Sep 17 00:00:00 2001 From: Anna Topalidi Date: Thu, 2 Nov 2023 10:09:42 +0100 Subject: [PATCH 002/167] fix lint --- Gemfile.lock | 9 ++++++++- app/packs/src/decidim/vocdoni/admin/census.js | 6 +++++- app/packs/src/decidim/vocdoni/admin/election_calendar.js | 6 +++++- config/locales/en.yml | 5 +++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 400a94bd..c626012d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -511,7 +511,11 @@ GEM net-smtp (0.4.0) net-protocol nio4r (2.5.9) - nokogiri (1.14.5-x86_64-darwin) + nokogiri (1.13.10-arm64-darwin) + racc (~> 1.4) + nokogiri (1.13.10-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.13.10-x86_64-linux) racc (~> 1.4) oauth (1.1.0) oauth-tty (~> 1.0, >= 1.0.1) @@ -795,7 +799,10 @@ GEM zeitwerk (2.6.12) PLATFORMS + arm64-darwin-22 + x86_64-darwin-22 x86_64-darwin-23 + x86_64-linux DEPENDENCIES bootsnap (~> 1.7) diff --git a/app/packs/src/decidim/vocdoni/admin/census.js b/app/packs/src/decidim/vocdoni/admin/census.js index 4750ee63..56ba53b9 100644 --- a/app/packs/src/decidim/vocdoni/admin/census.js +++ b/app/packs/src/decidim/vocdoni/admin/census.js @@ -1,4 +1,8 @@ -function toggleSectionsBasedOnRadioButton() { +/** + * Toggle sections based on the selected radio button. + * @returns {undefined} + */ +const toggleSectionsBasedOnRadioButton = function() { const csvRadioButton = document.getElementById("csv_radio_button"); const permissionsRadioButton = document.getElementById("permissions_radio_button"); const csvUploadDiv = document.getElementById("csv_upload"); diff --git a/app/packs/src/decidim/vocdoni/admin/election_calendar.js b/app/packs/src/decidim/vocdoni/admin/election_calendar.js index d4be0510..00c000dd 100644 --- a/app/packs/src/decidim/vocdoni/admin/election_calendar.js +++ b/app/packs/src/decidim/vocdoni/admin/election_calendar.js @@ -1,4 +1,8 @@ -function toggleStartTimeFieldBasedOnCheckbox() { +/** + * Toggle start time field based on the state of the checkbox. + * @returns {undefined} + */ +const toggleStartTimeFieldBasedOnCheckbox = function() { const manualStartCheckbox = document.getElementById("election_calendar_manual_start"); const startTimeField = document.getElementById("election_calendar_start_time"); diff --git a/config/locales/en.yml b/config/locales/en.yml index 7fa78ac1..b7b8e6a0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -76,8 +76,8 @@ en: success: Answer successfully updated census: census_type: - permissions: Decidim permissions csv: CSV + permissions: Decidim permissions confirm: submit: Confirm the census data create: @@ -94,7 +94,8 @@ en: index: census_warning: The census is not ready yet. You can upload and confirm it from the census page. - info: You need to choose if you want a CSV file as census or to use the Decidim's verifications systems. + info: You need to choose if you want a CSV file as census or to use the + Decidim's verifications systems. title: Census for a Vocdoni election new: file: ".csv file with emails data" From 6fd71fa4d08b71b221a39bf2528a94e4b0f587fc Mon Sep 17 00:00:00 2001 From: Anna Topalidi Date: Thu, 2 Nov 2023 11:05:58 +0100 Subject: [PATCH 003/167] fix transformLocales --- .../decidim/vocdoni/admin/utils/create_vocdoni_election.js | 5 ++++- app/views/decidim/vocdoni/admin/census/index.html.erb | 2 +- spec/system/decidim/results_online_spec.rb | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js b/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js index 2ec95bb4..e8aa2bd2 100644 --- a/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js +++ b/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js @@ -125,7 +125,10 @@ export default class CreateVocdoniElection { localeName = "default"; } - obj[localeName] = elem.text; + if (elem.text !== null && elem.text !== undefined) { + obj[localeName] = elem.text; + } + return obj; }, {}); } diff --git a/app/views/decidim/vocdoni/admin/census/index.html.erb b/app/views/decidim/vocdoni/admin/census/index.html.erb index e7563a3b..b37d6c36 100644 --- a/app/views/decidim/vocdoni/admin/census/index.html.erb +++ b/app/views/decidim/vocdoni/admin/census/index.html.erb @@ -79,7 +79,7 @@
<% current_organization.available_authorizations.each do |authorization| %> - <%= check_box_tag 'selected_authorizations[]', authorization %> + <%= check_box_tag "selected_authorizations[]", authorization %> <%= label_tag "selected_authorizations_#{authorization}", authorization.humanize %>
<% end %> diff --git a/spec/system/decidim/results_online_spec.rb b/spec/system/decidim/results_online_spec.rb index 1773f9f9..e31f2261 100644 --- a/spec/system/decidim/results_online_spec.rb +++ b/spec/system/decidim/results_online_spec.rb @@ -32,7 +32,7 @@ headers: { "Accept" => "*/*", "Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3", - "User-Agent" => "Faraday v2.7.1" + "User-Agent" => "Faraday v2.7.11" } ) .to_return(status: 200, body: <<~JSON, headers: {}) From 2bf8658971202a68cbb5120f7866daf987098eb2 Mon Sep 17 00:00:00 2001 From: Anna Topalidi Date: Mon, 6 Nov 2023 11:25:15 +0100 Subject: [PATCH 004/167] createion elections with cencus permissions --- .../vocdoni/admin/census_permissions.rb | 37 ++++++++++++ .../vocdoni/admin/census_controller.rb | 59 ++++++++++++++----- .../vocdoni/admin/census_permissions_form.rb | 18 ++++++ app/models/decidim/vocdoni/voter.rb | 4 ++ .../admin/utils/create_vocdoni_election.js | 2 +- .../census/_decidim_permissions_form.html.erb | 7 +++ .../vocdoni/admin/census/index.html.erb | 6 +- config/locales/en.yml | 1 + 8 files changed, 113 insertions(+), 21 deletions(-) create mode 100644 app/commands/decidim/vocdoni/admin/census_permissions.rb create mode 100644 app/forms/decidim/vocdoni/admin/census_permissions_form.rb create mode 100644 app/views/decidim/vocdoni/admin/census/_decidim_permissions_form.html.erb diff --git a/app/commands/decidim/vocdoni/admin/census_permissions.rb b/app/commands/decidim/vocdoni/admin/census_permissions.rb new file mode 100644 index 00000000..822570cc --- /dev/null +++ b/app/commands/decidim/vocdoni/admin/census_permissions.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module Decidim + module Vocdoni + module Admin + # A command with the business logic to create census data for an + # election. + class CensusPermissions < Decidim::Command + def initialize(form, election) + @form = form + @election = election + end + + # Executes the command. Broadcast this events: + # - :ok when everything is valid + # - :invalid when the form wasn't valid and couldn't proceed- + # + # Returns nothing. + def call + return broadcast(:invalid) unless @form.valid? + + users_data = fetch_verified_users + + Voter.insert_participants_with_permissions(@election, users_data, token: "verified") + + broadcast(:ok) + end + + private + + def fetch_verified_users + @form.data.map { |user| [user.email] } + end + end + end + end +end diff --git a/app/controllers/decidim/vocdoni/admin/census_controller.rb b/app/controllers/decidim/vocdoni/admin/census_controller.rb index ac0d4940..453a99ca 100644 --- a/app/controllers/decidim/vocdoni/admin/census_controller.rb +++ b/app/controllers/decidim/vocdoni/admin/census_controller.rb @@ -10,26 +10,16 @@ def index enforce_permission_to :index, :census, election: election @form = current_step_form_instance + @census_permissions_form = form(CensusPermissionsForm).instance end def create enforce_permission_to :create, :census, election: election - @form = form(current_step_form_class).from_params(params) - current_step_command_class.call(@form, election) do - on(:ok) do - flash[:notice] = if @form.respond_to?(:data) - t(".success.import", count: @form.data.values.count, errors: @form.data.errors.count) - else - t(".success.generate") - end - redirect_to election_census_path(election) - end - - on(:invalid) do - flash[:alert] = t(".error") - render :index - end + if params[:census_permissions] + handle_census_permissions + else + handle_census_csv end end @@ -92,6 +82,45 @@ def elections def election @election ||= elections.find_by(id: params[:election_id]) end + + def handle_census_permissions + @form = form(CensusPermissionsForm).from_params(params[:census_permissions]) + + process_form(@form, CensusPermissions, success_message_for(@form), :index) + end + + def handle_census_csv + @form = form(current_step_form_class).from_params(params) + + process_form(@form, current_step_command_class, success_message_for(@form, count_method: :values, error_method: :errors), :index) + end + + def process_form(form, command_class, success_message, failure_template) + command_class.call(form, election) do + on(:ok) { set_flash_and_redirect(:notice, success_message) } + on(:invalid) { set_flash_and_render(:alert, t(".error"), failure_template) } + end + end + + def success_message_for(form, count_method: :count, error_method: nil) + if form.respond_to?(:data) + t(".success.import", + count: form.data.send(count_method), + errors: error_method ? form.data.send(error_method).count : 0) + else + t(".success.generate") + end + end + + def set_flash_and_redirect(type, message) + flash[type] = message + redirect_to election_census_path(election) + end + + def set_flash_and_render(type, message, template) + flash[type] = message + render template + end end end end diff --git a/app/forms/decidim/vocdoni/admin/census_permissions_form.rb b/app/forms/decidim/vocdoni/admin/census_permissions_form.rb new file mode 100644 index 00000000..3d619e6e --- /dev/null +++ b/app/forms/decidim/vocdoni/admin/census_permissions_form.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Decidim + module Vocdoni + module Admin + class CensusPermissionsForm < Decidim::Form + mimic :census_permissions + + attribute :census_permissions, Array[String] + + def data + verification_types = census_permissions + Decidim::Authorization.where(name: verification_types).map(&:user).uniq + end + end + end + end +end diff --git a/app/models/decidim/vocdoni/voter.rb b/app/models/decidim/vocdoni/voter.rb index 3635366b..90225a57 100644 --- a/app/models/decidim/vocdoni/voter.rb +++ b/app/models/decidim/vocdoni/voter.rb @@ -23,6 +23,10 @@ def self.insert_all(election, values) values.each { |value| create(email: value.first.downcase, election: election, token: value.second.downcase) } end + def self.insert_participants_with_permissions(election, emails, token) + emails.flatten.each { |email| create(email: email.downcase, election: election, token: token) } + end + def self.clear(election) inside(election).delete_all end diff --git a/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js b/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js index e8aa2bd2..198a46cc 100644 --- a/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js +++ b/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js @@ -125,7 +125,7 @@ export default class CreateVocdoniElection { localeName = "default"; } - if (elem.text !== null && elem.text !== undefined) { + if (elem.text !== null && typeof elem.text !== "undefined") { obj[localeName] = elem.text; } diff --git a/app/views/decidim/vocdoni/admin/census/_decidim_permissions_form.html.erb b/app/views/decidim/vocdoni/admin/census/_decidim_permissions_form.html.erb new file mode 100644 index 00000000..6d4431b8 --- /dev/null +++ b/app/views/decidim/vocdoni/admin/census/_decidim_permissions_form.html.erb @@ -0,0 +1,7 @@ +<%= decidim_form_for form, url: election_census_path(election), method: :post do |form| %> + <%= form.hidden_field :census_permissions_form, value: true %> + <% current_organization.available_authorizations.each do |authorization| %> + <%= form.check_box :census_permissions, { label: authorization.humanize, multiple: true, include_hidden: false }, authorization, nil %> + <% end %> + <%= form.submit t("create.submit_permissions", scope: "decidim.vocdoni.admin.census") %> +<% end %> diff --git a/app/views/decidim/vocdoni/admin/census/index.html.erb b/app/views/decidim/vocdoni/admin/census/index.html.erb index b37d6c36..7bd80fa3 100644 --- a/app/views/decidim/vocdoni/admin/census/index.html.erb +++ b/app/views/decidim/vocdoni/admin/census/index.html.erb @@ -78,11 +78,7 @@
- <% current_organization.available_authorizations.each do |authorization| %> - <%= check_box_tag "selected_authorizations[]", authorization %> - <%= label_tag "selected_authorizations_#{authorization}", authorization.humanize %> -
- <% end %> + <%= render partial: "decidim_permissions_form", locals: { form: @census_permissions_form, election: election, current_organization: current_organization } %>
<% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index b7b8e6a0..5cd0915c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -82,6 +82,7 @@ en: submit: Confirm the census data create: error: There was an error importing or generating the census. + submit_permissions: Save census success: generate: Successfully generated the census import: Successfully imported %{count} items (%{errors} errors) From cc249569cc530a15708d704e5e865c7bfacedad1 Mon Sep 17 00:00:00 2001 From: Anna Topalidi Date: Wed, 8 Nov 2023 13:54:44 +0100 Subject: [PATCH 005/167] add batch queue --- Gemfile | 1 + Gemfile.lock | 4 ++ .../vocdoni/admin/census_permissions.rb | 16 ++++++- .../vocdoni/admin/create_census_data.rb | 7 +++ .../vocdoni/admin/update_election_calendar.rb | 2 +- .../vocdoni/send_data_to_vocdoni_job.rb | 45 +++++++++++++++++++ .../decidim/vocdoni/authorization_override.rb | 36 +++++++++++++++ .../decidim/vocdoni/authorizations_data.rb | 13 ++++++ app/models/decidim/vocdoni/election.rb | 6 +++ app/models/decidim/vocdoni/voter.rb | 12 +++++ .../census/_decidim_permissions_form.html.erb | 2 +- .../vocdoni/admin/census/index.html.erb | 4 +- ..._type_data_to_decicid_vocdoni_elections.rb | 8 ++++ ...ocdoni_census_to_decidim_vocodni_voters.rb | 7 +++ ...3446_create_vocdoni_authorizations_data.rb | 13 ++++++ lib/decidim/vocdoni/engine.rb | 6 +++ lib/tasks/decidim_vocdoni.rake | 5 +++ lib/tasks/schedule.rb | 7 +++ 18 files changed, 188 insertions(+), 6 deletions(-) create mode 100644 app/jobs/decidim/vocdoni/send_data_to_vocdoni_job.rb create mode 100644 app/models/concerns/decidim/vocdoni/authorization_override.rb create mode 100644 app/models/decidim/vocdoni/authorizations_data.rb create mode 100644 db/migrate/20231107142971_add_census_type_data_to_decicid_vocdoni_elections.rb create mode 100644 db/migrate/20231107143833_add_in_vocdoni_census_to_decidim_vocodni_voters.rb create mode 100644 db/migrate/20231107193446_create_vocdoni_authorizations_data.rb create mode 100644 lib/tasks/schedule.rb diff --git a/Gemfile b/Gemfile index 49c4bc5c..ef8d60e0 100644 --- a/Gemfile +++ b/Gemfile @@ -12,6 +12,7 @@ gem "decidim-vocdoni", path: "." gem "bootsnap", "~> 1.7" gem "faker", "~> 2.14" gem "puma", "~> 5.6.2" +gem "whenever" group :development, :test do gem "byebug", "~> 11.0", platform: :mri diff --git a/Gemfile.lock b/Gemfile.lock index c626012d..d920a7f9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -134,6 +134,7 @@ GEM chef-utils (18.3.0) concurrent-ruby childprocess (4.1.0) + chronic (0.10.2) codecov (0.6.0) simplecov (>= 0.15, < 0.22) coercible (1.0.0) @@ -789,6 +790,8 @@ GEM websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) + whenever (1.0.0) + chronic (>= 0.6.3) wicked_pdf (2.7.0) activesupport wisper (2.0.1) @@ -820,6 +823,7 @@ DEPENDENCIES spring (~> 2.0) spring-watcher-listen (~> 2.0.0) web-console (~> 4.2) + whenever RUBY VERSION ruby 3.0.5p211 diff --git a/app/commands/decidim/vocdoni/admin/census_permissions.rb b/app/commands/decidim/vocdoni/admin/census_permissions.rb index 822570cc..b6e0f610 100644 --- a/app/commands/decidim/vocdoni/admin/census_permissions.rb +++ b/app/commands/decidim/vocdoni/admin/census_permissions.rb @@ -6,6 +6,9 @@ module Admin # A command with the business logic to create census data for an # election. class CensusPermissions < Decidim::Command + TOKEN = "verified" + CENSUS_TYPE = "census_permissions" + def initialize(form, election) @form = form @election = election @@ -21,8 +24,9 @@ def call users_data = fetch_verified_users - Voter.insert_participants_with_permissions(@election, users_data, token: "verified") - + Voter.insert_participants_with_permissions(@election, users_data, TOKEN) + update_census_type(CENSUS_TYPE) + update_verification_types(@form.census_permissions) broadcast(:ok) end @@ -31,6 +35,14 @@ def call def fetch_verified_users @form.data.map { |user| [user.email] } end + + def update_census_type(census_type) + @election.update!(census_type: census_type) + end + + def update_verification_types(types) + @election.update!(verification_types: types) + end end end end diff --git a/app/commands/decidim/vocdoni/admin/create_census_data.rb b/app/commands/decidim/vocdoni/admin/create_census_data.rb index 729cfe88..84a1d6d3 100644 --- a/app/commands/decidim/vocdoni/admin/create_census_data.rb +++ b/app/commands/decidim/vocdoni/admin/create_census_data.rb @@ -25,9 +25,16 @@ def call # rubocop:disable Rails/SkipsModelValidations Voter.insert_all(@election, data.values) # rubocop:enable Rails/SkipsModelValidations + update_census_type("census_csv") broadcast(:ok) end + + private + + def update_census_type(census_type) + @election.update!(census_type: census_type) + end end end end diff --git a/app/commands/decidim/vocdoni/admin/update_election_calendar.rb b/app/commands/decidim/vocdoni/admin/update_election_calendar.rb index fa5053cd..153171a0 100644 --- a/app/commands/decidim/vocdoni/admin/update_election_calendar.rb +++ b/app/commands/decidim/vocdoni/admin/update_election_calendar.rb @@ -51,7 +51,7 @@ def election_type_attributes auto_start: !form.manual_start, secret_until_the_end: form.result_type == "after_voting", interruptible: Decidim::Vocdoni.interruptible_elections, - dynamic_census: form.dynamic_census, + dynamic_census: election.census_type == "census_permissions" ? true : form.dynamic_census, anonymous: form.anonymous } } diff --git a/app/jobs/decidim/vocdoni/send_data_to_vocdoni_job.rb b/app/jobs/decidim/vocdoni/send_data_to_vocdoni_job.rb new file mode 100644 index 00000000..be26b187 --- /dev/null +++ b/app/jobs/decidim/vocdoni/send_data_to_vocdoni_job.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module Decidim + module Vocdoni + class SendDataToVocdoniJob < ApplicationJob + queue_as :send_data_to_vocdoni + + def perform + election_authorization_data = group_authorization_data_by_election + + election_authorization_data.each do |election_id, authorizations| + process_election_authorizations(election_id, authorizations) + end + end + + private + + def group_authorization_data_by_election + AuthorizationsData.where(processed: false).each_with_object({}) do |authorization_data, hash| + (hash[authorization_data.decidim_vocdoni_election_id] ||= []) << authorization_data + end + end + + def process_election_authorizations(election_id, authorizations) + election = Decidim::Vocdoni::Election.find_by(id: election_id) + return unless election && election.census_type == "census_permissions" + + user_emails = authorizations.filter_map do |authorization_data| + user = Decidim::User.find_by(id: authorization_data.authorization.decidim_user_id) + if user && election.verification_types.include?(authorization_data.authorization.name) + authorization_data.update(processed: true) + user.email + end + end + + Decidim::Vocdoni::Voter.insert_participants_with_permissions(election, user_emails, "verified") if user_emails.any? + + Rails.logger.debug { "Processed authorization data for election with id: #{election.id}" } + Rails.logger.debug { "Election voters count: #{election.voters.count}" } + + authorizations.select(&:processed).each(&:destroy) + end + end + end +end diff --git a/app/models/concerns/decidim/vocdoni/authorization_override.rb b/app/models/concerns/decidim/vocdoni/authorization_override.rb new file mode 100644 index 00000000..bcb7fdd7 --- /dev/null +++ b/app/models/concerns/decidim/vocdoni/authorization_override.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Decidim + module Vocdoni + module AuthorizationOverride + extend ActiveSupport::Concern + + included do + has_one :vocdoni_authorizations_data, + class_name: "Decidim::Vocdoni::AuthorizationsData", + dependent: :destroy + + after_update :add_to_vocdoni_queue, if: :saved_change_to_granted_at? + + def add_to_vocdoni_queue + elections_with_census_permissions.each do |election| + next unless election.verification_types.include?(name) && granted_at.present? + + Decidim::Vocdoni::AuthorizationsData.find_or_create_by!( + authorization: self, + decidim_vocdoni_election_id: election.id + ) do |authorization_data| + authorization_data.processed = false + end + end + end + + private + + def elections_with_census_permissions + Decidim::Vocdoni::Election.where(census_type: "census_permissions") + end + end + end + end +end diff --git a/app/models/decidim/vocdoni/authorizations_data.rb b/app/models/decidim/vocdoni/authorizations_data.rb new file mode 100644 index 00000000..cd606272 --- /dev/null +++ b/app/models/decidim/vocdoni/authorizations_data.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Decidim + module Vocdoni + # app/models/vocdoni_authorizations_data.rb + class AuthorizationsData < ApplicationRecord + belongs_to :authorization, class_name: "Decidim::Authorization" + belongs_to :election, foreign_key: "decidim_vocdoni_election_id", class_name: "Decidim::Vocdoni::Election" + + validates :processed, inclusion: { in: [true, false] } + end + end +end diff --git a/app/models/decidim/vocdoni/election.rb b/app/models/decidim/vocdoni/election.rb index 72c06a33..d8d0c624 100644 --- a/app/models/decidim/vocdoni/election.rb +++ b/app/models/decidim/vocdoni/election.rb @@ -168,6 +168,12 @@ def explorer_vote_url "https://#{Decidim::Vocdoni.explorer_vote_domain}/processes/show/#/#{vocdoni_election_id}" end + def census_permissions_verification_types + return if census_type != "census_permissions" + + verification_types + end + private def census_status diff --git a/app/models/decidim/vocdoni/voter.rb b/app/models/decidim/vocdoni/voter.rb index 90225a57..c0c6addf 100644 --- a/app/models/decidim/vocdoni/voter.rb +++ b/app/models/decidim/vocdoni/voter.rb @@ -7,6 +7,9 @@ class Voter < ApplicationRecord validates :email, format: { with: ::Devise.email_regexp } validates :token, presence: true + validates :in_vocdoni_census, inclusion: { in: [true, false] } + + after_save :update_in_vocdoni_census, if: :saved_change_to_wallet_address? def self.inside(election) where(election: election) @@ -30,6 +33,15 @@ def self.insert_participants_with_permissions(election, emails, token) def self.clear(election) inside(election).delete_all end + + def update_in_vocdoni_census + self.in_vocdoni_census = wallet_address.present? + save! if changed? + end + + def sent_to_vocdoni? + in_vocdoni_census + end end end end diff --git a/app/views/decidim/vocdoni/admin/census/_decidim_permissions_form.html.erb b/app/views/decidim/vocdoni/admin/census/_decidim_permissions_form.html.erb index 6d4431b8..f92ae023 100644 --- a/app/views/decidim/vocdoni/admin/census/_decidim_permissions_form.html.erb +++ b/app/views/decidim/vocdoni/admin/census/_decidim_permissions_form.html.erb @@ -1,7 +1,7 @@ <%= decidim_form_for form, url: election_census_path(election), method: :post do |form| %> <%= form.hidden_field :census_permissions_form, value: true %> <% current_organization.available_authorizations.each do |authorization| %> - <%= form.check_box :census_permissions, { label: authorization.humanize, multiple: true, include_hidden: false }, authorization, nil %> + <%= form.check_box :census_permissions, { label: authorization.humanize, multiple: true, include_hidden: false, checked: election.verification_types.include?(authorization) }, authorization %> <% end %> <%= form.submit t("create.submit_permissions", scope: "decidim.vocdoni.admin.census") %> <% end %> diff --git a/app/views/decidim/vocdoni/admin/census/index.html.erb b/app/views/decidim/vocdoni/admin/census/index.html.erb index 7bd80fa3..94172540 100644 --- a/app/views/decidim/vocdoni/admin/census/index.html.erb +++ b/app/views/decidim/vocdoni/admin/census/index.html.erb @@ -18,10 +18,10 @@

- <%= radio_button_tag "census_type", "csv", true, id: "csv_radio_button" %> + <%= radio_button_tag "census_type", "csv", election.census_type == "census_csv", id: "csv_radio_button" %> <%= label_tag "csv_radio_button", t("census_type.csv", scope: "decidim.vocdoni.admin.census") %> - <%= radio_button_tag "census_type", "permissions", false, id: "permissions_radio_button" %> + <%= radio_button_tag "census_type", "permissions", election.census_type == "census_permissions", id: "permissions_radio_button" %> <%= label_tag "permissions_radio_button", t("census_type.permissions", scope: "decidim.vocdoni.admin.census") %>
diff --git a/db/migrate/20231107142971_add_census_type_data_to_decicid_vocdoni_elections.rb b/db/migrate/20231107142971_add_census_type_data_to_decicid_vocdoni_elections.rb new file mode 100644 index 00000000..7028d9e1 --- /dev/null +++ b/db/migrate/20231107142971_add_census_type_data_to_decicid_vocdoni_elections.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class AddCensusTypeDataToDecicidVocdoniElections < ActiveRecord::Migration[6.1] + def change + add_column :decidim_vocdoni_elections, :census_type, :string + add_column :decidim_vocdoni_elections, :verification_types, :string, array: true, default: [] + end +end diff --git a/db/migrate/20231107143833_add_in_vocdoni_census_to_decidim_vocodni_voters.rb b/db/migrate/20231107143833_add_in_vocdoni_census_to_decidim_vocodni_voters.rb new file mode 100644 index 00000000..a56ad282 --- /dev/null +++ b/db/migrate/20231107143833_add_in_vocdoni_census_to_decidim_vocodni_voters.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddInVocdoniCensusToDecidimVocodniVoters < ActiveRecord::Migration[6.1] + def change + add_column :decidim_vocdoni_voters, :in_vocdoni_census, :boolean, default: false + end +end diff --git a/db/migrate/20231107193446_create_vocdoni_authorizations_data.rb b/db/migrate/20231107193446_create_vocdoni_authorizations_data.rb new file mode 100644 index 00000000..41027a6c --- /dev/null +++ b/db/migrate/20231107193446_create_vocdoni_authorizations_data.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class CreateVocdoniAuthorizationsData < ActiveRecord::Migration[6.1] + def change + create_table :decidim_vocdoni_authorizations_data do |t| + t.references :authorization, null: false, foreign_key: { to_table: :decidim_authorizations } + t.boolean :processed, default: false, null: false + t.references :decidim_vocdoni_election, null: false, foreign_key: true, index: { name: "index_decidim_vocdoni_auth_data_on_election_id" } + + t.timestamps + end + end +end diff --git a/lib/decidim/vocdoni/engine.rb b/lib/decidim/vocdoni/engine.rb index 8b7c6c77..5f1fa10f 100644 --- a/lib/decidim/vocdoni/engine.rb +++ b/lib/decidim/vocdoni/engine.rb @@ -20,6 +20,12 @@ class Engine < ::Rails::Engine root to: "elections#index" end + initializer "decidim.vocdoni.overrides" do + config.to_prepare do + Decidim::Authorization.include(Decidim::Vocdoni::AuthorizationOverride) + end + end + initializer "decidim.vocdoni.add_cells_view_paths" do Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Vocdoni::Engine.root}/app/cells") Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Vocdoni::Engine.root}/app/views") # for partials diff --git a/lib/tasks/decidim_vocdoni.rake b/lib/tasks/decidim_vocdoni.rake index 1d3cc241..48cfddf7 100644 --- a/lib/tasks/decidim_vocdoni.rake +++ b/lib/tasks/decidim_vocdoni.rake @@ -7,4 +7,9 @@ namespace :decidim_vocdoni do task :change_election_status, [] => :environment do Decidim::Vocdoni::ElectionStatusChanger.new.run end + + desc "Send batch updates to Vocdoni" + task :send_batch_updates, [] => :environment do + Decidim::Vocdoni::SendDataToVocdoniJob.new.perform + end end diff --git a/lib/tasks/schedule.rb b/lib/tasks/schedule.rb new file mode 100644 index 00000000..372b3847 --- /dev/null +++ b/lib/tasks/schedule.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +app_path = "development_app" + +every 1.minute do + command "cd #{app_path} && bundle exec rake decidim_vocdoni:send_batch_updates" +end From c80d217f625894e330753e9123ed0f6eca305efc Mon Sep 17 00:00:00 2001 From: Anna Topalidi Date: Wed, 8 Nov 2023 22:17:59 +0100 Subject: [PATCH 006/167] add verification methods for voting --- ...s.rb => create_census_with_permissions.rb} | 4 +- .../vocdoni/admin/census_controller.rb | 2 +- .../decidim/vocdoni/votes_controller.rb | 12 +++- .../admin/utils/create_vocdoni_election.js | 1 + .../vocdoni/admin/census/index.html.erb | 2 +- .../decidim/vocdoni/votes/_login.html.erb | 59 +++++++++++++------ 6 files changed, 58 insertions(+), 22 deletions(-) rename app/commands/decidim/vocdoni/admin/{census_permissions.rb => create_census_with_permissions.rb} (90%) diff --git a/app/commands/decidim/vocdoni/admin/census_permissions.rb b/app/commands/decidim/vocdoni/admin/create_census_with_permissions.rb similarity index 90% rename from app/commands/decidim/vocdoni/admin/census_permissions.rb rename to app/commands/decidim/vocdoni/admin/create_census_with_permissions.rb index b6e0f610..3b95367c 100644 --- a/app/commands/decidim/vocdoni/admin/census_permissions.rb +++ b/app/commands/decidim/vocdoni/admin/create_census_with_permissions.rb @@ -5,7 +5,7 @@ module Vocdoni module Admin # A command with the business logic to create census data for an # election. - class CensusPermissions < Decidim::Command + class CreateCensusWithPermissions < Decidim::Command TOKEN = "verified" CENSUS_TYPE = "census_permissions" @@ -41,7 +41,7 @@ def update_census_type(census_type) end def update_verification_types(types) - @election.update!(verification_types: types) + @election.update!(verification_types: types) if types.present? end end end diff --git a/app/controllers/decidim/vocdoni/admin/census_controller.rb b/app/controllers/decidim/vocdoni/admin/census_controller.rb index 453a99ca..7a9526af 100644 --- a/app/controllers/decidim/vocdoni/admin/census_controller.rb +++ b/app/controllers/decidim/vocdoni/admin/census_controller.rb @@ -86,7 +86,7 @@ def election def handle_census_permissions @form = form(CensusPermissionsForm).from_params(params[:census_permissions]) - process_form(@form, CensusPermissions, success_message_for(@form), :index) + process_form(@form, CreateCensusWithPermissions, success_message_for(@form), :index) end def handle_census_csv diff --git a/app/controllers/decidim/vocdoni/votes_controller.rb b/app/controllers/decidim/vocdoni/votes_controller.rb index 7f913b4f..a048a208 100644 --- a/app/controllers/decidim/vocdoni/votes_controller.rb +++ b/app/controllers/decidim/vocdoni/votes_controller.rb @@ -10,7 +10,7 @@ class VotesController < Decidim::Vocdoni::ApplicationController helper VotesHelper helper_method :exit_path, :elections, :election, :questions, :questions_count, :vote, - :preview_mode?, :election_unique_id, :vocdoni_api_endpoint_env + :preview_mode?, :election_unique_id, :vocdoni_api_endpoint_env, :census_authorize_methods delegate :count, to: :questions, prefix: true @@ -73,6 +73,16 @@ def vote_allowed? true end + + def census_authorize_methods + extend Decidim::UserProfile + + election_verification_types = election.verification_types + + @census_authorize_methods ||= available_verification_workflows.select do |workflow| + election_verification_types.include?(workflow.name) + end + end end end end diff --git a/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js b/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js index 198a46cc..a739ec90 100644 --- a/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js +++ b/app/packs/src/decidim/vocdoni/admin/utils/create_vocdoni_election.js @@ -157,6 +157,7 @@ export default class CreateVocdoniElection { electionType: { interruptible: electionMetadata.interruptible, secretUntilTheEnd: electionMetadata.secretUntilTheEnd, + dynamicCensus: electionMetadata.dynamicCensus, anonymous: electionMetadata.anonymous }, voteType: { diff --git a/app/views/decidim/vocdoni/admin/census/index.html.erb b/app/views/decidim/vocdoni/admin/census/index.html.erb index 94172540..9aa6068f 100644 --- a/app/views/decidim/vocdoni/admin/census/index.html.erb +++ b/app/views/decidim/vocdoni/admin/census/index.html.erb @@ -18,7 +18,7 @@

- <%= radio_button_tag "census_type", "csv", election.census_type == "census_csv", id: "csv_radio_button" %> + <%= radio_button_tag "census_type", "csv", election.census_type.blank? || election.census_type == "census_csv", id: "csv_radio_button" %> <%= label_tag "csv_radio_button", t("census_type.csv", scope: "decidim.vocdoni.admin.census") %> <%= radio_button_tag "census_type", "permissions", election.census_type == "census_permissions", id: "permissions_radio_button" %> diff --git a/app/views/decidim/vocdoni/votes/_login.html.erb b/app/views/decidim/vocdoni/votes/_login.html.erb index cd8cf56b..6fcf1706 100644 --- a/app/views/decidim/vocdoni/votes/_login.html.erb +++ b/app/views/decidim/vocdoni/votes/_login.html.erb @@ -8,26 +8,51 @@

<%= t(".description") %>

- <%= decidim_form_for(@form, url: "#", html: { class: "form", autocomplete: "off" }) do |f| %> -
- From 3c4fa6da542687541fc1278c9189645862e9d726 Mon Sep 17 00:00:00 2001 From: Anna Topalidi Date: Fri, 10 Nov 2023 09:51:17 +0100 Subject: [PATCH 007/167] remove whenever, add info to readme --- Gemfile | 1 - Gemfile.lock | 4 ---- README.md | 7 +++++++ lib/tasks/schedule.rb | 7 ------- 4 files changed, 7 insertions(+), 12 deletions(-) delete mode 100644 lib/tasks/schedule.rb diff --git a/Gemfile b/Gemfile index ef8d60e0..49c4bc5c 100644 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,6 @@ gem "decidim-vocdoni", path: "." gem "bootsnap", "~> 1.7" gem "faker", "~> 2.14" gem "puma", "~> 5.6.2" -gem "whenever" group :development, :test do gem "byebug", "~> 11.0", platform: :mri diff --git a/Gemfile.lock b/Gemfile.lock index d920a7f9..c626012d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -134,7 +134,6 @@ GEM chef-utils (18.3.0) concurrent-ruby childprocess (4.1.0) - chronic (0.10.2) codecov (0.6.0) simplecov (>= 0.15, < 0.22) coercible (1.0.0) @@ -790,8 +789,6 @@ GEM websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - whenever (1.0.0) - chronic (>= 0.6.3) wicked_pdf (2.7.0) activesupport wisper (2.0.1) @@ -823,7 +820,6 @@ DEPENDENCIES spring (~> 2.0) spring-watcher-listen (~> 2.0.0) web-console (~> 4.2) - whenever RUBY VERSION ruby 3.0.5p211 diff --git a/README.md b/README.md index 385b4693..3c387f2c 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,13 @@ status are checked every 15 minutes, you can do it with this configuration: 0/15 0 * * * cd /home/user/decidim_application && RAILS_ENV=production bin/rails decidim_vocdoni:change_election_status > /dev/null ``` +# Sending Batch Updates to Vocdoni +To set up automatic sending of batch updates to Vocdoni every minute, add the following line to your crontab: + +```crontab +* * * * * cd /home/user/decidim_application && RAILS_ENV=production bin/rails runner decidim_vocdoni:send_batch_updates > /dev/null +``` + ## Configuration By default, the module is configured to read the configuration from ENV variables. diff --git a/lib/tasks/schedule.rb b/lib/tasks/schedule.rb deleted file mode 100644 index 372b3847..00000000 --- a/lib/tasks/schedule.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -app_path = "development_app" - -every 1.minute do - command "cd #{app_path} && bundle exec rake decidim_vocdoni:send_batch_updates" -end From 1e682d16f9052eefc51f375a42967f99975530ff Mon Sep 17 00:00:00 2001 From: Anna Topalidi Date: Fri, 10 Nov 2023 12:36:07 +0100 Subject: [PATCH 008/167] update the vocdoni census after delete authorization --- .../decidim/vocdoni/admin/census_controller.rb | 10 ++++++---- .../concerns/decidim/vocdoni/authorization_override.rb | 9 +++++++++ app/models/decidim/vocdoni/voter.rb | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/controllers/decidim/vocdoni/admin/census_controller.rb b/app/controllers/decidim/vocdoni/admin/census_controller.rb index 7a9526af..abbd2ee2 100644 --- a/app/controllers/decidim/vocdoni/admin/census_controller.rb +++ b/app/controllers/decidim/vocdoni/admin/census_controller.rb @@ -92,7 +92,7 @@ def handle_census_permissions def handle_census_csv @form = form(current_step_form_class).from_params(params) - process_form(@form, current_step_command_class, success_message_for(@form, count_method: :values, error_method: :errors), :index) + process_form(@form, current_step_command_class, success_message_for(@form, error_method: :errors), :index) end def process_form(form, command_class, success_message, failure_template) @@ -102,11 +102,13 @@ def process_form(form, command_class, success_message, failure_template) end end - def success_message_for(form, count_method: :count, error_method: nil) + def success_message_for(form, error_method: nil) if form.respond_to?(:data) + count = form.data.respond_to?(:values) ? form.data.values.count : form.data.count + error_count = error_method ? form.data.send(error_method).count : 0 t(".success.import", - count: form.data.send(count_method), - errors: error_method ? form.data.send(error_method).count : 0) + count: count, + errors: error_count) else t(".success.generate") end diff --git a/app/models/concerns/decidim/vocdoni/authorization_override.rb b/app/models/concerns/decidim/vocdoni/authorization_override.rb index bcb7fdd7..ace53dfd 100644 --- a/app/models/concerns/decidim/vocdoni/authorization_override.rb +++ b/app/models/concerns/decidim/vocdoni/authorization_override.rb @@ -11,6 +11,7 @@ module AuthorizationOverride dependent: :destroy after_update :add_to_vocdoni_queue, if: :saved_change_to_granted_at? + after_destroy :clear_related_voters_from_census def add_to_vocdoni_queue elections_with_census_permissions.each do |election| @@ -25,6 +26,14 @@ def add_to_vocdoni_queue end end + def clear_related_voters_from_census + user = Decidim::User.find_by(id: decidim_user_id) + + elections_with_census_permissions.each do |election| + Decidim::Vocdoni::Voter.clear(election) if Decidim::Vocdoni::Voter.exists?(email: user.email, election: election) + end + end + private def elections_with_census_permissions diff --git a/app/models/decidim/vocdoni/voter.rb b/app/models/decidim/vocdoni/voter.rb index c0c6addf..6d223ccf 100644 --- a/app/models/decidim/vocdoni/voter.rb +++ b/app/models/decidim/vocdoni/voter.rb @@ -6,6 +6,7 @@ class Voter < ApplicationRecord belongs_to :election, foreign_key: "decidim_vocdoni_election_id", class_name: "Decidim::Vocdoni::Election", inverse_of: :voters validates :email, format: { with: ::Devise.email_regexp } + validates :email, uniqueness: { scope: :decidim_vocdoni_election_id } validates :token, presence: true validates :in_vocdoni_census, inclusion: { in: [true, false] } From 30ad6b9a7c30ee2c24a3eaf34b4bf9db883bbf36 Mon Sep 17 00:00:00 2001 From: Anna Topalidi Date: Fri, 10 Nov 2023 13:46:28 +0100 Subject: [PATCH 009/167] add internal_census field --- .../decidim/vocdoni/admin/create_census_data.rb | 6 +++--- .../vocdoni/admin/create_census_with_permissions.rb | 7 +++---- .../vocdoni/admin/update_election_calendar.rb | 2 +- app/jobs/decidim/vocdoni/send_data_to_vocdoni_job.rb | 2 +- .../decidim/vocdoni/authorization_override.rb | 2 +- app/models/decidim/vocdoni/election.rb | 12 +++++++++++- .../decidim/vocdoni/admin/census/index.html.erb | 4 ++-- app/views/decidim/vocdoni/votes/_login.html.erb | 3 ++- ..._census_type_data_to_decicid_vocdoni_elections.rb | 2 +- 9 files changed, 25 insertions(+), 15 deletions(-) diff --git a/app/commands/decidim/vocdoni/admin/create_census_data.rb b/app/commands/decidim/vocdoni/admin/create_census_data.rb index 84a1d6d3..85b784e0 100644 --- a/app/commands/decidim/vocdoni/admin/create_census_data.rb +++ b/app/commands/decidim/vocdoni/admin/create_census_data.rb @@ -25,15 +25,15 @@ def call # rubocop:disable Rails/SkipsModelValidations Voter.insert_all(@election, data.values) # rubocop:enable Rails/SkipsModelValidations - update_census_type("census_csv") + update_census_type broadcast(:ok) end private - def update_census_type(census_type) - @election.update!(census_type: census_type) + def update_census_type + @election.update!(internal_census: false) end end end diff --git a/app/commands/decidim/vocdoni/admin/create_census_with_permissions.rb b/app/commands/decidim/vocdoni/admin/create_census_with_permissions.rb index 3b95367c..0401ef24 100644 --- a/app/commands/decidim/vocdoni/admin/create_census_with_permissions.rb +++ b/app/commands/decidim/vocdoni/admin/create_census_with_permissions.rb @@ -7,7 +7,6 @@ module Admin # election. class CreateCensusWithPermissions < Decidim::Command TOKEN = "verified" - CENSUS_TYPE = "census_permissions" def initialize(form, election) @form = form @@ -25,7 +24,7 @@ def call users_data = fetch_verified_users Voter.insert_participants_with_permissions(@election, users_data, TOKEN) - update_census_type(CENSUS_TYPE) + update_census_type update_verification_types(@form.census_permissions) broadcast(:ok) end @@ -36,8 +35,8 @@ def fetch_verified_users @form.data.map { |user| [user.email] } end - def update_census_type(census_type) - @election.update!(census_type: census_type) + def update_census_type + @election.update!(internal_census: true) end def update_verification_types(types) diff --git a/app/commands/decidim/vocdoni/admin/update_election_calendar.rb b/app/commands/decidim/vocdoni/admin/update_election_calendar.rb index 153171a0..1a11ce33 100644 --- a/app/commands/decidim/vocdoni/admin/update_election_calendar.rb +++ b/app/commands/decidim/vocdoni/admin/update_election_calendar.rb @@ -51,7 +51,7 @@ def election_type_attributes auto_start: !form.manual_start, secret_until_the_end: form.result_type == "after_voting", interruptible: Decidim::Vocdoni.interruptible_elections, - dynamic_census: election.census_type == "census_permissions" ? true : form.dynamic_census, + dynamic_census: election.internal_census? ? true : form.dynamic_census, anonymous: form.anonymous } } diff --git a/app/jobs/decidim/vocdoni/send_data_to_vocdoni_job.rb b/app/jobs/decidim/vocdoni/send_data_to_vocdoni_job.rb index be26b187..37c9be64 100644 --- a/app/jobs/decidim/vocdoni/send_data_to_vocdoni_job.rb +++ b/app/jobs/decidim/vocdoni/send_data_to_vocdoni_job.rb @@ -23,7 +23,7 @@ def group_authorization_data_by_election def process_election_authorizations(election_id, authorizations) election = Decidim::Vocdoni::Election.find_by(id: election_id) - return unless election && election.census_type == "census_permissions" + return unless election && election.internal_census? user_emails = authorizations.filter_map do |authorization_data| user = Decidim::User.find_by(id: authorization_data.authorization.decidim_user_id) diff --git a/app/models/concerns/decidim/vocdoni/authorization_override.rb b/app/models/concerns/decidim/vocdoni/authorization_override.rb index ace53dfd..3a8df582 100644 --- a/app/models/concerns/decidim/vocdoni/authorization_override.rb +++ b/app/models/concerns/decidim/vocdoni/authorization_override.rb @@ -37,7 +37,7 @@ def clear_related_voters_from_census private def elections_with_census_permissions - Decidim::Vocdoni::Election.where(census_type: "census_permissions") + Decidim::Vocdoni::Election.where(internal_census: true) end end end diff --git a/app/models/decidim/vocdoni/election.rb b/app/models/decidim/vocdoni/election.rb index d8d0c624..83c4d22e 100644 --- a/app/models/decidim/vocdoni/election.rb +++ b/app/models/decidim/vocdoni/election.rb @@ -168,8 +168,18 @@ def explorer_vote_url "https://#{Decidim::Vocdoni.explorer_vote_domain}/processes/show/#/#{vocdoni_election_id}" end + # Public: Checks if the election uses an internal census. + # + # This method returns `true` if Decidim's internal census system is used to create a Vocdoni election. + # This method returns `false` if a CSV file is used to create a Vocdoni election. + # + # Returns a boolean. + def internal_census? + internal_census + end + def census_permissions_verification_types - return if census_type != "census_permissions" + return unless internal_census? verification_types end diff --git a/app/views/decidim/vocdoni/admin/census/index.html.erb b/app/views/decidim/vocdoni/admin/census/index.html.erb index 9aa6068f..7fac0276 100644 --- a/app/views/decidim/vocdoni/admin/census/index.html.erb +++ b/app/views/decidim/vocdoni/admin/census/index.html.erb @@ -18,10 +18,10 @@

- <%= radio_button_tag "census_type", "csv", election.census_type.blank? || election.census_type == "census_csv", id: "csv_radio_button" %> + <%= radio_button_tag "census_type", "csv", !election.internal_census?, id: "csv_radio_button" %> <%= label_tag "csv_radio_button", t("census_type.csv", scope: "decidim.vocdoni.admin.census") %> - <%= radio_button_tag "census_type", "permissions", election.census_type == "census_permissions", id: "permissions_radio_button" %> + <%= radio_button_tag "census_type", "permissions", election.internal_census?, id: "permissions_radio_button" %> <%= label_tag "permissions_radio_button", t("census_type.permissions", scope: "decidim.vocdoni.admin.census") %>
diff --git a/app/views/decidim/vocdoni/votes/_login.html.erb b/app/views/decidim/vocdoni/votes/_login.html.erb index 6fcf1706..28616585 100644 --- a/app/views/decidim/vocdoni/votes/_login.html.erb +++ b/app/views/decidim/vocdoni/votes/_login.html.erb @@ -8,7 +8,8 @@

<%= t(".description") %>

- <% if election.census_type == "census_csv" %> + <% byebug %> + <% unless election.internal_census? %> <%= decidim_form_for(@form, url: "#", html: { class: "form", autocomplete: "off" }) do |f| %>