diff --git a/.rubocop.yml b/.rubocop.yml
index 6d75ff69b1ea..32396ece0d09 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -468,7 +468,7 @@ Naming/FileName:
# files with a shebang in the first line).
IgnoreExecutableScripts: true
-Layout/FirstParameterIndentation:
+Layout/IndentFirstArgument:
EnforcedStyle: special_for_inner_method_call_in_parentheses
SupportedStyles:
# The first parameter should always be indented one step more than the
@@ -505,11 +505,9 @@ Style/FormatStringToken:
EnforcedStyle: template
Style/FrozenStringLiteralComment:
- EnforcedStyle: when_needed
+ EnforcedStyle: always
SupportedStyles:
- # `when_needed` will add the frozen string literal comment to files
- # only when the `TargetRubyVersion` is set to 2.3+.
- - when_needed
+ - never
# `always` will always add the frozen string literal comment to a file
# regardless of the Ruby version or if `freeze` or `<<` are called on a
# string literal. If you run code against multiple versions of Ruby, it is
@@ -558,7 +556,7 @@ Layout/IndentationWidth:
Width: 2
# Checks the indentation of the first element in an array literal.
-Layout/IndentArray:
+Layout/IndentFirstArrayElement:
# The value `special_inside_parentheses` means that array literals with
# brackets that have their opening bracket on the same line as a surrounding
# opening round parenthesis, shall have their first element indented relative
@@ -586,7 +584,7 @@ Layout/IndentAssignment:
IndentationWidth: ~
# Checks the indentation of the first key in a hash literal.
-Layout/IndentHash:
+Layout/IndentFirstHashElement:
# The value `special_inside_parentheses` means that hash literals with braces
# that have their opening brace on the same line as a surrounding opening
# round parenthesis, shall have their first key indented relative to the
@@ -1190,10 +1188,6 @@ Lint/UnusedMethodArgument:
##################### Performance ############################
-Performance/RedundantMerge:
- # Max number of key-value pairs to consider an offense
- MaxKeyValuePairs: 2
-
Metrics/BlockLength:
Enabled: false
diff --git a/.rubocop_rails.yml b/.rubocop_rails.yml
index 02d06ddb47ae..19fe38fa9233 100644
--- a/.rubocop_rails.yml
+++ b/.rubocop_rails.yml
@@ -1,3 +1,5 @@
+require: rubocop-rails
+
Rails:
Enabled: true
diff --git a/Gemfile.lock b/Gemfile.lock
index 3f763d5859f1..9b1650aa68f7 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -137,7 +137,8 @@ PATH
rspec-html-matchers (~> 0.9.1)
rspec-rails (~> 3.7)
rspec_junit_formatter (~> 0.3.0)
- rubocop (~> 0.58.0)
+ rubocop (~> 0.71.0)
+ rubocop-rails (~> 2.0)
rubocop-rspec (~> 1.21)
selenium-webdriver (~> 3.7)
simplecov (~> 0.13)
@@ -285,7 +286,7 @@ GEM
msgpack (~> 1.0)
builder (3.2.3)
byebug (10.0.2)
- capybara (3.22.0)
+ capybara (3.24.0)
addressable
mini_mime (>= 0.1.3)
nokogiri (~> 1.8)
@@ -354,7 +355,7 @@ GEM
doc2text (0.4.1)
nokogiri (~> 1.8, >= 1.8.2)
rubyzip (~> 1.2, >= 1.2.2)
- docile (1.3.1)
+ docile (1.3.2)
domain_name (0.5.20180417)
unf (>= 0.0.5, < 1.0.0)
doorkeeper (4.4.3)
@@ -539,7 +540,6 @@ GEM
pg_search (2.2.0)
activerecord (>= 4.2)
activesupport (>= 4.2)
- powerpack (0.1.2)
premailer (1.11.1)
addressable
css_parser (>= 1.6.0)
@@ -621,15 +621,15 @@ GEM
rspec-cells (0.3.4)
cells (>= 4.0.0, < 6.0.0)
rspec-rails (~> 3.2)
- rspec-core (3.8.0)
+ rspec-core (3.8.1)
rspec-support (~> 3.8.0)
- rspec-expectations (3.8.3)
+ rspec-expectations (3.8.4)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-html-matchers (0.9.1)
nokogiri (~> 1)
rspec (>= 3.0.0.a, < 4)
- rspec-mocks (3.8.0)
+ rspec-mocks (3.8.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-rails (3.8.2)
@@ -640,19 +640,21 @@ GEM
rspec-expectations (~> 3.8.0)
rspec-mocks (~> 3.8.0)
rspec-support (~> 3.8.0)
- rspec-support (3.8.0)
+ rspec-support (3.8.2)
rspec_junit_formatter (0.3.0)
rspec-core (>= 2, < 4, != 2.12.0)
- rubocop (0.58.2)
+ rubocop (0.71.0)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
- parser (>= 2.5, != 2.5.1.1)
- powerpack (~> 0.1)
+ parser (>= 2.6)
rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
- unicode-display_width (~> 1.0, >= 1.0.1)
- rubocop-rspec (1.30.0)
- rubocop (>= 0.58.0)
+ unicode-display_width (>= 1.4.0, < 1.7)
+ rubocop-rails (2.0.1)
+ rack (>= 1.1)
+ rubocop (>= 0.70.0)
+ rubocop-rspec (1.33.0)
+ rubocop (>= 0.60.0)
ruby-ole (1.2.12.2)
ruby-progressbar (1.10.1)
ruby_dep (1.5.0)
diff --git a/bin/bundle b/bin/bundle
index 172423604f3f..dea3524f910b 100755
--- a/bin/bundle
+++ b/bin/bundle
@@ -13,11 +13,13 @@ m = Module.new do
def cli_arg_version
return unless invoked_as_script? # don't want to hijack other binstubs
return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
+
bundler_version = nil
update_index = nil
ARGV.each_with_index do |a, i|
bundler_version = a if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
+
bundler_version = Regexp.last_match(1) || ">= 0.a"
update_index = i
end
diff --git a/decidim-accountability/app/controllers/decidim/accountability/versions_controller.rb b/decidim-accountability/app/controllers/decidim/accountability/versions_controller.rb
index f8d79eed6d58..43c51f61b199 100644
--- a/decidim-accountability/app/controllers/decidim/accountability/versions_controller.rb
+++ b/decidim-accountability/app/controllers/decidim/accountability/versions_controller.rb
@@ -17,6 +17,7 @@ def result
def current_version
return nil if params[:id].to_i < 1
+
@current_version ||= result.versions[params[:id].to_i - 1]
end
end
diff --git a/decidim-accountability/app/presenters/decidim/accountability/admin_log/value_types/parent_presenter.rb b/decidim-accountability/app/presenters/decidim/accountability/admin_log/value_types/parent_presenter.rb
index 807537d41a0d..171f3e23c123 100644
--- a/decidim-accountability/app/presenters/decidim/accountability/admin_log/value_types/parent_presenter.rb
+++ b/decidim-accountability/app/presenters/decidim/accountability/admin_log/value_types/parent_presenter.rb
@@ -14,6 +14,7 @@ class ParentPresenter < Decidim::Log::ValueTypes::DefaultPresenter
def present
return unless value
return h.translated_attribute(result.title) if result
+
I18n.t("not_found", id: value, scope: "decidim.accountability.admin_log.value_types.parent_presenter")
end
diff --git a/decidim-accountability/app/queries/decidim/accountability/metrics/results_metric_manage.rb b/decidim-accountability/app/queries/decidim/accountability/metrics/results_metric_manage.rb
index d60f2acfbdda..a0f5fb2e1747 100644
--- a/decidim-accountability/app/queries/decidim/accountability/metrics/results_metric_manage.rb
+++ b/decidim-accountability/app/queries/decidim/accountability/metrics/results_metric_manage.rb
@@ -14,6 +14,7 @@ def save
@registry = []
cumulative.each do |key, cumulative_value|
next if cumulative_value.zero?
+
quantity_value = quantity[key] || 0
category_id, space_type, space_id, related_object_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s,
diff --git a/decidim-accountability/app/services/decidim/accountability/result_stats_calculator.rb b/decidim-accountability/app/services/decidim/accountability/result_stats_calculator.rb
index 538b54211d3c..75c6b6390af9 100644
--- a/decidim-accountability/app/services/decidim/accountability/result_stats_calculator.rb
+++ b/decidim-accountability/app/services/decidim/accountability/result_stats_calculator.rb
@@ -15,6 +15,7 @@ def initialize(result)
def votes_count
return 0 unless proposals
+
proposals.sum { |proposal| proposal.votes.size }
end
diff --git a/decidim-admin/app/commands/decidim/admin/destroy_newsletter.rb b/decidim-admin/app/commands/decidim/admin/destroy_newsletter.rb
index eafbd754c40e..45932496ac88 100644
--- a/decidim-admin/app/commands/decidim/admin/destroy_newsletter.rb
+++ b/decidim-admin/app/commands/decidim/admin/destroy_newsletter.rb
@@ -17,6 +17,7 @@ def initialize(newsletter, current_user)
# Broadcasts :ok if it got destroyed
def call
return broadcast(:already_sent) if newsletter.sent?
+
destroy_newsletter
broadcast(:ok)
end
diff --git a/decidim-admin/app/commands/decidim/admin/process_user_group_verification_csv.rb b/decidim-admin/app/commands/decidim/admin/process_user_group_verification_csv.rb
index aec7241f1f6f..957c6223f678 100644
--- a/decidim-admin/app/commands/decidim/admin/process_user_group_verification_csv.rb
+++ b/decidim-admin/app/commands/decidim/admin/process_user_group_verification_csv.rb
@@ -22,6 +22,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) unless @form.valid?
+
process_csv
broadcast(:ok)
end
diff --git a/decidim-admin/app/commands/decidim/admin/reject_user_group.rb b/decidim-admin/app/commands/decidim/admin/reject_user_group.rb
index 98538069d15a..d73996edad68 100644
--- a/decidim-admin/app/commands/decidim/admin/reject_user_group.rb
+++ b/decidim-admin/app/commands/decidim/admin/reject_user_group.rb
@@ -21,6 +21,7 @@ def initialize(user_group, current_user)
# Returns nothing.
def call
return broadcast(:invalid) unless @user_group.valid?
+
reject_user_group
broadcast(:ok)
end
diff --git a/decidim-admin/app/commands/decidim/admin/update_organization.rb b/decidim-admin/app/commands/decidim/admin/update_organization.rb
index 1be1a70e3754..0cdda7a14a97 100644
--- a/decidim-admin/app/commands/decidim/admin/update_organization.rb
+++ b/decidim-admin/app/commands/decidim/admin/update_organization.rb
@@ -24,6 +24,7 @@ def call
return broadcast(:invalid) if form.invalid?
return broadcast(:ok, @organization) if update_organization
+
broadcast(:invalid)
end
diff --git a/decidim-admin/app/commands/decidim/admin/verify_user_group.rb b/decidim-admin/app/commands/decidim/admin/verify_user_group.rb
index 6a58ff2d0031..3bedb27e009a 100644
--- a/decidim-admin/app/commands/decidim/admin/verify_user_group.rb
+++ b/decidim-admin/app/commands/decidim/admin/verify_user_group.rb
@@ -21,6 +21,7 @@ def initialize(user_group, current_user, via_csv = false)
# Returns nothing.
def call
return broadcast(:invalid) unless @user_group.valid?
+
verify_user_group
broadcast(:ok)
end
diff --git a/decidim-admin/app/controllers/decidim/admin/areas_controller.rb b/decidim-admin/app/controllers/decidim/admin/areas_controller.rb
index a74acf6d3175..9bd34596ce1b 100644
--- a/decidim-admin/app/controllers/decidim/admin/areas_controller.rb
+++ b/decidim-admin/app/controllers/decidim/admin/areas_controller.rb
@@ -79,6 +79,7 @@ def organization_areas
def area
return @area if defined?(@area)
+
@area = organization_areas.find_by(id: params[:id])
end
end
diff --git a/decidim-admin/app/controllers/decidim/admin/scopes_controller.rb b/decidim-admin/app/controllers/decidim/admin/scopes_controller.rb
index 65d98a14ebbc..c32094a5cb05 100644
--- a/decidim-admin/app/controllers/decidim/admin/scopes_controller.rb
+++ b/decidim-admin/app/controllers/decidim/admin/scopes_controller.rb
@@ -75,11 +75,13 @@ def organization_scopes
def parent_scope
return @parent_scope if defined?(@parent_scope)
+
@parent_scope = scope ? scope.parent : organization_scopes.find_by(id: params[:scope_id])
end
def scope
return @scope if defined?(@scope)
+
@scope = organization_scopes.find_by(id: params[:id])
end
diff --git a/decidim-admin/app/forms/decidim/admin/managed_user_promotion_form.rb b/decidim-admin/app/forms/decidim/admin/managed_user_promotion_form.rb
index ca7fbd0c1ccd..5ead30aaf6d1 100644
--- a/decidim-admin/app/forms/decidim/admin/managed_user_promotion_form.rb
+++ b/decidim-admin/app/forms/decidim/admin/managed_user_promotion_form.rb
@@ -17,6 +17,7 @@ def unique_email
organization: context.current_organization,
email: email
).where.not(id: context.current_user.id).empty?
+
errors.add :email, :taken
false
end
diff --git a/decidim-admin/app/forms/decidim/admin/selective_newsletter_form.rb b/decidim-admin/app/forms/decidim/admin/selective_newsletter_form.rb
index 843fa76e75b5..49391670fb6e 100644
--- a/decidim-admin/app/forms/decidim/admin/selective_newsletter_form.rb
+++ b/decidim-admin/app/forms/decidim/admin/selective_newsletter_form.rb
@@ -28,6 +28,7 @@ def map_model(_newsletter)
def at_least_one_participatory_space_selected
return if send_to_all_users && current_user.admin?
+
errors.add(:base, "Select atleast one participatory space") if spaces_selected.blank?
end
diff --git a/decidim-admin/app/helpers/decidim/admin/application_helper.rb b/decidim-admin/app/helpers/decidim/admin/application_helper.rb
index 4890a66fc5e4..c5d02f7f1da0 100644
--- a/decidim-admin/app/helpers/decidim/admin/application_helper.rb
+++ b/decidim-admin/app/helpers/decidim/admin/application_helper.rb
@@ -25,7 +25,7 @@ def title
# Returns a String with a link wrapped in a
element.
def public_page_link(url)
content_tag(:li) do
- link_to url, class: "button", style: "color: #fff", target: "_blank" do
+ link_to url, class: "button", style: "color: #fff", target: "_blank", rel: "noopener" do
I18n.t("decidim.admin.view_public_page")
end
end
diff --git a/decidim-admin/app/helpers/decidim/admin/attributes_display_helper.rb b/decidim-admin/app/helpers/decidim/admin/attributes_display_helper.rb
index d6ee799ac546..4e7fd349baac 100644
--- a/decidim-admin/app/helpers/decidim/admin/attributes_display_helper.rb
+++ b/decidim-admin/app/helpers/decidim/admin/attributes_display_helper.rb
@@ -52,6 +52,7 @@ def display_for(record, *attrs)
# Holds the logic to render a label for a given attribute.
def display_label(record, attr, locale = nil)
return content_tag(:dt, record.class.human_attribute_name(attr)) unless locale
+
content_tag(:dt, record.class.human_attribute_name(attr) + " (#{locale})")
end
@@ -70,6 +71,7 @@ def display_value(record, attr, locale = nil)
def display_available_locales(record)
return record.available_locales if record.respond_to?(:available_locales)
+
record.organization.available_locales if record.respond_to?(:organization)
current_organization.available_locales if respond_to?(:current_organization)
end
diff --git a/decidim-admin/app/helpers/decidim/admin/newsletters_helper.rb b/decidim-admin/app/helpers/decidim/admin/newsletters_helper.rb
index e31d12e9568a..0f00c07f9474 100644
--- a/decidim-admin/app/helpers/decidim/admin/newsletters_helper.rb
+++ b/decidim-admin/app/helpers/decidim/admin/newsletters_helper.rb
@@ -14,6 +14,7 @@ def participatory_spaces_for_select(form_object)
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
@@ -24,6 +25,7 @@ def participatory_space_types_form_object(form_object, space_type)
def select_tag_participatory_spaces(manifest_name, spaces, child_form)
return unless spaces
+
content_tag :div, class: "#{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"),
@@ -43,6 +45,7 @@ def spaces_for_select(manifest_name)
def selective_newsletter_to(newsletter)
return content_tag(:strong, t("index.not_sent", scope: "decidim.admin.newsletters"), class: "text-warning") unless newsletter.sent?
return content_tag(:strong, t("index.all_users", scope: "decidim.admin.newsletters"), class: "text-success") if newsletter.sent? && newsletter.extended_data.blank?
+
content_tag :div do
concat sent_to_users newsletter
concat sent_to_spaces newsletter
@@ -64,6 +67,7 @@ def sent_to_spaces(newsletter)
html = " "
newsletter.sended_to_partipatory_spaces.try(:each) do |type|
next if type["ids"].blank?
+
html += t("index.segmented_to", scope: "decidim.admin.newsletters", subject: t("activerecord.models.decidim/#{type["manifest_name"].singularize}.other"))
if type["ids"].include?("all")
html += " #{t("index.all", scope: "decidim.admin.newsletters")} "
@@ -106,6 +110,7 @@ def spaces_user_can_admin
Decidim.participatory_space_manifests.each do |manifest|
organization_participatory_space(manifest.name)&.each do |space|
next unless space.admins.exists?(id: current_user.id)
+
@spaces_user_can_admin[manifest.name] ||= []
space_as_option_for_select_data = space_as_option_for_select(space)
@spaces_user_can_admin[manifest.name] << space_as_option_for_select_data unless @spaces_user_can_admin[manifest.name].detect do |x|
@@ -118,6 +123,7 @@ def spaces_user_can_admin
def space_as_option_for_select(space)
return unless space
+
[
translated_attribute(space.title),
space.id,
diff --git a/decidim-admin/app/helpers/decidim/admin/settings_helper.rb b/decidim-admin/app/helpers/decidim/admin/settings_helper.rb
index 5d5edac5e05f..6fc8e21013c9 100644
--- a/decidim-admin/app/helpers/decidim/admin/settings_helper.rb
+++ b/decidim-admin/app/helpers/decidim/admin/settings_helper.rb
@@ -34,6 +34,7 @@ def settings_attribute_input(form, attribute, name, options = {})
def form_method_for_attribute(attribute)
return :editor if attribute.type.to_sym == :text && attribute.editor?
+
TYPES[attribute.type.to_sym]
end
diff --git a/decidim-admin/app/jobs/decidim/admin/expire_impersonation_job.rb b/decidim-admin/app/jobs/decidim/admin/expire_impersonation_job.rb
index e186279b45c0..82fb90d7d044 100644
--- a/decidim-admin/app/jobs/decidim/admin/expire_impersonation_job.rb
+++ b/decidim-admin/app/jobs/decidim/admin/expire_impersonation_job.rb
@@ -8,6 +8,7 @@ class ExpireImpersonationJob < ApplicationJob
def perform(user, current_user)
impersonation_log = Decidim::ImpersonationLog.where(admin: current_user, user: user).active.first
return unless impersonation_log
+
impersonation_log.expired_at = Time.current
impersonation_log.save!
end
diff --git a/decidim-admin/app/jobs/decidim/admin/newsletter_job.rb b/decidim-admin/app/jobs/decidim/admin/newsletter_job.rb
index 9e0b3aa07578..97a0775b89ed 100644
--- a/decidim-admin/app/jobs/decidim/admin/newsletter_job.rb
+++ b/decidim-admin/app/jobs/decidim/admin/newsletter_job.rb
@@ -14,6 +14,7 @@ def perform(newsletter, form, recipients_ids)
@newsletter.with_lock do
raise "Newsletter already sent" if @newsletter.sent?
+
@newsletter.update!(
sent_at: Time.current,
extended_data: extended_data,
diff --git a/decidim-admin/app/jobs/decidim/admin/verify_user_group_from_csv_job.rb b/decidim-admin/app/jobs/decidim/admin/verify_user_group_from_csv_job.rb
index aee0c322670b..84eb9a70b880 100644
--- a/decidim-admin/app/jobs/decidim/admin/verify_user_group_from_csv_job.rb
+++ b/decidim-admin/app/jobs/decidim/admin/verify_user_group_from_csv_job.rb
@@ -13,6 +13,7 @@ def perform(email, verifier, organization)
return if email.blank?
return unless user_group
+
Decidim::Admin::VerifyUserGroup.call(user_group, verifier, true)
end
diff --git a/decidim-admin/app/permissions/decidim/admin/permissions.rb b/decidim-admin/app/permissions/decidim/admin/permissions.rb
index 28b440016a74..b382f09cd010 100644
--- a/decidim-admin/app/permissions/decidim/admin/permissions.rb
+++ b/decidim-admin/app/permissions/decidim/admin/permissions.rb
@@ -61,6 +61,7 @@ def read_admin_dashboard_action?
permission_action.action == :read
return user_manager_permissions if user_manager?
+
toggle_allow(user.admin? || space_allows_admin_access_to_current_action?)
end
@@ -68,6 +69,7 @@ def apply_newsletter_permissions_for_admin!
return unless permission_action.subject == :newsletter
return allow! if user.admin?
return unless space_allows_admin_access?
+
newsletter = context.fetch(:newsletter, nil)
case permission_action.action
@@ -94,6 +96,7 @@ def read_admin_log_action?
def static_page_action?
return unless permission_action.subject == :static_page
+
static_page = context.fetch(:static_page, nil)
case permission_action.action
@@ -132,6 +135,7 @@ def managed_user_action?
def user_action?
return unless [:user, :impersonatable_user].include?(permission_action.subject)
+
subject_user = context.fetch(:user, nil)
case permission_action.action
diff --git a/decidim-admin/app/permissions/decidim/admin/user_manager_permissions.rb b/decidim-admin/app/permissions/decidim/admin/user_manager_permissions.rb
index 78041f0619ea..328bcde4b48a 100644
--- a/decidim-admin/app/permissions/decidim/admin/user_manager_permissions.rb
+++ b/decidim-admin/app/permissions/decidim/admin/user_manager_permissions.rb
@@ -5,6 +5,7 @@ module Admin
class UserManagerPermissions < Decidim::DefaultPermissions
def permissions
return permission_action unless user_manager? || user.admin?
+
allow! if read_admin_dashboard_action?
allow! if managed_user_action?
@@ -37,6 +38,7 @@ def managed_user_action?
def user_action?
return unless [:user, :impersonatable_user].include?(permission_action.subject)
+
subject_user = context.fetch(:user, nil)
case permission_action.action
diff --git a/decidim-admin/app/queries/decidim/admin/newsletter_recipients.rb b/decidim-admin/app/queries/decidim/admin/newsletter_recipients.rb
index 81b24a9ea875..ed6059cdb4f1 100644
--- a/decidim-admin/app/queries/decidim/admin/newsletter_recipients.rb
+++ b/decidim-admin/app/queries/decidim/admin/newsletter_recipients.rb
@@ -41,6 +41,7 @@ def spaces
@form.participatory_space_types.map do |type|
next if type.ids.blank?
+
object_class = "Decidim::#{type.manifest_name.classify}"
if type.ids.include?("all")
object_class.constantize.where(organization: @organization)
@@ -55,6 +56,7 @@ def spaces
def user_id_of_followers
return if spaces.blank?
return unless @form.send_to_followers
+
Decidim::Follow.user_follower_ids_for_participatory_spaces(spaces)
end
@@ -74,6 +76,7 @@ def participant_ids
end
end
next unless defined?(Decidim::Comments)
+
Decidim::Comments.newsletter_participant_entities.flatten.each do |object|
klass = Object.const_get(object)
participant_ids << klass.newsletter_participant_ids(space)
diff --git a/decidim-admin/app/queries/decidim/admin/user_filter.rb b/decidim-admin/app/queries/decidim/admin/user_filter.rb
index cf77de5aebba..e38093d1f508 100644
--- a/decidim-admin/app/queries/decidim/admin/user_filter.rb
+++ b/decidim-admin/app/queries/decidim/admin/user_filter.rb
@@ -46,6 +46,7 @@ def query
def filter_by_search(users)
return users if name_query.blank?
+
users.where("LOWER(name) LIKE LOWER(?)", "%#{name_query}%")
end
diff --git a/decidim-admin/app/queries/decidim/admin/user_groups_evaluation.rb b/decidim-admin/app/queries/decidim/admin/user_groups_evaluation.rb
index e0c8f6ae03cf..222b231ab284 100644
--- a/decidim-admin/app/queries/decidim/admin/user_groups_evaluation.rb
+++ b/decidim-admin/app/queries/decidim/admin/user_groups_evaluation.rb
@@ -35,6 +35,7 @@ def query
def filter_by_search(user_groups)
return user_groups if @query.blank?
+
user_groups.where("LOWER(name) LIKE LOWER(?)", "%#{@query}%")
end
diff --git a/decidim-admin/lib/decidim/admin/test/manage_attachments_examples.rb b/decidim-admin/lib/decidim/admin/test/manage_attachments_examples.rb
index 660b5afa3abc..b575c37e7abf 100644
--- a/decidim-admin/lib/decidim/admin/test/manage_attachments_examples.rb
+++ b/decidim-admin/lib/decidim/admin/test/manage_attachments_examples.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
shared_examples "manage attachments examples" do
- context "processing attachments", processing_uploads_for: Decidim::AttachmentUploader do
+ context "when processing attachments", processing_uploads_for: Decidim::AttachmentUploader do
let!(:attachment) { create(:attachment, attached_to: attached_to, attachment_collection: attachment_collection) }
before do
diff --git a/decidim-api/lib/decidim/api/test/type_context.rb b/decidim-api/lib/decidim/api/test/type_context.rb
index 61bdefc51759..8987729528b2 100644
--- a/decidim-api/lib/decidim/api/test/type_context.rb
+++ b/decidim-api/lib/decidim/api/test/type_context.rb
@@ -36,6 +36,7 @@ def execute_query(query, variables)
)
raise Exception, result["errors"].map { |e| e["message"] }.join(", ") if result["errors"]
+
result["data"]
end
end
diff --git a/decidim-assemblies/app/cells/decidim/assemblies/assembly_m_cell.rb b/decidim-assemblies/app/cells/decidim/assemblies/assembly_m_cell.rb
index f522be54e823..543667b82e25 100644
--- a/decidim-assemblies/app/cells/decidim/assemblies/assembly_m_cell.rb
+++ b/decidim-assemblies/app/cells/decidim/assemblies/assembly_m_cell.rb
@@ -32,6 +32,7 @@ def resource_image_path
def statuses
return super unless has_children?
+
[:creation_date, :follow, :children_count]
end
@@ -47,6 +48,7 @@ def children_assemblies_visible_for_user
if current_user
return assemblies.count.to_s if current_user.admin
+
assemblies.visible_for(current_user).count.to_s
else
assemblies.public_spaces.count.to_s
diff --git a/decidim-assemblies/app/commands/decidim/assemblies/admin/create_assembly_admin.rb b/decidim-assemblies/app/commands/decidim/assemblies/admin/create_assembly_admin.rb
index eb600eee7a78..c255f89f0525 100644
--- a/decidim-assemblies/app/commands/decidim/assemblies/admin/create_assembly_admin.rb
+++ b/decidim-assemblies/app/commands/decidim/assemblies/admin/create_assembly_admin.rb
@@ -91,6 +91,7 @@ def user_form
def invitation_instructions
return "invite_admin" if form.role == "admin"
+
"invite_collaborator"
end
diff --git a/decidim-assemblies/app/commands/decidim/assemblies/admin/update_assembly.rb b/decidim-assemblies/app/commands/decidim/assemblies/admin/update_assembly.rb
index 4843b89a82d8..a1cd5a171618 100644
--- a/decidim-assemblies/app/commands/decidim/assemblies/admin/update_assembly.rb
+++ b/decidim-assemblies/app/commands/decidim/assemblies/admin/update_assembly.rb
@@ -24,6 +24,7 @@ def initialize(assembly, form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
update_assembly
link_participatory_processes(@assembly)
@@ -116,6 +117,7 @@ def link_participatory_processes(assembly)
# Returns nothing.
def update_children_count
return unless @parent
+
Assembly.reset_counters(@parent.id, :children_count)
end
end
diff --git a/decidim-assemblies/app/helpers/decidim/assemblies/assemblies_helper.rb b/decidim-assemblies/app/helpers/decidim/assemblies/assemblies_helper.rb
index 372d20b7ace4..2b74b63201c7 100644
--- a/decidim-assemblies/app/helpers/decidim/assemblies/assemblies_helper.rb
+++ b/decidim-assemblies/app/helpers/decidim/assemblies/assemblies_helper.rb
@@ -46,7 +46,7 @@ def social_handler_links(assembly)
Decidim::Assembly::SOCIAL_HANDLERS.each do |handler|
handler_name = "#{handler}_handler"
if assembly.send(handler_name).present?
- html += link_to handler.capitalize, "https://#{handler}.com/#{assembly.send(handler_name)}", target: "_blank", class: "", title: handler.capitalize
+ html += link_to handler.capitalize, "https://#{handler}.com/#{assembly.send(handler_name)}", target: "_blank", class: "", title: handler.capitalize, rel: "noopener"
end
end
html += "".html_safe
diff --git a/decidim-assemblies/app/models/decidim/assembly_user_role.rb b/decidim-assemblies/app/models/decidim/assembly_user_role.rb
index ca46d5fe2aa6..2b012d0a8d39 100644
--- a/decidim-assemblies/app/models/decidim/assembly_user_role.rb
+++ b/decidim-assemblies/app/models/decidim/assembly_user_role.rb
@@ -24,6 +24,7 @@ def self.log_presenter_class_for(_log)
# Private: check if the process and the user have the same organization
def user_and_assembly_same_organization
return if !assembly || !user
+
errors.add(:assembly, :invalid) unless user.organization == assembly.organization
end
end
diff --git a/decidim-assemblies/app/permissions/decidim/assemblies/permissions.rb b/decidim-assemblies/app/permissions/decidim/assemblies/permissions.rb
index fad59d87bf9e..bfac19d9e2be 100644
--- a/decidim-assemblies/app/permissions/decidim/assemblies/permissions.rb
+++ b/decidim-assemblies/app/permissions/decidim/assemblies/permissions.rb
@@ -22,6 +22,7 @@ def permissions
end
return permission_action unless user
+
if !has_manageable_assemblies? && !user.admin?
disallow!
return permission_action
@@ -55,12 +56,14 @@ def admin_user?
# Checks if it has any manageable assembly, with any possible role.
def has_manageable_assemblies?(role: :any)
return unless user
+
assemblies_with_role_privileges(role).any?
end
# Whether the user can manage the given assembly or not.
def can_manage_assembly?(role: :any)
return unless user
+
assemblies_with_role_privileges(role).include? assembly
end
@@ -85,6 +88,7 @@ def public_read_assembly_action?
return disallow! unless can_view_private_space?
return allow! if user&.admin?
return allow! if assembly.published?
+
toggle_allow(can_manage_assembly?)
end
@@ -147,12 +151,14 @@ def user_can_create_assembly?
# Everyone can read the assembly list
def user_can_read_assembly_list?
return unless read_assembly_list_permission_action?
+
toggle_allow(user.admin? || has_manageable_assemblies?)
end
def user_can_read_current_assembly?
return unless read_assembly_list_permission_action?
return if permission_action.subject == :assembly_list
+
toggle_allow(user.admin? || can_manage_assembly?)
end
diff --git a/decidim-assemblies/app/presenters/decidim/assemblies/admin_log/value_types/member_position_presenter.rb b/decidim-assemblies/app/presenters/decidim/assemblies/admin_log/value_types/member_position_presenter.rb
index b6e56cd02f04..df6c3074e26a 100644
--- a/decidim-assemblies/app/presenters/decidim/assemblies/admin_log/value_types/member_position_presenter.rb
+++ b/decidim-assemblies/app/presenters/decidim/assemblies/admin_log/value_types/member_position_presenter.rb
@@ -12,6 +12,7 @@ class MemberPositionPresenter < Decidim::Log::ValueTypes::DefaultPresenter
# Returns an HTML-safe String.
def present
return if value.blank?
+
h.t(value, scope: "decidim.admin.models.assembly_member.positions", default: value)
end
end
diff --git a/decidim-assemblies/app/presenters/decidim/assemblies/admin_log/value_types/role_presenter.rb b/decidim-assemblies/app/presenters/decidim/assemblies/admin_log/value_types/role_presenter.rb
index 7552cc80ab9b..9e90a51955ed 100644
--- a/decidim-assemblies/app/presenters/decidim/assemblies/admin_log/value_types/role_presenter.rb
+++ b/decidim-assemblies/app/presenters/decidim/assemblies/admin_log/value_types/role_presenter.rb
@@ -13,6 +13,7 @@ class RolePresenter < Decidim::Log::ValueTypes::DefaultPresenter
# Returns an HTML-safe String.
def present
return if value.blank?
+
h.t(value, scope: "decidim.admin.models.assembly_user_role.roles", default: value)
end
end
diff --git a/decidim-assemblies/app/presenters/decidim/log/value_types/assembly_presenter.rb b/decidim-assemblies/app/presenters/decidim/log/value_types/assembly_presenter.rb
index 20dad749375c..5fe30c794d96 100644
--- a/decidim-assemblies/app/presenters/decidim/log/value_types/assembly_presenter.rb
+++ b/decidim-assemblies/app/presenters/decidim/log/value_types/assembly_presenter.rb
@@ -14,6 +14,7 @@ class AssemblyPresenter < DefaultPresenter
def present
return unless value
return h.translated_attribute(assembly.title) if assembly
+
I18n.t("not_found", id: value, scope: "decidim.log.value_types.assembly_presenter")
end
diff --git a/decidim-assemblies/app/queries/decidim/assemblies/admin/assembly_members.rb b/decidim-assemblies/app/queries/decidim/assemblies/admin/assembly_members.rb
index 9b431f3720da..556e844abc48 100644
--- a/decidim-assemblies/app/queries/decidim/assemblies/admin/assembly_members.rb
+++ b/decidim-assemblies/app/queries/decidim/assemblies/admin/assembly_members.rb
@@ -36,6 +36,7 @@ def query
def filter_by_search(assembly_members)
return assembly_members if @query.blank?
+
assembly_members.where("LOWER(full_name) LIKE LOWER(?)", "%#{@query}%")
end
diff --git a/decidim-budgets/app/commands/decidim/budgets/add_line_item.rb b/decidim-budgets/app/commands/decidim/budgets/add_line_item.rb
index fc55318b3f63..760b5b447f91 100644
--- a/decidim-budgets/app/commands/decidim/budgets/add_line_item.rb
+++ b/decidim-budgets/app/commands/decidim/budgets/add_line_item.rb
@@ -24,6 +24,7 @@ def initialize(current_order, project, current_user)
def call
transaction do
return broadcast(:invalid) if votes_disabled? || order.checked_out?
+
add_line_item
broadcast(:ok, order)
end
diff --git a/decidim-budgets/app/commands/decidim/budgets/cancel_order.rb b/decidim-budgets/app/commands/decidim/budgets/cancel_order.rb
index 4a0224718632..f78a18793fa0 100644
--- a/decidim-budgets/app/commands/decidim/budgets/cancel_order.rb
+++ b/decidim-budgets/app/commands/decidim/budgets/cancel_order.rb
@@ -19,6 +19,7 @@ def initialize(order)
# Returns nothing.
def call
return broadcast(:invalid) if invalid_order?
+
cancel_order!
broadcast(:ok, @order)
end
diff --git a/decidim-budgets/app/commands/decidim/budgets/checkout.rb b/decidim-budgets/app/commands/decidim/budgets/checkout.rb
index 1d8c7bc421f4..12d5a9daa584 100644
--- a/decidim-budgets/app/commands/decidim/budgets/checkout.rb
+++ b/decidim-budgets/app/commands/decidim/budgets/checkout.rb
@@ -21,6 +21,7 @@ def initialize(order, component)
# Returns nothing.
def call
return broadcast(:invalid, @order) unless checkout!
+
broadcast(:ok, @order)
end
diff --git a/decidim-budgets/app/commands/decidim/budgets/remove_line_item.rb b/decidim-budgets/app/commands/decidim/budgets/remove_line_item.rb
index 3c9961783427..2e6a5e0ef80a 100644
--- a/decidim-budgets/app/commands/decidim/budgets/remove_line_item.rb
+++ b/decidim-budgets/app/commands/decidim/budgets/remove_line_item.rb
@@ -21,6 +21,7 @@ def initialize(order, project)
# Returns nothing.
def call
return broadcast(:invalid) if @order.checked_out?
+
remove_line_item
broadcast(:ok, @order)
end
diff --git a/decidim-budgets/app/controllers/decidim/budgets/line_items_controller.rb b/decidim-budgets/app/controllers/decidim/budgets/line_items_controller.rb
index 5ca7e4022d3f..00e605f6f7b9 100644
--- a/decidim-budgets/app/controllers/decidim/budgets/line_items_controller.rb
+++ b/decidim-budgets/app/controllers/decidim/budgets/line_items_controller.rb
@@ -20,7 +20,7 @@ def create
end
on(:invalid) do
- render nothing: true, status: 422
+ render nothing: true, status: :unprocessable_entity
end
end
end
@@ -35,7 +35,7 @@ def destroy
end
on(:invalid) do
- render nothing: true, status: 422
+ render nothing: true, status: :unprocessable_entity
end
end
end
diff --git a/decidim-budgets/app/models/decidim/budgets/line_item.rb b/decidim-budgets/app/models/decidim/budgets/line_item.rb
index 574c2693bebd..1632e84d223f 100644
--- a/decidim-budgets/app/models/decidim/budgets/line_item.rb
+++ b/decidim-budgets/app/models/decidim/budgets/line_item.rb
@@ -13,6 +13,7 @@ class LineItem < Budgets::ApplicationRecord
def same_component
return unless order && project
+
errors.add(:order, :invalid) unless order.component == project.component
end
end
diff --git a/decidim-budgets/app/models/decidim/budgets/order.rb b/decidim-budgets/app/models/decidim/budgets/order.rb
index 3047317bb1cc..d3fbc282bc57 100644
--- a/decidim-budgets/app/models/decidim/budgets/order.rb
+++ b/decidim-budgets/app/models/decidim/budgets/order.rb
@@ -53,12 +53,14 @@ def budget_percent
# Public: Returns the required minimum budget to checkout
def minimum_budget
return 0 unless component
+
component.settings.total_budget.to_f * (component.settings.vote_threshold_percent.to_f / 100)
end
# Public: Returns the required maximum budget to checkout
def maximum_budget
return 0 unless component
+
component.settings.total_budget.to_f
end
@@ -82,6 +84,7 @@ def user_belongs_to_organization
organization = component&.organization
return if !user || !organization
+
errors.add(:user, :invalid) unless user.organization == organization
end
end
diff --git a/decidim-comments/app/commands/decidim/comments/create_comment.rb b/decidim-comments/app/commands/decidim/comments/create_comment.rb
index 8f30eb8427c0..da2f2af983f2 100644
--- a/decidim-comments/app/commands/decidim/comments/create_comment.rb
+++ b/decidim-comments/app/commands/decidim/comments/create_comment.rb
@@ -61,6 +61,7 @@ def send_notifications(mentioned_users)
def root_commentable(commentable)
return commentable.root_commentable if commentable.is_a? Decidim::Comments::Comment
+
commentable
end
end
diff --git a/decidim-comments/app/models/decidim/comments/comment.rb b/decidim-comments/app/models/decidim/comments/comment.rb
index 4b930b78fc5e..4d2b43ddfe58 100644
--- a/decidim-comments/app/models/decidim/comments/comment.rb
+++ b/decidim-comments/app/models/decidim/comments/comment.rb
@@ -41,6 +41,7 @@ class Comment < ApplicationRecord
def participatory_space
return root_commentable if root_commentable.is_a?(Decidim::Participable)
+
root_commentable.participatory_space
end
diff --git a/decidim-comments/app/models/decidim/comments/comment_vote.rb b/decidim-comments/app/models/decidim/comments/comment_vote.rb
index 67e9641f75b3..42ce83016323 100644
--- a/decidim-comments/app/models/decidim/comments/comment_vote.rb
+++ b/decidim-comments/app/models/decidim/comments/comment_vote.rb
@@ -23,6 +23,7 @@ def self.export_serializer
# Private: check if the comment and the author have the same organization
def author_and_comment_same_organization
return unless author.present? && comment.present?
+
errors.add(:comment, :invalid) unless author.organization == comment.organization
end
end
diff --git a/decidim-comments/app/queries/decidim/comments/metrics/comment_participants_metric_measure.rb b/decidim-comments/app/queries/decidim/comments/metrics/comment_participants_metric_measure.rb
index 64443ad9b778..4bd72aefaa4d 100644
--- a/decidim-comments/app/queries/decidim/comments/metrics/comment_participants_metric_measure.rb
+++ b/decidim-comments/app/queries/decidim/comments/metrics/comment_participants_metric_measure.rb
@@ -18,6 +18,7 @@ def calculate
related_object = comment.root_commentable
next unless related_object
next unless check_participatory_space(@resource, related_object)
+
cumulative_users << comment.decidim_author_id
quantity_users << comment.decidim_author_id if comment.created_at >= start_time
end
@@ -32,6 +33,7 @@ def calculate
def check_participatory_space(participatory_space, related_object)
return related_object.participatory_space == participatory_space if related_object.respond_to?(:participatory_space)
return related_object == participatory_space if related_object.is_a?(Decidim::Participable)
+
false
end
diff --git a/decidim-comments/app/queries/decidim/comments/metrics/comments_metric_manage.rb b/decidim-comments/app/queries/decidim/comments/metrics/comments_metric_manage.rb
index 8cd1cf318db5..d8c758a96ae7 100644
--- a/decidim-comments/app/queries/decidim/comments/metrics/comments_metric_manage.rb
+++ b/decidim-comments/app/queries/decidim/comments/metrics/comments_metric_manage.rb
@@ -15,6 +15,7 @@ def save
query.each do |key, results|
cumulative_value = results[:cumulative]
next if cumulative_value.zero?
+
quantity_value = results[:quantity] || 0
space_type, space_id, category_id, related_object_type, related_object_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
diff --git a/decidim-comments/db/migrate/20170510091348_update_root_commentable_for_comments.rb b/decidim-comments/db/migrate/20170510091348_update_root_commentable_for_comments.rb
index bdbda7817407..952e8833ffc3 100644
--- a/decidim-comments/db/migrate/20170510091348_update_root_commentable_for_comments.rb
+++ b/decidim-comments/db/migrate/20170510091348_update_root_commentable_for_comments.rb
@@ -20,6 +20,7 @@ def down; end
def root_commentable(comment)
return comment.commentable if comment.depth.zero?
+
root_commentable comment.commentable
end
end
diff --git a/decidim-comments/lib/decidim/comments/comments_helper.rb b/decidim-comments/lib/decidim/comments/comments_helper.rb
index e2b9f5802b59..32878f795cf5 100644
--- a/decidim-comments/lib/decidim/comments/comments_helper.rb
+++ b/decidim-comments/lib/decidim/comments/comments_helper.rb
@@ -9,6 +9,7 @@ module CommentsHelper
# resource - A commentable resource
def comments_for(resource)
return unless resource.commentable?
+
content_for :expanded do
inline_comments_for(resource)
end
@@ -21,6 +22,7 @@ def comments_for(resource)
# Returns a div which contain a RectComponent
def inline_comments_for(resource)
return unless resource.commentable?
+
commentable_type = resource.commentable_type
commentable_id = resource.id.to_s
node_id = "comments-for-#{commentable_type.demodulize}-#{commentable_id}"
diff --git a/decidim-conferences/app/cells/decidim/conferences/conference_speaker_cell.rb b/decidim-conferences/app/cells/decidim/conferences/conference_speaker_cell.rb
index c02a649edf41..16413abb3f0e 100644
--- a/decidim-conferences/app/cells/decidim/conferences/conference_speaker_cell.rb
+++ b/decidim-conferences/app/cells/decidim/conferences/conference_speaker_cell.rb
@@ -41,6 +41,7 @@ def presenters_for_speakers(speakers)
def avatar
return model.user.avatar if model.user.present?
+
model.avatar
end
@@ -58,17 +59,20 @@ def affiliation
def short_bio
return unless model.short_bio.presence
+
translated_attribute model.short_bio
end
def twitter_handle
return unless model.twitter_handle.presence
- link_to t(".go_to_twitter"), "https://twitter.com/#{model.twitter_handle}", target: "_blank"
+
+ link_to t(".go_to_twitter"), "https://twitter.com/#{model.twitter_handle}", target: "_blank", rel: "noopener"
end
def personal_url
return unless model.personal_url.presence || (model.user.presence && model.user.personal_url.presence)
- link_to model.personal_url || model.user.personal_url, target: "_blank", class: "card-link" do
+
+ link_to model.personal_url || model.user.personal_url, target: "_blank", class: "card-link", rel: "noopener" do
"#{icon "external-link"}" " #{t(".personal_website")}"
end
end
diff --git a/decidim-conferences/app/cells/decidim/conferences/linked_participatory_spaces_cell.rb b/decidim-conferences/app/cells/decidim/conferences/linked_participatory_spaces_cell.rb
index e012d4194878..8ce9677dd062 100644
--- a/decidim-conferences/app/cells/decidim/conferences/linked_participatory_spaces_cell.rb
+++ b/decidim-conferences/app/cells/decidim/conferences/linked_participatory_spaces_cell.rb
@@ -20,22 +20,28 @@ def conference_spaces
def conference_participatory_processes
return unless Decidim.participatory_space_manifests.map(&:name).include?(:participatory_processes)
+
processes = model.linked_participatory_space_resources(:participatory_processes, "included_participatory_processes")
return unless processes.any?
+
processes
end
def conference_assemblies
return unless Decidim.participatory_space_manifests.map(&:name).include?(:assemblies)
+
assemblies = model.linked_participatory_space_resources(:assemblies, "included_assemblies")
return unless assemblies.any?
+
assemblies
end
def conference_consultations
return unless Decidim.participatory_space_manifests.map(&:name).include?(:consultations)
+
consultations = model.linked_participatory_space_resources(:consultations, "included_consultations")
return unless consultations.any?
+
consultations
end
diff --git a/decidim-conferences/app/cells/decidim/conferences/partner_cell.rb b/decidim-conferences/app/cells/decidim/conferences/partner_cell.rb
index 8cb60079a25b..115bc7104d10 100644
--- a/decidim-conferences/app/cells/decidim/conferences/partner_cell.rb
+++ b/decidim-conferences/app/cells/decidim/conferences/partner_cell.rb
@@ -12,11 +12,13 @@ def show
def name
return unless model.name.presence
+
"
#{model.name}
"
end
def logo
return unless model.logo.presence
+
" #{image_tag model.logo.medium.url}
"
end
end
diff --git a/decidim-conferences/app/cells/decidim/conferences/photos_list_cell.rb b/decidim-conferences/app/cells/decidim/conferences/photos_list_cell.rb
index 27139a59cca5..7ac84f8890e0 100644
--- a/decidim-conferences/app/cells/decidim/conferences/photos_list_cell.rb
+++ b/decidim-conferences/app/cells/decidim/conferences/photos_list_cell.rb
@@ -10,6 +10,7 @@ class PhotosListCell < Decidim::ViewModel
def show
return unless model.any?
+
render
end
end
diff --git a/decidim-conferences/app/cells/decidim/conferences/registration_type_cell.rb b/decidim-conferences/app/cells/decidim/conferences/registration_type_cell.rb
index 5e52a4a49447..5d2c0a3769c8 100644
--- a/decidim-conferences/app/cells/decidim/conferences/registration_type_cell.rb
+++ b/decidim-conferences/app/cells/decidim/conferences/registration_type_cell.rb
@@ -27,6 +27,7 @@ def description
def price
return I18n.t("free", scope: "decidim.conferences.conference.show") if model.price.blank?
+
number_to_currency(model.price, locale: I18n.locale, unit: Decidim.currency_unit)
end
@@ -44,6 +45,7 @@ def conference
def i18n_join_text
return I18n.t("registration", scope: "decidim.conferences.conference.show") if conference.has_available_slots?
+
I18n.t("no_slots_available", scope: "decidim.conferences.conference.show")
end
end
diff --git a/decidim-conferences/app/commands/decidim/conferences/admin/confirm_conference_registration.rb b/decidim-conferences/app/commands/decidim/conferences/admin/confirm_conference_registration.rb
index 33f5749aa71f..6db0a21fe26e 100644
--- a/decidim-conferences/app/commands/decidim/conferences/admin/confirm_conference_registration.rb
+++ b/decidim-conferences/app/commands/decidim/conferences/admin/confirm_conference_registration.rb
@@ -20,6 +20,7 @@ def initialize(conference_registration, current_user)
def call
@conference_registration.with_lock do
return broadcast(:invalid) unless can_join_conference?
+
confirm_registration
send_email_confirmation
send_notification_confirmation
diff --git a/decidim-conferences/app/commands/decidim/conferences/admin/create_conference_admin.rb b/decidim-conferences/app/commands/decidim/conferences/admin/create_conference_admin.rb
index b0781d0bebac..2ed43da6880f 100644
--- a/decidim-conferences/app/commands/decidim/conferences/admin/create_conference_admin.rb
+++ b/decidim-conferences/app/commands/decidim/conferences/admin/create_conference_admin.rb
@@ -91,6 +91,7 @@ def user_form
def invitation_instructions
return "invite_admin" if form.role == "admin"
+
"invite_collaborator"
end
diff --git a/decidim-conferences/app/commands/decidim/conferences/admin/update_conference.rb b/decidim-conferences/app/commands/decidim/conferences/admin/update_conference.rb
index 56ad9d92d28b..6c16bd44e80f 100644
--- a/decidim-conferences/app/commands/decidim/conferences/admin/update_conference.rb
+++ b/decidim-conferences/app/commands/decidim/conferences/admin/update_conference.rb
@@ -23,6 +23,7 @@ def initialize(conference, form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
update_conference
link_participatory_processes
link_assemblies
diff --git a/decidim-conferences/app/commands/decidim/conferences/admin/update_diploma.rb b/decidim-conferences/app/commands/decidim/conferences/admin/update_diploma.rb
index 93438db219e8..268cdf391e64 100644
--- a/decidim-conferences/app/commands/decidim/conferences/admin/update_diploma.rb
+++ b/decidim-conferences/app/commands/decidim/conferences/admin/update_diploma.rb
@@ -20,6 +20,7 @@ def initialize(form, conference)
def call
@conference.with_lock do
return broadcast(:invalid) if form.invalid?
+
update_conference_diploma
Decidim.traceability.perform_action!(:update_diploma, @conference, form.current_user) do
@conference
diff --git a/decidim-conferences/app/commands/decidim/conferences/join_conference.rb b/decidim-conferences/app/commands/decidim/conferences/join_conference.rb
index 195a38c36224..a74603b9506e 100644
--- a/decidim-conferences/app/commands/decidim/conferences/join_conference.rb
+++ b/decidim-conferences/app/commands/decidim/conferences/join_conference.rb
@@ -22,6 +22,7 @@ def initialize(conference, registration_type, user)
def call
conference.with_lock do
return broadcast(:invalid) unless can_join_conference?
+
create_registration
create_meetings_registrations
accept_invitation
@@ -77,6 +78,7 @@ def participatory_space_admins
def notify_admin_over_percentage
return send_notification_over(0.5) if occupied_slots_over?(0.5)
return send_notification_over(0.8) if occupied_slots_over?(0.8)
+
send_notification_over(1.0) if occupied_slots_over?(1.0)
end
diff --git a/decidim-conferences/app/commands/decidim/conferences/leave_conference.rb b/decidim-conferences/app/commands/decidim/conferences/leave_conference.rb
index d53d1fbd4f58..c630d13f082b 100644
--- a/decidim-conferences/app/commands/decidim/conferences/leave_conference.rb
+++ b/decidim-conferences/app/commands/decidim/conferences/leave_conference.rb
@@ -23,6 +23,7 @@ def call
@conference.with_lock do
return broadcast(:invalid) unless registration
return broadcast(:invalid) unless meetings_registrations
+
destroy_registration
destroy_meeting_registration
end
diff --git a/decidim-conferences/app/controllers/decidim/conferences/admin/conference_registrations_controller.rb b/decidim-conferences/app/controllers/decidim/conferences/admin/conference_registrations_controller.rb
index 76bf22e0b023..89d225502a9b 100644
--- a/decidim-conferences/app/controllers/decidim/conferences/admin/conference_registrations_controller.rb
+++ b/decidim-conferences/app/controllers/decidim/conferences/admin/conference_registrations_controller.rb
@@ -52,6 +52,7 @@ def conference
def conference_registration
return if params[:id].blank?
+
@conference_registration ||= conference.conference_registrations.find_by(id: params[:id])
end
end
diff --git a/decidim-conferences/app/controllers/decidim/conferences/conference_program_controller.rb b/decidim-conferences/app/controllers/decidim/conferences/conference_program_controller.rb
index bbe1d24e200a..97a0fd1c6307 100644
--- a/decidim-conferences/app/controllers/decidim/conferences/conference_program_controller.rb
+++ b/decidim-conferences/app/controllers/decidim/conferences/conference_program_controller.rb
@@ -12,6 +12,7 @@ class ConferenceProgramController < Decidim::Conferences::ApplicationController
def show
raise ActionController::RoutingError, "No meetings for this conference " if meetings.empty?
+
enforce_permission_to :list, :program
redirect_to decidim_conferences.conference_path(current_participatory_space) unless current_user_can_visit_space?
end
@@ -20,11 +21,13 @@ def show
def meeting_component
return if params[:id].blank?
+
@meeting_component ||= current_participatory_space.components.where(manifest_name: "meetings").find_by(id: params[:id])
end
def meetings
return unless meeting_component.published? || !meeting_component.presence
+
@meetings ||= Decidim::Meetings::Meeting.where(component: meeting_component).visible_meeting_for(current_user).order(:start_time)
end
diff --git a/decidim-conferences/app/controllers/decidim/conferences/conference_registrations_controller.rb b/decidim-conferences/app/controllers/decidim/conferences/conference_registrations_controller.rb
index 7294e8656c0e..bef723e877ef 100644
--- a/decidim-conferences/app/controllers/decidim/conferences/conference_registrations_controller.rb
+++ b/decidim-conferences/app/controllers/decidim/conferences/conference_registrations_controller.rb
@@ -65,6 +65,7 @@ def registration_type
def redirect_after_path
referer = request.headers["Referer"]
return redirect_to(conference_path(conference)) if referer =~ /invitation_token/
+
redirect_back fallback_location: conference_path(conference)
end
end
diff --git a/decidim-conferences/app/controllers/decidim/conferences/conference_speakers_controller.rb b/decidim-conferences/app/controllers/decidim/conferences/conference_speakers_controller.rb
index 6e8d5f6afbe7..aec51c1e365d 100644
--- a/decidim-conferences/app/controllers/decidim/conferences/conference_speakers_controller.rb
+++ b/decidim-conferences/app/controllers/decidim/conferences/conference_speakers_controller.rb
@@ -11,6 +11,7 @@ class ConferenceSpeakersController < Decidim::Conferences::ApplicationController
def index
raise ActionController::RoutingError, "No speakers for this conference " if speakers.empty?
+
enforce_permission_to :list, :speakers
redirect_to decidim_conferences.conference_path(current_participatory_space) unless current_user_can_visit_space?
end
diff --git a/decidim-conferences/app/controllers/decidim/conferences/media_controller.rb b/decidim-conferences/app/controllers/decidim/conferences/media_controller.rb
index a31080223f70..349708e5850f 100644
--- a/decidim-conferences/app/controllers/decidim/conferences/media_controller.rb
+++ b/decidim-conferences/app/controllers/decidim/conferences/media_controller.rb
@@ -13,6 +13,7 @@ class MediaController < Decidim::Conferences::ApplicationController
def index
raise ActionController::RoutingError, "No media_links for this conference " if media_links.empty? && current_participatory_space.attachments.empty?
+
enforce_permission_to :list, :media_links
redirect_to decidim_conferences.conference_path(current_participatory_space) unless current_user_can_visit_space?
end
diff --git a/decidim-conferences/app/controllers/decidim/conferences/registration_types_controller.rb b/decidim-conferences/app/controllers/decidim/conferences/registration_types_controller.rb
index 2807d72e704c..529472dac36b 100644
--- a/decidim-conferences/app/controllers/decidim/conferences/registration_types_controller.rb
+++ b/decidim-conferences/app/controllers/decidim/conferences/registration_types_controller.rb
@@ -11,6 +11,7 @@ class RegistrationTypesController < Decidim::Conferences::ApplicationController
def index
raise ActionController::RoutingError, "No registration types for this conference " if registration_types.empty? && current_participatory_space.registrations_enabled.empty?
+
enforce_permission_to :list, :registration_types
redirect_to decidim_conferences.conference_path(current_participatory_space) unless current_user_can_visit_space?
end
diff --git a/decidim-conferences/app/forms/decidim/conferences/admin/conference_form.rb b/decidim-conferences/app/forms/decidim/conferences/admin/conference_form.rb
index c0559a0232fe..74539d4d1390 100644
--- a/decidim-conferences/app/forms/decidim/conferences/admin/conference_form.rb
+++ b/decidim-conferences/app/forms/decidim/conferences/admin/conference_form.rb
@@ -62,6 +62,7 @@ def scope
def processes_for_select
return unless Decidim.participatory_space_manifests.map(&:name).include?(:participatory_processes)
+
@processes_for_select ||= Decidim.find_participatory_space_manifest(:participatory_processes)
.participatory_spaces.call(current_organization)&.order(title: :asc)&.map do |process|
[
@@ -73,6 +74,7 @@ def processes_for_select
def assemblies_for_select
return unless Decidim.participatory_space_manifests.map(&:name).include?(:assemblies)
+
@assemblies_for_select ||= Decidim.find_participatory_space_manifest(:assemblies)
.participatory_spaces.call(current_organization)&.order(title: :asc)&.map do |assembly|
[
@@ -84,6 +86,7 @@ def assemblies_for_select
def consultations_for_select
return unless Decidim.participatory_space_manifests.map(&:name).include?(:consultations)
+
@consultations_for_select ||= Decidim.find_participatory_space_manifest(:consultations)
.participatory_spaces.call(current_organization)&.order(title: :asc)&.map do |consultation|
[
@@ -98,6 +101,7 @@ def consultations_for_select
def available_slots_greater_than_or_equal_to_registrations_count
conference = OrganizationConferences.new(current_organization).query.find_by(slug: slug)
return true if conference.blank?
+
errors.add(:available_slots, :invalid) if available_slots < conference.conference_registrations.count
end
diff --git a/decidim-conferences/app/forms/decidim/conferences/admin/conference_speaker_form.rb b/decidim-conferences/app/forms/decidim/conferences/admin/conference_speaker_form.rb
index b63247ffebc6..c4a866ebff95 100644
--- a/decidim-conferences/app/forms/decidim/conferences/admin/conference_speaker_form.rb
+++ b/decidim-conferences/app/forms/decidim/conferences/admin/conference_speaker_form.rb
@@ -50,6 +50,7 @@ def user
def conference_meetings
meeting_components = current_participatory_space.components.where(manifest_name: "meetings")
return unless meeting_components || conference_meeting_ids.delete("").present?
+
@conference_meetings ||= Decidim::ConferenceMeeting.where(component: meeting_components).where(id: conference_meeting_ids)
end
diff --git a/decidim-conferences/app/forms/decidim/conferences/admin/registration_type_form.rb b/decidim-conferences/app/forms/decidim/conferences/admin/registration_type_form.rb
index 521e0d7393f6..5282da2c8301 100644
--- a/decidim-conferences/app/forms/decidim/conferences/admin/registration_type_form.rb
+++ b/decidim-conferences/app/forms/decidim/conferences/admin/registration_type_form.rb
@@ -36,6 +36,7 @@ def meetings
def conference_meetings
meeting_components = current_participatory_space.components.where(manifest_name: "meetings")
return unless meeting_components || conference_meeting_ids.delete("").present?
+
@conference_meetings ||= Decidim::ConferenceMeeting.where(component: meeting_components).where(id: conference_meeting_ids)
end
end
diff --git a/decidim-conferences/app/helpers/decidim/conferences/conference_helper.rb b/decidim-conferences/app/helpers/decidim/conferences/conference_helper.rb
index eea60b064157..6b424f9ce70c 100644
--- a/decidim-conferences/app/helpers/decidim/conferences/conference_helper.rb
+++ b/decidim-conferences/app/helpers/decidim/conferences/conference_helper.rb
@@ -8,6 +8,7 @@ module ConferenceHelper
#
def render_date(conference)
return l(conference.start_date, format: :decidim_with_month_name_short) if conference.start_date == conference.end_date
+
"#{l(conference.start_date, format: :decidim_with_month_name_short)} - #{l(conference.end_date, format: :decidim_with_month_name_short)}"
end
end
diff --git a/decidim-conferences/app/models/decidim/conference.rb b/decidim-conferences/app/models/decidim/conference.rb
index c73e68846b36..9fb43f7ff7c1 100644
--- a/decidim-conferences/app/models/decidim/conference.rb
+++ b/decidim-conferences/app/models/decidim/conference.rb
@@ -87,6 +87,7 @@ def has_registration_for_user_and_registration_type?(user, registration_type)
def has_available_slots?
return true if available_slots.zero?
+
available_slots > conference_registrations.count
end
@@ -96,11 +97,13 @@ def remaining_slots
def diploma_sent?
return false if diploma_sent_at.nil?
+
true
end
def closed?
return false if end_date.blank?
+
end_date < Date.current
end
end
diff --git a/decidim-conferences/app/models/decidim/conference_user_role.rb b/decidim-conferences/app/models/decidim/conference_user_role.rb
index 863b8d75f425..3a533b4c27a0 100644
--- a/decidim-conferences/app/models/decidim/conference_user_role.rb
+++ b/decidim-conferences/app/models/decidim/conference_user_role.rb
@@ -24,6 +24,7 @@ def self.log_presenter_class_for(_log)
# Private: check if the process and the user have the same organization
def user_and_conference_same_organization
return if !conference || !user
+
errors.add(:conference, :invalid) unless user.organization == conference.organization
end
end
diff --git a/decidim-conferences/app/permissions/decidim/conferences/permissions.rb b/decidim-conferences/app/permissions/decidim/conferences/permissions.rb
index f15d7cba3f63..ad4c3ca7199f 100644
--- a/decidim-conferences/app/permissions/decidim/conferences/permissions.rb
+++ b/decidim-conferences/app/permissions/decidim/conferences/permissions.rb
@@ -30,6 +30,7 @@ def permissions
end
return permission_action unless user
+
if !has_manageable_conferences? && !user.admin?
disallow!
return permission_action
@@ -94,12 +95,14 @@ def admin_user?
# Checks if it has any manageable conference, with any possible role.
def has_manageable_conferences?(role: :any)
return unless user
+
conferences_with_role_privileges(role).any?
end
# Whether the user can manage the given conference or not.
def can_manage_conference?(role: :any)
return unless user
+
conferences_with_role_privileges(role).include? conference
end
@@ -123,6 +126,7 @@ def public_read_conference_action?
return allow! if user&.admin?
return allow! if conference.published?
+
toggle_allow(can_manage_conference?)
end
@@ -222,12 +226,14 @@ def user_can_confirm_conference_registration?
# Everyone can read the conference list
def user_can_read_conference_list?
return unless read_conference_list_permission_action?
+
toggle_allow(user.admin? || has_manageable_conferences?)
end
def user_can_read_current_conference?
return unless read_conference_list_permission_action?
return if permission_action.subject == :conference_list
+
toggle_allow(user.admin? || can_manage_conference?)
end
diff --git a/decidim-conferences/app/presenters/decidim/conferences/admin_log/value_types/role_presenter.rb b/decidim-conferences/app/presenters/decidim/conferences/admin_log/value_types/role_presenter.rb
index 0f56db4daa7c..5cddf021f6eb 100644
--- a/decidim-conferences/app/presenters/decidim/conferences/admin_log/value_types/role_presenter.rb
+++ b/decidim-conferences/app/presenters/decidim/conferences/admin_log/value_types/role_presenter.rb
@@ -13,6 +13,7 @@ class RolePresenter < Decidim::Log::ValueTypes::DefaultPresenter
# Returns an HTML-safe String.
def present
return if value.blank?
+
h.t(value, scope: "decidim.admin.models.conference_user_role.roles", default: value)
end
end
diff --git a/decidim-conferences/app/presenters/decidim/log/value_types/conference_presenter.rb b/decidim-conferences/app/presenters/decidim/log/value_types/conference_presenter.rb
index dd4ee1b69cbb..b32cd079bc44 100644
--- a/decidim-conferences/app/presenters/decidim/log/value_types/conference_presenter.rb
+++ b/decidim-conferences/app/presenters/decidim/log/value_types/conference_presenter.rb
@@ -14,6 +14,7 @@ class ConferencePresenter < DefaultPresenter
def present
return unless value
return h.translated_attribute(conference.title) if conference
+
I18n.t("not_found", id: value, scope: "decidim.log.value_types.conference_presenter")
end
diff --git a/decidim-conferences/app/queries/decidim/conferences/admin/conference_invites.rb b/decidim-conferences/app/queries/decidim/conferences/admin/conference_invites.rb
index b82bffa9d716..a578a6de1e6a 100644
--- a/decidim-conferences/app/queries/decidim/conferences/admin/conference_invites.rb
+++ b/decidim-conferences/app/queries/decidim/conferences/admin/conference_invites.rb
@@ -36,6 +36,7 @@ def query
def filter_by_search(conference_invites)
return conference_invites if @query.blank?
+
conference_invites.joins(:user).where(
User.arel_table[:name].lower.matches("%#{@query}%").or(User.arel_table[:email].lower.matches("%#{@query}%"))
)
diff --git a/decidim-conferences/app/queries/decidim/conferences/admin/conference_speakers.rb b/decidim-conferences/app/queries/decidim/conferences/admin/conference_speakers.rb
index 03dd38ad5766..e1616e9b0027 100644
--- a/decidim-conferences/app/queries/decidim/conferences/admin/conference_speakers.rb
+++ b/decidim-conferences/app/queries/decidim/conferences/admin/conference_speakers.rb
@@ -32,6 +32,7 @@ def query
def filter_by_search(conference_speakers)
return conference_speakers if @query.blank?
+
conference_speakers.where("LOWER(full_name) LIKE LOWER(?)", "%#{@query}%")
end
end
diff --git a/decidim-conferences/spec/system/media_spec.rb b/decidim-conferences/spec/system/media_spec.rb
index aca42b54aa89..bc2602f19a8b 100644
--- a/decidim-conferences/spec/system/media_spec.rb
+++ b/decidim-conferences/spec/system/media_spec.rb
@@ -74,7 +74,7 @@ def visit_conference
end
end
- context "that are ordered by weight", processing_uploads_for: Decidim::AttachmentUploader do
+ context "when are ordered by weight", processing_uploads_for: Decidim::AttachmentUploader do
let!(:last_document) { create(:attachment, :with_pdf, attached_to: conference, weight: 2) }
let!(:first_document) { create(:attachment, :with_pdf, attached_to: conference, weight: 1) }
let!(:last_image) { create(:attachment, attached_to: conference, weight: 2) }
diff --git a/decidim-consultations/app/cells/decidim/consultations/content_blocks/highlighted_consultations_cell.rb b/decidim-consultations/app/cells/decidim/consultations/content_blocks/highlighted_consultations_cell.rb
index b8c37e526eb1..043afa2e5a69 100644
--- a/decidim-consultations/app/cells/decidim/consultations/content_blocks/highlighted_consultations_cell.rb
+++ b/decidim-consultations/app/cells/decidim/consultations/content_blocks/highlighted_consultations_cell.rb
@@ -32,6 +32,7 @@ def decidim_consultations
def voting_ends_text_for(consultation)
remaining_days = (consultation.end_voting_date - Time.zone.today).to_i
return I18n.t("voting_ends_today", scope: i18n_scope) if remaining_days.zero?
+
I18n.t("voting_ends_in", scope: i18n_scope, count: remaining_days)
end
end
diff --git a/decidim-consultations/app/commands/decidim/consultations/admin/create_consultation.rb b/decidim-consultations/app/commands/decidim/consultations/admin/create_consultation.rb
index b9c1c04483d5..97676a6f5ebd 100644
--- a/decidim-consultations/app/commands/decidim/consultations/admin/create_consultation.rb
+++ b/decidim-consultations/app/commands/decidim/consultations/admin/create_consultation.rb
@@ -21,6 +21,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
consultation = create_consultation
if consultation.persisted?
@@ -52,6 +53,7 @@ def create_consultation
)
return consultation unless consultation.valid?
+
consultation.save
consultation
end
diff --git a/decidim-consultations/app/commands/decidim/consultations/admin/create_question.rb b/decidim-consultations/app/commands/decidim/consultations/admin/create_question.rb
index cd6d8432ffbe..e07f4216fa1c 100644
--- a/decidim-consultations/app/commands/decidim/consultations/admin/create_question.rb
+++ b/decidim-consultations/app/commands/decidim/consultations/admin/create_question.rb
@@ -20,6 +20,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
question = create_question
if question.persisted?
@@ -59,6 +60,7 @@ def create_question
)
return question unless question.valid?
+
question.save
question
end
diff --git a/decidim-consultations/app/commands/decidim/consultations/admin/create_response.rb b/decidim-consultations/app/commands/decidim/consultations/admin/create_response.rb
index 76267a317dcc..85638e05a1d9 100644
--- a/decidim-consultations/app/commands/decidim/consultations/admin/create_response.rb
+++ b/decidim-consultations/app/commands/decidim/consultations/admin/create_response.rb
@@ -20,6 +20,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
broadcast(:ok, create_response)
end
diff --git a/decidim-consultations/app/commands/decidim/consultations/admin/update_consultation.rb b/decidim-consultations/app/commands/decidim/consultations/admin/update_consultation.rb
index f04ab85867e1..131839366a98 100644
--- a/decidim-consultations/app/commands/decidim/consultations/admin/update_consultation.rb
+++ b/decidim-consultations/app/commands/decidim/consultations/admin/update_consultation.rb
@@ -23,6 +23,7 @@ def initialize(consultation, form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
update_consultation
if consultation.valid?
diff --git a/decidim-consultations/app/commands/decidim/consultations/admin/update_question.rb b/decidim-consultations/app/commands/decidim/consultations/admin/update_question.rb
index c139db2ab06c..1f066d95973c 100644
--- a/decidim-consultations/app/commands/decidim/consultations/admin/update_question.rb
+++ b/decidim-consultations/app/commands/decidim/consultations/admin/update_question.rb
@@ -23,6 +23,7 @@ def initialize(question, form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
update_question
if question.valid?
diff --git a/decidim-consultations/app/commands/decidim/consultations/admin/update_response.rb b/decidim-consultations/app/commands/decidim/consultations/admin/update_response.rb
index d160b5b312bd..7bc8ac793597 100644
--- a/decidim-consultations/app/commands/decidim/consultations/admin/update_response.rb
+++ b/decidim-consultations/app/commands/decidim/consultations/admin/update_response.rb
@@ -22,6 +22,7 @@ def initialize(response, form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
update_response
broadcast(:ok, response)
end
diff --git a/decidim-consultations/app/controllers/concerns/decidim/consultations/admin/question_admin.rb b/decidim-consultations/app/controllers/concerns/decidim/consultations/admin/question_admin.rb
index a31e757fed7a..26828af06765 100644
--- a/decidim-consultations/app/controllers/concerns/decidim/consultations/admin/question_admin.rb
+++ b/decidim-consultations/app/controllers/concerns/decidim/consultations/admin/question_admin.rb
@@ -24,6 +24,7 @@ module QuestionAdmin
def current_participatory_space
return current_consultation if params.has_key? :consultation_slug
+
current_question
end
diff --git a/decidim-consultations/app/controllers/decidim/consultations/question_votes_controller.rb b/decidim-consultations/app/controllers/decidim/consultations/question_votes_controller.rb
index 737090677495..26fc87d68d7f 100644
--- a/decidim-consultations/app/controllers/decidim/consultations/question_votes_controller.rb
+++ b/decidim-consultations/app/controllers/decidim/consultations/question_votes_controller.rb
@@ -23,7 +23,7 @@ def create
on(:invalid) do
render json: {
error: I18n.t("question_votes.create.error", scope: "decidim.consultations")
- }, status: 422
+ }, status: :unprocessable_entity
end
end
end
diff --git a/decidim-consultations/app/forms/decidim/consultations/vote_form.rb b/decidim-consultations/app/forms/decidim/consultations/vote_form.rb
index 94ad44f77479..50bb53e91ba2 100644
--- a/decidim-consultations/app/forms/decidim/consultations/vote_form.rb
+++ b/decidim-consultations/app/forms/decidim/consultations/vote_form.rb
@@ -18,6 +18,7 @@ def response
def response_exists
return unless response.nil?
+
errors.add(
:decidim_consultations_response_id,
I18n.t("decidim_consultations_response_id.not_found", scope: "activemodel.errors.vote")
diff --git a/decidim-consultations/app/models/decidim/consultations/vote.rb b/decidim-consultations/app/models/decidim/consultations/vote.rb
index ba91191d4925..1430c003eb71 100644
--- a/decidim-consultations/app/models/decidim/consultations/vote.rb
+++ b/decidim-consultations/app/models/decidim/consultations/vote.rb
@@ -28,6 +28,7 @@ class Vote < ApplicationRecord
# Private: check if the question and the author have the same organization
def author_and_question_same_organization
return if !question || !author
+
errors.add(:question, :invalid) unless author.organization == question.organization
end
end
diff --git a/decidim-consultations/app/permissions/decidim/consultations/permissions.rb b/decidim-consultations/app/permissions/decidim/consultations/permissions.rb
index 83a3abb7f7b5..813365e5e7ba 100644
--- a/decidim-consultations/app/permissions/decidim/consultations/permissions.rb
+++ b/decidim-consultations/app/permissions/decidim/consultations/permissions.rb
@@ -7,6 +7,7 @@ def permissions
allowed_public_anonymous_action?
return permission_action unless user
+
allowed_public_action?
return Decidim::Consultations::Admin::Permissions.new(user, permission_action, context).permissions if permission_action.scope == :admin
diff --git a/decidim-core/app/cells/decidim/activity_cell.rb b/decidim-core/app/cells/decidim/activity_cell.rb
index eec3671f7aa8..b90866861e2f 100644
--- a/decidim-core/app/cells/decidim/activity_cell.rb
+++ b/decidim-core/app/cells/decidim/activity_cell.rb
@@ -13,6 +13,7 @@ class ActivityCell < Decidim::ViewModel
def show
return unless renderable?
+
render
end
@@ -76,6 +77,7 @@ def created_at
def published?
return true unless resource.respond_to?(:published?)
+
resource.published?
end
@@ -93,6 +95,7 @@ def user
def author
return unless show_author? && user.is_a?(UserBaseEntity)
+
cell "decidim/author", UserPresenter.new(user)
end
diff --git a/decidim-core/app/cells/decidim/announcement_cell.rb b/decidim-core/app/cells/decidim/announcement_cell.rb
index 6ce7144ef5c8..2910fb49463a 100644
--- a/decidim-core/app/cells/decidim/announcement_cell.rb
+++ b/decidim-core/app/cells/decidim/announcement_cell.rb
@@ -16,6 +16,7 @@ class AnnouncementCell < Decidim::ViewModel
def show
return unless announcement.presence
+
render :show
end
diff --git a/decidim-core/app/cells/decidim/author_cell.rb b/decidim-core/app/cells/decidim/author_cell.rb
index 4dab241ee8d7..28e65cf99490 100644
--- a/decidim-core/app/cells/decidim/author_cell.rb
+++ b/decidim-core/app/cells/decidim/author_cell.rb
@@ -57,6 +57,7 @@ def creation_date?
return unless from_context
return unless proposals_controller? || collaborative_drafts_controller?
return unless show_action?
+
true
end
@@ -72,6 +73,7 @@ def creation_date
def commentable?
return unless posts_controller?
+
true
end
@@ -82,6 +84,7 @@ def author_classes
def actionable?
return false if options[:has_actions] == false
return true if user_author? && posts_controller?
+
true if withdrawable? || flagable?
end
diff --git a/decidim-core/app/cells/decidim/card_m_cell.rb b/decidim-core/app/cells/decidim/card_m_cell.rb
index 9de83fa5c8a9..7957b01ad694 100644
--- a/decidim-core/app/cells/decidim/card_m_cell.rb
+++ b/decidim-core/app/cells/decidim/card_m_cell.rb
@@ -40,6 +40,7 @@ def has_link_to_resource?
def has_label?
return true if model.respond_to?("emendation?") && model.emendation?
+
context[:label].presence
end
@@ -90,6 +91,7 @@ def card_classes
classes = [base_card_class]
classes = classes.concat(["card--stack"]).join(" ") if has_children?
return classes unless has_state?
+
classes.concat(state_classes).join(" ")
end
diff --git a/decidim-core/app/cells/decidim/collapsible_authors_cell.rb b/decidim-core/app/cells/decidim/collapsible_authors_cell.rb
index 62a5f700eb68..3bdeb0c43b7b 100644
--- a/decidim-core/app/cells/decidim/collapsible_authors_cell.rb
+++ b/decidim-core/app/cells/decidim/collapsible_authors_cell.rb
@@ -26,6 +26,7 @@ class CollapsibleAuthorsCell < CollapsibleListCell
def actionable?
return false if options[:has_actions] == false
+
true if withdrawable? || flagable?
end
end
diff --git a/decidim-core/app/cells/decidim/collapsible_list_cell.rb b/decidim-core/app/cells/decidim/collapsible_list_cell.rb
index 06a43f00a09f..b1e91eba486a 100644
--- a/decidim-core/app/cells/decidim/collapsible_list_cell.rb
+++ b/decidim-core/app/cells/decidim/collapsible_list_cell.rb
@@ -54,6 +54,7 @@ def collapsible?
def hidden_elements_count
return 0 unless collapsible?
+
list.size - size
end
diff --git a/decidim-core/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb b/decidim-core/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb
index 1f5814bbaeec..499b58370815 100644
--- a/decidim-core/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb
+++ b/decidim-core/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb
@@ -7,6 +7,7 @@ class HighlightedContentBannerCell < Decidim::ViewModel
def show
return unless current_organization.highlighted_content_banner_enabled
+
render
end
end
diff --git a/decidim-core/app/cells/decidim/content_blocks/last_activity_cell.rb b/decidim-core/app/cells/decidim/content_blocks/last_activity_cell.rb
index c4cccd41710e..0165691176c2 100644
--- a/decidim-core/app/cells/decidim/content_blocks/last_activity_cell.rb
+++ b/decidim-core/app/cells/decidim/content_blocks/last_activity_cell.rb
@@ -9,6 +9,7 @@ class LastActivityCell < Decidim::ViewModel
def show
return if activities.empty?
+
render
end
diff --git a/decidim-core/app/cells/decidim/content_blocks/metrics_cell.rb b/decidim-core/app/cells/decidim/content_blocks/metrics_cell.rb
index 9f37eb5366de..d20c73cc2a6c 100644
--- a/decidim-core/app/cells/decidim/content_blocks/metrics_cell.rb
+++ b/decidim-core/app/cells/decidim/content_blocks/metrics_cell.rb
@@ -5,6 +5,7 @@ module ContentBlocks
class MetricsCell < Decidim::ViewModel
def show
return unless current_organization.show_statistics?
+
render
end
diff --git a/decidim-core/app/cells/decidim/content_blocks/stats_cell.rb b/decidim-core/app/cells/decidim/content_blocks/stats_cell.rb
index effa2570917c..ec8667dbff90 100644
--- a/decidim-core/app/cells/decidim/content_blocks/stats_cell.rb
+++ b/decidim-core/app/cells/decidim/content_blocks/stats_cell.rb
@@ -5,6 +5,7 @@ module ContentBlocks
class StatsCell < Decidim::ViewModel
def show
return unless current_organization.show_statistics?
+
render
end
diff --git a/decidim-core/app/cells/decidim/content_blocks/sub_hero_cell.rb b/decidim-core/app/cells/decidim/content_blocks/sub_hero_cell.rb
index bc42518de4a0..c2260302f4c5 100644
--- a/decidim-core/app/cells/decidim/content_blocks/sub_hero_cell.rb
+++ b/decidim-core/app/cells/decidim/content_blocks/sub_hero_cell.rb
@@ -8,6 +8,7 @@ class SubHeroCell < Decidim::ViewModel
def show
return if translated_attribute(current_organization.description).blank?
+
render
end
end
diff --git a/decidim-core/app/cells/decidim/follow_button_cell.rb b/decidim-core/app/cells/decidim/follow_button_cell.rb
index 34f3d7d83b30..aa8b70c1254a 100644
--- a/decidim-core/app/cells/decidim/follow_button_cell.rb
+++ b/decidim-core/app/cells/decidim/follow_button_cell.rb
@@ -7,6 +7,7 @@ class FollowButtonCell < Decidim::ViewModel
def show
return if model == current_user
+
render
end
@@ -15,11 +16,13 @@ def show
def button_classes
return "card__button secondary text-uppercase follow-button mb-none" if inline?
return "button secondary hollow expanded button--icon button--sc" if large?
+
"button secondary hollow expanded small button--icon follow-button"
end
def icon_options
return { class: "icon--small" } if inline?
+
{}
end
diff --git a/decidim-core/app/cells/decidim/members_cell.rb b/decidim-core/app/cells/decidim/members_cell.rb
index fdc74512e720..6d981a3d5c8b 100644
--- a/decidim-core/app/cells/decidim/members_cell.rb
+++ b/decidim-core/app/cells/decidim/members_cell.rb
@@ -15,6 +15,7 @@ def show
def membership_cell_name
return "decidim/user_group_admin_membership_profile" if options[:from_admin].presence
+
"decidim/user_group_membership_profile"
end
diff --git a/decidim-core/app/cells/decidim/profile_cell.rb b/decidim-core/app/cells/decidim/profile_cell.rb
index eb8bb6ed7bde..4985088a58a5 100644
--- a/decidim-core/app/cells/decidim/profile_cell.rb
+++ b/decidim-core/app/cells/decidim/profile_cell.rb
@@ -32,6 +32,7 @@ def own_profile?
def profile_tabs
return render :user_group_tabs if profile_holder.is_a?(Decidim::UserGroup)
+
render :user_tabs
end
end
diff --git a/decidim-core/app/cells/decidim/profile_sidebar_cell.rb b/decidim-core/app/cells/decidim/profile_sidebar_cell.rb
index 32ee721253e0..f370cfa50b8a 100644
--- a/decidim-core/app/cells/decidim/profile_sidebar_cell.rb
+++ b/decidim-core/app/cells/decidim/profile_sidebar_cell.rb
@@ -36,6 +36,7 @@ def officialization_text
def can_edit_user_group_profile?
return false unless current_user
return false if model.is_a?(Decidim::User)
+
Decidim::UserGroups::ManageableUserGroups.for(current_user).include?(model)
end
@@ -53,18 +54,21 @@ def badge_statuses
def can_join_user_group?
return false unless current_user
return false if model.is_a?(Decidim::User)
+
Decidim::UserGroupMembership.where(user: current_user, user_group: model).empty?
end
def can_leave_group?
return false unless current_user
return false if model.is_a?(Decidim::User)
+
Decidim::UserGroupMembership.where(user: current_user, user_group: model).where.not(role: :creator).any?
end
def user_group_email_to_be_confirmed?
return false unless current_user
return false if model.is_a?(Decidim::User)
+
!model.confirmed?
end
end
diff --git a/decidim-core/app/cells/decidim/search_results_cell.rb b/decidim-core/app/cells/decidim/search_results_cell.rb
index 06ee7ba067c4..f6d43e1ee320 100644
--- a/decidim-core/app/cells/decidim/search_results_cell.rb
+++ b/decidim-core/app/cells/decidim/search_results_cell.rb
@@ -20,6 +20,7 @@ def non_empty_sections
def sections_to_render
return non_empty_sections.slice(selected_resource_type) if has_selected_resource_type?
+
non_empty_sections
end
diff --git a/decidim-core/app/cells/decidim/tos_page_cell.rb b/decidim-core/app/cells/decidim/tos_page_cell.rb
index b1e6764fbec3..7992b5761835 100644
--- a/decidim-core/app/cells/decidim/tos_page_cell.rb
+++ b/decidim-core/app/cells/decidim/tos_page_cell.rb
@@ -16,6 +16,7 @@ def show
return if model.nil?
return unless current_user
return if current_user.tos_accepted?
+
render model
end
diff --git a/decidim-core/app/cells/decidim/user_group_pending_invitations_list_cell.rb b/decidim-core/app/cells/decidim/user_group_pending_invitations_list_cell.rb
index 509b55c459e7..5829a8dc4b41 100644
--- a/decidim-core/app/cells/decidim/user_group_pending_invitations_list_cell.rb
+++ b/decidim-core/app/cells/decidim/user_group_pending_invitations_list_cell.rb
@@ -12,6 +12,7 @@ class UserGroupPendingInvitationsListCell < Decidim::ViewModel
def show
return if invitations.empty?
return unless own_profile?
+
render :show
end
diff --git a/decidim-core/app/cells/decidim/user_group_pending_requests_list_cell.rb b/decidim-core/app/cells/decidim/user_group_pending_requests_list_cell.rb
index 13dd52ded6f5..e47e5f84d25b 100644
--- a/decidim-core/app/cells/decidim/user_group_pending_requests_list_cell.rb
+++ b/decidim-core/app/cells/decidim/user_group_pending_requests_list_cell.rb
@@ -12,6 +12,7 @@ class UserGroupPendingRequestsListCell < Decidim::ViewModel
def show
return if requests.empty?
return unless current_user_is_manager?
+
render :show
end
diff --git a/decidim-core/app/commands/decidim/create_follow.rb b/decidim-core/app/commands/decidim/create_follow.rb
index 73c29093b5bc..437b04e7ebbb 100644
--- a/decidim-core/app/commands/decidim/create_follow.rb
+++ b/decidim-core/app/commands/decidim/create_follow.rb
@@ -40,6 +40,7 @@ def create_follow!
def increment_score
return unless form.followable.is_a? Decidim::User
+
Decidim::Gamification.increment_score(form.followable, :followers)
end
end
diff --git a/decidim-core/app/commands/decidim/create_omniauth_registration.rb b/decidim-core/app/commands/decidim/create_omniauth_registration.rb
index 88009692808f..11a336300389 100644
--- a/decidim-core/app/commands/decidim/create_omniauth_registration.rb
+++ b/decidim-core/app/commands/decidim/create_omniauth_registration.rb
@@ -31,8 +31,8 @@ def call
trigger_omniauth_registration
broadcast(:ok, @user)
- rescue ActiveRecord::RecordInvalid => error
- broadcast(:error, error.record)
+ rescue ActiveRecord::RecordInvalid => e
+ broadcast(:error, e.record)
end
end
diff --git a/decidim-core/app/commands/decidim/delete_follow.rb b/decidim-core/app/commands/decidim/delete_follow.rb
index a9f8d62dd444..438a796ac447 100644
--- a/decidim-core/app/commands/decidim/delete_follow.rb
+++ b/decidim-core/app/commands/decidim/delete_follow.rb
@@ -38,6 +38,7 @@ def delete_follow!
def decrement_score
followable = form.follow.followable
return unless followable.is_a? Decidim::User
+
Decidim::Gamification.decrement_score(followable, :followers)
end
end
diff --git a/decidim-core/app/commands/decidim/search.rb b/decidim-core/app/commands/decidim/search.rb
index 7f9e9da7872c..acb63e1d6f13 100644
--- a/decidim-core/app/commands/decidim/search.rb
+++ b/decidim-core/app/commands/decidim/search.rb
@@ -52,6 +52,7 @@ def call
def paginate(collection)
return collection if page_params.blank?
+
collection.page(page_params[:page]).per(page_params[:per_page])
end
diff --git a/decidim-core/app/controllers/concerns/decidim/force_authentication.rb b/decidim-core/app/controllers/concerns/decidim/force_authentication.rb
index 48ebbd76e3e7..61e8580deb62 100644
--- a/decidim-core/app/controllers/concerns/decidim/force_authentication.rb
+++ b/decidim-core/app/controllers/concerns/decidim/force_authentication.rb
@@ -31,6 +31,7 @@ def ensure_authenticated!
def allow_unauthorized_path?
# Changing the locale
return true if %r{^\/locale}.match?(request.path) || %r{^\/cookies}.match?(request.path)
+
false
end
end
diff --git a/decidim-core/app/controllers/concerns/decidim/impersonate_users.rb b/decidim-core/app/controllers/concerns/decidim/impersonate_users.rb
index c5649e146153..5cf968256f50 100644
--- a/decidim-core/app/controllers/concerns/decidim/impersonate_users.rb
+++ b/decidim-core/app/controllers/concerns/decidim/impersonate_users.rb
@@ -36,6 +36,7 @@ def current_user_impersonated?
# Returns the managed user impersonated by an admin if exists
def managed_user
return unless can_impersonate_users?
+
impersonation_log&.user
end
diff --git a/decidim-core/app/controllers/concerns/decidim/participatory_space_context.rb b/decidim-core/app/controllers/concerns/decidim/participatory_space_context.rb
index 9f749e5edc19..5a00c873e7ed 100644
--- a/decidim-core/app/controllers/concerns/decidim/participatory_space_context.rb
+++ b/decidim-core/app/controllers/concerns/decidim/participatory_space_context.rb
@@ -50,6 +50,7 @@ def current_participatory_space_manifest
)
raise NotImplementedError unless manifest
+
manifest
end
@@ -72,6 +73,7 @@ def current_user_can_visit_space?
def check_current_user_can_visit_space
return if current_user_can_visit_space?
+
flash[:alert] = I18n.t("participatory_space_private_users.not_allowed", scope: "decidim")
redirect_to action: "index"
end
diff --git a/decidim-core/app/controllers/decidim/application_controller.rb b/decidim-core/app/controllers/decidim/application_controller.rb
index 7b2b1abff804..e248b243c15c 100644
--- a/decidim-core/app/controllers/decidim/application_controller.rb
+++ b/decidim-core/app/controllers/decidim/application_controller.rb
@@ -78,6 +78,7 @@ def add_vary_header
def track_continuity_badge
return unless current_user
+
Decidim::ContinuityBadgeTracker.new(current_user).track!(Time.zone.today)
end
end
diff --git a/decidim-core/app/controllers/decidim/devise/omniauth_registrations_controller.rb b/decidim-core/app/controllers/decidim/devise/omniauth_registrations_controller.rb
index 9fd0d1c04c0c..bc8b1e5e3d51 100644
--- a/decidim-core/app/controllers/decidim/devise/omniauth_registrations_controller.rb
+++ b/decidim-core/app/controllers/decidim/devise/omniauth_registrations_controller.rb
@@ -66,6 +66,7 @@ def first_login_and_not_authorized?(user)
def action_missing(action_name)
return send(:create) if devise_mapping.omniauthable? && User.omniauth_providers.include?(action_name.to_sym)
+
raise AbstractController::ActionNotFound, "The action '#{action_name}' could not be found for Decidim::Devise::OmniauthCallbacksController"
end
@@ -79,6 +80,7 @@ def oauth_data
# Since we are using trusted omniauth data we are generating a valid signature.
def user_params_from_oauth_hash
return nil if oauth_data.empty?
+
{
provider: oauth_data[:provider],
uid: oauth_data[:uid],
diff --git a/decidim-core/app/controllers/decidim/follows_controller.rb b/decidim-core/app/controllers/decidim/follows_controller.rb
index 5042c48fb6c0..aa4a6cdc7dfa 100644
--- a/decidim-core/app/controllers/decidim/follows_controller.rb
+++ b/decidim-core/app/controllers/decidim/follows_controller.rb
@@ -17,7 +17,7 @@ def destroy
end
on(:invalid) do
- render json: { error: I18n.t("follows.destroy.error", scope: "decidim") }, status: 422
+ render json: { error: I18n.t("follows.destroy.error", scope: "decidim") }, status: :unprocessable_entity
end
end
end
@@ -33,7 +33,7 @@ def create
end
on(:invalid) do
- render json: { error: I18n.t("follows.create.error", scope: "decidim") }, status: 422
+ render json: { error: I18n.t("follows.create.error", scope: "decidim") }, status: :unprocessable_entity
end
end
end
diff --git a/decidim-core/app/controllers/decidim/messaging/conversations_controller.rb b/decidim-core/app/controllers/decidim/messaging/conversations_controller.rb
index 646cd282e591..7c4f276b4f21 100644
--- a/decidim-core/app/controllers/decidim/messaging/conversations_controller.rb
+++ b/decidim-core/app/controllers/decidim/messaging/conversations_controller.rb
@@ -37,7 +37,7 @@ def create
end
on(:invalid) do
- render json: { error: I18n.t("messaging.conversations.create.error", scope: "decidim") }, status: 422
+ render json: { error: I18n.t("messaging.conversations.create.error", scope: "decidim") }, status: :unprocessable_entity
end
end
end
@@ -67,7 +67,7 @@ def update
end
on(:invalid) do
- render json: { error: I18n.t("messaging.conversations.update.error", scope: "decidim") }, status: 422
+ render json: { error: I18n.t("messaging.conversations.update.error", scope: "decidim") }, status: :unprocessable_entity
end
end
end
diff --git a/decidim-core/app/controllers/decidim/profiles_controller.rb b/decidim-core/app/controllers/decidim/profiles_controller.rb
index 46f5337337c2..9b8a9d2285c0 100644
--- a/decidim-core/app/controllers/decidim/profiles_controller.rb
+++ b/decidim-core/app/controllers/decidim/profiles_controller.rb
@@ -16,6 +16,7 @@ class ProfilesController < Decidim::ApplicationController
def show
return redirect_to profile_timeline_path(nickname: params[:nickname]) if profile_holder == current_user
return redirect_to profile_members_path if profile_holder.is_a?(Decidim::UserGroup)
+
redirect_to profile_activity_path(nickname: params[:nickname])
end
diff --git a/decidim-core/app/events/decidim/amendable/amendment_base_event.rb b/decidim-core/app/events/decidim/amendable/amendment_base_event.rb
index 49d82b2d9600..b1767a8c1c97 100644
--- a/decidim-core/app/events/decidim/amendable/amendment_base_event.rb
+++ b/decidim-core/app/events/decidim/amendable/amendment_base_event.rb
@@ -19,6 +19,7 @@ def amendable_path
def emendation_author
return unless emendation_resource
+
@emendation_author ||= if emendation_resource.is_a?(Decidim::Coauthorable)
Decidim::UserPresenter.new(emendation_resource.creator_author)
else
@@ -28,16 +29,19 @@ def emendation_author
def emendation_author_nickname
return unless emendation_resource
+
@emendation_author_nickname ||= emendation_author.nickname
end
def emendation_author_path
return unless emendation_resource
+
@emendation_author_path ||= emendation_author.profile_path
end
def emendation_path
return unless emendation_resource
+
@emendation_path ||= Decidim::ResourceLocatorPresenter.new(emendation_resource).path
end
end
diff --git a/decidim-core/app/forms/decidim/amendable/form.rb b/decidim-core/app/forms/decidim/amendable/form.rb
index a99b5c4a554c..ee14d6b43cb7 100644
--- a/decidim-core/app/forms/decidim/amendable/form.rb
+++ b/decidim-core/app/forms/decidim/amendable/form.rb
@@ -27,6 +27,7 @@ def check_amendable_form_validations
def parse_hashtaggable_params
emendation_params.each do |key, value|
next unless [:title, :body].include?(key)
+
emendation_params[key] = Decidim::ContentProcessor
.parse_with_processor(
:hashtag,
diff --git a/decidim-core/app/forms/decidim/notifications_settings_form.rb b/decidim-core/app/forms/decidim/notifications_settings_form.rb
index ccf32b2adba5..91539f1893fb 100644
--- a/decidim-core/app/forms/decidim/notifications_settings_form.rb
+++ b/decidim-core/app/forms/decidim/notifications_settings_form.rb
@@ -19,6 +19,7 @@ def map_model(user)
def newsletter_notifications_at
return nil unless newsletter_notifications
+
Time.current
end
diff --git a/decidim-core/app/forms/decidim/registration_form.rb b/decidim-core/app/forms/decidim/registration_form.rb
index dbec300fbd32..ee1b93e0616b 100644
--- a/decidim-core/app/forms/decidim/registration_form.rb
+++ b/decidim-core/app/forms/decidim/registration_form.rb
@@ -26,6 +26,7 @@ class RegistrationForm < Form
def newsletter_at
return nil unless newsletter?
+
Time.current
end
diff --git a/decidim-core/app/forms/decidim/user_group_form.rb b/decidim-core/app/forms/decidim/user_group_form.rb
index 4ae07d24cf65..106738de0b6c 100644
--- a/decidim-core/app/forms/decidim/user_group_form.rb
+++ b/decidim-core/app/forms/decidim/user_group_form.rb
@@ -29,6 +29,7 @@ class UserGroupForm < Form
def unique_document_number
return if document_number.blank?
+
errors.add :document_number, :taken if UserGroup
.with_document_number(
context.current_organization,
diff --git a/decidim-core/app/forms/decidim/user_interests_form.rb b/decidim-core/app/forms/decidim/user_interests_form.rb
index 2fb85aea8016..e9e6d45aa1ed 100644
--- a/decidim-core/app/forms/decidim/user_interests_form.rb
+++ b/decidim-core/app/forms/decidim/user_interests_form.rb
@@ -10,6 +10,7 @@ class UserInterestsForm < Form
def newsletter_notifications_at
return nil unless newsletter_notifications
+
Time.current
end
diff --git a/decidim-core/app/helpers/decidim/cells_helper.rb b/decidim-core/app/helpers/decidim/cells_helper.rb
index 3d348792ff1e..a6505868f137 100644
--- a/decidim-core/app/helpers/decidim/cells_helper.rb
+++ b/decidim-core/app/helpers/decidim/cells_helper.rb
@@ -34,6 +34,7 @@ def withdrawable?
return unless from_context
return unless proposals_controller?
return if index_action?
+
from_context.withdrawable_by?(current_user)
end
@@ -41,6 +42,7 @@ def flagable?
return unless from_context
return unless proposals_controller? || collaborative_drafts_controller?
return if index_action?
+
true
end
end
diff --git a/decidim-core/app/helpers/decidim/layout_helper.rb b/decidim-core/app/helpers/decidim/layout_helper.rb
index 3a8bbbd484a7..ba7a623b8d10 100644
--- a/decidim-core/app/helpers/decidim/layout_helper.rb
+++ b/decidim-core/app/helpers/decidim/layout_helper.rb
@@ -69,6 +69,7 @@ def _icon_classes(options = {})
def extended_navigation_bar(items, max_items: 5)
return unless items.any?
+
extra_items = items.slice((max_items + 1)..-1) || []
active_item = items.find { |item| item[:active] }
diff --git a/decidim-core/app/helpers/decidim/map_helper.rb b/decidim-core/app/helpers/decidim/map_helper.rb
index aadffef055e0..5d7ee6d01643 100644
--- a/decidim-core/app/helpers/decidim/map_helper.rb
+++ b/decidim-core/app/helpers/decidim/map_helper.rb
@@ -18,7 +18,7 @@ def static_map_link(resource, options = {})
map_url = "https://www.openstreetmap.org/?mlat=#{latitude}&mlon=#{longitude}#map=#{zoom}/#{latitude}/#{longitude}"
- link_to map_url, target: "_blank" do
+ link_to map_url, target: "_blank", rel: "noopener" do
image_tag decidim.static_map_path(sgid: resource.to_sgid.to_s)
end
end
diff --git a/decidim-core/app/helpers/decidim/meta_tags_helper.rb b/decidim-core/app/helpers/decidim/meta_tags_helper.rb
index 81ba50db463d..16a458509561 100644
--- a/decidim-core/app/helpers/decidim/meta_tags_helper.rb
+++ b/decidim-core/app/helpers/decidim/meta_tags_helper.rb
@@ -36,6 +36,7 @@ def add_decidim_meta_tags(tags)
def add_decidim_page_title(title)
@decidim_page_title ||= []
return @decidim_page_title if title.blank?
+
@decidim_page_title << title
end
diff --git a/decidim-core/app/helpers/decidim/resource_reference_helper.rb b/decidim-core/app/helpers/decidim/resource_reference_helper.rb
index a0916e23404c..cffaebc76599 100644
--- a/decidim-core/app/helpers/decidim/resource_reference_helper.rb
+++ b/decidim-core/app/helpers/decidim/resource_reference_helper.rb
@@ -12,6 +12,7 @@ module ResourceReferenceHelper
# Returns a String.
def resource_reference(resource, options = {})
return unless resource.respond_to?(:reference) && resource.reference.present?
+
"#{localized_reference(resource.reference)}
".html_safe
end
diff --git a/decidim-core/app/jobs/decidim/metric_job.rb b/decidim-core/app/jobs/decidim/metric_job.rb
index decafc164970..ebbd2f824325 100644
--- a/decidim-core/app/jobs/decidim/metric_job.rb
+++ b/decidim-core/app/jobs/decidim/metric_job.rb
@@ -7,6 +7,7 @@ class MetricJob < ApplicationJob
def perform(manager_class, organization_id, day = nil)
organization = Decidim::Organization.find_by(id: organization_id)
return unless organization
+
metric = manager_class.constantize.new(day, organization)
metric.save if metric.valid?
end
diff --git a/decidim-core/app/models/decidim/attachment.rb b/decidim-core/app/models/decidim/attachment.rb
index 5508de1832b2..5d17ca7bbd26 100644
--- a/decidim-core/app/models/decidim/attachment.rb
+++ b/decidim-core/app/models/decidim/attachment.rb
@@ -44,6 +44,7 @@ def file_type
# Returns String.
def thumbnail_url
return unless photo?
+
file.thumbnail.url
end
@@ -52,6 +53,7 @@ def thumbnail_url
# Returns String.
def big_url
return unless photo?
+
file.big.url
end
end
diff --git a/decidim-core/app/models/decidim/authorization.rb b/decidim-core/app/models/decidim/authorization.rb
index 246226490b21..6aac4ee74c67 100644
--- a/decidim-core/app/models/decidim/authorization.rb
+++ b/decidim-core/app/models/decidim/authorization.rb
@@ -53,6 +53,7 @@ def granted?
def expires_at
return unless workflow_manifest
return if workflow_manifest.expires_in.zero?
+
(granted_at || created_at) + workflow_manifest.expires_in
end
diff --git a/decidim-core/app/models/decidim/category.rb b/decidim-core/app/models/decidim/category.rb
index 2dcbb97c118e..c0d93a798033 100644
--- a/decidim-core/app/models/decidim/category.rb
+++ b/decidim-core/app/models/decidim/category.rb
@@ -44,6 +44,7 @@ def forbid_deep_nesting
def subcategories_have_same_participatory_space
return unless parent
+
self.participatory_space = parent.participatory_space
end
end
diff --git a/decidim-core/app/models/decidim/content_block.rb b/decidim-core/app/models/decidim/content_block.rb
index fd81a0eb7d46..cd41b2816f0e 100644
--- a/decidim-core/app/models/decidim/content_block.rb
+++ b/decidim-core/app/models/decidim/content_block.rb
@@ -66,6 +66,7 @@ def reload(*)
# block manifest.
def images_container
return @images_container if @images_container
+
manifest = self.manifest
@images_container = Class.new do
diff --git a/decidim-core/app/models/decidim/follow.rb b/decidim-core/app/models/decidim/follow.rb
index 7c9513cd99e1..5c3c85cdd192 100644
--- a/decidim-core/app/models/decidim/follow.rb
+++ b/decidim-core/app/models/decidim/follow.rb
@@ -36,17 +36,20 @@ def increase_following_counters
def increase_followers_counter
return unless followable.is_a?(Decidim::UserBaseEntity)
+
followable.increment!(:followers_count)
end
def decrease_following_counters
return unless user
+
user.decrement!(:following_count)
end
def decrease_followers_counter
return unless followable.is_a?(Decidim::UserBaseEntity)
return unless user
+
followable.decrement!(:followers_count)
end
# rubocop:enable Rails/SkipsModelValidations
diff --git a/decidim-core/app/models/decidim/identity.rb b/decidim-core/app/models/decidim/identity.rb
index e497b11def46..25992b933efa 100644
--- a/decidim-core/app/models/decidim/identity.rb
+++ b/decidim-core/app/models/decidim/identity.rb
@@ -25,6 +25,7 @@ def self.export_serializer
def same_organization
return if organization == user&.organization
+
errors.add(:organization, :invalid)
end
end
diff --git a/decidim-core/app/models/decidim/impersonation_log.rb b/decidim-core/app/models/decidim/impersonation_log.rb
index f063e145fe07..b2fd03ffd9ef 100644
--- a/decidim-core/app/models/decidim/impersonation_log.rb
+++ b/decidim-core/app/models/decidim/impersonation_log.rb
@@ -25,11 +25,13 @@ def expired?
def same_organization
return if admin&.organization == user&.organization
+
errors.add(:admin, :invalid)
end
def non_active_impersonation
return if ended? || expired?
+
errors.add(:admin, :invalid) if Decidim::ImpersonationLog.where(admin: admin).active.any?
end
end
diff --git a/decidim-core/app/models/decidim/newsletter.rb b/decidim-core/app/models/decidim/newsletter.rb
index 1f20927fc5f0..bc9f673d5ec9 100644
--- a/decidim-core/app/models/decidim/newsletter.rb
+++ b/decidim-core/app/models/decidim/newsletter.rb
@@ -51,6 +51,7 @@ def sended_to_partipatory_spaces
def author_belongs_to_organization
return if !author || !organization
+
errors.add(:author, :invalid) unless author.organization == organization
end
end
diff --git a/decidim-core/app/models/decidim/participatory_process_user_role.rb b/decidim-core/app/models/decidim/participatory_process_user_role.rb
index 4c10c2d2ad07..abd93954a89e 100644
--- a/decidim-core/app/models/decidim/participatory_process_user_role.rb
+++ b/decidim-core/app/models/decidim/participatory_process_user_role.rb
@@ -25,6 +25,7 @@ def self.log_presenter_class_for(_log)
# Private: check if the process and the user have the same organization
def user_and_participatory_process_same_organization
return if !participatory_process || !user
+
errors.add(:participatory_process, :invalid) unless user.organization == participatory_process.organization
end
end
diff --git a/decidim-core/app/models/decidim/participatory_space_private_user.rb b/decidim-core/app/models/decidim/participatory_space_private_user.rb
index 5ea212bf321b..1ae4c801b2e3 100644
--- a/decidim-core/app/models/decidim/participatory_space_private_user.rb
+++ b/decidim-core/app/models/decidim/participatory_space_private_user.rb
@@ -27,6 +27,7 @@ def self.log_presenter_class_for(_log)
# Private: check if the participatory space and the user have the same organization
def user_and_participatory_space_same_organization
return if !privatable_to || !user
+
errors.add(:privatable_to, :invalid) unless user.organization == privatable_to.organization
end
end
diff --git a/decidim-core/app/models/decidim/permission_action.rb b/decidim-core/app/models/decidim/permission_action.rb
index a3fa6956a589..76335b53612b 100644
--- a/decidim-core/app/models/decidim/permission_action.rb
+++ b/decidim-core/app/models/decidim/permission_action.rb
@@ -23,6 +23,7 @@ def initialize(action:, scope:, subject:)
def allow!
raise PermissionCannotBeDisallowedError, "Allowing a previously disallowed action is not permitted: #{inspect}" if @state == :disallowed
+
@state = :allowed
end
@@ -32,6 +33,7 @@ def disallow!
def allowed?
raise PermissionNotSetError, "Permission hasn't been allowed or disallowed yet: #{inspect}" if @state.blank?
+
@state == :allowed
end
diff --git a/decidim-core/app/models/decidim/report.rb b/decidim-core/app/models/decidim/report.rb
index 42aef4d6499d..18941f88ce12 100644
--- a/decidim-core/app/models/decidim/report.rb
+++ b/decidim-core/app/models/decidim/report.rb
@@ -28,6 +28,7 @@ def self.export_serializer
# Private: check if the moderation and the user have the same organization
def user_and_moderation_same_organization
return if !moderation || !user
+
errors.add(:moderation, :invalid) unless user.organization == moderation.organization
end
end
diff --git a/decidim-core/app/models/decidim/scope.rb b/decidim-core/app/models/decidim/scope.rb
index 8f123651c811..613c642e1538 100644
--- a/decidim-core/app/models/decidim/scope.rb
+++ b/decidim-core/app/models/decidim/scope.rb
@@ -73,6 +73,7 @@ def part_of_scopes(root = nil)
def forbid_cycles
return unless parent
+
errors.add(:parent_id, :cycle_detected) if parent.part_of.include?(id)
end
diff --git a/decidim-core/app/models/decidim/static_page.rb b/decidim-core/app/models/decidim/static_page.rb
index 13e325361b4a..e5768c556a98 100644
--- a/decidim-core/app/models/decidim/static_page.rb
+++ b/decidim-core/app/models/decidim/static_page.rb
@@ -65,6 +65,7 @@ def to_param
# set the organization tos_version
def update_organization_tos_version
return unless slug == "terms-and-conditions"
+
organization.update!(tos_version: created_at)
end
diff --git a/decidim-core/app/models/decidim/user.rb b/decidim-core/app/models/decidim/user.rb
index 14fee293e4e4..3195403fec93 100644
--- a/decidim-core/app/models/decidim/user.rb
+++ b/decidim-core/app/models/decidim/user.rb
@@ -182,6 +182,7 @@ def interested_scopes
# If the user has been deleted or it is managed the email field is not required anymore.
def email_required?
return false if deleted? || managed?
+
super
end
@@ -189,6 +190,7 @@ def email_required?
# If the user is managed the password field is not required anymore.
def password_required?
return false if managed?
+
super
end
diff --git a/decidim-core/app/permissions/decidim/permissions.rb b/decidim-core/app/permissions/decidim/permissions.rb
index c71b0959a3fe..29437cc44c48 100644
--- a/decidim-core/app/permissions/decidim/permissions.rb
+++ b/decidim-core/app/permissions/decidim/permissions.rb
@@ -30,11 +30,13 @@ def permissions
def read_public_pages_action?
return unless permission_action.subject == :public_page &&
permission_action.action == :read
+
allow!
end
def locales_action?
return unless permission_action.subject == :locales
+
allow!
end
@@ -45,21 +47,25 @@ def component_public_action?
return allow! if component.published?
return allow! if user_can_admin_component?
return allow! if user_can_admin_component_via_space?
+
disallow!
end
def search_scope_action?
return unless permission_action.subject == :scope
+
toggle_allow([:search, :pick].include?(permission_action.action))
end
def manage_self_user_action?
return unless permission_action.subject == :user
+
toggle_allow(context.fetch(:current_user, nil) == user)
end
def authorization_action?
return unless permission_action.subject == :authorization
+
authorization = context.fetch(:authorization, nil)
case permission_action.action
diff --git a/decidim-core/app/presenters/decidim/admin_log/organization_presenter.rb b/decidim-core/app/presenters/decidim/admin_log/organization_presenter.rb
index 83f42772b648..3797c59daaf8 100644
--- a/decidim-core/app/presenters/decidim/admin_log/organization_presenter.rb
+++ b/decidim-core/app/presenters/decidim/admin_log/organization_presenter.rb
@@ -81,6 +81,7 @@ def id_documents_attributes_mapping
def action_string
return "decidim.admin_log.organization.update_id_documents_config" if action == "update_id_documents_config"
+
"decidim.admin_log.organization.update"
end
diff --git a/decidim-core/app/presenters/decidim/hashtag_presenter.rb b/decidim-core/app/presenters/decidim/hashtag_presenter.rb
index 12ce8c2b5b26..9e954ac1ff60 100644
--- a/decidim-core/app/presenters/decidim/hashtag_presenter.rb
+++ b/decidim-core/app/presenters/decidim/hashtag_presenter.rb
@@ -27,7 +27,7 @@ def hashtag_path
end
def display_hashtag
- link_to name, decidim.search_path(term: name), target: "_blank", class: "hashtag-mention"
+ link_to name, decidim.search_path(term: name), target: "_blank", class: "hashtag-mention", rel: "noopener"
end
def display_hashtag_name
diff --git a/decidim-core/app/presenters/decidim/log/base_presenter.rb b/decidim-core/app/presenters/decidim/log/base_presenter.rb
index 9c51b61a874c..22e2b326829d 100644
--- a/decidim-core/app/presenters/decidim/log/base_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/base_presenter.rb
@@ -234,6 +234,7 @@ def i18n_labels_scope; end
# Returns an Array of Strings.
def action_log_extra_classes
return ["logs__log--deletion"] if action.to_s == "delete"
+
[]
end
diff --git a/decidim-core/app/presenters/decidim/log/diff_presenter.rb b/decidim-core/app/presenters/decidim/log/diff_presenter.rb
index a4b93b80124e..134e8a6faf19 100644
--- a/decidim-core/app/presenters/decidim/log/diff_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/diff_presenter.rb
@@ -111,7 +111,7 @@ def presenter_klass_for(type)
begin
return klass.constantize
- rescue NameError => _exception
+ rescue NameError => _e
default_klass
end
end
diff --git a/decidim-core/app/presenters/decidim/log/value_types/area_presenter.rb b/decidim-core/app/presenters/decidim/log/value_types/area_presenter.rb
index 855353a85898..fc56c8ac116a 100644
--- a/decidim-core/app/presenters/decidim/log/value_types/area_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/value_types/area_presenter.rb
@@ -14,6 +14,7 @@ class AreaPresenter < DefaultPresenter
def present
return unless value
return h.translated_attribute(area.name) if area
+
I18n.t("not_found", id: value, scope: "decidim.log.value_types.area_presenter")
end
diff --git a/decidim-core/app/presenters/decidim/log/value_types/area_type_presenter.rb b/decidim-core/app/presenters/decidim/log/value_types/area_type_presenter.rb
index 6cd9d9d95173..69603bc19c05 100644
--- a/decidim-core/app/presenters/decidim/log/value_types/area_type_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/value_types/area_type_presenter.rb
@@ -14,6 +14,7 @@ class AreaTypePresenter < DefaultPresenter
def present
return unless value
return h.translated_attribute(area_type.name) if area_type
+
I18n.t("not_found", id: value, scope: "decidim.log.value_types.area_type_presenter")
end
diff --git a/decidim-core/app/presenters/decidim/log/value_types/currency_presenter.rb b/decidim-core/app/presenters/decidim/log/value_types/currency_presenter.rb
index 68c90125e01b..bbea8448dd87 100644
--- a/decidim-core/app/presenters/decidim/log/value_types/currency_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/value_types/currency_presenter.rb
@@ -12,6 +12,7 @@ class CurrencyPresenter < DefaultPresenter
# Returns an HTML-safe String.
def present
return unless value
+
h.number_to_currency(value, unit: Decidim.currency_unit)
end
end
diff --git a/decidim-core/app/presenters/decidim/log/value_types/date_presenter.rb b/decidim-core/app/presenters/decidim/log/value_types/date_presenter.rb
index 88d4674723a8..124abed7804b 100644
--- a/decidim-core/app/presenters/decidim/log/value_types/date_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/value_types/date_presenter.rb
@@ -12,6 +12,7 @@ class DatePresenter < DefaultPresenter
# Returns an HTML-safe String.
def present
return unless value
+
h.l(value, format: :long)
end
end
diff --git a/decidim-core/app/presenters/decidim/log/value_types/locale_presenter.rb b/decidim-core/app/presenters/decidim/log/value_types/locale_presenter.rb
index 8e8c488399f7..2e356b085a6c 100644
--- a/decidim-core/app/presenters/decidim/log/value_types/locale_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/value_types/locale_presenter.rb
@@ -12,6 +12,7 @@ class LocalePresenter < DefaultPresenter
# Returns an HTML-safe String.
def present
return unless value
+
I18n.with_locale(value) { I18n.t("locale.name") }
end
end
diff --git a/decidim-core/app/presenters/decidim/log/value_types/percentage_presenter.rb b/decidim-core/app/presenters/decidim/log/value_types/percentage_presenter.rb
index 36b6134ddf90..c6a20e49a487 100644
--- a/decidim-core/app/presenters/decidim/log/value_types/percentage_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/value_types/percentage_presenter.rb
@@ -13,6 +13,7 @@ class PercentagePresenter < DefaultPresenter
# Returns an HTML-safe String.
def present
return unless value
+
h.number_to_percentage(value, strip_insignificant_zeros: true)
end
end
diff --git a/decidim-core/app/presenters/decidim/log/value_types/scope_presenter.rb b/decidim-core/app/presenters/decidim/log/value_types/scope_presenter.rb
index ce2176b03fea..a81a186eed2b 100644
--- a/decidim-core/app/presenters/decidim/log/value_types/scope_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/value_types/scope_presenter.rb
@@ -14,6 +14,7 @@ class ScopePresenter < DefaultPresenter
def present
return unless value
return h.translated_attribute(scope.name) if scope
+
I18n.t("not_found", id: value, scope: "decidim.log.value_types.scope_presenter")
end
diff --git a/decidim-core/app/presenters/decidim/log/value_types/scope_type_presenter.rb b/decidim-core/app/presenters/decidim/log/value_types/scope_type_presenter.rb
index ab9f61b78195..afaa31c49852 100644
--- a/decidim-core/app/presenters/decidim/log/value_types/scope_type_presenter.rb
+++ b/decidim-core/app/presenters/decidim/log/value_types/scope_type_presenter.rb
@@ -14,6 +14,7 @@ class ScopeTypePresenter < DefaultPresenter
def present
return unless value
return h.translated_attribute(scope_type.name) if scope_type
+
I18n.t("not_found", id: value, scope: "decidim.log.value_types.scope_type_presenter")
end
diff --git a/decidim-core/app/presenters/decidim/metric_charts_presenter.rb b/decidim-core/app/presenters/decidim/metric_charts_presenter.rb
index 3a695c9899cf..6a5d17bc6cc2 100644
--- a/decidim-core/app/presenters/decidim/metric_charts_presenter.rb
+++ b/decidim-core/app/presenters/decidim/metric_charts_presenter.rb
@@ -30,6 +30,7 @@ def render_not_highlighted(not_highlighted_metrics)
safe_join(
metrics_group.map do |metric|
next "" if metric.blank?
+
render_metrics_data(metric.metric_name, klass: "column medium-6", graph_klass: "small")
end
)
diff --git a/decidim-core/app/presenters/decidim/metric_object_presenter.rb b/decidim-core/app/presenters/decidim/metric_object_presenter.rb
index 3f6632e82ca4..bb7616c39295 100644
--- a/decidim-core/app/presenters/decidim/metric_object_presenter.rb
+++ b/decidim-core/app/presenters/decidim/metric_object_presenter.rb
@@ -7,21 +7,25 @@ module Decidim
class MetricObjectPresenter < SimpleDelegator
def attr_int(attr, default: 0)
return default unless __getobj__
+
__getobj__[attr] || default
end
def attr_string(attr, default: "")
return default unless __getobj__
+
__getobj__[attr].presence || default
end
def attr_date(attr, default: "")
return default unless __getobj__
+
__getobj__[attr].try(:strftime, "%Y-%m-%d") || default
end
def attr_translated(attr, locale: I18n.locale, default: "")
return default unless __getobj__
+
__getobj__[attr].try(:[], locale.to_s).presence || default
end
end
diff --git a/decidim-core/app/queries/decidim/metric_manage.rb b/decidim-core/app/queries/decidim/metric_manage.rb
index ecf871f8270a..da3240cf1e9b 100644
--- a/decidim-core/app/queries/decidim/metric_manage.rb
+++ b/decidim-core/app/queries/decidim/metric_manage.rb
@@ -11,6 +11,7 @@ def self.for(day_string, organization)
def initialize(day_string, organization)
@day = day_string.present? ? Date.parse(day_string) : Time.zone.yesterday
raise ArgumentError, "[ERROR] Malformed `day` argument. Format must be `YYYY-MM-DD` and in the past" if @day > Time.zone.today
+
@day ||= Time.zone.yesterday
@organization = organization
@metric_name = metric_name
@@ -28,6 +29,7 @@ def save
return @registry if @registry
return if cumulative.zero?
+
@registry = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name, organization: @organization)
@registry.assign_attributes(cumulative: cumulative, quantity: quantity)
@registry.save!
@@ -61,6 +63,7 @@ def quantity
def retrieve_participatory_spaces
Decidim.participatory_space_manifests.map do |space_manifest|
next unless space_manifest.name == :participatory_processes # Temporal limitation
+
space_manifest.participatory_spaces.call(@organization)
end.flatten.compact
end
diff --git a/decidim-core/app/queries/decidim/metric_measure.rb b/decidim-core/app/queries/decidim/metric_measure.rb
index 980a80f83f41..4b6673456da8 100644
--- a/decidim-core/app/queries/decidim/metric_measure.rb
+++ b/decidim-core/app/queries/decidim/metric_measure.rb
@@ -9,6 +9,7 @@ class MetricMeasure
def initialize(day, resource)
@day = day.try(:to_date) || Time.zone.yesterday
raise ArgumentError, "[ERROR] Malformed `day` argument. Format must be `YYYY-MM-DD` and in the past" if @day > Time.zone.today
+
@day ||= Time.zone.yesterday
@resource = resource
end
diff --git a/decidim-core/app/queries/decidim/metrics/followers_metric_manage.rb b/decidim-core/app/queries/decidim/metrics/followers_metric_manage.rb
index 9f4541259c52..e0c0f1c66fba 100644
--- a/decidim-core/app/queries/decidim/metrics/followers_metric_manage.rb
+++ b/decidim-core/app/queries/decidim/metrics/followers_metric_manage.rb
@@ -11,10 +11,12 @@ def metric_name
def save
return @registry if @registry
+
@registry = []
query.each do |key, results|
cumulative_value = results[:cumulative_users].count
next if cumulative_value.zero?
+
quantity_value = results[:quantity_users].count || 0
space_type, space_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
@@ -49,6 +51,7 @@ def query
components.each do |component|
operation_manifest = Decidim.metrics_operation.for(:followers, component.manifest_name)
next grouped_participants unless operation_manifest
+
component_participants = operation_manifest.calculate(@day, component)
grouped_participants[key].merge!(component_participants || {}) do |_key, grouped_users, component_users|
grouped_users | component_users
diff --git a/decidim-core/app/queries/decidim/metrics/participants_metric_manage.rb b/decidim-core/app/queries/decidim/metrics/participants_metric_manage.rb
index ee63dfa8f07c..480b0052997b 100644
--- a/decidim-core/app/queries/decidim/metrics/participants_metric_manage.rb
+++ b/decidim-core/app/queries/decidim/metrics/participants_metric_manage.rb
@@ -14,10 +14,12 @@ def metric_name
def save
return @registry if @registry
+
@registry = []
query.each do |key, results|
cumulative_value = results[:cumulative_users].count
next if cumulative_value.zero?
+
quantity_value = results[:quantity_users].count || 0
space_type, space_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
@@ -45,6 +47,7 @@ def query
components.each do |component|
operation_manifest = Decidim.metrics_operation.for(:participants, component.manifest_name)
next grouped_participants unless operation_manifest
+
component_participants = operation_manifest.calculate(@day, component)
grouped_participants[key].merge!(component_participants || {}) do |_key, grouped_users, component_users|
grouped_users | component_users
@@ -54,6 +57,7 @@ def query
# Special case for comments ONLY
operation_manifest = Decidim.metrics_operation.for(:participants, :comments)
next grouped_participants unless operation_manifest
+
comments_participants = operation_manifest.calculate(@day, participatory_space)
grouped_participants[key].merge!(comments_participants || {}) do |_key, grouped_users, comment_users|
grouped_users | comment_users
diff --git a/decidim-core/app/resolvers/decidim/core/metric_resolver.rb b/decidim-core/app/resolvers/decidim/core/metric_resolver.rb
index 7c6f96789624..c85a25132b50 100644
--- a/decidim-core/app/resolvers/decidim/core/metric_resolver.rb
+++ b/decidim-core/app/resolvers/decidim/core/metric_resolver.rb
@@ -48,6 +48,7 @@ def scope
def filter
@filters.each do |key, value|
next unless Decidim::Metric.column_names.include? key.to_s
+
@records = @records.where("#{key}": value)
end
end
diff --git a/decidim-core/app/services/decidim/action_authorizer.rb b/decidim-core/app/services/decidim/action_authorizer.rb
index 31c64a7ab142..dfcf9ac6b732 100644
--- a/decidim-core/app/services/decidim/action_authorizer.rb
+++ b/decidim-core/app/services/decidim/action_authorizer.rb
@@ -47,6 +47,7 @@ def authorization_handlers
def permission
return nil unless component && action
+
@permission ||= resource&.permissions&.fetch(action, nil) || component.permissions&.fetch(action, nil)
end
diff --git a/decidim-core/app/services/decidim/action_logger.rb b/decidim-core/app/services/decidim/action_logger.rb
index cd36ff757291..fd643d4be38f 100644
--- a/decidim-core/app/services/decidim/action_logger.rb
+++ b/decidim-core/app/services/decidim/action_logger.rb
@@ -75,6 +75,7 @@ def component
def participatory_space
return component.participatory_space if component.respond_to?(:participatory_space)
+
resource.participatory_space if resource.respond_to?(:participatory_space)
end
diff --git a/decidim-core/app/services/decidim/activity_search.rb b/decidim-core/app/services/decidim/activity_search.rb
index 8afdd419baeb..00ec472d6be2 100644
--- a/decidim-core/app/services/decidim/activity_search.rb
+++ b/decidim-core/app/services/decidim/activity_search.rb
@@ -114,6 +114,7 @@ def filter_follows(query)
chained_conditions = conditions.inject do |previous_condition, condition|
next condition unless previous_condition
+
previous_condition.or(condition)
end
diff --git a/decidim-core/app/services/decidim/email_notification_generator.rb b/decidim-core/app/services/decidim/email_notification_generator.rb
index 2b00ef16744d..fe03ce0dafbe 100644
--- a/decidim-core/app/services/decidim/email_notification_generator.rb
+++ b/decidim-core/app/services/decidim/email_notification_generator.rb
@@ -39,11 +39,13 @@ def generate
followers.each do |recipient|
next unless ["all", "followed-only"].include?(recipient.notification_types)
next unless participatory_space.present? && participatory_space.is_a?(Decidim::Participable) && participatory_space.can_participate?(recipient)
+
send_email_to(recipient, user_role: :follower)
end
affected_users.each do |recipient|
next unless ["all", "own-only"].include?(recipient.notification_types)
+
send_email_to(recipient, user_role: :affected_user)
end
end
@@ -83,6 +85,7 @@ def component
def participatory_space
return resource if resource.is_a?(Decidim::ParticipatorySpaceResourceable)
+
component&.participatory_space
end
end
diff --git a/decidim-core/app/services/decidim/traceability.rb b/decidim-core/app/services/decidim/traceability.rb
index e95fde87fca9..dc8d0e18cb8d 100644
--- a/decidim-core/app/services/decidim/traceability.rb
+++ b/decidim-core/app/services/decidim/traceability.rb
@@ -109,6 +109,7 @@ def version_editor(version)
def gid(author)
return if author.blank?
return author.to_gid if author.respond_to?(:to_gid)
+
author
end
diff --git a/decidim-core/app/uploaders/decidim/application_uploader.rb b/decidim-core/app/uploaders/decidim/application_uploader.rb
index 5ea3874ddf21..8a0121d1656c 100644
--- a/decidim-core/app/uploaders/decidim/application_uploader.rb
+++ b/decidim-core/app/uploaders/decidim/application_uploader.rb
@@ -11,6 +11,7 @@ def store_dir
default_path = "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
return File.join(Decidim.base_uploads_path, default_path) if Decidim.base_uploads_path.present?
+
default_path
end
end
diff --git a/decidim-core/app/uploaders/decidim/attachment_uploader.rb b/decidim-core/app/uploaders/decidim/attachment_uploader.rb
index 75949c329af0..9d2c8093bfe9 100644
--- a/decidim-core/app/uploaders/decidim/attachment_uploader.rb
+++ b/decidim-core/app/uploaders/decidim/attachment_uploader.rb
@@ -62,6 +62,7 @@ def validate_dimensions
manipulate! do |image|
raise CarrierWave::IntegrityError, I18n.t("carrierwave.errors.image_too_big") if image.dimensions.any? { |dimension| dimension > max_image_height_or_width }
+
image
end
end
diff --git a/decidim-core/app/uploaders/decidim/data_portability_uploader.rb b/decidim-core/app/uploaders/decidim/data_portability_uploader.rb
index 1d6f5e6e2377..577c0ac7272a 100644
--- a/decidim-core/app/uploaders/decidim/data_portability_uploader.rb
+++ b/decidim-core/app/uploaders/decidim/data_portability_uploader.rb
@@ -13,6 +13,7 @@ def store_dir
default_path = "tmp/data-portability/"
return File.join(Decidim.base_uploads_path, default_path) if Decidim.base_uploads_path.present?
+
default_path
end
end
diff --git a/decidim-core/app/uploaders/decidim/open_data_uploader.rb b/decidim-core/app/uploaders/decidim/open_data_uploader.rb
index e326788e612a..0ddd8fae21bf 100644
--- a/decidim-core/app/uploaders/decidim/open_data_uploader.rb
+++ b/decidim-core/app/uploaders/decidim/open_data_uploader.rb
@@ -11,6 +11,7 @@ def store_dir
default_path = "uploads/open-data"
return File.join(Decidim.base_uploads_path, default_path) if Decidim.base_uploads_path.present?
+
default_path
end
end
diff --git a/decidim-core/app/validators/etiquette_validator.rb b/decidim-core/app/validators/etiquette_validator.rb
index ba8238f537f1..4881e113e0c5 100644
--- a/decidim-core/app/validators/etiquette_validator.rb
+++ b/decidim-core/app/validators/etiquette_validator.rb
@@ -17,26 +17,31 @@ def validate_each(record, attribute, value)
def validate_caps(record, attribute, value)
return if value.scan(/[A-Z]/).length < value.length / 4
+
record.errors.add(attribute, options[:message] || :too_much_caps)
end
def validate_marks(record, attribute, value)
return if value.scan(/[!?¡¿]{2,}/).empty?
+
record.errors.add(attribute, options[:message] || :too_many_marks)
end
def validate_long_words(record, attribute, value)
return if value.scan(/[A-z]{35,}/).empty?
+
record.errors.add(attribute, options[:message] || :long_words)
end
def validate_caps_first(record, attribute, value)
return if value.scan(/\A[a-z]{1}/).empty?
+
record.errors.add(attribute, options[:message] || :must_start_with_caps)
end
def validate_length(record, attribute, value)
return if value.length > 15
+
record.errors.add(attribute, options[:message] || :too_short)
end
end
diff --git a/decidim-core/db/migrate/20180226140756_add_version_to_action_logs.rb b/decidim-core/db/migrate/20180226140756_add_version_to_action_logs.rb
index d49f916e6122..eb22d2df0b5a 100644
--- a/decidim-core/db/migrate/20180226140756_add_version_to_action_logs.rb
+++ b/decidim-core/db/migrate/20180226140756_add_version_to_action_logs.rb
@@ -11,6 +11,7 @@ def up
ActionLog.find_each do |action_log|
version_id = action_log.extra.dig("version", "id")
next unless version_id
+
# rubocop:disable Rails/SkipsModelValidations
action_log.update_column(:version_id, version_id)
# rubocop:enable Rails/SkipsModelValidations
diff --git a/decidim-core/db/migrate/20180305132906_rename_features_to_components.rb b/decidim-core/db/migrate/20180305132906_rename_features_to_components.rb
index 2a3feda223a6..1228cbe797a4 100644
--- a/decidim-core/db/migrate/20180305132906_rename_features_to_components.rb
+++ b/decidim-core/db/migrate/20180305132906_rename_features_to_components.rb
@@ -26,6 +26,7 @@ def change
ActionLog.find_each do |log|
new_extra = log.extra.dup
next if new_extra["component"].present?
+
new_extra["component"] = new_extra["feature"]
new_extra.delete("feature")
log.extra = new_extra
diff --git a/decidim-core/lib/decidim/attributes/localized_date.rb b/decidim-core/lib/decidim/attributes/localized_date.rb
index 7326e6fde050..bf749dc6c81b 100644
--- a/decidim-core/lib/decidim/attributes/localized_date.rb
+++ b/decidim-core/lib/decidim/attributes/localized_date.rb
@@ -7,6 +7,7 @@ module Attributes
class LocalizedDate < Virtus::Attribute
def coerce(value)
return value unless value.is_a?(String)
+
Date.strptime(value, I18n.t("date.formats.decidim_short"))
rescue ArgumentError
nil
diff --git a/decidim-core/lib/decidim/attributes/time_with_zone.rb b/decidim-core/lib/decidim/attributes/time_with_zone.rb
index db9674386d84..8daff3ecb82f 100644
--- a/decidim-core/lib/decidim/attributes/time_with_zone.rb
+++ b/decidim-core/lib/decidim/attributes/time_with_zone.rb
@@ -7,6 +7,7 @@ module Attributes
class TimeWithZone < Virtus::Attribute
def coerce(value)
return value unless value.is_a?(String)
+
Time.zone.strptime(value, I18n.t("time.formats.decidim_short"))
rescue ArgumentError
nil
diff --git a/decidim-core/lib/decidim/authorable.rb b/decidim-core/lib/decidim/authorable.rb
index c6b803ae1bae..43a7cc083ed7 100644
--- a/decidim-core/lib/decidim/authorable.rb
+++ b/decidim-core/lib/decidim/authorable.rb
@@ -36,16 +36,19 @@ def normalized_author
def verified_user_group
return unless user_group
+
errors.add :user_group, :invalid unless user_group.verified?
end
def user_group_membership
return unless user_group
+
errors.add :user_group, :invalid unless user_group.users.include? author
end
def author_belongs_to_organization
return if !author || !organization
+
errors.add(:author, :invalid) unless author == organization || author.respond_to?(:organization) && author.organization == organization
end
end
diff --git a/decidim-core/lib/decidim/component_manifest.rb b/decidim-core/lib/decidim/component_manifest.rb
index 9a37ef984fa5..526e5d03fd7e 100644
--- a/decidim-core/lib/decidim/component_manifest.rb
+++ b/decidim-core/lib/decidim/component_manifest.rb
@@ -83,6 +83,7 @@ def on(event_name, &block)
# Returns nothing.
def run_hooks(event_name, context = nil)
return unless hooks[event_name]
+
hooks[event_name.to_sym].each do |hook|
hook.call(context)
end
@@ -146,6 +147,7 @@ def settings(name = :global, &block)
# Returns nothing.
def exports(name, &block)
return unless name
+
@exports ||= []
@exports << [name, block]
@export_manifests = nil
diff --git a/decidim-core/lib/decidim/content_parsers/hashtag_parser.rb b/decidim-core/lib/decidim/content_parsers/hashtag_parser.rb
index 361077e81c15..1f6332c63f6e 100644
--- a/decidim-core/lib/decidim/content_parsers/hashtag_parser.rb
+++ b/decidim-core/lib/decidim/content_parsers/hashtag_parser.rb
@@ -18,7 +18,7 @@ class HashtagParser < BaseParser
# Matches a hashtag if it starts with a letter or number
# and only contains letters, numbers or underscores.
- HASHTAG_REGEX = /\B#([[:alnum:]](?:[[:alnum:]]|_)*)\b/i
+ HASHTAG_REGEX = /\B#([[:alnum:]](?:[[:alnum:]]|_)*)\b/i.freeze
# Replaces hashtags name with new or existing hashtags models global ids.
#
diff --git a/decidim-core/lib/decidim/content_parsers/user_parser.rb b/decidim-core/lib/decidim/content_parsers/user_parser.rb
index 096ede418517..8b49085e0835 100644
--- a/decidim-core/lib/decidim/content_parsers/user_parser.rb
+++ b/decidim-core/lib/decidim/content_parsers/user_parser.rb
@@ -18,7 +18,7 @@ class UserParser < BaseParser
# Matches a nickname if it starts with a letter or number
# and only contains letters, numbers or underscores.
- MENTION_REGEX = /\B@([a-zA-Z0-9]\w*)\b/
+ MENTION_REGEX = /\B@([a-zA-Z0-9]\w*)\b/.freeze
# Replaces found mentions matching a nickname of an existing
# user in the current organization with a global id. Other
diff --git a/decidim-core/lib/decidim/content_processor.rb b/decidim-core/lib/decidim/content_processor.rb
index 497e7fe55607..3127ed272a13 100644
--- a/decidim-core/lib/decidim/content_processor.rb
+++ b/decidim-core/lib/decidim/content_processor.rb
@@ -64,6 +64,7 @@ def self.parse_with_processor(_type, content, context)
parsed = if content.is_a?(Hash)
Decidim.content_processors.each_with_object(rewrite: content, metadata: {}) do |type, result|
next unless type == :hashtag
+
result[:rewrite].each do |key, value|
parser = parser_klass(type).constantize.new(value, context)
result[:rewrite][key] = parser.rewrite
@@ -73,6 +74,7 @@ def self.parse_with_processor(_type, content, context)
else
Decidim.content_processors.each_with_object(rewrite: content, metadata: {}) do |type, result|
next unless type == :hashtag
+
parser = parser_klass(type).constantize.new(result[:rewrite], context)
result[:rewrite] = parser.rewrite
result[:metadata][type] = parser.metadata
diff --git a/decidim-core/lib/decidim/content_renderers/hashtag_renderer.rb b/decidim-core/lib/decidim/content_renderers/hashtag_renderer.rb
index 3547a0f08aa8..861796d5d976 100644
--- a/decidim-core/lib/decidim/content_renderers/hashtag_renderer.rb
+++ b/decidim-core/lib/decidim/content_renderers/hashtag_renderer.rb
@@ -13,7 +13,7 @@ class HashtagRenderer < BaseRenderer
include Decidim::SanitizeHelper
# Matches a global id representing a Decidim::Hashtag
- GLOBAL_ID_REGEX = %r{gid:\/\/[\w-]*\/Decidim::Hashtag\/(\d+)\/?(_?)([[:alnum:]](?:[[:alnum:]]|_)*)?\b}
+ GLOBAL_ID_REGEX = %r{gid:\/\/[\w-]*\/Decidim::Hashtag\/(\d+)\/?(_?)([[:alnum:]](?:[[:alnum:]]|_)*)?\b}.freeze
# Replaces found Global IDs matching an existing hashtag with
# a link to their detail page. The Global IDs representing an
diff --git a/decidim-core/lib/decidim/content_renderers/user_renderer.rb b/decidim-core/lib/decidim/content_renderers/user_renderer.rb
index 91929933ef37..d7d95bc2c68d 100644
--- a/decidim-core/lib/decidim/content_renderers/user_renderer.rb
+++ b/decidim-core/lib/decidim/content_renderers/user_renderer.rb
@@ -10,7 +10,7 @@ module ContentRenderers
# @see BaseRenderer Examples of how to use a content renderer
class UserRenderer < BaseRenderer
# Matches a global id representing a Decidim::User
- GLOBAL_ID_REGEX = %r{gid://\S+/Decidim::User/\d+}
+ GLOBAL_ID_REGEX = %r{gid://\S+/Decidim::User/\d+}.freeze
# Replaces found Global IDs matching an existing user with
# a link to their profile. The Global IDs representing an
@@ -21,7 +21,7 @@ def render
content.gsub(GLOBAL_ID_REGEX) do |user_gid|
user = GlobalID::Locator.locate(user_gid)
Decidim::UserPresenter.new(user).display_mention
- rescue ActiveRecord::RecordNotFound => _ex
+ rescue ActiveRecord::RecordNotFound => _e
""
end
end
diff --git a/decidim-core/lib/decidim/core/test/shared_examples/has_attachment_collections.rb b/decidim-core/lib/decidim/core/test/shared_examples/has_attachment_collections.rb
index 68753290ff20..1de8480ce6c9 100644
--- a/decidim-core/lib/decidim/core/test/shared_examples/has_attachment_collections.rb
+++ b/decidim-core/lib/decidim/core/test/shared_examples/has_attachment_collections.rb
@@ -26,7 +26,7 @@
end
end
- context "that are ordered by weight", processing_uploads_for: Decidim::AttachmentUploader do
+ context "when are ordered by weight", processing_uploads_for: Decidim::AttachmentUploader do
let!(:last_attachment_collection) { create(:attachment_collection, collection_for: collection_for, weight: 2) }
let!(:document_one) { create(:attachment, :with_pdf, attached_to: attached_to, attachment_collection: last_attachment_collection) }
diff --git a/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb b/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb
index 0c83632814f4..6beb1e181553 100644
--- a/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb
+++ b/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb
@@ -23,7 +23,7 @@
end
end
- context "that are ordered by weight", processing_uploads_for: Decidim::AttachmentUploader do
+ context "when are ordered by weight", processing_uploads_for: Decidim::AttachmentUploader do
let!(:last_document) { create(:attachment, :with_pdf, attached_to: attached_to, weight: 2) }
let!(:first_document) { create(:attachment, :with_pdf, attached_to: attached_to, weight: 1) }
let!(:last_image) { create(:attachment, attached_to: attached_to, weight: 2) }
diff --git a/decidim-core/lib/decidim/data_portability_file_zipper.rb b/decidim-core/lib/decidim/data_portability_file_zipper.rb
index db9cdb51f300..9dd0a7f9d620 100644
--- a/decidim-core/lib/decidim/data_portability_file_zipper.rb
+++ b/decidim-core/lib/decidim/data_portability_file_zipper.rb
@@ -38,8 +38,10 @@ def make_zip
zipfile = Zip::File.open(file_path)
@export_images.each do |image_block|
next if image_block.last.nil?
+
image_block.last.each do |image|
next if image.file.nil?
+
folder_name = image_block.first.parameterize
uploader = Decidim::ApplicationUploader.new(image.model, image.mounted_as)
if image.file.respond_to? :file
@@ -54,6 +56,7 @@ def make_zip
end
my_image_path = File.open(image.file.file)
next unless File.exist?(my_image_path)
+
zipfile.add("#{folder_name}/#{image.file.filename}", my_image_path)
CarrierWave.clean_cached_files!
end
diff --git a/decidim-core/lib/decidim/events/author_event.rb b/decidim-core/lib/decidim/events/author_event.rb
index af11a89295e1..f2b78bf6726b 100644
--- a/decidim-core/lib/decidim/events/author_event.rb
+++ b/decidim-core/lib/decidim/events/author_event.rb
@@ -30,6 +30,7 @@ def author_url
def author_presenter
return unless author
+
@author_presenter ||= Decidim::UserPresenter.new(author)
end
diff --git a/decidim-core/lib/decidim/events/base_event.rb b/decidim-core/lib/decidim/events/base_event.rb
index 943c6f64ad50..eaba82f025ae 100644
--- a/decidim-core/lib/decidim/events/base_event.rb
+++ b/decidim-core/lib/decidim/events/base_event.rb
@@ -106,6 +106,7 @@ def component
def participatory_space
return resource if resource.is_a?(Decidim::ParticipatorySpaceResourceable)
+
component&.participatory_space
end
end
diff --git a/decidim-core/lib/decidim/events/coauthor_event.rb b/decidim-core/lib/decidim/events/coauthor_event.rb
index 86e6adcfa5da..04cc72079dbd 100644
--- a/decidim-core/lib/decidim/events/coauthor_event.rb
+++ b/decidim-core/lib/decidim/events/coauthor_event.rb
@@ -30,6 +30,7 @@ def author_url
def author_presenter
return unless author
+
@author_presenter ||= Decidim::UserPresenter.new(author)
end
diff --git a/decidim-core/lib/decidim/events/simple_event.rb b/decidim-core/lib/decidim/events/simple_event.rb
index cfe894ca2772..896dc6cfbfde 100644
--- a/decidim-core/lib/decidim/events/simple_event.rb
+++ b/decidim-core/lib/decidim/events/simple_event.rb
@@ -54,6 +54,7 @@ def notification_title
# then the role is appended to the i18n scope.
def i18n_scope
return event_name if user_role.blank? || !event_has_roles?
+
"#{event_name}.#{user_role}"
end
@@ -79,12 +80,14 @@ def i18n_options
# Caches the path for the given resource when it's a Decidim::Component.
def resource_path
return super unless resource.is_a?(Decidim::Component)
+
@resource_path ||= main_component_path(resource)
end
# Caches the URL for the given resource when it's a Decidim::Component.
def resource_url
return super unless resource.is_a?(Decidim::Component)
+
@resource_url ||= main_component_url(resource)
end
diff --git a/decidim-core/lib/decidim/exporters/csv.rb b/decidim-core/lib/decidim/exporters/csv.rb
index 66ac06ad393d..2bdd52b8ff7d 100644
--- a/decidim-core/lib/decidim/exporters/csv.rb
+++ b/decidim-core/lib/decidim/exporters/csv.rb
@@ -28,6 +28,7 @@ def export(col_sep = Decidim.default_csv_col_sep)
def headers
return [] if processed_collection.empty?
+
processed_collection.first.keys
end
diff --git a/decidim-core/lib/decidim/fingerprintable.rb b/decidim-core/lib/decidim/fingerprintable.rb
index fb37f70a1595..fc9763eb9b89 100644
--- a/decidim-core/lib/decidim/fingerprintable.rb
+++ b/decidim-core/lib/decidim/fingerprintable.rb
@@ -28,6 +28,7 @@ def fingerprint(fields: nil, &block)
@fingerprint_options[:block] = block
else
raise "You must provide a set of fields to generate the fingerprint." unless fields
+
@fingerprint_options[:fields] = fields
end
end
diff --git a/decidim-core/lib/decidim/form_builder.rb b/decidim-core/lib/decidim/form_builder.rb
index 5d28e05b38f1..43c4bfd8c574 100644
--- a/decidim-core/lib/decidim/form_builder.rb
+++ b/decidim-core/lib/decidim/form_builder.rb
@@ -79,6 +79,7 @@ def translated(type, name, options = {})
def translated_one_locale(type, name, locale, options = {})
return hashtaggable_text_field(type, name, locale, options.merge(value: options[:value])) if options[:hashtaggable]
+
send(
type,
"#{name}_#{locale.to_s.gsub("-", "__")}",
@@ -365,10 +366,10 @@ def upload(attribute, options = {})
else
@template.content_tag :label, I18n.t("default_image", scope: "decidim.forms")
end
- template += @template.link_to @template.image_tag(file.url), file.url, target: "_blank"
+ template += @template.link_to @template.image_tag(file.url), file.url, target: "_blank", rel: "noopener"
elsif file_is_present?(file)
template += @template.label_tag I18n.t("current_file", scope: "decidim.forms")
- template += @template.link_to file.file.filename, file.url, target: "_blank"
+ template += @template.link_to file.file.filename, file.url, target: "_blank", rel: "noopener"
end
if file_is_present?(file)
@@ -524,6 +525,7 @@ def length_for_attribute(attribute, type)
# Returns a klass object.
def find_validator(attribute, klass)
return unless object.respond_to?(:_validators)
+
object._validators[attribute].find { |validator| validator.class == klass }
end
@@ -632,12 +634,14 @@ def label_i18n(attribute, text = nil, options = {})
def file_is_image?(file)
return unless file && file.respond_to?(:url)
return file.content_type.start_with? "image" if file.content_type.present?
+
Mime::Type.lookup_by_extension(File.extname(file.url)[1..-1]).to_s.start_with? "image" if file.url.present?
end
# Private: Returns whether the file exists or not.
def file_is_present?(file)
return unless file && file.respond_to?(:url)
+
file.present?
end
diff --git a/decidim-core/lib/decidim/gamification.rb b/decidim-core/lib/decidim/gamification.rb
index 7f433afded69..c467bd4bdb6f 100644
--- a/decidim-core/lib/decidim/gamification.rb
+++ b/decidim-core/lib/decidim/gamification.rb
@@ -15,6 +15,7 @@ module Gamification
# Returns a `BadgeStatus` instance.
def self.status_for(user, badge_name)
return unless user.is_a?(Decidim::UserBaseEntity)
+
BadgeStatus.new(user, find_badge(badge_name))
end
@@ -28,6 +29,7 @@ def self.status_for(user, badge_name)
def self.increment_score(user, badge_name, amount = 1)
return unless amount.positive?
return unless user.is_a?(Decidim::UserBaseEntity)
+
BadgeScorer.new(user, find_badge(badge_name)).increment(amount)
end
@@ -41,6 +43,7 @@ def self.increment_score(user, badge_name, amount = 1)
def self.decrement_score(user, badge_name, amount = 1)
return unless amount.positive?
return unless user.is_a?(Decidim::UserBaseEntity)
+
BadgeScorer.new(user, find_badge(badge_name)).decrement(amount)
end
@@ -53,6 +56,7 @@ def self.decrement_score(user, badge_name, amount = 1)
# Returns nothing.
def self.set_score(user, badge_name, score)
return unless user.is_a?(Decidim::UserBaseEntity)
+
BadgeScorer.new(user, find_badge(badge_name)).set(score)
end
diff --git a/decidim-core/lib/decidim/gamification/badge_status.rb b/decidim-core/lib/decidim/gamification/badge_status.rb
index 828ec942876b..9b97ce000eb9 100644
--- a/decidim-core/lib/decidim/gamification/badge_status.rb
+++ b/decidim-core/lib/decidim/gamification/badge_status.rb
@@ -29,6 +29,7 @@ def level
# Returns an Integer with the remaining score.
def next_level_in
return nil if level >= @badge.levels.count
+
@badge.levels[level] - score
end
diff --git a/decidim-core/lib/decidim/has_category.rb b/decidim-core/lib/decidim/has_category.rb
index e8621dbdfb10..669ea75dc46a 100644
--- a/decidim-core/lib/decidim/has_category.rb
+++ b/decidim-core/lib/decidim/has_category.rb
@@ -15,6 +15,7 @@ module HasCategory
def previous_category
return if categorization.versions.count <= 1
+
Decidim::Category.find_by(id: categorization.versions.last.reify.decidim_category_id)
end
@@ -22,6 +23,7 @@ def previous_category
def category_belongs_to_organization
return unless category
+
errors.add(:category, :invalid) unless component.categories.where(id: category.id).exists?
end
end
diff --git a/decidim-core/lib/decidim/metric_operation_manifest.rb b/decidim-core/lib/decidim/metric_operation_manifest.rb
index 3f1077f5534f..7770813ecf56 100644
--- a/decidim-core/lib/decidim/metric_operation_manifest.rb
+++ b/decidim-core/lib/decidim/metric_operation_manifest.rb
@@ -14,6 +14,7 @@ class MetricOperationManifest < Decidim::MetricManifest
def calculate(day, resource)
operation = manager_class.constantize.new(day, resource)
return unless operation.valid?
+
operation.calculate
end
end
diff --git a/decidim-core/lib/decidim/nicknamizable.rb b/decidim-core/lib/decidim/nicknamizable.rb
index f1db1e04a760..8239cbd5dfdc 100644
--- a/decidim-core/lib/decidim/nicknamizable.rb
+++ b/decidim-core/lib/decidim/nicknamizable.rb
@@ -35,6 +35,7 @@ def nickname_max_length
#
def nicknamize(name, scope = {})
return unless name
+
disambiguate(
name.parameterize(separator: "_")[nickname_length_range],
scope
diff --git a/decidim-core/lib/decidim/participable.rb b/decidim-core/lib/decidim/participable.rb
index 5efaf3e2f9fe..12dc62920885 100644
--- a/decidim-core/lib/decidim/participable.rb
+++ b/decidim-core/lib/decidim/participable.rb
@@ -82,6 +82,7 @@ def empty_published_component?
def cta_button_text_key
return :more_info if empty_published_component?
+
:take_part
end
end
diff --git a/decidim-core/lib/decidim/participatory_space_resourceable.rb b/decidim-core/lib/decidim/participatory_space_resourceable.rb
index f7bc5e2773bc..af4326f6186b 100644
--- a/decidim-core/lib/decidim/participatory_space_resourceable.rb
+++ b/decidim-core/lib/decidim/participatory_space_resourceable.rb
@@ -51,6 +51,7 @@ def linked_participatory_space_resources(resource_name, link_name)
def participatory_space_sibling_scope(participatory_space_name)
manifest = Decidim.find_participatory_space_manifest(participatory_space_name)
return self.class.none unless manifest
+
scope = manifest.participatory_spaces.call(organization)
scope
diff --git a/decidim-core/lib/decidim/search_resource_fields_mapper.rb b/decidim-core/lib/decidim/search_resource_fields_mapper.rb
index 5e9b09501e7b..9cdd3d7c1b89 100644
--- a/decidim-core/lib/decidim/search_resource_fields_mapper.rb
+++ b/decidim-core/lib/decidim/search_resource_fields_mapper.rb
@@ -98,6 +98,7 @@ def read_field(resource, fields, field_name)
if value_field.is_a?(Array)
value_field.collect do |vfield_name|
raise ArgumentError, "nested fields not supported for translations" if vfield_name.is_a?(Hash)
+
resource.send(vfield_name.to_sym)
end
else
@@ -122,6 +123,7 @@ def map_i18n_fields(resource)
def read_i18n_field(resource, locale, field_name)
content = read_field(resource, @declared_fields, field_name)
return if content.nil?
+
content = Array.wrap(content).collect do |item|
item.is_a?(Hash) ? item[locale] : item
end
diff --git a/decidim-core/lib/decidim/searchable.rb b/decidim-core/lib/decidim/searchable.rb
index 70fe715ccbd1..2edf0a5949d3 100644
--- a/decidim-core/lib/decidim/searchable.rb
+++ b/decidim-core/lib/decidim/searchable.rb
@@ -50,6 +50,7 @@ def by_organization(org_id)
#
def try_add_to_index_as_search_resource
return unless self.class.search_resource_fields_mapper.index_on_create?(self)
+
add_to_index_as_search_resource
end
@@ -105,6 +106,7 @@ def contents_to_searchable_resource_attributes(fields, locale)
class_methods do
def search_resource_fields_mapper
raise "`searchable_fields` should be declared when including Searchable" unless defined?(@search_resource_indexable_fields)
+
@search_resource_indexable_fields
end
diff --git a/decidim-core/lib/decidim/stats_registry.rb b/decidim-core/lib/decidim/stats_registry.rb
index 4177a8159e4f..bd4e82222412 100644
--- a/decidim-core/lib/decidim/stats_registry.rb
+++ b/decidim-core/lib/decidim/stats_registry.rb
@@ -48,6 +48,7 @@ def register(name, options = {}, &block)
def resolve(name, context, start_at = nil, end_at = nil)
stat = @stats.detect { |s| s[:name] == name }
return stat[:block].call(context, start_at, end_at) if stat.present?
+
raise StandardError, "Stats '#{name}' is not registered."
end
diff --git a/decidim-core/lib/tasks/decidim_data_portability_tasks.rake b/decidim-core/lib/tasks/decidim_data_portability_tasks.rake
index aac27dd97843..f055927aea1f 100644
--- a/decidim-core/lib/tasks/decidim_data_portability_tasks.rake
+++ b/decidim-core/lib/tasks/decidim_data_portability_tasks.rake
@@ -76,6 +76,7 @@ namespace :decidim do
path = Decidim::DataPortabilityUploader.new.store_dir
Dir.glob(Rails.root.join(path, "*")).each do |filename|
next unless File.mtime(filename) < Decidim.data_portability_expiry_time.ago
+
File.delete(filename)
puts "------"
puts "!! deleting #{filename}"
diff --git a/decidim-core/lib/tasks/decidim_metrics_tasks.rake b/decidim-core/lib/tasks/decidim_metrics_tasks.rake
index 646c475d61f7..b06d2959dbf3 100644
--- a/decidim-core/lib/tasks/decidim_metrics_tasks.rake
+++ b/decidim-core/lib/tasks/decidim_metrics_tasks.rake
@@ -24,6 +24,7 @@ namespace :decidim do
desc "Execute one metric calculation method"
task :one, [:metric, :day] => :environment do |_task, args|
next if args.metric.blank?
+
Decidim::Organization.find_each do |organization|
metric_manifest = Decidim.metrics_registry.for(args.metric)
call_metric_job(metric_manifest, organization, args.day)
@@ -40,6 +41,7 @@ namespace :decidim do
end
begin
raise ArgumentError if day.blank?
+
(Date.parse(day)..Time.zone.today).each do |d|
Decidim::Organization.find_each do |organization|
if metric
diff --git a/decidim-core/spec/content_renderers/decidim/hashtag_renderer_spec.rb b/decidim-core/spec/content_renderers/decidim/hashtag_renderer_spec.rb
index 60a8493580c7..262bfa28de51 100644
--- a/decidim-core/spec/content_renderers/decidim/hashtag_renderer_spec.rb
+++ b/decidim-core/spec/content_renderers/decidim/hashtag_renderer_spec.rb
@@ -11,7 +11,7 @@ module Decidim
let(:presenter) { Decidim::HashtagPresenter.new(hashtag, cased_name: name) }
let(:name) { hashtag.name }
let(:content) { "This text contains a valid Decidim::Hashtag Global ID: #{hashtag.to_global_id}/#{name}" }
- let(:result) { %(This text contains a valid Decidim::Hashtag Global ID: ##{name}) }
+ let(:result) { %(This text contains a valid Decidim::Hashtag Global ID: ##{name}) }
it { is_expected.to eq(result) }
@@ -46,7 +46,7 @@ module Decidim
it "renders the two mentions" do
rendered = renderer.render
- hashtag_rendered = %(##{hashtag.name})
+ hashtag_rendered = %(##{hashtag.name})
expect(rendered.scan(hashtag_rendered).length).to eq(2)
end
end
diff --git a/decidim-core/spec/controllers/sessions_controller_spec.rb b/decidim-core/spec/controllers/sessions_controller_spec.rb
index f40b634ab60a..7f86c59880af 100644
--- a/decidim-core/spec/controllers/sessions_controller_spec.rb
+++ b/decidim-core/spec/controllers/sessions_controller_spec.rb
@@ -54,7 +54,7 @@ module Devise
end
end
- context "otherwise", with_authorization_workflows: [] do
+ context "and otherwise", with_authorization_workflows: [] do
it { is_expected.to eq("/") }
end
end
diff --git a/decidim-core/spec/lib/available_locales_spec.rb b/decidim-core/spec/lib/available_locales_spec.rb
index 26909dc78172..fe0f5efff5d0 100644
--- a/decidim-core/spec/lib/available_locales_spec.rb
+++ b/decidim-core/spec/lib/available_locales_spec.rb
@@ -28,6 +28,7 @@ module LocaleTest
LocaleTest::Decidim.available_locales.each do |l|
# english is not necessary for datepicker
next if l == "en"
+
expect(File).to exist(datepicker_file[l])
end
end
diff --git a/decidim-debates/app/cells/decidim/debates/debate_m_cell.rb b/decidim-debates/app/cells/decidim/debates/debate_m_cell.rb
index 876474e04c7a..54f790a58c54 100644
--- a/decidim-debates/app/cells/decidim/debates/debate_m_cell.rb
+++ b/decidim-debates/app/cells/decidim/debates/debate_m_cell.rb
@@ -28,6 +28,7 @@ def spans_multiple_dates?
def debate_date
return unless start_date && end_date
return render(:multiple_dates) if spans_multiple_dates?
+
render(:single_date)
end
@@ -41,11 +42,13 @@ def formatted_end_time
def start_date
return unless model.start_time
+
model.start_time.to_date
end
def end_date
return unless model.end_time
+
model.end_time.to_date
end
end
diff --git a/decidim-debates/app/forms/decidim/debates/admin/debate_form.rb b/decidim-debates/app/forms/decidim/debates/admin/debate_form.rb
index 2835830f656f..b39c8d74c6fe 100644
--- a/decidim-debates/app/forms/decidim/debates/admin/debate_form.rb
+++ b/decidim-debates/app/forms/decidim/debates/admin/debate_form.rb
@@ -29,6 +29,7 @@ def map_model(model)
def category
return unless current_component
+
@category ||= current_component.categories.find_by(id: decidim_category_id)
end
end
diff --git a/decidim-debates/app/models/decidim/debates/debate.rb b/decidim-debates/app/models/decidim/debates/debate.rb
index fef7999de6d5..b5a00411f7a5 100644
--- a/decidim-debates/app/models/decidim/debates/debate.rb
+++ b/decidim-debates/app/models/decidim/debates/debate.rb
@@ -72,6 +72,7 @@ def commentable?
# Public: Overrides the `accepts_new_comments?` Commentable concern method.
def accepts_new_comments?
return false unless open?
+
commentable? && !comments_blocked?
end
@@ -98,6 +99,7 @@ def notifiable?(_context)
# Public: Override Commentable concern method `users_to_notify_on_comment_created`
def users_to_notify_on_comment_created
return Decidim::User.where(id: followers).or(Decidim::User.where(id: component.participatory_space.admins)).distinct if official?
+
followers
end
diff --git a/decidim-debates/app/queries/decidim/debates/metrics/debates_metric_manage.rb b/decidim-debates/app/queries/decidim/debates/metrics/debates_metric_manage.rb
index ee46193ce4ec..c296a568943f 100644
--- a/decidim-debates/app/queries/decidim/debates/metrics/debates_metric_manage.rb
+++ b/decidim-debates/app/queries/decidim/debates/metrics/debates_metric_manage.rb
@@ -14,6 +14,7 @@ def save
@registry = []
cumulative.each do |key, cumulative_value|
next if cumulative_value.zero?
+
quantity_value = quantity[key] || 0
category_id, space_type, space_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
diff --git a/decidim-dev/decidim-dev.gemspec b/decidim-dev/decidim-dev.gemspec
index 9218781e0642..097a6bc91a8d 100644
--- a/decidim-dev/decidim-dev.gemspec
+++ b/decidim-dev/decidim-dev.gemspec
@@ -36,7 +36,8 @@ Gem::Specification.new do |s|
s.add_dependency "rspec-html-matchers", "~> 0.9.1"
s.add_dependency "rspec-rails", "~> 3.7"
s.add_dependency "rspec_junit_formatter", "~> 0.3.0"
- s.add_dependency "rubocop", "~> 0.58.0"
+ s.add_dependency "rubocop", "~> 0.71.0"
+ s.add_dependency "rubocop-rails", "~> 2.0"
s.add_dependency "rubocop-rspec", "~> 1.21"
s.add_dependency "selenium-webdriver", "~> 3.7"
s.add_dependency "simplecov", "~> 0.13"
diff --git a/decidim-dev/lib/decidim/dev/test/rspec_support/translation_helpers.rb b/decidim-dev/lib/decidim/dev/test/rspec_support/translation_helpers.rb
index 5c4fc66dd778..0fd76c3e2926 100644
--- a/decidim-dev/lib/decidim/dev/test/rspec_support/translation_helpers.rb
+++ b/decidim-dev/lib/decidim/dev/test/rspec_support/translation_helpers.rb
@@ -71,6 +71,7 @@ def fill_in_i18n_editor(field, tab_selector, localized_values)
# :with - A String value that will be entered in the form field. (required)
def fill_in_editor(locator, params = {})
raise ArgumentError if params[:with].blank?
+
page.execute_script <<-SCRIPT
$('##{locator}').siblings('.editor-container').find('.ql-editor')[0].innerHTML = "#{params[:with]}";
$('##{locator}').val("#{params[:with]}")
diff --git a/decidim-forms/app/models/decidim/forms/answer.rb b/decidim-forms/app/models/decidim/forms/answer.rb
index aed88d85ed1d..a47a0808d008 100644
--- a/decidim-forms/app/models/decidim/forms/answer.rb
+++ b/decidim-forms/app/models/decidim/forms/answer.rb
@@ -46,6 +46,7 @@ def self.newsletter_participant_ids(component)
def user_questionnaire_same_organization
return if user&.organization == questionnaire.questionnaire_for&.organization
+
errors.add(:user, :invalid)
end
diff --git a/decidim-generators/Gemfile.lock b/decidim-generators/Gemfile.lock
index e4adf840afeb..a1484f7f2dcb 100644
--- a/decidim-generators/Gemfile.lock
+++ b/decidim-generators/Gemfile.lock
@@ -132,7 +132,8 @@ PATH
rspec-html-matchers (~> 0.9.1)
rspec-rails (~> 3.7)
rspec_junit_formatter (~> 0.3.0)
- rubocop (~> 0.58.0)
+ rubocop (~> 0.71.0)
+ rubocop-rails (~> 2.0)
rubocop-rspec (~> 1.21)
selenium-webdriver (~> 3.7)
simplecov (~> 0.13)
@@ -280,7 +281,7 @@ GEM
msgpack (~> 1.0)
builder (3.2.3)
byebug (10.0.2)
- capybara (3.22.0)
+ capybara (3.24.0)
addressable
mini_mime (>= 0.1.3)
nokogiri (~> 1.8)
@@ -349,7 +350,7 @@ GEM
doc2text (0.4.1)
nokogiri (~> 1.8, >= 1.8.2)
rubyzip (~> 1.2, >= 1.2.2)
- docile (1.3.1)
+ docile (1.3.2)
domain_name (0.5.20180417)
unf (>= 0.0.5, < 1.0.0)
doorkeeper (4.4.3)
@@ -534,7 +535,6 @@ GEM
pg_search (2.2.0)
activerecord (>= 4.2)
activesupport (>= 4.2)
- powerpack (0.1.2)
premailer (1.11.1)
addressable
css_parser (>= 1.6.0)
@@ -616,15 +616,15 @@ GEM
rspec-cells (0.3.4)
cells (>= 4.0.0, < 6.0.0)
rspec-rails (~> 3.2)
- rspec-core (3.8.0)
+ rspec-core (3.8.1)
rspec-support (~> 3.8.0)
- rspec-expectations (3.8.3)
+ rspec-expectations (3.8.4)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-html-matchers (0.9.1)
nokogiri (~> 1)
rspec (>= 3.0.0.a, < 4)
- rspec-mocks (3.8.0)
+ rspec-mocks (3.8.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-rails (3.8.2)
@@ -635,19 +635,21 @@ GEM
rspec-expectations (~> 3.8.0)
rspec-mocks (~> 3.8.0)
rspec-support (~> 3.8.0)
- rspec-support (3.8.0)
+ rspec-support (3.8.2)
rspec_junit_formatter (0.3.0)
rspec-core (>= 2, < 4, != 2.12.0)
- rubocop (0.58.2)
+ rubocop (0.71.0)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
- parser (>= 2.5, != 2.5.1.1)
- powerpack (~> 0.1)
+ parser (>= 2.6)
rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
- unicode-display_width (~> 1.0, >= 1.0.1)
- rubocop-rspec (1.30.0)
- rubocop (>= 0.58.0)
+ unicode-display_width (>= 1.4.0, < 1.7)
+ rubocop-rails (2.0.1)
+ rack (>= 1.1)
+ rubocop (>= 0.70.0)
+ rubocop-rspec (1.33.0)
+ rubocop (>= 0.60.0)
ruby-ole (1.2.12.2)
ruby-progressbar (1.10.1)
ruby_dep (1.5.0)
diff --git a/decidim-initiatives/.rubocop.yml b/decidim-initiatives/.rubocop.yml
deleted file mode 100644
index a5da26b16427..000000000000
--- a/decidim-initiatives/.rubocop.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-
-inherit_from:
- - ../.rubocop.yml
- - .rubocop_rails.yml
diff --git a/decidim-initiatives/.rubocop_rails.yml b/decidim-initiatives/.rubocop_rails.yml
deleted file mode 120000
index 6803bcadc573..000000000000
--- a/decidim-initiatives/.rubocop_rails.yml
+++ /dev/null
@@ -1 +0,0 @@
-../.rubocop_rails.yml
\ No newline at end of file
diff --git a/decidim-initiatives/app/commands/decidim/initiatives/admin/create_initiative_type.rb b/decidim-initiatives/app/commands/decidim/initiatives/admin/create_initiative_type.rb
index c056ee79935d..1cc53fbef428 100644
--- a/decidim-initiatives/app/commands/decidim/initiatives/admin/create_initiative_type.rb
+++ b/decidim-initiatives/app/commands/decidim/initiatives/admin/create_initiative_type.rb
@@ -20,6 +20,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
initiative_type = create_initiative_type
if initiative_type.persisted?
diff --git a/decidim-initiatives/app/commands/decidim/initiatives/admin/create_initiative_type_scope.rb b/decidim-initiatives/app/commands/decidim/initiatives/admin/create_initiative_type_scope.rb
index a1e83dd8ea81..66365fea5aaa 100644
--- a/decidim-initiatives/app/commands/decidim/initiatives/admin/create_initiative_type_scope.rb
+++ b/decidim-initiatives/app/commands/decidim/initiatives/admin/create_initiative_type_scope.rb
@@ -20,6 +20,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
initiative_type_scope = create_initiative_type_scope
if initiative_type_scope.persisted?
diff --git a/decidim-initiatives/app/commands/decidim/initiatives/admin/update_initiative_type.rb b/decidim-initiatives/app/commands/decidim/initiatives/admin/update_initiative_type.rb
index 12ac294ee2fc..a15c5da274f8 100644
--- a/decidim-initiatives/app/commands/decidim/initiatives/admin/update_initiative_type.rb
+++ b/decidim-initiatives/app/commands/decidim/initiatives/admin/update_initiative_type.rb
@@ -23,6 +23,7 @@ def initialize(initiative_type, form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
initiative_type.update(attributes)
if initiative_type.valid?
diff --git a/decidim-initiatives/app/commands/decidim/initiatives/create_initiative.rb b/decidim-initiatives/app/commands/decidim/initiatives/create_initiative.rb
index fa1e9241ebf2..99e668da4df9 100644
--- a/decidim-initiatives/app/commands/decidim/initiatives/create_initiative.rb
+++ b/decidim-initiatives/app/commands/decidim/initiatives/create_initiative.rb
@@ -23,6 +23,7 @@ def initialize(form, current_user)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
initiative = create_initiative
if initiative.persisted?
diff --git a/decidim-initiatives/app/commands/decidim/initiatives/spawn_committee_request.rb b/decidim-initiatives/app/commands/decidim/initiatives/spawn_committee_request.rb
index 7341aac2a0b4..90747ad84ff8 100644
--- a/decidim-initiatives/app/commands/decidim/initiatives/spawn_committee_request.rb
+++ b/decidim-initiatives/app/commands/decidim/initiatives/spawn_committee_request.rb
@@ -22,6 +22,7 @@ def initialize(form, current_user)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
request = create_request
if request.persisted?
diff --git a/decidim-initiatives/app/commands/decidim/initiatives/vote_initiative.rb b/decidim-initiatives/app/commands/decidim/initiatives/vote_initiative.rb
index 9ac884e265c6..7383b0147be4 100644
--- a/decidim-initiatives/app/commands/decidim/initiatives/vote_initiative.rb
+++ b/decidim-initiatives/app/commands/decidim/initiatives/vote_initiative.rb
@@ -22,6 +22,7 @@ def initialize(form, current_user)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
build_initiative_vote
set_vote_timestamp
diff --git a/decidim-initiatives/app/controllers/decidim/initiatives/initiative_signatures_controller.rb b/decidim-initiatives/app/controllers/decidim/initiatives/initiative_signatures_controller.rb
index 32ba1c9cae7e..e3fcfcb8a47a 100644
--- a/decidim-initiatives/app/controllers/decidim/initiatives/initiative_signatures_controller.rb
+++ b/decidim-initiatives/app/controllers/decidim/initiatives/initiative_signatures_controller.rb
@@ -52,7 +52,7 @@ def create
on(:invalid) do
render json: {
error: I18n.t("create.error", scope: "decidim.initiatives.initiative_votes")
- }, status: 422
+ }, status: :unprocessable_entity
end
end
end
diff --git a/decidim-initiatives/app/controllers/decidim/initiatives/initiative_votes_controller.rb b/decidim-initiatives/app/controllers/decidim/initiatives/initiative_votes_controller.rb
index 567a16a91e44..a10c5b168d15 100644
--- a/decidim-initiatives/app/controllers/decidim/initiatives/initiative_votes_controller.rb
+++ b/decidim-initiatives/app/controllers/decidim/initiatives/initiative_votes_controller.rb
@@ -24,7 +24,7 @@ def create
on(:invalid) do
render json: {
error: I18n.t("initiative_votes.create.error", scope: "decidim.initiatives")
- }, status: 422
+ }, status: :unprocessable_entity
end
end
end
diff --git a/decidim-initiatives/app/helpers/decidim/initiatives/initiative_helper.rb b/decidim-initiatives/app/helpers/decidim/initiatives/initiative_helper.rb
index f425e837b82e..5a5f5f3dba3a 100644
--- a/decidim-initiatives/app/helpers/decidim/initiatives/initiative_helper.rb
+++ b/decidim-initiatives/app/helpers/decidim/initiatives/initiative_helper.rb
@@ -14,6 +14,7 @@ module InitiativeHelper
# Returns a String.
def state_badge_css_class(initiative)
return "success" if initiative.accepted?
+
"warning"
end
@@ -57,6 +58,7 @@ def popularity_class(initiative)
return "popularity--level3" if popularity_level3?(initiative)
return "popularity--level4" if popularity_level4?(initiative)
return "popularity--level5" if popularity_level5?(initiative)
+
""
end
diff --git a/decidim-initiatives/app/mailers/decidim/initiatives/initiatives_mailer.rb b/decidim-initiatives/app/mailers/decidim/initiatives/initiatives_mailer.rb
index 7857a311b35b..c25bdfab5d62 100644
--- a/decidim-initiatives/app/mailers/decidim/initiatives/initiatives_mailer.rb
+++ b/decidim-initiatives/app/mailers/decidim/initiatives/initiatives_mailer.rb
@@ -13,6 +13,7 @@ class InitiativesMailer < Decidim::ApplicationMailer
# Notifies initiative creation
def notify_creation(initiative)
return if initiative.author.email.blank?
+
@initiative = initiative
@organization = initiative.organization
@@ -29,6 +30,7 @@ def notify_creation(initiative)
# Notify changes in state
def notify_state_change(initiative, user)
return if user.email.blank?
+
@organization = initiative.organization
with_user(user) do
@@ -52,6 +54,7 @@ def notify_state_change(initiative, user)
# Notify an initiative requesting technical validation
def notify_validating_request(initiative, user)
return if user.email.blank?
+
@organization = initiative.organization
@link = decidim_admin_initiatives.edit_initiative_url(initiative, host: @organization.host)
@@ -72,6 +75,7 @@ def notify_validating_request(initiative, user)
# Notify progress to all initiative subscribers.
def notify_progress(initiative, user)
return if user.email.blank?
+
@organization = initiative.organization
@link = initiative_url(initiative, host: @organization.host)
diff --git a/decidim-initiatives/app/models/decidim/initiative.rb b/decidim-initiatives/app/models/decidim/initiative.rb
index acbd677e6b48..60e42c42838e 100644
--- a/decidim-initiatives/app/models/decidim/initiative.rb
+++ b/decidim-initiatives/app/models/decidim/initiative.rb
@@ -217,6 +217,7 @@ def scopes_enabled
# Returns true if the record was properly saved, false otherwise.
def publish!
return false if published?
+
update(
published_at: Time.current,
state: "published",
@@ -231,6 +232,7 @@ def publish!
# Returns true if the record was properly saved, false otherwise.
def unpublish!
return false unless published?
+
update(published_at: nil, state: "discarded")
end
@@ -290,6 +292,7 @@ def comments_have_votes?
# RETURNS boolean
def has_authorship?(user)
return true if author.id == user.id
+
committee_members.approved.where(decidim_users_id: user.id).any?
end
@@ -336,6 +339,7 @@ def signature_type_allowed
def notify_state_change
return unless saved_change_to_state?
+
notifier = Decidim::Initiatives::StatusChangeNotifier.new(initiative: self)
notifier.notify
end
diff --git a/decidim-initiatives/app/models/decidim/initiatives_committee_member.rb b/decidim-initiatives/app/models/decidim/initiatives_committee_member.rb
index 0880f05fe1ac..7a084bc67824 100644
--- a/decidim-initiatives/app/models/decidim/initiatives_committee_member.rb
+++ b/decidim-initiatives/app/models/decidim/initiatives_committee_member.rb
@@ -10,7 +10,7 @@ class InitiativesCommitteeMember < ApplicationRecord
belongs_to :user,
foreign_key: "decidim_users_id",
- class_name: "Decidim::User"
+ class_name: "Decidim::User"
enum state: [:requested, :rejected, :accepted]
diff --git a/decidim-initiatives/app/permissions/decidim/initiatives/admin/permissions.rb b/decidim-initiatives/app/permissions/decidim/initiatives/admin/permissions.rb
index b54ceeb7a6a9..73fc79b61fe0 100644
--- a/decidim-initiatives/app/permissions/decidim/initiatives/admin/permissions.rb
+++ b/decidim-initiatives/app/permissions/decidim/initiatives/admin/permissions.rb
@@ -165,6 +165,7 @@ def moderator_action?
def read_initiative_list_action?
return unless permission_action.subject == :initiative &&
permission_action.action == :list
+
allow!
end
diff --git a/decidim-initiatives/app/permissions/decidim/initiatives/permissions.rb b/decidim-initiatives/app/permissions/decidim/initiatives/permissions.rb
index db2b2f0e8f7f..477751ff46d6 100644
--- a/decidim-initiatives/app/permissions/decidim/initiatives/permissions.rb
+++ b/decidim-initiatives/app/permissions/decidim/initiatives/permissions.rb
@@ -48,6 +48,7 @@ def read_public_initiative?
return allow! if initiative.published? || initiative.rejected? || initiative.accepted?
return allow! if user && (initiative.has_authorship?(user) || user.admin?)
+
disallow!
end
@@ -99,6 +100,7 @@ def read_admin_dashboard_action?
def user_can_read_admin_dashboard?
return unless user
+
allow! if has_initiatives?
end
diff --git a/decidim-initiatives/app/services/decidim/initiatives/initiative_search.rb b/decidim-initiatives/app/services/decidim/initiatives/initiative_search.rb
index 02ce483e42a4..62839342f84c 100644
--- a/decidim-initiatives/app/services/decidim/initiatives/initiative_search.rb
+++ b/decidim-initiatives/app/services/decidim/initiatives/initiative_search.rb
@@ -59,6 +59,7 @@ def search_author
def search_scope_id
return if scope_id.nil?
+
query
.joins(:scoped_type)
.where(
diff --git a/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb b/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb
index c24875e0d3f6..de281fdd7d2a 100644
--- a/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb
+++ b/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb
@@ -71,7 +71,7 @@
state: state,
signature_type: "online",
signature_start_date: Date.current - 7.days,
- signature_end_date: Date.current + 7.days,
+ signature_end_date: Date.current + 7.days,
published_at: Time.current - 7.days,
author: Decidim::User.reorder(Arel.sql("RANDOM()")).first,
organization: organization
diff --git a/decidim-initiatives/lib/tasks/decidim_initiatives.rake b/decidim-initiatives/lib/tasks/decidim_initiatives.rake
index 56b7de557783..50621101901a 100644
--- a/decidim-initiatives/lib/tasks/decidim_initiatives.rake
+++ b/decidim-initiatives/lib/tasks/decidim_initiatives.rake
@@ -27,7 +27,6 @@ namespace :decidim_initiatives do
.published
.where.not(first_progress_notification_at: nil)
.where(second_progress_notification_at: nil).find_each do |initiative|
-
if initiative.percentage >= Decidim::Initiatives.second_notification_percentage
notifier = Decidim::Initiatives::ProgressNotifier.new(initiative: initiative)
notifier.notify
@@ -40,7 +39,6 @@ namespace :decidim_initiatives do
Decidim::Initiative
.published
.where(first_progress_notification_at: nil).find_each do |initiative|
-
if initiative.percentage >= Decidim::Initiatives.first_notification_percentage
notifier = Decidim::Initiatives::ProgressNotifier.new(initiative: initiative)
notifier.notify
diff --git a/decidim-meetings/app/cells/decidim/meetings/content_blocks/upcoming_events_cell.rb b/decidim-meetings/app/cells/decidim/meetings/content_blocks/upcoming_events_cell.rb
index 08440c97b198..5b34015abfbc 100644
--- a/decidim-meetings/app/cells/decidim/meetings/content_blocks/upcoming_events_cell.rb
+++ b/decidim-meetings/app/cells/decidim/meetings/content_blocks/upcoming_events_cell.rb
@@ -8,6 +8,7 @@ class UpcomingEventsCell < Decidim::ViewModel
def show
return if upcoming_events.blank?
+
render
end
diff --git a/decidim-meetings/app/cells/decidim/meetings/join_meeting_button_cell.rb b/decidim-meetings/app/cells/decidim/meetings/join_meeting_button_cell.rb
index 293be8fe063e..8262cb550d09 100644
--- a/decidim-meetings/app/cells/decidim/meetings/join_meeting_button_cell.rb
+++ b/decidim-meetings/app/cells/decidim/meetings/join_meeting_button_cell.rb
@@ -23,6 +23,7 @@ def current_component
def button_classes
return "button expanded button--sc" if big_button?
+
"button card__button button--sc small"
end
@@ -36,6 +37,7 @@ def shows_remaining_slots?
def i18n_join_text
return I18n.t("join", scope: "decidim.meetings.meetings.show") if model.has_available_slots?
+
I18n.t("no_slots_available", scope: "decidim.meetings.meetings.show")
end
diff --git a/decidim-meetings/app/cells/decidim/meetings/meeting_m_cell.rb b/decidim-meetings/app/cells/decidim/meetings/meeting_m_cell.rb
index 6c4ce1eb8186..13dafd5ee4d2 100644
--- a/decidim-meetings/app/cells/decidim/meetings/meeting_m_cell.rb
+++ b/decidim-meetings/app/cells/decidim/meetings/meeting_m_cell.rb
@@ -27,6 +27,7 @@ def spans_multiple_dates?
def meeting_date
return render(:multiple_dates) if spans_multiple_dates?
+
render(:single_date)
end
diff --git a/decidim-meetings/app/cells/decidim/meetings/meetings_map_cell.rb b/decidim-meetings/app/cells/decidim/meetings/meetings_map_cell.rb
index 2149150426c3..f1dbb582ba4f 100644
--- a/decidim-meetings/app/cells/decidim/meetings/meetings_map_cell.rb
+++ b/decidim-meetings/app/cells/decidim/meetings/meetings_map_cell.rb
@@ -8,6 +8,7 @@ class MeetingsMapCell < MeetingMCell
def show
return if Decidim.geocoder.blank?
+
render
end
diff --git a/decidim-meetings/app/commands/decidim/meetings/admin/update_minutes.rb b/decidim-meetings/app/commands/decidim/meetings/admin/update_minutes.rb
index ef7bf10b75d7..9b5e7eccb72d 100644
--- a/decidim-meetings/app/commands/decidim/meetings/admin/update_minutes.rb
+++ b/decidim-meetings/app/commands/decidim/meetings/admin/update_minutes.rb
@@ -22,6 +22,7 @@ def initialize(form, current_meeting, minutes)
# Broadcasts :ok if successful, :invalid otherwise.
def call
return broadcast(:invalid) if form.invalid?
+
transaction do
update_minutes!
end
diff --git a/decidim-meetings/app/commands/decidim/meetings/admin/update_registrations.rb b/decidim-meetings/app/commands/decidim/meetings/admin/update_registrations.rb
index 8aeeefb6c075..262128076bc7 100644
--- a/decidim-meetings/app/commands/decidim/meetings/admin/update_registrations.rb
+++ b/decidim-meetings/app/commands/decidim/meetings/admin/update_registrations.rb
@@ -20,6 +20,7 @@ def initialize(form, meeting)
def call
meeting.with_lock do
return broadcast(:invalid) if form.invalid?
+
update_meeting_registrations
send_notification if should_notify_followers?
end
diff --git a/decidim-meetings/app/commands/decidim/meetings/join_meeting.rb b/decidim-meetings/app/commands/decidim/meetings/join_meeting.rb
index 5b486fbb6434..72cfac975288 100644
--- a/decidim-meetings/app/commands/decidim/meetings/join_meeting.rb
+++ b/decidim-meetings/app/commands/decidim/meetings/join_meeting.rb
@@ -86,6 +86,7 @@ def participatory_space_admins
def notify_admin_over_percentage
return send_notification_over(0.5) if occupied_slots_over?(0.5)
return send_notification_over(0.8) if occupied_slots_over?(0.8)
+
send_notification_over(1.0) if occupied_slots_over?(1.0)
end
diff --git a/decidim-meetings/app/commands/decidim/meetings/leave_meeting.rb b/decidim-meetings/app/commands/decidim/meetings/leave_meeting.rb
index 19a62702d28e..e21137b61187 100644
--- a/decidim-meetings/app/commands/decidim/meetings/leave_meeting.rb
+++ b/decidim-meetings/app/commands/decidim/meetings/leave_meeting.rb
@@ -20,6 +20,7 @@ def initialize(meeting, user)
def call
@meeting.with_lock do
return broadcast(:invalid) unless registration
+
destroy_registration
destroy_questionnaire_answers
decrement_score
diff --git a/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb b/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb
index 47aec51e1427..6b336f3a2bde 100644
--- a/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb
+++ b/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb
@@ -24,6 +24,7 @@ def index
def show
return if meeting.current_user_can_visit_meeting?(current_user)
+
flash[:alert] = I18n.t("meeting.not_allowed", scope: "decidim.meetings")
redirect_to action: "index"
end
diff --git a/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb b/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb
index c158321e149b..b3a3814662a4 100644
--- a/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb
+++ b/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb
@@ -79,6 +79,7 @@ def decidim_scope_id
def category
return unless current_component
+
@category ||= categories.find_by(id: decidim_category_id)
end
diff --git a/decidim-meetings/app/forms/decidim/meetings/admin/meeting_registrations_form.rb b/decidim-meetings/app/forms/decidim/meetings/admin/meeting_registrations_form.rb
index 9fbc02e39dff..927c0bd12458 100644
--- a/decidim-meetings/app/forms/decidim/meetings/admin/meeting_registrations_form.rb
+++ b/decidim-meetings/app/forms/decidim/meetings/admin/meeting_registrations_form.rb
@@ -33,6 +33,7 @@ class MeetingRegistrationsForm < Decidim::Form
# TL;DR: if you remove this method, we'll get errors, so don't.
def id
return super if super.present?
+
meeting.id
end
diff --git a/decidim-meetings/app/forms/decidim/meetings/admin/validate_registration_code_form.rb b/decidim-meetings/app/forms/decidim/meetings/admin/validate_registration_code_form.rb
index 37d9923c887a..4d7ae6acc636 100644
--- a/decidim-meetings/app/forms/decidim/meetings/admin/validate_registration_code_form.rb
+++ b/decidim-meetings/app/forms/decidim/meetings/admin/validate_registration_code_form.rb
@@ -22,6 +22,7 @@ def meeting
def registration_exists
return unless registration.nil?
+
errors.add(
:code,
I18n.t("registrations.validate_registration_code.invalid", scope: "decidim.meetings.admin")
diff --git a/decidim-meetings/app/helpers/decidim/meetings/admin/application_helper.rb b/decidim-meetings/app/helpers/decidim/meetings/admin/application_helper.rb
index dd7f54608848..b6b6d4140caf 100644
--- a/decidim-meetings/app/helpers/decidim/meetings/admin/application_helper.rb
+++ b/decidim-meetings/app/helpers/decidim/meetings/admin/application_helper.rb
@@ -10,6 +10,7 @@ module ApplicationHelper
def meeting_organizer_picker_text(form)
return "" if form.object.organizer.blank?
+
"#{form.object.organizer.name} (@#{form.object.organizer.nickname})"
end
diff --git a/decidim-meetings/app/models/decidim/meetings/meeting.rb b/decidim-meetings/app/models/decidim/meetings/meeting.rb
index 51bb49a0d11b..d4617d107646 100644
--- a/decidim-meetings/app/models/decidim/meetings/meeting.rb
+++ b/decidim-meetings/app/models/decidim/meetings/meeting.rb
@@ -75,6 +75,7 @@ def closed?
def has_available_slots?
return true if available_slots.zero?
+
(available_slots - reserved_slots) > registrations.count
end
@@ -127,6 +128,7 @@ def can_participate?(user)
def organizer_belongs_to_organization
return if !organizer || !organization
+
errors.add(:organizer, :invalid) unless organizer.organization == organization
end
diff --git a/decidim-meetings/app/presenters/decidim/meetings/admin_log/value_types/organizer_presenter.rb b/decidim-meetings/app/presenters/decidim/meetings/admin_log/value_types/organizer_presenter.rb
index 30be5ae8c809..ae9d728cd863 100644
--- a/decidim-meetings/app/presenters/decidim/meetings/admin_log/value_types/organizer_presenter.rb
+++ b/decidim-meetings/app/presenters/decidim/meetings/admin_log/value_types/organizer_presenter.rb
@@ -16,6 +16,7 @@ class OrganizerPresenter < Decidim::Log::ValueTypes::DefaultPresenter
def present
return unless value
return present_organizer if organizer
+
I18n.t("not_found", id: value, scope: "decidim.meetings.admin_log.meeting.value_types.organizer_presenter")
end
@@ -37,7 +38,7 @@ def present_organizer
data: {
tooltip: true,
"disable-hover": false
- }
+ }, rel: "noopener"
)
end
diff --git a/decidim-meetings/app/queries/decidim/meetings/admin/invites.rb b/decidim-meetings/app/queries/decidim/meetings/admin/invites.rb
index d378355774d1..570f205168e7 100644
--- a/decidim-meetings/app/queries/decidim/meetings/admin/invites.rb
+++ b/decidim-meetings/app/queries/decidim/meetings/admin/invites.rb
@@ -36,6 +36,7 @@ def query
def filter_by_search(invites)
return invites if @query.blank?
+
invites.joins(:user).where(
User.arel_table[:name].lower.matches("%#{@query}%").or(User.arel_table[:email].lower.matches("%#{@query}%"))
)
diff --git a/decidim-meetings/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb b/decidim-meetings/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb
index a1bba4722843..7717e6f8a163 100644
--- a/decidim-meetings/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb
+++ b/decidim-meetings/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb
@@ -14,6 +14,7 @@ def save
@registry = []
cumulative.each do |key, cumulative_value|
next if cumulative_value.zero?
+
quantity_value = quantity[key] || 0
category_id, space_type, space_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
diff --git a/decidim-meetings/app/serializers/decidim/meetings/registration_serializer.rb b/decidim-meetings/app/serializers/decidim/meetings/registration_serializer.rb
index 42628ad25245..dc4505b53ed4 100644
--- a/decidim-meetings/app/serializers/decidim/meetings/registration_serializer.rb
+++ b/decidim-meetings/app/serializers/decidim/meetings/registration_serializer.rb
@@ -31,6 +31,7 @@ def serialize_answers
def normalize_body(answer)
return "" unless answer
+
answer.body || answer.choices.pluck(:body)
end
end
diff --git a/decidim-meetings/app/services/decidim/meetings/calendar/base_calendar.rb b/decidim-meetings/app/services/decidim/meetings/calendar/base_calendar.rb
index d8087ad8bb0f..67c5da29422c 100644
--- a/decidim-meetings/app/services/decidim/meetings/calendar/base_calendar.rb
+++ b/decidim-meetings/app/services/decidim/meetings/calendar/base_calendar.rb
@@ -30,6 +30,7 @@ def initialize(resource)
# Returns a String.
def calendar
return if events.blank?
+
<<~CALENDAR.gsub("\n\n", "\n")
BEGIN:VCALENDAR\r
VERSION:2.0\r
diff --git a/decidim-meetings/spec/shared/manage_registrations_examples.rb b/decidim-meetings/spec/shared/manage_registrations_examples.rb
index c5024a3e07e9..815edc67592d 100644
--- a/decidim-meetings/spec/shared/manage_registrations_examples.rb
+++ b/decidim-meetings/spec/shared/manage_registrations_examples.rb
@@ -38,7 +38,7 @@ def visit_edit_registrations_page
end
end
- context "export registrations", driver: :rack_test do
+ context "when exporting registrations", driver: :rack_test do
let!(:registrations) { create_list :registration, 10, meeting: meeting }
it "exports a CSV" do
diff --git a/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_filters_cell.rb b/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_filters_cell.rb
index 34115c8d1052..4442c19e5c1f 100644
--- a/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_filters_cell.rb
+++ b/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_filters_cell.rb
@@ -75,6 +75,7 @@ def filter_name(filter)
def explanation
return if process_count_by_filter["active"].positive?
+
content_tag(
:span,
I18n.t(explanation_text, scope: "decidim.participatory_processes.participatory_processes.filters.explanations"),
@@ -84,6 +85,7 @@ def explanation
def explanation_text
return "no_active" if process_count_by_filter["upcoming"].positive?
+
"no_active_nor_upcoming"
end
end
diff --git a/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_group_m_cell.rb b/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_group_m_cell.rb
index 7a1f4296a9ab..866226780648 100644
--- a/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_group_m_cell.rb
+++ b/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_group_m_cell.rb
@@ -47,6 +47,7 @@ def processes_visible_for_user
if current_user
return processes.count.to_s if current_user.admin
+
processes.visible_for(current_user).count.to_s
else
processes.public_spaces.count.to_s
diff --git a/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_m_cell.rb b/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_m_cell.rb
index e2d986ddf11d..49c9c83a10e7 100644
--- a/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_m_cell.rb
+++ b/decidim-participatory_processes/app/cells/decidim/participatory_processes/process_m_cell.rb
@@ -25,6 +25,7 @@ def has_step?
def state_classes
return unless model.past?
+
["alert"]
end
diff --git a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb
index 4f739420407a..cff1bf0302f0 100644
--- a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb
+++ b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb
@@ -21,6 +21,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
process = create_participatory_process
if process.persisted?
@@ -65,6 +66,7 @@ def create_participatory_process
)
return process unless process.valid?
+
transaction do
process.save!
@@ -106,6 +108,7 @@ def add_admins_as_followers(process)
def create_participatory_process_users(process)
return unless form.private_process
+
form.users.each do |user|
ParticipatoryProcessUser.create!(
participatory_process: process,
diff --git a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process_admin.rb b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process_admin.rb
index 4e8bdf58e971..b8a99cc4dd56 100644
--- a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process_admin.rb
+++ b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process_admin.rb
@@ -103,6 +103,7 @@ def user_form
def invitation_instructions
return "invite_admin" if form.role == "admin"
+
"invite_collaborator"
end
diff --git a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process_group.rb b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process_group.rb
index 602fcefe8c76..fc5b9aa817e2 100644
--- a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process_group.rb
+++ b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/create_participatory_process_group.rb
@@ -21,6 +21,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
group = create_participatory_process_group
if group.persisted?
diff --git a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb
index 842faffacd2c..4939523cc1e0 100644
--- a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb
+++ b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb
@@ -23,6 +23,7 @@ def initialize(participatory_process, form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
update_participatory_process
if @participatory_process.valid?
diff --git a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/update_participatory_process_group.rb b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/update_participatory_process_group.rb
index da1fba227391..e25a317009cd 100644
--- a/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/update_participatory_process_group.rb
+++ b/decidim-participatory_processes/app/commands/decidim/participatory_processes/admin/update_participatory_process_group.rb
@@ -23,6 +23,7 @@ def initialize(participatory_process_group, form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
update_participatory_process_group
if @participatory_process_group.valid?
diff --git a/decidim-participatory_processes/app/controllers/decidim/participatory_processes/participatory_process_groups_controller.rb b/decidim-participatory_processes/app/controllers/decidim/participatory_processes/participatory_process_groups_controller.rb
index 5f748b04fb1e..8f87486cc633 100644
--- a/decidim-participatory_processes/app/controllers/decidim/participatory_processes/participatory_process_groups_controller.rb
+++ b/decidim-participatory_processes/app/controllers/decidim/participatory_processes/participatory_process_groups_controller.rb
@@ -21,6 +21,7 @@ def show
def participatory_processes
@participatory_processes ||= if current_user
return group.participatory_processes.published if current_user.admin
+
group.participatory_processes.visible_for(current_user).published
else
group.participatory_processes.published.public_spaces
diff --git a/decidim-participatory_processes/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb b/decidim-participatory_processes/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb
index 57acf293a326..c49d682506f1 100644
--- a/decidim-participatory_processes/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb
+++ b/decidim-participatory_processes/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb
@@ -89,6 +89,7 @@ def default_date_filter
return "active" if published_processes.any?(&:active?)
return "upcoming" if published_processes.any?(&:upcoming?)
return "past" if published_processes.any?(&:past?)
+
"all"
end
end
diff --git a/decidim-participatory_processes/app/models/decidim/participatory_process.rb b/decidim-participatory_processes/app/models/decidim/participatory_process.rb
index fcef02209c75..f7ce046d27d9 100644
--- a/decidim-participatory_processes/app/models/decidim/participatory_process.rb
+++ b/decidim-participatory_processes/app/models/decidim/participatory_process.rb
@@ -98,16 +98,19 @@ def self.log_presenter_class_for(_log)
def active?
return false if start_date.blank?
+
start_date < Date.current && (end_date.blank? || end_date > Date.current)
end
def past?
return false if end_date.blank?
+
end_date < Date.current
end
def upcoming?
return false if start_date.blank?
+
start_date > Date.current
end
diff --git a/decidim-participatory_processes/app/permissions/decidim/participatory_processes/permissions.rb b/decidim-participatory_processes/app/permissions/decidim/participatory_processes/permissions.rb
index cfdcdd5f27f0..79683f83bf02 100644
--- a/decidim-participatory_processes/app/permissions/decidim/participatory_processes/permissions.rb
+++ b/decidim-participatory_processes/app/permissions/decidim/participatory_processes/permissions.rb
@@ -24,6 +24,7 @@ def permissions
end
return permission_action unless user
+
if !has_manageable_processes? && !user.admin?
disallow!
return permission_action
@@ -59,12 +60,14 @@ def admin_user?
# Checks if it has any manageable process, with any possible role.
def has_manageable_processes?(role: :any)
return unless user
+
participatory_processes_with_role_privileges(role).any?
end
# Whether the user can manage the given process or not.
def can_manage_process?(role: :any)
return unless user
+
participatory_processes_with_role_privileges(role).include? process
end
@@ -104,6 +107,7 @@ def public_read_process_action?
return disallow! unless can_view_private_space?
return allow! if user&.admin?
return allow! if process.published?
+
toggle_allow(can_manage_process?)
end
@@ -145,6 +149,7 @@ def user_can_enter_processes_space_area?
# Only organization admins can manage process groups.
def valid_process_group_action?
return unless permission_action.subject == :process_group
+
toggle_allow(user.admin?)
end
@@ -174,12 +179,14 @@ def user_can_create_process?
# Everyone can read the process list
def user_can_read_process_list?
return unless read_process_list_permission_action?
+
toggle_allow(user.admin? || has_manageable_processes?)
end
def user_can_read_current_process?
return unless read_process_list_permission_action?
return if permission_action.subject == :process_list
+
toggle_allow(user.admin? || can_manage_process?)
end
diff --git a/decidim-participatory_processes/app/presenters/decidim/participatory_processes/admin_log/value_types/role_presenter.rb b/decidim-participatory_processes/app/presenters/decidim/participatory_processes/admin_log/value_types/role_presenter.rb
index 12d018dbe472..ff39b5665a16 100644
--- a/decidim-participatory_processes/app/presenters/decidim/participatory_processes/admin_log/value_types/role_presenter.rb
+++ b/decidim-participatory_processes/app/presenters/decidim/participatory_processes/admin_log/value_types/role_presenter.rb
@@ -13,6 +13,7 @@ class RolePresenter < Decidim::Log::ValueTypes::DefaultPresenter
# Returns an HTML-safe String.
def present
return if value.blank?
+
h.t(value, scope: "decidim.admin.models.participatory_process_user_role.roles", default: value)
end
end
diff --git a/decidim-participatory_processes/app/presenters/decidim/participatory_processes/participatory_process_metric_charts_presenter.rb b/decidim-participatory_processes/app/presenters/decidim/participatory_processes/participatory_process_metric_charts_presenter.rb
index 5110d7bb5b79..c90fbad8e2a3 100644
--- a/decidim-participatory_processes/app/presenters/decidim/participatory_processes/participatory_process_metric_charts_presenter.rb
+++ b/decidim-participatory_processes/app/presenters/decidim/participatory_processes/participatory_process_metric_charts_presenter.rb
@@ -44,6 +44,7 @@ def medium_stats
safe_join(
metrics_group.map do |metric_manifest|
next "" if metric_manifest.blank?
+
render_metrics_descriptive(metric_manifest.metric_name,
klass: "column medium-6",
graph_klass: "small",
@@ -65,6 +66,7 @@ def small_stats
safe_join(
metrics_group.map do |metric_manifest|
next "" if metric_manifest.blank?
+
render_metrics_data(metric_manifest.metric_name,
klass: "column medium-4",
ratio: "16:9",
diff --git a/decidim-participatory_processes/app/queries/decidim/participatory_processes/visible_participatory_process_groups.rb b/decidim-participatory_processes/app/queries/decidim/participatory_processes/visible_participatory_process_groups.rb
index b4c5197c3341..8ab9b20c282c 100644
--- a/decidim-participatory_processes/app/queries/decidim/participatory_processes/visible_participatory_process_groups.rb
+++ b/decidim-participatory_processes/app/queries/decidim/participatory_processes/visible_participatory_process_groups.rb
@@ -13,6 +13,7 @@ def query
if @current_user
return processes if @current_user.admin
+
processes = processes.visible_for(@current_user.id)
else
processes = processes.public_spaces
diff --git a/decidim-proposals/app/cells/decidim/proposals/collaborative_draft_m_cell.rb b/decidim-proposals/app/cells/decidim/proposals/collaborative_draft_m_cell.rb
index 7f2daefd96b9..97ca50aada3e 100644
--- a/decidim-proposals/app/cells/decidim/proposals/collaborative_draft_m_cell.rb
+++ b/decidim-proposals/app/cells/decidim/proposals/collaborative_draft_m_cell.rb
@@ -32,6 +32,7 @@ def has_badge?
def badge_classes
return super unless options[:full_badge]
+
state_classes.concat(["label", "collaborative-draft-status"]).join(" ")
end
diff --git a/decidim-proposals/app/cells/decidim/proposals/endorsers_list_cell.rb b/decidim-proposals/app/cells/decidim/proposals/endorsers_list_cell.rb
index 4bf4b0367a1d..cd5d9bcd1ffa 100644
--- a/decidim-proposals/app/cells/decidim/proposals/endorsers_list_cell.rb
+++ b/decidim-proposals/app/cells/decidim/proposals/endorsers_list_cell.rb
@@ -14,6 +14,7 @@ class EndorsersListCell < Decidim::ViewModel
def show
return unless endorsers.any?
+
render
end
diff --git a/decidim-proposals/app/cells/decidim/proposals/irreversible_action_modal_cell.rb b/decidim-proposals/app/cells/decidim/proposals/irreversible_action_modal_cell.rb
index daf36635fd1f..7acdba9af61f 100644
--- a/decidim-proposals/app/cells/decidim/proposals/irreversible_action_modal_cell.rb
+++ b/decidim-proposals/app/cells/decidim/proposals/irreversible_action_modal_cell.rb
@@ -10,6 +10,7 @@ module Proposals
class IrreversibleActionModalCell < Decidim::ViewModel
def show
return unless action.presence
+
render :show
end
diff --git a/decidim-proposals/app/cells/decidim/proposals/participatory_text_proposal_cell.rb b/decidim-proposals/app/cells/decidim/proposals/participatory_text_proposal_cell.rb
index 8b6ee1822c3f..b32de008b229 100644
--- a/decidim-proposals/app/cells/decidim/proposals/participatory_text_proposal_cell.rb
+++ b/decidim-proposals/app/cells/decidim/proposals/participatory_text_proposal_cell.rb
@@ -33,6 +33,7 @@ def section_title
def body
return unless model.participatory_text_level == "article"
+
formatted = simple_format(present(model).body)
decidim_sanitize(strip_links(formatted))
end
diff --git a/decidim-proposals/app/cells/decidim/proposals/proposal_m_cell.rb b/decidim-proposals/app/cells/decidim/proposals/proposal_m_cell.rb
index afb7dc21cd4b..e1702dad4e27 100644
--- a/decidim-proposals/app/cells/decidim/proposals/proposal_m_cell.rb
+++ b/decidim-proposals/app/cells/decidim/proposals/proposal_m_cell.rb
@@ -36,6 +36,7 @@ def has_link_to_resource?
def has_footer?
return false if model.emendation?
+
true
end
@@ -45,12 +46,14 @@ def description
def badge_classes
return super unless options[:full_badge]
+
state_classes.concat(["label", "proposal-status"]).join(" ")
end
def statuses
return [:endorsements_count, :comments_count] if model.draft?
return [:creation_date, :endorsements_count, :comments_count] if !has_link_to_resource? || !can_be_followed?
+
[:creation_date, :follow, :endorsements_count, :comments_count]
end
diff --git a/decidim-proposals/app/commands/decidim/proposals/admin/merge_proposals.rb b/decidim-proposals/app/commands/decidim/proposals/admin/merge_proposals.rb
index 0fbf3e6f4e21..5c0b1ee136de 100644
--- a/decidim-proposals/app/commands/decidim/proposals/admin/merge_proposals.rb
+++ b/decidim-proposals/app/commands/decidim/proposals/admin/merge_proposals.rb
@@ -40,6 +40,7 @@ def merge_proposals
def proposals_to_link
return previous_links if form.same_component?
+
form.proposals
end
diff --git a/decidim-proposals/app/commands/decidim/proposals/unvote_proposal.rb b/decidim-proposals/app/commands/decidim/proposals/unvote_proposal.rb
index 4967130025be..9034bf578ce2 100644
--- a/decidim-proposals/app/commands/decidim/proposals/unvote_proposal.rb
+++ b/decidim-proposals/app/commands/decidim/proposals/unvote_proposal.rb
@@ -50,6 +50,7 @@ def minimum_votes_per_user?
def update_temporary_votes
return unless minimum_votes_per_user? && user_votes.count < minimum_votes_per_user
+
user_votes.each { |vote| vote.update(temporary: true) }
end
diff --git a/decidim-proposals/app/commands/decidim/proposals/vote_proposal.rb b/decidim-proposals/app/commands/decidim/proposals/vote_proposal.rb
index 6ea8635bbea5..46886f009d23 100644
--- a/decidim-proposals/app/commands/decidim/proposals/vote_proposal.rb
+++ b/decidim-proposals/app/commands/decidim/proposals/vote_proposal.rb
@@ -55,6 +55,7 @@ def minimum_votes_per_user?
def update_temporary_votes
return unless minimum_votes_per_user? && user_votes.count >= minimum_votes_per_user
+
user_votes.each { |vote| vote.update(temporary: false) }
end
diff --git a/decidim-proposals/app/controllers/decidim/proposals/application_controller.rb b/decidim-proposals/app/controllers/decidim/proposals/application_controller.rb
index 40f6c4a8d833..fda58112e631 100644
--- a/decidim-proposals/app/controllers/decidim/proposals/application_controller.rb
+++ b/decidim-proposals/app/controllers/decidim/proposals/application_controller.rb
@@ -13,6 +13,7 @@ class ApplicationController < Decidim::Components::BaseController
def proposal_limit
return nil if component_settings.proposal_limit.zero?
+
component_settings.proposal_limit
end
diff --git a/decidim-proposals/app/controllers/decidim/proposals/collaborative_drafts_controller.rb b/decidim-proposals/app/controllers/decidim/proposals/collaborative_drafts_controller.rb
index 1429132b4101..423222da35bd 100644
--- a/decidim-proposals/app/controllers/decidim/proposals/collaborative_drafts_controller.rb
+++ b/decidim-proposals/app/controllers/decidim/proposals/collaborative_drafts_controller.rb
@@ -34,6 +34,7 @@ def index
def show
raise ActionController::RoutingError, "Not Found" unless retrieve_collaborative_draft
+
@report_form = form(Decidim::ReportForm).from_params(reason: "spam")
@request_access_form = form(RequestAccessToCollaborativeDraftForm).from_params({})
@accept_request_form = form(AcceptAccessToCollaborativeDraftForm).from_params({})
diff --git a/decidim-proposals/app/controllers/decidim/proposals/proposal_endorsements_controller.rb b/decidim-proposals/app/controllers/decidim/proposals/proposal_endorsements_controller.rb
index 1fb4fa2f0de2..07869f21772b 100644
--- a/decidim-proposals/app/controllers/decidim/proposals/proposal_endorsements_controller.rb
+++ b/decidim-proposals/app/controllers/decidim/proposals/proposal_endorsements_controller.rb
@@ -20,7 +20,7 @@ def create
end
on(:invalid) do
- render json: { error: I18n.t("proposal_endorsements.create.error", scope: "decidim.proposals") }, status: 422
+ render json: { error: I18n.t("proposal_endorsements.create.error", scope: "decidim.proposals") }, status: :unprocessable_entity
end
end
end
diff --git a/decidim-proposals/app/controllers/decidim/proposals/proposal_votes_controller.rb b/decidim-proposals/app/controllers/decidim/proposals/proposal_votes_controller.rb
index 98a9239b413f..67d303079872 100644
--- a/decidim-proposals/app/controllers/decidim/proposals/proposal_votes_controller.rb
+++ b/decidim-proposals/app/controllers/decidim/proposals/proposal_votes_controller.rb
@@ -29,7 +29,7 @@ def create
end
on(:invalid) do
- render json: { error: I18n.t("proposal_votes.create.error", scope: "decidim.proposals") }, status: 422
+ render json: { error: I18n.t("proposal_votes.create.error", scope: "decidim.proposals") }, status: :unprocessable_entity
end
end
end
diff --git a/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb b/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb
index 11979fb5eb2d..ee6c7bb5b3ef 100644
--- a/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb
+++ b/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb
@@ -55,6 +55,7 @@ def index
def show
raise ActionController::RoutingError, "Not Found" unless set_proposal
+
@report_form = form(Decidim::ReportForm).from_params(reason: "spam")
end
diff --git a/decidim-proposals/app/forms/decidim/proposals/admin/proposals_fork_form.rb b/decidim-proposals/app/forms/decidim/proposals/admin/proposals_fork_form.rb
index 9c0dcf41ea1e..7994156323c2 100644
--- a/decidim-proposals/app/forms/decidim/proposals/admin/proposals_fork_form.rb
+++ b/decidim-proposals/app/forms/decidim/proposals/admin/proposals_fork_form.rb
@@ -20,6 +20,7 @@ def proposals
def target_component
return current_component if clean_target_component_id == current_component.id
+
@target_component ||= current_component.siblings.find_by(id: target_component_id)
end
diff --git a/decidim-proposals/app/forms/decidim/proposals/proposal_wizard_create_step_form.rb b/decidim-proposals/app/forms/decidim/proposals/proposal_wizard_create_step_form.rb
index 5c86e1bd84b3..393a928068aa 100644
--- a/decidim-proposals/app/forms/decidim/proposals/proposal_wizard_create_step_form.rb
+++ b/decidim-proposals/app/forms/decidim/proposals/proposal_wizard_create_step_form.rb
@@ -28,6 +28,7 @@ def map_model(model)
def proposal_length
return unless body.presence
+
length = current_component.settings.proposal_length
errors.add(:body, :too_long, count: length) if body.length > length
end
diff --git a/decidim-proposals/app/helpers/decidim/proposals/admin/proposals_helper.rb b/decidim-proposals/app/helpers/decidim/proposals/admin/proposals_helper.rb
index 3f0747dc2d02..073977e0e3bd 100644
--- a/decidim-proposals/app/helpers/decidim/proposals/admin/proposals_helper.rb
+++ b/decidim-proposals/app/helpers/decidim/proposals/admin/proposals_helper.rb
@@ -11,6 +11,7 @@ module ProposalsHelper
# in forms.
def meetings_as_authors_selected
return unless @proposal.present? && @proposal.official_meeting?
+
@meetings_as_authors_selected ||= @proposal.authors.pluck(:id)
end
end
diff --git a/decidim-proposals/app/helpers/decidim/proposals/map_helper.rb b/decidim-proposals/app/helpers/decidim/proposals/map_helper.rb
index db2f01721de0..fa1a4f77cfcd 100644
--- a/decidim-proposals/app/helpers/decidim/proposals/map_helper.rb
+++ b/decidim-proposals/app/helpers/decidim/proposals/map_helper.rb
@@ -10,7 +10,7 @@ module MapHelper
# geocoded_proposals - A collection of geocoded proposals
def proposals_data_for_map(geocoded_proposals)
geocoded_proposals.map do |proposal|
- proposal.slice(:latitude, :longitude, :address).merge(title: present(proposal).title,
+ proposal.slice(:latitude, :longitude, :address).merge(title: present(proposal).title,
body: truncate(present(proposal).body, length: 100),
icon: icon("proposals", width: 40, height: 70, remove_icon_class: true),
link: proposal_path(proposal))
diff --git a/decidim-proposals/app/helpers/decidim/proposals/proposal_cells_helper.rb b/decidim-proposals/app/helpers/decidim/proposals/proposal_cells_helper.rb
index 08e671ffaa3a..a86a5fb0635a 100644
--- a/decidim-proposals/app/helpers/decidim/proposals/proposal_cells_helper.rb
+++ b/decidim-proposals/app/helpers/decidim/proposals/proposal_cells_helper.rb
@@ -18,11 +18,13 @@ module ProposalCellsHelper
def has_actions?
return context[:has_actions] if context[:has_actions].present?
+
proposals_controller? && index_action? && current_settings.votes_enabled? && !model.draft?
end
def has_footer?
return context[:has_footer] if context[:has_footer].present?
+
proposals_controller? && index_action? && current_settings.votes_enabled? && !model.draft?
end
diff --git a/decidim-proposals/app/helpers/decidim/proposals/proposal_endorsements_helper.rb b/decidim-proposals/app/helpers/decidim/proposals/proposal_endorsements_helper.rb
index 1827fdcbade2..c507317ac179 100644
--- a/decidim-proposals/app/helpers/decidim/proposals/proposal_endorsements_helper.rb
+++ b/decidim-proposals/app/helpers/decidim/proposals/proposal_endorsements_helper.rb
@@ -11,6 +11,7 @@ module ProposalEndorsementsHelper
# Returns a string with the value of the css classes.
def endorsement_button_classes(from_proposals_list)
return "small" if from_proposals_list
+
"small compact light button--sc expanded"
end
diff --git a/decidim-proposals/app/helpers/decidim/proposals/proposal_votes_helper.rb b/decidim-proposals/app/helpers/decidim/proposals/proposal_votes_helper.rb
index 55b7f42026f8..b37b2c00dec1 100644
--- a/decidim-proposals/app/helpers/decidim/proposals/proposal_votes_helper.rb
+++ b/decidim-proposals/app/helpers/decidim/proposals/proposal_votes_helper.rb
@@ -11,6 +11,7 @@ module ProposalVotesHelper
# Returns a hash with the css classes for the count number and label
def votes_count_classes(from_proposals_list)
return { number: "card__support__number", label: "" } if from_proposals_list
+
{ number: "extra__suport-number", label: "extra__suport-text" }
end
@@ -21,6 +22,7 @@ def votes_count_classes(from_proposals_list)
# Returns a string with the value of the css classes.
def vote_button_classes(from_proposals_list)
return "card__button button--sc" if from_proposals_list
+
"expanded button--sc"
end
@@ -29,6 +31,7 @@ def vote_button_classes(from_proposals_list)
# Returns an Integer if set, nil otherwise.
def vote_limit
return nil if component_settings.vote_limit.zero?
+
component_settings.vote_limit
end
@@ -51,6 +54,7 @@ def threshold_per_proposal_enabled?
# Returns an Integer with the maximum amount of votes, nil otherwise.
def threshold_per_proposal
return nil unless component_settings.threshold_per_proposal.positive?
+
component_settings.threshold_per_proposal
end
@@ -89,6 +93,7 @@ def current_user_can_vote?
# Returns a number with the remaining votes for that user
def remaining_votes_count_for(user)
return 0 unless vote_limit_enabled?
+
proposals = Proposal.where(component: current_component)
votes_count = ProposalVote.where(author: user, proposal: proposals).size
component_settings.vote_limit - votes_count
diff --git a/decidim-proposals/app/helpers/decidim/proposals/proposal_wizard_helper.rb b/decidim-proposals/app/helpers/decidim/proposals/proposal_wizard_helper.rb
index 2d011af34ff9..1a564d90f9a5 100644
--- a/decidim-proposals/app/helpers/decidim/proposals/proposal_wizard_helper.rb
+++ b/decidim-proposals/app/helpers/decidim/proposals/proposal_wizard_helper.rb
@@ -57,6 +57,7 @@ def proposal_wizard_step_title(action_name)
# current_step - A symbol of the current step
def proposal_wizard_stepper_step(step, current_step)
return if step == :step_4 && type_of == :collaborative_drafts
+
content_tag(:li, proposal_wizard_step_name(step), class: proposal_wizard_step_classes(step, current_step).to_s)
end
diff --git a/decidim-proposals/app/models/decidim/proposals/proposal.rb b/decidim-proposals/app/models/decidim/proposals/proposal.rb
index d480ff423e45..b01a80ff9b81 100644
--- a/decidim-proposals/app/models/decidim/proposals/proposal.rb
+++ b/decidim-proposals/app/models/decidim/proposals/proposal.rb
@@ -28,7 +28,7 @@ class Proposal < Proposals::ApplicationRecord
amendable(
fields: [:title, :body],
- form: "Decidim::Proposals::ProposalForm"
+ form: "Decidim::Proposals::ProposalForm"
)
component_manifest_name "proposals"
@@ -226,6 +226,7 @@ def can_accumulate_supports_beyond_threshold
# user - the user to check for authorship
def editable_by?(user)
return true if draft?
+
!answered? && within_edit_time_limit? && !copied_from_other_component? && created_by?(user)
end
@@ -270,6 +271,7 @@ def allow_resource_permissions?
# Checks whether the proposal is inside the time window to be editable or not once published.
def within_edit_time_limit?
return true if draft?
+
limit = updated_at + component.settings.proposal_edit_before_minutes.minutes
Time.current < limit
end
diff --git a/decidim-proposals/app/models/decidim/proposals/proposal_endorsement.rb b/decidim-proposals/app/models/decidim/proposals/proposal_endorsement.rb
index d35fcd6aefb0..4cbccb2e8270 100644
--- a/decidim-proposals/app/models/decidim/proposals/proposal_endorsement.rb
+++ b/decidim-proposals/app/models/decidim/proposals/proposal_endorsement.rb
@@ -23,11 +23,13 @@ def organization
# Private: check if the proposal and the author have the same organization
def author_and_proposal_same_organization
return if !proposal || !author
+
errors.add(:proposal, :invalid) unless author.organization == proposal.organization
end
def proposal_not_rejected
return unless proposal
+
errors.add(:proposal, :invalid) if proposal.rejected?
end
end
diff --git a/decidim-proposals/app/models/decidim/proposals/proposal_vote.rb b/decidim-proposals/app/models/decidim/proposals/proposal_vote.rb
index 36a6406e9c23..a1b380b21ee8 100644
--- a/decidim-proposals/app/models/decidim/proposals/proposal_vote.rb
+++ b/decidim-proposals/app/models/decidim/proposals/proposal_vote.rb
@@ -36,11 +36,13 @@ def update_proposal_votes_count
# Private: check if the proposal and the author have the same organization
def author_and_proposal_same_organization
return if !proposal || !author
+
errors.add(:proposal, :invalid) unless author.organization == proposal.organization
end
def proposal_not_rejected
return unless proposal
+
errors.add(:proposal, :invalid) if proposal.rejected?
end
end
diff --git a/decidim-proposals/app/permissions/decidim/proposals/admin/permissions.rb b/decidim-proposals/app/permissions/decidim/proposals/admin/permissions.rb
index 971b1d685a78..a7d213e1334c 100644
--- a/decidim-proposals/app/permissions/decidim/proposals/admin/permissions.rb
+++ b/decidim-proposals/app/permissions/decidim/proposals/admin/permissions.rb
@@ -59,6 +59,7 @@ def admin_creation_is_enabled?
def admin_edition_is_available?
return unless proposal
+
(proposal.official? || proposal.official_meeting?) && proposal.votes.empty?
end
diff --git a/decidim-proposals/app/permissions/decidim/proposals/permissions.rb b/decidim-proposals/app/permissions/decidim/proposals/permissions.rb
index 7a5fe057cdd9..2966dfacb87b 100644
--- a/decidim-proposals/app/permissions/decidim/proposals/permissions.rb
+++ b/decidim-proposals/app/permissions/decidim/proposals/permissions.rb
@@ -52,11 +52,13 @@ def proposal
def voting_enabled?
return unless current_settings
+
current_settings.votes_enabled? && !current_settings.votes_blocked?
end
def vote_limit_enabled?
return unless component_settings
+
component_settings.vote_limit.present? && component_settings.vote_limit.positive?
end
@@ -147,28 +149,33 @@ def collaborative_drafts_enabled?
def can_create_collaborative_draft?
return toggle_allow(false) unless collaborative_drafts_enabled?
+
toggle_allow(current_settings&.creation_enabled? && authorized?(:create))
end
def can_edit_collaborative_draft?
return toggle_allow(false) unless collaborative_drafts_enabled? && collaborative_draft.open?
+
toggle_allow(collaborative_draft.editable_by?(user))
end
def can_publish_collaborative_draft?
return toggle_allow(false) unless collaborative_drafts_enabled? && collaborative_draft.open?
+
toggle_allow(collaborative_draft.created_by?(user))
end
def can_request_access_collaborative_draft?
return toggle_allow(false) unless collaborative_drafts_enabled? && collaborative_draft.open?
return toggle_allow(false) if collaborative_draft.requesters.include?(user)
+
toggle_allow(!collaborative_draft.editable_by?(user))
end
def can_react_to_request_access_collaborative_draft?
return toggle_allow(false) unless collaborative_drafts_enabled? && collaborative_draft.open?
return toggle_allow(false) if collaborative_draft.requesters.include? user
+
toggle_allow(collaborative_draft.created_by?(user))
end
end
diff --git a/decidim-proposals/app/presenters/decidim/proposals/admin_log/value_types/proposal_state_presenter.rb b/decidim-proposals/app/presenters/decidim/proposals/admin_log/value_types/proposal_state_presenter.rb
index dedd039742d8..0f600af24fa6 100644
--- a/decidim-proposals/app/presenters/decidim/proposals/admin_log/value_types/proposal_state_presenter.rb
+++ b/decidim-proposals/app/presenters/decidim/proposals/admin_log/value_types/proposal_state_presenter.rb
@@ -7,6 +7,7 @@ module ValueTypes
class ProposalStatePresenter < Decidim::Log::ValueTypes::DefaultPresenter
def present
return unless value
+
h.t(value, scope: "decidim.proposals.admin.proposal_answers.edit", default: value)
end
end
diff --git a/decidim-proposals/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb b/decidim-proposals/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb
index 282ae3d5ce65..2f73fd52f6f6 100644
--- a/decidim-proposals/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb
+++ b/decidim-proposals/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb
@@ -14,6 +14,7 @@ def save
@registry = []
cumulative.each do |key, cumulative_value|
next if cumulative_value.zero?
+
quantity_value = quantity[key] || 0
category_id, space_type, space_id, proposal_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
diff --git a/decidim-proposals/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb b/decidim-proposals/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb
index 4c5e39bc9c15..e91f2844f41b 100644
--- a/decidim-proposals/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb
+++ b/decidim-proposals/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb
@@ -33,6 +33,7 @@ def retrieve_proposals_followers(from_start = false)
.where("decidim_follows.created_at <= ?", end_time)
return @proposals_followers.where("decidim_follows.created_at >= ?", start_time) if from_start
+
@proposals_followers
end
@@ -40,6 +41,7 @@ def retrieve_drafts_followers(from_start = false)
@drafts_followers ||= Decidim::Follow.where(followable: retrieve_collaborative_drafts).joins(:user)
.where("decidim_follows.created_at <= ?", end_time)
return @drafts_followers.where("decidim_follows.created_at >= ?", start_time) if from_start
+
@drafts_followers
end
diff --git a/decidim-proposals/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb b/decidim-proposals/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb
index 2c5078f17b45..c27d1c595af8 100644
--- a/decidim-proposals/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb
+++ b/decidim-proposals/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb
@@ -45,6 +45,7 @@ def retrieve_proposals(from_start = false)
.except_withdrawn
return @proposals.where("decidim_proposals_proposals.published_at >= ?", start_time) if from_start
+
@proposals
end
@@ -53,6 +54,7 @@ def retrieve_votes(from_start = false)
.where("decidim_proposals_proposal_votes.created_at <= ?", end_time)
return @votes.where("decidim_proposals_proposal_votes.created_at >= ?", start_time) if from_start
+
@votes
end
@@ -62,6 +64,7 @@ def retrieve_endorsements(from_start = false)
.where(decidim_author_type: "Decidim::UserBaseEntity")
return @endorsements.where("decidim_proposals_proposal_endorsements.created_at >= ?", start_time) if from_start
+
@endorsements
end
end
diff --git a/decidim-proposals/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb b/decidim-proposals/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb
index d84aa3553a8e..e4d2ea450f29 100644
--- a/decidim-proposals/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb
+++ b/decidim-proposals/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb
@@ -14,6 +14,7 @@ def save
@registry = []
cumulative.each do |key, cumulative_value|
next if cumulative_value.zero?
+
quantity_value = quantity[key] || 0
category_id, space_type, space_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
diff --git a/decidim-proposals/app/queries/decidim/proposals/metrics/votes_metric_manage.rb b/decidim-proposals/app/queries/decidim/proposals/metrics/votes_metric_manage.rb
index de002504cd00..6e5ddc8d114b 100644
--- a/decidim-proposals/app/queries/decidim/proposals/metrics/votes_metric_manage.rb
+++ b/decidim-proposals/app/queries/decidim/proposals/metrics/votes_metric_manage.rb
@@ -14,6 +14,7 @@ def save
@registry = []
cumulative.each do |key, cumulative_value|
next if cumulative_value.zero?
+
quantity_value = quantity[key] || 0
category_id, space_type, space_id, proposal_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
diff --git a/decidim-proposals/lib/decidim/content_parsers/proposal_parser.rb b/decidim-proposals/lib/decidim/content_parsers/proposal_parser.rb
index 9ef278d31d60..733d583b8b49 100644
--- a/decidim-proposals/lib/decidim/content_parsers/proposal_parser.rb
+++ b/decidim-proposals/lib/decidim/content_parsers/proposal_parser.rb
@@ -23,9 +23,9 @@ class ProposalParser < BaseParser
URL_REGEX_SCHEME = '(?:http(s)?:\/\/)'
URL_REGEX_CONTENT = '[\w.-]+[\w\-\._~:\/?#\[\]@!\$&\'\(\)\*\+,;=.]+'
URL_REGEX_END_CHAR = '[\d]'
- URL_REGEX = %r{#{URL_REGEX_SCHEME}#{URL_REGEX_CONTENT}/proposals/#{URL_REGEX_END_CHAR}+}i
+ URL_REGEX = %r{#{URL_REGEX_SCHEME}#{URL_REGEX_CONTENT}/proposals/#{URL_REGEX_END_CHAR}+}i.freeze
# Matches a mentioned Proposal ID (~(d)+ expression)
- ID_REGEX = /~(\d+)/
+ ID_REGEX = /~(\d+)/.freeze
def initialize(content, context)
super
diff --git a/decidim-proposals/lib/decidim/content_renderers/proposal_renderer.rb b/decidim-proposals/lib/decidim/content_renderers/proposal_renderer.rb
index b7d219875ac1..73e207625e80 100644
--- a/decidim-proposals/lib/decidim/content_renderers/proposal_renderer.rb
+++ b/decidim-proposals/lib/decidim/content_renderers/proposal_renderer.rb
@@ -10,7 +10,7 @@ module ContentRenderers
# @see BaseRenderer Examples of how to use a content renderer
class ProposalRenderer < BaseRenderer
# Matches a global id representing a Decidim::User
- GLOBAL_ID_REGEX = %r{gid:\/\/([\w-]*\/Decidim::Proposals::Proposal\/(\d+))}i
+ GLOBAL_ID_REGEX = %r{gid:\/\/([\w-]*\/Decidim::Proposals::Proposal\/(\d+))}i.freeze
# Replaces found Global IDs matching an existing proposal with
# a link to its show page. The Global IDs representing an
diff --git a/decidim-proposals/lib/decidim/proposals/commentable_proposal.rb b/decidim-proposals/lib/decidim/proposals/commentable_proposal.rb
index 782ae300536c..0bcfe5b81229 100644
--- a/decidim-proposals/lib/decidim/proposals/commentable_proposal.rb
+++ b/decidim-proposals/lib/decidim/proposals/commentable_proposal.rb
@@ -31,6 +31,7 @@ def comments_have_votes?
# Public: Override Commentable concern method `users_to_notify_on_comment_created`
def users_to_notify_on_comment_created
return (followers | component.participatory_space.admins).uniq if official?
+
followers
end
diff --git a/decidim-proposals/lib/decidim/proposals/proposal_serializer.rb b/decidim-proposals/lib/decidim/proposals/proposal_serializer.rb
index 470c07e0f3d9..e21918937e9c 100644
--- a/decidim-proposals/lib/decidim/proposals/proposal_serializer.rb
+++ b/decidim-proposals/lib/decidim/proposals/proposal_serializer.rb
@@ -86,6 +86,7 @@ def user_endorsements
def original_proposal_url
return unless proposal.emendation? && proposal.amendable.present?
+
Decidim::ResourceLocatorPresenter.new(proposal.amendable).url
end
end
diff --git a/decidim-proposals/spec/commands/decidim/proposals/admin/publish_participatory_text_spec.rb b/decidim-proposals/spec/commands/decidim/proposals/admin/publish_participatory_text_spec.rb
index f3db21fcd5da..f8d6631698b0 100644
--- a/decidim-proposals/spec/commands/decidim/proposals/admin/publish_participatory_text_spec.rb
+++ b/decidim-proposals/spec/commands/decidim/proposals/admin/publish_participatory_text_spec.rb
@@ -53,6 +53,7 @@ module Admin
expected = {}
%w(position title body).each do |attr|
next if (attr == "body") && (proposal.participatory_text_level != Decidim::Proposals::ParticipatoryTextSection::LEVELS[:article])
+
expected[attr] = proposal_form.send attr.to_sym
actual[attr] = proposal.attributes[attr]
end
diff --git a/decidim-proposals/spec/commands/decidim/proposals/admin/update_participatory_text_spec.rb b/decidim-proposals/spec/commands/decidim/proposals/admin/update_participatory_text_spec.rb
index 63ec4bf9d7fb..9124ba437ae5 100644
--- a/decidim-proposals/spec/commands/decidim/proposals/admin/update_participatory_text_spec.rb
+++ b/decidim-proposals/spec/commands/decidim/proposals/admin/update_participatory_text_spec.rb
@@ -53,6 +53,7 @@ module Admin
expected = {}
%w(position title body).each do |attr|
next if (attr == "body") && (proposal.participatory_text_level != Decidim::Proposals::ParticipatoryTextSection::LEVELS[:article])
+
expected[attr] = proposal_form.send attr.to_sym
actual[attr] = proposal.attributes[attr]
end
diff --git a/decidim-proposals/spec/services/decidim/proposals/collaborative_draft_search_spec.rb b/decidim-proposals/spec/services/decidim/proposals/collaborative_draft_search_spec.rb
index 67fa9f52e7ef..7868d53d38f5 100644
--- a/decidim-proposals/spec/services/decidim/proposals/collaborative_draft_search_spec.rb
+++ b/decidim-proposals/spec/services/decidim/proposals/collaborative_draft_search_spec.rb
@@ -20,7 +20,7 @@ module Proposals
search_text: search_text,
state: state,
related_to: related_to,
- scope_id: scope_id,
+ scope_id: scope_id
# current_user: user
).results
end
diff --git a/decidim-sortitions/app/cells/decidim/sortitions/sortition_m_cell.rb b/decidim-sortitions/app/cells/decidim/sortitions/sortition_m_cell.rb
index 3d97aea08d29..edfe85dfaf77 100644
--- a/decidim-sortitions/app/cells/decidim/sortitions/sortition_m_cell.rb
+++ b/decidim-sortitions/app/cells/decidim/sortitions/sortition_m_cell.rb
@@ -28,11 +28,13 @@ def has_badge?
def badge_name
return t("filters.cancelled", scope: "decidim.sortitions.sortitions") if model.cancelled?
+
t("filters.active", scope: "decidim.sortitions.sortitions")
end
def state_classes
return ["muted"] if model.cancelled?
+
["success"]
end
diff --git a/decidim-sortitions/app/commands/decidim/sortitions/admin/destroy_sortition.rb b/decidim-sortitions/app/commands/decidim/sortitions/admin/destroy_sortition.rb
index 8e269e7222c3..f2e524aafb8e 100644
--- a/decidim-sortitions/app/commands/decidim/sortitions/admin/destroy_sortition.rb
+++ b/decidim-sortitions/app/commands/decidim/sortitions/admin/destroy_sortition.rb
@@ -20,6 +20,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
destroy_sortition
broadcast(:ok, sortition)
end
diff --git a/decidim-surveys/app/jobs/decidim/surveys/settings_change_job.rb b/decidim-surveys/app/jobs/decidim/surveys/settings_change_job.rb
index 8bf37562a109..dec47b400a8d 100644
--- a/decidim-surveys/app/jobs/decidim/surveys/settings_change_job.rb
+++ b/decidim-surveys/app/jobs/decidim/surveys/settings_change_job.rb
@@ -17,6 +17,7 @@ def perform(component_id, previous_settings, current_settings)
end
return unless event && event_class
+
Decidim::EventsManager.publish(
event: event,
event_class: event_class,
diff --git a/decidim-surveys/app/queries/decidim/surveys/metrics/answers_metric_manage.rb b/decidim-surveys/app/queries/decidim/surveys/metrics/answers_metric_manage.rb
index e48b625c6ba3..15204577bb7e 100644
--- a/decidim-surveys/app/queries/decidim/surveys/metrics/answers_metric_manage.rb
+++ b/decidim-surveys/app/queries/decidim/surveys/metrics/answers_metric_manage.rb
@@ -15,6 +15,7 @@ def save
query.each do |key, results|
cumulative_value = results[:cumulative]
next if cumulative_value.zero?
+
quantity_value = results[:quantity] || 0
space_type, space_id, survey_id = key
record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
diff --git a/decidim-system/app/commands/decidim/system/register_organization.rb b/decidim-system/app/commands/decidim/system/register_organization.rb
index 5bdd90e18f99..bf117ec848bc 100644
--- a/decidim-system/app/commands/decidim/system/register_organization.rb
+++ b/decidim-system/app/commands/decidim/system/register_organization.rb
@@ -21,6 +21,7 @@ def initialize(form)
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
+
@organization = nil
invite_form = nil
diff --git a/decidim-verifications/app/controllers/decidim/verifications/id_documents/authorizations_controller.rb b/decidim-verifications/app/controllers/decidim/verifications/id_documents/authorizations_controller.rb
index df8f5ab34d27..ff264c88b0f1 100644
--- a/decidim-verifications/app/controllers/decidim/verifications/id_documents/authorizations_controller.rb
+++ b/decidim-verifications/app/controllers/decidim/verifications/id_documents/authorizations_controller.rb
@@ -13,11 +13,13 @@ class AuthorizationsController < ApplicationController
def choose
return redirect_to action: :new, using: verification_type if available_methods.count == 1
+
render :choose
end
def new
raise ActionController::RoutingError, "Method not available" unless available_methods.include?(verification_type)
+
enforce_permission_to :create, :authorization, authorization: @authorization
@form = UploadForm.from_params(id_document_upload: { verification_type: verification_type })
@@ -92,6 +94,7 @@ def verification_type
def authorization_verification_type
return unless @authorization
+
@authorization.verification_metadata["verification_type"]
end
diff --git a/decidim-verifications/app/controllers/decidim/verifications/postal_letter/admin/postages_controller.rb b/decidim-verifications/app/controllers/decidim/verifications/postal_letter/admin/postages_controller.rb
index 2e10de724cc7..e81db9fb8523 100644
--- a/decidim-verifications/app/controllers/decidim/verifications/postal_letter/admin/postages_controller.rb
+++ b/decidim-verifications/app/controllers/decidim/verifications/postal_letter/admin/postages_controller.rb
@@ -24,7 +24,7 @@ def create
end
on(:invalid) do
- render json: { error: I18n.t("postages.create.error", scope: "decidim.verifications.postal_letter.admin") }, status: 422
+ render json: { error: I18n.t("postages.create.error", scope: "decidim.verifications.postal_letter.admin") }, status: :unprocessable_entity
end
end
end
diff --git a/decidim-verifications/app/forms/decidim/verifications/sms/mobile_phone_form.rb b/decidim-verifications/app/forms/decidim/verifications/sms/mobile_phone_form.rb
index 13afbe20fc45..11a0c45a8e77 100644
--- a/decidim-verifications/app/forms/decidim/verifications/sms/mobile_phone_form.rb
+++ b/decidim-verifications/app/forms/decidim/verifications/sms/mobile_phone_form.rb
@@ -25,6 +25,7 @@ def unique_id
# When there's a phone number, sanitize it allowing only numbers and +.
def mobile_phone_number
return unless super
+
super.gsub(/[^\+0-9]/, "")
end
@@ -43,6 +44,7 @@ def verification_code
return @verification_code if defined?(@verification_code)
return unless sms_gateway.new(mobile_phone_number, generated_code).deliver_code
+
@verification_code = generated_code
end
diff --git a/decidim-verifications/app/permissions/decidim/verifications/csv_census/admin/permissions.rb b/decidim-verifications/app/permissions/decidim/verifications/csv_census/admin/permissions.rb
index cbad0cc39d59..70d4274ffea1 100644
--- a/decidim-verifications/app/permissions/decidim/verifications/csv_census/admin/permissions.rb
+++ b/decidim-verifications/app/permissions/decidim/verifications/csv_census/admin/permissions.rb
@@ -7,6 +7,7 @@ module Admin
class Permissions < Decidim::DefaultPermissions
def permissions
return permission_action if permission_action.scope != :admin
+
if user.organization.available_authorizations.include?("csv_census")
allow! if permission_action.subject == Decidim::Verifications::CsvDatum
permission_action
diff --git a/decidim_app-design/Gemfile.lock b/decidim_app-design/Gemfile.lock
index f81fc2f36c58..3b91eba453f5 100644
--- a/decidim_app-design/Gemfile.lock
+++ b/decidim_app-design/Gemfile.lock
@@ -137,7 +137,8 @@ PATH
rspec-html-matchers (~> 0.9.1)
rspec-rails (~> 3.7)
rspec_junit_formatter (~> 0.3.0)
- rubocop (~> 0.58.0)
+ rubocop (~> 0.71.0)
+ rubocop-rails (~> 2.0)
rubocop-rspec (~> 1.21)
selenium-webdriver (~> 3.7)
simplecov (~> 0.13)
@@ -285,7 +286,7 @@ GEM
msgpack (~> 1.0)
builder (3.2.3)
byebug (10.0.2)
- capybara (3.22.0)
+ capybara (3.24.0)
addressable
mini_mime (>= 0.1.3)
nokogiri (~> 1.8)
@@ -354,7 +355,7 @@ GEM
doc2text (0.4.1)
nokogiri (~> 1.8, >= 1.8.2)
rubyzip (~> 1.2, >= 1.2.2)
- docile (1.3.1)
+ docile (1.3.2)
domain_name (0.5.20180417)
unf (>= 0.0.5, < 1.0.0)
doorkeeper (4.4.3)
@@ -539,7 +540,6 @@ GEM
pg_search (2.2.0)
activerecord (>= 4.2)
activesupport (>= 4.2)
- powerpack (0.1.2)
premailer (1.11.1)
addressable
css_parser (>= 1.6.0)
@@ -621,15 +621,15 @@ GEM
rspec-cells (0.3.4)
cells (>= 4.0.0, < 6.0.0)
rspec-rails (~> 3.2)
- rspec-core (3.8.0)
+ rspec-core (3.8.1)
rspec-support (~> 3.8.0)
- rspec-expectations (3.8.3)
+ rspec-expectations (3.8.4)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-html-matchers (0.9.1)
nokogiri (~> 1)
rspec (>= 3.0.0.a, < 4)
- rspec-mocks (3.8.0)
+ rspec-mocks (3.8.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-rails (3.8.2)
@@ -640,19 +640,21 @@ GEM
rspec-expectations (~> 3.8.0)
rspec-mocks (~> 3.8.0)
rspec-support (~> 3.8.0)
- rspec-support (3.8.0)
+ rspec-support (3.8.2)
rspec_junit_formatter (0.3.0)
rspec-core (>= 2, < 4, != 2.12.0)
- rubocop (0.58.2)
+ rubocop (0.71.0)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
- parser (>= 2.5, != 2.5.1.1)
- powerpack (~> 0.1)
+ parser (>= 2.6)
rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
- unicode-display_width (~> 1.0, >= 1.0.1)
- rubocop-rspec (1.30.0)
- rubocop (>= 0.58.0)
+ unicode-display_width (>= 1.4.0, < 1.7)
+ rubocop-rails (2.0.1)
+ rack (>= 1.1)
+ rubocop (>= 0.70.0)
+ rubocop-rspec (1.33.0)
+ rubocop (>= 0.60.0)
ruby-ole (1.2.12.2)
ruby-progressbar (1.10.1)
ruby_dep (1.5.0)