fixes CNVS-23667
test plan
- set an enrollment to inactive via sis import
- run sis export it should have inactive instead of nil
Change-Id: I125698dde37a0511c1a196c25c414fc5fbbb9345
Reviewed-on: https://gerrit.instructure.com/64495
Tested-by: Jenkins
Reviewed-by: Cody Cutrer <cody@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: Rob Orton <rob@instructure.com>
fixes CNVS-23704
test plan
- regression test incoming sqs (see CNVS-21215)
Change-Id: I71cb0f2f49902c5d7d348da55301a129a74d0b18
Reviewed-on: https://gerrit.instructure.com/64188
Tested-by: Jenkins
Reviewed-by: Steven Burnett <sburnett@instructure.com>
QA-Review: Heath Hales <hhales@instructure.com>
Product-Review: Joel Hough <joel@instructure.com>
* don't treat suffix-like-names as suffixes when they're more likely
the given name
* even more so when it should already be in last-name-first context
test plan:
* have a user with the full name "Vi Duing", which should translate
to a sortable name of "Duing, Vi"
* do an LTI launch
* first name should come through as Vi, last name as duing
Change-Id: I2d728614af8ff421a5e14e8c2d116d9f0d0a2499
Reviewed-on: https://gerrit.instructure.com/63139
Tested-by: Jenkins
QA-Review: August Thornton <august@instructure.com>
Reviewed-by: Rob Orton <rob@instructure.com>
Product-Review: Cody Cutrer <cody@instructure.com>
fixes CNVS-20610
test plan:
- configure account to use kaltura (is this possible)
- upload a very short video via the new files page
- upload works
- after a reasonable amount of time (waiting for it
to transcode) you can preview the file via the files
pages
Change-Id: Ie874eca7fe9943e491282aac15019f25ec0c7713
Reviewed-on: https://gerrit.instructure.com/63604
Reviewed-by: Jacob Fugal <jacob@instructure.com>
Tested-by: Jenkins
QA-Review: Jeremy Putnam <jeremyp@instructure.com>
Product-Review: Jacob Fugal <jacob@instructure.com>
fixes CNVS-18507
test plan:
- enroll a few users in a course
- enroll a user from a different account
in that course
- log in as this user and visit the course
- from the account, as an admin run the
last_enrollment_activity report
- all the users in the course show up
including the user from the other account
- last activity shows your log in as the new user
Change-Id: I0729400f253ecd24b290a499f13eecd86a4f564e
Reviewed-on: https://gerrit.instructure.com/63513
Tested-by: Jenkins
Reviewed-by: Jacob Fugal <jacob@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: Jacob Fugal <jacob@instructure.com>
test case:
1. Create a Quiz with a question for each type.
2. Add at a few users to the course.
3. Create student submissions for the quiz with varying responses
4. When you log in as a teacher navigate to that quizzes statistics,
and click on the expansion button for a question.
5. Click on the response ratio for that question and a modal will show
displaying all the users that have responded to that question.
Change-Id: I5e23b42f6982683902124d734c36eedb9c5da7f7
Fixes: PFS-2227
Reviewed-on: https://gerrit.instructure.com/59720
Reviewed-by: Ryan Taylor <rtaylor@instructure.com>
Tested-by: Jenkins
QA-Review: Deepeeca Soundarrajan <dsoundarrajan@instructure.com>
Product-Review: Jason Sparks <jsparks@instructure.com>
Referencing the IP addresses by note is super convenient when managing
this interface.
Fixes CNVS-23385
Test Plan:
* Be careful when testing. You are affecting the same
* system that is used in production
From a rails console:
1. Whitelist an IP address with a note of your choice. Make sure
you invent a new note and don't reuse one that already exists.
AcademicBenchmarks::CliTools.whitelist_ip("3.3.3.3", "cool-note")
2. Now remove the IP address from the whitelist with:
AcademicBenchmarks::CliTools.remove_from_whitelist("<note-name")
Change-Id: I7cb1c1aac4d527fe2608c33bbc73b006abd6df69
Reviewed-on: https://gerrit.instructure.com/63703
Tested-by: Jenkins
Reviewed-by: Ryan Taylor <rtaylor@instructure.com>
QA-Review: Michael Hargiss <mhargiss@instructure.com>
Product-Review: Benjamin Porter <bporter@instructure.com>
fixes CNVS-21318
eager load will try and select all the columns of the joined table by
name. but due to race conditions, being in the middle of running
migrations, it's possible the process will know of a column that hasn't
been created yet. naming it in the select will break the query.
Change-Id: I71ddd01c77f8f6157e36a01103dff52b7b967284
test-plan: N/A
Reviewed-on: https://gerrit.instructure.com/63902
Reviewed-by: Cody Cutrer <cody@instructure.com>
Tested-by: Jenkins
Product-Review: Jacob Fugal <jacob@instructure.com>
QA-Review: Jacob Fugal <jacob@instructure.com>
test plan:
* import the package referenced in the ticket
* should work
closes #CNVS-23155
Change-Id: Iaf575356bb252ba4bebed557c79a56f490bb9dfe
Reviewed-on: https://gerrit.instructure.com/63853
Reviewed-by: Dan Minkevitch <dan@instructure.com>
Tested-by: Jenkins
QA-Review: Charles Kimball <ckimball@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
since other projects have been known to upgrade npm on a jenkins node in
the course of a build, affecting subsequent canvas builds ಠ_ಠ
test plan:
npm install should be happy on npm v3
Change-Id: I6767dac7dea7c8cfb4dfabbf94a29f6cccb00c15
Reviewed-on: https://gerrit.instructure.com/63708
Reviewed-by: Cody Cutrer <cody@instructure.com>
Product-Review: Jon Jensen <jon@instructure.com>
QA-Review: Jon Jensen <jon@instructure.com>
Tested-by: Jenkins
until we can update transifex at the same time as we merge the rename.
this reverts commits:
* f2cbb3e76e
(Updated zh_Hant translation)
* 9ab70066fd
(Updated zh translation)
* d861ceca74
(Updated fa-IR translation)
* aba0de7b96
(rename some locales)
Change-Id: I130a0a14e366274c86026bbaccad985a24bb4f1f
Reviewed-on: https://gerrit.instructure.com/63496
Reviewed-by: Cody Cutrer <cody@instructure.com>
Tested-by: Jenkins
Product-Review: Jacob Fugal <jacob@instructure.com>
QA-Review: Jacob Fugal <jacob@instructure.com>
fixes CNVS-19910
fixes CNVS-23061
* zh_Hant => zh-Hant (dash according to IETF standard)
* zh => zh-Hans (it's really simplified Chinese)
* fa-IR => fa (so that it will apply for _any_ Persian locale,
not just Iran)
also handle fallbacks for deprecated languages
test plan:
* _before_ applying this commit, change your language to one of
the locales being renamed
* apply the commit, but don't run the migration
* ensure that your Canvas is still translated, both normal and
JS translations
* run the migration
* you should still be translated, and in your user settings it shows
the correct language translation
Change-Id: If02793fce1db57856895899804f1389076093d0a
Reviewed-on: https://gerrit.instructure.com/57111
Reviewed-by: Jon Jensen <jon@instructure.com>
Tested-by: Jenkins
QA-Review: August Thornton <august@instructure.com>
Product-Review: Dan Minkevitch <dan@instructure.com>
Fixes PLAT-1232
test plan:
* go to developer keys UI
* you should be to deactive and reactivate keys
* deactivate a key that you have a token for
* the token should no longer work, even though it's not expired
Change-Id: I7388226c710ab0841692902886a49146a037e615
Reviewed-on: https://gerrit.instructure.com/50008
Tested-by: Jenkins
Reviewed-by: Nathan Mills <nathanm@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: Brad Horrocks <bhorrocks@instructure.com>
fixes CNVS-22899
test plan
- remove filename from a root attachment
- on a child attachment run
- a.find_existing_attachment_for_md5
- it should not error
Change-Id: I36edc4d0d28f04c80eef13d1c4cb1e322650b765
Reviewed-on: https://gerrit.instructure.com/62368
Tested-by: Jenkins
Reviewed-by: Jacob Fugal <jacob@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: Rob Orton <rob@instructure.com>
test plan:
- import the package attached to the ticket
- the essay questions should have prompts
fixes CNVS-22435
Change-Id: I2e623f7f73609c06be2b3f4b8202885d787d3255
Reviewed-on: https://gerrit.instructure.com/62426
Reviewed-by: James Williams <jamesw@instructure.com>
Tested-by: Jenkins
QA-Review: Charles Kimball <ckimball@instructure.com>
Product-Review: Jeremy Stanley <jeremy@instructure.com>
fixes: CNVS-22276
what this change does:
* changes it so if you have a 'host' set in canvs_cdn.yml,
when you run brandable_css it will push the css
files directly to s3 instead of writing them all to
disk.
* fixes the bug where brandable_css thought it had
to re-compile css files that have not changed
* changes the way we load css bundles that don't include
any branding or use any of the variant variables
(like: $use-high-contrast or $use-new-styles).
before, we generated a unique css file for each
variant and each brand for any of those bundles.
this will instead point everyone to same url if
the file uses none of those variables.
test plan:
* with no canvas_cdn.yml file:
* run compile_assets
* run it again, it should say "no changes" quickly
* the css in canvas should work
* now, rm -rf public/dist/brandable_css
* save a canvas_cdn.yml with proper s3/cloudfront settings
* compile_assets
* canvas should work and use the css that was uploaded
to s3 in previous step
* compile_assets again, it should say "no changes"
within a few seconds.
* if you can, delete a css file from s3 & run
brandable_css again. it should see that it needs
to regenerate that file and do so correctly.
when testing the css in the UI, especially make sure
to look for:
* try loading the equation editor in different variants,
(e.g.: high contrast, new styles, legacy) the css
for it should always be loaded from <cdn>/dist/brandable_css/no_variables/...
* keep your js console open, there should not be any 404s
* check the screenreader_gradebook
most of the changes actually happened in brandable_css:
https://github.com/ryankshaw/brandable_css/compare/6e0ddc59...master
when code-reviewing, please do a thorough scan of
those changes too.
Change-Id: Ie6efcedd92c3783e0b2dd194ec222b9dc28d0838
Change-Id: Ie6efcedd92c3783e0b2dd194ec222b9dc28d0838
Reviewed-on: https://gerrit.instructure.com/61495
Reviewed-by: Jacob Fugal <jacob@instructure.com>
Tested-by: Jenkins
QA-Review: August Thornton <august@instructure.com>
Product-Review: Rob Orton <rob@instructure.com>
We provide a guard against a nil api key and a nil user id, but not
against the empty string. This adds that check.
Fixes CNVS-21974
Test Plan:
1. set the Academic Benchmark API key to nil and try to schedule an
import.
2. Observe that the import fails by telling you that no API key is
set
3. Set the AB API key to the empty string and try to schedule an
import.
4. Observe that the import fails by telling you that no API key is
set
Change-Id: I2c96de9b541bec988f4b62fa52ed6200eeea5f1c
Reviewed-on: https://gerrit.instructure.com/58812
Reviewed-by: Cameron Sutter <csutter@instructure.com>
Tested-by: Jenkins
QA-Review: Adam Stone <astone@instructure.com>
Product-Review: Benjamin Porter <bporter@instructure.com>
limit the tempfile suffix to the last 50 chars of the filename
if it's longer than this. filenames (not display names) can get
very long quickly when they're non-ASCII because of URL encoding.
test plan: You should be able to upload a file named
Качество образования-1.txt
with local storage
fixes CNVS-22707
Change-Id: Ie2af770b6de8c1499d02c3cf396e6f831becfae7
Reviewed-on: https://gerrit.instructure.com/61949
Reviewed-by: Jon Willesen <jonw@instructure.com>
Tested-by: Jenkins
QA-Review: Charles Kimball <ckimball@instructure.com>
Product-Review: Jeremy Stanley <jeremy@instructure.com>
Fixes CNVS-22520
Test Plan:
** Be careful, because removing a job server's IP address **will**
affect production. Also make sure you remove the address you added,
otherwise you are leaving open a security hole. If you have any
questions at all, contact me and I'll help you :-) **
Using a rails console behind an already whitelisted ip address:
1. Query the list using:
- AcademicBenchmark::CliTools.whitelisted_ips
2. Observe that the whitelist is returned to you
3. Add an IP address to the whitelist. If at home, use your
home IP address. If at work, just use whatever
- AcademicBenchmark::CliTools.whitelist_ip("76.27.0.81",
"testaddress")
4. Re-query the list and observe that your address is now
present.
5. Check for whitelist like this:
- AcademicBenchmark::CliTools.whitelist?("76.27.0.81")
6. Now remove like this:
- AcademicBenchmark::CliTools.remove_from_whitelist?("76.27.0.81")
7. Re-query and make sure it's gone
Change-Id: Ic8f055cd5aa124f8b4c5a615f06d3415e709cb2b
Reviewed-on: https://gerrit.instructure.com/60879
Reviewed-by: John Corrigan <jcorrigan@instructure.com>
Tested-by: Jenkins
QA-Review: Michael Hargiss <mhargiss@instructure.com>
Product-Review: Benjamin Porter <bporter@instructure.com>
There are many operations that we are doing frequently, that we do by
hand each time. It's about time we start coding these up to save
us time in the console, especially since they are starting to get
risky.
Test Plan:
Import some outcomes, then delete them. Make sure they all delete.
To delete: From a rails console:
`AcademicBenchmark::CliTools.delete_imported_outcomes("<name-of-outcomes-root>")
the name of outcomes root would be "Iowa" if you did the iowa
outcomes, for example
Fixes CNVS-22601
Refs CNVS-22313
Change-Id: I4193fec741be9eb47d8c054a62371c8bfe469cb5
Reviewed-on: https://gerrit.instructure.com/60855
Tested-by: Jenkins
Reviewed-by: Ryan Taylor <rtaylor@instructure.com>
QA-Review: Deepeeca Soundarrajan <dsoundarrajan@instructure.com>
Product-Review: Benjamin Porter <bporter@instructure.com>
There are several fatal errors that can be encountered in an import.
these were previously being reported as warnings, which is not accurate.
Additionally, the error message was not being set properly so in the
outcomes import API we were getting back a null error message.
Fixes CNVS-22517
Test Plan:
Most of these conditions are difficult to reproduce because they result
from the Academic Benchmarks server. Therefore, there isn't really a
practical test plan we can do without building an emulator (which I
actually would like to do when we have a little time)
Change-Id: I521fc5250a3369497944cda5e44bbbc622f46681
Reviewed-on: https://gerrit.instructure.com/60876
Reviewed-by: John Corrigan <jcorrigan@instructure.com>
Product-Review: Benjamin Porter <bporter@instructure.com>
QA-Review: Benjamin Porter <bporter@instructure.com>
Tested-by: Jenkins
Fixes CNVS-22630
Test Plan:
Smoke test IMP against both types of queues
Change-Id: Icb88864b600ff76b389cd3858b70ee7898ec05f8
Reviewed-on: https://gerrit.instructure.com/61442
Tested-by: Jenkins
Reviewed-by: Joel Hough <joel@instructure.com>
QA-Review: Steven Shepherd <sshepherd@instructure.com>
Product-Review: Matthew Wheeler <mwheeler@instructure.com>
refs #CNVS-22013
Change-Id: I896d0e7cab498c40d76cce9e3aa450eda66bd548
Reviewed-on: https://gerrit.instructure.com/61521
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
Tested-by: Jenkins
QA-Review: Clare Strong <clare@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
test plan:
* image files and thumbnail creation should work as before
closes #CNVS-22544
Change-Id: I5631b392a4f4371d6fba2065608b8ce65175dcd5
Reviewed-on: https://gerrit.instructure.com/61078
Reviewed-by: Cody Cutrer <cody@instructure.com>
Tested-by: Jenkins
Reviewed-by: Dan Minkevitch <dan@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
This new version uses nokogiri instead of libxml-ruby.
refs CNVS-22298
test plan: basic regression test on moodle imports.
Change-Id: Iedfc6c2cd8c33fae5d76cd6e77eec293635c1051
Reviewed-on: https://gerrit.instructure.com/59917
Reviewed-by: James Williams <jamesw@instructure.com>
Tested-by: Jenkins
QA-Review: August Thornton <august@instructure.com>
Product-Review: Brian Palmer <brianp@instructure.com>
Fires off delayed job that hits the turnitin callback url,
creates a submission, and maps originality data into the turnitin_data
field.
Fixes PLAT-1167
Fixes PLAT-1169
Test Plan:
You'll need to have the TurnItIn LTI tool installed, and delayed_jobs
running
Create an assignment with the submission set to the External Tool for
turnitin.
As a student, submit the assignment.
wait for the delayed job to run. check out /jobs to see whats going on
After the job has ran you should see turnitin data, as you would
normally with the plugin
Change-Id: I5d60d250e91b422b5e77255d715abf2e4712f130
Reviewed-on: https://gerrit.instructure.com/59942
Tested-by: Jenkins
Reviewed-by: Nathan Mills <nathanm@instructure.com>
Product-Review: Nathan Mills <nathanm@instructure.com>
QA-Review: Nathan Mills <nathanm@instructure.com>
rails4 modifies _core_en.js while running compile_assets (presumably due
to new formats), this will allow the rails4 build to be selinimized
also whitelist selinimum's own files, since changes to them don't affect
the actual selenium tests
test plan:
1. rails3 and rails4 builds of this commit should get selinimized
Change-Id: I0f012f8e900f44290f258a791c96d5ab6e4cc095
Reviewed-on: https://gerrit.instructure.com/60010
Tested-by: Jenkins
Reviewed-by: James Williams <jamesw@instructure.com>
Product-Review: Jon Jensen <jon@instructure.com>
QA-Review: Jon Jensen <jon@instructure.com>
Fixes Plat-1168
Test-plan:
Submit a turnitin assignment using the lti tool
it should create a submission with the submitted file as an attachment
Change-Id: I37b24f8d2cb5c78f1247a0096f1afe2f3528abcb
Reviewed-on: https://gerrit.instructure.com/59701
Reviewed-by: Brad Horrocks <bhorrocks@instructure.com>
Tested-by: Jenkins
Product-Review: Nathan Mills <nathanm@instructure.com>
QA-Review: Nathan Mills <nathanm@instructure.com>
fixes a problem where sometimes quiz points were not correctly
specified because of migration_id collisions
closes #CNVS-22287
Change-Id: I311398570aa6186c9be9c3502329a46a0c30c555
Reviewed-on: https://gerrit.instructure.com/59780
Tested-by: Jenkins
Reviewed-by: Dan Minkevitch <dan@instructure.com>
QA-Review: Clare Strong <clare@instructure.com>
Product-Review: Dan Minkevitch <dan@instructure.com>
fixes PLAT-1166
test-plan:
install the turnitin lti tool
create an assignment using both the turnitin lti tool and the turnitin plugin
create a submission through the lti tool
result: the plugin should be disabled for that assignment
Change-Id: I4e89e33c61e5ad91e3b0125692631750b5199be1
Reviewed-on: https://gerrit.instructure.com/59360
Tested-by: Jenkins
Reviewed-by: Brad Horrocks <bhorrocks@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: Nathan Mills <nathanm@instructure.com>
test plan:
* using "mailto:example@example.com," in a link should
not break course copies (or anything else) because it
doesn't know how to rescue a URI::InvalidComponentError
closes #CNVS-22120
Change-Id: Iaac362a5bf33cd5fde05b01a578a1325f4126c6e
Reviewed-on: https://gerrit.instructure.com/59213
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Clare Strong <clare@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
Fixes https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-6459&cid=1
Changelog is @ https://github.com/mislav/will_paginate/commits/3-0-stable
will_paginate usage in canvas is wrapped in our folio gem, so this
actually involves updating folio. I've removed the direct dependency on
will_paginate in canvas, since folio defines that depenency and versioning.
test plan: regression test on api pagination links, including bookmarked apis
such as page views.
Change-Id: I8b7a07870d5280c307f368707a5e60aa900ba9f5
Reviewed-on: https://gerrit.instructure.com/55348
Tested-by: Jenkins
QA-Review: August Thornton <august@instructure.com>
Reviewed-by: Cody Cutrer <cody@instructure.com>
Product-Review: Brian Palmer <brianp@instructure.com>
refs #CNVS-21596
Change-Id: Ib412c0582ad10cae12b1a290715250e8ddcbb986
Reviewed-on: https://gerrit.instructure.com/59335
Tested-by: Jenkins
Reviewed-by: Cody Cutrer <cody@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
QA-Review: James Williams <jamesw@instructure.com>
addresses http://www.rubysec.com/advisories/CVE-2013-2616/
test plan: this is only used by attachment_fu -- ensure that uploaded files
still generate thumbnails correctly.
Change-Id: I4acd99c3720f51c10a0cc5ad2672f65e09b23911
Reviewed-on: https://gerrit.instructure.com/55349
Tested-by: Jenkins
Reviewed-by: Rob Orton <rob@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: Brian Palmer <brianp@instructure.com>
test plan:
* should fix quiz question point importing
* should also fix assignments for moodle 2.1 packages
(import the packages references in the ticket)
closes #CNVS-21870 #CNVS-21863
Change-Id: I6606721882f6e792b65bef0237c000441a9ba6d1
Reviewed-on: https://gerrit.instructure.com/59224
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Pedro Fajardo <pfajardo@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
Only quiz questions were being scored. This commit adds
LearningOutcomeResults for a quiz which determines mastery by
performance on the entire selection of questions.
This also records LearningOutcomeQuestionResults for each quiz
question outcome result.
Closes CNVS-13282
Test-Plan:
- Build out several question banks tied to learning outcomes
- Confirm nothing is broken.
- Confirm that outcomes are scored correctly
Change-Id: If2dd2c5f387071cec3c5634bcb74fc3f78283c64
Reviewed-on: https://gerrit.instructure.com/45381
Tested-by: Jenkins
Reviewed-by: John Corrigan <jcorrigan@instructure.com>
QA-Review: Michael Hargiss <mhargiss@instructure.com>
Product-Review: Ryan Taylor <rtaylor@instructure.com>
refs #CNVS-21596
Change-Id: I5dedaab90a2abe6bf288ff30401c9b31629b45b2
Reviewed-on: https://gerrit.instructure.com/59220
Tested-by: Jenkins
Reviewed-by: Cody Cutrer <cody@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
QA-Review: James Williams <jamesw@instructure.com>
refs #CNVS-21596
Change-Id: I430704d1f40aa8bcd54072a13ef55aa6a5332dd1
Reviewed-on: https://gerrit.instructure.com/58955
Tested-by: Jenkins
Reviewed-by: Cody Cutrer <cody@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
QA-Review: James Williams <jamesw@instructure.com>
refs CNVS-21215
test plan
- setup incoming mail processing
- cause an email duplicate to be sent (Mail gem and a console are
great for this. the message id has to be the same)
- ensure that the response is not double posted in canvas
Change-Id: I2e6872fa430b38b5dd9498ce8329bf2bbeeea7ce
Reviewed-on: https://gerrit.instructure.com/57566
Tested-by: Jenkins
Reviewed-by: Matthew Wheeler <mwheeler@instructure.com>
Product-Review: Matthew Wheeler <mwheeler@instructure.com>
QA-Review: Heath Hales <hhales@instructure.com>
before, we only used 'parallel' in asset generation
tasks, now we do it in prod too.
Change-Id: I107b339330173894942ba35f133d7e9602906b7c
Reviewed-on: https://gerrit.instructure.com/58839
Tested-by: Rob Orton <rob@instructure.com>
Reviewed-by: Rob Orton <rob@instructure.com>
Product-Review: Rob Orton <rob@instructure.com>
QA-Review: Rob Orton <rob@instructure.com>