openstax_accounts 8.1.1 → 9.0.4

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/openstax/accounts/application_controller.rb +0 -4
  3. data/app/controllers/openstax/accounts/dev/accounts_controller.rb +16 -10
  4. data/app/controllers/openstax/accounts/dev/base_controller.rb +1 -5
  5. data/app/controllers/openstax/accounts/sessions_controller.rb +2 -5
  6. data/app/handlers/openstax/accounts/accounts_search.rb +3 -5
  7. data/app/handlers/openstax/accounts/dev/accounts_create.rb +1 -7
  8. data/app/handlers/openstax/accounts/dev/accounts_search.rb +0 -2
  9. data/app/handlers/openstax/accounts/sessions_callback.rb +3 -4
  10. data/app/models/openstax/accounts/account.rb +27 -23
  11. data/app/models/openstax/accounts/anonymous_account.rb +1 -2
  12. data/app/representers/openstax/accounts/api/v1/account_representer.rb +19 -6
  13. data/app/routines/openstax/accounts/dev/create_account.rb +25 -21
  14. data/app/routines/openstax/accounts/find_or_create_account.rb +11 -19
  15. data/app/routines/openstax/accounts/find_or_create_from_sso.rb +2 -8
  16. data/app/routines/openstax/accounts/sync_accounts.rb +1 -7
  17. data/app/views/layouts/openstax/accounts/application.html.erb +2 -2
  18. data/app/views/openstax/accounts/dev/accounts/_search_results.html.erb +9 -10
  19. data/app/views/openstax/accounts/dev/accounts/index.html.erb +7 -10
  20. data/app/views/openstax/accounts/dev/accounts/{search.js.erb → index.js.erb} +0 -0
  21. data/app/views/openstax/accounts/shared/_attention.html.erb +9 -1
  22. data/app/views/openstax/accounts/shared/accounts/_search.html.erb +12 -8
  23. data/config/routes.rb +2 -5
  24. data/db/migrate/14_drop_openstax_uid_and_username_uniqueness.rb +9 -0
  25. data/db/migrate/15_drop_accounts_groups.rb +42 -0
  26. data/db/migrate/16_add_is_kip_to_openstax_accounts_accounts.rb +5 -0
  27. data/db/migrate/17_add_school_location_to_openstax_accounts_accounts.rb +5 -0
  28. data/lib/omniauth/strategies/openstax.rb +1 -1
  29. data/lib/openstax/accounts/api.rb +0 -149
  30. data/lib/openstax/accounts/current_user_manager.rb +1 -5
  31. data/lib/openstax/accounts/engine.rb +1 -1
  32. data/lib/openstax/accounts/version.rb +1 -1
  33. data/lib/tasks/sync.rake +0 -8
  34. data/spec/factories/openstax_accounts_account.rb +1 -0
  35. metadata +8 -23
  36. data/app/models/openstax/accounts/application_group.rb +0 -7
  37. data/app/models/openstax/accounts/group.rb +0 -169
  38. data/app/models/openstax/accounts/group_member.rb +0 -37
  39. data/app/models/openstax/accounts/group_nesting.rb +0 -55
  40. data/app/models/openstax/accounts/group_owner.rb +0 -37
  41. data/app/representers/openstax/accounts/api/v1/application_group_representer.rb +0 -48
  42. data/app/representers/openstax/accounts/api/v1/application_groups_representer.rb +0 -20
  43. data/app/representers/openstax/accounts/api/v1/group_nesting_representer.rb +0 -31
  44. data/app/representers/openstax/accounts/api/v1/group_representer.rb +0 -71
  45. data/app/representers/openstax/accounts/api/v1/group_user_representer.rb +0 -34
  46. data/app/routines/openstax/accounts/create_group.rb +0 -26
  47. data/app/routines/openstax/accounts/sync_groups.rb +0 -67
  48. data/app/routines/openstax/accounts/update_group_caches.rb +0 -27
  49. data/lib/openstax/accounts/has_many_through_groups/active_record/base.rb +0 -51
  50. data/spec/factories/openstax_accounts_group.rb +0 -7
  51. data/spec/factories/openstax_accounts_group_member.rb +0 -6
  52. data/spec/factories/openstax_accounts_group_nesting.rb +0 -6
  53. data/spec/factories/openstax_accounts_group_owner.rb +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: edf27a81aef8f196ab5b804f38903395d24367628209a9eeb001a37f258f33d5
4
- data.tar.gz: af2ac3a3de4ab707958bc03b0faf561e876b99521f82a8695a55cfcbbd1bc740
3
+ metadata.gz: 90b87730485400afb68d52f5ffc0c2c54348a8ccc4a0484afdbade1c10a7e9ae
4
+ data.tar.gz: 31a2ce0e354d58d33313260f5c125649b5a1c0124ef6362a61123afdeb5bb834
5
5
  SHA512:
6
- metadata.gz: 3f8b506ad52a7bb2b59ed822f0347c7bb5343728dbedf7fa166f7ffc2aabc7ce9c3b8a6113d09aab44795a04e79e74595583e2335e825b0e682e7be3604b4a8c
7
- data.tar.gz: fca6c2d52b5540bac193bc099c905ca4a6aa860c7353b411259ae95c878e872fb7c0f46f67c7b0a3813b7ae853dd967e969839c524384a07d1b30e3754677874
6
+ metadata.gz: 022e79a44e3d134d1661fc7087a5bab2937e256c8f3ac9d3a5096790758f4a59175c8940a85753b78574294f0a3f277c2723d22d51efd4d121af902fbc0d1fd3
7
+ data.tar.gz: 6f62aac96d93356f27631c2edbc70e4434942da615069939be98a151bb03e24788aaff320b450f1ef31a4492bfd2854f1904d80172122753607d9f675a3de6d8
@@ -1,8 +1,6 @@
1
1
  module OpenStax
2
2
  module Accounts
3
-
4
3
  class ApplicationController < ::ActionController::Base
5
-
6
4
  include Lev::HandleWith
7
5
 
8
6
  skip_before_action :authenticate_user!, raise: false
@@ -10,8 +8,6 @@ module OpenStax
10
8
  def configuration
11
9
  OpenStax::Accounts.configuration
12
10
  end
13
-
14
11
  end
15
-
16
12
  end
17
13
  end
@@ -3,23 +3,30 @@ module OpenStax
3
3
  module Dev
4
4
  class AccountsController < OpenStax::Accounts::Dev::BaseController
5
5
  # Allow accessing from inside an iframe
6
- before_action :allow_iframe_access, only: [:index, :search]
6
+ before_action :allow_iframe_access, only: :index
7
7
 
8
8
  def index
9
- end
10
-
11
- def search
12
- handle_with(AccountsSearch)
9
+ handle_with AccountsSearch
13
10
  end
14
11
 
15
12
  def create
16
- handle_with(AccountsCreate,
17
- complete: lambda { redirect_to dev_accounts_path })
13
+ handle_with(
14
+ AccountsCreate,
15
+ success: -> do
16
+ username = @handler_result.outputs.account.username
17
+ flash.notice = "Account with username \"#{username}\" created."
18
+ redirect_to dev_accounts_path(search: { query: username })
19
+ end,
20
+ failure: -> do
21
+ flash.alert = @handler_result.errors.first.translate
22
+ redirect_to dev_accounts_path(search: { query: params.dig(:create, :username) })
23
+ end
24
+ )
18
25
  end
19
26
 
20
27
  def become
21
- @account = Account.find_by(openstax_uid: params[:id])
22
- sign_in(@account)
28
+ @account = Account.find(params[:id])
29
+ sign_in @account
23
30
  redirect_back key: :accounts_return_to, strategies: [:session]
24
31
  end
25
32
 
@@ -28,7 +35,6 @@ module OpenStax
28
35
  def allow_iframe_access
29
36
  response.headers.except! 'X-Frame-Options'
30
37
  end
31
-
32
38
  end
33
39
  end
34
40
  end
@@ -2,11 +2,7 @@ module OpenStax
2
2
  module Accounts
3
3
  module Dev
4
4
  class BaseController < OpenStax::Accounts::ApplicationController
5
-
6
- before_action do
7
- raise SecurityTransgression if Rails.env.production?
8
- end
9
-
5
+ before_action { raise SecurityTransgression if Rails.env.production? }
10
6
  end
11
7
  end
12
8
  end
@@ -1,7 +1,6 @@
1
1
  module OpenStax
2
2
  module Accounts
3
3
  class SessionsController < OpenStax::Accounts::ApplicationController
4
-
5
4
  def new
6
5
  if configuration.is_return_to_url_approved?(params[:return_to])
7
6
  store_url url: params[:return_to], key: :accounts_return_to, strategies: [:session]
@@ -40,15 +39,13 @@ module OpenStax
40
39
  end
41
40
 
42
41
  def failure
43
- redirect_back key: :accounts_return_to,
44
- alert: "Authentication failed, please try again."
42
+ redirect_back key: :accounts_return_to, alert: 'Authentication failed, please try again.'
45
43
  end
46
44
 
47
45
  def profile
48
46
  # TODO: stub profile if stubbing is enabled
49
- redirect_to URI.join(configuration.openstax_accounts_url, "/profile").to_s
47
+ redirect_to URI.join(configuration.openstax_accounts_url, '/profile').to_s
50
48
  end
51
-
52
49
  end
53
50
  end
54
51
  end
@@ -1,7 +1,6 @@
1
1
  module OpenStax
2
2
  module Accounts
3
3
  class AccountsSearch
4
-
5
4
  lev_handler
6
5
 
7
6
  paramify :search do
@@ -50,17 +49,16 @@ module OpenStax
50
49
  page: search_params.page,
51
50
  per_page: search_params.per_page}
52
51
  out = run(OpenStax::Accounts::SearchAccounts, params).outputs
53
- outputs[:total_count] = out[:total_count]
52
+ outputs.total_count = out.total_count
54
53
 
55
- if !@max_items.nil? && outputs[:total_count] > @max_items
54
+ if !@max_items.nil? && outputs.total_count > @max_items
56
55
  fatal_error(code: :too_many_items,
57
56
  message: "The number of matches exceeded the allowed limit of #{
58
57
  @max_items} matches. Please refine your query and try again.")
59
58
  end
60
59
 
61
- outputs[:items] = out[:items].to_a
60
+ outputs.items = out.items.to_a
62
61
  end
63
-
64
62
  end
65
63
  end
66
64
  end
@@ -1,21 +1,17 @@
1
1
  module OpenStax
2
2
  module Accounts
3
-
4
3
  module Dev
5
4
  class AccountsCreate
6
-
7
5
  lev_handler
8
6
 
9
7
  paramify :create do
10
8
  attribute :username, type: String
11
- validates :username, presence: true
12
9
  attribute :role, type: String
13
10
  end
14
11
 
15
12
  uses_routine OpenStax::Accounts::Dev::CreateAccount,
16
13
  as: :create_account,
17
- translations: { inputs: { scope: :create },
18
- outputs: { type: :verbatim } }
14
+ translations: { inputs: { scope: :create }, outputs: { type: :verbatim } }
19
15
 
20
16
  protected
21
17
 
@@ -26,9 +22,7 @@ module OpenStax
26
22
  def handle
27
23
  run(:create_account, create_params.as_hash(:username, :role))
28
24
  end
29
-
30
25
  end
31
26
  end
32
-
33
27
  end
34
28
  end
@@ -2,7 +2,6 @@ module OpenStax
2
2
  module Accounts
3
3
  module Dev
4
4
  class AccountsSearch < OpenStax::Accounts::AccountsSearch
5
-
6
5
  paramify :search do
7
6
  attribute :type, type: String
8
7
  attribute :query, type: String
@@ -21,7 +20,6 @@ module OpenStax
21
20
  def authorized?
22
21
  !Rails.env.production?
23
22
  end
24
-
25
23
  end
26
24
  end
27
25
  end
@@ -15,15 +15,13 @@ module OpenStax
15
15
 
16
16
  def handle
17
17
  # Don't worry if the account is logged in or not beforehand. Just assume that they aren't.
18
-
19
18
  # tap is used because we want the block to always run (not just when initializing)
20
19
  begin
21
- outputs.account = Account.find_or_initialize_by(
22
- openstax_uid: @auth_data.uid
23
- ).tap do |account|
20
+ outputs.account = Account.find_or_initialize_by(uuid: @auth_data.uid).tap do |account|
24
21
  account.access_token = @auth_data.credentials.token
25
22
 
26
23
  raw_info = @auth_data.extra.raw_info
24
+ raw_info = raw_info.merge openstax_uid: raw_info[:id]
27
25
  OpenStax::Accounts::Account::SYNC_ATTRIBUTES.each do |attribute|
28
26
  begin
29
27
  account.send "#{attribute}=", raw_info[attribute]
@@ -36,6 +34,7 @@ module OpenStax
36
34
  account.faculty_status ||= :no_faculty_info
37
35
  account.role ||= :unknown_role
38
36
  account.school_type ||= :unknown_school_type
37
+ account.school_location ||= :unknown_school_location
39
38
  end
40
39
 
41
40
  outputs.account.save if outputs.account.changed?
@@ -1,9 +1,9 @@
1
1
  module OpenStax::Accounts
2
2
  class Account < ActiveRecord::Base
3
-
4
3
  USERNAME_DISCARDED_CHAR_REGEX = /[^A-Za-z\d_]/
5
4
  USERNAME_MAX_LENGTH = 50
6
5
  SYNC_ATTRIBUTES = [
6
+ :openstax_uid,
7
7
  :username,
8
8
  :first_name,
9
9
  :last_name,
@@ -12,29 +12,22 @@ module OpenStax::Accounts
12
12
  :self_reported_role,
13
13
  :faculty_status,
14
14
  :school_type,
15
+ :school_location,
15
16
  :salesforce_contact_id,
16
- :uuid,
17
17
  :support_identifier,
18
- :is_test
18
+ :is_test,
19
+ :is_kip
19
20
  ]
20
21
 
21
22
  attr_accessor :syncing
22
23
 
23
- has_many :group_owners, dependent: :destroy,
24
- class_name: 'OpenStax::Accounts::GroupOwner',
25
- primary_key: :openstax_uid,
26
- foreign_key: :user_id,
27
- inverse_of: :user
28
- has_many :groups_as_owner, through: :group_owners, source: :group
29
-
30
- has_many :group_members, dependent: :destroy,
31
- class_name: 'OpenStax::Accounts::GroupMember',
32
- primary_key: :openstax_uid,
33
- foreign_key: :user_id,
34
- inverse_of: :user
35
- has_many :groups_as_member, through: :group_members, source: :group
36
-
37
- enum faculty_status: [:no_faculty_info, :pending_faculty, :confirmed_faculty, :rejected_faculty]
24
+ enum faculty_status: [
25
+ :no_faculty_info,
26
+ :pending_faculty,
27
+ :confirmed_faculty,
28
+ :rejected_faculty
29
+ ]
30
+
38
31
  enum role: [
39
32
  :unknown_role,
40
33
  :student,
@@ -46,12 +39,24 @@ module OpenStax::Accounts
46
39
  :adjunct,
47
40
  :homeschool
48
41
  ]
49
- enum school_type: [:unknown_school_type, :other_school_type, :college]
50
42
 
51
- validates :faculty_status, :role, :school_type, presence: true
43
+ enum school_type: [
44
+ :unknown_school_type,
45
+ :other_school_type,
46
+ :college,
47
+ :high_school,
48
+ :k12_school,
49
+ :home_school
50
+ ]
51
+
52
+ enum school_location: [
53
+ :unknown_school_location,
54
+ :domestic_school,
55
+ :foreign_school
56
+ ]
57
+
58
+ validates :faculty_status, :role, :school_type, :school_location, presence: true
52
59
 
53
- validates :openstax_uid, uniqueness: { allow_nil: true }
54
- validates :username, uniqueness: { allow_nil: true }
55
60
  validates :uuid, presence: true, uniqueness: true
56
61
  validates :support_identifier, uniqueness: { allow_nil: true }
57
62
 
@@ -98,6 +103,5 @@ module OpenStax::Accounts
98
103
  def update_openstax_accounts
99
104
  OpenStax::Accounts::Api.update_account(self)
100
105
  end
101
-
102
106
  end
103
107
  end
@@ -1,7 +1,6 @@
1
1
  module OpenStax
2
2
  module Accounts
3
3
  class AnonymousAccount < Account
4
-
5
4
  include Singleton
6
5
 
7
6
  before_save { false }
@@ -9,6 +8,7 @@ module OpenStax
9
8
  def initialize(attributes=nil)
10
9
  super
11
10
  self.id = nil
11
+ self.uuid = nil
12
12
  self.openstax_uid = nil
13
13
  self.username = 'anonymous'
14
14
  self.first_name = 'Guest'
@@ -18,7 +18,6 @@ module OpenStax
18
18
  def is_anonymous?
19
19
  true
20
20
  end
21
-
22
21
  end
23
22
  end
24
23
  end
@@ -5,13 +5,13 @@ module OpenStax
5
5
  module Api
6
6
  module V1
7
7
  class AccountRepresenter < Roar::Decorator
8
-
9
8
  # This representer is used to communicate with Accounts
10
9
  # and so must allow read/write on all properties
11
10
  # Do not use it in create/update APIs!
12
11
 
13
- # Otherwise, this representer can be used directly or subclassed
14
- # for an object that delegates openstax_uid, username, first_name, last_name, full_name, # title, faculty_status, role, school_type and salesforce_contact_id to an account
12
+ # This representer can be used directly or subclassed for an object that delegates
13
+ # openstax_uid, username, first_name, last_name, full_name, title, faculty_status,
14
+ # role, school_type, school_location and salesforce_contact_id to an account
15
15
 
16
16
  include Roar::JSON
17
17
 
@@ -86,24 +86,37 @@ module OpenStax
86
86
  }"
87
87
  }
88
88
 
89
+ property :school_location,
90
+ type: String,
91
+ schema_info: {
92
+ description: "One of #{
93
+ OpenStax::Accounts::Account.school_locations.keys.map(&:to_s).inspect
94
+ }"
95
+ }
96
+
89
97
  property :uuid,
90
98
  type: String,
91
99
  schema_info: {
92
- description: "The UUID as set by Accounts"
100
+ description: 'The UUID as set by Accounts'
93
101
  }
94
102
 
95
103
  property :support_identifier,
96
104
  type: String,
97
105
  schema_info: {
98
- description: "The support_identifier as set by Accounts"
106
+ description: 'The support_identifier as set by Accounts'
99
107
  }
100
108
 
101
109
  property :is_test,
102
110
  type: :boolean,
103
111
  schema_info: {
104
- description: "Whether or not this is a test account"
112
+ description: 'Whether or not this is a test account'
105
113
  }
106
114
 
115
+ property :is_kip,
116
+ type: :boolean,
117
+ schema_info: {
118
+ description: 'Whether or not this is a Key Institutional Partner account'
119
+ }
107
120
  end
108
121
  end
109
122
  end
@@ -1,5 +1,4 @@
1
- # Routine for creating an account, only for use when stubbing and
2
- # not on production.
1
+ # Routine for creating an account, only for use when stubbing and not on production.
3
2
 
4
3
  module OpenStax
5
4
  module Accounts
@@ -11,30 +10,35 @@ module OpenStax
11
10
 
12
11
  def exec(inputs={})
13
12
  fatal_error(code: :cannot_create_account_in_production) if Rails.env.production?
14
- fatal_error(code: :can_only_create_account_when_stubbing) if !OpenStax::Accounts.configuration.enable_stubbing?
13
+ fatal_error(code: :can_only_create_account_when_stubbing) \
14
+ unless OpenStax::Accounts.configuration.enable_stubbing?
15
15
 
16
16
  username = inputs[:username]
17
- while username.nil? || Account.where(username: username).exists? do
18
- username = SecureRandom.hex(3).to_s
17
+ if username.blank?
18
+ while username.blank? || Account.where(username: username).exists? do
19
+ username = SecureRandom.hex(3).to_s
20
+ end
21
+ else
22
+ fatal_error(
23
+ code: :account_already_exists,
24
+ message: "One or more accounts with username \"#{username}\" already exist."
25
+ ) if Account.where(username: username).exists?
19
26
  end
20
27
 
21
- account = OpenStax::Accounts::Account.new
22
-
23
- account.openstax_uid = -SecureRandom.hex(4).to_i(16)/2
24
- account.access_token = SecureRandom.hex.to_s
25
- account.username = username
26
- account.role = inputs[:role] || :unknown_role
27
- account.uuid = SecureRandom.uuid
28
- account.support_identifier = "cs_#{SecureRandom.hex(4)}"
29
- account.is_test = true
30
-
31
- account.save
32
-
33
- transfer_errors_from(account, {type: :verbatim}, true)
34
-
35
- outputs[:account] = account
28
+ outputs.account = OpenStax::Accounts::Account.create(
29
+ openstax_uid: -SecureRandom.hex(4).to_i(16)/2,
30
+ access_token: SecureRandom.hex.to_s,
31
+ username: username,
32
+ role: inputs[:role] || :unknown_role,
33
+ uuid: SecureRandom.uuid,
34
+ support_identifier: "cs_#{SecureRandom.hex(4)}",
35
+ school_type: inputs[:school_type] || :unknown_school_type,
36
+ school_location: inputs[:school_location] || :unknown_school_location,
37
+ is_test: true
38
+ )
39
+
40
+ transfer_errors_from(outputs.account, {type: :verbatim}, true)
36
41
  end
37
-
38
42
  end
39
43
  end
40
44
  end