github-to-canvas 0.0.55 → 0.1.1

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.
@@ -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