Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .env-example
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,6 @@ GEOCODER_UNITS=km # Units for geocoder results (e.g., km or m
# DECIDIM_AI_BASIC_AUTH="<USER>:<PASSWORD>" Required for the AI Request Handler
# DECIDIM_AI_REPORTING_USER_EMAIL="<EMAIL>"
# DECIDIM_AI_SECRET="<SECRET_KEY>" # Not required for the AI Request Handler

#= Enforce EUF completion after login
DECIDIM_FORCE_EUF_COMPLETION=true
1 change: 1 addition & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# frozen_string_literal: true

class ApplicationController < ActionController::Base
before_action :check_euf_completion, if: :current_user
end
13 changes: 13 additions & 0 deletions app/jobs/decidim/initiatives/check_published_initiatives.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

module Decidim
module Initiatives
class CheckPublishedInitiatives < ApplicationJob
queue_as :initiatives

def perform
system "rake decidim_initiatives:check_published"
end
end
end
end
13 changes: 13 additions & 0 deletions app/jobs/decidim/initiatives/check_validating_initiatives.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

module Decidim
module Initiatives
class CheckValidatingInitiatives < ApplicationJob
queue_as :initiatives

def perform
system "rake decidim_initiatives:check_validating"
end
end
end
end
13 changes: 13 additions & 0 deletions app/jobs/decidim/initiatives/notify_progress_initiatives.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

module Decidim
module Initiatives
class NotifyProgressInitiatives < ApplicationJob
queue_as :initiatives

def perform
system "rake decidim_initiatives:notify_progress"
end
end
end
end
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<!-- replace "erb[loud]:contains('filter_text_for(leaf.label')" --><%= filter_text_for(CGI.unescapeHTML(leaf.label), id: "dropdown-title-#{data_checkboxes_tree_id}") %>
<!-- replace "erb[loud]:contains('filter_text_for(leaf.label')" --><%= filter_text_for(CGI.unescapeHTML(leaf.label.to_s), id: "dropdown-title-#{data_checkboxes_tree_id}") %>
12 changes: 11 additions & 1 deletion app/packs/src/decidim/global_adjustments.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,21 @@ document.addEventListener("DOMContentLoaded", function () {
document.addEventListener("DOMContentLoaded", function () {
const signIn = document.querySelector('.main-bar a[href^="/users/sign_in"]')
const menuBarMobile = document.querySelector('header .main-bar__menu-mobile');
const menuBarMobileLink = document.querySelector('header .main-bar__links-mobile__login')
const menuBarMobileLink = document.querySelector('header .main-bar__links-mobile__login');
const button = document.querySelector('#main-dropdown-summary-mobile');

if (window.innerWidth <= 600 && signIn && screen.orientation.type === "portrait-primary"){
menuBarMobile.style.flexDirection = "column-reverse";
if (menuBarMobileLink) menuBarMobileLink.style.marginBottom = "1rem";

// hide or show signin when the dropdown-menu is clicked
button.addEventListener('click', () => {
if (menuBarMobile.style.flexDirection == "column-reverse") {
menuBarMobile.style.flexDirection = "row-reverse";
} else {
menuBarMobile.style.flexDirection = "column-reverse";
}
})
}
screen.orientation.addEventListener("change", () => {
if (screen.orientation.type === "landscape-primary"){
Expand Down
7 changes: 7 additions & 0 deletions config/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class Application < Rails::Application
require "extends/commands/decidim/participatory_processes/admin/copy_participatory_process_extends"
require "extends/commands/decidim/create_omniauth_registration_extends"
require "extends/commands/decidim/forms/admin/update_questionnaire_extends"
require "extends/commands/decidim/admin/content_blocks/update_content_block_extends"
# forms
require "extends/forms/decidim/assemblies/admin/assembly_copy_form_extends"
require "extends/forms/decidim/participatory_processes/admin/participatory_process_copy_form_extends"
Expand All @@ -31,7 +32,10 @@ class Application < Rails::Application
require "extends/forms/decidim/omniauth_registration_form_extends"
require "extends/forms/decidim/account_form_extends"
require "extends/forms/decidim/editor_image_form_extends"
require "extends/forms/decidim/admin/content_block_form_extends"
# controllers
require "extends/controllers/application_controller_extends"
require "extends/controllers/decidim/devise/invitations_controller_extends"
require "extends/controllers/decidim/admin/scopes_controller_extends"
require "extends/controllers/decidim/scopes_controller_extends"
require "extends/controllers/decidim/comments/comments_controller_extends"
Expand All @@ -43,6 +47,8 @@ class Application < Rails::Application
require "extends/controllers/decidim/budgets/projects_controller_extends"
require "extends/controllers/decidim/proposals/admin/proposal_states_controller_extends"
require "extends/controllers/decidim/proposals/proposals_controller_extends"
require "extends/controllers/decidim/assemblies/admin/assembly_landing_page_content_blocks_controller_extends"
require "extends/controllers/decidim/participatory_processes/admin/participatory_process_landing_page_content_blocks_controller_extends"
# helpers
require "extends/helpers/decidim/check_boxes_tree_helper_extends"
require "extends/helpers/decidim/omniauth_helper_extends"
Expand All @@ -57,6 +63,7 @@ class Application < Rails::Application
require "extends/models/decidim/accountability/result_extends"
require "extends/models/decidim/proposals/proposal_state_extends"
require "extends/models/decidim/searchable_author_extends"
require "extends/models/decidim/content_block_attachment_extends"
# permissions
require "extends/permissions/initiatives/permissions_extends"
# presenters
Expand Down
10 changes: 10 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ en:
<p>
You can't edit this information here.
</p>
update:
error: There was a problem updating your account.
success: Your account was successfully updated.
success_with_email_confirmation: Your account was successfully updated. You will receive an email to confirm your new email address.
admin:
actions:
add: Add
Expand All @@ -34,6 +38,9 @@ en:
attachments:
form:
send_notification_to_followers: Send a notification to all the people following the consultation who have agreed to receive email notifications
content_blocks:
update:
error: There was an error updating the content block
models:
assembly:
fields:
Expand Down Expand Up @@ -117,6 +124,9 @@ en:
email_outro: You received this notification because you are the author of the proposal. You can unfollow it by visiting the proposal page (" %{resource_title} ") and clicking on " Unfollow ".
email_subject: Your proposal has been published!
notification_title: Your proposal <a href="%{resource_path}">%{resource_title}</a> is now live.
extra_user_fields:
force_euf_completion:
alert: Please complete your profile before continuing. Required fields must be filled in.
forms:
questionnaire_answer_presenter:
download_attachment: Download attachment
Expand Down
10 changes: 10 additions & 0 deletions config/locales/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ fr:
<p>
Vous ne pouvez pas modifier ces informations ici.
</p>
update:
error: Une erreur s'est produite lors de la mise à jour de votre compte.
success: Votre compte a été mis à jour avec succès.
success_with_email_confirmation: Votre compte a été mis à jour avec succès. Vous recevrez un email pour confirmer votre nouvelle adresse.
admin:
actions:
add: Ajouter
Expand All @@ -42,6 +46,9 @@ fr:
attachments:
form:
send_notification_to_followers: Envoyer une notification à toutes les personnes qui suivent la concertation ayant accepté de recevoir des notifications par mail
content_blocks:
update:
error: Une erreur est survenue lors de la mise à jour du bloc de contenu.
models:
assembly:
fields:
Expand Down Expand Up @@ -125,6 +132,9 @@ fr:
email_outro: Vous recevez cette notification car vous êtes l’auteur de la proposition. Vous pouvez vous désabonner en visitant la page de la proposition (« %{resource_title} ») et en cliquant sur « Ne plus suivre ».
email_subject: Votre proposition a été publiée !
notification_title: Votre proposition <a href="%{resource_path}">%{resource_title}</a> est maintenant en ligne.
extra_user_fields:
force_euf_completion:
alert: Veuillez compléter votre profil avant de continuer. Les champs obligatoires doivent être renseignés.
forms:
questionnaire_answer_presenter:
download_attachment: Télécharger la pièce jointe
Expand Down
2 changes: 2 additions & 0 deletions config/secrets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ default: &default
<<: *decidim_default
participatory_processes:
sort_by_date: <%= ENV.fetch("SORT_PROCESSES_BY_DATE", "false") == "true" %>
extra_user_fields:
force_euf_completion: <%= ENV["DECIDIM_FORCE_EUF_COMPLETION"] == "true" %>
sidekiq:
concurrency: <%= Decidim::Env.new('SIDEKIQ_CONCURRENCY', '5').to_i %>
max_retries: <%= Decidim::Env.new('SIDEKIQ_MAX_RETRIES', '5').to_i %>
Expand Down
12 changes: 12 additions & 0 deletions config/sidekiq.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,18 @@
cron: "*/15 * * * *"
class: Decidim::ParticipatoryProcesses::ChangeActiveStepJob
queue: scheduled
CheckPublishedInitiatives:
cron: '0 1 * * *'
class: Decidim::Initiatives::CheckPublishedInitiatives
queue: initiatives
CheckValidatingInitiatives:
cron: '0 1 * * *'
class: Decidim::Initiatives::CheckValidatingInitiatives
queue: initiatives
NotifyProgressInitiatives:
cron: '0 1 * * *'
class: Decidim::Initiatives::NotifyProgressInitiatives
queue: initiatives

# Decidim-AI Spam Digest Jobs
AiSpamDigestDaily:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# frozen_string_literal: true

require "active_support/concern"

module UpdateContentBlockExtends
extend ActiveSupport::Concern

included do
private

def update_content_block_images
params = form.respond_to?(:image_params) ? form.image_params : (form.attributes["images"] || {})
content_block.manifest.images.each do |image_config|
image_name = image_config[:name]
val = params[image_name] || params[image_name.to_s]
if val
content_block.images_container.send("#{image_name}=", val)
elsif params[:"remove_#{image_name}"] == "1" || params["remove_#{image_name}"] == "1"
content_block.images_container.send("#{image_name}=", nil)
end
end
end
end
end

Decidim::Admin::ContentBlocks::UpdateContentBlock.include(UpdateContentBlockExtends)
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ def call

return broadcast(:ok, @user)
end

prefill_euf_fields_from_existing_user

return broadcast(:invalid) if form.invalid?

transaction do
Expand All @@ -33,6 +36,24 @@ def manage_user_confirmation
# send welcome notification and email
@user.after_confirmation if verified_email
end

private

def prefill_euf_fields_from_existing_user
existing_user = Decidim::User.find_by(
email: form.email,
organization: form.current_organization
)
return unless existing_user

existing_data = existing_user.extended_data.presence || {}
%w(phone_number country postal_code date_of_birth gender location underage).each do |field|
next unless form.respond_to?(:"#{field}=")
next if existing_data[field].blank?

form.public_send(:"#{field}=", existing_data[field])
end
end
end

Decidim::CreateOmniauthRegistration.class_eval do
Expand Down
61 changes: 61 additions & 0 deletions lib/extends/controllers/application_controller_extends.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# frozen_string_literal: true

module ApplicationControllerExtends
extend ActiveSupport::Concern

included do
before_action :check_euf_completion, if: :current_user

private

def check_euf_completion
return unless euf_completion_enforced?
return if euf_whitelisted_path?

missing_field = first_missing_euf_field(current_user)
return unless missing_field

existing = session["user_return_to"]
stored = if existing.present?
existing
elsif safe_euf_redirect_path?
request.fullpath
end
session[:euf_redirect_url] = stored if stored.present?
flash[:alert] = t("decidim.extra_user_fields.force_euf_completion.alert")
redirect_to "#{decidim.account_path}#user_#{missing_field}"
end

def euf_completion_enforced?
Rails.application.secrets.dig(:decidim, :extra_user_fields, :force_euf_completion)
end

def euf_whitelisted_path?
whitelisted_paths = ["/account", "/users/sign_out", "/rails/active_storage", "/decidim-packs"]
whitelisted_paths.any? { |path| request.path.start_with?(path) }
end

def safe_euf_redirect_path?
path = request.fullpath
return false if path.include?("invitation_token")
return false if path.include?("users/auth")
return false if path.start_with?("/users/")

true
end

def first_missing_euf_field(user)
return if user.admin?
return unless current_organization.extra_user_fields_enabled?

[:country, :postal_code, :date_of_birth, :gender, :phone_number, :location, :underage].find do |field|
current_organization.activated_extra_field?(field) &&
user.extended_data[field.to_s].blank?
end
end
end
end

ApplicationController.class_eval do
include(ApplicationControllerExtends)
end
Loading
Loading