decidim-challenges 0.6.0 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/solutions/solution_g/show.erb +1 -1
  3. data/app/cells/decidim/solutions/solution_g_cell.rb +2 -0
  4. data/app/commands/decidim/challenges/survey_challenge.rb +6 -3
  5. data/app/forms/decidim/solutions/solutions_form.rb +1 -1
  6. data/app/helpers/decidim/solutions/solution_cells_helper.rb +1 -0
  7. data/app/models/decidim/challenges/challenge.rb +1 -1
  8. data/app/models/decidim/challenges/survey.rb +2 -2
  9. data/app/models/decidim/problems/problem.rb +1 -1
  10. data/app/serializers/decidim/challenges/survey_serializer.rb +4 -4
  11. data/app/serializers/decidim/solutions/solution_serializer.rb +20 -2
  12. data/app/views/decidim/challenges/admin/challenges/edit.html.erb +1 -1
  13. data/app/views/decidim/problems/admin/problems/edit.html.erb +1 -1
  14. data/app/views/decidim/problems/problems/_sidebar_data.html.erb +2 -2
  15. data/app/views/decidim/problems/problems/show.html.erb +0 -1
  16. data/app/views/decidim/sdgs/sdgs/index.html.erb +2 -2
  17. data/app/views/decidim/sdgs/sdgs_filter/_modal.html.erb +1 -4
  18. data/app/views/decidim/solutions/admin/solutions/_form.html.erb +1 -1
  19. data/app/views/decidim/solutions/admin/solutions/edit.html.erb +1 -1
  20. data/app/views/decidim/solutions/admin/solutions/show.html.erb +1 -2
  21. data/app/views/decidim/solutions/solutions/_sidebar_data.html.erb +2 -2
  22. data/app/views/decidim/solutions/solutions/show.html.erb +1 -1
  23. data/config/locales/ca.yml +2 -1
  24. data/config/locales/en.yml +2 -1
  25. data/config/locales/es.yml +2 -1
  26. data/db/migrate/20250902145427_change_user_to_author_in_challenges_surveys.rb +35 -0
  27. data/lib/decidim/challenges/test/factories.rb +1 -1
  28. data/lib/decidim/challenges/version.rb +2 -2
  29. metadata +7 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f6741d5f3e2e1eec682344b9ed01dc6ea9b1c98c60c7c239eecd50b39b7b28b
4
- data.tar.gz: 724e8cb63ca6ee7cb8e13eae897850fa2cad889246f6894e36118d92e3997b3b
3
+ metadata.gz: 95e745fe3d49e802946f403938a6b11603b9110cb08f81407c8fa5810c51dfbf
4
+ data.tar.gz: a24fcfa528d1023b365122e17ea937da6f0e5fb807b5b30fcfad2feed0acdb43
5
5
  SHA512:
6
- metadata.gz: 372cbf8488a77d85974463a7b992860b2c5aa54e1bb7bbd46d1971d5e1a38f6ff1b05a5e5bdbab35a9df562ebcf9466b900531e912e4b5e313068e34e59cbf57
7
- data.tar.gz: d52802d6d03a1fceb5dee5dcbfacacba2a37ac54eedc4efc45435e7a1bb12ff9b3664c9ffa8bc06701f44ede84a4fc95faff62e7a3dbf3667556d6907cd0ffd2
6
+ metadata.gz: 24385b67ade44975efb0eb9cea8d2f976e6dbc14f66a23dc6cbb309fb932bacfdd5ca8496309032482c142c9f3e6e0a71f31b5339e3adab78d3b93879dc68771
7
+ data.tar.gz: 0e748da2b962e8e22c88526c6f608d6f72452c10800a6d88e4a791f91332e0896c2d6b3c719c4fbf2eb549119d11e8f41313fba6648984c51f625a0bc653229e
@@ -7,7 +7,7 @@
7
7
  <% end %>
8
8
  <div class="card__list-text">
9
9
  <%= description %>
10
- <% if resource_sdg %>
10
+ <% if has_sdgs? %>
11
11
  <div class="card__sdg">
12
12
  <div class="card_text--sdg--image">
13
13
  <div class="ods challenges">
@@ -6,7 +6,9 @@ module Decidim
6
6
  # for an given instance of a Solution
7
7
  class SolutionGCell < Decidim::CardGCell
8
8
  include ActiveSupport::NumberHelper
9
+ include Decidim::Solutions::SolutionsHelper
9
10
  include Decidim::Sdgs::SdgsHelper
11
+ include Decidim::Solutions::SolutionCellsHelper
10
12
 
11
13
  private
12
14
 
@@ -41,7 +41,7 @@ module Decidim
41
41
  def answer_questionnaire
42
42
  return unless questionnaire?
43
43
 
44
- Decidim::Forms::AnswerQuestionnaire.call(survey_form, user, challenge.questionnaire) do
44
+ Decidim::Forms::AnswerQuestionnaire.call(survey_form, challenge.questionnaire) do
45
45
  on(:invalid) do
46
46
  raise ActiveRecord::Rollback
47
47
  end
@@ -51,7 +51,7 @@ module Decidim
51
51
  def create_survey
52
52
  @survey = Decidim::Challenges::Survey.create!(
53
53
  challenge:,
54
- user:
54
+ author: user
55
55
  )
56
56
  end
57
57
 
@@ -60,7 +60,10 @@ module Decidim
60
60
  end
61
61
 
62
62
  def can_answer_survey?
63
- Decidim::Challenges::Survey.where(decidim_user_id: user, decidim_challenge_id: challenge).none?
63
+ Decidim::Challenges::Survey.where(
64
+ decidim_author_id: user.id,
65
+ decidim_challenge_id: challenge.id
66
+ ).none?
64
67
  end
65
68
  end
66
69
  end
@@ -32,7 +32,7 @@ module Decidim
32
32
  self.description = translated_attribute(model.description)
33
33
 
34
34
  self.documents = model.attachments
35
- return unless model.categorization
35
+ nil unless model.categorization
36
36
  end
37
37
 
38
38
  # Finds the Challenge from the given decidim_challenges_challenge_id
@@ -13,6 +13,7 @@ module Decidim
13
13
  include Decidim::ResourceReferenceHelper
14
14
  include Decidim::TranslatableAttributes
15
15
  include Decidim::CardHelper
16
+ include WithSdgs
16
17
 
17
18
  delegate :title, :state, :published_state?, :withdrawn?, :amendable?, :emendation?, to: :model
18
19
 
@@ -25,7 +25,7 @@ module Decidim
25
25
  has_many :surveys, class_name: "Decidim::Challenges::Survey", foreign_key: "decidim_challenge_id", dependent: :destroy
26
26
 
27
27
  VALID_STATES = [:proposal, :execution, :finished].freeze
28
- enum state: VALID_STATES
28
+ enum :state, VALID_STATES
29
29
 
30
30
  has_many :problems,
31
31
  class_name: "Decidim::Problems::Problem",
@@ -7,9 +7,9 @@ module Decidim
7
7
  include Decidim::DownloadYourData
8
8
 
9
9
  belongs_to :challenge, foreign_key: "decidim_challenge_id", class_name: "Decidim::Challenges::Challenge"
10
- belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User"
10
+ belongs_to :author, foreign_key: "decidim_author_id", class_name: "Decidim::User"
11
11
 
12
- validates :user, uniqueness: { scope: :challenge }
12
+ validates :decidim_author_id, uniqueness: { scope: :decidim_challenge_id }
13
13
 
14
14
  def self.export_serializer
15
15
  Decidim::Challenges::DownloadYourDataSurveySerializer
@@ -16,7 +16,7 @@ module Decidim
16
16
  include Decidim::Randomable
17
17
 
18
18
  VALID_STATES = [:proposal, :execution, :finished].freeze
19
- enum state: VALID_STATES
19
+ enum :state, VALID_STATES
20
20
 
21
21
  component_manifest_name "problems"
22
22
 
@@ -8,9 +8,9 @@ module Decidim
8
8
  def serialize
9
9
  {
10
10
  id: resource.id,
11
- user: {
12
- name: resource.user.name,
13
- email: resource.user.email,
11
+ author: {
12
+ name: resource.author.name,
13
+ email: resource.author.email,
14
14
  },
15
15
  survey_form_answers: serialize_answers,
16
16
  }
@@ -20,7 +20,7 @@ module Decidim
20
20
 
21
21
  def serialize_answers
22
22
  questions = resource.challenge.questionnaire.questions
23
- answers = resource.challenge.questionnaire.answers.where(user: resource.user)
23
+ answers = resource.challenge.questionnaire.answers.where(user: resource.author)
24
24
  questions.each_with_index.inject({}) do |serialized, (question, idx)|
25
25
  answer = answers.find_by(question:)
26
26
  serialized.update("#{idx + 1}. #{translated_attribute(question.body)}" => normalize_body(answer))
@@ -11,11 +11,13 @@ module Decidim
11
11
 
12
12
  def serialize
13
13
  {
14
- title_label => resource.title[I18n.locale.to_s],
14
+ title_label => localized(resource.title),
15
15
  description_label => sanitized_description,
16
16
  status_label => resource&.project_status,
17
17
  challenge_label => translated_challenge_title,
18
18
  url_label => resource&.project_url,
19
+ author_name_label => resource.author.name,
20
+ author_email_label => resource.author.email,
19
21
  created_at_label => resource.created_at,
20
22
  published_at_label => resource&.published_at,
21
23
  }
@@ -23,6 +25,14 @@ module Decidim
23
25
 
24
26
  private
25
27
 
28
+ def localized(value)
29
+ if value.is_a?(Hash)
30
+ value[I18n.locale.to_s] || ""
31
+ else
32
+ value.to_s
33
+ end
34
+ end
35
+
26
36
  def sanitize(text)
27
37
  ActionController::Base.helpers.strip_tags(text)
28
38
  end
@@ -55,12 +65,20 @@ module Decidim
55
65
  I18n.t("export.published_at", scope: "decidim.solutions.admin.exports").to_s
56
66
  end
57
67
 
68
+ def author_name_label
69
+ I18n.t("export.author_name", scope: "decidim.solutions.admin.exports").to_s
70
+ end
71
+
72
+ def author_email_label
73
+ I18n.t("export.author_email", scope: "decidim.solutions.admin.exports").to_s
74
+ end
75
+
58
76
  def translated_challenge_title
59
77
  resource&.challenge&.title.present? ? resource&.challenge&.title&.[](I18n.locale.to_s) : ""
60
78
  end
61
79
 
62
80
  def sanitized_description
63
- sanitize(resource.description[I18n.locale.to_s])
81
+ sanitize(localized(resource.description))
64
82
  end
65
83
  end
66
84
  end
@@ -11,7 +11,7 @@
11
11
  <div class="item__edit-sticky">
12
12
  <div class="item__edit-sticky-container">
13
13
  <%= f.submit t(".update"), class: "button button__sm button__secondary" %>
14
-
14
+
15
15
  <% if challenge.published? %>
16
16
  <%= link_to t("actions.unpublish", scope: "decidim.challenges.admin"), challenge_publish_path(challenge), method: :delete, class: "button button__sm button__secondary" %>
17
17
  <% else %>
@@ -11,7 +11,7 @@
11
11
  <div class="item__edit-sticky">
12
12
  <div class="item__edit-sticky-container">
13
13
  <%= f.submit t(".update"), class: "button button__sm button__secondary" %>
14
-
14
+
15
15
  <% if problem.published? %>
16
16
  <%= link_to t("actions.unpublish", scope: "decidim.problems.admin"), problem_publish_path(problem), method: :delete, class: "button button__sm button__secondary" %>
17
17
  <% else %>
@@ -36,14 +36,14 @@
36
36
  <% if @problem.decidim_sectorial_scope_id.present? %>
37
37
  <div class="text-sm flex flex-col items-center gap-1">
38
38
  <p class="uppercase text-xs"><%= t("decidim_sectorial_scope_id", scope: "activemodel.attributes.problem") %></p>
39
- <p class="uppercase mb-4"><%= translated_attribute current_organization.scopes.find_by(id: @problem.decidim_sectorial_scope_id).name %></p>
39
+ <p class="uppercase mb-4"><%= translated_attribute current_organization.scopes.find_by(id: @problem.decidim_sectorial_scope_id).name %></p>
40
40
  </div>
41
41
  <% end %>
42
42
 
43
43
  <% if @problem.decidim_technological_scope_id.present? %>
44
44
  <div class="text-sm flex flex-col items-center gap-1">
45
45
  <p class="uppercase text-xs"><%= t("decidim_sectorial_scope_id", scope: "activemodel.attributes.problem") %></p>
46
- <p class="uppercase mb-4"><%= translated_attribute current_organization.scopes.find_by(id: @problem.decidim_technological_scope_id).name %></p>
46
+ <p class="uppercase mb-4"><%= translated_attribute current_organization.scopes.find_by(id: @problem.decidim_technological_scope_id).name %></p>
47
47
  </div>
48
48
  <% end %>
49
49
  </div>
@@ -35,4 +35,3 @@
35
35
  <%= render partial: "sidebar_data" %>
36
36
  <% end %>
37
37
  <% end %>
38
-
@@ -25,11 +25,11 @@
25
25
  </div>
26
26
  </div>
27
27
  </div>
28
-
28
+
29
29
  <div id="ods-container">
30
30
  <%= render partial: "ods" %>
31
31
  </div>
32
-
32
+
33
33
  <div id="objective-container">
34
34
  <%= render partial: "objectives" %>
35
35
  </div>
@@ -15,7 +15,7 @@
15
15
  idx+= 1
16
16
  idx_str= idx.to_s.rjust(2, "0") %>
17
17
  <div class="sdg-cell" data-value="<%= sdg_code %>">
18
- <%= image_pack_tag "media/images/ods-#{idx_str}.svg", alt: "Logo SDG #{idx_str}"%>
18
+ <%= image_pack_tag "media/images/ods-#{idx_str}.svg", alt: "Logo SDG #{idx_str}" %>
19
19
  <div class="text">
20
20
  <p><%= "#{idx_str}. #{t_sdg(sdg_code)}" %></p>
21
21
  </div>
@@ -28,8 +28,5 @@
28
28
  <a class="button button__sm md:button__lg button__secondary" data-close="" role="button"><%= t(".close") %></a>
29
29
  </div>
30
30
  </div>
31
-
32
31
  </div>
33
32
  </div>
34
-
35
-
@@ -56,7 +56,7 @@
56
56
  <%= form.hidden_field :decidim_challenges_challenge_id, value: @form.try(:challenge) ? @form.try(:challenge).id : '' %>
57
57
  <% else %>
58
58
  <%= form.hidden_field :decidim_problems_problem_id, value: @form.try(:problem) ? @form.try(:problem).id : '' %>
59
- <div class="card-section"">
59
+ <div class="card-section">
60
60
  <div class="row column">
61
61
  <%= form.select :decidim_challenges_challenge_id,
62
62
  @form.select_challenge_collection,
@@ -11,7 +11,7 @@
11
11
  <div class="item__edit-sticky">
12
12
  <div class="item__edit-sticky-container">
13
13
  <%= f.submit t(".update"), class: "button button__sm button__secondary" %>
14
-
14
+
15
15
  <% if solution.published? %>
16
16
  <%= link_to t("actions.unpublish", scope: "decidim.solutions.admin"), solution_publish_path(solution), method: :delete, class: "button button__sm button__secondary" %>
17
17
  <% else %>
@@ -42,7 +42,7 @@
42
42
  <div class="row column">
43
43
  <span class="component__show-description"><%= t ".description" %></span>
44
44
  <p class="component__show-text">
45
- <%= decidim_sanitize_editor_admin translated_attribute solution.description %>
45
+ <%= decidim_sanitize_editor_admin translated_attribute solution.description %>
46
46
  </p>
47
47
  </div>
48
48
  </div>
@@ -111,4 +111,3 @@
111
111
  <% end %>
112
112
  </div>
113
113
  </div>
114
-
@@ -14,7 +14,7 @@
14
14
  <p class="uppercase mb-4"><%= t(@solution.challenge.state, scope: "decidim.challenges.states") %></p>
15
15
  <% else %>
16
16
  <p class="uppercase mb-4"><%= t(@solution.project_status, scope: "decidim.solutions.solutions.form.project_statuses") %></p>
17
- <% end %>
17
+ <% end %>
18
18
  </div>
19
19
  <% end %>
20
20
  </div>
@@ -77,7 +77,7 @@
77
77
  </div>
78
78
  <% end %>
79
79
  </div>
80
-
80
+
81
81
  <% if has_problem? %>
82
82
  <% if @solution.problem.challenge.sdg_code %>
83
83
  <div class="text-sm flex flex-col items-center gap-1">
@@ -14,7 +14,7 @@
14
14
  <% if has_problem? %>
15
15
  <h3 class="h4">
16
16
  <span class="title"><%= t("problem", scope: "activemodel.attributes.solution") %></span>:
17
- <%= link_to translated_attribute(@solution.problem.title), Decidim::ResourceLocatorPresenter.new(@solution.problem).path %><br />
17
+ <%= link_to translated_attribute(@solution.problem.title), Decidim::ResourceLocatorPresenter.new(@solution.problem).path %><br>
18
18
  <span class="title"><%= t("challenge", scope: "activemodel.attributes.problem") %></span>:
19
19
  <%= link_to translated_attribute(@solution.problem.challenge.title), Decidim::ResourceLocatorPresenter.new(@solution.problem.challenge).path %></strong>
20
20
  </h3>
@@ -1136,7 +1136,8 @@ ca:
1136
1136
  exports:
1137
1137
  solutions: "Solucions"
1138
1138
  export:
1139
- author: "Autor"
1139
+ author_name: "Nom autor"
1140
+ author_email: "Email autor"
1140
1141
  title: "Títol"
1141
1142
  description: "Descripció"
1142
1143
  status: "Estat"
@@ -1138,7 +1138,8 @@ en:
1138
1138
  exports:
1139
1139
  solutions: "Solutions"
1140
1140
  export:
1141
- author: "Author"
1141
+ author_name: "Author name"
1142
+ author_email: "Author email"
1142
1143
  title: "Title"
1143
1144
  description: "Description"
1144
1145
  status: "Status"
@@ -1143,7 +1143,8 @@ es:
1143
1143
  exports:
1144
1144
  solutions: "Soluciones"
1145
1145
  export:
1146
- author: "Autor"
1146
+ author_name: "Nombre autor"
1147
+ author_email: "Email autor"
1147
1148
  title: "Título"
1148
1149
  description: "Descripción"
1149
1150
  status: "Estado"
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ChangeUserToAuthorInChallengesSurveys < ActiveRecord::Migration[6.1]
4
+ class ChallengeSurvey < ApplicationRecord
5
+ self.table_name = "decidim_challenges_surveys"
6
+ end
7
+
8
+ def up
9
+ rename_column :decidim_challenges_surveys, :decidim_user_id, :decidim_author_id
10
+
11
+ remove_index :decidim_challenges_surveys, name: "decidim_challenges_surveys_user_challenge_unique", if_exists: true
12
+ remove_index :decidim_challenges_surveys, name: "index_decidim_challenges_surveys_on_decidim_user_id", if_exists: true
13
+
14
+ add_index :decidim_challenges_surveys,
15
+ [:decidim_author_id, :decidim_challenge_id],
16
+ unique: true,
17
+ name: "decidim_challenges_surveys_author_challenge_unique"
18
+ end
19
+
20
+ def down
21
+ remove_index :decidim_challenges_surveys, name: "decidim_challenges_surveys_author", if_exists: true
22
+ remove_index :decidim_challenges_surveys, name: "decidim_challenges_surveys_author_challenge_unique", if_exists: true
23
+
24
+ rename_column :decidim_challenges_surveys, :decidim_author_id, :decidim_user_id
25
+
26
+ add_index :decidim_challenges_surveys,
27
+ [:decidim_user_id, :decidim_challenge_id],
28
+ unique: true,
29
+ name: "decidim_challenges_surveys_user_challenge_unique"
30
+
31
+ add_index :decidim_challenges_surveys,
32
+ :decidim_user_id,
33
+ name: "index_decidim_challenges_surveys_on_decidim_user_id"
34
+ end
35
+ end
@@ -54,6 +54,6 @@ FactoryBot.define do
54
54
 
55
55
  factory :survey, class: "Decidim::Challenges::Survey" do
56
56
  challenge
57
- user
57
+ author factory: [:user]
58
58
  end
59
59
  end
@@ -4,11 +4,11 @@ module Decidim
4
4
  # This holds the decidim-meetings version.
5
5
  module Challenges
6
6
  def self.version
7
- "0.6.0"
7
+ "0.7.3"
8
8
  end
9
9
 
10
10
  def self.decidim_version
11
- "~> 0.27"
11
+ "~> 0.29"
12
12
  end
13
13
  end
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-challenges
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oliver Valls
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-07-07 00:00:00.000000000 Z
11
+ date: 2025-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: decidim-core
@@ -16,42 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.27'
19
+ version: '0.29'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.27'
27
- - !ruby/object:Gem::Dependency
28
- name: decidim
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '0.27'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '0.27'
41
- - !ruby/object:Gem::Dependency
42
- name: decidim-dev
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0.27'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.27'
26
+ version: '0.29'
55
27
  description: Articulates the collective action of diverse actors in order to address
56
28
  shared challenges and the problems that derive from them across the territory.
57
29
  email:
@@ -268,6 +240,7 @@ files:
268
240
  - db/migrate/20210427091033_remove_require_null_in_problems_for_solutions.rb
269
241
  - db/migrate/20220407110503_add_card_image_to_challenges.rb
270
242
  - db/migrate/20240919094714_add_public_fields_to_solutions.rb
243
+ - db/migrate/20250902145427_change_user_to_author_in_challenges_surveys.rb
271
244
  - lib/decidim/challenges.rb
272
245
  - lib/decidim/challenges/admin.rb
273
246
  - lib/decidim/challenges/admin_engine.rb
@@ -303,14 +276,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
303
276
  requirements:
304
277
  - - ">="
305
278
  - !ruby/object:Gem::Version
306
- version: 3.1.1
279
+ version: 3.2.9
307
280
  required_rubygems_version: !ruby/object:Gem::Requirement
308
281
  requirements:
309
282
  - - ">="
310
283
  - !ruby/object:Gem::Version
311
284
  version: '0'
312
285
  requirements: []
313
- rubygems_version: 3.3.7
286
+ rubygems_version: 3.4.19
314
287
  signing_key:
315
288
  specification_version: 4
316
289
  summary: A decidim challenges module