decidim-consultations 0.11.2 → 0.12.0.pre

Sign up to get free protection for your applications and to get access to all the features.
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