decidim-core 0.27.4 → 0.27.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/cells/decidim/activity_cell.rb +2 -2
- data/app/cells/decidim/card_cell.rb +2 -2
- data/app/cells/decidim/card_m/top.erb +1 -1
- data/app/cells/decidim/card_m_cell.rb +1 -1
- data/app/cells/decidim/scopes_picker/scope_picker_values.erb +1 -1
- data/app/cells/decidim/tags_cell.rb +3 -1
- data/app/cells/decidim/upload_modal/modal.erb +4 -1
- data/app/cells/decidim/upload_modal_cell.rb +8 -4
- data/app/cells/decidim/user_profile_cell.rb +1 -1
- data/app/cells/decidim/version_cell.rb +1 -1
- data/app/cells/decidim/versions_list_cell.rb +1 -1
- data/app/commands/decidim/create_omniauth_registration.rb +2 -4
- data/app/commands/decidim/endorse_resource.rb +2 -0
- data/app/commands/decidim/messaging/reply_to_conversation.rb +3 -0
- data/app/commands/decidim/messaging/start_conversation.rb +3 -0
- data/app/commands/decidim/search.rb +1 -1
- data/app/commands/decidim/unendorse_resource.rb +1 -1
- data/app/controllers/concerns/decidim/devise_authentication_methods.rb +36 -0
- data/app/controllers/concerns/decidim/force_authentication.rb +6 -2
- data/app/controllers/concerns/decidim/paginable.rb +1 -1
- data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +1 -22
- data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
- data/app/controllers/decidim/devise/sessions_controller.rb +1 -24
- data/app/controllers/decidim/links_controller.rb +1 -1
- data/app/controllers/decidim/searches_controller.rb +1 -1
- data/app/controllers/decidim/user_timeline_controller.rb +1 -1
- data/app/controllers/decidim/widgets_controller.rb +6 -0
- data/app/events/decidim/welcome_notification_event.rb +6 -9
- data/app/forms/decidim/account_form.rb +1 -1
- data/app/forms/decidim/notifications_settings_form.rb +0 -8
- data/app/forms/decidim/registration_form.rb +1 -1
- data/app/helpers/decidim/cells_paginate_helper.rb +1 -1
- data/app/helpers/decidim/check_boxes_tree_helper.rb +4 -4
- data/app/helpers/decidim/decidim_form_helper.rb +1 -0
- data/app/helpers/decidim/newsletters_helper.rb +83 -16
- data/app/helpers/decidim/omniauth_helper.rb +2 -0
- data/app/helpers/decidim/resource_helper.rb +3 -1
- data/app/helpers/decidim/sanitize_helper.rb +9 -0
- data/app/helpers/decidim/short_link_helper.rb +1 -1
- data/app/helpers/decidim/user_profile_helper.rb +7 -2
- data/app/jobs/decidim/download_your_data_export_job.rb +2 -1
- data/app/jobs/decidim/open_data_job.rb +2 -0
- data/app/mailers/decidim/messaging/conversation_mailer.rb +3 -72
- data/app/models/decidim/push_notification_message.rb +39 -0
- data/app/models/decidim/user.rb +9 -1
- data/app/packs/images/decidim/icons.svg +1 -1
- data/app/packs/images/decidim/vendor/social-share-button/x.svg +6 -0
- data/app/packs/src/decidim/autocomplete.js +11 -2
- data/app/packs/src/decidim/data_picker.js +1 -0
- data/app/packs/src/decidim/direct_uploads/upload_field.js +6 -4
- data/app/packs/src/decidim/direct_uploads/upload_modal.js +10 -8
- data/app/packs/src/decidim/direct_uploads/uploader.js +4 -1
- data/app/packs/src/decidim/geocoding/attach_input.js +4 -1
- data/app/packs/src/decidim/geocoding/provider/here.js +17 -21
- data/app/packs/src/decidim/geocoding/provider/photon.js +1 -1
- data/app/packs/src/decidim/input_hashtags.js +1 -1
- data/app/packs/src/decidim/input_mentions.js +1 -1
- data/app/packs/src/decidim/input_multiple_mentions.js +1 -1
- data/app/packs/src/decidim/utilities/text.js +17 -0
- data/app/packs/src/decidim/vizzs/index.js +1 -1
- data/app/packs/stylesheets/decidim/_variables.scss +1 -1
- data/app/packs/stylesheets/decidim/plugins/leaflet.scss +118 -114
- data/app/packs/stylesheets/decidim/vendor/_social_share_button.scss +4 -0
- data/app/presenters/decidim/admin_log/oauth_application_resource_presenter.rb +1 -1
- data/app/presenters/decidim/notification_to_mailer_presenter.rb +9 -0
- data/app/services/decidim/events_manager.rb +6 -0
- data/app/services/decidim/push_notification_message_sender.rb +36 -0
- data/app/services/decidim/send_push_notification.rb +22 -8
- data/app/views/decidim/devise/registrations/new.html.erb +2 -2
- data/app/views/decidim/notifications_digest_mailer/_email_content.html.erb +7 -0
- data/app/views/decidim/notifications_settings/show.html.erb +1 -1
- data/app/views/decidim/scopes/_scopes_picker_input.html.erb +1 -1
- data/app/views/decidim/searches/_filters.html.erb +3 -1
- data/app/views/decidim/shared/_address_details.html.erb +2 -2
- data/app/views/decidim/shared/_share_modal.html.erb +1 -1
- data/app/views/decidim/shared/participatory_space_filters/_filters.html.erb +1 -1
- data/app/views/layouts/decidim/_js_configuration.html.erb +1 -0
- data/app/views/layouts/decidim/_social_media_links.html.erb +2 -2
- data/config/locales/ar.yml +12 -16
- data/config/locales/bg.yml +77 -15
- data/config/locales/ca.yml +34 -30
- data/config/locales/cs.yml +18 -14
- data/config/locales/de.yml +62 -58
- data/config/locales/el.yml +11 -16
- data/config/locales/en.yml +5 -1
- data/config/locales/eo.yml +2 -3
- data/config/locales/es-MX.yml +15 -11
- data/config/locales/es-PY.yml +15 -11
- data/config/locales/es.yml +30 -26
- data/config/locales/eu.yml +500 -342
- data/config/locales/fi-plain.yml +7 -3
- data/config/locales/fi.yml +21 -17
- data/config/locales/fr-CA.yml +17 -13
- data/config/locales/fr.yml +12 -8
- data/config/locales/ga-IE.yml +5 -5
- data/config/locales/gl.yml +5 -19
- data/config/locales/he-IL.yml +1 -0
- data/config/locales/hu.yml +63 -23
- data/config/locales/id-ID.yml +4 -19
- data/config/locales/is-IS.yml +4 -2
- data/config/locales/it.yml +15 -17
- data/config/locales/ja.yml +26 -22
- data/config/locales/lb.yml +15 -17
- data/config/locales/lt.yml +55 -10
- data/config/locales/lv.yml +4 -16
- data/config/locales/nl.yml +12 -12
- data/config/locales/no.yml +8 -10
- data/config/locales/pl.yml +151 -1
- data/config/locales/pt-BR.yml +267 -22
- data/config/locales/pt.yml +8 -10
- data/config/locales/ro-RO.yml +4 -10
- data/config/locales/ru.yml +13 -17
- data/config/locales/sk.yml +7 -17
- data/config/locales/sl.yml +0 -5
- data/config/locales/sq-AL.yml +1 -0
- data/config/locales/sv.yml +55 -17
- data/config/locales/th-TH.yml +1 -0
- data/config/locales/tr-TR.yml +18 -15
- data/config/locales/uk.yml +17 -14
- data/config/locales/zh-CN.yml +6 -10
- data/config/locales/zh-TW.yml +0 -9
- data/db/migrate/20231027142329_change_default_value_for_decidim_endorsements.rb +11 -0
- data/db/seeds.rb +1 -0
- data/decidim-core.gemspec +78 -0
- data/lib/decidim/acts_as_tree.rb +14 -1
- data/lib/decidim/asset_router/storage.rb +4 -0
- data/lib/decidim/attribute_encryptor.rb +6 -4
- data/lib/decidim/core/engine.rb +7 -3
- data/lib/decidim/core/test/factories.rb +309 -95
- data/lib/decidim/core/test/shared_examples/amendable/amendment_created_event_examples.rb +6 -26
- data/lib/decidim/core/test/shared_examples/amendable/amendment_promoted_event_examples.rb +8 -26
- data/lib/decidim/core/test/shared_examples/comments_examples.rb +56 -0
- data/lib/decidim/core/test/shared_examples/embed_resource_examples.rb +187 -11
- data/lib/decidim/core/test/shared_examples/errors.rb +2 -0
- data/lib/decidim/core/test/shared_examples/has_attachment_collections.rb +8 -6
- data/lib/decidim/core/test/shared_examples/has_attachments.rb +4 -4
- data/lib/decidim/core/test/shared_examples/has_category.rb +27 -0
- data/lib/decidim/core/test/shared_examples/has_reference.rb +1 -1
- data/lib/decidim/core/test/shared_examples/has_space_in_mcell_examples.rb +1 -2
- data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +6 -3
- data/lib/decidim/core/test/shared_examples/resource_locator_presenter_examples.rb +134 -0
- data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +1 -1
- data/lib/decidim/core/test/shared_examples/simple_event.rb +50 -2
- data/lib/decidim/core/test.rb +1 -0
- data/lib/decidim/core/version.rb +1 -1
- data/lib/decidim/core.rb +2 -1
- data/lib/decidim/endorsable.rb +1 -1
- data/lib/decidim/engine_router.rb +17 -4
- data/lib/decidim/events/base_event.rb +5 -2
- data/lib/decidim/events/simple_event.rb +3 -17
- data/lib/decidim/exporters.rb +10 -1
- data/lib/decidim/form_builder.rb +1 -0
- data/lib/decidim/has_category.rb +3 -3
- data/lib/decidim/has_conversations.rb +91 -0
- data/lib/decidim/participable.rb +17 -0
- data/lib/decidim/view_model.rb +1 -0
- data/lib/decidim/webpacker/webpack/.modernizrrc +9 -0
- data/lib/premailer/adapter/decidim.rb +5 -4
- data/lib/tasks/decidim_reminders_tasks.rake +1 -0
- data/lib/tasks/upgrade/decidim_deduplicate_endorsements.rake +53 -0
- data/lib/tasks/upgrade/decidim_fix_categorization.rake +15 -0
- data/lib/tasks/upgrade/decidim_fix_short_url_resolver.rake +22 -0
- metadata +37 -32
- data/app/helpers/decidim/layout_helper.rb.orig +0 -225
- data/app/packs/stylesheets/decidim/modules/_dropdown_menu.scss +0 -9
- data/app/views/decidim/devise/registrations/new.html.erb.orig +0 -231
- /data/{config/environment.rb → app/packs/images/decidim/.keep} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99119ce695e1aa34d4a744deca10b822209b52253058e77548a6399cd78f0069
|
4
|
+
data.tar.gz: '052746495077e884e4cb8e5bc33c8bcb6af257efbee57b385b39f62404530fd5'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5b7a3d7779697415e7ec9badd7d4d00bd408a1f42e7c667f01b797558ba22524231273b94f3f6beeb644f7aee8692bd5d2d580a7493c84dfaa5eb563241bc58
|
7
|
+
data.tar.gz: 193b200909cc1fa784ccad5583b3c9593b8e6a9be31c10ab03c90ee9153075ac0d168566e7fe275bb9140c1bc53a8a42e58f84ffc9b852fe91269deef496d5a3
|
@@ -28,11 +28,11 @@ module Decidim
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def title
|
31
|
-
model.try(:title) || model.try(:name) || ""
|
31
|
+
decidim_escape_translated(model.try(:title) || model.try(:name) || "")
|
32
32
|
end
|
33
33
|
|
34
34
|
def body
|
35
|
-
model.try(:body) || model.try(:about) || ""
|
35
|
+
decidim_escape_translated(model.try(:body) || model.try(:about) || "")
|
36
36
|
end
|
37
37
|
|
38
38
|
def resource_manifest
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<div class="card__top">
|
2
2
|
<% if render_space? %>
|
3
3
|
<div class="card__content text-small">
|
4
|
-
<span class="muted"><%= searchable_resource_human_name(model.participatory_space.class, count: 1) %>:</span> <%= link_to
|
4
|
+
<span class="muted"><%= searchable_resource_human_name(model.participatory_space.class, count: 1) %>:</span> <%= link_to decidim_escape_translated(model.participatory_space.title), Decidim::ResourceLocatorPresenter.new(model.participatory_space).path, class: "card__link text-ellipsis" %>
|
5
5
|
</div>
|
6
6
|
<% end %>
|
7
7
|
</div>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<div class="picker-values">
|
2
2
|
<%- scopes.each do |scope, params| %>
|
3
|
-
<div><%= link_to params[:text], params[:url], data: { picker_value: scope.id } %></div>
|
3
|
+
<div><%= link_to decidim_html_escape(params[:text]), params[:url], data: { picker_value: scope.id } %></div>
|
4
4
|
<% end %>
|
5
5
|
</div>
|
@@ -9,6 +9,8 @@ module Decidim
|
|
9
9
|
# <%= cell("decidim/category", model.category, context: {resource: model}) %>
|
10
10
|
#
|
11
11
|
class TagsCell < Decidim::ViewModel
|
12
|
+
include Decidim::SanitizeHelper
|
13
|
+
|
12
14
|
def show
|
13
15
|
render if category? || scope?
|
14
16
|
end
|
@@ -51,7 +53,7 @@ module Decidim
|
|
51
53
|
end
|
52
54
|
|
53
55
|
def category_name
|
54
|
-
model.category.translated_name
|
56
|
+
decidim_html_escape model.category.translated_name
|
55
57
|
end
|
56
58
|
|
57
59
|
def category_path
|
@@ -35,7 +35,10 @@
|
|
35
35
|
label: false,
|
36
36
|
multiple: true,
|
37
37
|
direct_upload: true,
|
38
|
-
data: {
|
38
|
+
data: {
|
39
|
+
direct_upload_url: direct_upload_url,
|
40
|
+
upload_validations_url: upload_validations_url
|
41
|
+
} %>
|
39
42
|
<span><%= t("decidim.forms.upload_help.dropzone") %></span>
|
40
43
|
</label>
|
41
44
|
</div>
|
@@ -156,15 +156,15 @@ module Decidim
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def truncated_file_name_for(attachment, max_length = 31)
|
159
|
-
filename =
|
160
|
-
return filename if filename.length <= max_length
|
159
|
+
filename = determine_filename(attachment)
|
160
|
+
return decidim_html_escape(filename).html_safe if filename.length <= max_length
|
161
161
|
|
162
162
|
name = File.basename(filename, File.extname(filename))
|
163
|
-
name.truncate(max_length, omission: "...#{name.last((max_length / 2) - 3)}#{File.extname(filename)}")
|
163
|
+
decidim_html_escape(name.truncate(max_length, omission: "...#{name.last((max_length / 2) - 3)}#{File.extname(filename)}")).html_safe
|
164
164
|
end
|
165
165
|
|
166
166
|
def file_name_for(attachment)
|
167
|
-
determine_filename(attachment)
|
167
|
+
decidim_html_escape(determine_filename(attachment)).html_safe
|
168
168
|
end
|
169
169
|
|
170
170
|
def determine_filename(attachment)
|
@@ -205,6 +205,10 @@ module Decidim
|
|
205
205
|
Rails.application.class.routes.url_helpers.rails_direct_uploads_path
|
206
206
|
end
|
207
207
|
|
208
|
+
def upload_validations_url
|
209
|
+
Decidim::Core::Engine.routes.url_helpers.upload_validations_path
|
210
|
+
end
|
211
|
+
|
208
212
|
def form_object_class
|
209
213
|
form.object.class.to_s
|
210
214
|
end
|
@@ -57,14 +57,12 @@ module Decidim
|
|
57
57
|
# to be marked confirmed.
|
58
58
|
@user.skip_confirmation! if !@user.confirmed? && @user.email == verified_email
|
59
59
|
else
|
60
|
-
generated_password = SecureRandom.hex
|
61
|
-
|
62
60
|
@user.email = (verified_email || form.email)
|
63
61
|
@user.name = form.name
|
64
62
|
@user.nickname = form.normalized_nickname
|
65
63
|
@user.newsletter_notifications_at = nil
|
66
|
-
@user.password =
|
67
|
-
@user.password_confirmation =
|
64
|
+
@user.password = SecureRandom.hex
|
65
|
+
@user.password_confirmation = @user.password
|
68
66
|
if form.avatar_url.present?
|
69
67
|
url = URI.parse(form.avatar_url)
|
70
68
|
filename = File.basename(url.path)
|
@@ -54,11 +54,13 @@ module Decidim
|
|
54
54
|
notify(manager) do
|
55
55
|
ConversationMailer.new_group_message(sender, manager, conversation, message, recipient).deliver_later
|
56
56
|
end
|
57
|
+
Decidim::PushNotificationMessageSender.new.new_group_message(sender, manager, conversation, message, recipient).deliver
|
57
58
|
end
|
58
59
|
else
|
59
60
|
notify(recipient) do
|
60
61
|
ConversationMailer.new_message(sender, recipient, conversation, message).deliver_later
|
61
62
|
end
|
63
|
+
Decidim::PushNotificationMessageSender.new.new_message(sender, recipient, conversation, message).deliver
|
62
64
|
end
|
63
65
|
end
|
64
66
|
end
|
@@ -68,6 +70,7 @@ module Decidim
|
|
68
70
|
notify(recipient) do
|
69
71
|
ConversationMailer.comanagers_new_message(sender, recipient, conversation, message, form.context.current_user).deliver_later
|
70
72
|
end
|
73
|
+
Decidim::PushNotificationMessageSender.new.comanagers_new_message(sender, recipient, conversation, message, form.context.current_user).deliver
|
71
74
|
end
|
72
75
|
end
|
73
76
|
|
@@ -54,11 +54,13 @@ module Decidim
|
|
54
54
|
notify(manager) do
|
55
55
|
ConversationMailer.new_group_conversation(originator, manager, conversation, recipient).deliver_later
|
56
56
|
end
|
57
|
+
Decidim::PushNotificationMessageSender.new.new_group_conversation(originator, manager, conversation, recipient).deliver
|
57
58
|
end
|
58
59
|
else
|
59
60
|
notify(recipient) do
|
60
61
|
ConversationMailer.new_conversation(originator, recipient, conversation).deliver_later
|
61
62
|
end
|
63
|
+
Decidim::PushNotificationMessageSender.new.new_conversation(originator, recipient, conversation).deliver
|
62
64
|
end
|
63
65
|
end
|
64
66
|
end
|
@@ -68,6 +70,7 @@ module Decidim
|
|
68
70
|
notify(recipient) do
|
69
71
|
ConversationMailer.comanagers_new_conversation(originator, recipient, conversation, form.context.current_user).deliver_later
|
70
72
|
end
|
73
|
+
Decidim::PushNotificationMessageSender.new.comanagers_new_conversation(originator, recipient, conversation, form.context.current_user).deliver
|
71
74
|
end
|
72
75
|
end
|
73
76
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Decidim
|
4
4
|
# A command that will act as a search service, with all the business logic for performing searches.
|
5
5
|
class Search < Decidim::Command
|
6
|
-
ACCEPTED_FILTERS = [:
|
6
|
+
ACCEPTED_FILTERS = [:decidim_scope_id_in].freeze
|
7
7
|
HIGHLIGHTED_RESULTS_COUNT = 4
|
8
8
|
|
9
9
|
# Public: Initializes the command.
|
@@ -31,7 +31,7 @@ module Decidim
|
|
31
31
|
query = if @current_group.present?
|
32
32
|
@resource.endorsements.where(decidim_user_group_id: @current_group&.id)
|
33
33
|
else
|
34
|
-
@resource.endorsements.where(author: @current_user, decidim_user_group_id:
|
34
|
+
@resource.endorsements.where(author: @current_user, decidim_user_group_id: 0)
|
35
35
|
end
|
36
36
|
query.destroy_all
|
37
37
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Decidim
|
6
|
+
module DeviseAuthenticationMethods
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
include Decidim::UserBlockedChecker
|
9
|
+
|
10
|
+
included do
|
11
|
+
def after_sign_in_path_for(user)
|
12
|
+
if user.present? && user.blocked?
|
13
|
+
check_user_block_status(user)
|
14
|
+
elsif user.needs_password_update?
|
15
|
+
change_password_path
|
16
|
+
elsif first_login_and_not_authorized?(user) && !user.admin? && !pending_redirect?(user)
|
17
|
+
decidim_verifications.first_login_authorizations_path
|
18
|
+
else
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Calling the `stored_location_for` method removes the key, so in order
|
24
|
+
# to check if there is any pending redirect after login I need to call
|
25
|
+
# this method and use the value to set a pending redirect. This is the
|
26
|
+
# only way to do this without checking the session directly.
|
27
|
+
def pending_redirect?(user)
|
28
|
+
store_location_for(user, stored_location_for(user))
|
29
|
+
end
|
30
|
+
|
31
|
+
def first_login_and_not_authorized?(user)
|
32
|
+
user.is_a?(User) && user.sign_in_count == 1 && current_organization.available_authorizations.any? && user.verifiable?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -35,11 +35,15 @@ module Decidim
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def unauthorized_paths
|
38
|
-
|
39
|
-
%w(/locale) + Decidim::StaticPage.where(
|
38
|
+
default_unauthorized_paths + Decidim::StaticPage.where(
|
40
39
|
organization: current_organization,
|
41
40
|
allow_public_access: true
|
42
41
|
).pluck(Arel.sql("CONCAT('/pages/', slug)"))
|
43
42
|
end
|
43
|
+
|
44
|
+
def default_unauthorized_paths
|
45
|
+
# /locale is for changing the locale and /manifest.webmanifest to request PWA manifest
|
46
|
+
%w(/locale /manifest.webmanifest)
|
47
|
+
end
|
44
48
|
end
|
45
49
|
end
|
@@ -6,6 +6,7 @@ module Decidim
|
|
6
6
|
class OmniauthRegistrationsController < ::Devise::OmniauthCallbacksController
|
7
7
|
include FormFactory
|
8
8
|
include Decidim::DeviseControllers
|
9
|
+
include Decidim::DeviseAuthenticationMethods
|
9
10
|
|
10
11
|
def new
|
11
12
|
@form = form(OmniauthRegistrationForm).from_params(params[:user])
|
@@ -45,28 +46,6 @@ module Decidim
|
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
48
|
-
def after_sign_in_path_for(user)
|
49
|
-
if user.present? && user.blocked?
|
50
|
-
check_user_block_status(user)
|
51
|
-
elsif !pending_redirect?(user) && first_login_and_not_authorized?(user)
|
52
|
-
decidim_verifications.authorizations_path
|
53
|
-
else
|
54
|
-
super
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# Calling the `stored_location_for` method removes the key, so in order
|
59
|
-
# to check if there's any pending redirect after login I need to call
|
60
|
-
# this method and use the value to set a pending redirect. This is the
|
61
|
-
# only way to do this without checking the session directly.
|
62
|
-
def pending_redirect?(user)
|
63
|
-
store_location_for(user, stored_location_for(user))
|
64
|
-
end
|
65
|
-
|
66
|
-
def first_login_and_not_authorized?(user)
|
67
|
-
user.is_a?(User) && user.sign_in_count == 1 && Decidim::Verifications.workflows.any? && user.verifiable?
|
68
|
-
end
|
69
|
-
|
70
49
|
def action_missing(action_name)
|
71
50
|
return send(:create) if devise_mapping.omniauthable? && current_organization.enabled_omniauth_providers.keys.include?(action_name.to_sym)
|
72
51
|
|
@@ -5,6 +5,7 @@ module Decidim
|
|
5
5
|
# Custom Devise SessionsController to avoid namespace problems.
|
6
6
|
class SessionsController < ::Devise::SessionsController
|
7
7
|
include Decidim::DeviseControllers
|
8
|
+
include Decidim::DeviseAuthenticationMethods
|
8
9
|
|
9
10
|
before_action :check_sign_in_enabled, only: :create
|
10
11
|
|
@@ -35,30 +36,6 @@ module Decidim
|
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
38
|
-
def after_sign_in_path_for(user)
|
39
|
-
if user.present? && user.blocked?
|
40
|
-
check_user_block_status(user)
|
41
|
-
elsif user.needs_password_update?
|
42
|
-
change_password_path
|
43
|
-
elsif first_login_and_not_authorized?(user) && !user.admin? && !pending_redirect?(user)
|
44
|
-
decidim_verifications.first_login_authorizations_path
|
45
|
-
else
|
46
|
-
super
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
# Calling the `stored_location_for` method removes the key, so in order
|
51
|
-
# to check if there's any pending redirect after login I need to call
|
52
|
-
# this method and use the value to set a pending redirect. This is the
|
53
|
-
# only way to do this without checking the session directly.
|
54
|
-
def pending_redirect?(user)
|
55
|
-
store_location_for(user, stored_location_for(user))
|
56
|
-
end
|
57
|
-
|
58
|
-
def first_login_and_not_authorized?(user)
|
59
|
-
user.is_a?(User) && user.sign_in_count == 1 && current_organization.available_authorizations.any? && user.verifiable?
|
60
|
-
end
|
61
|
-
|
62
39
|
def after_sign_out_path_for(user)
|
63
40
|
request.referer || super
|
64
41
|
end
|
@@ -12,7 +12,7 @@ module Decidim
|
|
12
12
|
helper_method :activities, :resource_types, :user
|
13
13
|
|
14
14
|
def index
|
15
|
-
raise ActionController::RoutingError, "Not Found"
|
15
|
+
raise ActionController::RoutingError, "Not Found" unless user && current_user == user
|
16
16
|
end
|
17
17
|
|
18
18
|
private
|
@@ -11,6 +11,8 @@ module Decidim
|
|
11
11
|
helper_method :model, :iframe_url, :current_participatory_space
|
12
12
|
|
13
13
|
def show
|
14
|
+
raise ActionController::RoutingError, "Not Found" if model.nil?
|
15
|
+
|
14
16
|
respond_to do |format|
|
15
17
|
format.js { render "decidim/widgets/show" }
|
16
18
|
format.html
|
@@ -19,6 +21,10 @@ module Decidim
|
|
19
21
|
|
20
22
|
private
|
21
23
|
|
24
|
+
def current_component
|
25
|
+
@current_component ||= request.env["decidim.current_component"]
|
26
|
+
end
|
27
|
+
|
22
28
|
def current_participatory_space
|
23
29
|
@current_participatory_space ||= model.component.participatory_space
|
24
30
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "mustache"
|
4
|
-
|
5
3
|
module Decidim
|
6
4
|
class WelcomeNotificationEvent < Decidim::Events::BaseEvent
|
7
5
|
include Decidim::Events::EmailEvent
|
@@ -46,13 +44,12 @@ module Decidim
|
|
46
44
|
private
|
47
45
|
|
48
46
|
def interpolate(template)
|
49
|
-
|
50
|
-
|
51
|
-
organization
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
).html_safe
|
47
|
+
template
|
48
|
+
.gsub("{{name}}", user.name)
|
49
|
+
.gsub("{{organization}}", organization.name)
|
50
|
+
.gsub("{{help_url}}", url_helpers.pages_url(host: organization.host))
|
51
|
+
.gsub("{{badges_url}}", url_helpers.gamification_badges_url(host: organization.host))
|
52
|
+
.html_safe
|
56
53
|
end
|
57
54
|
end
|
58
55
|
end
|
@@ -24,7 +24,7 @@ module Decidim
|
|
24
24
|
validates :nickname, presence: true, format: { with: Decidim::User::REGEXP_NICKNAME }
|
25
25
|
|
26
26
|
validates :nickname, length: { maximum: Decidim::User.nickname_max_length, allow_blank: true }
|
27
|
-
validates :password, confirmation:
|
27
|
+
validates :password, confirmation: { message: I18n.t("errors.messages.password_confirmation_message") }
|
28
28
|
validates :password, password: { name: :name, email: :email, username: :nickname }, if: -> { password.present? }
|
29
29
|
validates :password_confirmation, presence: true, if: :password_present
|
30
30
|
validates :avatar, passthru: { to: Decidim::User }
|
@@ -44,14 +44,6 @@ module Decidim
|
|
44
44
|
allow_public_contact ? "all" : "followed-only"
|
45
45
|
end
|
46
46
|
|
47
|
-
def user_is_moderator?(user)
|
48
|
-
Decidim.participatory_space_manifests.map do |manifest|
|
49
|
-
participatory_space_type = manifest.model_class_name.constantize
|
50
|
-
return true if participatory_space_type.moderators(user.organization).exists?(id: user.id)
|
51
|
-
end
|
52
|
-
false
|
53
|
-
end
|
54
|
-
|
55
47
|
def meet_push_notifications_requirements?
|
56
48
|
Rails.application.secrets.dig(:vapid, :enabled) || false
|
57
49
|
end
|
@@ -17,7 +17,7 @@ module Decidim
|
|
17
17
|
validates :name, presence: true, format: { with: Decidim::User::REGEXP_NAME }
|
18
18
|
validates :nickname, presence: true, format: { with: Decidim::User::REGEXP_NICKNAME }, length: { maximum: Decidim::User.nickname_max_length }
|
19
19
|
validates :email, presence: true, "valid_email_2/email": { disposable: true }
|
20
|
-
validates :password, confirmation:
|
20
|
+
validates :password, confirmation: { message: I18n.t("errors.messages.password_confirmation_message") }
|
21
21
|
validates :password, password: { name: :name, email: :email, username: :nickname }
|
22
22
|
validates :password_confirmation, presence: true
|
23
23
|
validates :tos_agreement, allow_nil: false, acceptance: true
|
@@ -50,20 +50,20 @@ module Decidim
|
|
50
50
|
organization = current_participatory_space.organization
|
51
51
|
|
52
52
|
sorted_main_categories = current_participatory_space.categories.first_class.includes(:subcategories).sort_by do |category|
|
53
|
-
[category.weight, translated_attribute(category.name, organization)]
|
53
|
+
[category.weight, decidim_html_escape(translated_attribute(category.name, organization))]
|
54
54
|
end
|
55
55
|
|
56
56
|
categories_values = sorted_main_categories.flat_map do |category|
|
57
57
|
sorted_descendant_categories = category.descendants.includes(:subcategories).sort_by do |subcategory|
|
58
|
-
[subcategory.weight, translated_attribute(subcategory.name, organization)]
|
58
|
+
[subcategory.weight, decidim_html_escape(translated_attribute(subcategory.name, organization))]
|
59
59
|
end
|
60
60
|
|
61
61
|
subcategories = sorted_descendant_categories.flat_map do |subcategory|
|
62
|
-
TreePoint.new(subcategory.id.to_s, translated_attribute(subcategory.name, organization))
|
62
|
+
TreePoint.new(subcategory.id.to_s, decidim_html_escape(translated_attribute(subcategory.name, organization)))
|
63
63
|
end
|
64
64
|
|
65
65
|
TreeNode.new(
|
66
|
-
TreePoint.new(category.id.to_s, translated_attribute(category.name, organization)),
|
66
|
+
TreePoint.new(category.id.to_s, decidim_html_escape(translated_attribute(category.name, organization))),
|
67
67
|
subcategories
|
68
68
|
)
|
69
69
|
end
|