decidim-centers 0.1.1

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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +144 -0
  4. data/Rakefile +40 -0
  5. data/app/commands/concerns/decidim/centers/create_omniauth_registration_override.rb +42 -0
  6. data/app/commands/concerns/decidim/centers/create_registration_override.rb +32 -0
  7. data/app/commands/concerns/decidim/centers/publish_center_update_event.rb +20 -0
  8. data/app/commands/concerns/decidim/centers/update_account_override.rb +35 -0
  9. data/app/commands/decidim/centers/admin/create_center.rb +50 -0
  10. data/app/commands/decidim/centers/admin/destroy_center.rb +47 -0
  11. data/app/commands/decidim/centers/admin/update_center.rb +47 -0
  12. data/app/commands/decidim/centers/create_or_update_center_user.rb +44 -0
  13. data/app/commands/decidim/centers/create_or_update_scope_user.rb +44 -0
  14. data/app/controllers/concerns/decidim/centers/admin/needs_select2_snippets.rb +35 -0
  15. data/app/controllers/concerns/decidim/centers/devise/omniauth_registrations_controller_override.rb +21 -0
  16. data/app/controllers/concerns/decidim/centers/devise/sessions_controller_override.rb +21 -0
  17. data/app/controllers/concerns/decidim/centers/with_scopes_helper.rb +15 -0
  18. data/app/controllers/decidim/centers/admin/application_controller.rb +24 -0
  19. data/app/controllers/decidim/centers/admin/centers_controller.rb +106 -0
  20. data/app/controllers/decidim/centers/admin/scopes_controller.rb +40 -0
  21. data/app/forms/concerns/decidim/centers/account_form_override.rb +36 -0
  22. data/app/forms/decidim/centers/admin/center_form.rb +18 -0
  23. data/app/forms/decidim/centers/verifications/center.rb +33 -0
  24. data/app/helpers/decidim/centers/application_helper.rb +17 -0
  25. data/app/jobs/decidim/centers/auto_verification_job.rb +46 -0
  26. data/app/jobs/decidim/centers/sync_center_user_job.rb +29 -0
  27. data/app/jobs/decidim/centers/sync_scope_user_job.rb +29 -0
  28. data/app/models/concerns/decidim/centers/unique_by_user.rb +19 -0
  29. data/app/models/concerns/decidim/centers/user_override.rb +33 -0
  30. data/app/models/decidim/centers/application_record.rb +10 -0
  31. data/app/models/decidim/centers/center.rb +25 -0
  32. data/app/models/decidim/centers/center_user.rb +28 -0
  33. data/app/models/decidim/centers/scope_user.rb +28 -0
  34. data/app/overrides/decidim/account/show/centers.html.erb.deface +3 -0
  35. data/app/overrides/decidim/devise/omniauth_registrations/new/centers.html.erb.deface +3 -0
  36. data/app/overrides/decidim/devise/registrations/new/centers.html.erb.deface +3 -0
  37. data/app/packs/entrypoints/decidim_centers_admin_select2.js +2 -0
  38. data/app/packs/src/decidim/centers/admin/resource_permissions_select2.js +68 -0
  39. data/app/packs/stylesheets/vendor/select2_foundation_theme.scss +345 -0
  40. data/app/permissions/decidim/centers/admin/permissions.rb +19 -0
  41. data/app/presenters/decidim/centers/admin_log/center_presenter.rb +29 -0
  42. data/app/views/decidim/centers/_profile_form.html.erb +5 -0
  43. data/app/views/decidim/centers/_registration_form.html.erb +11 -0
  44. data/app/views/decidim/centers/admin/centers/_form.html.erb +10 -0
  45. data/app/views/decidim/centers/admin/centers/edit.html.erb +8 -0
  46. data/app/views/decidim/centers/admin/centers/index.html.erb +45 -0
  47. data/app/views/decidim/centers/admin/centers/new.html.erb +8 -0
  48. data/config/assets.rb +8 -0
  49. data/config/i18n-tasks.yml +11 -0
  50. data/config/locales/en.yml +51 -0
  51. data/db/migrate/20231129114029_create_decidim_centers_centers.rb +13 -0
  52. data/db/migrate/20231130125631_create_decidim_centers_center_users.rb +12 -0
  53. data/db/migrate/20231205153627_create_decidim_centers_scope_users.rb +12 -0
  54. data/lib/decidim/centers/admin.rb +10 -0
  55. data/lib/decidim/centers/admin_engine.rb +40 -0
  56. data/lib/decidim/centers/engine.rb +79 -0
  57. data/lib/decidim/centers/test/factories.rb +25 -0
  58. data/lib/decidim/centers/test/shared_contexts.rb +22 -0
  59. data/lib/decidim/centers/verifications/center_action_authorizer.rb +49 -0
  60. data/lib/decidim/centers/verifications.rb +11 -0
  61. data/lib/decidim/centers/version.rb +10 -0
  62. data/lib/decidim/centers.rb +19 -0
  63. metadata +138 -0
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+ require "decidim/core"
5
+ require "deface"
6
+
7
+ module Decidim
8
+ module Centers
9
+ # This is the engine that runs on the public interface of centers.
10
+ class Engine < ::Rails::Engine
11
+ isolate_namespace Decidim::Centers
12
+
13
+ routes do
14
+ # Add engine routes here
15
+ # resources :centers
16
+ # root to: "centers#index"
17
+ end
18
+
19
+ config.to_prepare do
20
+ # commands
21
+ Decidim::CreateOmniauthRegistration.prepend(Decidim::Centers::CreateOmniauthRegistrationOverride)
22
+ Decidim::CreateRegistration.prepend(Decidim::Centers::CreateRegistrationOverride)
23
+ Decidim::UpdateAccount.prepend(Decidim::Centers::UpdateAccountOverride)
24
+ # forms
25
+ Decidim::RegistrationForm.include(Decidim::Centers::AccountFormOverride)
26
+ Decidim::OmniauthRegistrationForm.include(Decidim::Centers::AccountFormOverride)
27
+ Decidim::AccountForm.include(Decidim::Centers::AccountFormOverride)
28
+ # models
29
+ Decidim::User.include(Decidim::Centers::UserOverride)
30
+ Decidim::RegistrationForm.include(Centers::AccountFormOverride)
31
+ Decidim::OmniauthRegistrationForm.include(Centers::AccountFormOverride)
32
+ Decidim::AccountForm.include(Centers::AccountFormOverride)
33
+ Decidim::CreateOmniauthRegistration.prepend(Centers::CreateOmniauthRegistrationOverride)
34
+ Decidim::CreateRegistration.prepend(Centers::CreateRegistrationOverride)
35
+ Decidim::UpdateAccount.prepend(Centers::UpdateAccountOverride)
36
+ end
37
+
38
+ initializer "decidim_centers.sync" do
39
+ ActiveSupport::Notifications.subscribe "decidim.centers.user.updated" do |_name, data|
40
+ Decidim::Centers::SyncCenterUserJob.perform_later(data)
41
+ end
42
+ end
43
+
44
+ initializer "decidim_centers.overrides", after: "decidim.action_controller" do
45
+ config.to_prepare do
46
+ Decidim::Admin::ResourcePermissionsController.include(Decidim::Centers::Admin::NeedsSelect2Snippets)
47
+ Decidim::Devise::SessionsController.include(Decidim::Centers::Devise::SessionsControllerOverride)
48
+ Decidim::Devise::OmniauthRegistrationsController.include(Decidim::Centers::Devise::OmniauthRegistrationsControllerOverride)
49
+ Decidim::Devise::OmniauthRegistrationsController.include(Decidim::Centers::WithScopesHelper)
50
+ Decidim::Devise::RegistrationsController.include(Decidim::Centers::WithScopesHelper)
51
+ end
52
+ end
53
+
54
+ initializer "decidim_centers.sync" do
55
+ ActiveSupport::Notifications.subscribe "decidim.centers.user.updated" do |_name, data|
56
+ Decidim::Centers::SyncCenterUserJob.perform_now(data)
57
+ Decidim::Centers::SyncScopeUserJob.perform_now(data) if Decidim::Centers.scopes_enabled
58
+ Decidim::Centers::AutoVerificationJob.perform_later(data[:user_id])
59
+ end
60
+ end
61
+
62
+ initializer "decidim_centers.authorizations" do
63
+ Decidim::Verifications.register_workflow(:center) do |workflow|
64
+ workflow.form = "Decidim::Centers::Verifications::Center"
65
+ workflow.action_authorizer = "Decidim::Centers::Verifications::CenterActionAuthorizer"
66
+
67
+ workflow.options do |options|
68
+ options.attribute :centers, type: :string
69
+ options.attribute :scopes, type: :string if Decidim::Centers.scopes_enabled
70
+ end
71
+ end
72
+ end
73
+
74
+ initializer "decidim_centers.webpacker.assets_path" do
75
+ Decidim.register_assets_path File.expand_path("app/packs", root)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/core/test/factories"
4
+
5
+ FactoryBot.define do
6
+ factory :center, class: "Decidim::Centers::Center" do
7
+ organization { create :organization }
8
+ title { generate_localized_title }
9
+ deleted_at { nil }
10
+
11
+ trait :deleted do
12
+ deleted_at { Time.current }
13
+ end
14
+ end
15
+
16
+ factory :center_user, class: "Decidim::Centers::CenterUser" do
17
+ user { create :user }
18
+ center { create :center, organization: user.organization }
19
+ end
20
+
21
+ factory :scope_user, class: "Decidim::Centers::ScopeUser" do
22
+ user { create :user }
23
+ scope { create :scope, organization: user.organization }
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ def check_center_authorization(authorization, user, center, scope = nil)
4
+ expect(authorization.name).to eq("center")
5
+ expect(authorization.user).to eq(user)
6
+ expect(authorization.metadata["centers"]).to include(center.id)
7
+ expect(authorization.metadata["scopes"]).to include(scope.id) if scope
8
+ end
9
+
10
+ shared_examples_for "no authorization is created" do
11
+ it "does not create an authorization" do
12
+ expect { subject.perform_now(params) }.not_to change(Decidim::Authorization, :count)
13
+ end
14
+ end
15
+
16
+ shared_context "with scopes disabled" do
17
+ let(:scope) { nil }
18
+
19
+ before do
20
+ allow(Decidim::Centers).to receive(:scopes_enabled).and_return(false)
21
+ end
22
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Centers
5
+ module Verifications
6
+ class CenterActionAuthorizer < Decidim::Verifications::DefaultActionAuthorizer
7
+ def authorize
8
+ return [:missing, { action: :authorize }] if authorization.blank?
9
+
10
+ status_code = :unauthorized
11
+ return [status_code, { fields: { centers: "..." } }] if authorization_centers.blank?
12
+ return [:ok, {}] if belongs_to_center? && belongs_to_scope?
13
+
14
+ [status_code, {}]
15
+ end
16
+
17
+ private
18
+
19
+ def options_centers
20
+ options["centers"]&.split(",") || []
21
+ end
22
+
23
+ def options_scopes
24
+ return [] unless Decidim::Centers.scopes_enabled
25
+
26
+ options["scopes"]&.split(",") || []
27
+ end
28
+
29
+ def authorization_centers
30
+ authorization.metadata["centers"] || []
31
+ end
32
+
33
+ def authorization_scopes
34
+ authorization.metadata["scopes"] || []
35
+ end
36
+
37
+ def belongs_to_center?
38
+ options_centers.empty? || options_centers.detect { |center| authorization_centers.include? center.to_i }
39
+ end
40
+
41
+ def belongs_to_scope?
42
+ return true unless Decidim::Centers.scopes_enabled
43
+
44
+ options_scopes.empty? || options_scopes.detect { |scope| authorization_scopes.include? scope.to_i }
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "verifications/center_action_authorizer"
4
+
5
+ module Decidim
6
+ module Centers
7
+ # This namespace holds the logic to verify users with their centers data.
8
+ module Verifications
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This holds the decidim-centers version.
5
+ module Centers
6
+ VERSION = "0.1.1"
7
+ DECIDIM_VERSION = "0.27.4"
8
+ COMPAT_DECIDIM_VERSION = [">= 0.27.0", "< 0.28"].freeze
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/centers/admin"
4
+ require "decidim/centers/engine"
5
+ require "decidim/centers/admin_engine"
6
+ require "decidim/centers/verifications"
7
+
8
+ module Decidim
9
+ # This namespace holds the logic of the `Centers` module. This module
10
+ # allows users to create centers in a participatory space.
11
+ module Centers
12
+ include ActiveSupport::Configurable
13
+
14
+ # if false, it won't ask the user for the scope
15
+ config_accessor :scopes_enabled do
16
+ Decidim::Env.new("DECIDIM_CENTERS_SCOPES_ENABLED", true).default_or_present_if_exists
17
+ end
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: decidim-centers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Francisco Bolívar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-12-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: decidim-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.27.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '0.28'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.27.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.28'
33
+ - !ruby/object:Gem::Dependency
34
+ name: deface
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.9'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.9'
47
+ description: Manage your centers and scopes so the users can be authorized over them.
48
+ email:
49
+ - francisco.bolivar@nazaries.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - LICENSE-AGPLv3.txt
55
+ - README.md
56
+ - Rakefile
57
+ - app/commands/concerns/decidim/centers/create_omniauth_registration_override.rb
58
+ - app/commands/concerns/decidim/centers/create_registration_override.rb
59
+ - app/commands/concerns/decidim/centers/publish_center_update_event.rb
60
+ - app/commands/concerns/decidim/centers/update_account_override.rb
61
+ - app/commands/decidim/centers/admin/create_center.rb
62
+ - app/commands/decidim/centers/admin/destroy_center.rb
63
+ - app/commands/decidim/centers/admin/update_center.rb
64
+ - app/commands/decidim/centers/create_or_update_center_user.rb
65
+ - app/commands/decidim/centers/create_or_update_scope_user.rb
66
+ - app/controllers/concerns/decidim/centers/admin/needs_select2_snippets.rb
67
+ - app/controllers/concerns/decidim/centers/devise/omniauth_registrations_controller_override.rb
68
+ - app/controllers/concerns/decidim/centers/devise/sessions_controller_override.rb
69
+ - app/controllers/concerns/decidim/centers/with_scopes_helper.rb
70
+ - app/controllers/decidim/centers/admin/application_controller.rb
71
+ - app/controllers/decidim/centers/admin/centers_controller.rb
72
+ - app/controllers/decidim/centers/admin/scopes_controller.rb
73
+ - app/forms/concerns/decidim/centers/account_form_override.rb
74
+ - app/forms/decidim/centers/admin/center_form.rb
75
+ - app/forms/decidim/centers/verifications/center.rb
76
+ - app/helpers/decidim/centers/application_helper.rb
77
+ - app/jobs/decidim/centers/auto_verification_job.rb
78
+ - app/jobs/decidim/centers/sync_center_user_job.rb
79
+ - app/jobs/decidim/centers/sync_scope_user_job.rb
80
+ - app/models/concerns/decidim/centers/unique_by_user.rb
81
+ - app/models/concerns/decidim/centers/user_override.rb
82
+ - app/models/decidim/centers/application_record.rb
83
+ - app/models/decidim/centers/center.rb
84
+ - app/models/decidim/centers/center_user.rb
85
+ - app/models/decidim/centers/scope_user.rb
86
+ - app/overrides/decidim/account/show/centers.html.erb.deface
87
+ - app/overrides/decidim/devise/omniauth_registrations/new/centers.html.erb.deface
88
+ - app/overrides/decidim/devise/registrations/new/centers.html.erb.deface
89
+ - app/packs/entrypoints/decidim_centers_admin_select2.js
90
+ - app/packs/src/decidim/centers/admin/resource_permissions_select2.js
91
+ - app/packs/stylesheets/vendor/select2_foundation_theme.scss
92
+ - app/permissions/decidim/centers/admin/permissions.rb
93
+ - app/presenters/decidim/centers/admin_log/center_presenter.rb
94
+ - app/views/decidim/centers/_profile_form.html.erb
95
+ - app/views/decidim/centers/_registration_form.html.erb
96
+ - app/views/decidim/centers/admin/centers/_form.html.erb
97
+ - app/views/decidim/centers/admin/centers/edit.html.erb
98
+ - app/views/decidim/centers/admin/centers/index.html.erb
99
+ - app/views/decidim/centers/admin/centers/new.html.erb
100
+ - config/assets.rb
101
+ - config/i18n-tasks.yml
102
+ - config/locales/en.yml
103
+ - db/migrate/20231129114029_create_decidim_centers_centers.rb
104
+ - db/migrate/20231130125631_create_decidim_centers_center_users.rb
105
+ - db/migrate/20231205153627_create_decidim_centers_scope_users.rb
106
+ - lib/decidim/centers.rb
107
+ - lib/decidim/centers/admin.rb
108
+ - lib/decidim/centers/admin_engine.rb
109
+ - lib/decidim/centers/engine.rb
110
+ - lib/decidim/centers/test/factories.rb
111
+ - lib/decidim/centers/test/shared_contexts.rb
112
+ - lib/decidim/centers/verifications.rb
113
+ - lib/decidim/centers/verifications/center_action_authorizer.rb
114
+ - lib/decidim/centers/version.rb
115
+ homepage: https://github.com/decidim/decidim-module-centers
116
+ licenses:
117
+ - AGPL-3.0
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '3.0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubygems_version: 3.4.19
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: A decidim module to categorize users with centers and scopes
138
+ test_files: []