decidim-participatory_processes 0.9.3 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/app/commands/decidim/participatory_processes/admin/activate_participatory_process_step.rb +34 -4
  3. data/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb +25 -0
  4. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_admin.rb +36 -5
  5. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_step.rb +3 -1
  6. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_admin.rb +53 -0
  7. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_step.rb +16 -5
  8. data/app/commands/decidim/participatory_processes/admin/publish_participatory_process.rb +9 -3
  9. data/app/commands/decidim/participatory_processes/admin/unpublish_participatory_process.rb +9 -3
  10. data/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb +7 -1
  11. data/app/commands/decidim/participatory_processes/admin/update_participatory_process_admin.rb +12 -1
  12. data/app/commands/decidim/participatory_processes/admin/update_participatory_process_step.rb +23 -7
  13. data/app/controllers/decidim/participatory_processes/admin/participatory_process_attachment_collections_controller.rb +27 -0
  14. data/app/controllers/decidim/participatory_processes/admin/participatory_process_publications_controller.rb +2 -2
  15. data/app/controllers/decidim/participatory_processes/admin/participatory_process_step_activations_controller.rb +1 -1
  16. data/app/controllers/decidim/participatory_processes/admin/participatory_process_steps_controller.rb +1 -1
  17. data/app/controllers/decidim/participatory_processes/admin/participatory_process_user_roles_controller.rb +6 -4
  18. data/app/controllers/decidim/participatory_processes/application_controller.rb +11 -0
  19. data/app/controllers/decidim/participatory_processes/participatory_process_groups_controller.rb +1 -1
  20. data/app/controllers/decidim/participatory_processes/participatory_process_steps_controller.rb +1 -1
  21. data/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb +4 -3
  22. data/app/helpers/decidim/participatory_processes/application_helper.rb +23 -0
  23. data/app/models/decidim/participatory_process.rb +8 -0
  24. data/app/models/decidim/participatory_process_step.rb +9 -0
  25. data/app/presenters/decidim/participatory_processes/admin_log/participatory_process_presenter.rb +56 -0
  26. data/app/presenters/decidim/participatory_processes/admin_log/participatory_process_user_role_presenter.rb +53 -0
  27. data/app/presenters/decidim/participatory_processes/admin_log/step_presenter.rb +40 -0
  28. data/app/presenters/decidim/participatory_processes/admin_log/value_types/role_presenter.rb +22 -0
  29. data/app/types/decidim/participatory_processes/participatory_process_step_type.rb +25 -0
  30. data/app/types/decidim/participatory_processes/participatory_process_type.rb +15 -0
  31. data/app/views/decidim/participatory_processes/participatory_process_groups/show.html.erb +1 -0
  32. data/app/views/decidim/participatory_processes/participatory_processes/show.html.erb +2 -0
  33. data/app/views/layouts/decidim/admin/participatory_process.html.erb +15 -3
  34. data/config/locales/ca.yml +31 -0
  35. data/config/locales/en.yml +31 -0
  36. data/config/locales/es.yml +32 -1
  37. data/config/locales/eu.yml +31 -0
  38. data/config/locales/fi.yml +31 -0
  39. data/config/locales/fr.yml +47 -16
  40. data/config/locales/gl.yml +31 -0
  41. data/config/locales/it.yml +31 -0
  42. data/config/locales/nl.yml +31 -0
  43. data/config/locales/pl.yml +31 -5
  44. data/config/locales/pt-BR.yml +31 -0
  45. data/config/locales/pt.yml +31 -0
  46. data/config/locales/sv.yml +31 -0
  47. data/config/locales/uk.yml +9 -5
  48. data/db/migrate/20170220110740_remove_steps_short_description.rb +1 -1
  49. data/db/migrate/20171215081244_add_weight_to_attachments.rb +7 -0
  50. data/db/migrate/20171215141722_add_attachment_collection_to_attachments.rb +9 -0
  51. data/db/migrate/20180125102537_add_reference_to_processes.rb +7 -0
  52. data/lib/decidim/participatory_processes.rb +4 -0
  53. data/lib/decidim/participatory_processes/admin_engine.rb +1 -0
  54. data/lib/decidim/participatory_processes/participatory_space.rb +16 -0
  55. data/lib/decidim/participatory_processes/test/factories.rb +6 -0
  56. data/lib/decidim/participatory_processes/version.rb +1 -1
  57. metadata +22 -10
  58. data/app/commands/decidim/participatory_processes/admin/deactivate_participatory_process_step.rb +0 -40
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module Admin
6
+ # Controller that allows managing all the attachment collections for
7
+ # a participatory process.
8
+ #
9
+ class ParticipatoryProcessAttachmentCollectionsController < Decidim::Admin::ApplicationController
10
+ include Decidim::Admin::Concerns::HasAttachmentCollections
11
+ include Concerns::ParticipatoryProcessAdmin
12
+
13
+ def after_destroy_path
14
+ participatory_process_attachment_collections_path(current_participatory_process)
15
+ end
16
+
17
+ def collection_for
18
+ current_participatory_process
19
+ end
20
+
21
+ def authorization_object
22
+ @attachment_collection || AttachmentCollection
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -11,7 +11,7 @@ module Decidim
11
11
  def create
12
12
  authorize! :publish, current_participatory_process
13
13
 
14
- PublishParticipatoryProcess.call(current_participatory_process) do
14
+ PublishParticipatoryProcess.call(current_participatory_process, current_user) do
15
15
  on(:ok) do
16
16
  flash[:notice] = I18n.t("participatory_process_publications.create.success", scope: "decidim.admin")
17
17
  end
@@ -27,7 +27,7 @@ module Decidim
27
27
  def destroy
28
28
  authorize! :publish, current_participatory_process
29
29
 
30
- UnpublishParticipatoryProcess.call(current_participatory_process) do
30
+ UnpublishParticipatoryProcess.call(current_participatory_process, current_user) do
31
31
  on(:ok) do
32
32
  flash[:notice] = I18n.t("participatory_process_publications.destroy.success", scope: "decidim.admin")
33
33
  end
@@ -11,7 +11,7 @@ module Decidim
11
11
  def create
12
12
  authorize! :activate, process_step
13
13
 
14
- ActivateParticipatoryProcessStep.call(process_step) do
14
+ ActivateParticipatoryProcessStep.call(process_step, current_user) do
15
15
  on(:ok) do
16
16
  flash[:notice] = I18n.t("participatory_process_step_activations.create.success", scope: "decidim.admin")
17
17
  end
@@ -67,7 +67,7 @@ module Decidim
67
67
  @participatory_process_step = collection.find(params[:id])
68
68
  authorize! :destroy, @participatory_process_step
69
69
 
70
- DestroyParticipatoryProcessStep.call(@participatory_process_step) do
70
+ DestroyParticipatoryProcessStep.call(@participatory_process_step, current_user) do
71
71
  on(:ok) do
72
72
  flash[:notice] = I18n.t("participatory_process_steps.destroy.success", scope: "decidim.admin")
73
73
  redirect_to participatory_process_steps_path(current_participatory_process)
@@ -61,11 +61,13 @@ module Decidim
61
61
  def destroy
62
62
  @participatory_process_user_role = collection.find(params[:id])
63
63
  authorize! :destroy, @participatory_process_user_role
64
- @participatory_process_user_role.destroy!
65
64
 
66
- flash[:notice] = I18n.t("participatory_process_user_roles.destroy.success", scope: "decidim.admin")
67
-
68
- redirect_to participatory_process_user_roles_path(@participatory_process_user_role.participatory_process)
65
+ DestroyParticipatoryProcessAdmin.call(@participatory_process_user_role, current_user) do
66
+ on(:ok) do
67
+ flash[:notice] = I18n.t("participatory_process_user_roles.destroy.success", scope: "decidim.admin")
68
+ redirect_to participatory_process_user_roles_path(current_participatory_process)
69
+ end
70
+ end
69
71
  end
70
72
 
71
73
  def resend_invitation
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ # This controller is the abstract class from which all other controllers of
6
+ # this engine inherit.
7
+ class ApplicationController < Decidim::ApplicationController
8
+ helper Decidim::ParticipatoryProcesses::ApplicationHelper
9
+ end
10
+ end
11
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  module ParticipatoryProcesses
5
- class ParticipatoryProcessGroupsController < Decidim::ApplicationController
5
+ class ParticipatoryProcessGroupsController < Decidim::ParticipatoryProcesses::ApplicationController
6
6
  helper Decidim::SanitizeHelper
7
7
  helper_method :participatory_processes, :group, :collection
8
8
 
@@ -4,7 +4,7 @@ module Decidim
4
4
  module ParticipatoryProcesses
5
5
  # A controller that holds the logic to show ParticipatoryProcessSteps in a
6
6
  # public layout.
7
- class ParticipatoryProcessStepsController < Decidim::ApplicationController
7
+ class ParticipatoryProcessStepsController < Decidim::ParticipatoryProcesses::ApplicationController
8
8
  include ParticipatorySpaceContext
9
9
  participatory_space_layout only: :index
10
10
 
@@ -4,7 +4,7 @@ module Decidim
4
4
  module ParticipatoryProcesses
5
5
  # A controller that holds the logic to show ParticipatoryProcesses in a
6
6
  # public layout.
7
- class ParticipatoryProcessesController < Decidim::ApplicationController
7
+ class ParticipatoryProcessesController < Decidim::ParticipatoryProcesses::ApplicationController
8
8
  include ParticipatorySpaceContext
9
9
  participatory_space_layout only: :show
10
10
 
@@ -12,6 +12,7 @@ module Decidim
12
12
  helper Decidim::IconHelper
13
13
  helper Decidim::WidgetUrlsHelper
14
14
  helper Decidim::SanitizeHelper
15
+ helper Decidim::ResourceReferenceHelper
15
16
 
16
17
  helper ParticipatoryProcessHelper
17
18
 
@@ -57,11 +58,11 @@ module Decidim
57
58
  end
58
59
 
59
60
  def promoted_participatory_processes
60
- @promoted_processes ||= filtered_participatory_processes | PromotedParticipatoryProcesses.new
61
+ @promoted_participatory_processes ||= filtered_participatory_processes | PromotedParticipatoryProcesses.new
61
62
  end
62
63
 
63
64
  def participatory_process_groups
64
- @process_groups ||= OrganizationPrioritizedParticipatoryProcessGroups.new(current_organization, filter)
65
+ @participatory_process_groups ||= OrganizationPrioritizedParticipatoryProcessGroups.new(current_organization, filter)
65
66
  end
66
67
 
67
68
  def stats
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ # Custom helpers, scoped to the participatory processes engine.
6
+ #
7
+ module ApplicationHelper
8
+ include Decidim::ResourceHelper
9
+
10
+ # Public: Renders all hooks registered as `hook_name`.
11
+ #
12
+ # Note: We're passing a deep copy of the view context to allow
13
+ # us to extend it without polluting the original view context
14
+ #
15
+ # @param hook_name [Symbol] representing the name of the hook.
16
+ #
17
+ # @return [String] an HTML safe String
18
+ def render_participatory_processes_hook(hook_name)
19
+ Decidim::ParticipatoryProcesses.view_hooks.render(hook_name, deep_dup)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -8,10 +8,14 @@ module Decidim
8
8
  # active.
9
9
  class ParticipatoryProcess < ApplicationRecord
10
10
  include Decidim::HasAttachments
11
+ include Decidim::HasAttachmentCollections
11
12
  include Decidim::Participable
12
13
  include Decidim::Publicable
13
14
  include Decidim::Scopable
14
15
  include Decidim::Followable
16
+ include Decidim::HasReference
17
+ include Decidim::Traceable
18
+ include Decidim::Loggable
15
19
 
16
20
  belongs_to :organization,
17
21
  foreign_key: "decidim_organization_id",
@@ -60,6 +64,10 @@ module Decidim
60
64
  where(promoted: true)
61
65
  end
62
66
 
67
+ def self.log_presenter_class_for(_log)
68
+ Decidim::ParticipatoryProcesses::AdminLog::ParticipatoryProcessPresenter
69
+ end
70
+
63
71
  def hashtag
64
72
  attributes["hashtag"].to_s.delete("#")
65
73
  end
@@ -5,9 +5,14 @@ module Decidim
5
5
  # features that will show up in the depending on what step is currently
6
6
  # active.
7
7
  class ParticipatoryProcessStep < ApplicationRecord
8
+ include Traceable
9
+ include Loggable
10
+
8
11
  belongs_to :participatory_process, foreign_key: "decidim_participatory_process_id", class_name: "Decidim::ParticipatoryProcess"
9
12
  has_one :organization, through: :participatory_process
10
13
 
14
+ alias participatory_space participatory_process
15
+
11
16
  validates :start_date, date: { before: :end_date, allow_blank: true, if: proc { |obj| obj.end_date.present? } }
12
17
  validates :end_date, date: { after: :start_date, allow_blank: true, if: proc { |obj| obj.start_date.present? } }
13
18
 
@@ -18,6 +23,10 @@ module Decidim
18
23
 
19
24
  before_create :set_position
20
25
 
26
+ def self.log_presenter_class_for(_log)
27
+ Decidim::ParticipatoryProcesses::AdminLog::StepPresenter
28
+ end
29
+
21
30
  private
22
31
 
23
32
  # Internal: Sets the position of the step if it is `nil`. That means that
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module AdminLog
6
+ # This class holds the logic to present a `Decidim::ParticipatoryProcess`
7
+ # for the `AdminLog` log.
8
+ #
9
+ # Usage should be automatic and you shouldn't need to call this class
10
+ # directly, but here's an example:
11
+ #
12
+ # action_log = Decidim::ActionLog.last
13
+ # view_helpers # => this comes from the views
14
+ # ParticipatoryProcessPresenter.new(action_log, view_helpers).present
15
+ class ParticipatoryProcessPresenter < Decidim::Log::BasePresenter
16
+ private
17
+
18
+ def diff_fields_mapping
19
+ {
20
+ description: :i18n,
21
+ developer_group: :i18n,
22
+ hashtag: :string,
23
+ local_area: :i18n,
24
+ meta_scope: :i18n,
25
+ participatory_scope: :i18n,
26
+ participatory_structure: :i18n,
27
+ published_at: :date,
28
+ scopes_enabled: :boolean,
29
+ short_description: :i18n,
30
+ slug: :string,
31
+ subtitle: :i18n,
32
+ target: :i18n,
33
+ title: :i18n
34
+ }
35
+ end
36
+
37
+ def action_string
38
+ case action
39
+ when "create", "publish", "unpublish", "update"
40
+ "decidim.admin_log.participatory_process.#{action}"
41
+ else
42
+ super
43
+ end
44
+ end
45
+
46
+ def i18n_labels_scope
47
+ "activemodel.attributes.participatory_process"
48
+ end
49
+
50
+ def has_diff?
51
+ action == "unpublish" || super
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module AdminLog
6
+ # This class holds the logic to present a `Decidim::ParticipatoryProcessUserRole`
7
+ # for the `AdminLog` log.
8
+ #
9
+ # Usage should be automatic and you shouldn't need to call this class
10
+ # directly, but here's an example:
11
+ #
12
+ # action_log = Decidim::ActionLog.last
13
+ # view_helpers # => this comes from the views
14
+ # ParticipatoryProcessUserRolePresenter.new(action_log, view_helpers).present
15
+ class ParticipatoryProcessUserRolePresenter < Decidim::Log::BasePresenter
16
+ private
17
+
18
+ def diff_fields_mapping
19
+ {
20
+ role: "Decidim::ParticipatoryProcesses::AdminLog::ValueTypes::RolePresenter"
21
+ }
22
+ end
23
+
24
+ def changeset
25
+ return super unless action.to_s == "delete"
26
+
27
+ Decidim::Log::DiffChangesetCalculator.new(
28
+ { role: [action_log.version.object["role"], ""] },
29
+ diff_fields_mapping,
30
+ i18n_labels_scope
31
+ ).changeset
32
+ end
33
+
34
+ def has_diff?
35
+ action == "delete" || super
36
+ end
37
+
38
+ def action_string
39
+ case action
40
+ when "create", "update", "delete"
41
+ "decidim.admin_log.participatory_process_user_role.#{action}"
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ def i18n_labels_scope
48
+ "activemodel.attributes.participatory_process_user_role"
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module AdminLog
6
+ # This class holds the logic to present a `Decidim::Step`
7
+ # for the `AdminLog` log.
8
+ #
9
+ # Usage should be automatic and you shouldn't need to call this class
10
+ # directly, but here's an example:
11
+ #
12
+ # action_log = Decidim::ActionLog.last
13
+ # view_helpers # => this comes from the views
14
+ # StepPresenter.new(action_log, view_helpers).present
15
+ class StepPresenter < Decidim::Log::BasePresenter
16
+ private
17
+
18
+ def diff_fields_mapping
19
+ {
20
+ description: :i18n,
21
+ title: :i18n
22
+ }
23
+ end
24
+
25
+ def action_string
26
+ case action
27
+ when "activate", "create", "delete", "update"
28
+ "decidim.admin_log.participatory_process_step.#{action}"
29
+ else
30
+ super
31
+ end
32
+ end
33
+
34
+ def i18n_labels_scope
35
+ "activemodel.attributes.participatory_process_step"
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module AdminLog
6
+ module ValueTypes
7
+ # This class presents the given value as a user role. Check
8
+ # the `DefaultPresenter` for more info on how value
9
+ # presenters work.
10
+ class RolePresenter < Decidim::Log::ValueTypes::DefaultPresenter
11
+ # Public: Presents the value as a user role.
12
+ #
13
+ # Returns an HTML-safe String.
14
+ def present
15
+ return if value.blank?
16
+ h.t(value, scope: "decidim.admin.models.participatory_process_user_role.roles", default: value)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ # This type represents a step on a participatory process.
6
+ ParticipatoryProcessStepType = GraphQL::ObjectType.define do
7
+ name "ParticipatoryProcessStep"
8
+ description "A participatory process step"
9
+
10
+ field :id, !types.ID, "The unique ID of this step."
11
+
12
+ field :participatoryProcess do
13
+ type !ParticipatoryProcessType
14
+ description "The participatory process in which this step belongs to."
15
+ property :participatory_process
16
+ end
17
+
18
+ field :title, !Decidim::Core::TranslatedFieldType, "The title of this step"
19
+
20
+ field :startDate, Decidim::Core::DateType, "This step's start date.", property: :start_date
21
+
22
+ field :endDate, Decidim::Core::DateType, "This step's end date.", property: :end_date
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ # This type represents a ParticipatoryProcess.
6
+ ParticipatoryProcessType = GraphQL::ObjectType.define do
7
+ interfaces [Decidim::Core::ParticipatorySpaceInterface]
8
+
9
+ name "ParticipatoryProcess"
10
+ description "A participatory process"
11
+
12
+ field :steps, !types[ParticipatoryProcessStepType], "All the steps of this process."
13
+ end
14
+ end
15
+ end