canvas_sync 0.2.4 → 0.3.0
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/README.md +15 -1
- data/lib/canvas_sync/processors/model_mappings.yml +130 -0
- data/lib/canvas_sync/processors/provisioning_report_processor.rb +25 -175
- data/lib/canvas_sync/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a91540c9a7c6e087d7b9c3f21340e689c0b77da
|
4
|
+
data.tar.gz: 9aad571654e1fe0b167f2af732bb1f49f4204a1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0654cbfc7984fca42f257a9ba0644fb21edf01b3d12d65ab53af9ca5698760c416168208162ab63b8fd98ce992c220ab26303218ed189f31b21d94539c5c0414
|
7
|
+
data.tar.gz: 9a256cb21575fb57108c39570a5259a967dfc4aa509e2bd48790e8f27aa35b72cc94f1cff7b15db877a72941e8ff7a1783b9635e1e7ecfb35f652e88f6ff6aca
|
data/README.md
CHANGED
@@ -210,9 +210,23 @@ When adding to or updating this gem, make sure you do the following:
|
|
210
210
|
- Write specs
|
211
211
|
- If you modify the model or migration templates, run `bundle exec rake update_test_schema` to update them in the Rails Dummy application (and commit those changes)
|
212
212
|
|
213
|
+
|
214
|
+
## Mapping Overrides
|
215
|
+
|
216
|
+
If your local database columns do not match up with those expected by CanvasSync you can define overrides.
|
217
|
+
In your Rails config folder, the canvas_sync_provisioning_mapping.yml file contains overrides for custom database column names
|
218
|
+
|
219
|
+
```
|
220
|
+
users:
|
221
|
+
conflict_target: canvas_user_id # Represents the database column that will determine if we need to update
|
222
|
+
report_columns: # The keys specified here are the column names in the report CSV
|
223
|
+
canvas_user_id_column_name_in_report:
|
224
|
+
database_column_name: canvas_user_id_name_in_your_db
|
225
|
+
type: integer
|
226
|
+
```
|
227
|
+
|
213
228
|
## TODO
|
214
229
|
|
215
230
|
- Rethink how options are passed around. The current strategy of having "global_options" and per job options works
|
216
231
|
decently, but can be confusing. The difficulty is representing the options in a way that is easily serializable
|
217
232
|
by the queue adaptor and easily passed around.
|
218
|
-
- Add support for defining "mappings" if your models don't match up with what CanvasSync expects.
|
@@ -0,0 +1,130 @@
|
|
1
|
+
users:
|
2
|
+
conflict_target: canvas_user_id
|
3
|
+
report_columns:
|
4
|
+
canvas_user_id:
|
5
|
+
database_column_name: canvas_user_id
|
6
|
+
type: integer
|
7
|
+
user_id:
|
8
|
+
database_column_name: sis_id
|
9
|
+
type: string
|
10
|
+
email:
|
11
|
+
database_column_name: email
|
12
|
+
type: string
|
13
|
+
first_name:
|
14
|
+
database_column_name: first_name
|
15
|
+
type: string
|
16
|
+
last_name:
|
17
|
+
database_column_name: last_name
|
18
|
+
type: string
|
19
|
+
status:
|
20
|
+
database_column_name: status
|
21
|
+
type: string
|
22
|
+
login_id:
|
23
|
+
database_column_name: login_id
|
24
|
+
type: string
|
25
|
+
|
26
|
+
courses:
|
27
|
+
conflict_target: canvas_course_id
|
28
|
+
report_columns:
|
29
|
+
canvas_course_id:
|
30
|
+
database_column_name: canvas_course_id
|
31
|
+
type: integer
|
32
|
+
course_id:
|
33
|
+
database_column_name: sis_id
|
34
|
+
type: string
|
35
|
+
short_name:
|
36
|
+
database_column_name: short_name
|
37
|
+
type: string
|
38
|
+
long_name:
|
39
|
+
database_column_name: long_name
|
40
|
+
type: string
|
41
|
+
canvas_account_id:
|
42
|
+
database_column_name: canvas_account_id
|
43
|
+
type: integer
|
44
|
+
canvas_term_id:
|
45
|
+
database_column_name: canvas_term_id
|
46
|
+
type: integer
|
47
|
+
term_id:
|
48
|
+
database_column_name: term_sis_id
|
49
|
+
type: string
|
50
|
+
start_date:
|
51
|
+
database_column_name: start_date
|
52
|
+
type: datetime
|
53
|
+
end_date:
|
54
|
+
database_column_name: end_date
|
55
|
+
type: datetime
|
56
|
+
status:
|
57
|
+
database_column_name: status
|
58
|
+
type: integer
|
59
|
+
|
60
|
+
enrollments:
|
61
|
+
conflict_target: canvas_enrollment_id
|
62
|
+
report_columns:
|
63
|
+
canvas_enrollment_id:
|
64
|
+
database_column_name: canvas_enrollment_id
|
65
|
+
type: integer
|
66
|
+
canvas_course_id:
|
67
|
+
database_column_name: canvas_course_id
|
68
|
+
type: integer
|
69
|
+
course_id:
|
70
|
+
database_column_name: course_sis_id
|
71
|
+
type: string
|
72
|
+
canvas_user_id:
|
73
|
+
database_column_name: canvas_user_id
|
74
|
+
type: integer
|
75
|
+
user_id:
|
76
|
+
database_column_name: user_sis_id
|
77
|
+
type: string
|
78
|
+
role:
|
79
|
+
database_column_name: role
|
80
|
+
type: string
|
81
|
+
role_id:
|
82
|
+
database_column_name: role_id
|
83
|
+
type: integer
|
84
|
+
canvas_section_id:
|
85
|
+
database_column_name: canvas_section_id
|
86
|
+
type: integer
|
87
|
+
section_id:
|
88
|
+
database_column_name: section_sis_id
|
89
|
+
type: string
|
90
|
+
status:
|
91
|
+
database_column_name: status
|
92
|
+
type: string
|
93
|
+
base_role_type:
|
94
|
+
database_column_name: base_role_type
|
95
|
+
type: string
|
96
|
+
|
97
|
+
sections:
|
98
|
+
conflict_target: canvas_section_id
|
99
|
+
report_columns:
|
100
|
+
canvas_section_id:
|
101
|
+
database_column_name: canvas_section_id
|
102
|
+
type: integer
|
103
|
+
section_id:
|
104
|
+
database_column_name: sis_id
|
105
|
+
type: string
|
106
|
+
canvas_course_id:
|
107
|
+
database_column_name: canvas_course_id
|
108
|
+
type: integer
|
109
|
+
name:
|
110
|
+
database_column_name: name
|
111
|
+
type: string
|
112
|
+
status:
|
113
|
+
database_column_name: status
|
114
|
+
type: string
|
115
|
+
start_date:
|
116
|
+
database_column_name: start_date
|
117
|
+
type: datetime
|
118
|
+
end_date:
|
119
|
+
database_column_name: end_date
|
120
|
+
type: datetime
|
121
|
+
|
122
|
+
xlist:
|
123
|
+
conflict_target: canvas_section_id
|
124
|
+
report_columns:
|
125
|
+
canvas_section_id:
|
126
|
+
database_column_name: canvas_section_id
|
127
|
+
type: integer
|
128
|
+
canvas_nonxlist_course_id:
|
129
|
+
database_column_name: canvas_nonxlist_course_id
|
130
|
+
type: integer
|
@@ -1,175 +1,11 @@
|
|
1
1
|
require 'csv'
|
2
2
|
require 'activerecord-import'
|
3
3
|
require 'zip'
|
4
|
+
require 'yaml'
|
4
5
|
|
5
6
|
module CanvasSync
|
6
7
|
module Processors
|
7
8
|
class ProvisioningReportProcessor
|
8
|
-
# Used by the {CanvasSync::Importers::BulkImporter bulk importer}. The keys are
|
9
|
-
# CSV columns and the values are the database columns.
|
10
|
-
USERS_CSV_MAPPING = {
|
11
|
-
canvas_user_id: {
|
12
|
-
database_column_name: :canvas_user_id,
|
13
|
-
type: :integer
|
14
|
-
},
|
15
|
-
user_id: {
|
16
|
-
database_column_name: :sis_id,
|
17
|
-
type: :string
|
18
|
-
},
|
19
|
-
email: {
|
20
|
-
database_column_name: :email,
|
21
|
-
type: :string
|
22
|
-
},
|
23
|
-
first_name: {
|
24
|
-
database_column_name: :first_name,
|
25
|
-
type: :string
|
26
|
-
},
|
27
|
-
last_name: {
|
28
|
-
database_column_name: :last_name,
|
29
|
-
type: :string
|
30
|
-
},
|
31
|
-
status: {
|
32
|
-
database_column_name: :status,
|
33
|
-
type: :string
|
34
|
-
},
|
35
|
-
login_id: {
|
36
|
-
database_column_name: :login_id,
|
37
|
-
type: :string
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
COURSES_CSV_MAPPING = {
|
42
|
-
canvas_course_id: {
|
43
|
-
database_column_name: :canvas_course_id,
|
44
|
-
type: :integer
|
45
|
-
},
|
46
|
-
course_id: {
|
47
|
-
database_column_name: :sis_id,
|
48
|
-
type: :string
|
49
|
-
},
|
50
|
-
short_name: {
|
51
|
-
database_column_name: :short_name,
|
52
|
-
type: :string
|
53
|
-
},
|
54
|
-
long_name: {
|
55
|
-
database_column_name: :long_name,
|
56
|
-
type: :string
|
57
|
-
},
|
58
|
-
canvas_account_id: {
|
59
|
-
database_column_name: :canvas_account_id,
|
60
|
-
type: :integer
|
61
|
-
},
|
62
|
-
canvas_term_id: {
|
63
|
-
database_column_name: :canvas_term_id,
|
64
|
-
type: :integer
|
65
|
-
},
|
66
|
-
term_id: {
|
67
|
-
database_column_name: :term_sis_id,
|
68
|
-
type: :string
|
69
|
-
},
|
70
|
-
start_date: {
|
71
|
-
database_column_name: :start_date,
|
72
|
-
type: :datetime
|
73
|
-
},
|
74
|
-
end_date: {
|
75
|
-
database_column_name: :end_date,
|
76
|
-
type: :datetime
|
77
|
-
},
|
78
|
-
status: {
|
79
|
-
database_column_name: :status,
|
80
|
-
type: :integer
|
81
|
-
}
|
82
|
-
}
|
83
|
-
|
84
|
-
ENROLLMENTS_CSV_MAPPING = {
|
85
|
-
canvas_enrollment_id: {
|
86
|
-
database_column_name: :canvas_enrollment_id,
|
87
|
-
type: :integer
|
88
|
-
},
|
89
|
-
canvas_course_id: {
|
90
|
-
database_column_name: :canvas_course_id,
|
91
|
-
type: :integer
|
92
|
-
},
|
93
|
-
course_id: {
|
94
|
-
database_column_name: :course_sis_id,
|
95
|
-
type: :string
|
96
|
-
},
|
97
|
-
canvas_user_id: {
|
98
|
-
database_column_name: :canvas_user_id,
|
99
|
-
type: :integer
|
100
|
-
},
|
101
|
-
user_id: {
|
102
|
-
database_column_name: :user_sis_id,
|
103
|
-
type: :string
|
104
|
-
},
|
105
|
-
role: {
|
106
|
-
database_column_name: :role,
|
107
|
-
type: :string
|
108
|
-
},
|
109
|
-
role_id: {
|
110
|
-
database_column_name: :role_id,
|
111
|
-
type: :integer
|
112
|
-
},
|
113
|
-
canvas_section_id: {
|
114
|
-
database_column_name: :canvas_section_id,
|
115
|
-
type: :integer
|
116
|
-
},
|
117
|
-
section_id: {
|
118
|
-
database_column_name: :section_sis_id,
|
119
|
-
type: :string
|
120
|
-
},
|
121
|
-
status: {
|
122
|
-
database_column_name: :status,
|
123
|
-
type: :string
|
124
|
-
},
|
125
|
-
base_role_type: {
|
126
|
-
database_column_name: :base_role_type,
|
127
|
-
type: :string
|
128
|
-
}
|
129
|
-
}
|
130
|
-
|
131
|
-
SECTIONS_CSV_MAPPING = {
|
132
|
-
canvas_section_id: {
|
133
|
-
database_column_name: :canvas_section_id,
|
134
|
-
type: :integer
|
135
|
-
},
|
136
|
-
section_id: {
|
137
|
-
database_column_name: :sis_id,
|
138
|
-
type: :string
|
139
|
-
},
|
140
|
-
canvas_course_id: {
|
141
|
-
database_column_name: :canvas_course_id,
|
142
|
-
type: :integer
|
143
|
-
},
|
144
|
-
name: {
|
145
|
-
database_column_name: :name,
|
146
|
-
type: :string
|
147
|
-
},
|
148
|
-
status: {
|
149
|
-
database_column_name: :status,
|
150
|
-
type: :string
|
151
|
-
},
|
152
|
-
start_date: {
|
153
|
-
database_column_name: :start_date,
|
154
|
-
type: :datetime
|
155
|
-
},
|
156
|
-
end_date: {
|
157
|
-
database_column_name: :end_date,
|
158
|
-
type: :datetime
|
159
|
-
}
|
160
|
-
}
|
161
|
-
|
162
|
-
XLIST_CSV_MAPPING = {
|
163
|
-
canvas_section_id: {
|
164
|
-
database_column_name: :canvas_section_id,
|
165
|
-
type: :integer
|
166
|
-
},
|
167
|
-
canvas_nonxlist_course_id: {
|
168
|
-
database_column_name: :canvas_nonxlist_course_id,
|
169
|
-
type: :integer
|
170
|
-
}
|
171
|
-
}
|
172
|
-
|
173
9
|
# Processes a provisioning report using the bulk importer.
|
174
10
|
#
|
175
11
|
# options must contain a models key. If there is only one model
|
@@ -224,9 +60,9 @@ module CanvasSync
|
|
224
60
|
def bulk_process_users(report_file_path)
|
225
61
|
CanvasSync::Importers::BulkImporter.import(
|
226
62
|
report_file_path,
|
227
|
-
|
63
|
+
mapping[:users][:report_columns],
|
228
64
|
User,
|
229
|
-
:
|
65
|
+
mapping[:users][:conflict_target].to_sym,
|
230
66
|
true
|
231
67
|
)
|
232
68
|
end
|
@@ -234,18 +70,18 @@ module CanvasSync
|
|
234
70
|
def bulk_process_courses(report_file_path)
|
235
71
|
CanvasSync::Importers::BulkImporter.import(
|
236
72
|
report_file_path,
|
237
|
-
|
73
|
+
mapping[:courses][:report_columns],
|
238
74
|
Course,
|
239
|
-
:
|
75
|
+
mapping[:courses][:conflict_target].to_sym
|
240
76
|
)
|
241
77
|
end
|
242
78
|
|
243
79
|
def bulk_process_enrollments(report_file_path)
|
244
80
|
CanvasSync::Importers::BulkImporter.import(
|
245
81
|
report_file_path,
|
246
|
-
|
82
|
+
mapping[:enrollments][:report_columns],
|
247
83
|
Enrollment,
|
248
|
-
:
|
84
|
+
mapping[:enrollments][:conflict_target].to_sym,
|
249
85
|
true
|
250
86
|
)
|
251
87
|
end
|
@@ -253,20 +89,34 @@ module CanvasSync
|
|
253
89
|
def bulk_process_sections(report_file_path)
|
254
90
|
CanvasSync::Importers::BulkImporter.import(
|
255
91
|
report_file_path,
|
256
|
-
|
92
|
+
mapping[:sections][:report_columns],
|
257
93
|
Section,
|
258
|
-
:
|
94
|
+
mapping[:sections][:conflict_target].to_sym
|
259
95
|
)
|
260
96
|
end
|
261
97
|
|
262
98
|
def bulk_process_xlist(report_file_path)
|
263
99
|
CanvasSync::Importers::BulkImporter.import(
|
264
100
|
report_file_path,
|
265
|
-
|
101
|
+
mapping[:xlist][:report_columns],
|
266
102
|
Section,
|
267
|
-
:
|
103
|
+
mapping[:xlist][:conflict_target].to_sym
|
268
104
|
)
|
269
105
|
end
|
106
|
+
|
107
|
+
def mapping
|
108
|
+
@mapping ||= begin
|
109
|
+
mapping = YAML::load_file(File.join(__dir__, 'model_mappings.yml')).deep_symbolize_keys!
|
110
|
+
override_filepath = Rails.root.join("config/canvas_sync_provisioning_mapping.yml")
|
111
|
+
|
112
|
+
if File.file?(override_filepath)
|
113
|
+
override = YAML::load_file(override_filepath).deep_symbolize_keys!
|
114
|
+
mapping = mapping.merge(override)
|
115
|
+
end
|
116
|
+
|
117
|
+
mapping
|
118
|
+
end
|
119
|
+
end
|
270
120
|
end
|
271
121
|
end
|
272
122
|
end
|
data/lib/canvas_sync/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canvas_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nate Collings
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -309,6 +309,7 @@ files:
|
|
309
309
|
- lib/canvas_sync/jobs/sync_provisioning_report_job.rb
|
310
310
|
- lib/canvas_sync/jobs/sync_terms_job.rb
|
311
311
|
- lib/canvas_sync/jobs/sync_users_job.rb
|
312
|
+
- lib/canvas_sync/processors/model_mappings.yml
|
312
313
|
- lib/canvas_sync/processors/provisioning_report_processor.rb
|
313
314
|
- lib/canvas_sync/version.rb
|
314
315
|
- spec/canvas_sync/canvas_sync_spec.rb
|