decidim-participatory_processes 0.9.3 → 0.10.0

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 (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