github-to-canvas 0.0.55 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,56 +1,141 @@
1
1
  require_relative './github-to-canvas/create_canvas_lesson'
2
2
  require_relative './github-to-canvas/update_canvas_lesson'
3
+ require_relative './github-to-canvas/canvas_dotfile'
4
+ require_relative './github-to-canvas/repository_interface'
3
5
  require_relative './github-to-canvas/repository_converter'
4
6
  require_relative './github-to-canvas/github_interface'
5
7
  require_relative './github-to-canvas/canvas_interface'
6
- require_relative './github-to-canvas/canvas_dotfile'
8
+ require_relative './github-to-canvas/course_creation_interface'
9
+
7
10
  require_relative './github-to-canvas/version'
8
11
 
12
+ require 'yaml'
13
+
9
14
  class GithubToCanvas
10
15
 
11
- def initialize(mode:,
12
- course:nil,
13
- id:nil,
14
- filepath:Dir.pwd,
15
- file_to_convert:'README.md',
16
- branch:'master',
17
- name:File.basename(Dir.getwd),
18
- type:"page",
19
- save_to_github:false,
20
- fis_links:false,
21
- remove_header_and_footer:false,
22
- only_update_content: false,
23
- forkable: false)
24
-
25
- if mode == 'version'
16
+ def initialize(options)
17
+ case options[:mode]
18
+ when 'version'
26
19
  puts VERSION
27
- end
28
-
29
- if mode == 'query'
30
- CanvasInterface.get_course_info(course, id)
31
- end
32
-
33
- if mode == 'remote'
34
- lesson_data = CanvasInterface.get_lesson_info(course, id)
35
- if !lesson_data[1]
36
- puts "No lesson with id #{id} was found in course #{course}."
37
- else
38
- pp lesson_data[0]
39
- puts "\nLesson Type: #{lesson_data[1]}"
40
- end
20
+ when 'query'
21
+ CanvasInterface.get_course_info(options[:course_id], options[:id])
22
+ when 'map'
23
+ CanvasInterface.map_course_info(options[:file_to_convert])
24
+ when 'canvas_read'
25
+ puts CanvasInterface.read_lesson(options[:filepath])
26
+ when 'github_read'
27
+ markdown = GithubInterface.read_remote(options[:filepath])
28
+ puts RepositoryConverter.convert_to_html(markdown)
29
+ when 'create' # used with a local repo
30
+ html = RepositoryConverter.local_file_conversion(options)
31
+ name = RepositoryInterface.get_name(options[:filepath], html)
32
+ html = RepositoryConverter.adjust_converted_html(options, html)
33
+ response = CanvasInterface.create_lesson(options, name, html)
34
+ RepositoryInterface.local_repo_post_submission(options, response)
35
+ puts "Canvas lesson created. Lesson available at #{response['html_url']}"
36
+ when 'align' # used with a local repo
37
+ html = RepositoryConverter.local_file_conversion(options)
38
+ name = RepositoryInterface.get_name(options[:filepath], html)
39
+ html = RepositoryConverter.adjust_converted_html(options, html)
40
+ CanvasInterface.update_all_related_lessons(options, name, html)
41
41
 
42
+ when 'github_create'
43
+ html = RepositoryConverter.remote_file_conversion(options)
44
+ name = RepositoryInterface.get_name(options[:filepath], html)
45
+ html = RepositoryConverter.adjust_converted_html(options, html)
42
46
 
43
- end
47
+ response = CanvasInterface.create_lesson(options, name, html)
48
+
49
+ puts "Canvas lesson created. Lesson available at #{response['html_url']}"
50
+ when 'github_align'
51
+ html = RepositoryConverter.remote_file_conversion(options)
52
+ name = RepositoryInterface.get_name(options[:filepath], html)
53
+ html = RepositoryConverter.adjust_converted_html(options, html)
54
+ response = CanvasInterface.update_existing_lesson(options, name, html)
55
+ puts "Canvas lesson updated. Lesson available at #{response['html_url']}"
56
+ when 'build_course'
57
+ course_yaml = YAML.load(File.read(options[:file_to_convert]))
58
+ # Create Course
59
+ created_course_info = CanvasInterface.create_course(course_yaml)
60
+ puts "Course created - #{created_course_info["id"]}"
44
61
 
45
- if mode == 'create'
46
- puts "github-to-canvas will now create a Canvas lesson based on the current repo"
47
- CreateCanvasLesson.new(course, filepath, file_to_convert, branch, name, type, save_to_github, fis_links, remove_header_and_footer, forkable)
48
- end
62
+ course_yaml[:modules].each { |module_info|
63
+ # Create each module
64
+ created_module_info = CanvasInterface.create_module(created_course_info["id"], module_info)
65
+ puts "Module created - #{created_module_info['name']}"
66
+ module_info[:lessons].each { |lesson|
67
+ # Create each lesson
68
+ options[:type] = lesson["type"].downcase
69
+ options[:course_id] = created_course_info["id"]
70
+ options[:filepath] = lesson["repository"]
71
+
72
+
73
+ html = RepositoryConverter.remote_file_conversion(options)
74
+ # Add each lesson to it's module
75
+
76
+ html = RepositoryConverter.adjust_converted_html(options, html)
77
+ created_lesson_info = CanvasInterface.create_lesson(options, lesson["title"], html)
78
+ lesson = lesson.merge(created_lesson_info)
79
+
80
+ lesson["page_url"] = lesson["url"] if !lesson["page_url"]
81
+
82
+ response = CanvasInterface.add_to_module(created_course_info["id"], created_module_info, lesson)
83
+
84
+ puts "Lesson added to #{created_module_info['name']} - #{lesson['title']}"
85
+ sleep(1)
86
+ }
87
+ }
88
+ when 'add_to_course'
89
+ course_yaml = YAML.load(File.read(options[:file_to_convert]))
49
90
 
50
- if mode == 'align'
51
- puts "github-to-canvas will now align any existing Canvas lessons based on the current repo. NOTE: .canvas file must be present"
52
- UpdateCanvasLesson.new(course, filepath, file_to_convert, branch, name, type, save_to_github, fis_links, remove_header_and_footer, only_update_content, id, forkable)
91
+ course_yaml[:modules].each { |module_info|
92
+ # Create each module
93
+ created_module_info = CanvasInterface.create_module(options[:course_id], module_info)
94
+ puts "Module created - #{created_module_info['name']}"
95
+ module_info[:lessons].each { |lesson|
96
+ # Create each lesson
97
+
98
+ options[:type] = lesson["type"].downcase
99
+ options[:filepath] = lesson["repository"]
100
+ html = RepositoryConverter.remote_file_conversion(options)
101
+ # Add each lesson to it's module
102
+ html = RepositoryConverter.adjust_converted_html(options, html)
103
+ created_lesson_info = CanvasInterface.create_lesson(options, lesson["title"], html)
104
+ lesson = lesson.merge(created_lesson_info)
105
+ response = CanvasInterface.add_to_module(options[:course_id], created_module_info, lesson)
106
+
107
+ puts "Lesson added to #{created_module_info['name']} - #{lesson['title']}"
108
+ sleep(1)
109
+ }
110
+ }
111
+ when 'update_course_lessons'
112
+ course_yaml = YAML.load(File.read(options[:file_to_convert]))
113
+ options[:course_id] = course_yaml[:id]
114
+ course_yaml[:modules].each { |module_info|
115
+ puts "Updating #{module_info[:name]}"
116
+ module_info[:lessons].each { |lesson|
117
+ if lesson["repository"] == ""
118
+ puts "No repository found for #{lesson['title']}"
119
+ next
120
+ end
121
+ options[:id] = lesson['id']
122
+ options[:type] = lesson["type"].downcase
123
+ options[:filepath] = lesson["repository"]
124
+ options[:branch] = 'master'
125
+ html = RepositoryConverter.remote_file_conversion(options)
126
+
127
+ html = RepositoryConverter.adjust_converted_html(options, html)
128
+ created_lesson_info = CanvasInterface.update_existing_lesson(options, lesson["title"], html)
129
+ lesson = lesson.merge(created_lesson_info)
130
+
131
+
132
+ puts "Lesson updated - #{lesson['title']}"
133
+ sleep(1)
134
+ }
135
+ }
136
+ else
137
+ puts VERSION
53
138
  end
54
139
  end
55
-
140
+
56
141
  end
@@ -5,21 +5,21 @@ class CanvasDotfile
5
5
  File.file?(".canvas")
6
6
  end
7
7
 
8
- def self.update_or_create(filepath, response, course, type)
8
+ def self.update_or_create(options, response)
9
9
  if self.exists?
10
- if type == "assignment" || type == "discussion"
11
- canvas_data = self.update_assignment_data(response, course, type)
10
+ if options[:type] == "assignment" || options[:type] == "discussion"
11
+ canvas_data = self.update_assignment_data(response, options[:course_id], options[:type])
12
12
  else
13
- canvas_data = self.update_page_data(response, course, type)
13
+ canvas_data = self.update_page_data(response, options[:course_id], options[:type])
14
14
  end
15
15
  else
16
- if type == "assignment" || type == "discussion"
17
- canvas_data = self.create_assignment_data(response, course, type)
16
+ if options[:type] == "assignment" || options[:type] == "discussion"
17
+ canvas_data = self.create_assignment_data(response, options[:course_id], options[:type])
18
18
  else
19
- canvas_data = self.create_page_data(response, course, type)
19
+ canvas_data = self.create_page_data(response, options[:course_id], options[:type])
20
20
  end
21
21
  end
22
- self.create_canvas_dotfile(filepath, canvas_data)
22
+ self.create_canvas_dotfile(options[:filepath], canvas_data)
23
23
  end
24
24
 
25
25
  def self.create_canvas_dotfile(filepath, canvas_data)
@@ -64,7 +64,7 @@ class CanvasDotfile
64
64
 
65
65
  def self.update_page_data(response, course, type)
66
66
  canvas_data = YAML.load(File.read(".canvas"))
67
- if canvas_data[:lessons].none? { |lesson| lesson[:page_id] == response['page_id'] && lesson[:course_id] == course.to_i && lesson[:canvas_url] == response['html_url']}
67
+ if canvas_data[:lessons].none? { |lesson| lesson[:id] == response['page_id'] && lesson[:course_id] == course.to_i && lesson[:canvas_url] == response['html_url']}
68
68
  lesson_data = {
69
69
  id: response['page_id'],
70
70
  course_id: course.to_i,
@@ -1,7 +1,143 @@
1
1
  require 'json'
2
2
  require 'rest-client'
3
+ require 'yaml'
3
4
  class CanvasInterface
4
5
 
6
+ def self.create_course(course_info)
7
+ # POST /api/v1/accounts/:account_id/courses
8
+ url = "#{ENV['CANVAS_API_PATH']}/accounts/1/courses"
9
+ payload = {
10
+ 'course[name]' => course_info[:name],
11
+ 'course[course_code]' => course_info[:course_code]
12
+ }
13
+ response = RestClient.post(url, payload, self.headers)
14
+ JSON.parse(response)
15
+ end
16
+
17
+ def self.create_module(course_id, module_info)
18
+ # POST /api/v1/courses/:course_id/modules
19
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/modules"
20
+ payload = {
21
+ 'module[name]' => module_info[:name]
22
+ }
23
+ response = RestClient.post(url, payload, headers={
24
+ "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
25
+ })
26
+ JSON.parse(response)
27
+ end
28
+
29
+ def self.create_lesson(options, name, html)
30
+ if options[:type] == 'discussion'
31
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{options[:course_id]}/#{options[:type]}_topics"
32
+ else
33
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{options[:course_id]}/#{options[:type]}s"
34
+ end
35
+ payload = self.build_payload(options, name, html)
36
+ begin
37
+ response = RestClient.post(url, payload, self.headers)
38
+ rescue
39
+ puts "Something went wrong while pushing lesson #{options[:id]} to course #{options[:course_id]}"
40
+ abort
41
+ end
42
+ if ![200, 201].include? response.code
43
+ puts "Canvas push failed. #{response.code} status code returned "
44
+ abort
45
+ end
46
+ JSON.parse(response.body)
47
+ end
48
+
49
+ def self.create_quiz(options, quiz_data)
50
+
51
+ end
52
+
53
+ def self.add_to_module(course_id, module_info, lesson_info)
54
+ # POST /api/v1/courses/:course_id/modules/:module_id/items
55
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/modules/#{module_info["id"]}/items"
56
+
57
+ if lesson_info["type"] == "Page"
58
+ payload = {
59
+ 'module_item[title]' => lesson_info["title"],
60
+ 'module_item[type]' => lesson_info["type"],
61
+ 'module_item[indent]' => 0,
62
+ 'module_item[completion_requirement][type]' => 'must_view'
63
+ }
64
+ elsif lesson_info["type"] == "Quiz"
65
+ puts "Quiz needs to be added manually - #{lesson_info['title']} - lesson_info["
66
+ else
67
+
68
+ payload = {
69
+ 'module_item[title]' => lesson_info["title"],
70
+ 'module_item[type]' => lesson_info["type"],
71
+ 'module_item[indent]' => 1,
72
+ 'module_item[completion_requirement][type]' => 'must_submit'
73
+ }
74
+ end
75
+ begin
76
+ response = RestClient.post(url, payload, self.headers)
77
+ rescue
78
+ puts "Something went wrong while add lesson #{lesson_info["id"]} to module #{module_info["id"]} in course #{course_id}" if lesson_info["type"] == "Assignment"
79
+ puts "Something went wrong while add lesson #{lesson_info["page_url"]} to module #{module_info["id"]} in course #{course_id}" if lesson_info["type"] == "Page"
80
+ abort
81
+ end
82
+
83
+
84
+ response
85
+
86
+ end
87
+
88
+ def self.update_existing_lesson(options, name, html)
89
+ if options[:type] == "discussion"
90
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{options[:course_id]}/#{options[:type]}_topics/#{options[:id]}"
91
+ else
92
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{options[:course_id]}/#{options[:type]}s/#{options[:id]}"
93
+ end
94
+ payload = self.build_payload(options, name, html)
95
+
96
+ begin
97
+ headers = self.headers
98
+ if options[:type] == 'page'
99
+ response = RestClient.get(url, headers)
100
+ lesson_info = JSON.parse(response)
101
+ url = url.sub(/[^\/]+$/, lesson_info["page_id"].to_s)
102
+ end
103
+ response = RestClient.put(url, payload, headers)
104
+ rescue
105
+ puts "Something went wrong while pushing lesson #{options[:id]} to course #{options[:course_id]}"
106
+ puts "Make sure you are working on lessons that are not locked"
107
+ abort
108
+ ""
109
+ end
110
+ JSON.parse(response.body)
111
+ end
112
+
113
+ def self.update_all_related_lessons(options, name, html)
114
+ # Read the local .canvas file if --id <ID> is not used. Otherwise, use provided ID (--course <COURSE> also required)
115
+ if !options[:id]
116
+ canvas_data = CanvasDotfile.read_canvas_data
117
+ response = nil
118
+ canvas_data[:lessons] = canvas_data[:lessons].map { |lesson|
119
+ response = self.update_existing_lesson(lesson, name, html)
120
+ options[:id] = lesson[:id]
121
+ options[:course_id] = lesson[:course_id]
122
+ options[:type] = lesson[:type]
123
+
124
+ }
125
+ RepositoryInterface.local_repo_post_submission(options, response)
126
+ puts "Canvas lesson updated. Lesson available at #{response['html_url']}"
127
+ else
128
+ # If an ID (and course) are provided, they are used instead of the .canvas file
129
+ # Gets the current lesson's type (page or assignment)
130
+
131
+ options[:type] = self.get_lesson_info(options[:course_id], options[:id])[1]
132
+
133
+ # Implements update on Canvas
134
+ response = self.update_existing_lesson(options, name, html)
135
+ RepositoryInterface.local_repo_post_submission(options, response)
136
+ puts "Canvas lesson updated. Lesson available at #{response['html_url']}"
137
+ end
138
+
139
+ end
140
+
5
141
  def self.get_lesson_info(course, id)
6
142
 
7
143
  lesson_types = ["quizzes", "assignments", "pages", "discussion_topics"]
@@ -14,6 +150,7 @@ class CanvasInterface
14
150
  info = ""
15
151
  lesson_type_urls.each do |url|
16
152
  begin
153
+
17
154
  response = RestClient.get(url, headers={
18
155
  "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
19
156
  })
@@ -41,34 +178,64 @@ class CanvasInterface
41
178
  return
42
179
  end
43
180
 
181
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{course}"
182
+ response = RestClient.get(url, self.headers)
183
+ course_data = JSON.parse(response)
184
+
185
+ # /api/v1/courses/:course_id/modules
186
+ course_info = {
187
+ name: course_data['name'],
188
+ id: course_data['id'],
189
+ modules: []
190
+ }
191
+
44
192
  begin
45
- results = []
46
193
  index = 1
47
194
 
48
195
  while !!index
49
- url = "#{ENV['CANVAS_API_PATH']}/courses/#{course}/pages?order=asc&sort=title&page=#{index}&per_page=10"
196
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{course}/modules?page=#{index}&per_page=20"
50
197
  index += 1
51
- response = RestClient.get(url, headers={
52
- "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
53
- })
54
- pages = JSON.parse(response.body)
55
- if ([200, 201].include? response.code) && (!pages.empty?)
56
- results = results + pages
198
+ response = RestClient.get(url, self.headers)
199
+ modules = JSON.parse(response.body)
200
+
201
+ if ([200, 201].include? response.code) && (!modules.empty?)
202
+ course_info[:modules] = course_info[:modules] + modules
57
203
  else
58
204
  index = nil
59
205
  end
60
206
  end
61
- puts ""
62
- puts ""
63
- puts "Info for Course #{course} from #{ENV['CANVAS_API_PATH']}"
64
- puts ""
65
- puts "## Pages ##"
66
- puts "Title : Page ID"
67
- puts ""
68
-
69
- results.each {|result|
70
- puts "#{result['title']} : #{result['page_id']}"
71
- }
207
+
208
+ course_info[:modules] = course_info[:modules].map do |mod|
209
+ new_mod = {
210
+ id: mod['id'],
211
+ name: mod['name'],
212
+ lessons: []
213
+ }
214
+ index = 1
215
+ while !!index
216
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{course}/modules/#{mod['id']}/items?page=#{index}&per_page=20"
217
+ index += 1
218
+ response = RestClient.get(url, headers={
219
+ "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
220
+ })
221
+ lessons = JSON.parse(response.body)
222
+ lessons = lessons.map do |lesson|
223
+ lesson = lesson.slice("id","title","name","indent","type","html_url","page_url","url","completion_requirement", "published")
224
+ lesson["repository"] = ""
225
+ lesson['id'] = lesson['url'].gsub(/^(.*[\\\/])/,'')
226
+ lesson
227
+ end
228
+ if ([200, 201].include? response.code) && (!lessons.empty?)
229
+ new_mod[:lessons] = new_mod[:lessons] + lessons
230
+ else
231
+ index = nil
232
+ end
233
+
234
+ end
235
+ new_mod
236
+ end
237
+
238
+ puts course_info.to_yaml
72
239
 
73
240
  rescue
74
241
  puts "Something went wrong while getting info about course #{course}"
@@ -76,82 +243,174 @@ class CanvasInterface
76
243
  end
77
244
  end
78
245
 
79
- def self.submit_to_canvas(course_id, type, name, readme)
80
- response = self.push_to_canvas(course_id, type, name, readme)
81
- if ![200, 201].include? response.code
82
- puts "Canvas push failed. #{response.code} status code returned "
83
- abort
84
- end
85
- JSON.parse(response.body)
86
- end
246
+ def self.map_course_info(file_to_convert)
247
+ course_info = YAML.load(File.read("#{Dir.pwd}/#{file_to_convert}"))
248
+ course_info[:modules] = course_info[:modules].map do |mod|
249
+ mod[:lessons] = mod[:lessons].map do |lesson|
87
250
 
88
- def self.push_to_canvas(course_id, type, name, new_readme)
89
- if type == 'discussion'
90
- url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}_topics"
91
- else
92
- url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}s"
93
- end
94
- payload = self.build_payload(type, name, new_readme, false)
95
- begin
96
- RestClient.post(url, payload, headers={
97
- "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
98
- })
99
- rescue
100
- puts "Something went wrong while pushing lesson #{id} to course #{course_id}"
101
- abort
251
+ url = lesson["url"]
252
+ response = RestClient.get(url, headers={
253
+ "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
254
+ })
255
+ begin
256
+ lesson_data = JSON.parse(response)
257
+ contents = lesson_data["body"] if lesson["type"] == "Page"
258
+ contents = lesson_data["message"] if lesson["type"] == "Discussion"
259
+ contents = lesson_data["description"] if lesson["type"] == "Assignment" || lesson["type"] == "Quiz"
260
+ if contents.nil?
261
+ repo = ""
262
+ else
263
+ if contents[/data-repo=\"(.*?)"/]
264
+ repo = contents[/data-repo=\"(.*?)"/]
265
+ repo = repo.slice(11..-2)
266
+ elsif contents[/class=\"fis-git-link\" href=\"(.*?)"/]
267
+ repo = contents[/class=\"fis-git-link\" href=\"(.*?)"/]
268
+ repo = repo.slice(27..-2)
269
+ else
270
+ repo = ""
271
+ end
272
+ end
273
+ rescue
274
+ puts 'Error while mapping course info.'
275
+ abort
276
+ end
277
+
278
+ if repo != nil && repo != ""
279
+ if repo.include?('https://github.com/learn-co-curriculum/')
280
+ lesson["repository"] = repo
281
+ else
282
+ lesson["repository"] = "https://github.com/learn-co-curriculum/" + repo
283
+ end
284
+ end
285
+ sleep(1)
286
+ lesson
287
+ end
288
+ mod
102
289
  end
290
+ puts course_info.to_yaml
103
291
  end
104
292
 
105
- def self.update_existing_lesson(course_id, id, type, name, new_readme, only_update_content)
106
- if type == "discussion"
107
- url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}_topics/#{id}"
108
- else
109
- url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}s/#{id}"
110
- end
111
- payload = self.build_payload(type, name, new_readme, only_update_content)
112
- begin
113
- RestClient.put(url, payload, headers={
114
- "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
115
- })
116
- rescue
117
- puts "Something went wrong while pushing lesson #{id} to course #{course_id}"
118
- nil
119
- end
293
+ def self.submit_to_canvas(course_id, type, name, readme)
294
+
120
295
  end
121
296
 
122
- def self.build_payload(type, name, new_readme, only_update_content)
123
- if only_update_content
124
- if type == "assignment"
297
+
298
+
299
+
300
+ def self.build_payload(options, name, html)
301
+ if options[:only_update_content]
302
+ if options[:type] == "assignment"
125
303
  payload = {
126
- 'assignment[description]' => new_readme
304
+ 'assignment[description]' => html
127
305
  }
128
- elsif type == "discussion"
306
+ elsif options[:type] == "discussion"
129
307
  payload = {
130
- 'message' => new_readme
308
+ 'message' => html
131
309
  }
132
310
  else
133
311
  payload = {
134
- 'wiki_page[body]' => new_readme
312
+ 'wiki_page[body]' => html
135
313
  }
136
314
  end
137
315
  else
138
- if type == "assignment"
316
+ if options[:type] == "assignment"
139
317
  payload = {
140
318
  'assignment[name]' => name,
141
- 'assignment[description]' => new_readme
319
+ 'assignment[description]' => html,
320
+ 'assignment[submission_types][]' => "online_url",
321
+ 'assignment[grading_type]' => 'pass_fail',
322
+ 'assignment[points_possible]' => 1
142
323
  }
143
- elsif type == "discussion"
324
+ elsif options[:type] == "discussion"
144
325
  payload = {
145
326
  'title' => name,
146
- 'message' => new_readme
327
+ 'message' => html
147
328
  }
148
329
  else
149
330
  payload = {
150
331
  'wiki_page[title]' => name,
151
- 'wiki_page[body]' => new_readme,
332
+ 'wiki_page[body]' => html,
152
333
  'wiki_page[editing_roles]' => "teachers"
153
334
  }
154
335
  end
155
336
  end
156
337
  end
338
+
339
+ def self.read_lesson(url)
340
+ types = ["page", "assignment", "quiz", "discussion"]
341
+ type = types.find {|type| url.match(type)}
342
+ if !url.include?(ENV['CANVAS_API_PATH'])
343
+ url = url.sub(/^.*\/\/.*?\//,"#{ENV['CANVAS_API_PATH']}/")
344
+ end
345
+
346
+ response = RestClient.get(url, headers={
347
+ "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
348
+ })
349
+ lesson_info = JSON.parse(response)
350
+ lesson_info = lesson_info.slice("title",
351
+ "name",
352
+ "description",
353
+ "body",
354
+ "message",
355
+ "shuffle_answers",
356
+ "allowed_attempts",
357
+ "question_count"
358
+ )
359
+ lesson_info["type"] = type.capitalize
360
+ if lesson_info["type"] == "Quiz"
361
+ url = url + "/questions"
362
+ response = RestClient.get(url, headers={
363
+ "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
364
+ })
365
+ lesson_info["questions"] = JSON.parse(response)
366
+ lesson_info["questions"] = lesson_info["questions"].map do |question|
367
+ question.slice("id",
368
+ "position",
369
+ "question_name",
370
+ "question_type",
371
+ "question_text",
372
+ "points_possible",
373
+ "correct_comments_html",
374
+ "incorrect_comments_html",
375
+ "neutral_comments_html",
376
+ "answers"
377
+ )
378
+ end
379
+ end
380
+ lesson_info.to_yaml
381
+ end
382
+
383
+ def self.create_lesson_from_remote(course_id, module_id, lesson_type, raw_url, yaml_file)
384
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/modules/#{module_id}/items"
385
+ if yaml_file
386
+ data = YAML.load(File.read("#{Dir.pwd}/#{yaml_file}"))
387
+ payload = {
388
+ 'module_item[type]' => data["type"],
389
+ 'module_item[title]' => data["title"]
390
+ }
391
+ else
392
+
393
+ end
394
+
395
+
396
+ end
397
+
398
+ def self.headers
399
+ {
400
+ "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
401
+ }
402
+ end
403
+
404
+ # def self.create_quiz_from_remote(course_id, module_id, lesson_type, raw_url)
405
+ # url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/quizzes"
406
+ # payload = {
407
+ # 'quiz[title]' =>
408
+ # }
409
+ # /api/v1/courses/:course_id/quizzes
410
+ # data = YAML.load(File.read("#{Dir.pwd}/#{yaml_file}"))
411
+ # payload = {
412
+ # 'module_item[type]' => data["type"],
413
+ # 'module_item[title]' => data["title"]
414
+ # }
415
+ # end
157
416
  end