From dab6a3c57fd510c43d6158e7a64ce58ef6c1509a Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 2 Jun 2026 14:30:29 +0200 Subject: [PATCH 1/6] fix: Add initiatives config to add a new workflow --- config/initializers/decidim.rb | 20 ------- config/initializers/decidim_initiatives.rb | 65 ++++++++++++++++++++++ config/locales/en.yml | 5 ++ config/locales/fr.yml | 5 ++ 4 files changed, 75 insertions(+), 20 deletions(-) create mode 100644 config/initializers/decidim_initiatives.rb diff --git a/config/initializers/decidim.rb b/config/initializers/decidim.rb index 4bd23c808d..7dee6a4c5a 100644 --- a/config/initializers/decidim.rb +++ b/config/initializers/decidim.rb @@ -497,26 +497,6 @@ end end -if Decidim.module_installed? :initiatives - Decidim::Initiatives.configure do |config| - creation_enabled = Decidim::Env.new("INITIATIVES_CREATION_ENABLED", "auto").default_or_present_if_exists - config.creation_enabled = creation_enabled.present? unless creation_enabled.to_s == "auto" - - config.minimum_committee_members = Decidim::Env.new("INITIATIVES_MINIMUM_COMMITTEE_MEMBERS", 2).to_i - config.default_signature_time_period_length = Decidim::Env.new("INITIATIVES_DEFAULT_SIGNATURE_TIME_PERIOD_LENGTH", 120).to_i - config.default_components = Decidim::Env.new("INITIATIVES_DEFAULT_COMPONENTS", "pages, meetings").to_array - config.first_notification_percentage = Decidim::Env.new("INITIATIVES_FIRST_NOTIFICATION_PERCENTAGE", 33).to_i - config.second_notification_percentage = Decidim::Env.new("INITIATIVES_SECOND_NOTIFICATION_PERCENTAGE", 66).to_i - config.stats_cache_expiration_time = Decidim::Env.new("INITIATIVES_STATS_CACHE_EXPIRATION_TIME", 5).to_i.minutes - config.max_time_in_validating_state = Decidim::Env.new("INITIATIVES_MAX_TIME_IN_VALIDATING_STATE", 60).to_i.days - - print_enabled = Decidim::Env.new("INITIATIVES_PRINT_ENABLED", "auto").default_or_present_if_exists - config.print_enabled = print_enabled.present? unless print_enabled.to_s == "auto" - - config.do_not_require_authorization = Decidim::Env.new("INITIATIVES_DO_NOT_REQUIRE_AUTHORIZATION", false).to_boolean_string == "true" - end -end - Rails.application.config.i18n.available_locales = Decidim.available_locales Rails.application.config.i18n.default_locale = Decidim.default_locale diff --git a/config/initializers/decidim_initiatives.rb b/config/initializers/decidim_initiatives.rb new file mode 100644 index 0000000000..9929458405 --- /dev/null +++ b/config/initializers/decidim_initiatives.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +return unless Decidim.module_installed?(:initiatives) + +Decidim::Initiatives.configure do |config| + creation_enabled = Decidim::Env.new("INITIATIVES_CREATION_ENABLED", "auto").default_or_present_if_exists + config.creation_enabled = creation_enabled.present? unless creation_enabled.to_s == "auto" + + config.minimum_committee_members = Decidim::Env.new("INITIATIVES_MINIMUM_COMMITTEE_MEMBERS", 2).to_i + config.default_signature_time_period_length = Decidim::Env.new("INITIATIVES_DEFAULT_SIGNATURE_TIME_PERIOD_LENGTH", 120).to_i + config.default_components = Decidim::Env.new("INITIATIVES_DEFAULT_COMPONENTS", "pages, meetings").to_array + config.first_notification_percentage = Decidim::Env.new("INITIATIVES_FIRST_NOTIFICATION_PERCENTAGE", 33).to_i + config.second_notification_percentage = Decidim::Env.new("INITIATIVES_SECOND_NOTIFICATION_PERCENTAGE", 66).to_i + config.stats_cache_expiration_time = Decidim::Env.new("INITIATIVES_STATS_CACHE_EXPIRATION_TIME", 5).to_i.minutes + config.max_time_in_validating_state = Decidim::Env.new("INITIATIVES_MAX_TIME_IN_VALIDATING_STATE", 60).to_i.days + + print_enabled = Decidim::Env.new("INITIATIVES_PRINT_ENABLED", "auto").default_or_present_if_exists + config.print_enabled = print_enabled.present? unless print_enabled.to_s == "auto" + + config.do_not_require_authorization = Decidim::Env.new("INITIATIVES_DO_NOT_REQUIRE_AUTHORIZATION", false).to_boolean_string == "true" +end + +# Signature workflows (introduced in Decidim 0.31, PR #13729). +# At least one workflow must be registered for initiative types to be +# configurable in the admin. The legacy handler reproduces the pre-0.31 +# behaviour and must be available in all environments. +Decidim::Initiatives::Signatures.register_workflow(:legacy_signature_handler) do |workflow| + workflow.form = "Decidim::Initiatives::LegacySignatureHandler" + workflow.save_authorizations = false + workflow.sms_verification = false +end + +# Dummy workflows for local development and testing only. +# These classes are provided by decidim-dev and do not exist in production. +if Rails.env.development? || Rails.env.test? + Decidim::Initiatives::Signatures.register_workflow(:dummy_signature_handler) do |workflow| + workflow.form = "DummySignatureHandler" + workflow.authorization_handler_form = "DummyAuthorizationHandler" + workflow.action_authorizer = "DummySignatureHandler::DummySignatureActionAuthorizer" + workflow.promote_authorization_validation_errors = true + workflow.sms_verification = true + workflow.sms_mobile_phone_validator = "DummySmsMobilePhoneValidator" + end + + Decidim::Initiatives::Signatures.register_workflow(:ephemeral_dummy_signature_handler) do |workflow| + workflow.form = "DummySignatureHandler" + workflow.ephemeral = true + workflow.authorization_handler_form = "DummyAuthorizationHandler" + workflow.action_authorizer = "DummySignatureHandler::DummySignatureActionAuthorizer" + workflow.promote_authorization_validation_errors = true + workflow.sms_verification = true + workflow.sms_mobile_phone_validator = "DummySmsMobilePhoneValidator" + end + + Decidim::Initiatives::Signatures.register_workflow(:dummy_signature_with_sms_handler) do |workflow| + workflow.sms_verification = true + end + + Decidim::Initiatives::Signatures.register_workflow(:dummy_signature_with_personal_data_handler) do |workflow| + workflow.form = "DummySignatureHandler" + workflow.authorization_handler_form = "DummyAuthorizationHandler" + workflow.action_authorizer = "DummySignatureHandler::DummySignatureActionAuthorizer" + workflow.promote_authorization_validation_errors = true + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index 2370815697..c908f7d0de 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -441,6 +441,11 @@ en: email: Email name: Name initiatives: + signatures: + workflows: + legacy_signature_handler: + description: Signature handler based on the old signature feature including the collection of personal data, the SMS step and validating the authorization with dummy_authorization_handler. Modify any parameter to adapt to the configuration used + name: Legacy Signature Handler admin: index: initiatives_types: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 1264479b65..b565797838 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -449,6 +449,11 @@ fr: email: Email name: Nom initiatives: + signatures: + workflows: + legacy_signature_handler: + description: "Procédure de signature basée sur l'ancien système de pétitions, incluant la collecte de données personnelles, l'étape de vérification par SMS et la validation de l'autorisation. Modifiez les paramètres de l'initializer pour l'adapter à votre configuration." + name: Procédure de signature standard admin: index: initiatives_types: From 3026b4894c52c83a99431a7d458f74fcd17025e3 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 2 Jun 2026 14:37:52 +0200 Subject: [PATCH 2/6] fix: Replace condition --- config/initializers/decidim_initiatives.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/decidim_initiatives.rb b/config/initializers/decidim_initiatives.rb index 9929458405..e1a5935d21 100644 --- a/config/initializers/decidim_initiatives.rb +++ b/config/initializers/decidim_initiatives.rb @@ -32,7 +32,7 @@ # Dummy workflows for local development and testing only. # These classes are provided by decidim-dev and do not exist in production. -if Rails.env.development? || Rails.env.test? +if Rails.env.local? Decidim::Initiatives::Signatures.register_workflow(:dummy_signature_handler) do |workflow| workflow.form = "DummySignatureHandler" workflow.authorization_handler_form = "DummyAuthorizationHandler" From d14150036d5724e44d2b3ef704c488ee2aa595e6 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 2 Jun 2026 14:54:09 +0200 Subject: [PATCH 3/6] fix: CI i18n --- config/i18n-tasks.yml | 1 + config/locales/en.yml | 10 +++++----- config/locales/fr.yml | 10 +++++----- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index 401fdb61a6..b8b4956fe2 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -205,3 +205,4 @@ ignore_unused: - decidim.initiatives.form.add_documents - decidim.initiatives.form.edit_documents - layouts.decidim.initiative_creation_header.* + - decidim.initiatives.signatures.workflows.legacy_signature_handler.* diff --git a/config/locales/en.yml b/config/locales/en.yml index c908f7d0de..58ba9a0143 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -441,11 +441,6 @@ en: email: Email name: Name initiatives: - signatures: - workflows: - legacy_signature_handler: - description: Signature handler based on the old signature feature including the collection of personal data, the SMS step and validating the authorization with dummy_authorization_handler. Modify any parameter to adapt to the configuration used - name: Legacy Signature Handler admin: index: initiatives_types: @@ -522,6 +517,11 @@ en: initiatives: index_header: new_initiative: New initiative + signatures: + workflows: + legacy_signature_handler: + description: Signature handler based on the old signature feature including the collection of personal data, the SMS step and validating the authorization with dummy_authorization_handler. Modify any parameter to adapt to the configuration used + name: Legacy Signature Handler like_buttons_cell: already_liked: Undo the like like: Like diff --git a/config/locales/fr.yml b/config/locales/fr.yml index b565797838..18b7793113 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -449,11 +449,6 @@ fr: email: Email name: Nom initiatives: - signatures: - workflows: - legacy_signature_handler: - description: "Procédure de signature basée sur l'ancien système de pétitions, incluant la collecte de données personnelles, l'étape de vérification par SMS et la validation de l'autorisation. Modifiez les paramètres de l'initializer pour l'adapter à votre configuration." - name: Procédure de signature standard admin: index: initiatives_types: @@ -530,6 +525,11 @@ fr: initiatives: index_header: new_initiative: Nouvelle pétition + signatures: + workflows: + legacy_signature_handler: + description: Procédure de signature basée sur l'ancien système de pétitions, incluant la collecte de données personnelles, l'étape de vérification par SMS et la validation de l'autorisation. Modifiez les paramètres de l'initializer pour l'adapter à votre configuration. + name: Procédure de signature standard like_buttons_cell: already_liked: Je n'aime plus like: J'aime From b1b1deeedaf1144cc8ff0795043f03d486117499 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 2 Jun 2026 15:51:17 +0200 Subject: [PATCH 4/6] fix: Remove initiative_button deprecated override --- .../_new_initiative_button.html.erb | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 app/views/decidim/initiatives/initiatives/_new_initiative_button.html.erb diff --git a/app/views/decidim/initiatives/initiatives/_new_initiative_button.html.erb b/app/views/decidim/initiatives/initiatives/_new_initiative_button.html.erb deleted file mode 100644 index 73e65eb04b..0000000000 --- a/app/views/decidim/initiatives/initiatives/_new_initiative_button.html.erb +++ /dev/null @@ -1,30 +0,0 @@ -<% if Decidim::Initiatives.creation_enabled %> - <% if current_user && available_initiative_types.size > 1 %> - <%= link_to create_initiative_path(:select_initiative_type), class: "!px-4 title-action__action button button__xl button__secondary w-full" do %> - <%= t("new_initiative", scope: "decidim.initiatives.initiatives.index_header") %> - <%= icon "add-fill" %> - <% end %> - <% elsif current_user %> - <% has_available_authorizations = current_organization.available_authorizations.any? %> - - <% if allowed_to?(:create, :initiative, { initiative_type: available_initiative_types.first }) || !has_available_authorizations %> - <%= link_to create_initiative_path(:select_initiative_type), class: "!px-4 title-action__action button button__xl button__secondary w-full" do %> - <%= t("new_initiative", scope: "decidim.initiatives.initiatives.index_header") %> - <%= icon "add-fill" %> - <% end %> - <% else %> - <%= authorized_create_modal_button(available_initiative_types.first, remote: true, class: "!px-4 title-action__action button button__xl button__secondary w-full") do %> - <%= t("new_initiative", scope: "decidim.initiatives.initiatives.index_header") %> - <%= icon "add-fill" %> - <% end %> - <% end %> - <% else %> - <% content_for(:redirect_after_login) { create_initiative_url(:select_initiative_type) } %> - - <% end %> -<% end %> - -<%= render partial: "decidim/initiatives/modal" %> From 1b593b8ad1c350250d7a2bce69ebdec51f8a91a1 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 2 Jun 2026 16:07:16 +0200 Subject: [PATCH 5/6] fix: Remove useless translations --- config/locales/en.yml | 3 --- config/locales/fr.yml | 3 --- 2 files changed, 6 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 58ba9a0143..090812c239 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -514,9 +514,6 @@ en: edit_attachments: Edit attachments edit_image: Edit image image_legend: "(Optional) Add an image" - initiatives: - index_header: - new_initiative: New initiative signatures: workflows: legacy_signature_handler: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 18b7793113..eb91a8f899 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -522,9 +522,6 @@ fr: edit_attachments: Modifier les pièces jointes edit_image: Modifier l'Image image_legend: "(Facultatif) Ajouter une image" - initiatives: - index_header: - new_initiative: Nouvelle pétition signatures: workflows: legacy_signature_handler: From 609e4ea863928eecc2063408e94c5c305a80135b Mon Sep 17 00:00:00 2001 From: AyakorK Date: Thu, 4 Jun 2026 15:08:29 +0200 Subject: [PATCH 6/6] fix: remove useless local-only authorization handlers --- config/initializers/decidim_initiatives.rb | 34 ---------------------- 1 file changed, 34 deletions(-) diff --git a/config/initializers/decidim_initiatives.rb b/config/initializers/decidim_initiatives.rb index e1a5935d21..737bc88106 100644 --- a/config/initializers/decidim_initiatives.rb +++ b/config/initializers/decidim_initiatives.rb @@ -29,37 +29,3 @@ workflow.save_authorizations = false workflow.sms_verification = false end - -# Dummy workflows for local development and testing only. -# These classes are provided by decidim-dev and do not exist in production. -if Rails.env.local? - Decidim::Initiatives::Signatures.register_workflow(:dummy_signature_handler) do |workflow| - workflow.form = "DummySignatureHandler" - workflow.authorization_handler_form = "DummyAuthorizationHandler" - workflow.action_authorizer = "DummySignatureHandler::DummySignatureActionAuthorizer" - workflow.promote_authorization_validation_errors = true - workflow.sms_verification = true - workflow.sms_mobile_phone_validator = "DummySmsMobilePhoneValidator" - end - - Decidim::Initiatives::Signatures.register_workflow(:ephemeral_dummy_signature_handler) do |workflow| - workflow.form = "DummySignatureHandler" - workflow.ephemeral = true - workflow.authorization_handler_form = "DummyAuthorizationHandler" - workflow.action_authorizer = "DummySignatureHandler::DummySignatureActionAuthorizer" - workflow.promote_authorization_validation_errors = true - workflow.sms_verification = true - workflow.sms_mobile_phone_validator = "DummySmsMobilePhoneValidator" - end - - Decidim::Initiatives::Signatures.register_workflow(:dummy_signature_with_sms_handler) do |workflow| - workflow.sms_verification = true - end - - Decidim::Initiatives::Signatures.register_workflow(:dummy_signature_with_personal_data_handler) do |workflow| - workflow.form = "DummySignatureHandler" - workflow.authorization_handler_form = "DummyAuthorizationHandler" - workflow.action_authorizer = "DummySignatureHandler::DummySignatureActionAuthorizer" - workflow.promote_authorization_validation_errors = true - end -end