decidim-generators 0.27.4 → 0.28.0.rc4
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 +6 -5
- data/Gemfile.lock +372 -407
- data/README.md +2 -2
- data/lib/decidim/generators/app_generator.rb +83 -24
- data/lib/decidim/generators/app_templates/.node-version +1 -0
- data/lib/decidim/generators/app_templates/.rubocop.yml +2 -0
- data/lib/decidim/generators/app_templates/.ruby-version +1 -0
- data/lib/decidim/generators/app_templates/README.md.erb +7 -12
- data/lib/decidim/generators/app_templates/another_dummy_authorization_handler.rb +1 -1
- data/lib/decidim/generators/app_templates/budgets_workflow_random.rb +1 -1
- data/lib/decidim/generators/app_templates/bullet_initializer.rb +1 -1
- data/lib/decidim/generators/app_templates/config/boot.rb.tt +16 -0
- data/lib/decidim/generators/app_templates/database.yml.erb +1 -1
- data/lib/decidim/generators/app_templates/decidim_application.scss +2 -1
- data/lib/decidim/generators/app_templates/dummy_authorization_handler.rb +5 -5
- data/lib/decidim/generators/app_templates/initializer.rb +19 -8
- data/lib/decidim/generators/app_templates/rack_profiler_initializer.rb +2 -1
- data/lib/decidim/generators/app_templates/secrets.yml.erb +14 -8
- data/lib/decidim/generators/component_generator.rb +44 -2
- data/lib/decidim/generators/component_templates/.eslintrc.json +3 -0
- data/lib/decidim/generators/component_templates/.node-version +1 -0
- data/lib/decidim/generators/component_templates/.rubocop.yml +2 -0
- data/lib/decidim/generators/component_templates/.ruby-version +1 -0
- data/lib/decidim/generators/component_templates/.stylelintrc.json +3 -0
- data/lib/decidim/generators/component_templates/README.md.erb +7 -1
- data/lib/decidim/generators/component_templates/app/controllers/decidim/component/admin/application_controller.rb.erb +11 -0
- data/lib/decidim/generators/component_templates/app/permissions/decidim/component/admin/permissions.rb.erb +23 -0
- data/lib/decidim/generators/component_templates/decidim-component.gemspec.erb +9 -2
- data/lib/decidim/generators/component_templates/github/ci.yml.erb +77 -0
- data/lib/decidim/generators/component_templates/gitignore +5 -0
- data/lib/decidim/generators/component_templates/lib/decidim/component/test/factories.rb.erb +1 -0
- data/lib/decidim/generators/component_templates/package.json.erb +21 -0
- data/lib/decidim/generators/component_templates/spec/lib/version_spec.rb.erb +13 -0
- data/lib/decidim/generators/component_templates/spec/permissions/admin/permissions_spec.rb.erb +40 -0
- data/lib/decidim/generators/install_generator.rb +12 -7
- data/lib/decidim/generators/test/generator_examples.rb +72 -40
- data/lib/decidim/generators/version.rb +1 -1
- metadata +29 -13
- data/lib/decidim/generators/app_templates/_decidim-settings.scss +0 -7
- data/lib/decidim/generators/app_templates/social_share_button.rb +0 -8
- data/lib/decidim/generators/component_templates/circleci/config.yml +0 -47
data/README.md
CHANGED
|
@@ -28,14 +28,14 @@ require in your final decidim application in order to use it. To do that, you
|
|
|
28
28
|
need to include the plugin in your application's `Gemfile`.
|
|
29
29
|
|
|
30
30
|
For example, if you generated your component at
|
|
31
|
-
`~/decidim-module-experimental_component`, you
|
|
31
|
+
`~/decidim-module-experimental_component`, you will need to edit your `Gemfile` like
|
|
32
32
|
this in order for the component to be used:
|
|
33
33
|
|
|
34
34
|
```ruby
|
|
35
35
|
gem "decidim-experimental_plugin", path: "~/decidim-module-experimental_plugin"
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
Once you do that, and boot your application, you
|
|
38
|
+
Once you do that, and boot your application, you will see the new component being
|
|
39
39
|
offered in the "New component" selector on the "Components" section of any
|
|
40
40
|
participatory space in the admin dashboard.
|
|
41
41
|
|
|
@@ -55,11 +55,11 @@ module Decidim
|
|
|
55
55
|
|
|
56
56
|
class_option :skip_bundle, type: :boolean,
|
|
57
57
|
default: true, # this is to avoid installing gems in this step yet (done by InstallGenerator)
|
|
58
|
-
desc: "
|
|
58
|
+
desc: "Do not run bundle install"
|
|
59
59
|
|
|
60
60
|
class_option :skip_gemfile, type: :boolean,
|
|
61
61
|
default: false,
|
|
62
|
-
desc: "
|
|
62
|
+
desc: "Do not generate a Gemfile for the application"
|
|
63
63
|
|
|
64
64
|
class_option :demo, type: :boolean,
|
|
65
65
|
default: false,
|
|
@@ -71,7 +71,7 @@ module Decidim
|
|
|
71
71
|
|
|
72
72
|
class_option :force_ssl, type: :string,
|
|
73
73
|
default: "true",
|
|
74
|
-
desc: "
|
|
74
|
+
desc: "Does not force to use ssl"
|
|
75
75
|
|
|
76
76
|
class_option :locales, type: :string,
|
|
77
77
|
default: "",
|
|
@@ -87,11 +87,16 @@ module Decidim
|
|
|
87
87
|
|
|
88
88
|
class_option :skip_webpack_install, type: :boolean,
|
|
89
89
|
default: true,
|
|
90
|
-
desc: "
|
|
90
|
+
desc: "Do not run Webpack install"
|
|
91
91
|
|
|
92
92
|
class_option :dev_ssl, type: :boolean,
|
|
93
93
|
default: false,
|
|
94
|
-
desc: "
|
|
94
|
+
desc: "Do not add Puma development SSL configuration options"
|
|
95
|
+
|
|
96
|
+
# we disable the webpacker installation as we will use shakapacker
|
|
97
|
+
def webpacker_gemfile_entry
|
|
98
|
+
[]
|
|
99
|
+
end
|
|
95
100
|
|
|
96
101
|
def database_yml
|
|
97
102
|
template "database.yml.erb", "config/database.yml", force: true
|
|
@@ -122,11 +127,26 @@ module Decidim
|
|
|
122
127
|
template "LICENSE-AGPLv3.txt", "LICENSE-AGPLv3.txt"
|
|
123
128
|
end
|
|
124
129
|
|
|
130
|
+
def rubocop
|
|
131
|
+
copy_file ".rubocop.yml", ".rubocop.yml"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def ruby_version
|
|
135
|
+
copy_file ".ruby-version", ".ruby-version", force: true
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def node_version
|
|
139
|
+
copy_file ".node-version", ".node-version"
|
|
140
|
+
end
|
|
141
|
+
|
|
125
142
|
def gemfile
|
|
126
143
|
return if options[:skip_gemfile]
|
|
127
144
|
|
|
128
145
|
if branch.present?
|
|
129
146
|
get target_gemfile, "Gemfile", force: true
|
|
147
|
+
append_file "Gemfile", %(\ngem "net-imap", "~> 0.2.3", group: :development)
|
|
148
|
+
append_file "Gemfile", %(\ngem "net-pop", "~> 0.1.1", group: :development)
|
|
149
|
+
append_file "Gemfile", %(\ngem "net-smtp", "~> 0.3.1", group: :development)
|
|
130
150
|
get "#{target_gemfile}.lock", "Gemfile.lock", force: true
|
|
131
151
|
else
|
|
132
152
|
copy_file target_gemfile, "Gemfile", force: true
|
|
@@ -139,7 +159,7 @@ module Decidim
|
|
|
139
159
|
|
|
140
160
|
gsub_file "Gemfile", /gem "decidim-dev".*/, "gem \"decidim-dev\", #{gem_modifier}"
|
|
141
161
|
|
|
142
|
-
%w(conferences
|
|
162
|
+
%w(conferences design elections initiatives templates).each do |component|
|
|
143
163
|
if options[:demo]
|
|
144
164
|
gsub_file "Gemfile", /gem "decidim-#{component}".*/, "gem \"decidim-#{component}\", #{gem_modifier}"
|
|
145
165
|
else
|
|
@@ -203,28 +223,22 @@ module Decidim
|
|
|
203
223
|
end
|
|
204
224
|
end
|
|
205
225
|
|
|
206
|
-
def tweak_bootsnap
|
|
207
|
-
gsub_file "config/boot.rb", %r{require 'bootsnap/setup'.*$}, <<~RUBY.rstrip
|
|
208
|
-
require "bootsnap"
|
|
209
|
-
|
|
210
|
-
env = ENV["RAILS_ENV"] || "development"
|
|
211
|
-
|
|
212
|
-
Bootsnap.setup(
|
|
213
|
-
cache_dir: File.expand_path(File.join("..", "tmp", "cache"), __dir__),
|
|
214
|
-
development_mode: env == "development",
|
|
215
|
-
load_path_cache: true,
|
|
216
|
-
compile_cache_iseq: !ENV["SIMPLECOV"],
|
|
217
|
-
compile_cache_yaml: true
|
|
218
|
-
)
|
|
219
|
-
RUBY
|
|
220
|
-
end
|
|
221
|
-
|
|
222
226
|
def tweak_spring
|
|
223
227
|
return unless File.exist?("config/spring.rb")
|
|
224
228
|
|
|
225
229
|
prepend_to_file "config/spring.rb", "require \"decidim/spring\"\n\n"
|
|
226
230
|
end
|
|
227
231
|
|
|
232
|
+
def tweak_csp_initializer
|
|
233
|
+
return unless File.exist?("config/initializers/content_security_policy.rb")
|
|
234
|
+
|
|
235
|
+
remove_file("config/initializers/content_security_policy.rb")
|
|
236
|
+
create_file "config/initializers/content_security_policy.rb" do
|
|
237
|
+
%(# For tuning the Content Security Policy, check the Decidim documentation site
|
|
238
|
+
# https://docs.decidim.org/develop/en/customize/content_security_policy)
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
228
242
|
def puma_ssl_options
|
|
229
243
|
return unless options[:dev_ssl]
|
|
230
244
|
|
|
@@ -243,8 +257,29 @@ module Decidim
|
|
|
243
257
|
CONFIG
|
|
244
258
|
end
|
|
245
259
|
|
|
246
|
-
def
|
|
247
|
-
|
|
260
|
+
def modify_gitignore
|
|
261
|
+
return if options[:skip_git]
|
|
262
|
+
|
|
263
|
+
append_file ".gitignore", <<~GITIGNORE
|
|
264
|
+
|
|
265
|
+
# Ignore env configuration files
|
|
266
|
+
.env
|
|
267
|
+
.envrc
|
|
268
|
+
.rbenv-vars
|
|
269
|
+
|
|
270
|
+
# Ignore the files and folders generated through Webpack
|
|
271
|
+
/public/decidim-packs
|
|
272
|
+
/public/packs-test
|
|
273
|
+
/public/sw.js
|
|
274
|
+
/public/sw.js.map
|
|
275
|
+
|
|
276
|
+
# Ignore node modules
|
|
277
|
+
/node_modules
|
|
278
|
+
GITIGNORE
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def add_ignore_tailwind_configuration
|
|
282
|
+
append_file ".gitignore", "\n\n# Ignore Tailwind configuration\ntailwind.config.js" unless options["skip_git"]
|
|
248
283
|
end
|
|
249
284
|
|
|
250
285
|
def remove_default_error_pages
|
|
@@ -252,6 +287,10 @@ module Decidim
|
|
|
252
287
|
remove_file "public/500.html"
|
|
253
288
|
end
|
|
254
289
|
|
|
290
|
+
def remove_default_favicon
|
|
291
|
+
remove_file "public/favicon.ico"
|
|
292
|
+
end
|
|
293
|
+
|
|
255
294
|
def decidim_initializer
|
|
256
295
|
copy_file "initializer.rb", "config/initializers/decidim.rb"
|
|
257
296
|
|
|
@@ -278,6 +317,26 @@ module Decidim
|
|
|
278
317
|
"# config.available_locales = Rails.application.secrets.decidim[:available_locales].presence || [:en]"
|
|
279
318
|
end
|
|
280
319
|
|
|
320
|
+
def dev_performance_config
|
|
321
|
+
gsub_file "config/environments/development.rb", /^end\n$/, <<~CONFIG
|
|
322
|
+
|
|
323
|
+
# Performance configs for local testing
|
|
324
|
+
if ENV.fetch("RAILS_BOOST_PERFORMANCE", false).to_s == "true"
|
|
325
|
+
# Indicate boost performance mode
|
|
326
|
+
config.boost_performance = true
|
|
327
|
+
# Enable caching and eager load
|
|
328
|
+
config.eager_load = true
|
|
329
|
+
config.cache_classes = true
|
|
330
|
+
# Logging
|
|
331
|
+
config.log_level = :info
|
|
332
|
+
config.action_view.logger = nil
|
|
333
|
+
# Compress the HTML responses with gzip
|
|
334
|
+
config.middleware.use Rack::Deflater
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
CONFIG
|
|
338
|
+
end
|
|
339
|
+
|
|
281
340
|
def authorization_handler
|
|
282
341
|
return unless options[:demo]
|
|
283
342
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
18.17.1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.1.1
|
|
@@ -6,17 +6,12 @@ This is the open-source repository for <%= app_name %>, based on [Decidim](https
|
|
|
6
6
|
|
|
7
7
|
## Setting up the application
|
|
8
8
|
|
|
9
|
-
You will need to do some steps before having the app working properly once you
|
|
9
|
+
You will need to do some steps before having the app working properly once you have deployed it:
|
|
10
10
|
|
|
11
|
-
1.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
3. Visit `<your app url>/system` and login with your system admin credentials
|
|
18
|
-
4. Create a new organization. Check the locales you want to use for that organization, and select a default locale.
|
|
19
|
-
5. Set the correct default host for the organization, otherwise the app will not work properly. Note that you need to include any subdomain you might be using.
|
|
20
|
-
6. Fill the rest of the form and submit it.
|
|
11
|
+
1. Create a System Admin user: `bin/rails decidim_system:create_admin`
|
|
12
|
+
1. Visit `<your app url>/system` and login with your system admin credentials
|
|
13
|
+
1. Create a new organization. Check the locales you want to use for that organization, and select a default locale.
|
|
14
|
+
1. Set the correct default host for the organization, otherwise the app will not work properly. Note that you need to include any subdomain you might be using.
|
|
15
|
+
1. Fill the rest of the form and submit it.
|
|
21
16
|
|
|
22
|
-
You
|
|
17
|
+
You are good to go!
|
|
@@ -9,7 +9,7 @@ class AnotherDummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
|
9
9
|
validate :valid_passport_number
|
|
10
10
|
|
|
11
11
|
def metadata
|
|
12
|
-
super.merge(passport_number
|
|
12
|
+
super.merge(passport_number:, postal_code:)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def unique_id
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# Note: random selection should be deterministic for the same user and the same budgets component.
|
|
6
6
|
# As the budget resources list could change and affect the random selection, it also allows to finish orders created on other budgets.
|
|
7
7
|
class BudgetsWorkflowRandom < Decidim::Budgets::Workflows::Base
|
|
8
|
-
# Highlight the resource if the user
|
|
8
|
+
# Highlight the resource if the user did not vote and is allowed to vote on it.
|
|
9
9
|
def highlighted?(resource)
|
|
10
10
|
vote_allowed?(resource)
|
|
11
11
|
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
|
2
|
+
|
|
3
|
+
require "bundler/setup" # Set up gems listed in the Gemfile.
|
|
4
|
+
<% if depend_on_bootsnap? -%>
|
|
5
|
+
require "bootsnap"
|
|
6
|
+
|
|
7
|
+
env = ENV["RAILS_ENV"] || "development"
|
|
8
|
+
|
|
9
|
+
Bootsnap.setup(
|
|
10
|
+
cache_dir: File.expand_path(File.join("..", "tmp", "cache"), __dir__),
|
|
11
|
+
development_mode: env == "development",
|
|
12
|
+
load_path_cache: true,
|
|
13
|
+
compile_cache_iseq: !ENV["SIMPLECOV"],
|
|
14
|
+
compile_cache_yaml: true
|
|
15
|
+
)
|
|
16
|
+
<%- end -%>
|
|
@@ -41,7 +41,7 @@ development:
|
|
|
41
41
|
#password:
|
|
42
42
|
|
|
43
43
|
# Connect on a TCP socket. Omitted by default since the client uses a
|
|
44
|
-
# domain socket that
|
|
44
|
+
# domain socket that does not need configuration. Windows does not have
|
|
45
45
|
# domain sockets, so uncomment these lines.
|
|
46
46
|
#host: localhost
|
|
47
47
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Notice that this file is included at the very end of the stylesheets packs to have
|
|
3
3
|
// more priority
|
|
4
4
|
//
|
|
5
|
-
// To override CSS
|
|
5
|
+
// To override the Tailwind CSS configuration you can do so by following the instructions
|
|
6
|
+
// available at https://docs.decidim.org/en/develop/customize/styles.html#_tailwind_css
|
|
6
7
|
//
|
|
7
8
|
// By default this is empty.
|
|
@@ -43,7 +43,7 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
|
43
43
|
# be created or not, you should return a Boolean value.
|
|
44
44
|
#
|
|
45
45
|
# Note that if you set some validations and overwrite this method, then the
|
|
46
|
-
# validations will not run, so it
|
|
46
|
+
# validations will not run, so it is easier to remove this method and rewrite
|
|
47
47
|
# your logic using ActiveModel validations.
|
|
48
48
|
#
|
|
49
49
|
# def valid?
|
|
@@ -66,10 +66,10 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
|
66
66
|
# can do it here.
|
|
67
67
|
#
|
|
68
68
|
# You must return a Hash that will be serialized to the authorization when
|
|
69
|
-
# it
|
|
69
|
+
# it is created, and available though authorization.metadata
|
|
70
70
|
#
|
|
71
71
|
def metadata
|
|
72
|
-
super.merge(document_number
|
|
72
|
+
super.merge(document_number:, postal_code:, scope_id:)
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
private
|
|
@@ -105,7 +105,7 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
|
105
105
|
if disallowed_user_postal_code
|
|
106
106
|
if user_postal_code
|
|
107
107
|
i18n_postal_codes_key = "extra_explanation.user_postal_codes"
|
|
108
|
-
user_postal_code_params = { user_postal_code:
|
|
108
|
+
user_postal_code_params = { user_postal_code: }
|
|
109
109
|
else
|
|
110
110
|
i18n_postal_codes_key = "extra_explanation.postal_codes"
|
|
111
111
|
user_postal_code_params = {}
|
|
@@ -126,7 +126,7 @@ class DummyAuthorizationHandler < Decidim::AuthorizationHandler
|
|
|
126
126
|
if disallowed_user_user_scope
|
|
127
127
|
if user_scope_id
|
|
128
128
|
i18n_scope_key = "extra_explanation.user_scope"
|
|
129
|
-
user_scope_params = { user_scope_name:
|
|
129
|
+
user_scope_params = { user_scope_name: }
|
|
130
130
|
else
|
|
131
131
|
i18n_scope_key = "extra_explanation.scope"
|
|
132
132
|
user_scope_params = {}
|
|
@@ -40,8 +40,16 @@ Decidim.configure do |config|
|
|
|
40
40
|
# Enable the service worker. By default is disabled in development and enabled in the rest of environments
|
|
41
41
|
config.service_worker_enabled = Rails.application.secrets.decidim[:service_worker_enabled].present?
|
|
42
42
|
|
|
43
|
+
# Sets the list of static pages' slugs that can include content blocks.
|
|
44
|
+
# By default is only enabled in the terms-of-service static page to allow a summary to be added and include
|
|
45
|
+
# sections with a two-pane view
|
|
46
|
+
config.page_blocks = Rails.application.secrets.decidim[:page_blocks].presence || %w(terms-of-service)
|
|
47
|
+
|
|
43
48
|
# Map and Geocoder configuration
|
|
44
49
|
#
|
|
50
|
+
# See Decidim docs at https://docs.decidim.org/en/develop/services/maps.html
|
|
51
|
+
# for more information about how it works and how to set it up.
|
|
52
|
+
#
|
|
45
53
|
# == HERE Maps ==
|
|
46
54
|
# config.maps = {
|
|
47
55
|
# provider: :here,
|
|
@@ -333,6 +341,9 @@ Decidim.configure do |config|
|
|
|
333
341
|
#
|
|
334
342
|
# config.machine_translation_service = "MyTranslationService"
|
|
335
343
|
|
|
344
|
+
# Defines the social networking services used for social sharing
|
|
345
|
+
config.social_share_services = Rails.application.secrets.decidim[:social_share_services]
|
|
346
|
+
|
|
336
347
|
# Defines the name of the cookie used to check if the user allows Decidim to
|
|
337
348
|
# set cookies.
|
|
338
349
|
config.consent_cookie_name = Rails.application.secrets.decidim[:consent_cookie_name] if Rails.application.secrets.decidim[:consent_cookie_name].present?
|
|
@@ -367,6 +378,10 @@ Decidim.configure do |config|
|
|
|
367
378
|
# }
|
|
368
379
|
# ]
|
|
369
380
|
|
|
381
|
+
# Defines additional content security policies following the structure
|
|
382
|
+
# Read more: https://docs.decidim.org/en/develop/configure/initializer#_content_security_policy
|
|
383
|
+
config.content_security_policies_extra = {}
|
|
384
|
+
|
|
370
385
|
# Admin admin password configurations
|
|
371
386
|
Rails.application.secrets.dig(:decidim, :admin_password, :strong).tap do |strong_pw|
|
|
372
387
|
# When the strong password is not configured, default to true
|
|
@@ -385,7 +400,8 @@ Decidim.configure do |config|
|
|
|
385
400
|
end
|
|
386
401
|
config.follow_http_x_forwarded_host = Rails.application.secrets.decidim[:follow_http_x_forwarded_host].present?
|
|
387
402
|
config.maximum_conversation_message_length = Rails.application.secrets.decidim[:maximum_conversation_message_length].to_i
|
|
388
|
-
config.
|
|
403
|
+
config.password_similarity_length = Rails.application.secrets.decidim[:password_similarity_length] if Rails.application.secrets.decidim[:password_similarity_length].present?
|
|
404
|
+
config.denied_passwords = Rails.application.secrets.decidim[:denied_passwords] if Rails.application.secrets.decidim[:denied_passwords].present?
|
|
389
405
|
config.allow_open_redirects = Rails.application.secrets.decidim[:allow_open_redirects] if Rails.application.secrets.decidim[:allow_open_redirects].present?
|
|
390
406
|
end
|
|
391
407
|
|
|
@@ -434,12 +450,6 @@ if Decidim.module_installed? :accountability
|
|
|
434
450
|
end
|
|
435
451
|
end
|
|
436
452
|
|
|
437
|
-
if Decidim.module_installed? :consultations
|
|
438
|
-
Decidim::Consultations.configure do |config|
|
|
439
|
-
config.stats_cache_expiration_time = Rails.application.secrets.dig(:decidim, :consultations, :stats_cache_expiration_time).to_i.minutes
|
|
440
|
-
end
|
|
441
|
-
end
|
|
442
|
-
|
|
443
453
|
if Decidim.module_installed? :initiatives
|
|
444
454
|
Decidim::Initiatives.configure do |config|
|
|
445
455
|
unless Rails.application.secrets.dig(:decidim, :initiatives, :creation_enabled) == "auto"
|
|
@@ -463,9 +473,10 @@ end
|
|
|
463
473
|
|
|
464
474
|
if Decidim.module_installed? :elections
|
|
465
475
|
Decidim::Elections.configure do |config|
|
|
466
|
-
config.setup_minimum_hours_before_start = Rails.application.secrets.dig(:elections, :setup_minimum_hours_before_start).presence ||
|
|
476
|
+
config.setup_minimum_hours_before_start = Rails.application.secrets.dig(:elections, :setup_minimum_hours_before_start).presence || 1
|
|
467
477
|
config.start_vote_maximum_hours_before_start = Rails.application.secrets.dig(:elections, :start_vote_maximum_hours_before_start).presence || 6
|
|
468
478
|
config.voter_token_expiration_minutes = Rails.application.secrets.dig(:elections, :voter_token_expiration_minutes).presence || 120
|
|
479
|
+
config.document_types = Rails.application.secrets.dig(:elections, :document_types).presence || %w(identification_number passport)
|
|
469
480
|
end
|
|
470
481
|
|
|
471
482
|
Decidim::Votings.configure do |config|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
if Rails.env.development?
|
|
3
|
+
if Rails.env.development? && !Rails.application.config.try(:boost_performance)
|
|
4
4
|
require "rack-mini-profiler"
|
|
5
5
|
|
|
6
6
|
# initialization is skipped so trigger it
|
|
7
7
|
Rack::MiniProfilerRails.initialize!(Rails.application)
|
|
8
|
+
Rack::MiniProfiler.config.skip_paths << "/favicon.ico"
|
|
8
9
|
end
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
# If you change this key, all old signed cookies will become invalid!
|
|
5
5
|
|
|
6
6
|
# Make sure the secret is at least 30 characters and all random,
|
|
7
|
-
# no regular words or you
|
|
7
|
+
# no regular words or you will be exposed to dictionary attacks.
|
|
8
8
|
# You can use `rails secret` to generate a secure secret key.
|
|
9
9
|
|
|
10
10
|
# Make sure the secrets in this file are kept private
|
|
11
|
-
# if you
|
|
11
|
+
# if you are sharing your code publicly.
|
|
12
12
|
|
|
13
13
|
decidim_default: &decidim_default
|
|
14
14
|
application_name: <%%= Decidim::Env.new("DECIDIM_APPLICATION_NAME", "My Application Name").to_json %>
|
|
@@ -38,9 +38,12 @@ decidim_default: &decidim_default
|
|
|
38
38
|
enable_remember_me: <%%= Decidim::Env.new("DECIDIM_ENABLE_REMEMBER_ME", "auto").default_or_present_if_exists.to_s %>
|
|
39
39
|
follow_http_x_forwarded_host: <%%= Decidim::Env.new("DECIDIM_FOLLOW_HTTP_X_FORWARDED_HOST").to_boolean_string %>
|
|
40
40
|
maximum_conversation_message_length: <%%= Decidim::Env.new("DECIDIM_MAXIMUM_CONVERSATION_MESSAGE_LENGTH", "1000").to_i %>
|
|
41
|
-
|
|
41
|
+
password_similarity_length: <%%= Decidim::Env.new("DECIDIM_PASSWORD_SIMILARITY_LENGTH", 4).to_i %>
|
|
42
|
+
denied_passwords: <%%= Decidim::Env.new("DECIDIM_DENIED_PASSWORDS").to_array(separator: ", ").to_json %>
|
|
42
43
|
allow_open_redirects: <%%= Decidim::Env.new("DECIDIM_ALLOW_OPEN_REDIRECTS").to_boolean_string %>
|
|
44
|
+
social_share_services: <%%= Decidim::Env.new("DECIDIM_SOCIAL_SHARE_SERVICES", "X, Facebook, WhatsApp, Telegram").to_array.to_json %>
|
|
43
45
|
service_worker_enabled: <%%= Decidim::Env.new("DECIDIM_SERVICE_WORKER_ENABLED", Rails.env.exclude?("development")).to_boolean_string %>
|
|
46
|
+
page_blocks: <%%= Decidim::Env.new("DECIDIM_PAGE_BLOCKS", "terms-of-service").to_array %>
|
|
44
47
|
admin_password:
|
|
45
48
|
expiration_days: <%%= Decidim::Env.new("DECIDIM_ADMIN_PASSWORD_EXPIRATION_DAYS", 90).to_i %>
|
|
46
49
|
min_length: <%%= Decidim::Env.new("DECIDIM_ADMIN_PASSWORD_MIN_LENGTH", 15).to_i %>
|
|
@@ -63,8 +66,6 @@ decidim_default: &decidim_default
|
|
|
63
66
|
enable_proposal_linking: <%%= Decidim::Env.new("BUDGETS_ENABLE_PROPOSAL_LINKING", "auto").default_or_present_if_exists.to_s %>
|
|
64
67
|
accountability:
|
|
65
68
|
enable_proposal_linking: <%%= Decidim::Env.new("ACCOUNTABILITY_ENABLE_PROPOSAL_LINKING", "auto").default_or_present_if_exists.to_s %>
|
|
66
|
-
consultations:
|
|
67
|
-
stats_cache_expiration_time: <%%= Decidim::Env.new("CONSULTATIONS_STATS_CACHE_EXPIRATION_TIME", 5).to_i %>
|
|
68
69
|
initiatives:
|
|
69
70
|
creation_enabled: <%%= Decidim::Env.new("INITIATIVES_CREATION_ENABLED", "auto").default_or_present_if_exists.to_s %>
|
|
70
71
|
similarity_threshold: <%%= Decidim::Env.new("INITIATIVES_SIMILARITY_THRESHOLD", 0.25).to_f %>
|
|
@@ -88,6 +89,8 @@ elections_default: &elections_default
|
|
|
88
89
|
scheme_name: "dummy"
|
|
89
90
|
quorum: 2
|
|
90
91
|
number_of_trustees: 3
|
|
92
|
+
setup_minimum_hours_before_start: 1
|
|
93
|
+
document_types: <%%= Decidim::Env.new("ELECTIONS_DOCUMENT_TYPES", "identification_number,passport").to_array.to_json %>
|
|
91
94
|
|
|
92
95
|
storage_default: &storage_default
|
|
93
96
|
provider: <%%= Decidim::Env.new("STORAGE_PROVIDER", "local").to_s %>
|
|
@@ -124,13 +127,15 @@ default: &default
|
|
|
124
127
|
enabled: <%%= Decidim::Env.new("OMNIAUTH_FACEBOOK_APP_ID").to_boolean_string %>
|
|
125
128
|
app_id: <%%= ENV["OMNIAUTH_FACEBOOK_APP_ID"] %>
|
|
126
129
|
app_secret: <%%= ENV["OMNIAUTH_FACEBOOK_APP_SECRET"] %>
|
|
130
|
+
icon: facebook-fill
|
|
127
131
|
twitter:
|
|
128
132
|
enabled: <%%= Decidim::Env.new("OMNIAUTH_TWITTER_API_KEY").to_boolean_string %>
|
|
129
133
|
api_key: <%%= ENV["OMNIAUTH_TWITTER_API_KEY"] %>
|
|
130
134
|
api_secret: <%%= ENV["OMNIAUTH_TWITTER_API_SECRET"] %>
|
|
135
|
+
icon: twitter-x-fill
|
|
131
136
|
google_oauth2:
|
|
132
137
|
enabled: <%%= Decidim::Env.new("OMNIAUTH_GOOGLE_CLIENT_ID").to_boolean_string %>
|
|
133
|
-
|
|
138
|
+
icon: google-fill
|
|
134
139
|
client_id: <%%= ENV["OMNIAUTH_GOOGLE_CLIENT_ID"] %>
|
|
135
140
|
client_secret: <%%= ENV["OMNIAUTH_GOOGLE_CLIENT_SECRET"] %>
|
|
136
141
|
maps:
|
|
@@ -162,7 +167,7 @@ development:
|
|
|
162
167
|
omniauth:
|
|
163
168
|
developer:
|
|
164
169
|
enabled: true
|
|
165
|
-
icon: phone
|
|
170
|
+
icon: phone-line
|
|
166
171
|
|
|
167
172
|
test:
|
|
168
173
|
<<: *default
|
|
@@ -206,9 +211,10 @@ production:
|
|
|
206
211
|
scheme_name: <%%= Decidim::Env.new("ELECTIONS_SCHEME_NAME", "electionguard").to_s %>
|
|
207
212
|
number_of_trustees: <%%= Decidim::Env.new("ELECTIONS_NUMBER_OF_TRUSTEES").to_i %>
|
|
208
213
|
quorum: <%%= Decidim::Env.new("ELECTIONS_QUORUM").to_i %>
|
|
209
|
-
setup_minimum_hours_before_start: <%%= Decidim::Env.new("ELECTIONS_SETUP_MINIMUM_HOURS_BEFORE_START",
|
|
214
|
+
setup_minimum_hours_before_start: <%%= Decidim::Env.new("ELECTIONS_SETUP_MINIMUM_HOURS_BEFORE_START", 1).to_i %>
|
|
210
215
|
start_vote_maximum_hours_before_start: <%%= Decidim::Env.new("ELECTIONS_START_VOTE_MAXIMUM_HOURS_BEFORE_START", 6).to_i %>
|
|
211
216
|
voter_token_expiration_minutes: <%%= Decidim::Env.new("ELECTIONS_VOTER_TOKEN_EXPIRATION_MINUTES", 120).to_i %>
|
|
217
|
+
document_types: <%%= Decidim::Env.new("ELECTIONS_DOCUMENT_TYPES", "identification_number,passport").to_array.to_json %>
|
|
212
218
|
votings:
|
|
213
219
|
check_census_max_requests: <%%= Decidim::Env.new("VOTINGS_CHECK_CENSUS_MAX_REQUESTS", 5).to_i %>
|
|
214
220
|
throttling_period: <%%= Decidim::Env.new("VOTINGS_THROTTLING_PERIOD", 1).to_i %>
|
|
@@ -3,15 +3,26 @@
|
|
|
3
3
|
|
|
4
4
|
require "bundler"
|
|
5
5
|
require "thor"
|
|
6
|
+
require "json"
|
|
6
7
|
require "active_support/inflector"
|
|
7
8
|
require "decidim/core/version"
|
|
9
|
+
require "decidim/generators"
|
|
8
10
|
|
|
9
11
|
module Decidim
|
|
10
12
|
module Generators
|
|
11
13
|
class ComponentGenerator < Thor
|
|
12
14
|
include Thor::Actions
|
|
13
15
|
|
|
14
|
-
attr_reader :component_name,
|
|
16
|
+
attr_reader :component_name,
|
|
17
|
+
:component_module_name,
|
|
18
|
+
:component_resource_name,
|
|
19
|
+
:component_folder,
|
|
20
|
+
:component_description,
|
|
21
|
+
:core_version,
|
|
22
|
+
:npm_package_version,
|
|
23
|
+
:required_ruby_version,
|
|
24
|
+
:security_email,
|
|
25
|
+
:edge_git_branch
|
|
15
26
|
|
|
16
27
|
source_root File.expand_path("component_templates", __dir__)
|
|
17
28
|
|
|
@@ -24,7 +35,12 @@ module Decidim
|
|
|
24
35
|
@component_module_name = component_name.camelize
|
|
25
36
|
@component_folder = options[:destination_folder] || "decidim-module-#{component_name}"
|
|
26
37
|
@core_version = Decidim::Core.version
|
|
38
|
+
@npm_package_version = "^#{semver_friendly_version}"
|
|
39
|
+
@edge_git_branch = Decidim::Generators.edge_git_branch
|
|
27
40
|
@component_description = ask "Write a description for the new component:"
|
|
41
|
+
@required_ruby_version = RUBY_VERSION.length == 5 ? RUBY_VERSION[0..2] : RUBY_VERSION
|
|
42
|
+
@security_email = ask "Provide a public email in case of security concern:"
|
|
43
|
+
format_email!
|
|
28
44
|
|
|
29
45
|
template "decidim-component.gemspec.erb", "#{component_folder}/decidim-#{component_name}.gemspec"
|
|
30
46
|
template "Gemfile.erb", "#{component_folder}/Gemfile" if options[:external]
|
|
@@ -32,7 +48,13 @@ module Decidim
|
|
|
32
48
|
template "LICENSE-AGPLv3.txt", "#{component_folder}/LICENSE-AGPLv3.txt"
|
|
33
49
|
template "README.md.erb", "#{component_folder}/README.md"
|
|
34
50
|
template "gitignore", "#{component_folder}/.gitignore"
|
|
35
|
-
template "
|
|
51
|
+
template "github/ci.yml.erb", "#{component_folder}/.github/workflows/ci_#{component_name}.yml"
|
|
52
|
+
template "package.json.erb", "#{component_folder}/package.json"
|
|
53
|
+
copy_file ".ruby-version", "#{component_folder}/.ruby-version"
|
|
54
|
+
copy_file ".node-version", "#{component_folder}/.node-version"
|
|
55
|
+
copy_file ".rubocop.yml", "#{component_folder}/.rubocop.yml"
|
|
56
|
+
copy_file ".eslintrc.json", "#{component_folder}/.eslintrc.json"
|
|
57
|
+
copy_file ".stylelintrc.json", "#{component_folder}/.stylelintrc.json"
|
|
36
58
|
|
|
37
59
|
app_folder = "#{component_folder}/app"
|
|
38
60
|
template "app/packs/js/entrypoint.js", "#{app_folder}/packs/entrypoints/decidim_#{component_name}.js"
|
|
@@ -42,6 +64,7 @@ module Decidim
|
|
|
42
64
|
template "app/controllers/decidim/component/admin/application_controller.rb.erb", "#{app_folder}/controllers/decidim/#{component_name}/admin/application_controller.rb"
|
|
43
65
|
template "app/helpers/decidim/component/application_helper.rb.erb", "#{app_folder}/helpers/decidim/#{component_name}/application_helper.rb"
|
|
44
66
|
template "app/models/decidim/component/application_record.rb.erb", "#{app_folder}/models/decidim/#{component_name}/application_record.rb"
|
|
67
|
+
template "app/permissions/decidim/component/admin/permissions.rb.erb", "#{app_folder}/permissions/decidim/#{component_name}/admin/permissions.rb"
|
|
45
68
|
|
|
46
69
|
bin_folder = "#{component_folder}/bin"
|
|
47
70
|
template "bin/rails.erb", "#{bin_folder}/rails"
|
|
@@ -64,13 +87,32 @@ module Decidim
|
|
|
64
87
|
spec_folder = "#{component_folder}/spec"
|
|
65
88
|
template "spec/spec_helper.rb.erb", "#{spec_folder}/spec_helper.rb"
|
|
66
89
|
template "spec/factories.rb.erb", "#{spec_folder}/factories.rb"
|
|
90
|
+
template "spec/permissions/admin/permissions_spec.rb.erb", "#{spec_folder}/permissions/admin/permissions_spec.rb"
|
|
91
|
+
template "spec/lib/version_spec.rb.erb", "#{spec_folder}/lib/decidim/#{component_name}/version_spec.rb"
|
|
67
92
|
|
|
68
93
|
if options[:external]
|
|
69
94
|
inside(component_folder) do
|
|
70
95
|
Bundler.with_original_env { run "bundle install" }
|
|
96
|
+
Bundler.with_original_env { run "bundle lock --add-platform x86_64-linux" }
|
|
97
|
+
Bundler.with_original_env { run "bundle lock --add-platform ruby" }
|
|
71
98
|
end
|
|
72
99
|
end
|
|
73
100
|
end
|
|
101
|
+
|
|
102
|
+
private
|
|
103
|
+
|
|
104
|
+
def format_email!
|
|
105
|
+
return unless @security_email&.include?("@")
|
|
106
|
+
|
|
107
|
+
split = @security_email.split("@")
|
|
108
|
+
email = split.first
|
|
109
|
+
domain = split.last.gsub(".", " [dot] ")
|
|
110
|
+
@security_email = "#{email} [at] #{domain}"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def semver_friendly_version
|
|
114
|
+
Decidim::Generators.version.gsub(/\.pre/, "-pre").gsub(/\.dev/, "-dev").gsub(/.rc(\d*)/, "-rc\\1")
|
|
115
|
+
end
|
|
74
116
|
end
|
|
75
117
|
end
|
|
76
118
|
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
18.17.1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.1.1
|
|
@@ -23,7 +23,13 @@ bundle
|
|
|
23
23
|
|
|
24
24
|
## Contributing
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Contributions are welcome !
|
|
27
|
+
|
|
28
|
+
We expect the contributions to follow the [Decidim's contribution guide](https://github.com/decidim/decidim/blob/develop/CONTRIBUTING.adoc).
|
|
29
|
+
|
|
30
|
+
## Security
|
|
31
|
+
|
|
32
|
+
Security is very important to us. If you have any issue regarding security, please disclose the information responsibly by sending an email to __<%= security_email %>__ and not by creating a Github issue.
|
|
27
33
|
|
|
28
34
|
## License
|
|
29
35
|
|