decidim-direct_verifications 0.22.1 → 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -3
  3. data/app/assets/config/direct_verifications_admin_manifest.css +3 -0
  4. data/app/assets/stylesheets/decidim/direct_verifications/authorizations.scss +17 -0
  5. data/app/commands/decidim/direct_verifications/verification/create_import.rb +50 -0
  6. data/app/controllers/decidim/direct_verifications/verification/admin/authorizations_controller.rb +40 -0
  7. data/app/controllers/decidim/direct_verifications/verification/admin/direct_verifications_controller.rb +20 -18
  8. data/app/controllers/decidim/direct_verifications/verification/admin/imports_controller.rb +55 -0
  9. data/app/forms/decidim/direct_verifications/registration_form.rb +8 -0
  10. data/app/forms/decidim/direct_verifications/verification/create_import_form.rb +43 -0
  11. data/app/jobs/decidim/direct_verifications/authorize_users_job.rb +34 -0
  12. data/app/jobs/decidim/direct_verifications/base_import_job.rb +38 -0
  13. data/app/jobs/decidim/direct_verifications/register_users_job.rb +19 -0
  14. data/app/jobs/decidim/direct_verifications/revoke_users_job.rb +17 -0
  15. data/app/mailers/decidim/direct_verifications/import_mailer.rb +27 -0
  16. data/app/mailers/decidim/direct_verifications/stats.rb +23 -0
  17. data/app/views/decidim/direct_verifications/import_mailer/finished_processing.html.erb +7 -0
  18. data/app/views/decidim/direct_verifications/import_mailer/finished_processing.text.erb +7 -0
  19. data/app/views/decidim/direct_verifications/verification/admin/authorizations/index.html.erb +42 -0
  20. data/app/views/decidim/direct_verifications/verification/admin/direct_verifications/index.html.erb +2 -1
  21. data/app/views/decidim/direct_verifications/verification/admin/imports/new.html.erb +50 -0
  22. data/config/initializers/mail_previews.rb +5 -0
  23. data/config/locales/ca.yml +20 -20
  24. data/config/locales/cs.yml +69 -0
  25. data/config/locales/en.yml +29 -2
  26. data/config/locales/es.yml +20 -20
  27. data/config/locales/fr.yml +69 -0
  28. data/lib/decidim/direct_verifications.rb +24 -1
  29. data/lib/decidim/direct_verifications/authorize_user.rb +64 -0
  30. data/lib/decidim/direct_verifications/instrumenter.rb +58 -0
  31. data/lib/decidim/direct_verifications/parsers.rb +11 -0
  32. data/lib/decidim/direct_verifications/parsers/base_parser.rb +37 -0
  33. data/lib/decidim/direct_verifications/parsers/metadata_parser.rb +54 -0
  34. data/lib/decidim/direct_verifications/parsers/name_parser.rb +40 -0
  35. data/lib/decidim/direct_verifications/register_user.rb +54 -0
  36. data/lib/decidim/direct_verifications/revoke_user.rb +45 -0
  37. data/lib/decidim/direct_verifications/tests/factories.rb +11 -0
  38. data/lib/decidim/direct_verifications/tests/verification_controller_examples.rb +8 -3
  39. data/lib/decidim/direct_verifications/user_processor.rb +17 -101
  40. data/lib/decidim/direct_verifications/user_stats.rb +5 -5
  41. data/lib/decidim/direct_verifications/verification/admin_engine.rb +6 -1
  42. data/lib/decidim/direct_verifications/version.rb +3 -3
  43. metadata +37 -9
  44. data/lib/decidim/direct_verifications/config.rb +0 -23
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/core/test/factories"
4
+
5
+ FactoryBot.modify do
6
+ factory :authorization do
7
+ trait :direct_verification do
8
+ name { "direct_verifications" }
9
+ end
10
+ end
11
+ end
@@ -2,8 +2,9 @@
2
2
 
3
3
  shared_examples_for "checking users" do |params|
4
4
  context "when check without mails" do
5
+ before { params[:userslist] = "" }
6
+
5
7
  it "renders the index with info message" do
6
- params[:userslist] = ""
7
8
  perform_enqueued_jobs do
8
9
  post :create, params: params
9
10
  expect(flash[:info]).not_to be_empty
@@ -14,8 +15,9 @@ shared_examples_for "checking users" do |params|
14
15
  end
15
16
 
16
17
  context "when check with mails" do
18
+ before { params[:userslist] = "mail@example.com" }
19
+
17
20
  it "renders the index with info message" do
18
- params[:userslist] = "mail@example.com"
19
21
  perform_enqueued_jobs do
20
22
  post :create, params: params
21
23
  expect(flash[:info]).not_to be_empty
@@ -58,13 +60,16 @@ end
58
60
 
59
61
  shared_examples_for "revoking users" do |params|
60
62
  context "when there are valid emails" do
61
- it "creates notice message" do
63
+ before do
62
64
  create(
63
65
  :authorization,
64
66
  :granted,
65
67
  name: verification_type,
66
68
  user: authorized_user
67
69
  )
70
+ end
71
+
72
+ it "creates notice message" do
68
73
  perform_enqueued_jobs do
69
74
  post :create, params: params
70
75
  expect(flash[:notice]).not_to be_empty
@@ -1,131 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "decidim/direct_verifications/register_user"
4
+ require "decidim/direct_verifications/authorize_user"
5
+ require "decidim/direct_verifications/revoke_user"
6
+ require "decidim/direct_verifications/instrumenter"
7
+
3
8
  module Decidim
4
9
  module DirectVerifications
5
10
  class UserProcessor
6
- def initialize(organization, current_user, session)
11
+ def initialize(organization, current_user, session, instrumenter)
7
12
  @organization = organization
8
13
  @current_user = current_user
9
14
  @authorization_handler = :direct_verifications
10
- @errors = { registered: [], authorized: [], revoked: [] }
11
- @processed = { registered: [], authorized: [], revoked: [] }
15
+
12
16
  @emails = {}
13
17
  @session = session
18
+ @instrumenter = instrumenter
14
19
  end
15
20
 
16
- attr_reader :organization, :current_user, :session, :errors, :processed, :emails
17
- attr_accessor :authorization_handler
18
-
19
- def emails=(email_list)
20
- @emails = email_list.map { |k, v| [k.to_s.downcase, v.presence || k.split("@").first] }.to_h
21
- end
21
+ attr_reader :organization, :current_user, :session, :errors, :processed
22
+ attr_accessor :authorization_handler, :emails
22
23
 
23
24
  def register_users
24
- @emails.each do |email, name|
25
- next if find_user(email)
26
-
27
- form = register_form(email, name)
28
- begin
29
- InviteUser.call(form) do
30
- on(:ok) do
31
- add_processed :registered, email
32
- log_action find_user(email)
33
- end
34
- on(:invalid) do
35
- add_error :registered, email
36
- end
37
- end
38
- rescue StandardError
39
- add_error :registered, email
40
- end
25
+ emails.each do |email, data|
26
+ RegisterUser.new(email, data, organization, current_user, instrumenter).call
41
27
  end
42
28
  end
43
29
 
44
30
  def authorize_users
45
- @emails.each do |email, _name|
46
- if (u = find_user(email))
47
- auth = authorization(u)
48
- next unless !auth.granted? || auth.expired?
49
-
50
- Verification::ConfirmUserAuthorization.call(auth, authorize_form(u), session) do
51
- on(:ok) do
52
- add_processed :authorized, email
53
- end
54
- on(:invalid) do
55
- add_error :authorized, email
56
- end
57
- end
58
- else
59
- add_error :authorized, email
60
- end
31
+ emails.each do |email, data|
32
+ AuthorizeUser.new(email, data, session, organization, instrumenter, authorization_handler).call
61
33
  end
62
34
  end
63
35
 
64
36
  def revoke_users
65
- @emails.each do |email, _name|
66
- if (u = find_user(email))
67
- auth = authorization(u)
68
- next unless auth.granted?
69
-
70
- Verification::DestroyUserAuthorization.call(auth) do
71
- on(:ok) do
72
- add_processed :revoked, email
73
- end
74
- on(:invalid) do
75
- add_error :revoked, email
76
- end
77
- end
78
- else
79
- add_error :revoked, email
80
- end
37
+ emails.each do |email, _name|
38
+ RevokeUser.new(email, organization, instrumenter, authorization_handler).call
81
39
  end
82
40
  end
83
41
 
84
42
  private
85
43
 
86
- def find_user(email)
87
- User.find_by(email: email, decidim_organization_id: @organization.id)
88
- end
89
-
90
- def register_form(email, name)
91
- OpenStruct.new(name: name.presence || email.split("@").first,
92
- email: email.downcase,
93
- organization: organization,
94
- admin: false,
95
- invited_by: current_user,
96
- invitation_instructions: "direct_invite")
97
- end
98
-
99
- def authorization(user)
100
- Authorization.find_or_initialize_by(
101
- user: user,
102
- name: authorization_handler
103
- )
104
- end
105
-
106
- def authorize_form(user)
107
- Verification::DirectVerificationsForm.new(email: user.email, name: user.name)
108
- end
109
-
110
- def add_processed(type, email)
111
- @processed[type] << email unless @processed[type].include? email
112
- end
113
-
114
- def add_error(type, email)
115
- @errors[type] << email unless @errors[type].include? email
116
- end
117
-
118
- def log_action(user)
119
- Decidim.traceability.perform_action!(
120
- "invite",
121
- user,
122
- current_user,
123
- extra: {
124
- invited_user_role: "participant",
125
- invited_user_id: user.id
126
- }
127
- )
128
- end
44
+ attr_reader :instrumenter
129
45
  end
130
46
  end
131
47
  end
@@ -22,7 +22,7 @@ module Decidim
22
22
  end
23
23
 
24
24
  def unconfirmed
25
- registered_users.where("decidim_users.confirmed_at IS NULL").count
25
+ registered_users.where(decidim_users: { confirmed_at: nil }).count
26
26
  end
27
27
 
28
28
  def authorized
@@ -30,7 +30,7 @@ module Decidim
30
30
  end
31
31
 
32
32
  def authorized_unconfirmed
33
- authorized_users.where("decidim_users.confirmed_at IS NULL").count
33
+ authorized_users.where(decidim_users: { confirmed_at: nil }).count
34
34
  end
35
35
 
36
36
  private
@@ -41,10 +41,10 @@ module Decidim
41
41
  filter[:email] = emails unless emails.empty?
42
42
  return User.where(filter).where.not(email: "")
43
43
  end
44
- authorized_users(false)
44
+ authorized_users(strict: false)
45
45
  end
46
46
 
47
- def authorized_users(strict = true)
47
+ def authorized_users(strict: true)
48
48
  q = Decidim::Authorization.joins(:user)
49
49
  unless authorization_handler.empty?
50
50
  q = q.where(name: authorization_handler)
@@ -56,7 +56,7 @@ module Decidim
56
56
  q = q.where("decidim_users.decidim_organization_id=:org and decidim_users.email!=''", org: organization.id)
57
57
  return q if emails.empty?
58
58
 
59
- q.where("decidim_users.email IN (:emails)", emails: emails)
59
+ q.where(decidim_users: { email: emails })
60
60
  end
61
61
 
62
62
  def expires_in
@@ -10,12 +10,17 @@ module Decidim
10
10
  routes do
11
11
  resources :direct_verifications, only: [:index, :create, :stats]
12
12
  resources :stats, only: [:index]
13
+ resources :authorizations, only: [:index, :destroy]
14
+ resources :imports, only: [:new, :create]
13
15
 
14
16
  root to: "direct_verifications#index"
15
17
  end
16
18
 
17
19
  initializer "decidim_direct_verifications.admin_assets" do |app|
18
- app.config.assets.precompile += %w(direct_verifications_admin_manifest.js)
20
+ app.config.assets.precompile += %w(
21
+ direct_verifications_admin_manifest.js
22
+ direct_verifications_admin_manifest.css
23
+ )
19
24
  end
20
25
  end
21
26
  end
@@ -3,8 +3,8 @@
3
3
  module Decidim
4
4
  # This holds the decidim-direct_verifications version.
5
5
  module DirectVerifications
6
- VERSION = "0.22.1"
7
- DECIDIM_VERSION = "0.22"
8
- MIN_DECIDIM_VERSION = ">= 0.22.0"
6
+ VERSION = "1.0"
7
+ DECIDIM_VERSION = "0.24.3"
8
+ MIN_DECIDIM_VERSION = ">= 0.23.0"
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-direct_verifications
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.1
4
+ version: '1.0'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Vergés
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-12 00:00:00.000000000 Z
11
+ date: 2021-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: decidim-admin
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.22.0
19
+ version: 0.23.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.22.0
26
+ version: 0.23.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: decidim-core
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.22.0
33
+ version: 0.23.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.22.0
40
+ version: 0.23.0
41
41
  description: Provides a verification method that also registers users directly in
42
42
  the platform. Can be used to mass verificate user with other verification handlers
43
43
  email:
@@ -49,23 +49,51 @@ files:
49
49
  - LICENSE-AGPLv3.txt
50
50
  - README.md
51
51
  - Rakefile
52
+ - app/assets/config/direct_verifications_admin_manifest.css
52
53
  - app/assets/config/direct_verifications_admin_manifest.js
53
54
  - app/assets/javascripts/decidim/direct_verifications/verification/admin/direct_verifications_admin.js.es6
55
+ - app/assets/stylesheets/decidim/direct_verifications/authorizations.scss
54
56
  - app/commands/decidim/direct_verifications/verification/confirm_user_authorization.rb
57
+ - app/commands/decidim/direct_verifications/verification/create_import.rb
55
58
  - app/commands/decidim/direct_verifications/verification/destroy_user_authorization.rb
59
+ - app/controllers/decidim/direct_verifications/verification/admin/authorizations_controller.rb
56
60
  - app/controllers/decidim/direct_verifications/verification/admin/direct_verifications_controller.rb
61
+ - app/controllers/decidim/direct_verifications/verification/admin/imports_controller.rb
57
62
  - app/controllers/decidim/direct_verifications/verification/admin/stats_controller.rb
58
63
  - app/controllers/decidim/direct_verifications/verification/authorizations_controller.rb
64
+ - app/forms/decidim/direct_verifications/registration_form.rb
65
+ - app/forms/decidim/direct_verifications/verification/create_import_form.rb
59
66
  - app/forms/decidim/direct_verifications/verification/direct_verifications_form.rb
67
+ - app/jobs/decidim/direct_verifications/authorize_users_job.rb
68
+ - app/jobs/decidim/direct_verifications/base_import_job.rb
69
+ - app/jobs/decidim/direct_verifications/register_users_job.rb
70
+ - app/jobs/decidim/direct_verifications/revoke_users_job.rb
71
+ - app/mailers/decidim/direct_verifications/import_mailer.rb
72
+ - app/mailers/decidim/direct_verifications/stats.rb
73
+ - app/views/decidim/direct_verifications/import_mailer/finished_processing.html.erb
74
+ - app/views/decidim/direct_verifications/import_mailer/finished_processing.text.erb
75
+ - app/views/decidim/direct_verifications/verification/admin/authorizations/index.html.erb
60
76
  - app/views/decidim/direct_verifications/verification/admin/direct_verifications/index.html.erb
77
+ - app/views/decidim/direct_verifications/verification/admin/imports/new.html.erb
61
78
  - app/views/decidim/direct_verifications/verification/admin/stats/index.html.erb
62
79
  - app/views/devise/mailer/direct_invite.html.erb
63
80
  - app/views/devise/mailer/direct_invite.text.erb
81
+ - config/initializers/mail_previews.rb
64
82
  - config/locales/ca.yml
83
+ - config/locales/cs.yml
65
84
  - config/locales/en.yml
66
85
  - config/locales/es.yml
86
+ - config/locales/fr.yml
67
87
  - lib/decidim/direct_verifications.rb
68
- - lib/decidim/direct_verifications/config.rb
88
+ - lib/decidim/direct_verifications/authorize_user.rb
89
+ - lib/decidim/direct_verifications/instrumenter.rb
90
+ - lib/decidim/direct_verifications/parsers.rb
91
+ - lib/decidim/direct_verifications/parsers/base_parser.rb
92
+ - lib/decidim/direct_verifications/parsers/metadata_parser.rb
93
+ - lib/decidim/direct_verifications/parsers/name_parser.rb
94
+ - lib/decidim/direct_verifications/register_user.rb
95
+ - lib/decidim/direct_verifications/revoke_user.rb
96
+ - lib/decidim/direct_verifications/tests/factories.rb
69
97
  - lib/decidim/direct_verifications/tests/verification_controller_examples.rb
70
98
  - lib/decidim/direct_verifications/user_processor.rb
71
99
  - lib/decidim/direct_verifications/user_stats.rb
@@ -87,14 +115,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
115
  requirements:
88
116
  - - ">="
89
117
  - !ruby/object:Gem::Version
90
- version: '2.5'
118
+ version: '2.7'
91
119
  required_rubygems_version: !ruby/object:Gem::Requirement
92
120
  requirements:
93
121
  - - ">="
94
122
  - !ruby/object:Gem::Version
95
123
  version: '0'
96
124
  requirements: []
97
- rubygems_version: 3.0.3
125
+ rubygems_version: 3.1.4
98
126
  signing_key:
99
127
  specification_version: 4
100
128
  summary: A decidim batch direct registration and verification module
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module DirectVerifications
5
- class << self
6
- attr_accessor :config
7
- def configure
8
- yield self.config ||= Config.new
9
- end
10
- end
11
-
12
- class Config
13
- attr_reader :manage_workflows
14
- def manage_workflows=(manage_workflows)
15
- @manage_workflows.concat(manage_workflows).uniq!
16
- end
17
-
18
- def initialize
19
- @manage_workflows = ["direct_verifications"]
20
- end
21
- end
22
- end
23
- end