decidim-generators 0.20.1 → 0.23.1

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.
@@ -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,14 +115,12 @@ module Decidim
111
115
  if current_gem == "decidim"
112
116
  gsub_file "Gemfile", /gem "decidim-dev".*/, "gem \"decidim-dev\", #{gem_modifier}"
113
117
 
114
- if options[:demo]
115
- gsub_file "Gemfile", /gem "decidim-consultations".*/, "gem \"decidim-consultations\", #{gem_modifier}"
116
- gsub_file "Gemfile", /gem "decidim-initiatives".*/, "gem \"decidim-initiatives\", #{gem_modifier}"
117
- gsub_file "Gemfile", /gem "decidim-conferences".*/, "gem \"decidim-conferences\", #{gem_modifier}"
118
- else
119
- gsub_file "Gemfile", /gem "decidim-consultations".*/, "# gem \"decidim-consultations\", #{gem_modifier}"
120
- gsub_file "Gemfile", /gem "decidim-initiatives".*/, "# gem \"decidim-initiatives\", #{gem_modifier}"
121
- gsub_file "Gemfile", /gem "decidim-conferences".*/, "# gem \"decidim-conferences\", #{gem_modifier}"
118
+ %w(conferences consultations elections initiatives templates).each do |component|
119
+ if options[:demo]
120
+ gsub_file "Gemfile", /gem "decidim-#{component}".*/, "gem \"decidim-#{component}\", #{gem_modifier}"
121
+ else
122
+ gsub_file "Gemfile", /gem "decidim-#{component}".*/, "# gem \"decidim-#{component}\", #{gem_modifier}"
123
+ end
122
124
  end
123
125
  end
124
126
 
@@ -172,6 +174,15 @@ module Decidim
172
174
  "config.sms_gateway_service = 'Decidim::Verifications::Sms::ExampleGateway'"
173
175
  end
174
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
+
175
186
  def timestamp_service
176
187
  return unless options[:demo]
177
188
 
@@ -188,13 +199,22 @@ module Decidim
188
199
  "config.pdf_signature_service = \"Decidim::Initiatives::PdfSignatureExample\""
189
200
  end
190
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
+
191
210
  def install
192
211
  Decidim::Generators::InstallGenerator.start(
193
212
  [
194
213
  "--recreate_db=#{options[:recreate_db]}",
195
214
  "--seed_db=#{options[:seed_db]}",
196
215
  "--skip_gemfile=#{options[:skip_gemfile]}",
197
- "--app_name=#{app_name}"
216
+ "--app_name=#{app_name}",
217
+ "--profiling=#{options[:profiling]}"
198
218
  ]
199
219
  )
200
220
  end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "budgets_workflow_random"
4
+ Decidim::Budgets.workflows[:random] = BudgetsWorkflowRandom
@@ -0,0 +1,8 @@
1
+ en:
2
+ decidim:
3
+ components:
4
+ budgets:
5
+ settings:
6
+ global:
7
+ workflow_choices:
8
+ random: "Vote in a random component: allows participants to vote only in one budget, selected randomly."
@@ -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
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ if defined?(Bullet)
4
+ Rails.application.config.after_initialize do
5
+ Bullet.enable = true
6
+ Bullet.bullet_logger = true
7
+ Bullet.rails_logger = true
8
+ Bullet.stacktrace_includes = %w(decidim-)
9
+ end
10
+ 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
- data[:extra_explanation] = { key: "extra_explanation",
94
- params: { scope: "decidim.verifications.dummy_authorization",
95
- count: allowed_postal_codes.count,
96
- postal_codes: allowed_postal_codes.join(", ") } }
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
@@ -1,20 +1,105 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Decidim.configure do |config|
4
+ # The name of the application
4
5
  config.application_name = "My Application Name"
5
- config.mailer_sender = "change-me@domain.org"
6
6
 
7
- # Change these lines to set your preferred locales
8
- config.default_locale = :en
7
+ # The email that will be used as sender in all emails from Decidim
8
+ config.mailer_sender = "change-me@example.org"
9
+
10
+ # Sets the list of available locales for the whole application.
11
+ #
12
+ # When an organization is created through the System area, system admins will
13
+ # be able to choose the available languages for that organization. That list
14
+ # of languages will be equal or a subset of the list in this file.
9
15
  config.available_locales = [:en, :ca, :es]
10
16
 
11
- # Geocoder configuration
17
+ # Sets the default locale for new organizations. When creating a new
18
+ # organization from the System area, system admins will be able to overwrite
19
+ # this value for that specific organization.
20
+ config.default_locale = :en
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
+ # Defines a list of custom content processors. They are used to parse and
28
+ # render specific tags inside some user-provided content. Check the docs for
29
+ # more info.
30
+ # config.content_processors = []
31
+
32
+ # Whether SSL should be enabled or not.
33
+ # config.force_ssl = true
34
+
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">&copy; 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.
12
92
  # config.geocoder = {
13
- # static_map_url: "https://image.maps.ls.hereapi.com/mia/1.6/mapview",
14
- # here_api_key: Rails.application.secrets.geocoder[:here_api_key]
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: "..."
15
100
  # }
16
101
 
17
- # Custom resource reference generator method
102
+ # Custom resource reference generator method. Check the docs for more info.
18
103
  # config.reference_generator = lambda do |resource, component|
19
104
  # # Implement your custom method to generate resources references
20
105
  # "1234-#{resource.id}"
@@ -23,7 +108,11 @@ Decidim.configure do |config|
23
108
  # Currency unit
24
109
  # config.currency_unit = "€"
25
110
 
26
- # The number of reports which an object can receive before hiding it
111
+ # Defines the quality of image uploads after processing. Image uploads are
112
+ # processed by Decidim, this value helps reduce the size of the files.
113
+ # config.image_uploader_quality = 80
114
+
115
+ # The number of reports which a resource can receive before hiding it
27
116
  # config.max_reports_before_hiding = 3
28
117
 
29
118
  # Custom HTML Header snippets
@@ -41,6 +130,29 @@ Decidim.configure do |config|
41
130
  #
42
131
  config.enable_html_header_snippets = false
43
132
 
133
+ # Allow organizations admins to track newsletter links.
134
+ # config.track_newsletter_links = true
135
+
136
+ # Amount of time that the data portability files will be available in the server.
137
+ # config.data_portability_expiry_time = 7.days
138
+
139
+ # Max requests in a time period to prevent DoS attacks. Only applied on production.
140
+ # config.throttling_max_requests = 100
141
+
142
+ # Time window in which the throttling is applied.
143
+ # config.throttling_period = 1.minute
144
+
145
+ # Time window were users can access the website even if their email is not confirmed.
146
+ # config.unconfirmed_access_for = 2.days
147
+
148
+ # A base path for the uploads. If set, make sure it ends in a slash.
149
+ # Uploads will be set to `<base_path>/uploads/`. This can be useful if you
150
+ # want to use the same uploads place for both staging and production
151
+ # environments, but in different folders.
152
+ #
153
+ # If not set, it will be ignored.
154
+ # config.base_uploads_path = nil
155
+
44
156
  # SMS gateway configuration
45
157
  #
46
158
  # If you want to verify your users by sending a verification code via
@@ -121,6 +233,51 @@ Decidim.configure do |config|
121
233
  # api_key: Rails.application.secrets.etherpad[:api_key],
122
234
  # api_version: Rails.application.secrets.etherpad[:api_version]
123
235
  # }
236
+
237
+ # Sets Decidim::Exporters::CSV's default column separator
238
+ # config.default_csv_col_sep = ";"
239
+
240
+ # The list of roles a user can have, not considering the space-specific roles.
241
+ # config.user_roles = %w(admin user_manager)
242
+
243
+ # The list of visibility options for amendments. An Array of Strings that
244
+ # serve both as locale keys and values to construct the input collection in
245
+ # Decidim::Amendment::VisibilityStepSetting::options.
246
+ #
247
+ # This collection is used in Decidim::Admin::SettingsHelper to generate a
248
+ # radio buttons collection input field form for a Decidim::Component
249
+ # step setting :amendments_visibility.
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"
124
281
  end
125
282
 
126
283
  Rails.application.config.i18n.available_locales = Decidim.available_locales