decidim-centers 0.1.1

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