openstax_accounts 8.1.1 → 9.0.4

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