From 9a30c8f490e3bb0d7ac2b0f03351e9b61f5ed0ca Mon Sep 17 00:00:00 2001 From: Laura Jaime Date: Tue, 23 Jul 2024 10:10:15 +0200 Subject: [PATCH] Rework decorators --- Gemfile | 3 +- Gemfile.lock | 94 ++++----- .../admin/newsletters_helper_decorator.rb | 101 +++++----- .../selective_newsletter_form_decorator.rb | 38 ++-- ...participatory_space_type_form_decorator.rb | 30 +-- .../decidim/organization_decorator.rb | 22 ++- .../participatory_space_context_decorator.rb | 24 ++- config/application.rb | 2 +- config/locales/oc_core.yml | 1 - decidim-home/config/locales/oc.yml | 1 - .../participatory_process_decorator.rb | 14 +- .../copy_participatory_process_decorator.rb | 68 ++++--- .../participatory_process_form_decorator.rb | 46 +++-- ...cipatory_processes_controller_decorator.rb | 179 ++++++++++-------- ...cipatory_processes_controller_decorator.rb | 46 +++-- .../commands/create_registration_decorator.rb | 67 +++---- .../spec/system/registration_spec.rb | 27 ++- .../debates/debates_controller_decorator.rb | 10 +- .../proposals_controller_decorator.rb | 10 +- spec/system/feder_footer_spec.rb | 6 +- 20 files changed, 439 insertions(+), 350 deletions(-) diff --git a/Gemfile b/Gemfile index 3a4d4b0a..b61755bf 100644 --- a/Gemfile +++ b/Gemfile @@ -3,8 +3,7 @@ source "https://rubygems.org" ruby RUBY_VERSION -# DECIDIM_VERSION = { git: "https://github.com/CodiTramuntana/decidim", branch: "release/0.27-stable" }.freeze -DECIDIM_VERSION = { path: "/home/laurajv/decidim_fork" }.freeze +DECIDIM_VERSION = { git: "https://github.com/CodiTramuntana/decidim", branch: "release/0.27-stable" }.freeze gem "decidim", DECIDIM_VERSION gem "decidim-templates", DECIDIM_VERSION diff --git a/Gemfile.lock b/Gemfile.lock index 449a0404..28531811 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,51 +1,7 @@ GIT - remote: https://github.com/gencat/decidim-module-challenges.git - revision: 2f3f8c983544e0d73512c8f6a5f93318ecee01ad - tag: v0.3.3 - specs: - decidim-challenges (0.3.3) - decidim-core (~> 0.27) - -GIT - remote: https://github.com/gencat/decidim-module-department_admin.git - revision: a202f8a49b19157eb1b2a455b82f33ce8d955c23 - branch: upgrade/0.27 - specs: - decidim-department_admin (0.7.0) - decidim-admin (~> 0.27.0) - decidim-core (~> 0.27.0) - -GIT - remote: https://github.com/gencat/decidim-module-idcat_mobil.git - revision: 406054a9ed7b83d4c6e542661e0b2200b064fe32 - branch: upgrade/0.27 - specs: - decidim-idcat_mobil (0.4.0) - decidim (>= 0.27.0) - decidim-core (>= 0.27.0) - omniauth-idcat_mobil (~> 0.5.0) - -GIT - remote: https://github.com/gencat/decidim-verifications-members_picker.git - revision: c6d9c4ee27262803491380c45032a16370040862 - branch: downgrade_ruby - specs: - decidim-verifications-members_picker (0.0.6) - decidim-core (>= 0.27.5) - decidim-verifications (>= 0.27.5) - psych (< 4) - -GIT - remote: https://github.com/mainio/decidim-module-term_customizer.git - revision: abbf0c69e1bcaafebc5aa4f8da22fdb64ce62149 + remote: https://github.com/CodiTramuntana/decidim + revision: e9d5cd060a191c5d557549462314fbdf3a3ef2a8 branch: release/0.27-stable - specs: - decidim-term_customizer (0.27.0) - decidim-admin (~> 0.27.0) - decidim-core (~> 0.27.0) - -PATH - remote: /home/laurajv/decidim_fork specs: decidim (0.27.7) decidim-accountability (= 0.27.7) @@ -214,6 +170,52 @@ PATH decidim-verifications (0.27.7) decidim-core (= 0.27.7) +GIT + remote: https://github.com/gencat/decidim-module-challenges.git + revision: 2f3f8c983544e0d73512c8f6a5f93318ecee01ad + tag: v0.3.3 + specs: + decidim-challenges (0.3.3) + decidim-core (~> 0.27) + +GIT + remote: https://github.com/gencat/decidim-module-department_admin.git + revision: a202f8a49b19157eb1b2a455b82f33ce8d955c23 + branch: upgrade/0.27 + specs: + decidim-department_admin (0.7.0) + decidim-admin (~> 0.27.0) + decidim-core (~> 0.27.0) + +GIT + remote: https://github.com/gencat/decidim-module-idcat_mobil.git + revision: 406054a9ed7b83d4c6e542661e0b2200b064fe32 + branch: upgrade/0.27 + specs: + decidim-idcat_mobil (0.4.0) + decidim (>= 0.27.0) + decidim-core (>= 0.27.0) + omniauth-idcat_mobil (~> 0.5.0) + +GIT + remote: https://github.com/gencat/decidim-verifications-members_picker.git + revision: c6d9c4ee27262803491380c45032a16370040862 + branch: downgrade_ruby + specs: + decidim-verifications-members_picker (0.0.6) + decidim-core (>= 0.27.5) + decidim-verifications (>= 0.27.5) + psych (< 4) + +GIT + remote: https://github.com/mainio/decidim-module-term_customizer.git + revision: abbf0c69e1bcaafebc5aa4f8da22fdb64ce62149 + branch: release/0.27-stable + specs: + decidim-term_customizer (0.27.0) + decidim-admin (~> 0.27.0) + decidim-core (~> 0.27.0) + PATH remote: decidim-admin-extended specs: diff --git a/app/decorators/decidim/admin/newsletters_helper_decorator.rb b/app/decorators/decidim/admin/newsletters_helper_decorator.rb index a9be8cf4..c13bdb1c 100644 --- a/app/decorators/decidim/admin/newsletters_helper_decorator.rb +++ b/app/decorators/decidim/admin/newsletters_helper_decorator.rb @@ -1,51 +1,62 @@ # frozen_string_literal: true -Decidim::Admin::NewslettersHelper.class_eval do - def participatory_space_types_form_object(form_object, space_type) - return if spaces_user_can_admin[space_type.manifest_name.to_sym].blank? - - html = "" - form_object.fields_for "participatory_space_types[#{space_type.manifest_name}]", space_type do |ff| - html += ff.hidden_field :manifest_name, value: space_type.manifest_name - html += select_tag_participatory_spaces(space_type, spaces_for_select(space_type), ff) +# rubocop:disable Metrics/CyclomaticComplexity +# rubocop:disable Metrics/PerceivedComplexity +module Decidim::Admin::NewslettersHelperDecorator + def self.decorate + Decidim::Admin::NewslettersHelper.class_eval do + def participatory_space_types_form_object(form_object, space_type) + return if spaces_user_can_admin[space_type.manifest_name.to_sym].blank? + + html = "" + form_object.fields_for "participatory_space_types[#{space_type.manifest_name}]", space_type do |ff| + html += ff.hidden_field :manifest_name, value: space_type.manifest_name + html += select_tag_participatory_spaces(space_type, spaces_for_select(space_type), ff) + end + html.html_safe + end + + def select_tag_participatory_spaces(space_type, spaces, child_form) + return unless spaces + + tag.div(class: "#{space_type.manifest_name}-block spaces-block-tag cell small-12 medium-6") do + child_form.select :ids, options_for_select(spaces), + { prompt: t("select_recipients_to_deliver.none", scope: "decidim.admin.newsletters"), + label: label_text_for(space_type), + include_hidden: false }, + multiple: true, size: spaces.size > 10 ? 10 : spaces.size, class: "chosen-select" + end + end + + def label_text_for(space_type) + if space_type.process_group_id + Decidim::ParticipatoryProcessGroup.find(space_type.process_group_id).title[current_locale] + else + t("activerecord.models.decidim/#{space_type.manifest_name.singularize}.other") + end + end + + def spaces_for_select(space_type) + return unless Decidim.participatory_space_manifests.map(&:name).include?(space_type.manifest_name.to_sym) + + collection = filter_spaces_by_process_group(space_type) + return collection unless current_user.admin? + + [[I18n.t("select_recipients_to_deliver.all_spaces", scope: "decidim.admin.newsletters"), "all"]] + collection + end + + def filter_spaces_by_process_group(space_type) + manifest_name = space_type.manifest_name.to_sym + return spaces_user_can_admin[manifest_name] unless manifest_name == :participatory_processes + + processes_ids = Decidim::ParticipatoryProcessGroup.find(space_type.process_group_id).participatory_processes.ids + spaces_user_can_admin[manifest_name].select { |arr| arr[1].in? processes_ids } + end end - html.html_safe - end - - def select_tag_participatory_spaces(space_type, spaces, child_form) - return unless spaces - - tag.div(class: "#{space_type.manifest_name}-block spaces-block-tag cell small-12 medium-6") do - child_form.select :ids, options_for_select(spaces), - { prompt: t("select_recipients_to_deliver.none", scope: "decidim.admin.newsletters"), - label: label_text_for(space_type), - include_hidden: false }, - multiple: true, size: spaces.size > 10 ? 10 : spaces.size, class: "chosen-select" - end - end - - def label_text_for(space_type) - if space_type.process_group_id - Decidim::ParticipatoryProcessGroup.find(space_type.process_group_id).title[current_locale] - else - t("activerecord.models.decidim/#{space_type.manifest_name.singularize}.other") - end - end - - def spaces_for_select(space_type) - return unless Decidim.participatory_space_manifests.map(&:name).include?(space_type.manifest_name.to_sym) - - collection = filter_spaces_by_process_group(space_type) - return collection unless current_user.admin? - - [[I18n.t("select_recipients_to_deliver.all_spaces", scope: "decidim.admin.newsletters"), "all"]] + collection end +end - def filter_spaces_by_process_group(space_type) - manifest_name = space_type.manifest_name.to_sym - return spaces_user_can_admin[manifest_name] unless manifest_name == :participatory_processes +::Decidim::Admin::NewslettersHelperDecorator.decorate - processes_ids = Decidim::ParticipatoryProcessGroup.find(space_type.process_group_id).participatory_processes.ids - spaces_user_can_admin[manifest_name].select { |arr| arr[1].in? processes_ids } - end -end +# rubocop:enable Metrics/CyclomaticComplexity +# rubocop:enable Metrics/PerceivedComplexity diff --git a/app/decorators/decidim/admin/selective_newsletter_form_decorator.rb b/app/decorators/decidim/admin/selective_newsletter_form_decorator.rb index 4a87d895..1e56ebf4 100644 --- a/app/decorators/decidim/admin/selective_newsletter_form_decorator.rb +++ b/app/decorators/decidim/admin/selective_newsletter_form_decorator.rb @@ -1,23 +1,29 @@ # frozen_string_literal: true -Decidim::Admin::SelectiveNewsletterForm.class_eval do - def map_model(_newsletter) - self.participatory_space_types = Decidim.participatory_space_manifests.map do |manifest| - Decidim::Admin::SelectiveNewsletterParticipatorySpaceTypeForm.from_model(manifest: manifest) - end - participatory_space_types.unshift(additional_participatory_space_manifest) - end +module Decidim::Admin::SelectiveNewsletterFormDecorator + def self.decorate + Decidim::Admin::SelectiveNewsletterForm.class_eval do + def map_model(_newsletter) + self.participatory_space_types = Decidim.participatory_space_manifests.map do |manifest| + Decidim::Admin::SelectiveNewsletterParticipatorySpaceTypeForm.from_model(manifest: manifest) + end + participatory_space_types.unshift(additional_participatory_space_manifest) + end - private + private - def additional_participatory_space_manifest - Decidim::Admin::SelectiveNewsletterParticipatorySpaceTypeForm.from_model( - manifest: Decidim.participatory_space_manifests.find { |m| m.name == :participatory_processes }, - process_group_id: process_group_id - ) - end + def additional_participatory_space_manifest + Decidim::Admin::SelectiveNewsletterParticipatorySpaceTypeForm.from_model( + manifest: Decidim.participatory_space_manifests.find { |m| m.name == :participatory_processes }, + process_group_id: process_group_id + ) + end - def process_group_id - Rails.application.config.process + def process_group_id + Rails.application.config.process + end + end end end + +::Decidim::Admin::SelectiveNewsletterFormDecorator.decorate diff --git a/app/decorators/decidim/admin/selective_newsletter_participatory_space_type_form_decorator.rb b/app/decorators/decidim/admin/selective_newsletter_participatory_space_type_form_decorator.rb index 32dab3bc..48615896 100644 --- a/app/decorators/decidim/admin/selective_newsletter_participatory_space_type_form_decorator.rb +++ b/app/decorators/decidim/admin/selective_newsletter_participatory_space_type_form_decorator.rb @@ -1,20 +1,26 @@ # frozen_string_literal: true -Decidim::Admin::SelectiveNewsletterParticipatorySpaceTypeForm.class_eval do - attribute :process_group_id, Integer +module Decidim::Admin::SelectiveNewsletterParticipatorySpaceTypeFormDecorator + def self.decorate + Decidim::Admin::SelectiveNewsletterParticipatorySpaceTypeForm.class_eval do + attribute :process_group_id, Integer - def map_model(model_hash) - manifest = model_hash[:manifest] - process_group_id = model_hash[:process_group_id] - process_group_id ||= regulations_group_id if manifest.name == :participatory_processes + def map_model(model_hash) + manifest = model_hash[:manifest] + process_group_id = model_hash[:process_group_id] + process_group_id ||= regulations_group_id if manifest.name == :participatory_processes - self.manifest_name = manifest.name.to_s - self.process_group_id = process_group_id - end + self.manifest_name = manifest.name.to_s + self.process_group_id = process_group_id + end - private + private - def regulations_group_id - Rails.application.config.regulation + def regulations_group_id + Rails.application.config.regulation + end + end end end + +::Decidim::Admin::SelectiveNewsletterParticipatorySpaceTypeFormDecorator.decorate diff --git a/app/decorators/decidim/organization_decorator.rb b/app/decorators/decidim/organization_decorator.rb index 250b9e48..e5224cad 100644 --- a/app/decorators/decidim/organization_decorator.rb +++ b/app/decorators/decidim/organization_decorator.rb @@ -1,11 +1,17 @@ # frozen_string_literal: true -Decidim::Organization.class_eval do - # rubocop:disable Layout/LineLength - # This association is an override to Decidim::Organization.users_with_any_role - has_many :users_with_any_role, lambda { - where.not(roles: []).or(where('"decidim_users"."id" in (select "decidim_participatory_process_user_roles"."decidim_user_id" from "decidim_participatory_process_user_roles")' \ - ' or "decidim_users"."id" in (select "decidim_assembly_user_roles"."decidim_user_id" from "decidim_assembly_user_roles")')) - }, foreign_key: "decidim_organization_id", class_name: "Decidim::User", dependent: :destroy - # rubocop:enable Layout/LineLength +module Decidim::OrganizationDecorator + def self.decorate + Decidim::Organization.class_eval do + # rubocop:disable Layout/LineLength + # This association is an override to Decidim::Organization.users_with_any_role + has_many :users_with_any_role, lambda { + where.not(roles: []).or(where('"decidim_users"."id" in (select "decidim_participatory_process_user_roles"."decidim_user_id" from "decidim_participatory_process_user_roles")' \ + ' or "decidim_users"."id" in (select "decidim_assembly_user_roles"."decidim_user_id" from "decidim_assembly_user_roles")')) + }, foreign_key: "decidim_organization_id", class_name: "Decidim::User", dependent: :destroy + # rubocop:enable Layout/LineLength + end + end end + +::Decidim::OrganizationDecorator.decorate diff --git a/app/decorators/decidim/participatory_space_context_decorator.rb b/app/decorators/decidim/participatory_space_context_decorator.rb index 040665f8..9722a134 100644 --- a/app/decorators/decidim/participatory_space_context_decorator.rb +++ b/app/decorators/decidim/participatory_space_context_decorator.rb @@ -1,14 +1,20 @@ # frozen_string_literal: true -Decidim::ParticipatorySpaceContext.class_eval do - # Method for current user can visit the space (assembly or proces) - def current_user_can_visit_space? - return true unless current_participatory_space.try(:private_space?) && - !current_participatory_space.try(:is_transparent?) - return false unless current_user +module Decidim::ParticipatorySpaceContextDecorator + def self.decorate + Decidim::ParticipatorySpaceContext.class_eval do + # Method for current user can visit the space (assembly or proces) + def current_user_can_visit_space? + return true unless current_participatory_space.try(:private_space?) && + !current_participatory_space.try(:is_transparent?) + return false unless current_user - current_user.admin || - current_participatory_space.users.include?(current_user) || - current_participatory_space.participatory_space_private_users.exists?(decidim_user_id: current_user.id) + current_user.admin || + current_participatory_space.users.include?(current_user) || + current_participatory_space.participatory_space_private_users.exists?(decidim_user_id: current_user.id) + end + end end end + +::Decidim::ParticipatorySpaceContextDecorator.decorate diff --git a/config/application.rb b/config/application.rb index dafb5237..c281b48d 100644 --- a/config/application.rb +++ b/config/application.rb @@ -17,7 +17,7 @@ class Application < Rails::Application config.railties_order = [:main_app, Decidim::DepartmentAdmin::Engine, :all] # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 5.2 + config.load_defaults 6.0 config.i18n.available_locales = %w(en ca es oc) config.time_zone = "Madrid" diff --git a/config/locales/oc_core.yml b/config/locales/oc_core.yml index 7f4354c7..633230c8 100644 --- a/config/locales/oc_core.yml +++ b/config/locales/oc_core.yml @@ -970,7 +970,6 @@ oc: show: allow_public_contact: Permetre que qualsevol participant m'envïi missatges directes, encara que no la segueixi. direct_messages: Rebre missatges directes de qualsevol - email_on_notification: Vull rebre un correu electrònic cada vegada que rebi una notificació. everything_followed: Tot el que segueixo newsletter_notifications: Voi arrecéber informacion sus l'activitat considerabla e es novetats deth portau. newsletters: Butlletins informatius diff --git a/decidim-home/config/locales/oc.yml b/decidim-home/config/locales/oc.yml index cd1b8723..33de2fe9 100644 --- a/decidim-home/config/locales/oc.yml +++ b/decidim-home/config/locales/oc.yml @@ -401,7 +401,6 @@ oc: no_notifications: Encara no hi ha notificacions. notifications_settings: show: - email_on_notification: Vull rebre un correu electrònic cada vegada que rebi una notificació. newsletter_notifications: Vull rebre butlletins update_notifications_settings: Guardar canvis update: diff --git a/decidim-process-extended/app/decorators/decidim/participatory_process_decorator.rb b/decidim-process-extended/app/decorators/decidim/participatory_process_decorator.rb index 6c0a8f27..a72f5c6e 100644 --- a/decidim-process-extended/app/decorators/decidim/participatory_process_decorator.rb +++ b/decidim-process-extended/app/decorators/decidim/participatory_process_decorator.rb @@ -1,7 +1,13 @@ # frozen_string_literal: true -Decidim::ParticipatoryProcess.class_eval do - belongs_to :decidim_type, - class_name: "DecidimType", - optional: true +module Decidim::ParticipatoryProcessDecorator + def self.decorate + Decidim::ParticipatoryProcess.class_eval do + belongs_to :decidim_type, + class_name: "DecidimType", + optional: true + end + end end + +::Decidim::ParticipatoryProcessDecorator.decorate diff --git a/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/copy_participatory_process_decorator.rb b/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/copy_participatory_process_decorator.rb index 6920fe79..3f75d410 100644 --- a/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/copy_participatory_process_decorator.rb +++ b/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/copy_participatory_process_decorator.rb @@ -1,36 +1,42 @@ # frozen_string_literal: true -Decidim::ParticipatoryProcesses::Admin::CopyParticipatoryProcess.class_eval do - def copy_participatory_process - @copied_process = Decidim::ParticipatoryProcess.create!( - organization: @participatory_process.organization, - title: form.title, - subtitle: @participatory_process.subtitle, - slug: form.slug, - hashtag: @participatory_process.hashtag, - description: @participatory_process.description, - short_description: @participatory_process.short_description, - promoted: @participatory_process.promoted, - scope: @participatory_process.scope, - developer_group: @participatory_process.developer_group, - local_area: @participatory_process.local_area, - area: @participatory_process.area, - target: @participatory_process.target, - participatory_scope: @participatory_process.participatory_scope, - participatory_structure: @participatory_process.participatory_structure, - meta_scope: @participatory_process.meta_scope, - start_date: @participatory_process.start_date, - end_date: @participatory_process.end_date, - participatory_process_group: @participatory_process.participatory_process_group, - private_space: @participatory_process.private_space, +module Decidim::ParticipatoryProcesses::Admin::CopyParticipatoryProcessDecorator + def self.decorate + Decidim::ParticipatoryProcesses::Admin::CopyParticipatoryProcess.class_eval do + def copy_participatory_process + @copied_process = Decidim::ParticipatoryProcess.create!( + organization: @participatory_process.organization, + title: form.title, + subtitle: @participatory_process.subtitle, + slug: form.slug, + hashtag: @participatory_process.hashtag, + description: @participatory_process.description, + short_description: @participatory_process.short_description, + promoted: @participatory_process.promoted, + scope: @participatory_process.scope, + developer_group: @participatory_process.developer_group, + local_area: @participatory_process.local_area, + area: @participatory_process.area, + target: @participatory_process.target, + participatory_scope: @participatory_process.participatory_scope, + participatory_structure: @participatory_process.participatory_structure, + meta_scope: @participatory_process.meta_scope, + start_date: @participatory_process.start_date, + end_date: @participatory_process.end_date, + participatory_process_group: @participatory_process.participatory_process_group, + private_space: @participatory_process.private_space, - # Participa added attributes - cost: @participatory_process.cost, - has_summary_record: @participatory_process.has_summary_record, - promoting_unit: @participatory_process.promoting_unit, - facilitators: @participatory_process.facilitators, - email: @participatory_process.email, - decidim_type_id: @participatory_process.decidim_type_id - ) + # Participa added attributes + cost: @participatory_process.cost, + has_summary_record: @participatory_process.has_summary_record, + promoting_unit: @participatory_process.promoting_unit, + facilitators: @participatory_process.facilitators, + email: @participatory_process.email, + decidim_type_id: @participatory_process.decidim_type_id + ) + end + end end end + +::Decidim::ParticipatoryProcesses::Admin::CopyParticipatoryProcessDecorator.decorate diff --git a/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/participatory_process_form_decorator.rb b/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/participatory_process_form_decorator.rb index 92a20b6c..03a0acf8 100644 --- a/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/participatory_process_form_decorator.rb +++ b/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/participatory_process_form_decorator.rb @@ -1,28 +1,34 @@ # frozen_string_literal: true -Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessForm.class_eval do - include Decidim::AttributeObject::Model +module Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessFormDecorator + def self.decorate + Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessForm.class_eval do + include Decidim::AttributeObject::Model - # Participa added attributes - attribute :facilitators, String - attribute :promoting_unit, String - attribute :cost, Float - attribute :has_summary_record, :boolean - attribute :type_id, Integer - attribute :email, String + # Participa added attributes + attribute :facilitators, String + attribute :promoting_unit, String + attribute :cost, Float + attribute :has_summary_record, :boolean + attribute :type_id, Integer + attribute :email, String - validates :type, presence: true, if: proc { |object| object.type_id.present? } + validates :type, presence: true, if: proc { |object| object.type_id.present? } - def map_model(model) - self.scope_id = model.decidim_scope_id - self.participatory_process_group_id = model.decidim_participatory_process_group_id - self.participatory_process_type_id = model.decidim_participatory_process_type_id - self.type_id = model.decidim_type_id - self.related_process_ids = model.linked_participatory_space_resources(:participatory_process, "related_processes").pluck(:id) - @processes = Decidim::ParticipatoryProcess.where(organization: model.organization).where.not(id: model.id) - end + def map_model(model) + self.scope_id = model.decidim_scope_id + self.participatory_process_group_id = model.decidim_participatory_process_group_id + self.participatory_process_type_id = model.decidim_participatory_process_type_id + self.type_id = model.decidim_type_id + self.related_process_ids = model.linked_participatory_space_resources(:participatory_process, "related_processes").pluck(:id) + @processes = Decidim::ParticipatoryProcess.where(organization: model.organization).where.not(id: model.id) + end - def type - @type ||= current_organization.types.find_by(id: type_id) + def type + @type ||= current_organization.types.find_by(id: type_id) + end + end end end + +::Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessFormDecorator.decorate diff --git a/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/participatory_processes_controller_decorator.rb b/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/participatory_processes_controller_decorator.rb index 40ea0f57..b00e2b92 100644 --- a/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/participatory_processes_controller_decorator.rb +++ b/decidim-process-extended/app/decorators/decidim/participatory_processes/admin/participatory_processes_controller_decorator.rb @@ -1,112 +1,123 @@ # frozen_string_literal: true -Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessesController.class_eval do - def update - enforce_permission_to :update, :process, process: current_participatory_process - @form = form(Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessForm).from_params( - participatory_process_params, - process_id: current_participatory_process.id - ) - - Decidim::ParticipatoryProcesses::Admin::UpdateParticipatoryProcess.call(current_participatory_process, @form) do - on(:ok) do |participatory_process| - # add "default" hero / banner image code - if participatory_process.attached_uploader(:hero_image).path.blank? - add_default_image_hero participatory_process.id - add_default_image_banner participatory_process.id +# rubocop:disable Metrics/CyclomaticComplexity +# rubocop:disable Metrics/PerceivedComplexity +module Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessesControllerDecorator + def self.decorate + Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessesController.class_eval do + def update + enforce_permission_to :update, :process, process: current_participatory_process + @form = form(Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessForm).from_params( + participatory_process_params, + process_id: current_participatory_process.id + ) + + Decidim::ParticipatoryProcesses::Admin::UpdateParticipatoryProcess.call(current_participatory_process, @form) do + on(:ok) do |participatory_process| + # add "default" hero / banner image code + if participatory_process.attached_uploader(:hero_image).path.blank? + add_default_image_hero participatory_process.id + add_default_image_banner participatory_process.id + end + flash[:notice] = I18n.t("participatory_processes.update.success", scope: "decidim.admin") + redirect_to edit_participatory_process_path(participatory_process) + end + + on(:invalid) do + flash.now[:alert] = I18n.t("participatory_processes.update.error", scope: "decidim.admin") + render :edit, layout: "decidim/admin/participatory_process" + end end - flash[:notice] = I18n.t("participatory_processes.update.success", scope: "decidim.admin") - redirect_to edit_participatory_process_path(participatory_process) end - on(:invalid) do - flash.now[:alert] = I18n.t("participatory_processes.update.error", scope: "decidim.admin") - render :edit, layout: "decidim/admin/participatory_process" + private + + def process_extended_root + @process_extended_root||= begin + all_railties= Rails.application.migration_railties + engine= all_railties.find { |railtie| railtie.railtie_name == "decidim_process_extended" } + engine.root + end end - end - end - private + def add_default_image_hero(id) + base_name = "image" - def process_extended_root - @process_extended_root||= begin - all_railties= Rails.application.migration_railties - engine= all_railties.find { |railtie| railtie.railtie_name == "decidim_process_extended" } - engine.root - end - end + default_images_path= process_extended_root.join("config", "default_images", "hero") - def add_default_image_hero(id) - base_name = "image" + # getting number of files (hero image folder) + number_of_files_hero = Dir.glob(File.join(default_images_path, "**", "*")).select { |file| File.file?(file) }.count - default_images_path= process_extended_root.join("config", "default_images", "hero") + last_image = Decidim::ParticipatoryProcess.where("hero_image like ?", "%#{base_name}%").last - # getting number of files (hero image folder) - number_of_files_hero = Dir.glob(File.join(default_images_path, "**", "*")).select { |file| File.file?(file) }.count + if last_image.nil? + last_image = "#{base_name}01.png" + else + last_image = last_image[:hero_image] + image_number = last_image[(base_name.length)..(base_name.length + 1)] - last_image = Decidim::ParticipatoryProcess.where("hero_image like ?", "%#{base_name}%").last + image_number = image_number.to_i + if image_number >= number_of_files_hero + image_number = 1 + else + image_number += 1 + end + + image_number = image_number.to_s.rjust(2, "0") + last_image = "#{base_name}#{image_number}.png" + end - if last_image.nil? - last_image = "#{base_name}01.png" - else - last_image = last_image[:hero_image] - image_number = last_image[(base_name.length)..(base_name.length + 1)] + ActiveRecord::Base.connection.execute("update decidim_participatory_processes SET hero_image = '#{last_image}' where id = #{id}") - image_number = image_number.to_i - if image_number >= number_of_files_hero - image_number = 1 - else - image_number += 1 + Decidim::ParticipatoryProcess.find(id).hero_image.attach( + io: File.open(File.join(default_images_path, last_image)), + filename: last_image, + content_type: "image/png" + ) end - image_number = image_number.to_s.rjust(2, "0") - last_image = "#{base_name}#{image_number}.png" - end + def add_default_image_banner(id) + base_name = "image" - ActiveRecord::Base.connection.execute("update decidim_participatory_processes SET hero_image = '#{last_image}' where id = #{id}") + default_images_path_b = process_extended_root.join("config", "default_images", "banner") - Decidim::ParticipatoryProcess.find(id).hero_image.attach( - io: File.open(File.join(default_images_path, last_image)), - filename: last_image, - content_type: "image/png" - ) - end + # getting number of files (banner image folder) + number_of_files_banner = Dir.glob(File.join(default_images_path_b, "**", "*")).select { |file| File.file?(file) }.count - def add_default_image_banner(id) - base_name = "image" + last_image = Decidim::ParticipatoryProcess.where("banner_image like ?", "%#{base_name}%").last - default_images_path_b = process_extended_root.join("config", "default_images", "banner") + # if image is null (nil), we assign the first one to put in database + if last_image.nil? + last_image = "#{base_name}01_b.png" + else + # if not, we take the number of the image and we add 1 to it + last_image = last_image[:banner_image] + image_number = last_image[(base_name.length)..(base_name.length + 1)] - # getting number of files (banner image folder) - number_of_files_banner = Dir.glob(File.join(default_images_path_b, "**", "*")).select { |file| File.file?(file) }.count + image_number = image_number.to_i + if image_number >= number_of_files_banner + image_number = 1 + else + image_number += 1 + end - last_image = Decidim::ParticipatoryProcess.where("banner_image like ?", "%#{base_name}%").last + image_number = image_number.to_s.rjust(2, "0") + last_image = "#{base_name}#{image_number}_b.png" + end - # if image is null (nil), we assign the first one to put in database - if last_image.nil? - last_image = "#{base_name}01_b.png" - else - # if not, we take the number of the image and we add 1 to it - last_image = last_image[:banner_image] - image_number = last_image[(base_name.length)..(base_name.length + 1)] + ActiveRecord::Base.connection.execute("update decidim_participatory_processes SET banner_image = '#{last_image}' where id = #{id}") - image_number = image_number.to_i - if image_number >= number_of_files_banner - image_number = 1 - else - image_number += 1 + Decidim::ParticipatoryProcess.find(id).banner_image.attach( + io: File.open(File.join(default_images_path_b, last_image)), + filename: last_image, + content_type: "image/png" + ) end - - image_number = image_number.to_s.rjust(2, "0") - last_image = "#{base_name}#{image_number}_b.png" end - - ActiveRecord::Base.connection.execute("update decidim_participatory_processes SET banner_image = '#{last_image}' where id = #{id}") - - Decidim::ParticipatoryProcess.find(id).banner_image.attach( - io: File.open(File.join(default_images_path_b, last_image)), - filename: last_image, - content_type: "image/png" - ) end end + +::Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessesControllerDecorator.decorate + +# rubocop:enable Metrics/CyclomaticComplexity +# rubocop:enable Metrics/PerceivedComplexity diff --git a/decidim-process-extended/app/decorators/decidim/participatory_processes/participatory_processes_controller_decorator.rb b/decidim-process-extended/app/decorators/decidim/participatory_processes/participatory_processes_controller_decorator.rb index 0272aeb9..e45855f2 100644 --- a/decidim-process-extended/app/decorators/decidim/participatory_processes/participatory_processes_controller_decorator.rb +++ b/decidim-process-extended/app/decorators/decidim/participatory_processes/participatory_processes_controller_decorator.rb @@ -1,27 +1,33 @@ # frozen_string_literal: true -Decidim::ParticipatoryProcesses::ParticipatoryProcessesController.class_eval do - def published_processes - # must return a Decidim::Query because later the Decidim::Query#| method is called, which is different from Array or ActiveRecord::Relation#| - @published_processes ||= Decidim::Query.new( - Decidim::ParticipatoryProcesses::OrganizationPublishedParticipatoryProcesses.new(current_organization, current_user) - .query.where(decidim_participatory_process_group_id: Rails.application.config.process) - ) - end +module Decidim::ParticipatoryProcesses::ParticipatoryProcessesControllerDecorator + def self.decorate + Decidim::ParticipatoryProcesses::ParticipatoryProcessesController.class_eval do + def published_processes + # must return a Decidim::Query because later the Decidim::Query#| method is called, which is different from Array or ActiveRecord::Relation#| + @published_processes ||= Decidim::Query.new( + Decidim::ParticipatoryProcesses::OrganizationPublishedParticipatoryProcesses.new(current_organization, current_user) + .query.where(decidim_participatory_process_group_id: Rails.application.config.process) + ) + end - # This is customized because GENCAT don't Processes Groups on Index Page - def collection - @collection ||= participatory_processes - end - # This is customized because GENCAT don't Processes Groups on Index Page + # This is customized because GENCAT don't Processes Groups on Index Page + def collection + @collection ||= participatory_processes + end + # This is customized because GENCAT don't Processes Groups on Index Page - def filtered_processes - search.result.where(decidim_participatory_process_group_id: Rails.application.config.process) - end + def filtered_processes + search.result.where(decidim_participatory_process_group_id: Rails.application.config.process) + end - # This is customized because GENCAT - def participatory_processes - @participatory_processes ||= filtered_processes.includes(attachments: :file_attachment) + # This is customized because GENCAT + def participatory_processes + @participatory_processes ||= filtered_processes.includes(attachments: :file_attachment) + end + # This is customized because GENCAT + end end - # This is customized because GENCAT end + +::Decidim::ParticipatoryProcesses::ParticipatoryProcessesControllerDecorator.decorate diff --git a/decidim-recaptcha/app/decorators/decidim/commands/create_registration_decorator.rb b/decidim-recaptcha/app/decorators/decidim/commands/create_registration_decorator.rb index 4ae953dc..7ff184c1 100644 --- a/decidim-recaptcha/app/decorators/decidim/commands/create_registration_decorator.rb +++ b/decidim-recaptcha/app/decorators/decidim/commands/create_registration_decorator.rb @@ -1,48 +1,37 @@ # frozen_string_literal: true -Decidim::CreateRegistration.class_eval do - def call - if form.invalid? - user = Decidim::User.has_pending_invitations?(form.current_organization.id, form.email) - user.invite!(user.invited_by) if user - return broadcast(:invalid) - end +module Decidim::Commands::CreateRegistrationDecorator + def self.decorate + Decidim::CreateRegistration.class_eval do + alias_method :original_create_user, :create_user + + def call + if form.invalid? + user = Decidim::User.has_pending_invitations?(form.current_organization.id, form.email) + user.invite!(user.invited_by) if user + return broadcast(:invalid) + end - # Recaptcha - create_user - recaptcha_valid = verify_recaptcha(model: @user, action: "registration", minimum_score: 0.9) + # Recaptcha + original_create_user + recaptcha_valid = verify_recaptcha(model: @user, action: "registration", minimum_score: 0.9) - if recaptcha_valid - if @user.save - broadcast(:ok, @user) - else + if recaptcha_valid + if @user.save + broadcast(:ok, @user) + else + broadcast(:invalid) + end + else + @form.errors.add(:recaptcha, t("recaptcha.errors.recaptcha_unreachable")) + broadcast(:invalid) + end + # Recaptcha + rescue ActiveRecord::RecordInvalid broadcast(:invalid) end - else - @form.errors.add(:recaptcha, t("recaptcha.errors.recaptcha_unreachable")) - broadcast(:invalid) end - # Recaptcha - rescue ActiveRecord::RecordInvalid - broadcast(:invalid) - end - - private - - def create_user - @user = Decidim::User.new( - email: form.email, - name: form.name, - nickname: form.nickname, - password: form.password, - password_confirmation: form.password_confirmation, - password_updated_at: Time.current, - organization: form.current_organization, - tos_agreement: form.tos_agreement, - newsletter_notifications_at: form.newsletter_at, - email_on_notification: true, - accepted_tos_version: form.current_organization.tos_version, - locale: form.current_locale - ) end end + +::Decidim::Commands::CreateRegistrationDecorator.decorate diff --git a/decidim-recaptcha/spec/system/registration_spec.rb b/decidim-recaptcha/spec/system/registration_spec.rb index bed830e2..a2bbd92a 100644 --- a/decidim-recaptcha/spec/system/registration_spec.rb +++ b/decidim-recaptcha/spec/system/registration_spec.rb @@ -2,6 +2,19 @@ require "spec_helper" +def fill_registration_form( + name: "Nikola Tesla", + nickname: "the-greatest-genius-in-history", + email: "nikola.tesla@example.org", + password: "sekritpass123" +) + fill_in :registration_user_name, with: name + fill_in :registration_user_nickname, with: nickname + fill_in :registration_user_email, with: email + fill_in :registration_user_password, with: password + fill_in :registration_user_password_confirmation, with: password +end + describe "Registration", type: :system do let(:organization) { create(:organization) } @@ -16,11 +29,21 @@ visit decidim.new_user_registration_path end - context "when signing up" do - describe "v3 recaptcha" do + describe "when signing up" do + context "with v3 recaptcha" do it "renders input" do expect(page).to have_css("#g-recaptcha-response-data-registration", visible: :hidden) end end + + it "signing up successfully" do + fill_registration_form(password: password) + page.check("registration_user_tos_agreement") + page.check("registration_user_newsletter") + within "form.new_user" do + find("*[type=submit]").click + end + expect(page).to have_content("A message with a confirmation link has been sent to your email address.") + end end end diff --git a/decidim-top_comments/app/decorators/decidim/debates/debates_controller_decorator.rb b/decidim-top_comments/app/decorators/decidim/debates/debates_controller_decorator.rb index 5b1a0e2f..007f7df6 100644 --- a/decidim-top_comments/app/decorators/decidim/debates/debates_controller_decorator.rb +++ b/decidim-top_comments/app/decorators/decidim/debates/debates_controller_decorator.rb @@ -1,5 +1,11 @@ # frozen_string_literal: true -Decidim::Debates::DebatesController.class_eval do - include ::Decidim::TopComments::PositiveNegativeComments +module Decidim::Debates::DebatesControllerDecorator + def self.decorate + Decidim::Debates::DebatesController.class_eval do + include ::Decidim::TopComments::PositiveNegativeComments + end + end end + +::Decidim::Debates::DebatesControllerDecorator.decorate diff --git a/decidim-top_comments/app/decorators/decidim/proposals/proposals_controller_decorator.rb b/decidim-top_comments/app/decorators/decidim/proposals/proposals_controller_decorator.rb index 17a182d1..59bee664 100644 --- a/decidim-top_comments/app/decorators/decidim/proposals/proposals_controller_decorator.rb +++ b/decidim-top_comments/app/decorators/decidim/proposals/proposals_controller_decorator.rb @@ -1,5 +1,11 @@ # frozen_string_literal: true -Decidim::Proposals::ProposalsController.class_eval do - include ::Decidim::TopComments::PositiveNegativeComments +module Decidim::Proposals::ProposalsControllerDecorator + def self.decorate + Decidim::Proposals::ProposalsController.class_eval do + include ::Decidim::TopComments::PositiveNegativeComments + end + end end + +::Decidim::Proposals::ProposalsControllerDecorator.decorate diff --git a/spec/system/feder_footer_spec.rb b/spec/system/feder_footer_spec.rb index da1dd890..c67d8a6a 100644 --- a/spec/system/feder_footer_spec.rb +++ b/spec/system/feder_footer_spec.rb @@ -10,11 +10,7 @@ visit decidim.root_path end - it "display feder logo on footer on homepage" do - expect(page).to have_content "Fons Europeu de Desenvolupament Regional" - end - - it "display feder logo on footer on user registration page" do + it "display feder logo on footer" do expect(page).to have_content "Fons Europeu de Desenvolupament Regional" end end