canvas_sync 0.18.7 → 0.18.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67e4e28a8d15d54b652a8786fa58cecaab948019debb338f87e0e1ccf9fca6b5
4
- data.tar.gz: cf4fda0c40456887e0dc3e1e820dd9b4753b37f493a26b879b32367821ef8fa0
3
+ metadata.gz: 490c7e8d4a1b61e5bd17dd938a0387f68718789bb05ad8c071d1a7dca83374ac
4
+ data.tar.gz: 06e933489bb8fd39f8af4a2c8498032faf7edf064a1df5cf882659823fa0f597
5
5
  SHA512:
6
- metadata.gz: 760b72ec220d8b9125ee844e86703f7e83afc11ca3234bcade7f06ed97c3932acd0dd5f123741cd8e04f1116b2656d55c56cdffb4005a1c7b8b3b7beb9205aa0
7
- data.tar.gz: fddfc19290404c999faaf8d0629d9feeae42cf6dc52b965eff6e28565f1a62442c10b335400e01ac9f244ace878c146445f3744b954ac622dfb3c7bdf5a2eb4e
6
+ metadata.gz: 43fb1c9a539c970093c742ef2dd8cb1737a46f3b47ed1958b25fb3e3703ca3195677024d62d438d101ac913a53dbd86291fdaa3bd290c78e0b318064f6c27ddf
7
+ data.tar.gz: a08e7076c32de83470a32d2238ed0ac77055d3afa65411c0663330803e58b7edf2c9fa6a3b121c2835ec2347a23c40499248d35199c83de3f99347c71d7e77c9
@@ -43,73 +43,6 @@ module CanvasSync::Concerns
43
43
  lti_roles.system_roles.include?("sys_admin")
44
44
  end
45
45
 
46
- # Middle Domain
47
-
48
- def launch_context
49
- @launch_context ||= begin
50
- if lti_launch_placement == "global_navigation"
51
- :global
52
- elsif get_lti_cust_param('custom_canvas_course_id').present?
53
- ::Course.find_by(canvas_id: get_lti_cust_param('custom_canvas_course_id'))
54
- else
55
- ::Account.find_by(canvas_id: get_lti_cust_param('custom_canvas_account_id'))
56
- end
57
- end
58
- end
59
-
60
- def launch_account
61
- @launch_account ||= launch_context.respond_to?(:account) ? launch_context.account : ::Account.find_by(canvas_id: get_lti_cust_param('custom_canvas_account_id'))
62
- end
63
-
64
- # CanvasSync Domain
65
-
66
- def canvas_permissions
67
- panda_pal_session[:canvas_permissions] ||= ::Role.role_permissions(canvas_roles)
68
- end
69
-
70
- def canvas_roles
71
- @canvas_roles ||= Role.for_labels(canvas_role_labels, launch_account)
72
- end
73
-
74
- def canvas_root_account_roles
75
- role_labels = if "::Admin".safe_constantize && ::Admin < ::ActiveRecord::Base
76
- adm_query = ::Admin.where(canvas_account_id: current_organization.canvas_account_id, workflow_state: "active")
77
- adm_query.pluck(:role_name)
78
- else
79
- Rails.cache.fetch([self.class.name, "RootAccountAdminLinks", canvas_user_id], expires_in: 1.hour) do
80
- admin_entries = canvas_sync_client.account_admins('self', user_id: [canvas_user_id])
81
- admin_entries = admin_entries.select{|ent| ent[:workflow_state] == 'active' }
82
- admin_entries.map{|ent| ent[:role] }
83
- end
84
- end
85
- ::Role.for_labels(role_labels, ::Account.find_by(canvas_parent_account_id: nil))
86
- end
87
-
88
- def canvas_account_roles
89
- canvas_roles.where(base_role_type: 'AccountMembership')
90
- end
91
-
92
- def canvas_course_roles
93
- canvas_roles.where.not(base_role_type: 'AccountMembership')
94
- end
95
-
96
- def canvas_super_user?
97
- cache_on_session(:canvas_super_user?) do
98
- canvas_site_admin? || canvas_root_account_roles.map(&:label).include?("Account Admin")
99
- end
100
- end
101
-
102
- def canvas_user_id
103
- user&.canvas_id
104
- end
105
-
106
- private
107
-
108
- def cache_on_session(key, &blk)
109
- panda_pal_session[:ability_cache] ||= {}
110
- panda_pal_session[:ability_cache][key] ||= blk.call
111
- end
112
-
113
46
  class RoleStore
114
47
  ContextTypeURN = 'urn:lti:context-type:ims/lis/'.freeze
115
48
 
@@ -181,5 +114,69 @@ module CanvasSync::Concerns
181
114
  end
182
115
  end
183
116
 
117
+ # Middle Domain
118
+
119
+ def launch_context
120
+ @launch_context ||= begin
121
+ if lti_launch_placement == "global_navigation"
122
+ :global
123
+ elsif get_lti_cust_param('custom_canvas_course_id').present?
124
+ ::Course.find_by(canvas_id: get_lti_cust_param('custom_canvas_course_id'))
125
+ else
126
+ ::Account.find_by(canvas_id: get_lti_cust_param('custom_canvas_account_id'))
127
+ end
128
+ end
129
+ end
130
+
131
+ def launch_account
132
+ @launch_account ||= launch_context.respond_to?(:account) ? launch_context.account : ::Account.find_by(canvas_id: get_lti_cust_param('custom_canvas_account_id'))
133
+ end
134
+
135
+ def cache_on_session(key, &blk)
136
+ panda_pal_session[:ability_cache] ||= {}
137
+ panda_pal_session[:ability_cache][key] ||= blk.call
138
+ end
139
+
140
+ # CanvasSync Domain
141
+
142
+ def canvas_permissions
143
+ panda_pal_session[:canvas_permissions] ||= ::Role.role_permissions(canvas_roles)
144
+ end
145
+
146
+ def canvas_roles
147
+ @canvas_roles ||= Role.for_labels(canvas_role_labels, launch_account)
148
+ end
149
+
150
+ def canvas_root_account_roles
151
+ role_labels = if "::Admin".safe_constantize && ::Admin < ::ActiveRecord::Base
152
+ adm_query = ::Admin.where(canvas_account_id: current_organization.canvas_account_id, workflow_state: "active")
153
+ adm_query.pluck(:role_name)
154
+ else
155
+ Rails.cache.fetch([self.class.name, "RootAccountAdminLinks", canvas_user_id], expires_in: 1.hour) do
156
+ admin_entries = canvas_sync_client.account_admins('self', user_id: [canvas_user_id])
157
+ admin_entries = admin_entries.select{|ent| ent[:workflow_state] == 'active' }
158
+ admin_entries.map{|ent| ent[:role] }
159
+ end
160
+ end
161
+ ::Role.for_labels(role_labels, ::Account.find_by(canvas_parent_account_id: nil))
162
+ end
163
+
164
+ def canvas_account_roles
165
+ canvas_roles.where(base_role_type: 'AccountMembership')
166
+ end
167
+
168
+ def canvas_course_roles
169
+ canvas_roles.where.not(base_role_type: 'AccountMembership')
170
+ end
171
+
172
+ def canvas_super_user?
173
+ cache_on_session(:canvas_super_user?) do
174
+ canvas_site_admin? || canvas_root_account_roles.map(&:label).include?("Account Admin")
175
+ end
176
+ end
177
+
178
+ def canvas_user_id
179
+ user&.canvas_id
180
+ end
184
181
  end
185
182
  end
@@ -2,6 +2,10 @@ module CanvasSync::Concerns
2
2
  module SyncMapping
3
3
  extend ActiveSupport::Concern
4
4
 
5
+ def self.mapping_for(model, key = nil)
6
+ model.try(:get_sync_mapping, key) || Mapping.default_mappings[key || Mapping.normalize_model_name(model)]
7
+ end
8
+
5
9
  class_methods do
6
10
  def sync_mapping(key = nil, reset: false, &blk)
7
11
  key ||= Mapping.normalize_model_name(self)
@@ -8,10 +8,14 @@ module CanvasSync
8
8
  initializer "canvas_sync.safe_yaml_classes" do |app|
9
9
  app.config.active_record.yaml_column_permitted_classes ||= []
10
10
  app.config.active_record.yaml_column_permitted_classes |= [Symbol, ActiveSupport::HashWithIndifferentAccess]
11
- if ActiveRecord::Base.respond_to?(:yaml_column_permitted_classes)
12
- ActiveRecord::Base.yaml_column_permitted_classes |= app.config.active_record.yaml_column_permitted_classes
13
- elsif
14
- ActiveRecord.yaml_column_permitted_classes |= app.config.active_record.yaml_column_permitted_classes
11
+
12
+ Rails.application.config.after_initialize do
13
+ if ActiveRecord::Base.respond_to?(:yaml_column_permitted_classes)
14
+ ActiveRecord::Base.yaml_column_permitted_classes |= app.config.active_record.yaml_column_permitted_classes
15
+ end
16
+ if ActiveRecord.respond_to?(:yaml_column_permitted_classes)
17
+ ActiveRecord.yaml_column_permitted_classes |= app.config.active_record.yaml_column_permitted_classes
18
+ end
15
19
  end
16
20
  rescue
17
21
  end
@@ -52,7 +56,6 @@ module CanvasSync
52
56
  Bearcat::Client.new(
53
57
  prefix: org.canvas_url,
54
58
  token: org.canvas_api_token,
55
- master_rate_limit: (Rails.env.production? && !!defined?(Redis) && ENV['REDIS_URL'].present?),
56
59
  )
57
60
  end
58
61
  end
@@ -45,7 +45,7 @@ module CanvasSync
45
45
  redis_attr :created_at
46
46
  redis_attr :callback_queue, read_only: false
47
47
  redis_attr :callback_params, :json
48
- redis_attr :allow_context_changes
48
+ redis_attr :allow_context_changes, :bool
49
49
 
50
50
  def context
51
51
  return @context if defined?(@context)
@@ -402,20 +402,18 @@ module CanvasSync
402
402
 
403
403
  if Thread.current[:job_batches_redis]
404
404
  yield Thread.current[:job_batches_redis]
405
- elsif defined?(::Sidekiq)
406
- ::Sidekiq.redis do |r|
405
+ else
406
+ ::Bearcat.redis do |r|
407
407
  Thread.current[:job_batches_redis] = r
408
408
  yield r
409
409
  ensure
410
410
  Thread.current[:job_batches_redis] = nil
411
411
  end
412
- else
413
- # TODO
414
412
  end
415
413
  end
416
414
 
417
415
  def logger
418
- defined?(::Sidekiq) ? ::Sidekiq.logger : Rails.logger
416
+ ::CanvasSync.logger
419
417
  end
420
418
 
421
419
  def push_callbacks(args, queue)
@@ -20,7 +20,7 @@ module CanvasSync
20
20
  Batch.redis do |r|
21
21
  r.multi do |r|
22
22
  r.hset("MNGBID-#{man_batch_id}", "root_bid", root_batch.bid)
23
- r.hset("MNGBID-#{man_batch_id}", "ordered", ordered)
23
+ r.hset("MNGBID-#{man_batch_id}", "ordered", ordered ? 1 : 0)
24
24
  r.hset("MNGBID-#{man_batch_id}", "concurrency", concurrency)
25
25
  r.expire("MNGBID-#{man_batch_id}", Batch::BID_EXPIRE_TTL)
26
26
 
@@ -93,6 +93,8 @@ module CanvasSync
93
93
  end
94
94
  end
95
95
 
96
+ ordered = CanvasSync::MiscHelper.to_boolean(ordered)
97
+
96
98
  next_job_json = Batch.redis do |r|
97
99
  if ordered
98
100
  r.lpop("MNGBID-#{man_batch_id}-jobs")
@@ -41,13 +41,13 @@ module CanvasSync
41
41
  if @initialized || @existing
42
42
  redis do |r|
43
43
  r.multi do |r|
44
- r.hset(redis_key, attribute, value)
44
+ r.hset(redis_key, attribute, value.to_s)
45
45
  r.expire(redis_key, Batch::BID_EXPIRE_TTL)
46
46
  end
47
47
  end
48
48
  else
49
49
  @pending_attrs ||= {}
50
- @pending_attrs[attribute] = value
50
+ @pending_attrs[attribute] = value.to_s
51
51
  end
52
52
  end
53
53
 
@@ -18,7 +18,7 @@ module CanvasSync
18
18
 
19
19
  # Make sure the report also checks last_activity_at when checking updated_at
20
20
  if options[:models].include?("enrollments")
21
- if (%w[last_activity_at total_activity_time] & Enrollment.get_sync_mapping[:columns].keys).present? && merged_params.dig(:parameters, :include_last_activity) == nil
21
+ if (%w[last_activity_at total_activity_time] & CanvasSync::Concerns::SyncMapping.mapping_for(Enrollment)[:columns].keys).present? && merged_params.dig(:parameters, :include_last_activity) == nil
22
22
  merged_params[:parameters][:include_last_activity] = true
23
23
  end
24
24
  end
@@ -9,7 +9,7 @@ module CanvasSync
9
9
  end
10
10
 
11
11
  def mapping_for(model, key = nil)
12
- model.try(:get_sync_mapping, key) || mapping[key || CanvasSync::Concerns::SyncMapping::Mapping.normalize_model_name(model)]
12
+ CanvasSync::Concerns::SyncMapping.mapping_for(model, key)
13
13
  end
14
14
 
15
15
  def do_bulk_import(report_file_path, model, options: {}, mapping_key: nil, &blk)
@@ -1,3 +1,3 @@
1
1
  module CanvasSync
2
- VERSION = "0.18.7".freeze
2
+ VERSION = "0.18.9".freeze
3
3
  end
data/lib/canvas_sync.rb CHANGED
@@ -324,6 +324,13 @@ module CanvasSync
324
324
  raise "Invalid live event(s) specified: #{invalid.join(', ')}. Only #{SUPPORTED_LIVE_EVENTS.join(', ')} are supported."
325
325
  end
326
326
 
327
+ def logger
328
+ return @logger if defined? @logger
329
+ @logger = Logger.new(STDOUT)
330
+ @logger.level = Logger::DEBUG
331
+ @logger
332
+ end
333
+
327
334
  def redis(*args, &blk)
328
335
  JobBatches::Batch.redis(*args, &blk)
329
336
  end
@@ -15,11 +15,13 @@ RSpec.describe CanvasSync::Processors::ProvisioningReportProcessor do
15
15
  self.use_transactional_tests = false
16
16
  ActiveRecord::Migration.add_column :users, :sis_id, :string
17
17
  User.reset_column_information
18
+ User.instance_variable_set(:@schema_columns_hash, nil)
18
19
  end
19
20
 
20
21
  after do
21
22
  ActiveRecord::Migration.remove_column :users, :sis_id
22
23
  User.reset_column_information
24
+ User.instance_variable_set(:@schema_columns_hash, nil)
23
25
  self.use_transactional_tests = true
24
26
  end
25
27