decidim-consultations 0.11.2 → 0.12.0.pre

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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/decidim_consultations_manifest.css +4 -0
  3. data/app/assets/stylesheets/decidim/consultations/consultations.scss +0 -1
  4. data/app/cells/decidim/consultations/consultation_cell.rb +19 -0
  5. data/app/cells/decidim/consultations/consultation_m/data.erb +21 -0
  6. data/app/cells/decidim/consultations/consultation_m/footer.erb +5 -0
  7. data/app/cells/decidim/consultations/consultation_m_cell.rb +94 -0
  8. data/app/commands/decidim/consultations/admin/update_consultation.rb +2 -1
  9. data/app/controllers/concerns/decidim/consultations/action_authorization.rb +2 -2
  10. data/app/controllers/concerns/decidim/consultations/admin/consultation_admin.rb +7 -0
  11. data/app/controllers/concerns/decidim/consultations/admin/question_admin.rb +7 -0
  12. data/app/controllers/concerns/decidim/consultations/needs_consultation.rb +0 -4
  13. data/app/controllers/concerns/decidim/consultations/needs_question.rb +0 -7
  14. data/app/controllers/decidim/consultations/admin/application_controller.rb +15 -0
  15. data/app/controllers/decidim/consultations/admin/consultation_publications_controller.rb +3 -3
  16. data/app/controllers/decidim/consultations/admin/consultation_results_publications_controller.rb +3 -3
  17. data/app/controllers/decidim/consultations/admin/consultations_controller.rb +6 -10
  18. data/app/controllers/decidim/consultations/admin/question_attachments_controller.rb +1 -1
  19. data/app/controllers/decidim/consultations/admin/question_publications_controller.rb +3 -3
  20. data/app/controllers/decidim/consultations/admin/questions_controller.rb +6 -10
  21. data/app/controllers/decidim/consultations/admin/responses_controller.rb +7 -7
  22. data/app/controllers/decidim/consultations/application_controller.rb +25 -0
  23. data/app/controllers/decidim/consultations/consultations_controller.rb +3 -17
  24. data/app/controllers/decidim/consultations/question_votes_controller.rb +3 -3
  25. data/app/controllers/decidim/consultations/questions_controller.rb +2 -2
  26. data/app/forms/decidim/consultations/admin/consultation_form.rb +1 -0
  27. data/app/models/decidim/consultation.rb +4 -3
  28. data/app/models/decidim/consultations/question.rb +22 -1
  29. data/app/permissions/decidim/consultations/admin/permissions.rb +108 -0
  30. data/app/permissions/decidim/consultations/permissions.rb +55 -0
  31. data/app/views/decidim/consultations/admin/consultations/edit.html.erb +4 -4
  32. data/app/views/decidim/consultations/admin/consultations/index.html.erb +5 -5
  33. data/app/views/decidim/consultations/admin/questions/edit.html.erb +2 -2
  34. data/app/views/decidim/consultations/admin/questions/index.html.erb +5 -5
  35. data/app/views/decidim/consultations/admin/responses/edit.html.erb +1 -1
  36. data/app/views/decidim/consultations/admin/responses/index.html.erb +3 -3
  37. data/app/views/decidim/consultations/consultation_widgets/show.html.erb +0 -2
  38. data/app/views/decidim/consultations/consultations/_consultations.html.erb +1 -1
  39. data/app/views/decidim/consultations/consultations/_regular_questions.html.erb +2 -2
  40. data/app/views/decidim/consultations/consultations/show.html.erb +0 -8
  41. data/app/views/decidim/consultations/question_votes/update_vote_button.js.erb +3 -0
  42. data/app/views/decidim/consultations/questions/_vote_button.html.erb +15 -28
  43. data/app/views/decidim/consultations/questions/_vote_modal.html.erb +1 -1
  44. data/app/views/decidim/consultations/questions/_vote_modal_confirm.html.erb +1 -1
  45. data/app/views/layouts/decidim/_question_components.html.erb +3 -2
  46. data/app/views/layouts/decidim/admin/consultation.html.erb +7 -4
  47. data/app/views/layouts/decidim/admin/consultations.html.erb +16 -10
  48. data/app/views/layouts/decidim/admin/question.html.erb +11 -8
  49. data/app/views/layouts/decidim/consultation.html.erb +0 -2
  50. data/app/views/layouts/decidim/consultation_choose.html.erb +0 -2
  51. data/app/views/layouts/decidim/question.html.erb +0 -1
  52. data/config/locales/ca.yml +33 -11
  53. data/config/locales/en.yml +33 -11
  54. data/config/locales/es.yml +33 -11
  55. data/config/locales/eu.yml +33 -11
  56. data/config/locales/fi.yml +33 -11
  57. data/config/locales/fr.yml +33 -11
  58. data/config/locales/gl.yml +33 -11
  59. data/config/locales/it.yml +33 -11
  60. data/config/locales/nl.yml +33 -11
  61. data/config/locales/pl.yml +41 -11
  62. data/config/locales/pt-BR.yml +33 -11
  63. data/config/locales/pt.yml +33 -11
  64. data/config/locales/ru.yml +1 -3
  65. data/config/locales/sv.yml +33 -11
  66. data/config/locales/uk.yml +41 -11
  67. data/lib/decidim/consultations/admin_engine.rb +1 -11
  68. data/lib/decidim/consultations/engine.rb +6 -11
  69. data/lib/decidim/consultations/participatory_space.rb +64 -105
  70. data/lib/decidim/consultations/version.rb +1 -1
  71. metadata +20 -19
  72. data/app/assets/config/decidim_consultations_manifest.scss +0 -3
  73. data/app/models/decidim/consultations/abilities/admin/consultation_admin_ability.rb +0 -34
  74. data/app/models/decidim/consultations/abilities/admin/question_admin_ability.rb +0 -30
  75. data/app/models/decidim/consultations/abilities/admin/response_admin_ability.rb +0 -26
  76. data/app/models/decidim/consultations/abilities/current_user_ability.rb +0 -45
  77. data/app/models/decidim/consultations/abilities/everyone_ability.rb +0 -23
  78. data/app/views/decidim/consultations/consultations/finished.html.erb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bad111d183bccf422a02c44878021f13c1b0d06dd3f3233b7bd4e8d25b24b86e
4
- data.tar.gz: 2c4096ea70122f163d3e5f483495cb411e4963078a5d83093f49bd05db281773
3
+ metadata.gz: 3687d66f875124321caae8e824709f4dc8e1b47e2b71751f594030b9eac70cb1
4
+ data.tar.gz: 5c5e9fc8a1eff2165b2052f6b77975e0ed4d7759035459a1debe70345ed51a78
5
5
  SHA512:
6
- metadata.gz: bf2d6b42f9f811079d20bd53dd89da6c73242f904efcdb23862370fd7e6e21abf6d3c2acf795d931bbe41576c907f1e220f82379476304c3eab0199997db43e5
7
- data.tar.gz: 45850fce78c8fff1feb3f528f1c6f481e252e645288d6c404e115465ebea6bf9748770afcd94cb8027fe2113f55e446ef4fa90e6132338f1589575ebd685d9e7
6
+ metadata.gz: a23c8a387de98f21298702fd69b07a72c25b373669f93dea76709db4a8eae9e6d0abc40e9abc967da54a2ed2ed9098373e27ce2a4cee9fad8e6759d43cf5f4de
7
+ data.tar.gz: b76ca509bc411841972fdb39f80e58ac54cd32b742c341398b63c998ec25aec609dc918a1c6fa3841dc8d20faeaab74de78570bd943f9139ce5e81499b4b1ef1
@@ -0,0 +1,4 @@
1
+ /*
2
+ *= link decidim/consultations/social_share.css.scss
3
+ *= link decidim/consultations/highlighted-content-banner.css.scss
4
+ */
@@ -1,4 +1,3 @@
1
- @import "decidim/_decidim";
2
1
  @import "question";
3
2
  @import "video_wrapper";
4
3
  @import "stats";
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Consultations
5
+ # This cell renders the card for an instance of a Question
6
+ # the default size is the Medium Card (:m)
7
+ class ConsultationCell < Decidim::ViewModel
8
+ def show
9
+ cell card_size, model
10
+ end
11
+
12
+ private
13
+
14
+ def card_size
15
+ "decidim/consultations/consultation_m"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ <div class="card__icondata">
2
+ <ul class="card-data">
3
+ <li class="card-data__item">
4
+ <%= icon "datetime", class: "icon--big" %>
5
+ </li>
6
+ <li class="card-data__item">
7
+ <div class="card-data__item--centerblock">
8
+ <strong><%= t("activemodel.attributes.consultation.start_voting_date") %></strong>
9
+ <br />
10
+ <%= start_date ? l(start_date, format: :decidim_short) : t("decidim.consultations.show.unspecified") %>
11
+ </div>
12
+ </li>
13
+ <li class="card-data__item">
14
+ <div class="card-data__item--centerblock">
15
+ <strong><%= t("activemodel.attributes.consultation.end_voting_date") %></strong>
16
+ <br />
17
+ <%= end_date ? l(end_date, format: :decidim_short) : t("decidim.consultations.show.unspecified") %>
18
+ </div>
19
+ </li>
20
+ </ul>
21
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="card__footer card__footer--spaces">
2
+ <div class="card__support">
3
+ <%= link_to t(footer_button_text, scope: "decidim.consultations.show.footer_button_text"), resource_path, class: "card__button button--sc light button small secondary" %>
4
+ </div>
5
+ </div>
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Consultations
5
+ # This cell renders the Medium (:m) question card
6
+ # for an given instance of a Question
7
+ class ConsultationMCell < Decidim::CardMCell
8
+ private
9
+
10
+ def has_state?
11
+ true
12
+ end
13
+
14
+ def state_classes
15
+ state_data[:state_classes]
16
+ end
17
+
18
+ # Even though we need to render the badge, we can't do it in the normal
19
+ # way, because the paragraph comes from a user input and contains HTML.
20
+ # This causes the badge and the paragraph to appear in different lines.
21
+ # In order to fix it, check the `description` method.
22
+ def has_badge?
23
+ false
24
+ end
25
+
26
+ def badge_name
27
+ text = state_data[:badge_name]
28
+ return unless text
29
+
30
+ I18n.t(text, scope: "decidim.consultations.show.badge_name")
31
+ end
32
+
33
+ # In order to render the badge inline with the paragraph text we need to
34
+ # find the opening `<p>` tag and include the badge right after it. This
35
+ # makes the layout look good.
36
+ def description
37
+ text = super
38
+ text.gsub!(/^<p>/, "<p>#{render :badge}")
39
+ html_truncate(text, length: 100)
40
+ end
41
+
42
+ def resource_path
43
+ Decidim::Consultations::Engine.routes.url_helpers.consultation_path(model)
44
+ end
45
+
46
+ def resource_image_path
47
+ model.banner_image.url
48
+ end
49
+
50
+ def has_image?
51
+ true
52
+ end
53
+
54
+ def start_date
55
+ model.start_voting_date
56
+ end
57
+
58
+ def end_date
59
+ model.end_voting_date
60
+ end
61
+
62
+ def statuses
63
+ super << :questions_count
64
+ end
65
+
66
+ def questions_count_status
67
+ content_tag(
68
+ :strong,
69
+ t("activemodel.attributes.consultation.questions")
70
+ ) + " " + model.questions.count.to_s
71
+ end
72
+
73
+ def footer_button_text
74
+ state_data[:button_text]
75
+ end
76
+
77
+ # Internal: Calculates and caches the data related to the state of the
78
+ # current consultation.
79
+ def state_data
80
+ @state_data ||= if model.active?
81
+ { state: :active, badge_name: "open_votes", state_classes: ["success"], button_text: "vote" }
82
+ elsif model.upcoming?
83
+ { state: :upcoming, badge_name: "open", state_classes: ["warning"], button_text: "debate" }
84
+ elsif model.finished?
85
+ { state: :finished, badge_name: "finished", state_classes: ["muted"], button_text: "view" }
86
+ elsif model.published_results?
87
+ { state: :published_results, badge_name: "published_results", state_classes: ["muted"], button_text: "view_results" }
88
+ else
89
+ { state: :undefined, badge_name: nil, state_classes: ["muted"], button_text: "view" }
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -55,7 +55,8 @@ module Decidim
55
55
  introductory_video_url: form.introductory_video_url,
56
56
  start_voting_date: form.start_voting_date,
57
57
  end_voting_date: form.end_voting_date,
58
- introductory_image: form.introductory_image
58
+ introductory_image: form.introductory_image,
59
+ remove_introductory_image: form.remove_introductory_image
59
60
  }
60
61
  end
61
62
  end
@@ -16,8 +16,8 @@ module Decidim
16
16
  # action_name - The action to authorize against.
17
17
  #
18
18
  # Returns an AuthorizationStatus
19
- def action_authorization(action_name)
20
- return AuthorizationStatus.new(:ok) if can?(action_name.to_sym, Question)
19
+ def action_authorization(action_name, question = current_question)
20
+ return AuthorizationStatus.new(:ok) if allowed_to?(action_name.to_sym, :question, question: question)
21
21
 
22
22
  AuthorizationStatus.new(:denied)
23
23
  end
@@ -17,6 +17,13 @@ module Decidim
17
17
  layout "decidim/admin/consultation"
18
18
 
19
19
  alias_method :current_participatory_space, :current_consultation
20
+
21
+ def permission_class_chain
22
+ [
23
+ Decidim::Consultations::Permissions,
24
+ Decidim::Admin::Permissions
25
+ ]
26
+ end
20
27
  end
21
28
  end
22
29
  end
@@ -21,6 +21,13 @@ module Decidim
21
21
  return current_consultation if params.has_key? :consultation_slug
22
22
  current_question
23
23
  end
24
+
25
+ def permission_class_chain
26
+ [
27
+ Decidim::Consultations::Permissions,
28
+ Decidim::Admin::Permissions
29
+ ]
30
+ end
24
31
  end
25
32
  end
26
33
  end
@@ -36,10 +36,6 @@ module Decidim
36
36
 
37
37
  private
38
38
 
39
- def ability_context
40
- super.merge(current_consultation: current_consultation)
41
- end
42
-
43
39
  def detect_consultation
44
40
  request.env["current_consultation"] ||
45
41
  organization_consultations.find_by(slug: params[:consultation_slug] || params[:slug])
@@ -49,13 +49,6 @@ module Decidim
49
49
 
50
50
  private
51
51
 
52
- def ability_context
53
- super.merge(
54
- current_question: current_question,
55
- current_consultation: current_consultation
56
- )
57
- end
58
-
59
52
  def detect_question
60
53
  request.env["current_question"] ||
61
54
  OrganizationQuestions.for(current_organization).find_by(slug: params[:question_slug] || params[:slug])
@@ -8,6 +8,21 @@ module Decidim
8
8
  layout "decidim/admin/consultations"
9
9
 
10
10
  helper Decidim::SanitizeHelper
11
+
12
+ include NeedsPermission
13
+
14
+ private
15
+
16
+ def permission_class_chain
17
+ [
18
+ Decidim::Consultations::Permissions,
19
+ Decidim::Admin::Permissions
20
+ ]
21
+ end
22
+
23
+ def permission_scope
24
+ :admin
25
+ end
11
26
  end
12
27
  end
13
28
  end
@@ -4,11 +4,11 @@ module Decidim
4
4
  module Consultations
5
5
  module Admin
6
6
  # Controller that allows managing consultation publications.
7
- class ConsultationPublicationsController < Decidim::Admin::ApplicationController
7
+ class ConsultationPublicationsController < Decidim::Consultations::Admin::ApplicationController
8
8
  include ConsultationAdmin
9
9
 
10
10
  def create
11
- authorize! :publish, current_consultation
11
+ enforce_permission_to :publish, :consultation, consultation: current_consultation
12
12
 
13
13
  PublishConsultation.call(current_consultation) do
14
14
  on(:ok) do
@@ -24,7 +24,7 @@ module Decidim
24
24
  end
25
25
 
26
26
  def destroy
27
- authorize! :publish, current_consultation
27
+ enforce_permission_to :publish, :consultation, consultation: current_consultation
28
28
 
29
29
  UnpublishConsultation.call(current_consultation) do
30
30
  on(:ok) do
@@ -4,11 +4,11 @@ module Decidim
4
4
  module Consultations
5
5
  module Admin
6
6
  # Controller that allows managing consultation result publications.
7
- class ConsultationResultsPublicationsController < Decidim::Admin::ApplicationController
7
+ class ConsultationResultsPublicationsController < Decidim::Consultations::Admin::ApplicationController
8
8
  include ConsultationAdmin
9
9
 
10
10
  def create
11
- authorize! :publish_results, current_consultation
11
+ enforce_permission_to :publish_results, :consultation, consultation: current_consultation
12
12
 
13
13
  PublishConsultationResults.call(current_consultation) do
14
14
  on(:ok) do
@@ -24,7 +24,7 @@ module Decidim
24
24
  end
25
25
 
26
26
  def destroy
27
- authorize! :unpublish_Results, current_consultation
27
+ enforce_permission_to :unpublish_results, :consultation, consultation: current_consultation
28
28
 
29
29
  UnpublishConsultationResults.call(current_consultation) do
30
30
  on(:ok) do
@@ -9,19 +9,19 @@ module Decidim
9
9
 
10
10
  # GET /admin/consultations
11
11
  def index
12
- authorize! :index, Decidim::Consultation
12
+ enforce_permission_to :read, :consultation
13
13
  @consultations = collection
14
14
  end
15
15
 
16
16
  # GET /admin/consultations/new
17
17
  def new
18
- authorize! :new, Consultation
18
+ enforce_permission_to :create, :consultation
19
19
  @form = consultation_form.instance
20
20
  end
21
21
 
22
22
  # POST /admin/consultations
23
23
  def create
24
- authorize! :create, Consultation
24
+ enforce_permission_to :create, :consultation
25
25
  @form = consultation_form.from_params(params)
26
26
 
27
27
  CreateConsultation.call(@form) do
@@ -39,14 +39,14 @@ module Decidim
39
39
 
40
40
  # GET /admin/consultations/:slug/edit
41
41
  def edit
42
- authorize! :edit, current_consultation
42
+ enforce_permission_to :update, :consultation, consultation: current_consultation
43
43
  @form = consultation_form.from_model(current_consultation)
44
44
  render layout: "decidim/admin/consultation"
45
45
  end
46
46
 
47
47
  # PUT /admin/initiatives/:id
48
48
  def update
49
- authorize! :update, current_consultation
49
+ enforce_permission_to :update, :consultation, consultation: current_consultation
50
50
 
51
51
  @form = consultation_form
52
52
  .from_params(params.except(:slug), consultation_id: current_consultation.id)
@@ -65,7 +65,7 @@ module Decidim
65
65
  end
66
66
 
67
67
  def destroy
68
- authorize! :destroy, current_consultation
68
+ enforce_permission_to :destroy, :consultation, consultation: current_consultation
69
69
  current_consultation.destroy!
70
70
 
71
71
  flash[:notice] = I18n.t("consultations.destroy.success", scope: "decidim.admin")
@@ -87,10 +87,6 @@ module Decidim
87
87
  @collection ||= OrganizationConsultations.new(current_user.organization).query
88
88
  end
89
89
 
90
- def ability_context
91
- super.merge(current_consultation: current_consultation)
92
- end
93
-
94
90
  def consultation_form
95
91
  form(ConsultationForm)
96
92
  end
@@ -4,7 +4,7 @@ module Decidim
4
4
  module Consultations
5
5
  module Admin
6
6
  # Controller that allows managing all the attachments for a question
7
- class QuestionAttachmentsController < Decidim::Admin::ApplicationController
7
+ class QuestionAttachmentsController < Decidim::Consultations::Admin::ApplicationController
8
8
  include QuestionAdmin
9
9
  include Decidim::Admin::Concerns::HasAttachments
10
10
 
@@ -4,11 +4,11 @@ module Decidim
4
4
  module Consultations
5
5
  module Admin
6
6
  # Controller that allows managing question publications.
7
- class QuestionPublicationsController < Decidim::Admin::ApplicationController
7
+ class QuestionPublicationsController < Decidim::Consultations::Admin::ApplicationController
8
8
  include QuestionAdmin
9
9
 
10
10
  def create
11
- authorize! :publish, current_question
11
+ enforce_permission_to :publish, :question, question: current_question
12
12
 
13
13
  PublishQuestion.call(current_question) do
14
14
  on(:ok) do
@@ -24,7 +24,7 @@ module Decidim
24
24
  end
25
25
 
26
26
  def destroy
27
- authorize! :publish, current_question
27
+ enforce_permission_to :publish, :question, question: current_question
28
28
 
29
29
  UnpublishConsultation.call(current_question) do
30
30
  on(:ok) do
@@ -7,19 +7,19 @@ module Decidim
7
7
  include QuestionAdmin
8
8
 
9
9
  def index
10
- authorize! :index, Decidim::Consultations::Question
10
+ enforce_permission_to :read, :question
11
11
  @questions = collection
12
12
  render layout: "decidim/admin/consultation"
13
13
  end
14
14
 
15
15
  def new
16
- authorize! :new, Decidim::Consultations::Question
16
+ enforce_permission_to :create, :question
17
17
  @form = question_form.instance
18
18
  render layout: "decidim/admin/consultation"
19
19
  end
20
20
 
21
21
  def create
22
- authorize! :create, Decidim::Consultations::Question
22
+ enforce_permission_to :create, :question
23
23
  @form = question_form.from_params(params, current_consultation: current_consultation)
24
24
 
25
25
  CreateQuestion.call(@form) do
@@ -36,13 +36,13 @@ module Decidim
36
36
  end
37
37
 
38
38
  def edit
39
- authorize! :edit, current_question
39
+ enforce_permission_to :update, :question, question: current_question
40
40
  @form = question_form.from_model(current_question, current_consultation: current_consultation)
41
41
  render layout: "decidim/admin/question"
42
42
  end
43
43
 
44
44
  def update
45
- authorize! :update, current_question
45
+ enforce_permission_to :update, :question, question: current_question
46
46
 
47
47
  @form = question_form
48
48
  .from_params(params, question_id: current_question.id, current_consultation: current_consultation)
@@ -61,7 +61,7 @@ module Decidim
61
61
  end
62
62
 
63
63
  def destroy
64
- authorize! :destroy, current_question
64
+ enforce_permission_to :destroy, :question, question: current_question
65
65
  current_question.destroy!
66
66
 
67
67
  flash[:notice] = I18n.t("questions.destroy.success", scope: "decidim.admin")
@@ -75,10 +75,6 @@ module Decidim
75
75
  @collection ||= current_consultation&.questions
76
76
  end
77
77
 
78
- def ability_context
79
- super.merge(current_consultation: current_consultation)
80
- end
81
-
82
78
  def question_form
83
79
  form(QuestionForm)
84
80
  end