decidim-direct_verifications 0.22.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +32 -3
- data/app/assets/config/direct_verifications_admin_manifest.css +3 -0
- data/app/assets/stylesheets/decidim/direct_verifications/authorizations.scss +17 -0
- data/app/commands/decidim/direct_verifications/verification/create_import.rb +61 -0
- data/app/controllers/decidim/direct_verifications/verification/admin/authorizations_controller.rb +42 -0
- data/app/controllers/decidim/direct_verifications/verification/admin/direct_verifications_controller.rb +20 -18
- data/app/controllers/decidim/direct_verifications/verification/admin/imports_controller.rb +55 -0
- data/app/forms/decidim/direct_verifications/registration_form.rb +8 -0
- data/app/forms/decidim/direct_verifications/verification/create_import_form.rb +43 -0
- data/app/jobs/decidim/direct_verifications/authorize_users_job.rb +36 -0
- data/app/jobs/decidim/direct_verifications/base_import_job.rb +58 -0
- data/app/jobs/decidim/direct_verifications/register_users_job.rb +20 -0
- data/app/jobs/decidim/direct_verifications/revoke_users_job.rb +18 -0
- data/app/mailers/decidim/direct_verifications/import_mailer.rb +27 -0
- data/app/mailers/decidim/direct_verifications/stats.rb +23 -0
- data/app/uploaders/decidim/direct_verifications/csv_uploader.rb +16 -0
- data/app/views/decidim/direct_verifications/import_mailer/finished_processing.html.erb +7 -0
- data/app/views/decidim/direct_verifications/import_mailer/finished_processing.text.erb +7 -0
- data/app/views/decidim/direct_verifications/verification/admin/authorizations/index.html.erb +43 -0
- data/app/views/decidim/direct_verifications/verification/admin/direct_verifications/index.html.erb +2 -1
- data/app/views/decidim/direct_verifications/verification/admin/imports/new.html.erb +50 -0
- data/config/initializers/mail_previews.rb +5 -0
- data/config/locales/ca.yml +47 -33
- data/config/locales/cs.yml +84 -0
- data/config/locales/en.yml +44 -13
- data/config/locales/es.yml +45 -31
- data/config/locales/fr.yml +84 -0
- data/lib/decidim/direct_verifications/authorize_user.rb +64 -0
- data/lib/decidim/direct_verifications/instrumenter.rb +58 -0
- data/lib/decidim/direct_verifications/parsers/base_parser.rb +37 -0
- data/lib/decidim/direct_verifications/parsers/metadata_parser.rb +48 -0
- data/lib/decidim/direct_verifications/parsers/name_parser.rb +40 -0
- data/lib/decidim/direct_verifications/parsers.rb +11 -0
- data/lib/decidim/direct_verifications/register_user.rb +54 -0
- data/lib/decidim/direct_verifications/revoke_user.rb +45 -0
- data/lib/decidim/direct_verifications/tests/factories.rb +11 -0
- data/lib/decidim/direct_verifications/tests/verification_controller_examples.rb +13 -8
- data/lib/decidim/direct_verifications/user_processor.rb +17 -101
- data/lib/decidim/direct_verifications/user_stats.rb +5 -5
- data/lib/decidim/direct_verifications/verification/admin_engine.rb +6 -1
- data/lib/decidim/direct_verifications/version.rb +3 -3
- data/lib/decidim/direct_verifications.rb +24 -1
- metadata +38 -9
- data/lib/decidim/direct_verifications/config.rb +0 -23
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DirectVerifications
|
5
|
+
class Instrumenter
|
6
|
+
def initialize(current_user)
|
7
|
+
@current_user = current_user
|
8
|
+
@errors = { registered: Set.new, authorized: Set.new, revoked: Set.new }
|
9
|
+
@processed = { registered: Set.new, authorized: Set.new, revoked: Set.new }
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_processed(type, email)
|
13
|
+
@processed[type] << email
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_error(type, email)
|
17
|
+
@errors[type] << email
|
18
|
+
end
|
19
|
+
|
20
|
+
def processed_count(key)
|
21
|
+
processed[key].size
|
22
|
+
end
|
23
|
+
|
24
|
+
def errors_count(key)
|
25
|
+
errors[key].size
|
26
|
+
end
|
27
|
+
|
28
|
+
def emails_count(key)
|
29
|
+
@processed[key].size + @errors[key].size
|
30
|
+
end
|
31
|
+
|
32
|
+
def track(event, email, user = nil)
|
33
|
+
if user
|
34
|
+
add_processed event, email
|
35
|
+
log_action user
|
36
|
+
else
|
37
|
+
add_error event, email
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
attr_reader :current_user, :processed, :errors
|
44
|
+
|
45
|
+
def log_action(user)
|
46
|
+
Decidim.traceability.perform_action!(
|
47
|
+
"invite",
|
48
|
+
user,
|
49
|
+
current_user,
|
50
|
+
extra: {
|
51
|
+
invited_user_role: "participant",
|
52
|
+
invited_user_id: user.id
|
53
|
+
}
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DirectVerifications
|
5
|
+
module Parsers
|
6
|
+
# Abstract class all concrete parsers should inherit from. They are expected to implement
|
7
|
+
# #header, #lines, and #parse_data methods.
|
8
|
+
class BaseParser
|
9
|
+
EMAIL_REGEXP = /([A-Z0-9+._-]+@[A-Z0-9._-]+\.[A-Z0-9_-]+)\b/i.freeze
|
10
|
+
|
11
|
+
def initialize(txt)
|
12
|
+
@txt = txt
|
13
|
+
@emails = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_h
|
17
|
+
lines.each do |line|
|
18
|
+
EMAIL_REGEXP.match(line) do |match|
|
19
|
+
email = normalize(match[0])
|
20
|
+
emails[email] = parse_data(email, line, header)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
emails
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :txt, :emails
|
30
|
+
|
31
|
+
def normalize(value)
|
32
|
+
value.to_s.downcase
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "csv"
|
4
|
+
|
5
|
+
module Decidim
|
6
|
+
module DirectVerifications
|
7
|
+
module Parsers
|
8
|
+
class MetadataParser < BaseParser
|
9
|
+
I18N_SCOPE = "decidim.direct_verifications.verification.admin.direct_verifications"
|
10
|
+
|
11
|
+
def header
|
12
|
+
@header ||= begin
|
13
|
+
raise InputParserError, I18n.t("#{I18N_SCOPE}.create.missing_header") if lines.count <= 1
|
14
|
+
|
15
|
+
tokenize(lines[0].chomp).map { |h| h.to_s.downcase }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def lines
|
20
|
+
@lines ||= StringIO.new(txt).readlines
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse_data(email, line, header)
|
24
|
+
tokens = tokenize(line)
|
25
|
+
|
26
|
+
hash = {}
|
27
|
+
header.each_with_index do |column, index|
|
28
|
+
next if column.blank?
|
29
|
+
|
30
|
+
value = tokens[index]
|
31
|
+
next if value&.include?(email)
|
32
|
+
|
33
|
+
hash[column] = value
|
34
|
+
end
|
35
|
+
hash
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def tokenize(line)
|
41
|
+
CSV.parse_line(line).map do |token|
|
42
|
+
token&.strip
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DirectVerifications
|
5
|
+
module Parsers
|
6
|
+
class NameParser < BaseParser
|
7
|
+
LINE_DELIMITER = /[\r\n;,]/.freeze
|
8
|
+
NON_ALPHA_CHARS = /[^[:print:]]|["$<>|\\]/.freeze
|
9
|
+
|
10
|
+
def header
|
11
|
+
nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def lines
|
15
|
+
txt.split(LINE_DELIMITER)
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse_data(email, line, _header)
|
19
|
+
name = parse_name(email, line)
|
20
|
+
name = strip_non_alpha_chars(name)
|
21
|
+
name.presence || fallback_name(email)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def strip_non_alpha_chars(str)
|
27
|
+
(str.presence || "").gsub(NON_ALPHA_CHARS, "").strip
|
28
|
+
end
|
29
|
+
|
30
|
+
def parse_name(email, line)
|
31
|
+
line.split(email).first
|
32
|
+
end
|
33
|
+
|
34
|
+
def fallback_name(email)
|
35
|
+
email.split("@").first
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DirectVerifications
|
5
|
+
module Parsers
|
6
|
+
autoload :BaseParser, "decidim/direct_verifications/parsers/base_parser"
|
7
|
+
autoload :NameParser, "decidim/direct_verifications/parsers/name_parser"
|
8
|
+
autoload :MetadataParser, "decidim/direct_verifications/parsers/metadata_parser"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DirectVerifications
|
5
|
+
class RegisterUser
|
6
|
+
def initialize(email, data, organization, current_user, instrumenter)
|
7
|
+
@email = email
|
8
|
+
@name = data.is_a?(Hash) ? data[:name] : data
|
9
|
+
@organization = organization
|
10
|
+
@current_user = current_user
|
11
|
+
@instrumenter = instrumenter
|
12
|
+
end
|
13
|
+
|
14
|
+
def call
|
15
|
+
return if user
|
16
|
+
|
17
|
+
InviteUser.call(form) do
|
18
|
+
on(:ok) do
|
19
|
+
instrumenter.track(:registered, email, user)
|
20
|
+
end
|
21
|
+
on(:invalid) do
|
22
|
+
instrumenter.track(:registered, email)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
rescue StandardError => e
|
26
|
+
instrumenter.track(:registered, email)
|
27
|
+
raise e if Rails.env.test? || Rails.env.development?
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :email, :name, :organization, :current_user, :instrumenter
|
33
|
+
|
34
|
+
def user
|
35
|
+
@user ||= User.find_by(email: email, decidim_organization_id: organization.id)
|
36
|
+
end
|
37
|
+
|
38
|
+
def form
|
39
|
+
RegistrationForm.new(
|
40
|
+
name: name.presence || fallback_name,
|
41
|
+
email: email.downcase,
|
42
|
+
organization: organization,
|
43
|
+
admin: false,
|
44
|
+
invited_by: current_user,
|
45
|
+
invitation_instructions: "direct_invite"
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def fallback_name
|
50
|
+
email.split("@").first
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DirectVerifications
|
5
|
+
class RevokeUser
|
6
|
+
def initialize(email, organization, instrumenter, authorization_handler)
|
7
|
+
@email = email
|
8
|
+
@organization = organization
|
9
|
+
@instrumenter = instrumenter
|
10
|
+
@authorization_handler = authorization_handler
|
11
|
+
end
|
12
|
+
|
13
|
+
def call
|
14
|
+
unless user
|
15
|
+
instrumenter.add_error :revoked, email
|
16
|
+
return
|
17
|
+
end
|
18
|
+
|
19
|
+
return unless valid_authorization?
|
20
|
+
|
21
|
+
Verification::DestroyUserAuthorization.call(authorization) do
|
22
|
+
on(:ok) do
|
23
|
+
instrumenter.add_processed :revoked, email
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :email, :organization, :instrumenter, :authorization_handler
|
31
|
+
|
32
|
+
def user
|
33
|
+
@user ||= User.find_by(email: email, decidim_organization_id: organization.id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def authorization
|
37
|
+
@authorization ||= Authorization.find_by(user: user, name: authorization_handler)
|
38
|
+
end
|
39
|
+
|
40
|
+
def valid_authorization?
|
41
|
+
authorization&.granted?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -2,24 +2,26 @@
|
|
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
|
10
|
-
expect(flash[:info]).to include("0
|
11
|
+
expect(flash[:info]).to include("0 participants detected")
|
11
12
|
expect(subject).to render_template("decidim/direct_verifications/verification/admin/direct_verifications/index")
|
12
13
|
end
|
13
14
|
end
|
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
|
22
|
-
expect(flash[:info]).to include("1
|
24
|
+
expect(flash[:info]).to include("1 participants detected")
|
23
25
|
expect(subject).to render_template("decidim/direct_verifications/verification/admin/direct_verifications/index")
|
24
26
|
end
|
25
27
|
end
|
@@ -34,7 +36,7 @@ shared_examples_for "registering users" do |params|
|
|
34
36
|
expect(flash[:warning]).not_to be_empty
|
35
37
|
expect(flash[:warning]).to include("1 detected")
|
36
38
|
expect(flash[:warning]).to include("0 errors")
|
37
|
-
expect(flash[:warning]).to include("1
|
39
|
+
expect(flash[:warning]).to include("1 participants")
|
38
40
|
expect(flash[:warning]).to include("registered")
|
39
41
|
end
|
40
42
|
end
|
@@ -49,7 +51,7 @@ shared_examples_for "authorizing users" do |params|
|
|
49
51
|
expect(flash[:notice]).not_to be_empty
|
50
52
|
expect(flash[:notice]).to include("1 detected")
|
51
53
|
expect(flash[:notice]).to include("0 errors")
|
52
|
-
expect(flash[:notice]).to include("1
|
54
|
+
expect(flash[:notice]).to include("1 participants")
|
53
55
|
expect(flash[:notice]).to include("verified")
|
54
56
|
end
|
55
57
|
end
|
@@ -58,19 +60,22 @@ end
|
|
58
60
|
|
59
61
|
shared_examples_for "revoking users" do |params|
|
60
62
|
context "when there are valid emails" do
|
61
|
-
|
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
|
71
76
|
expect(flash[:notice]).to include("1 detected")
|
72
77
|
expect(flash[:notice]).to include("0 errors")
|
73
|
-
expect(flash[:notice]).to include("1
|
78
|
+
expect(flash[:notice]).to include("1 participants")
|
74
79
|
expect(flash[:notice]).to include("revoked")
|
75
80
|
end
|
76
81
|
end
|
@@ -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
|
-
|
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
|
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
|
-
|
25
|
-
|
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
|
-
|
46
|
-
|
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
|
-
|
66
|
-
|
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
|
-
|
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(
|
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(
|
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
|
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(
|
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(
|
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.
|
7
|
-
DECIDIM_VERSION = "0.
|
8
|
-
MIN_DECIDIM_VERSION = ">= 0.
|
6
|
+
VERSION = "1.0.2"
|
7
|
+
DECIDIM_VERSION = "0.24.3"
|
8
|
+
MIN_DECIDIM_VERSION = ">= 0.23.0"
|
9
9
|
end
|
10
10
|
end
|
@@ -1,12 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "direct_verifications/version"
|
4
|
-
require_relative "direct_verifications/config"
|
5
4
|
require_relative "direct_verifications/user_processor"
|
6
5
|
require_relative "direct_verifications/user_stats"
|
7
6
|
require_relative "direct_verifications/verification"
|
7
|
+
require_relative "direct_verifications/parsers"
|
8
8
|
|
9
9
|
module Decidim
|
10
10
|
module DirectVerifications
|
11
|
+
include ActiveSupport::Configurable
|
12
|
+
|
13
|
+
class InputParserError < StandardError; end
|
14
|
+
|
15
|
+
# Specify in this variable which authorization methods can be managed by the plugin
|
16
|
+
# Be careful to specify only what you really need
|
17
|
+
config_accessor :manage_workflows do
|
18
|
+
["direct_verifications"]
|
19
|
+
end
|
20
|
+
|
21
|
+
# The processor for the user uploaded data where to extract emails and other info
|
22
|
+
# be default it uses Decidim::DirectVerifications::Parsers::NameParser
|
23
|
+
# Currently available are:
|
24
|
+
# - :name_parser
|
25
|
+
# - :metadata_parser
|
26
|
+
# A custom parser can be specified as long it respects the module hierachy
|
27
|
+
config_accessor :input_parser do
|
28
|
+
:name_parser
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.find_parser_class(manifest)
|
32
|
+
"Decidim::DirectVerifications::Parsers::#{manifest.to_s.camelize}".safe_constantize || Decidim::DirectVerifications::Parsers::NameParser
|
33
|
+
end
|
11
34
|
end
|
12
35
|
end
|