Problem Statement:
If an instructor wants to create the quizzes for his course, he need follow a set of steps and need to to do it manually. If an instructor has set of rules designed for the quizzes, he/she can replicate the same quizzes for other courses.
Proposed Solution:
Need to design a script which first fetches all the courses available. Once we have a list of courses, will ask for specific course for which an instructor is interested to create a quiz. After making the selection for a respective course, other part scripts will create a quiz with the predefined set of rules.
Script Description:
- First, take the user's input such as course name and the quiz details like quiz name, description, type, the time limit
- Fetch all the courses belongs to the respective instructor with the help of course API (/api/v1/accounts/self/course)
- Filter the courses based on the user provided course name
- If we found the courses for the user's specified requirement make a call to create the quizzes
- It will take the quiz details and make a post call to create the quizzes (/api/v1/courses/:course_id/quizzes)
- Notify based on the response to the user.
Code Snippet:
<SPAN class="comment token">#Libraries to be import</SPAN><BR /><SPAN class="keyword token">require</SPAN> <SPAN class="string token">'typhoeus'</SPAN><BR /><SPAN class="keyword token">require</SPAN> <SPAN class="string token">'link_header'</SPAN><BR /><SPAN class="keyword token">require</SPAN> <SPAN class="string token">'json'</SPAN><BR /><BR />canvas_url <SPAN class="operator token">=</SPAN> <SPAN class="string token">''</SPAN> <SPAN class="comment token"><SPAN># put full canvas test url eg: </SPAN><A class="jive-link-external-small" href="https://school.test.instructure.com" rel="nofollow noopener noreferrer">https://school.test.instructure.com</A></SPAN><BR />canvas_token <SPAN class="operator token">=</SPAN> <SPAN class="string token">''</SPAN> <SPAN class="comment token"># put canvas API token here</SPAN><BR />api_endpoint <SPAN class="operator token">=</SPAN> <SPAN class="string token">'/api/v1/accounts/self/courses'</SPAN><BR /><BR /><SPAN class="comment token">#User inputs to create the quiz</SPAN><BR />course_name <SPAN class="operator token">=</SPAN> <SPAN class="string token">"GENERAL ZOOLOGY LAB"</SPAN><BR />quizz_detail <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><BR /> <SPAN class="string token">"title"</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="string token">"Test Quizz3"</SPAN><SPAN class="punctuation token">,</SPAN><BR /> <SPAN class="string token">"description"</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="string token">"Test Desc3"</SPAN><SPAN class="punctuation token">,</SPAN><BR /> <SPAN class="string token">"type"</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="string token">"practice_quiz"</SPAN><SPAN class="punctuation token">,</SPAN><BR /> <SPAN class="string token">"time_limit"</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="number token">160</SPAN><BR /><SPAN class="punctuation token">}</SPAN><BR /><BR /><BR /><SPAN class="comment token">#Function to create the quizzes</SPAN><BR /><SPAN class="keyword token">def</SPAN> <SPAN class="token function">createQuizzes</SPAN><SPAN class="punctuation token">(</SPAN>canvas_url<SPAN class="punctuation token">,</SPAN>canvas_token<SPAN class="punctuation token">,</SPAN>course<SPAN class="punctuation token">,</SPAN>quizz_detail<SPAN class="punctuation token">)</SPAN><BR /> <BR /> api_endpoint2 <SPAN class="operator token">=</SPAN> <SPAN class="string token">'api/v1/courses'</SPAN><BR /> id <SPAN class="operator token">=</SPAN> course<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"id"</SPAN><SPAN class="punctuation token">]</SPAN><BR /> request_url2 <SPAN class="operator token">=</SPAN> <SPAN class="string token">"<SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>canvas_url<SPAN class="delimiter token tag">}</SPAN></SPAN><SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>api_endpoint2<SPAN class="delimiter token tag">}</SPAN></SPAN>/<SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>id<SPAN class="delimiter token tag">}</SPAN></SPAN>/quizzes"</SPAN><BR /> <BR /> create_quizz <SPAN class="operator token">=</SPAN> <SPAN class="token constant">Typhoeus</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="symbol token">:Request</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="keyword token">new</SPAN><SPAN class="punctuation token">(</SPAN><BR /> request_url2<SPAN class="punctuation token">,</SPAN> <SPAN class="comment token">#we need a variable here because we need the api url to change</SPAN><BR /> method<SPAN class="punctuation token">:</SPAN> <SPAN class="symbol token">:post</SPAN><SPAN class="punctuation token">,</SPAN><BR /> headers<SPAN class="punctuation token">:</SPAN> <SPAN class="punctuation token">{</SPAN> authorization<SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"Bearer <SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>canvas_token<SPAN class="delimiter token tag">}</SPAN></SPAN>"</SPAN><SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN><BR /> params<SPAN class="punctuation token">:</SPAN> <SPAN class="punctuation token">{</SPAN><BR /> <SPAN class="string token">"quiz[title]"</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> quizz_detail<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"title"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN><BR /> <SPAN class="string token">"quiz[description]"</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> quizz_detail<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"description"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN><BR /> <SPAN class="string token">"quiz[quiz_type]"</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> quizz_detail<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"type"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN><BR /> <SPAN class="string token">"quiz[time_limit]"</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> quizz_detail<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"time_limit"</SPAN><SPAN class="punctuation token">]</SPAN> <BR /> <SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><BR /><BR /> create_quizz<SPAN class="punctuation token">.</SPAN>on_complete <SPAN class="keyword token">do</SPAN> <SPAN class="operator token">|</SPAN>response<SPAN class="operator token">|</SPAN><BR /> <SPAN class="keyword token">if</SPAN> response<SPAN class="punctuation token">.</SPAN>code <SPAN class="operator token">==</SPAN> <SPAN class="number token">200</SPAN><BR /> puts <SPAN class="string token">"Quizz created successfully for Course id <SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>id<SPAN class="delimiter token tag">}</SPAN></SPAN>"</SPAN><BR /> <SPAN class="keyword token">else</SPAN><BR /> puts <SPAN class="string token">"Something went wrong! Response code was <SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>response<SPAN class="punctuation token">.</SPAN>code<SPAN class="delimiter token tag">}</SPAN></SPAN>"</SPAN><BR /> <SPAN class="keyword token">end</SPAN><BR /> <SPAN class="keyword token">end</SPAN><BR /><BR /> create_quizz<SPAN class="punctuation token">.</SPAN>run<BR /><SPAN class="keyword token">end</SPAN><BR /><SPAN class="comment token">#End create quizz function</SPAN><BR /><BR /><BR /><SPAN class="comment token">#Variables initialisation</SPAN><BR />request_url <SPAN class="operator token">=</SPAN> <SPAN class="string token">"<SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>canvas_url<SPAN class="delimiter token tag">}</SPAN></SPAN><SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>api_endpoint<SPAN class="delimiter token tag">}</SPAN></SPAN>"</SPAN><BR />count <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN><BR />more_data <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">true</SPAN><BR />course_found <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">false</SPAN><BR /><BR /><SPAN class="keyword token">while</SPAN> more_data <SPAN class="comment token"># while more_data is true to keep looping through the data</SPAN><BR /><BR /> <SPAN class="comment token">#puts request_url #helps demonstrate pagination</SPAN><BR /> get_courses <SPAN class="operator token">=</SPAN> <SPAN class="token constant">Typhoeus</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="symbol token">:Request</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="keyword token">new</SPAN><SPAN class="punctuation token">(</SPAN><BR /> request_url<SPAN class="punctuation token">,</SPAN> <SPAN class="comment token">#we need a variable here because we need the api url to change</SPAN><BR /> method<SPAN class="punctuation token">:</SPAN> <SPAN class="symbol token">:get</SPAN><SPAN class="punctuation token">,</SPAN><BR /> headers<SPAN class="punctuation token">:</SPAN> <SPAN class="punctuation token">{</SPAN> authorization<SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"Bearer <SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>canvas_token<SPAN class="delimiter token tag">}</SPAN></SPAN>"</SPAN> <SPAN class="punctuation token">}</SPAN><BR /> <SPAN class="punctuation token">)</SPAN><BR /> get_courses<SPAN class="punctuation token">.</SPAN>on_complete <SPAN class="keyword token">do</SPAN> <SPAN class="operator token">|</SPAN>response<SPAN class="operator token">|</SPAN><BR /> <SPAN class="comment token">#get next link</SPAN><BR /> links <SPAN class="operator token">=</SPAN> <SPAN class="token constant">LinkHeader</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="token function">parse</SPAN><SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">.</SPAN>headers<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'link'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>links<BR /> next_link <SPAN class="operator token">=</SPAN> links<SPAN class="punctuation token">.</SPAN>find <SPAN class="punctuation token">{</SPAN> <SPAN class="operator token">|</SPAN>link<SPAN class="operator token">|</SPAN> link<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'rel'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="string token">'next'</SPAN> <SPAN class="punctuation token">}</SPAN> <BR /> request_url <SPAN class="operator token">=</SPAN> next_link<SPAN class="punctuation token">.</SPAN>href <SPAN class="keyword token">if</SPAN> next_link <BR /> <SPAN class="keyword token">if</SPAN> next_link <SPAN class="operator token">&&</SPAN> <SPAN class="string token">"<SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>response<SPAN class="punctuation token">.</SPAN>body<SPAN class="delimiter token tag">}</SPAN></SPAN>"</SPAN> <SPAN class="operator token">!=</SPAN> <SPAN class="string token">"[]"</SPAN><BR /> more_data <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">true</SPAN><BR /> <SPAN class="keyword token">else</SPAN><BR /> more_data <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">false</SPAN><BR /> <SPAN class="keyword token">end</SPAN><BR /> <SPAN class="comment token">#ends next link code</SPAN><BR /> <SPAN class="keyword token">if</SPAN> response<SPAN class="punctuation token">.</SPAN>code <SPAN class="operator token">==</SPAN> <SPAN class="number token">200</SPAN><BR /> data <SPAN class="operator token">=</SPAN> <SPAN class="token constant">JSON</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="token function">parse</SPAN><SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">.</SPAN>body<SPAN class="punctuation token">)</SPAN><BR /> data<SPAN class="punctuation token">.</SPAN><SPAN class="keyword token">each</SPAN> <SPAN class="keyword token">do</SPAN> <SPAN class="operator token">|</SPAN>courses<SPAN class="operator token">|</SPAN><BR /> count <SPAN class="operator token">+</SPAN><SPAN class="operator token">=</SPAN> <SPAN class="number token">1</SPAN><BR /> <SPAN class="keyword token">if</SPAN> courses<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'name'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> course_name<BR /> more_data <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">false</SPAN><BR /> course_found <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">true</SPAN><BR /> <SPAN class="token function">createQuizzes</SPAN><SPAN class="punctuation token">(</SPAN>canvas_url<SPAN class="punctuation token">,</SPAN>canvas_token<SPAN class="punctuation token">,</SPAN>courses<SPAN class="punctuation token">,</SPAN>quizz_detail<SPAN class="punctuation token">)</SPAN><BR /> <SPAN class="keyword token">end</SPAN><BR /> <SPAN class="keyword token">end</SPAN><BR /> <SPAN class="keyword token">else</SPAN><BR /> puts <SPAN class="string token">"Something went wrong! Response code was <SPAN class="interpolation token"><SPAN class="delimiter token tag">#{</SPAN>response<SPAN class="punctuation token">.</SPAN>code<SPAN class="delimiter token tag">}</SPAN></SPAN>"</SPAN><BR /> <SPAN class="keyword token">end</SPAN><BR /> <SPAN class="keyword token">end</SPAN><BR /> get_courses<SPAN class="punctuation token">.</SPAN>run<BR /><SPAN class="keyword token">end</SPAN><BR /><BR /><SPAN class="comment token">#If no course for user provided input </SPAN><BR /><SPAN class="keyword token">if</SPAN> <SPAN class="operator token">!</SPAN>course_found<BR /> puts <SPAN class="string token">"Course not found"</SPAN><BR /><SPAN class="keyword token">end</SPAN><BR /><BR />puts <SPAN class="string token">"Script done running"</SPAN><BR /><BR /><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>References:
Courses - Canvas LMS REST API Documentation
Quizzes - Canvas LMS REST API Documentation