decidim-admin 0.0.2 → 0.0.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.

Potentially problematic release.


This version of decidim-admin might be problematic. Click here for more details.

Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/decidim/admin/application.js.es6 +3 -2
  3. data/app/assets/javascripts/decidim/admin/tab_focus.js.es6 +1 -1
  4. data/app/assets/stylesheets/decidim/admin/_foundation_and_overrides.scss +1 -1
  5. data/app/commands/decidim/admin/{create_participatory_process_attachment.rb → create_attachment.rb} +6 -7
  6. data/app/commands/decidim/admin/create_participatory_process.rb +12 -3
  7. data/app/commands/decidim/admin/{update_participatory_process_attachment.rb → update_attachment.rb} +7 -6
  8. data/app/commands/decidim/admin/update_feature.rb +2 -1
  9. data/app/commands/decidim/admin/update_organization.rb +1 -0
  10. data/app/commands/decidim/admin/update_participatory_process.rb +16 -4
  11. data/app/constraints/decidim/admin/organization_dashboard_constraint.rb +1 -1
  12. data/app/controllers/decidim/admin/application_controller.rb +2 -2
  13. data/app/controllers/decidim/admin/concerns/has_attachments.rb +116 -0
  14. data/app/controllers/decidim/admin/participatory_process_attachments_controller.rb +5 -67
  15. data/app/controllers/decidim/admin/users_controller.rb +5 -5
  16. data/app/forms/decidim/admin/{participatory_process_attachment_form.rb → attachment_form.rb} +2 -2
  17. data/app/forms/decidim/admin/feature_form.rb +1 -0
  18. data/app/forms/decidim/admin/organization_form.rb +1 -0
  19. data/app/forms/decidim/admin/participatory_process_form.rb +8 -1
  20. data/app/helpers/decidim/admin/application_helper.rb +1 -0
  21. data/app/helpers/decidim/admin/feature_settings_helper.rb +29 -0
  22. data/app/models/decidim/admin/abilities/admin_user.rb +4 -4
  23. data/app/models/decidim/admin/abilities/base.rb +3 -3
  24. data/app/models/decidim/admin/abilities/participatory_process_admin.rb +15 -7
  25. data/app/views/decidim/admin/{participatory_process_attachments → attachments}/_form.html.erb +0 -0
  26. data/app/views/decidim/admin/attachments/edit.html.erb +9 -0
  27. data/app/views/decidim/admin/attachments/index.html.erb +37 -0
  28. data/app/views/decidim/admin/attachments/new.html.erb +9 -0
  29. data/app/views/decidim/admin/attachments/show.html.erb +25 -0
  30. data/app/views/decidim/admin/features/_form.html.erb +1 -0
  31. data/app/views/decidim/admin/features/_settings_fields.html.erb +6 -3
  32. data/app/views/decidim/admin/organization/_form.html.erb +4 -0
  33. data/app/views/decidim/admin/participatory_processes/_form.html.erb +16 -0
  34. data/app/views/decidim/admin/participatory_processes/show.html.erb +11 -1
  35. data/app/views/layouts/decidim/admin/_header.html.erb +2 -2
  36. data/app/views/layouts/decidim/admin/_sidebar.html.erb +1 -1
  37. data/app/views/layouts/decidim/admin/participatory_process.html.erb +2 -2
  38. data/config/locales/ca.yml +29 -27
  39. data/config/locales/en.yml +29 -27
  40. data/config/locales/es.yml +29 -27
  41. data/config/routes.rb +1 -1
  42. data/db/migrate/20170128112958_change_user_groups_verified_to_timestamp.rb +9 -0
  43. data/lib/decidim/admin/engine.rb +2 -2
  44. data/lib/decidim/admin/test/manage_attachments_examples.rb +103 -0
  45. metadata +18 -35
  46. data/app/helpers/decidim/admin/aria_selected_link_to_helper.rb +0 -28
  47. data/app/views/decidim/admin/participatory_process_attachments/edit.html.erb +0 -9
  48. data/app/views/decidim/admin/participatory_process_attachments/index.html.erb +0 -37
  49. data/app/views/decidim/admin/participatory_process_attachments/new.html.erb +0 -9
  50. data/app/views/decidim/admin/participatory_process_attachments/show.html.erb +0 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 43ab0a410b437196f1663001c22cf03810aed689
4
- data.tar.gz: 9b110d4bc37e0483b6e6c9756448701115261fb8
3
+ metadata.gz: a558feb308b27b688f8588f74871422a59d3efbc
4
+ data.tar.gz: 3300ce4311639a5a14bf6e8fd1c94e1776a5148e
5
5
  SHA512:
6
- metadata.gz: 9abf94828b7d759eb50dbb978b7d53c6262c7f37dd78f18d4ad64cca1513c5ca8433d3acd6a75bb8839b49a945e3f88b363522e7a7e91e322d570299240f71f1
7
- data.tar.gz: f45d28ff90b26b40234b2a4371d90e30ae7c900171a8278fc08d30e595996458d45fb45f680313b84ac2c05a3eadd4c5d7d67e8630ace71ee5828aa0cefe6b6c
6
+ metadata.gz: 70b3749d2b3fbbaeaa6318b93613d6661f65bd9187b4d1bccab8b872747ff7d0d7ef3c96ea0c5183038671a1d953655773b451e24d531eb1ba9f99cd23b369bf
7
+ data.tar.gz: 17f6d2bf2e8966b973a877f83644b8e42e7991782ef242a734a93391c4fda67c1f9f9ae7b56643c9af222742385dbc5bc3b031631962840e7af93cbc8e2f0883
@@ -3,7 +3,6 @@
3
3
  // = require jquery
4
4
  // = require jquery_ujs
5
5
  // = require foundation
6
- // = require turbolinks
7
6
  // = require html.sortable
8
7
  // = require ./sort_steps
9
8
  // = require ./tab_focus
@@ -15,4 +14,6 @@ const pageLoad = () => {
15
14
  sortSteps();
16
15
  };
17
16
 
18
- $(document).on('turbolinks:load', pageLoad);
17
+ $(() => {
18
+ pageLoad();
19
+ });
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * When switching tabs in i18n fields, autofocus on the input to save clicks #212
5
5
  */
6
- $(document).on('turbolinks:load', () => {
6
+ $(() => {
7
7
  // Event launched by foundation
8
8
  $('[data-tabs]').on('change.zf.tabs', (event) => {
9
9
  const $container = $(event.target).next('.tabs-content .tabs-panel.is-active');
@@ -27,7 +27,7 @@
27
27
  @include foundation-drilldown-menu;
28
28
  @include foundation-dropdown;
29
29
  @include foundation-dropdown-menu;
30
- @include foundation-flex-video;
30
+ @include foundation-responsive-embed;
31
31
  @include foundation-label;
32
32
  @include foundation-media-object;
33
33
  @include foundation-menu;
@@ -3,15 +3,14 @@ module Decidim
3
3
  module Admin
4
4
  # A command with all the business logic to add an attachment to a
5
5
  # participatory process.
6
- class CreateParticipatoryProcessAttachment < Rectify::Command
6
+ class CreateAttachment < Rectify::Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # form - A form object with the params.
10
- # participatory_process - The ParticipatoryProcess that will hold the
11
- # attachment
12
- def initialize(form, participatory_process)
10
+ # attached_to - The ActiveRecord::Base that will hold the attachment
11
+ def initialize(form, attached_to)
13
12
  @form = form
14
- @participatory_process = participatory_process
13
+ @attached_to = attached_to
15
14
  end
16
15
 
17
16
  # Executes the command. Broadcasts these events:
@@ -32,11 +31,11 @@ module Decidim
32
31
  attr_reader :form
33
32
 
34
33
  def create_attachment
35
- ParticipatoryProcessAttachment.create!(
34
+ Attachment.create!(
36
35
  title: form.title,
37
36
  description: form.description,
38
37
  file: form.file,
39
- participatory_process: @participatory_process
38
+ attached_to: @attached_to
40
39
  )
41
40
  end
42
41
  end
@@ -19,9 +19,15 @@ module Decidim
19
19
  # Returns nothing.
20
20
  def call
21
21
  return broadcast(:invalid) if form.invalid?
22
-
23
22
  process = create_participatory_process
24
- broadcast(:ok, process)
23
+
24
+ if process.persisted?
25
+ broadcast(:ok, process)
26
+ else
27
+ form.errors.add(:hero_image, process.errors[:hero_image]) if process.errors.include? :hero_image
28
+ form.errors.add(:banner_image, process.errors[:banner_image]) if process.errors.include? :banner_image
29
+ broadcast(:invalid)
30
+ end
25
31
  end
26
32
 
27
33
  private
@@ -30,7 +36,7 @@ module Decidim
30
36
 
31
37
  def create_participatory_process
32
38
  transaction do
33
- process = ParticipatoryProcess.create!(
39
+ process = ParticipatoryProcess.new(
34
40
  title: form.title,
35
41
  subtitle: form.subtitle,
36
42
  slug: form.slug,
@@ -43,6 +49,9 @@ module Decidim
43
49
  organization: form.current_organization
44
50
  )
45
51
 
52
+ return process unless process.valid?
53
+ process.save!
54
+
46
55
  process.steps.create!(
47
56
  title: TranslationsHelper.multi_translation(
48
57
  "decidim.admin.participatory_process_steps.default_title",
@@ -3,14 +3,15 @@ module Decidim
3
3
  module Admin
4
4
  # A command with all the business logic to update an attachment from a
5
5
  # participatory process.
6
- class UpdateParticipatoryProcessAttachment < Rectify::Command
7
- attr_reader :participatory_process_attachment
6
+ class UpdateAttachment < Rectify::Command
7
+ attr_reader :attachment
8
+
8
9
  # Public: Initializes the command.
9
10
  #
10
- # participatory_process_attachment - the ParticipatoryProcessAttachment to update
11
+ # attachment - the Attachment to update
11
12
  # form - A form object with the params.
12
- def initialize(participatory_process_attachment, form)
13
- @participatory_process_attachment = participatory_process_attachment
13
+ def initialize(attachment, form)
14
+ @attachment = attachment
14
15
  @form = form
15
16
  end
16
17
 
@@ -32,7 +33,7 @@ module Decidim
32
33
  attr_reader :form
33
34
 
34
35
  def update_attachment
35
- participatory_process_attachment.update_attributes!(attributes)
36
+ attachment.update_attributes!(attributes)
36
37
  end
37
38
 
38
39
  def attributes
@@ -35,7 +35,8 @@ module Decidim
35
35
  @feature.update_attributes(
36
36
  name: form.name,
37
37
  settings: form.settings,
38
- step_settings: form.step_settings
38
+ step_settings: form.step_settings,
39
+ weight: form.weight
39
40
  )
40
41
  end
41
42
 
@@ -42,6 +42,7 @@ module Decidim
42
42
  welcome_text: form.welcome_text,
43
43
  homepage_image: form.homepage_image || organization.homepage_image,
44
44
  logo: form.logo || organization.logo,
45
+ favicon: form.favicon || organization.favicon,
45
46
  default_locale: form.default_locale,
46
47
  show_statistics: form.show_statistics
47
48
  }
@@ -21,17 +21,25 @@ module Decidim
21
21
  # Returns nothing.
22
22
  def call
23
23
  return broadcast(:invalid) if form.invalid?
24
-
25
24
  update_participatory_process
26
- broadcast(:ok)
25
+
26
+ if @participatory_process.valid?
27
+ broadcast(:ok, @participatory_process)
28
+ else
29
+ form.errors.add(:hero_image, @participatory_process.errors[:hero_image]) if @participatory_process.errors.include? :hero_image
30
+ form.errors.add(:banner_image, @participatory_process.errors[:banner_image]) if @participatory_process.errors.include? :banner_image
31
+ broadcast(:invalid)
32
+ end
27
33
  end
28
34
 
35
+
29
36
  private
30
37
 
31
38
  attr_reader :form
32
39
 
33
40
  def update_participatory_process
34
- @participatory_process.update_attributes!(attributes)
41
+ @participatory_process.assign_attributes(attributes)
42
+ @participatory_process.save! if @participatory_process.valid?
35
43
  end
36
44
 
37
45
  def attributes
@@ -44,7 +52,11 @@ module Decidim
44
52
  banner_image: form.banner_image,
45
53
  promoted: form.promoted,
46
54
  description: form.description,
47
- short_description: form.short_description
55
+ short_description: form.short_description,
56
+ domain: form.domain,
57
+ scope: form.scope,
58
+ developer_group: form.developer_group,
59
+ end_date: form.end_date
48
60
  }.compact
49
61
  end
50
62
  end
@@ -33,7 +33,7 @@ module Decidim
33
33
  end
34
34
 
35
35
  def ability
36
- Decidim::Admin::Abilities::Base.new(user)
36
+ Decidim::Admin::Abilities::Base.new(user, current_organization: organization)
37
37
  end
38
38
  end
39
39
  end
@@ -16,8 +16,8 @@ module Decidim
16
16
 
17
17
  # Overwrites `cancancan`'s method to point to the correct ability class,
18
18
  # since the gem expects the ability class to be in the root namespace.
19
- def current_ability
20
- @current_ability ||= Decidim::Admin::Abilities::Base.new(current_user)
19
+ def current_ability_klass
20
+ Decidim::Admin::Abilities::Base
21
21
  end
22
22
  end
23
23
  end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Admin
4
+ module Concerns
5
+ # Attachments can be related to any class in Decidim, in order to
6
+ # manage the attachments for a given type, you should create a new
7
+ # controller and include this concern.
8
+ #
9
+ # The only requirement is to define a `attached_to` method that
10
+ # returns an instance of the model to attach the attachment to.
11
+ module HasAttachments
12
+ extend ActiveSupport::Concern
13
+
14
+ included do
15
+ helper_method :attached_to, :authorization_object
16
+
17
+ def index
18
+ authorize! :read, authorization_object
19
+
20
+ render template: "decidim/admin/attachments/index"
21
+ end
22
+
23
+ def new
24
+ authorize! :create, authorization_object
25
+ @form = form(AttachmentForm).instance
26
+ render template: "decidim/admin/attachments/new"
27
+ end
28
+
29
+ def create
30
+ authorize! :create, authorization_object
31
+ @form = form(AttachmentForm).from_params(params)
32
+
33
+ CreateAttachment.call(@form, attached_to) do
34
+ on(:ok) do
35
+ flash[:notice] = I18n.t("attachments.create.success", scope: "decidim.admin")
36
+ redirect_to action: :index
37
+ end
38
+
39
+ on(:invalid) do
40
+ flash.now[:alert] = I18n.t("attachments.create.error", scope: "decidim.admin")
41
+ render template: "decidim/admin/attachments/new"
42
+ end
43
+ end
44
+ end
45
+
46
+ def edit
47
+ @attachment = collection.find(params[:id])
48
+ authorize! :update, authorization_object
49
+ @form = form(AttachmentForm).from_model(@attachment)
50
+ render template: "decidim/admin/attachments/edit"
51
+ end
52
+
53
+ def update
54
+ @attachment = collection.find(params[:id])
55
+ authorize! :update, authorization_object
56
+ @form = form(AttachmentForm).from_params(params)
57
+
58
+ UpdateAttachment.call(@attachment, @form) do
59
+ on(:ok) do
60
+ flash[:notice] = I18n.t("attachments.update.success", scope: "decidim.admin")
61
+ redirect_to action: :index
62
+ end
63
+
64
+ on(:invalid) do
65
+ flash.now[:alert] = I18n.t("attachments.update.error", scope: "decidim.admin")
66
+ render template: "decidim/admin/attachments/edit"
67
+ end
68
+ end
69
+ end
70
+
71
+ def show
72
+ @attachment = collection.find(params[:id])
73
+ authorize! :read, authorization_object
74
+ render template: "decidim/admin/attachments/show"
75
+ end
76
+
77
+ def destroy
78
+ @attachment = collection.find(params[:id])
79
+ authorize! :destroy, authorization_object
80
+ @attachment.destroy!
81
+
82
+ flash[:notice] = I18n.t("attachments.destroy.success", scope: "decidim.admin")
83
+
84
+ redirect_to after_destroy_path
85
+ end
86
+
87
+ # Public: Returns a String or Object that will be passed to `redirect_to` after
88
+ # destroying an attachment. By default it redirects to the attached_to.
89
+ #
90
+ # It can be redefined at controller level if you need to redirect elsewhere.
91
+ def after_destroy_path
92
+ attached_to
93
+ end
94
+
95
+ # Public: The only method to be implemented at the controller. You need to
96
+ # return the object where the attachment will be attached to.
97
+ def attached_to
98
+ raise NotImplementedError
99
+ end
100
+
101
+ # Public: The Class or Object to be used with the authorization layer to
102
+ # verify the user can manage the attachments
103
+ #
104
+ # By default is the same as the attached_to.
105
+ def authorization_object
106
+ attached_to
107
+ end
108
+
109
+ def collection
110
+ @collection ||= attached_to.attachments
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -8,76 +8,14 @@ module Decidim
8
8
  #
9
9
  class ParticipatoryProcessAttachmentsController < ApplicationController
10
10
  include Concerns::ParticipatoryProcessAdmin
11
+ include Concerns::HasAttachments
11
12
 
12
- def index
13
- authorize! :read, ParticipatoryProcessAttachment
13
+ def attached_to
14
+ participatory_process
14
15
  end
15
16
 
16
- def new
17
- authorize! :create, ParticipatoryProcessAttachment
18
- @form = form(ParticipatoryProcessAttachmentForm).instance
19
- end
20
-
21
- def create
22
- authorize! :create, ParticipatoryProcessAttachment
23
- @form = form(ParticipatoryProcessAttachmentForm).from_params(params)
24
-
25
- CreateParticipatoryProcessAttachment.call(@form, participatory_process) do
26
- on(:ok) do
27
- flash[:notice] = I18n.t("participatory_process_attachments.create.success", scope: "decidim.admin")
28
- redirect_to participatory_process_attachments_path(participatory_process)
29
- end
30
-
31
- on(:invalid) do
32
- flash.now[:alert] = I18n.t("participatory_process_attachments.create.error", scope: "decidim.admin")
33
- render :new
34
- end
35
- end
36
- end
37
-
38
- def edit
39
- @participatory_process_attachment = collection.find(params[:id])
40
- authorize! :update, @participatory_process_attachment
41
- @form = form(ParticipatoryProcessAttachmentForm).from_model(@participatory_process_attachment)
42
- end
43
-
44
- def update
45
- @participatory_process_attachment = collection.find(params[:id])
46
- authorize! :update, @participatory_process_attachment
47
- @form = form(ParticipatoryProcessAttachmentForm).from_params(params)
48
-
49
- UpdateParticipatoryProcessAttachment.call(@participatory_process_attachment, @form) do
50
- on(:ok) do
51
- flash[:notice] = I18n.t("participatory_process_attachments.update.success", scope: "decidim.admin")
52
- redirect_to participatory_process_attachments_path(participatory_process)
53
- end
54
-
55
- on(:invalid) do
56
- flash.now[:alert] = I18n.t("participatory_process_attachments.update.error", scope: "decidim.admin")
57
- render :edit
58
- end
59
- end
60
- end
61
-
62
- def show
63
- @participatory_process_attachment = collection.find(params[:id])
64
- authorize! :read, @participatory_process_attachment
65
- end
66
-
67
- def destroy
68
- @participatory_process_attachment = collection.find(params[:id])
69
- authorize! :destroy, @participatory_process_attachment
70
- @participatory_process_attachment.destroy!
71
-
72
- flash[:notice] = I18n.t("participatory_process_attachments.destroy.success", scope: "decidim.admin")
73
-
74
- redirect_to participatory_process_attachments_path(@participatory_process_attachment.participatory_process)
75
- end
76
-
77
- private
78
-
79
- def collection
80
- @collection ||= participatory_process.attachments
17
+ def authorization_object
18
+ @attachment || Attachment
81
19
  end
82
20
  end
83
21
  end
@@ -7,17 +7,17 @@ module Decidim
7
7
  #
8
8
  class UsersController < Admin::ApplicationController
9
9
  def index
10
- authorize! :index, User
10
+ authorize! :index, :admin_users
11
11
  @users = collection
12
12
  end
13
13
 
14
14
  def new
15
- authorize! :new, User
15
+ authorize! :new, :admin_users
16
16
  @form = form(InviteAdminForm).instance
17
17
  end
18
18
 
19
19
  def create
20
- authorize! :new, User
20
+ authorize! :new, :admin_users
21
21
 
22
22
  default_params = {
23
23
  organization: current_organization,
@@ -42,7 +42,7 @@ module Decidim
42
42
  end
43
43
 
44
44
  def resend_invitation
45
- authorize! :invite, user
45
+ authorize! :invite, :admin_users
46
46
 
47
47
  InviteUserAgain.call(user, "invite_admin") do
48
48
  on(:ok) do
@@ -58,7 +58,7 @@ module Decidim
58
58
  end
59
59
 
60
60
  def destroy
61
- authorize! :destroy, user
61
+ authorize! :destroy, :admin_users
62
62
 
63
63
  RemoveUserRole.call(user, "admin") do
64
64
  on(:ok) do
@@ -3,14 +3,14 @@ module Decidim
3
3
  module Admin
4
4
  # A form object used to create attachments in a participatory process.
5
5
  #
6
- class ParticipatoryProcessAttachmentForm < Form
6
+ class AttachmentForm < Form
7
7
  include TranslatableAttributes
8
8
 
9
9
  attribute :file
10
10
  translatable_attribute :title, String
11
11
  translatable_attribute :description, String
12
12
 
13
- mimic :participatory_process_attachment
13
+ mimic :attachment
14
14
 
15
15
  validates :file, presence: true, unless: :persisted?
16
16
  validates :title, :description, translatable_presence: true
@@ -14,6 +14,7 @@ module Decidim
14
14
 
15
15
  attribute :settings, Object
16
16
  attribute :manifest
17
+ attribute :weight, Integer, default: 0
17
18
 
18
19
  attribute :step_settings, Hash[String => Object]
19
20
  attribute :participatory_process
@@ -14,6 +14,7 @@ module Decidim
14
14
  attribute :default_locale, String
15
15
  attribute :homepage_image
16
16
  attribute :logo
17
+ attribute :favicon
17
18
  attribute :show_statistics
18
19
 
19
20
  translatable_attribute :description, String
@@ -11,9 +11,13 @@ module Decidim
11
11
  translatable_attribute :subtitle, String
12
12
  translatable_attribute :description, String
13
13
  translatable_attribute :short_description, String
14
+ translatable_attribute :domain, String
15
+ translatable_attribute :scope, String
14
16
 
15
17
  mimic :participatory_process
16
18
 
19
+ attribute :end_date, Date
20
+ attribute :developer_group, String
17
21
  attribute :slug, String
18
22
  attribute :hashtag, String
19
23
  attribute :promoted, Boolean
@@ -25,7 +29,10 @@ module Decidim
25
29
 
26
30
  validate :slug, :slug_uniqueness
27
31
 
28
- private
32
+ validates :hero_image, file_size: { less_than_or_equal_to: lambda { |_record| Decidim.maximum_attachment_size } }, file_content_type: { allow: ['image/jpeg', 'image/png'] }
33
+ validates :banner_image, file_size: { less_than_or_equal_to:lambda { |_record| Decidim.maximum_attachment_size } }, file_content_type: { allow: ['image/jpeg', 'image/png'] }
34
+
35
+ private
29
36
 
30
37
  def slug_uniqueness
31
38
  return unless current_organization.participatory_processes.where(slug: slug).where.not(id: id).any?
@@ -7,6 +7,7 @@ module Decidim
7
7
  include Decidim::LocalizedLocalesHelper
8
8
  include Decidim::TranslationsHelper
9
9
  include Decidim::HumanizeBooleansHelper
10
+ include Decidim::AriaSelectedLinkToHelper
10
11
 
11
12
  def title
12
13
  current_organization.name
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Admin
4
+ # This class contains helpers needed in order for feature settings to
5
+ # properly render.
6
+ module FeatureSettingsHelper
7
+ TYPES = {
8
+ boolean: :check_box,
9
+ integer: :number_field,
10
+ string: :text_field,
11
+ text: :text_area
12
+ }.freeze
13
+
14
+ # Public: Renders a form field that matches a settings attribute's
15
+ # type.
16
+ #
17
+ # form - The form in which to render the field.
18
+ # attribute - The FeatureSettings::Attribute instance with the
19
+ # description of the attribute.
20
+ # name - The name of the field.
21
+ # options - Extra options to be passed to the field helper.
22
+ #
23
+ # Returns a rendered form field.
24
+ def settings_attribute_input(form, attribute, name, options = {})
25
+ form.send(TYPES[attribute.type.to_sym], name, options)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -7,9 +7,8 @@ module Decidim
7
7
  class AdminUser
8
8
  include CanCan::Ability
9
9
 
10
- def initialize(user)
11
- return unless user
12
- return unless user.role?(:admin)
10
+ def initialize(user, _context)
11
+ return unless user && user.role?(:admin)
13
12
 
14
13
  can :manage, ParticipatoryProcess
15
14
  can :manage, ParticipatoryProcessStep
@@ -25,7 +24,8 @@ module Decidim
25
24
 
26
25
  can :manage, Feature
27
26
  can :read, :admin_dashboard
28
- can :manage, ParticipatoryProcessAttachment
27
+ can :manage, :admin_users
28
+ can :manage, Attachment
29
29
  can :manage, Scope
30
30
  can [:create, :index, :new, :read, :invite], User
31
31
  can [:destroy], [User] do |user_to_destroy|
@@ -9,9 +9,9 @@ module Decidim
9
9
  class Base
10
10
  include CanCan::Ability
11
11
 
12
- def initialize(user)
13
- merge ::Decidim::Ability.new(user)
14
- merge ParticipatoryProcessAdmin.new(user)
12
+ def initialize(user, context)
13
+ merge ::Decidim::Ability.new(user, context)
14
+ merge ParticipatoryProcessAdmin.new(user, context)
15
15
  end
16
16
  end
17
17
  end
@@ -11,12 +11,14 @@ module Decidim
11
11
  class ParticipatoryProcessAdmin
12
12
  include CanCan::Ability
13
13
 
14
- def initialize(user)
15
- return if user.role?(:admin)
16
- participatory_processes = ManageableParticipatoryProcessesForUser.for(user)
17
- return unless participatory_processes.any?
14
+ def initialize(user, _context)
15
+ @user = user
18
16
 
19
- can :read, :admin_dashboard
17
+ return unless user && !user.role?(:admin)
18
+
19
+ can :read, :admin_dashboard do
20
+ participatory_processes.any?
21
+ end
20
22
 
21
23
  can :manage, ParticipatoryProcess do |process|
22
24
  participatory_processes.include?(process)
@@ -25,12 +27,14 @@ module Decidim
25
27
  cannot :create, ParticipatoryProcess
26
28
  cannot :destroy, ParticipatoryProcess
27
29
 
30
+ cannot :manage, :admin_users
31
+
28
32
  can :manage, ParticipatoryProcessUserRole do |role|
29
33
  role.user != user
30
34
  end
31
35
 
32
- can :manage, ParticipatoryProcessAttachment do |step|
33
- participatory_processes.include?(step.participatory_process)
36
+ can :manage, Attachment do |attachment|
37
+ participatory_processes.include?(attachment.attached_to)
34
38
  end
35
39
 
36
40
  can :manage, ParticipatoryProcessStep do |step|
@@ -45,6 +49,10 @@ module Decidim
45
49
  participatory_processes.include?(category.participatory_process)
46
50
  end
47
51
  end
52
+
53
+ def participatory_processes
54
+ @participatory_processes ||= ManageableParticipatoryProcessesForUser.for(@user)
55
+ end
48
56
  end
49
57
  end
50
58
  end