decidim-generators 0.22.0 → 0.23.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/Gemfile.lock +214 -201
- data/lib/decidim/generators/app_generator.rb +24 -2
- data/lib/decidim/generators/app_templates/budgets_initializer.rb +4 -0
- data/lib/decidim/generators/app_templates/budgets_workflow_random.en.yml +8 -0
- data/lib/decidim/generators/app_templates/budgets_workflow_random.rb +33 -0
- data/lib/decidim/generators/app_templates/bullet_initializer.rb +10 -0
- data/lib/decidim/generators/app_templates/dummy_authorization_handler.rb +53 -9
- data/lib/decidim/generators/app_templates/initializer.rb +100 -22
- data/lib/decidim/generators/app_templates/rack_profiler_initializer.rb +8 -0
- data/lib/decidim/generators/app_templates/secrets.yml.erb +7 -2
- data/lib/decidim/generators/app_templates/verifications_initializer.rb +4 -3
- data/lib/decidim/generators/component_templates/decidim-component.gemspec.erb +1 -1
- data/lib/decidim/generators/install_generator.rb +25 -0
- data/lib/decidim/generators/version.rb +1 -1
- metadata +14 -9
@@ -61,6 +61,10 @@ module Decidim
|
|
61
61
|
default: false,
|
62
62
|
desc: "Generate demo authorization handlers"
|
63
63
|
|
64
|
+
class_option :profiling, type: :boolean,
|
65
|
+
default: false,
|
66
|
+
desc: "Add the necessary gems to profile the app"
|
67
|
+
|
64
68
|
def database_yml
|
65
69
|
template "database.yml.erb", "config/database.yml", force: true
|
66
70
|
end
|
@@ -111,7 +115,7 @@ module Decidim
|
|
111
115
|
if current_gem == "decidim"
|
112
116
|
gsub_file "Gemfile", /gem "decidim-dev".*/, "gem \"decidim-dev\", #{gem_modifier}"
|
113
117
|
|
114
|
-
%w(conferences consultations elections initiatives).each do |component|
|
118
|
+
%w(conferences consultations elections initiatives templates).each do |component|
|
115
119
|
if options[:demo]
|
116
120
|
gsub_file "Gemfile", /gem "decidim-#{component}".*/, "gem \"decidim-#{component}\", #{gem_modifier}"
|
117
121
|
else
|
@@ -170,6 +174,15 @@ module Decidim
|
|
170
174
|
"config.sms_gateway_service = 'Decidim::Verifications::Sms::ExampleGateway'"
|
171
175
|
end
|
172
176
|
|
177
|
+
def budgets_workflows
|
178
|
+
return unless options[:demo]
|
179
|
+
|
180
|
+
copy_file "budgets_workflow_random.rb", "lib/budgets_workflow_random.rb"
|
181
|
+
copy_file "budgets_workflow_random.en.yml", "config/locales/budgets_workflow_random.en.yml"
|
182
|
+
|
183
|
+
copy_file "budgets_initializer.rb", "config/initializers/decidim_budgets.rb"
|
184
|
+
end
|
185
|
+
|
173
186
|
def timestamp_service
|
174
187
|
return unless options[:demo]
|
175
188
|
|
@@ -186,13 +199,22 @@ module Decidim
|
|
186
199
|
"config.pdf_signature_service = \"Decidim::Initiatives::PdfSignatureExample\""
|
187
200
|
end
|
188
201
|
|
202
|
+
def machine_translation_service
|
203
|
+
return unless options[:demo]
|
204
|
+
|
205
|
+
gsub_file "config/initializers/decidim.rb",
|
206
|
+
/# config.machine_translation_service = \"MyTranslationService\"/,
|
207
|
+
"config.machine_translation_service = 'Decidim::Dev::DummyTranslator'"
|
208
|
+
end
|
209
|
+
|
189
210
|
def install
|
190
211
|
Decidim::Generators::InstallGenerator.start(
|
191
212
|
[
|
192
213
|
"--recreate_db=#{options[:recreate_db]}",
|
193
214
|
"--seed_db=#{options[:seed_db]}",
|
194
215
|
"--skip_gemfile=#{options[:skip_gemfile]}",
|
195
|
-
"--app_name=#{app_name}"
|
216
|
+
"--app_name=#{app_name}",
|
217
|
+
"--profiling=#{options[:profiling]}"
|
196
218
|
]
|
197
219
|
)
|
198
220
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This Workflow allows users to vote only in one budget, selected randomly.
|
4
|
+
#
|
5
|
+
# Note: random selection should be deterministic for the same user and the same budgets component.
|
6
|
+
# As the budget resources list could change and affect the random selection, it also allows to finish orders created on other budgets.
|
7
|
+
class BudgetsWorkflowRandom < Decidim::Budgets::Workflows::Base
|
8
|
+
# Highlight the resource if the user didn't vote and is allowed to vote on it.
|
9
|
+
def highlighted?(resource)
|
10
|
+
vote_allowed?(resource)
|
11
|
+
end
|
12
|
+
|
13
|
+
# User can vote in the resource where they have an order in progress or in the randomly selected resource.
|
14
|
+
def vote_allowed?(resource, consider_progress = true)
|
15
|
+
return false if voted.any?
|
16
|
+
|
17
|
+
if consider_progress
|
18
|
+
progress?(resource) || (progress.none? && resource == random_resource)
|
19
|
+
else
|
20
|
+
resource == random_resource
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def discardable
|
25
|
+
[]
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def random_resource
|
31
|
+
@random_resource ||= budgets.reorder(id: :asc).to_a[user.id % budgets.count] if user
|
32
|
+
end
|
33
|
+
end
|
@@ -23,9 +23,11 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
23
23
|
# Define the attributes you need for this authorization handler. Attributes
|
24
24
|
# are defined using Virtus.
|
25
25
|
#
|
26
|
+
attribute :name_and_surname, String
|
26
27
|
attribute :document_number, String
|
27
28
|
attribute :postal_code, String
|
28
29
|
attribute :birthday, Decidim::Attributes::LocalizedDate
|
30
|
+
attribute :scope_id, Integer
|
29
31
|
|
30
32
|
# You can (and should) also define validations on each attribute:
|
31
33
|
#
|
@@ -34,6 +36,7 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
34
36
|
# You can also define custom validations:
|
35
37
|
#
|
36
38
|
validate :valid_document_number
|
39
|
+
validate :valid_scope_id
|
37
40
|
|
38
41
|
# The only method that needs to be implemented for an authorization handler.
|
39
42
|
# Here you can add your business logic to check if the authorization should
|
@@ -53,6 +56,12 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
53
56
|
document_number
|
54
57
|
end
|
55
58
|
|
59
|
+
# The user scope
|
60
|
+
#
|
61
|
+
def scope
|
62
|
+
user.organization.scopes.find_by(id: scope_id) if scope_id
|
63
|
+
end
|
64
|
+
|
56
65
|
# If you need to store any of the defined attributes in the authorization you
|
57
66
|
# can do it here.
|
58
67
|
#
|
@@ -60,7 +69,7 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
60
69
|
# it's created, and available though authorization.metadata
|
61
70
|
#
|
62
71
|
def metadata
|
63
|
-
super.merge(document_number: document_number, postal_code: postal_code)
|
72
|
+
super.merge(document_number: document_number, postal_code: postal_code, scope_id: scope_id)
|
64
73
|
end
|
65
74
|
|
66
75
|
private
|
@@ -69,19 +78,25 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
69
78
|
errors.add(:document_number, :invalid) unless document_number.to_s.end_with?("X")
|
70
79
|
end
|
71
80
|
|
81
|
+
def valid_scope_id
|
82
|
+
errors.add(:scope_id, :invalid) if scope_id && !scope
|
83
|
+
end
|
84
|
+
|
72
85
|
# If you need custom authorization logic, you can implement your own action
|
73
86
|
# authorizer. In this case, it allows to set a list of valid postal codes for
|
74
87
|
# an authorization.
|
75
88
|
class DummyActionAuthorizer < Decidim::Verifications::DefaultActionAuthorizer
|
76
|
-
attr_reader :allowed_postal_codes
|
89
|
+
attr_reader :allowed_postal_codes, :allowed_scope_id
|
77
90
|
|
78
91
|
# Overrides the parent class method, but it still uses it to keep the base behavior
|
79
92
|
def authorize
|
80
93
|
# Remove the additional setting from the options hash to avoid to be considered missing.
|
81
|
-
@allowed_postal_codes ||= options.delete("allowed_postal_codes")
|
94
|
+
@allowed_postal_codes ||= options.delete("allowed_postal_codes")&.split(/[\W,;]+/)
|
95
|
+
@allowed_scope_id ||= options.delete("allowed_scope_id")&.to_i
|
82
96
|
|
83
97
|
status_code, data = *super
|
84
98
|
|
99
|
+
extra_explanations = []
|
85
100
|
if allowed_postal_codes.present?
|
86
101
|
# Does not authorize users with different postal codes
|
87
102
|
if status_code == :ok && !allowed_postal_codes.member?(authorization.metadata["postal_code"])
|
@@ -90,18 +105,47 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
90
105
|
end
|
91
106
|
|
92
107
|
# Adds an extra message for inform the user the additional restriction for this authorization
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
108
|
+
extra_explanations << { key: "extra_explanation.postal_codes",
|
109
|
+
params: { scope: "decidim.verifications.dummy_authorization",
|
110
|
+
count: allowed_postal_codes.count,
|
111
|
+
postal_codes: allowed_postal_codes.join(", ") } }
|
112
|
+
end
|
113
|
+
|
114
|
+
if allowed_scope.present?
|
115
|
+
# Does not authorize users with different scope
|
116
|
+
if status_code == :ok && allowed_scope_id != user_scope_id
|
117
|
+
status_code = :unauthorized
|
118
|
+
data[:fields] = { "scope_id" => user_scope.name[I18n.locale.to_s] }
|
119
|
+
end
|
120
|
+
|
121
|
+
# Adds an extra message to inform the user about additional restrictions for this authorization
|
122
|
+
extra_explanations << { key: "extra_explanation.scope",
|
123
|
+
params: { scope: "decidim.verifications.dummy_authorization",
|
124
|
+
scope_name: allowed_scope.name[I18n.locale.to_s] } }
|
97
125
|
end
|
98
126
|
|
127
|
+
data[:extra_explanation] = extra_explanations if extra_explanations.any?
|
128
|
+
|
99
129
|
[status_code, data]
|
100
130
|
end
|
101
131
|
|
102
|
-
# Adds the list of allowed postal codes to the redirect URL, to allow forms to inform about it
|
132
|
+
# Adds the list of allowed postal codes and scope to the redirect URL, to allow forms to inform about it
|
103
133
|
def redirect_params
|
104
|
-
{ "postal_codes" => allowed_postal_codes&.join("
|
134
|
+
{ "postal_codes" => allowed_postal_codes&.join(","), "scope" => allowed_scope_id }
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
def allowed_scope
|
140
|
+
@allowed_scope ||= Decidim::Scope.find(allowed_scope_id) if allowed_scope_id
|
141
|
+
end
|
142
|
+
|
143
|
+
def user_scope
|
144
|
+
@user_scope ||= Decidim::Scope.find(user_scope_id) if user_scope_id
|
145
|
+
end
|
146
|
+
|
147
|
+
def user_scope_id
|
148
|
+
@user_scope_id ||= authorization.metadata["scope_id"]&.to_i
|
105
149
|
end
|
106
150
|
end
|
107
151
|
end
|
@@ -5,7 +5,7 @@ Decidim.configure do |config|
|
|
5
5
|
config.application_name = "My Application Name"
|
6
6
|
|
7
7
|
# The email that will be used as sender in all emails from Decidim
|
8
|
-
config.mailer_sender = "change-me@
|
8
|
+
config.mailer_sender = "change-me@example.org"
|
9
9
|
|
10
10
|
# Sets the list of available locales for the whole application.
|
11
11
|
#
|
@@ -14,16 +14,16 @@ Decidim.configure do |config|
|
|
14
14
|
# of languages will be equal or a subset of the list in this file.
|
15
15
|
config.available_locales = [:en, :ca, :es]
|
16
16
|
|
17
|
-
# Restrict access to the system part with an authorized ip list.
|
18
|
-
# You can use a single ip like ("1.2.3.4"), or an ip subnet like ("1.2.3.4/24")
|
19
|
-
# You may specify multiple ip in an array ["1.2.3.4", "1.2.3.4/24"]
|
20
|
-
# config.system_accesslist_ips = ["127.0.0.1"]
|
21
|
-
|
22
17
|
# Sets the default locale for new organizations. When creating a new
|
23
18
|
# organization from the System area, system admins will be able to overwrite
|
24
19
|
# this value for that specific organization.
|
25
20
|
config.default_locale = :en
|
26
21
|
|
22
|
+
# Restrict access to the system part with an authorized ip list.
|
23
|
+
# You can use a single ip like ("1.2.3.4"), or an ip subnet like ("1.2.3.4/24")
|
24
|
+
# You may specify multiple ip in an array ["1.2.3.4", "1.2.3.4/24"]
|
25
|
+
# config.system_accesslist_ips = ["127.0.0.1"]
|
26
|
+
|
27
27
|
# Defines a list of custom content processors. They are used to parse and
|
28
28
|
# render specific tags inside some user-provided content. Check the docs for
|
29
29
|
# more info.
|
@@ -32,10 +32,71 @@ Decidim.configure do |config|
|
|
32
32
|
# Whether SSL should be enabled or not.
|
33
33
|
# config.force_ssl = true
|
34
34
|
|
35
|
-
# Geocoder configuration
|
35
|
+
# Map and Geocoder configuration
|
36
|
+
#
|
37
|
+
# == HERE Maps ==
|
38
|
+
# config.maps = {
|
39
|
+
# provider: :here,
|
40
|
+
# api_key: Rails.application.secrets.maps[:api_key],
|
41
|
+
# static: { url: "https://image.maps.ls.hereapi.com/mia/1.6/mapview" }
|
42
|
+
# }
|
43
|
+
#
|
44
|
+
# == OpenStreetMap (OSM) services ==
|
45
|
+
# To use the OSM map service providers, you will need a service provider for
|
46
|
+
# the following map servers or host all of them yourself:
|
47
|
+
# - A tile server for the dynamic maps
|
48
|
+
# (https://wiki.openstreetmap.org/wiki/Tile_servers)
|
49
|
+
# - A Nominatim geocoding server for the geocoding functionality
|
50
|
+
# (https://wiki.openstreetmap.org/wiki/Nominatim)
|
51
|
+
# - A static map server for static map images
|
52
|
+
# (https://github.com/jperelli/osm-static-maps)
|
53
|
+
#
|
54
|
+
# When used, please read carefully the terms of service for your service
|
55
|
+
# provider.
|
56
|
+
#
|
57
|
+
# config.maps = {
|
58
|
+
# provider: :osm,
|
59
|
+
# api_key: Rails.application.secrets.maps[:api_key],
|
60
|
+
# dynamic: {
|
61
|
+
# tile_layer: {
|
62
|
+
# url: "https://tiles.example.org/{z}/{x}/{y}.png?key={apiKey}&{foo}",
|
63
|
+
# api_key: true,
|
64
|
+
# foo: "bar=baz",
|
65
|
+
# attribution: %(
|
66
|
+
# <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap</a> contributors
|
67
|
+
# ).strip
|
68
|
+
# # Translatable attribution:
|
69
|
+
# # attribution: -> { I18n.t("tile_layer_attribution") }
|
70
|
+
# }
|
71
|
+
# },
|
72
|
+
# static: { url: "https://staticmap.example.org/" },
|
73
|
+
# geocoding: { host: "nominatim.example.org", use_https: true }
|
74
|
+
# }
|
75
|
+
#
|
76
|
+
# == Combination (OpenStreetMap default + HERE Maps dynamic map tiles) ==
|
77
|
+
# config.maps = {
|
78
|
+
# provider: :osm,
|
79
|
+
# api_key: Rails.application.secrets.maps[:api_key],
|
80
|
+
# dynamic: {
|
81
|
+
# provider: :here,
|
82
|
+
# api_key: Rails.application.secrets.maps[:here_api_key]
|
83
|
+
# },
|
84
|
+
# static: { url: "https://staticmap.example.org/" },
|
85
|
+
# geocoding: { host: "nominatim.example.org", use_https: true }
|
86
|
+
# }
|
87
|
+
|
88
|
+
# Geocoder configurations if you want to customize the default geocoding
|
89
|
+
# settings. The maps configuration will manage which geocoding service to use,
|
90
|
+
# so that does not need any additional configuration here. Use this only for
|
91
|
+
# the global geocoder preferences.
|
36
92
|
# config.geocoder = {
|
37
|
-
#
|
38
|
-
#
|
93
|
+
# # geocoding service request timeout, in seconds (default 3):
|
94
|
+
# timeout: 5,
|
95
|
+
# # set default units to kilometers:
|
96
|
+
# units: :km,
|
97
|
+
# # caching (see https://github.com/alexreisner/geocoder#caching for details):
|
98
|
+
# cache: Redis.new,
|
99
|
+
# cache_prefix: "..."
|
39
100
|
# }
|
40
101
|
|
41
102
|
# Custom resource reference generator method. Check the docs for more info.
|
@@ -51,12 +112,6 @@ Decidim.configure do |config|
|
|
51
112
|
# processed by Decidim, this value helps reduce the size of the files.
|
52
113
|
# config.image_uploader_quality = 80
|
53
114
|
|
54
|
-
# The maximum file size of an attachment
|
55
|
-
# config.maximum_attachment_size = 10.megabytes
|
56
|
-
|
57
|
-
# The maximum file size for a user avatar
|
58
|
-
# config.maximum_avatar_size = 10.megabytes
|
59
|
-
|
60
115
|
# The number of reports which a resource can receive before hiding it
|
61
116
|
# config.max_reports_before_hiding = 3
|
62
117
|
|
@@ -90,13 +145,6 @@ Decidim.configure do |config|
|
|
90
145
|
# Time window were users can access the website even if their email is not confirmed.
|
91
146
|
# config.unconfirmed_access_for = 2.days
|
92
147
|
|
93
|
-
# Etherpad configuration. Check the docs for more info.
|
94
|
-
# config.etherpad = {
|
95
|
-
# server: <your url>,
|
96
|
-
# api_key: <your key>,
|
97
|
-
# api_version: <your version>
|
98
|
-
# }
|
99
|
-
|
100
148
|
# A base path for the uploads. If set, make sure it ends in a slash.
|
101
149
|
# Uploads will be set to `<base_path>/uploads/`. This can be useful if you
|
102
150
|
# want to use the same uploads place for both staging and production
|
@@ -200,6 +248,36 @@ Decidim.configure do |config|
|
|
200
248
|
# radio buttons collection input field form for a Decidim::Component
|
201
249
|
# step setting :amendments_visibility.
|
202
250
|
# config.amendments_visibility_options = %w(all participants)
|
251
|
+
|
252
|
+
# Machine Translation Configuration
|
253
|
+
#
|
254
|
+
# Enable machine translations
|
255
|
+
config.enable_machine_translations = false
|
256
|
+
#
|
257
|
+
# If you want to enable machine translation you can create your own service
|
258
|
+
# to interact with third party service to translate the user content.
|
259
|
+
#
|
260
|
+
# An example class would be something like:
|
261
|
+
#
|
262
|
+
# class MyTranslationService
|
263
|
+
# attr_reader :text, :original_locale, :target_locale
|
264
|
+
#
|
265
|
+
# def initialize(text, original_locale, target_locale)
|
266
|
+
# @text = text
|
267
|
+
# @original_locale = original_locale
|
268
|
+
# @target_locale = target_locale
|
269
|
+
# end
|
270
|
+
#
|
271
|
+
# def translate
|
272
|
+
# # Actual code to translate the text
|
273
|
+
# end
|
274
|
+
# end
|
275
|
+
#
|
276
|
+
# config.machine_translation_service = "MyTranslationService"
|
277
|
+
|
278
|
+
# Defines the name of the cookie used to check if the user allows Decidim to
|
279
|
+
# set cookies.
|
280
|
+
# config.consent_cookie_name = "decidim-cc"
|
203
281
|
end
|
204
282
|
|
205
283
|
Rails.application.config.i18n.available_locales = Decidim.available_locales
|
@@ -26,12 +26,17 @@ default: &default
|
|
26
26
|
icon_path: decidim/brands/google.svg
|
27
27
|
client_id: <%%= ENV["OMNIAUTH_GOOGLE_CLIENT_ID"] %>
|
28
28
|
client_secret: <%%= ENV["OMNIAUTH_GOOGLE_CLIENT_SECRET"] %>
|
29
|
-
|
30
|
-
|
29
|
+
maps:
|
30
|
+
api_key: <%%= ENV["MAPS_API_KEY"] %>
|
31
31
|
etherpad:
|
32
32
|
server: <%%= ENV["ETHERPAD_SERVER"] %>
|
33
33
|
api_key: <%%= ENV["ETHERPAD_API_KEY"] %>
|
34
34
|
api_version: "1.2.1"
|
35
|
+
bulletin_board:
|
36
|
+
identification_private_key: |
|
37
|
+
<%= ENV["BULLETIN_BOARD_IDENTIFICATION_PRIVATE_KEY"]&.indent(6) %>
|
38
|
+
server: <%= ENV["BULLETIN_BOARD_SERVER"] %>
|
39
|
+
api_key: <%= ENV["BULLETIN_BOARD_API_KEY"] %>
|
35
40
|
|
36
41
|
development:
|
37
42
|
<<: *default
|
@@ -3,18 +3,19 @@
|
|
3
3
|
Decidim::Verifications.register_workflow(:dummy_authorization_handler) do |workflow|
|
4
4
|
workflow.form = "DummyAuthorizationHandler"
|
5
5
|
workflow.action_authorizer = "DummyAuthorizationHandler::DummyActionAuthorizer"
|
6
|
-
workflow.expires_in = 1.
|
6
|
+
workflow.expires_in = 1.month
|
7
7
|
workflow.renewable = true
|
8
8
|
workflow.time_between_renewals = 5.minutes
|
9
9
|
|
10
10
|
workflow.options do |options|
|
11
|
-
options.attribute :
|
11
|
+
options.attribute :allowed_postal_codes, type: :string, default: "08001", required: false
|
12
|
+
options.attribute :allowed_scope_id, type: :scope, required: false
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
15
16
|
Decidim::Verifications.register_workflow(:another_dummy_authorization_handler) do |workflow|
|
16
17
|
workflow.form = "AnotherDummyAuthorizationHandler"
|
17
|
-
workflow.expires_in = 1.
|
18
|
+
workflow.expires_in = 1.month
|
18
19
|
|
19
20
|
workflow.options do |options|
|
20
21
|
options.attribute :passport_number, type: :string, required: false
|