canvas_sync 0.27.14 → 0.27.15
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 +4 -4
- data/lib/canvas_sync/jobs/report_starter.rb +5 -1
- data/lib/canvas_sync/jobs/report_sync_task.rb +4 -1
- data/lib/canvas_sync/jobs/sync_provisioning_report_job.rb +1 -1
- data/lib/canvas_sync/version.rb +1 -1
- data/lib/canvas_sync.rb +65 -86
- data/spec/canvas_sync/jobs/sync_provisioning_report_job_spec.rb +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5b9df64b18232b05db0d002ff124845da7e8b5b04e712024047122e5ee3d228d
|
|
4
|
+
data.tar.gz: 9537a34a09178f945eca6342159b005491c38fb52848ebd1c095358a57718354
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '0647553723168ca27615daff30aa6a3ed746e68c11d559e51db31e6710a665572668765431ffcfe01f3db7807d2dd938be80f33987c47cd852477435264519a0'
|
|
7
|
+
data.tar.gz: 57031d7dd3884bbdf2f8c8af966e9ccdeb257011537aee39ba23ab261c3dee38b2dc32f69957b1d3d4d2b294d1fa0da88ff6736118091917b7b017830c9dfb1d
|
|
@@ -53,9 +53,13 @@ module CanvasSync
|
|
|
53
53
|
processor_class = processor_class_name.constantize
|
|
54
54
|
account_id = options[:account_id] || context[:account_id] || "self"
|
|
55
55
|
|
|
56
|
+
# The old ReportProcessorJob passed `batch_context.merge(options)` (e.g. sync_start_time)
|
|
57
|
+
# through to the processor; preserve that here for old custom Processor subclasses.
|
|
58
|
+
merged_options = state.merge(options)
|
|
59
|
+
|
|
56
60
|
# The old processor signature: process(file_path, options, report_id)
|
|
57
61
|
# Note: The third param was report_id in ReportProcessorJob but was account_id in practice
|
|
58
|
-
processor_class.process(file,
|
|
62
|
+
processor_class.process(file, merged_options, account_id)
|
|
59
63
|
end
|
|
60
64
|
end
|
|
61
65
|
end
|
|
@@ -146,10 +146,13 @@ module CanvasSync
|
|
|
146
146
|
end
|
|
147
147
|
|
|
148
148
|
def do_bulk_import(report_file_path, model, options: {}, mapping_key: nil, &blk)
|
|
149
|
-
|
|
149
|
+
import_options = { sync_start_time: state[:sync_start_time] }.merge(options)
|
|
150
|
+
Processors::ReportProcessor.new().do_bulk_import(report_file_path, model, options: import_options, mapping_key: mapping_key, &blk)
|
|
150
151
|
end
|
|
151
152
|
|
|
152
153
|
class ReportTaskJob < CanvasSync::Job
|
|
154
|
+
discard_on FatalReportError
|
|
155
|
+
|
|
153
156
|
protected
|
|
154
157
|
|
|
155
158
|
def canvas_account_id
|
|
@@ -16,7 +16,7 @@ module CanvasSync
|
|
|
16
16
|
params[model] = true
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
merged_params = merge_report_params(options, params)
|
|
19
|
+
merged_params = merge_report_params(options, params).with_indifferent_access
|
|
20
20
|
|
|
21
21
|
# Make sure the report also checks last_activity_at when checking updated_at
|
|
22
22
|
if options[:models].include?("enrollments")
|
data/lib/canvas_sync/version.rb
CHANGED
data/lib/canvas_sync.rb
CHANGED
|
@@ -27,66 +27,53 @@ module CanvasSync
|
|
|
27
27
|
JobBatches = Joblin::Batching
|
|
28
28
|
JobUniqueness = Joblin::Uniqueness
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
users
|
|
32
|
-
pseudonyms
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
enrollments
|
|
39
|
-
sections
|
|
40
|
-
assignments
|
|
41
|
-
submissions
|
|
42
|
-
roles
|
|
43
|
-
admins
|
|
44
|
-
assignment_groups
|
|
45
|
-
context_modules
|
|
46
|
-
context_module_items
|
|
47
|
-
xlist
|
|
48
|
-
user_observers
|
|
49
|
-
grading_periods
|
|
50
|
-
grading_period_groups
|
|
51
|
-
content_migrations
|
|
52
|
-
learning_outcomes
|
|
53
|
-
learning_outcome_results
|
|
54
|
-
course_nicknames
|
|
55
|
-
rubrics
|
|
56
|
-
rubric_associations
|
|
57
|
-
rubric_assessments
|
|
58
|
-
course_progresses
|
|
59
|
-
assignment_overrides
|
|
60
|
-
scores
|
|
61
|
-
].freeze
|
|
30
|
+
KNOWN_MODELS = {
|
|
31
|
+
users: { job: :provisioning, term_scoped: false },
|
|
32
|
+
pseudonyms: { job: :provisioning, term_scoped: false },
|
|
33
|
+
user_observers: { job: :provisioning, term_scoped: false },
|
|
34
|
+
grading_periods: { job: :provisioning, term_scoped: false },
|
|
35
|
+
grading_period_groups: { job: :provisioning, term_scoped: false },
|
|
36
|
+
learning_outcomes: { job: :provisioning, term_scoped: false },
|
|
37
|
+
learning_outcome_results: { job: :provisioning, term_scoped: false },
|
|
62
38
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
context_modules
|
|
68
|
-
context_module_items
|
|
69
|
-
rubrics
|
|
70
|
-
rubric_associations
|
|
71
|
-
rubric_assessments
|
|
72
|
-
course_progresses
|
|
73
|
-
assignment_overrides
|
|
74
|
-
scores
|
|
75
|
-
].freeze
|
|
39
|
+
terms: { job: CanvasSync::Jobs::SyncTermsJob, term_scoped: false },
|
|
40
|
+
accounts: { job: CanvasSync::Jobs::SyncAccountsJob, term_scoped: false },
|
|
41
|
+
roles: { job: CanvasSync::Jobs::SyncRolesJob, term_scoped: false },
|
|
42
|
+
admins: { job: CanvasSync::Jobs::SyncAdminsJob, term_scoped: false },
|
|
76
43
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
44
|
+
groups: { job: :provisioning, term_scoped: false },
|
|
45
|
+
group_memberships: { job: :provisioning, term_scoped: false },
|
|
46
|
+
|
|
47
|
+
courses: { job: :provisioning, term_scoped: true },
|
|
48
|
+
course_nicknames: { job: :provisioning, term_scoped: true },
|
|
49
|
+
sections: { job: :provisioning, term_scoped: true },
|
|
50
|
+
xlist: { job: :provisioning, term_scoped: true },
|
|
51
|
+
|
|
52
|
+
context_modules: { job: CanvasSync::Jobs::SyncContextModulesJob, term_scoped: true },
|
|
53
|
+
context_module_items: { job: CanvasSync::Jobs::SyncContextModuleItemsJob, term_scoped: true },
|
|
54
|
+
content_migrations: { job: CanvasSync::Jobs::SyncContentMigrationsJob, term_scoped: true },
|
|
55
|
+
|
|
56
|
+
enrollments: { job: :provisioning, term_scoped: true },
|
|
57
|
+
course_progresses: { job: CanvasSync::Jobs::SyncCourseProgressesJob, term_scoped: true },
|
|
58
|
+
|
|
59
|
+
assignments: { job: CanvasSync::Jobs::SyncAssignmentsJob, term_scoped: true },
|
|
60
|
+
assignment_groups: { job: CanvasSync::Jobs::SyncAssignmentGroupsJob, term_scoped: true },
|
|
61
|
+
assignment_overrides: { job: CanvasSync::Jobs::SyncAssignmentOverridesJob, term_scoped: true },
|
|
62
|
+
submissions: { job: CanvasSync::Jobs::SyncSubmissionsJob, term_scoped: true },
|
|
63
|
+
scores: { job: CanvasSync::Jobs::SyncScoresJob, term_scoped: true },
|
|
64
|
+
|
|
65
|
+
rubrics: { job: CanvasSync::Jobs::SyncRubricsJob, term_scoped: false },
|
|
66
|
+
rubric_associations: { job: CanvasSync::Jobs::SyncRubricAssociationsJob, term_scoped: false },
|
|
67
|
+
rubric_assessments: { job: CanvasSync::Jobs::SyncRubricAssessmentsJob, term_scoped: false },
|
|
68
|
+
}.with_indifferent_access.freeze
|
|
69
|
+
|
|
70
|
+
SUPPORTED_MODELS = KNOWN_MODELS.keys.map(&:to_s).freeze
|
|
71
|
+
|
|
72
|
+
SUPPORTED_TERM_SCOPE_MODELS = KNOWN_MODELS.select { |_, v| v[:term_scoped] }.keys.map(&:to_s).freeze
|
|
73
|
+
|
|
74
|
+
DEFAULT_TERM_SCOPE_MODELS = SUPPORTED_TERM_SCOPE_MODELS
|
|
75
|
+
|
|
76
|
+
PROVISIONING_REPORT_MODELS = KNOWN_MODELS.select { |_, v| v[:job] == :provisioning }.keys.map(&:to_s).freeze
|
|
90
77
|
|
|
91
78
|
SUPPORTED_LIVE_EVENTS = %w[
|
|
92
79
|
course
|
|
@@ -182,26 +169,7 @@ module CanvasSync
|
|
|
182
169
|
options = options.deep_symbolize_keys!
|
|
183
170
|
|
|
184
171
|
given_models = models.dup
|
|
185
|
-
|
|
186
|
-
model_job_map = {
|
|
187
|
-
terms: CanvasSync::Jobs::SyncTermsJob,
|
|
188
|
-
accounts: CanvasSync::Jobs::SyncAccountsJob,
|
|
189
|
-
roles: CanvasSync::Jobs::SyncRolesJob,
|
|
190
|
-
admins: CanvasSync::Jobs::SyncAdminsJob,
|
|
191
|
-
|
|
192
|
-
assignments: CanvasSync::Jobs::SyncAssignmentsJob,
|
|
193
|
-
submissions: CanvasSync::Jobs::SyncSubmissionsJob,
|
|
194
|
-
assignment_groups: CanvasSync::Jobs::SyncAssignmentGroupsJob,
|
|
195
|
-
assignment_overrides: CanvasSync::Jobs::SyncAssignmentOverridesJob,
|
|
196
|
-
context_modules: CanvasSync::Jobs::SyncContextModulesJob,
|
|
197
|
-
context_module_items: CanvasSync::Jobs::SyncContextModuleItemsJob,
|
|
198
|
-
content_migrations: CanvasSync::Jobs::SyncContentMigrationsJob,
|
|
199
|
-
course_progresses: CanvasSync::Jobs::SyncCourseProgressesJob,
|
|
200
|
-
rubrics: CanvasSync::Jobs::SyncRubricsJob,
|
|
201
|
-
rubric_associations: CanvasSync::Jobs::SyncRubricAssociationsJob,
|
|
202
|
-
rubric_assessments: CanvasSync::Jobs::SyncRubricAssessmentsJob,
|
|
203
|
-
scores: CanvasSync::Jobs::SyncScoresJob,
|
|
204
|
-
}.with_indifferent_access
|
|
172
|
+
term_scoped_models = term_scoped_models & SUPPORTED_TERM_SCOPE_MODELS
|
|
205
173
|
|
|
206
174
|
root_chain = base_canvas_sync_chain(**kwargs, globals: options[:global] || kwargs[:globals])
|
|
207
175
|
concurrent_root_chain = JobBatches::ChainBuilder.new(JobBatches::ConcurrentBatchJob)
|
|
@@ -211,7 +179,8 @@ module CanvasSync
|
|
|
211
179
|
|
|
212
180
|
try_add_model_job = ->(model) {
|
|
213
181
|
return unless models.include?(model)
|
|
214
|
-
|
|
182
|
+
return if KNOWN_MODELS[model][:job] == :provisioning
|
|
183
|
+
current_chain << { job: KNOWN_MODELS[model][:job].to_s, options: options[model.to_sym] || {} }
|
|
215
184
|
models -= [model]
|
|
216
185
|
}
|
|
217
186
|
|
|
@@ -219,20 +188,26 @@ module CanvasSync
|
|
|
219
188
|
# General provisioning jobs (not term-scoped)
|
|
220
189
|
##############################
|
|
221
190
|
|
|
191
|
+
models -= ['terms']
|
|
192
|
+
|
|
222
193
|
# Accounts, users, roles, and admins cannot be scoped to term
|
|
223
194
|
try_add_model_job.call('accounts')
|
|
224
195
|
|
|
225
|
-
#
|
|
226
|
-
#
|
|
196
|
+
# We could safely remove the unless wrapping, but it allows us to just merge these models into
|
|
197
|
+
# the later provisioning report so we do it w/ one report instead of two.
|
|
227
198
|
unless term_scope == false
|
|
228
|
-
|
|
199
|
+
# These Models use the provisioning report, but are not term-scoped,
|
|
200
|
+
# so we sync them outside of the term scoping to ensure work is not duplicated
|
|
201
|
+
first_provisioning_models = (models - term_scoped_models) & PROVISIONING_REPORT_MODELS
|
|
202
|
+
models -= first_provisioning_models
|
|
229
203
|
current_chain.insert(generate_provisioning_jobs(first_provisioning_models, options))
|
|
230
204
|
end
|
|
231
205
|
|
|
232
206
|
try_add_model_job.call('roles')
|
|
233
207
|
try_add_model_job.call('admins')
|
|
234
208
|
|
|
235
|
-
(SUPPORTED_TERM_SCOPE_MODELS - term_scoped_models).each do |mdl|
|
|
209
|
+
# (SUPPORTED_TERM_SCOPE_MODELS - term_scoped_models).each do |mdl|
|
|
210
|
+
(models - term_scoped_models).each do |mdl|
|
|
236
211
|
try_add_model_job.call(mdl)
|
|
237
212
|
end
|
|
238
213
|
|
|
@@ -242,22 +217,26 @@ module CanvasSync
|
|
|
242
217
|
|
|
243
218
|
term_parent_chain = current_chain
|
|
244
219
|
|
|
245
|
-
per_term_chain = JobBatches::ChainBuilder.build(
|
|
220
|
+
per_term_chain = JobBatches::ChainBuilder.build(KNOWN_MODELS['terms'][:job].to_s, term_scope: term_scope)
|
|
246
221
|
current_chain = per_term_chain
|
|
247
222
|
|
|
248
223
|
term_scoped_models.each do |mdl|
|
|
249
224
|
try_add_model_job.call(mdl)
|
|
250
225
|
end
|
|
251
226
|
|
|
227
|
+
prov_rep_models = models & PROVISIONING_REPORT_MODELS
|
|
228
|
+
models -= prov_rep_models
|
|
252
229
|
current_chain.insert(
|
|
253
|
-
generate_provisioning_jobs(
|
|
230
|
+
generate_provisioning_jobs(prov_rep_models, options)
|
|
254
231
|
)
|
|
255
232
|
|
|
256
233
|
# Skip syncing terms if not required
|
|
257
|
-
if !current_chain.empty? || (
|
|
234
|
+
if !current_chain.empty? || (given_models & ['terms']).present?
|
|
258
235
|
term_parent_chain << per_term_chain
|
|
259
236
|
end
|
|
260
237
|
|
|
238
|
+
raise ArgumentError, "Some models were not processed: #{models.join(', ')}" if models.present?
|
|
239
|
+
|
|
261
240
|
###############################
|
|
262
241
|
# Wrap it all up
|
|
263
242
|
###############################
|
|
@@ -17,7 +17,7 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
|
|
|
17
17
|
'courses' => true,
|
|
18
18
|
enrollment_term_id: term.canvas_id,
|
|
19
19
|
}
|
|
20
|
-
})
|
|
20
|
+
}.with_indifferent_access)
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -33,7 +33,7 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
|
|
|
33
33
|
'users' => true,
|
|
34
34
|
'courses' => true,
|
|
35
35
|
}
|
|
36
|
-
})
|
|
36
|
+
}.with_indifferent_access)
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
end
|