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)