Commit Graph

54110 Commits

Author SHA1 Message Date
Chris Soto d916265963 content participation for peer reviews
content participation was not being updated for peer review comment or
rubric assessments if a teacher had not already done a comment or
assessment. badge counts should be updated for automatically posted
assignments when another student leaves a comment or rubric assessment.
this change has the content participation only check to make sure
the submission is posted? if it's a manually posted assignment.

fixes EVAL-2860
flag=visibility_feedback_student_grades_page
flag=assignments_2_student

test plan:
- create a peer review assignment with rubric
- assign a student to review another student's assignment
- submit the assignment for both students. then as the reviewer, leave
  a comment on the assignment. also do rubric assessment
- as the reviewee student, verify that the badge count increases and you
  are also able to mark the comment and rubric assessment as read by
  clicking onto the icons in the student grades page

Change-Id: I045cf4bf0ca910bd1bda999bf2c132d6133fd455
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310487
Reviewed-by: Spencer Olson <solson@instructure.com>
Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com>
QA-Review: Kai Bjorkman <kbjorkman@instructure.com>
Product-Review: Jody Sailor
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
2023-02-13 20:37:32 +00:00
Chris Soto ac8b57269f fix grades badge count update on not_graded change
currently with peer_reviews_for_a2, if assignment changes to/from
not_graded, the badge count does not update.

fixes EVAL-2863
flag=assignments_2_student
flag=peer_reviews_for_a2

test plan:
- as teacher, create an assignment with points
- leave a comment on the assignment for a student
- as student, verify the badge count is now 1
- as teacher, change the submission_types (Display Grade as) for the
  assignment to "Not Graded"
- as student, verify the badge count is now 0
- as teacher, change the submission_types (Display Grade as) back to
  points
- as student, verify the badge count is 1 again

Change-Id: I0b9729b1373b2f47303783007e29e96f9109fb25
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310590
Reviewed-by: Derek Williams <derek.williams@instructure.com>
Reviewed-by: Spencer Olson <solson@instructure.com>
QA-Review: Kai Bjorkman <kbjorkman@instructure.com>
Product-Review: Jody Sailor
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
2023-02-13 20:36:18 +00:00
Andrea Cirulli 1017c1469e Revert "pin snyk to 1.1100.0"
[change-merged]
[build-registry-path=jenkins/canvas-lms/snyk1103]

This reverts commit 830112257c.

Reason for revert: <INSERT REASONING HERE>

Change-Id: I9f0cae8f6adf0a2d834f2c97d9fb5cb1c7701c88
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310317
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: James Butters <jbutters@instructure.com>
QA-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
Product-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
Build-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
2023-02-13 20:04:48 +00:00
Aaron Ogata bade766ae0 bump pg to latest version
Change-Id: I10b1f3a4d761945bcabf389d8fcb3e945a18dbf6
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310653
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jacob Burroughs <jburroughs@instructure.com>
QA-Review: Aaron Ogata <aogata@instructure.com>
Product-Review: Aaron Ogata <aogata@instructure.com>
Build-Review: Aaron Ogata <aogata@instructure.com>
2023-02-13 19:26:58 +00:00
Andrea Cirulli 830112257c pin snyk to 1.1100.0
[change-merged]
[build-registry-path=jenkins/canvas-lms/snyk1100]

Change-Id: I22664b9042f1fd6e662b5150ca16a704ef5217f0
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310971
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: James Butters <jbutters@instructure.com>
QA-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
Product-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
Build-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
2023-02-13 18:30:00 +00:00
Spencer Olson 637681fa2d respond to quizzes.next prevStudent and nextStudent messages
closes EVAL-2841
flag=new_quizzes_grade_by_question_in_speedgrader

Test Plan:
1. Enable "Quizzes.Next Grade by Question in SpeedGrader" and
   "Single Quizzes.Next Session in SpeedGrader"

2. Go to SpeedGrader for a Quizzes.Next quiz.

3. In the browser console, enter the following and notice SpeedGrader
   navigates to the previous student:

   window.parent.postMessage({subject: 'quizzesNext.previousStudent'}, '*')

4. In the browser console, enter the following and notice SpeedGrader
   navigates to the next student:

   window.parent.postMessage({subject: 'quizzesNext.nextStudent'}, '*')

Change-Id: I584d175947f5cf7dfbd243bea39b98dda74c46d6
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310488
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Derek Williams <derek.williams@instructure.com>
Reviewed-by: Christopher Soto <christopher.soto@instructure.com>
Reviewed-by: Dustin Cowles <dustin.cowles@instructure.com>
QA-Review: Kai Bjorkman <kbjorkman@instructure.com>
Product-Review: Cameron Ray <cameron.ray@instructure.com>
2023-02-13 18:15:17 +00:00
Charley Kline 947f4ef5f2 Upgrade node to latest 16 LTS (gallium)
Refs DE-1264
flag=none

Bumps minor version to the most recent, which brings
in some CVE fixes and other stuff that might not matter.

(This change only affects NVM users; the "blessed" node
version is still encoded in the Docker files.)

Test plan:
* you can install node modules and run webpack

Change-Id: I01dd63ce444df254bc5a6ca03aa76b1505b8fe37
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310896
QA-Review: Charley Kline <ckline@instructure.com>
Product-Review: Charley Kline <ckline@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Andrea Cirulli <andrea.cirulli@instructure.com>
2023-02-13 17:35:16 +00:00
Dave Wenzlick 740adf6da6 Fix check_for_existing_results to search on quiz and alignment
closes OUT-5536
flag=none

Code was updated to account for question banks being used
across multiple quizzes, but it did not handle multiple
question abnks being used within a single quiz.

Test plan
- All tests pass. I added a new test case to handle the missing
  use case of the same outcome being used across multiple
  question banks.

Change-Id: If09c46427aca4e0a3179768d198436e12aa162d6
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310796
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Angela Gomba <angela.gomba@instructure.com>
QA-Review: Angela Gomba <angela.gomba@instructure.com>
Product-Review: Kyle Rosenbaum <krosenbaum@instructure.com>
2023-02-13 17:22:15 +00:00
Jonathan Guardado 4c95ac55f7 Keep pace contexts table state after removing a pace
Include all the filters except contextIds after removing pace, so
the user will get the table in the same state after refreshing.

fixes LS-3669
flag= course_paces_redesign

test plan
- Go to the course pacing page.
- Apply some filters like page number or search term
- Sort the table in descending order
- Using the modal, remove a pace
- Expect the table remains in the same state after removing the pace

Change-Id: Ia60a45d88869f67cfea41102a337d8ffaf3bc8b6
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310875
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Product-Review: Jonathan Guardado <jonathan.guardado@instructure.com>
Reviewed-by: Robin Kuss <rkuss@instructure.com>
QA-Review: Robin Kuss <rkuss@instructure.com>
2023-02-13 17:19:35 +00:00
Caleb Guanzon 1582f99d7a handle masqueradors in /collaborations
fixes VICE-3314
flag=none
test plan:
- set up google drive plugin locally
- as a student create a google doc collab
- as an admin, create a google doc collab

- this way, the student, and the admin have both
authenticated google

- now log in as the admin again, this time,
masquerade as the student
- visit the course collaborations page
- create a google doc collaboration
- do not invite anyone
- save
- verify that in the auto-opened
google doc tab, that it is logged
in as your own (masquerador's)
google account
- verify that back in the collaborations
tab in canvas, the collaboration you
created while masquerading shows that
you (the masquerador, is the author)

- now click to view a collaboration while
still masquerading
- verify that you are not able to view the document
and that you are sent back to the collaborations page with
a flash error stating that you need to stop masquerading

- stop masquerading
- verify you can visit a collaboration as yourself (admin)

Change-Id: I85704c3a1cdad89cca57b8aee2133ff11af1cd67
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310803
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jason Gillett <jason.gillett@instructure.com>
Product-Review: Jason Gillett <jason.gillett@instructure.com>
QA-Review: Omar Soto-Fortuño <omar.soto@instructure.com>
2023-02-13 17:15:27 +00:00
Aaron Ogata 97c5c0f14d remove deprecated build & log
Change-Id: Ida5c649f1c527de547f68b33866014a30a079d56
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310950
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: James Butters <jbutters@instructure.com>
QA-Review: Aaron Ogata <aogata@instructure.com>
Product-Review: Aaron Ogata <aogata@instructure.com>
Build-Review: Aaron Ogata <aogata@instructure.com>
2023-02-13 16:36:02 +00:00
Aaron Ogata 653c264955 move withGerritCredentials to global shared library
refs DE-1524

[canvas-builds-refspec=a53cba34a165ef2a5ca242507a43254b5da0256f]

Change-Id: I243d09a3c55d10d734d13e356507b3010a0023f9
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310946
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Andrea Cirulli <andrea.cirulli@instructure.com>
Build-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
QA-Review: Aaron Ogata <aogata@instructure.com>
Product-Review: Aaron Ogata <aogata@instructure.com>
2023-02-13 16:12:23 +00:00
Jason Gillett f3fd38d6f3 Fix profiles user breadcrumb to use short_name
closes VICE-3329
flag=none

Test Plan
1. Enable profiles on the account settings
2. Click into a user form the peoples page
3. Verify that the user's display name is shown
3a. should be displayed on the breadcrumb link

Change-Id: I218cea8ecd49e549fd8a639ec91fb6e7d85f1b1c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310847
Reviewed-by: Caleb Guanzon <cguanzon@instructure.com>
Product-Review: Caleb Guanzon <cguanzon@instructure.com>
QA-Review: Omar Soto-Fortuño <omar.soto@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
2023-02-13 16:08:26 +00:00
jake.oeding 16e868863f disable auto rendering latex when ELT flag is on
flag=explicit_latex_typesetting
closes MAT-1172

test plan:
-prereq: have a page with some latex on it
-with the flag OFF
 >go to the page and make sure the latex renders via MathJax
-with the flag ON
 >go to the page and make sure the latex doesn't render via MathJax
 -open the NEE and switch to the direct editing mode
 >confirm that any latex you enter correctly gets rendered via
  MathJax in the preview at the bottom

Change-Id: Ia57fc50faa087b45b105c6f2af8e4203b375d293
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310791
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
QA-Review: Ed Schiebel <eschiebel@instructure.com>
Product-Review: Jake Oeding <jake.oeding@instructure.com>
2023-02-13 15:53:01 +00:00
Jeremy Stanley 79bafab59b don't move lti ids if past lti ids already exist
test plan:
 1. merge two users that already have enrollments
 2. merge the merged user into a new user that has never had
    any enrollments
 3. the user's perceived lti ids from courses enrolled in
    before step 2 should not be changed

flag=none
fixes FOO-3374

Change-Id: Ib33e34e92f5a99eddd7802d68d8bea64ea1f0a9f
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310907
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: August Thornton <august@instructure.com>
QA-Review: Jeremy Stanley <jeremy@instructure.com>
Product-Review: Jeremy Stanley <jeremy@instructure.com>
2023-02-13 15:51:35 +00:00
Aaron Shafovaloff 93ecd4a57d Improve types for GradebookSettingsModal
Test plan:
  - All existing tests pass

flag=none

Refs EVAL-2899

Change-Id: I3db7d21152ab4f85c3cec2ab6d5de7a10a29bf71
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310858
Reviewed-by: Christopher Soto <christopher.soto@instructure.com>
Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Kai Bjorkman <kbjorkman@instructure.com>
Product-Review: Cameron Ray <cameron.ray@instructure.com>
2023-02-10 23:48:19 +00:00
Aaron Shafovaloff b1ee39be7e Show "All Grading Periods" in enhanced filters
Test plan:
  - Enable the enhanced gradebook filters feature flag
  - Create a course with multiple grading periods
  - Create assignments for each grading period
  - Select "All Grading Periods" in the filters
  - The "All Grading Periods" tag should be visible
  - After removing the filter, only assignments for the current
    grading period should be visible

Closes EVAL-2887

flag=enhanced_gradebook_filters

Change-Id: Ia975cf03146ad63d75507669198bdb1fa11de14d
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310718
Reviewed-by: Cameron Ray <cameron.ray@instructure.com>
Reviewed-by: Christopher Soto <christopher.soto@instructure.com>
QA-Review: Kai Bjorkman <kbjorkman@instructure.com>
Product-Review: Jody Sailor
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
2023-02-10 19:56:49 +00:00
Jason Gillett 95608500f8 Fix text not wrapping when word or link is very long
closes VICE-2275
flag=react_inbox

Test Plan
1. Create a message that has a very long link or word
2. Open it in inbox
3. Verify that the word wraps inside of the message container.

Change-Id: I952d7e7c476ede1c40a8bca3d709be5c169ad1d8
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310854
Reviewed-by: Omar Soto-Fortuño <omar.soto@instructure.com>
Product-Review: Omar Soto-Fortuño <omar.soto@instructure.com>
QA-Review: Caleb Guanzon <cguanzon@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
2023-02-10 19:51:42 +00:00
Charley Kline 1c5d0b418d Refresh the en.json fallback translations
flag=none

We've got a new locale-sensitive URL which added a line
to the static en.json file, so it gets dirty every time
translations are built. The "correct" version needs to
be on master to avoid dirtying local dev repos.

This is just one big long one-line JSON, but Gerrit's
change highlighting will make it easy to see what has
been made different.

Test plan:
* You agree with the change

Change-Id: Icdffe47a17eea4e0cb78c23ebded2348dd88947a
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310852
Reviewed-by: Aaron Shafovaloff <ashafovaloff@instructure.com>
QA-Review: Charley Kline <ckline@instructure.com>
Product-Review: Charley Kline <ckline@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
2023-02-10 18:45:45 +00:00
August Thornton dbbe3f0941 block logins for pseudonyms that are in a suspended state
we offer JIT provisioning for a multitude of auth providers. I'm
specifically targeting SAML as that's where most of our reports
are coming from. If in the future we want to update more, we can
in regards to recognizing and dealing with pseudonyms that have
been suspended

this change gives us the flexibility to include pseudonyms
involved in our SSO authentication flow that have been suspended,
bypass the logic for JIT provisioning (thus not duplicating users
and setting federated attributes that don't pertain to the user
in question) and block the login as no user found with pseudonym;
our fallback when pseudonym == nil

fixes FOO-2717
flag = none

test plan:
 • set up a SAML IDP to interface with Canvas as a SP
   and enabled JIT provisioning with the sis_user_id
   attribute being collected
 • ensure your IDP is sending the federated attribute
   that you have set in the auth provider config for
   sis_user_id
 • have a user associated with the SAML auth provider
 • suspend the user
 • attempt to log in as that user via /login/saml and
   authenticate
 • verify the login is rejected with an error stating
   a user was not found with provided unique id
 • verify no additional user was provisioned through
   JIT

Change-Id: I129ba60a86f90c98416e60b5c76325561e2bbad3
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310836
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: Jesse Poulos <jpoulos@instructure.com>
2023-02-10 18:22:58 +00:00
Evan Battaglia c420bec585 Update editor_button icon_url docs
In the code, giving a canvas_icon_class instead of a icon_url also makes
the editor_button placement appear, but the tool seems to show up as a
blank icon then... 🤷 So I didn't mention it here.

closes INTEROP-7950

Test plan:
- run docker-compose run web bundle exec rake doc:api
- view /doc/api/file.editor_button_placement.html and make sure the
  icon_url section looks good

Change-Id: I92d7025e143b3858d192abbf85aad3a9e52962b8
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310567
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Paul Gray <paul.gray@instructure.com>
QA-Review: Paul Gray <paul.gray@instructure.com>
Product-Review: Alexis Nast <alexis.nast@instructure.com>
2023-02-10 17:55:17 +00:00
Evan Battaglia 7ca3438735 Add missing context fields in non-user live events
When a teacher scores a submission in Speed Grader, the live event
contains the metadata fields `context_account_id` and
`context_sis_source_id`. When a submission is scored with the Grade
Passback API, however, these fields are missing. This commits adds them,
and probably adds the fields for other endpoints that are not normally
run as a user.

There are a few other fields still missing in a Grade Passback
grade_change live event vs. a user-initiated grade_change event, but
these have to do with the user who initiated the action (user_id,
user_account_id, etc.) so are not really applicable.

I also double-checked that this fixes it for AGS (LTI 1.3).

flags=none
fixes INTEROP-7907

Test plan:
- Before checking out this commit:
  - enable the stub_kinesis attribute in the live_events section of
    dynamic_settings.yml, as described in doc/live_events.md
  - Make a course with a SIS id and an LTI 1.1 Assignment
  - Launch the LTI 1.1 Assignment, and from the launch data, get the
    sourcedId
  - follow logs e.g.
    docker logs -f -n 10 canvas-lms_web_1 | grep grade_change
  - Grade the assigment in speedgrader
  - save off the live event outputted
- Check out this commit (you may need to restart Canvas to pick up the
  changes in lib/) and follow the logs again
- Grade the assignment in speedgrader and save off the live event
  outputted
- create a gradepassback.xml file to be used with the API by copying the
  example from the docs and substituting the sourcedId
- Send a passback request e.g.
  def grade_passback(tool_id, xml)
    tool = ContextExternalTool.find(tool_id)
    consumer = OAuth::Consumer.new(tool.consumer_key, tool.shared_secret)
    client = OAuth::AccessToken.new(consumer)
    url = "http://web.canvas-lms2.docker/api/lti/v1/tools/#{tool.id}/grade_passback"
    client.post(url, xml, 'Content-Type' => 'application/xml')
  end
  grade_passback(188, File.read("gradepassback.xml"))
- Convert each of the events you captured to sorted JSON. The raw output
  using the stub_kinesis option is actually a JSONified event wrapped in
  a ruby object, that looks like this:
    [{:data=>"{\"attributes\":{\"root_account_uuid...
  You can convert this to sorted JSON with this bash function:
  eventcleanup() {
   ruby -rjson -e \
   'puts JSON.pretty_generate JSON.parse(eval(ARGF.read).dig(0,:data))'|
    jq --sort-keys
  }
  eventcleanup < file_with_ruby_object.txt > out.json
- Compare the events generated from the two methods, and before this
  commit (e.g. with a graphical diff tool) Make sure all have the same
  value for the following fields:
    - context_account_id (added this commit for grade passback)
    - context_sis_source_id (added this commit for grade passback)
    - context_id
    - context_type
    - root_account_id
    - root_account_lti_guid
    - root_account_uuid

Change-Id: I12a0f5d38ec8e591f7b753ccccd3e64b109650d1
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310168
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Paul Gray <paul.gray@instructure.com>
QA-Review: Paul Gray <paul.gray@instructure.com>
Product-Review: Alexis Nast <alexis.nast@instructure.com>
2023-02-10 17:47:20 +00:00
Charley Kline 3dfe09c5e1 Fix loading order of locale polyfills
Refs FOO-2929
flag=none

There are not a lot of locales that need to be
polyfilled (native browser support exists in almost
all cases), so it's no surprise that it was not
properly loading some of the locale data, due to
us not checking for prerequisite polyfills and also
to not loading polyfills in the required order.

See https://formatjs.io/docs/polyfills/ ... there's
a pretty clear tree of dependencies.

This commit changes the order of loading (if needed)
of the polyfills and also brings in a couple of
polyfills that I didn't even realize were required
for what we are loading. Also I removed a not-longer-
needed directory in /packages that used to handle the
locale polyfills before it was moved to the "engine"
stuff; also now the dependencies are in the correct
package.json.

Test plan:
* re-run the test plan for g/294705
* If you are an expert at how dates should look in
  Welsh or Armenian, make sure they're really being
  done correctly now?

Change-Id: Ie65ec591b9c9c063a093dec8a921759354abc37d
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310469
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Aaron Shafovaloff <ashafovaloff@instructure.com>
Reviewed-by: August Thornton <august@instructure.com>
QA-Review: Charley Kline <ckline@instructure.com>
Product-Review: Charley Kline <ckline@instructure.com>
2023-02-10 17:10:15 +00:00
Drake Harper 850cfe964c Improve all conversation query load time
fixes VICE-3323
flag=react_inbox

Test Plan:
 - with react inbox ff on
 - with a significant amount of conversations for a user
 - inbox load times should be less than a few seconds

Change-Id: I9c75321fd2470ff3cbd16e8b5d708788aa2ab200
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310777
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Omar Soto-Fortuño <omar.soto@instructure.com>
Product-Review: Omar Soto-Fortuño <omar.soto@instructure.com>
QA-Review: Chawn Neal <chawn.neal@instructure.com>
2023-02-10 17:08:30 +00:00
Jacob Burroughs bcfffcc6e0 Move to rails 7 as the default rails version
Change-Id: I3c1fd74154a52aad96ef7ab85144dcc8dceb414a
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310751
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Jacob Burroughs <jburroughs@instructure.com>
Product-Review: Jacob Burroughs <jburroughs@instructure.com>
Build-Review: Jacob Burroughs <jburroughs@instructure.com>
Reviewed-by: Aaron Ogata <aogata@instructure.com>
Reviewed-by: Isaac Moore <isaac.moore@instructure.com>
2023-02-10 16:26:06 +00:00
Jeremy Stanley 673ca82113 retry lti_context_id unique constraint in move_lti_ids
test plan:
 - smoke test user merge via automerge consortium with
   home_account=true and ensure lti_context_id is moved
   to the target user (test with global nav LTI tool launch)
 - the actual constraint violation is difficult to reproduce
   but the code path has spec coverage

flag=none
closes FOO-3366

Change-Id: Id29785f5156915c683716d255b2cc38baf6247c0
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310713
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: August Thornton <august@instructure.com>
QA-Review: Jeremy Stanley <jeremy@instructure.com>
Product-Review: Jeremy Stanley <jeremy@instructure.com>
2023-02-10 15:58:54 +00:00
Aaron Shafovaloff af711d74a2 Make coercion of score string to number explicit
With scoreWithLowerBound >= schemeScore:
  - scoreWithLowerBound is a number
  - schemeScore is a string
  - in the comparison, schemeScore is coerced to a number

This makes the coercion explicit

Test plan:
  - About a dozen tests validate this function; they should all pass
    - See especially: "GradingSchemeHelper > .scoreToGrade() accounts
      for floating-point rounding errors"

flag=none

Change-Id: I02ac386a30d518657e9f49129a98ae2157f4a2c0
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310678
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Derek Williams <derek.williams@instructure.com>
Reviewed-by: Cameron Ray <cameron.ray@instructure.com>
QA-Review: Aaron Shafovaloff <ashafovaloff@instructure.com>
Product-Review: Cameron Ray <cameron.ray@instructure.com>
2023-02-10 15:43:41 +00:00
Mysti Lilla 56480b76a1 Add usdz mime types
fixes MAT-290
flag=none

Test plan
- Upload a usdz file and
  verify that it has a content_type
  that is not "unknown/unknown"

Change-Id: Ia979db164b865f2afd86dafbd5de59941207f8ee
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310602
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jake Oeding <jake.oeding@instructure.com>
QA-Review: Jake Oeding <jake.oeding@instructure.com>
Product-Review: Mysti Lilla <mysti@instructure.com>
2023-02-09 23:57:43 +00:00
Jason L Perry f988fdd5cc Add "shadow" property to feature flags
This allows a feature flag to remain hidden, even after being enabled.
Only Site Admins will be able to see and opt in/out of shadow features.
The generated API documentation is not changed, as the shadow property
is not shown to non-Site Admins and is meant for internal use only.

This also enables the shadow property for the the `send_usage_metrics`
feature flag.

Closes FOO-3277

flag=none

Test Plan:
* Set `shadow: true` on a feature
* Verify it's shown in the UI if you're a site admin.
* Verify you can't see it as a root account admin, even when enabled.

Change-Id: I5d764c50014b1bb1d2064a22cb5f88022d752e3a
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/309190
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Jason Perry <jason.perry@instructure.com>
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
Product-Review: Jesse Poulos <jpoulos@instructure.com>
2023-02-09 22:03:35 +00:00
Caleb Guanzon 85747c25be properly spell manage_course_content_delete
flag=granular_permissions_manage_course_content
fixes VICE-3313

typo caused non authors with
sufficient permissions to not be able
to delete. this commit fixes the typo

test plan: hard way
- turn on feature flag for granular permissions
manage course content
- must have a collaborations plugin
enabled for sandbox, but make sure LTI
collaborations are not enabled
(have myself walk you through the process,
involves secrets, so cannot post here)

- as a student in the course, create a collaboration
- as a teacher, verify you can delete it

the easy way:
- undo the typo fix in spec/models/collaboration.rb
- save
- run
bundle exec ./bin/rspec spec/selenium/collaborations/collaborations_teacher_spec.rb:44
- verify it fails
- recorrect the typo
- save
- rerunning the spec should pass

Change-Id: Id225ab19599090f69e47a34917fc7a9c1af95d02
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310708
Reviewed-by: Jason Gillett <jason.gillett@instructure.com>
Product-Review: Jason Gillett <jason.gillett@instructure.com>
QA-Review: Chawn Neal <chawn.neal@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
2023-02-09 20:28:57 +00:00
Juan Chavez 68773afb17 Click overflow menu does not unfocus input fields
fixes MAT-1063

flag=none

test plan:
- Navigate to a RCE instance.
- Shrink browser window to have the overflow button
show up.
- Click overflow button.
- With the overflow menu open, click an outside
input field, like page/assignment name.
> Verify that the overflow menu closes and the input
field is still focused

Change-Id: I263b971ec84650ac1d0e01fe6222b7812da35e7d
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310156
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
QA-Review: Ed Schiebel <eschiebel@instructure.com>
Product-Review: Juan Chavez <juan.chavez@instructure.com>
2023-02-09 20:27:12 +00:00
Chawn Neal 76d877e3ee datafix set root_account_ids ConversationMessageParticipant
this is the intended set_root_account_ids for
conversation message participants.

this will set it to the conversation's root_account_ids.

refs VICE-3181
flag = none

Test Plan:
1) you can run the loop locally,
 and for one cmp.
2) watch how it sets the cmp.root_account_ids

Change-Id: I7796e7bf76428840bd94fdb2bd54e0b001280d2c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310674
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Migration-Review: Aaron Ogata <aogata@instructure.com>
QA-Review: Caleb Guanzon <cguanzon@instructure.com>
Reviewed-by: Jason Gillett <jason.gillett@instructure.com>
Product-Review: Jason Gillett <jason.gillett@instructure.com>
2023-02-09 19:13:08 +00:00
Rajmund Csehil f8b0d9d395 Media Player Iframe - no grey border in cross-domain LTI tools
When the media player is embedded as an iframe
into another iframe, which is embedded into Canvas
the player thinks it is loaded in standalone mode.
This PS makes the following scenario work
Canvas (me.instructure.com) -embeds-> LTI (lti.domain1.com) -embeds->
-> Media Player Iframe (me.instructure.com/media_objects_iframe)

fixes QUIZ-10562

flag=none

Test plan:
Test in Canvas
go to courses/pages
add a page
insert a video file
there should be no grey border in the videoplayer box
video should be resizeable using the tray and switching to a bigger size

save the page and look at the rendered version of the page
video should be like it was in edit mode

Change-Id: I9b306baa5275a563c46149dbae95e56c4c376677
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310218
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
Reviewed-by: Ferenc Marcsó <ferenc.marcso@instructure.com>
QA-Review: Roland Beres <roland.beres@instructure.com>
Product-Review: Rajmund Csehil <rajmund.csehil@instructure.com>
2023-02-09 14:38:41 +00:00
Isaac Moore eb3c72c293 Consume CSP logging secret from Vault
refs AE-46
flag=none

test plan:
- specify `csp_logging` secret in `vault_contents.yml`
- confirm it's loaded correctly when calling `csp_logging_config` on
  `Account.default` from a rails console

Change-Id: I9af985c1b3a7fee4946dc5a6e50e69c979917fe6
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310551
QA-Review: Isaac Moore <isaac.moore@instructure.com>
Product-Review: Isaac Moore <isaac.moore@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jacob Burroughs <jburroughs@instructure.com>
2023-02-08 22:09:28 +00:00
Jason Gillett a011eb0a4b Allow restricted students to see groups they are a member of
fixes VICE-3331
flag=none

Test Plan
1. Create a group set where the teacher decides groups
2. Create a group in the groupset
3. Have 2 sections
4. Have 2 students that are section restricted
5. place students in different sections
6. Place students in the same group
7. As one of the students, open the groups page
8. verify that the group appears.

Change-Id: I1ccbd90975bdc363489ace44c3155bfffec123ee
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310699
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Caleb Guanzon <cguanzon@instructure.com>
Reviewed-by: Omar Soto-Fortuño <omar.soto@instructure.com>
Product-Review: Omar Soto-Fortuño <omar.soto@instructure.com>
2023-02-08 20:28:37 +00:00
Sarah Gerard b20623c0f5 fix unpublishing page with "publish at" date
if publish_at was changed to null, it would publish the page

fixes MAT-1183
flag=scheduled_page_publication

test plan:
- create a new page and set "Publish at" date in future
- save the page
- edit the page and remove the publish at date
- select save (not save and publish)
- ensure page is still unpublished
- test the same thing
- instead of clicking edit, click "will publish on ..."
- in the pop up click unpublish and then ok
- reload the page and ensure it is unpublished

Change-Id: I43079d76e53e14b297bb48a4dee837f563b4afe0
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310601
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Juan Chavez <juan.chavez@instructure.com>
QA-Review: Juan Chavez <juan.chavez@instructure.com>
Product-Review: Sarah Gerard <sarah.gerard@instructure.com>
2023-02-08 20:22:18 +00:00
Paul Gray b19666f72e Adding static theme props for instui components
Change-Id: I1346f0c7593a0d57581e4f065756b68ce56339eb
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310615
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Aaron Shafovaloff <ashafovaloff@instructure.com>
Reviewed-by: Cameron Ray <cameron.ray@instructure.com>
QA-Review: Aaron Shafovaloff <ashafovaloff@instructure.com>
Product-Review: Aaron Shafovaloff <ashafovaloff@instructure.com>
2023-02-08 18:25:24 +00:00
Andrea Cirulli 1e3550df44 Revert "pin rubocop to 1.44.1 in rubocop-canvas gem"
This reverts commit 85949ed13c.

Reason for revert: the bug in rubocop gem has been resolved in version 1.45.1

Change-Id: Icb1876d3c2627dbe2785ff7b49335619d42bf6da
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310312
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: James Butters <jbutters@instructure.com>
QA-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
Product-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
Build-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
2023-02-08 18:24:28 +00:00
Aaron Shafovaloff c44522ba70 Improve types for GradeInput
Test plan:
  - Existing tests should pass

flag=none

Refs EVAL-2886

Change-Id: I3e76c0c87930a8f6da5531997f6dc7fa64b19d4f
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310690
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Christopher Soto <christopher.soto@instructure.com>
Reviewed-by: Derek Williams <derek.williams@instructure.com>
QA-Review: Aaron Shafovaloff <ashafovaloff@instructure.com>
Product-Review: Cameron Ray <cameron.ray@instructure.com>
2023-02-08 18:21:09 +00:00
Aaron Shafovaloff f95f528d24 Ensure update of Individual Gradebook
The Individual Gradebook was not updating when the user toggled
back to a previously selected grading period.

Test plan:
  1. Create a term and grading period that uses weighted grading periods
  2. Create a course with assignments and scores for students in
    those grading periods
  3. Open the Individual Gradebook
  4. Filter the grading periods to 'All Grading Periods' and
    select the first student
  5. It should list all grading periods and the weights
    the student has received
  6. Toggle the grading period filter to other
    grading periods and it should update the totals correctly
  7. Toggle the grading period filter back to 'All Grading Periods'
    and notice it updates the totals correctly

Fixes EVAL-2804

flag=none

Change-Id: I8ef11f5c1c19b114e9f7fde6e595f02824c08ce8
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/309795
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com>
Reviewed-by: Derek Williams <derek.williams@instructure.com>
QA-Review: Kai Bjorkman <kbjorkman@instructure.com>
Product-Review: Jody Sailor
2023-02-08 17:33:07 +00:00
Kai Bjorkman 9d289ad582 show needs submission view in peer reviews
When a reviewer has not submitted to the assignment and they attempt to
complete a review, they should be met with a screen that explains that
they will need to submit before reviewing other's work.

closes EVAL-2823
flag=assignments_2_student
flag=peer_reviews_for_a2

Test Plan:
    - Create a peer review and assign two students to review each other
    - submit to the assignment as one of the students
    - As the student who did submit, try to view your assigned peer
    review
    - Ensure you are met with a panda reading a magazine and the message
    that reads: "There are no submissions available to review just yet."
    - As the student who did not submit, try to view your assigned peer
    review
    - Ensure you are met with a panda reading a book and the message
    that reads: "You must submit your own work before you can review
    your peers."
    - Ensure after the student submits to the assignment they are able
    to complete the peer review

Change-Id: I7f79c30a8fd47aa3f37ab90e9696d9ed32ecdb13
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310051
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Christopher Soto <christopher.soto@instructure.com>
Reviewed-by: Aaron Shafovaloff <ashafovaloff@instructure.com>
QA-Review: Christopher Soto <christopher.soto@instructure.com>
Product-Review: Jody Sailor
2023-02-08 17:30:38 +00:00
Caleb Guanzon 63c8517942 respect granular course content permissions in announcements ui
flag=granular_permissions_manage_course_content
fixes VICE-3285

Since the permission explainer test specifically specifies
that announcement locking and deleting should really
affect announcements locking and deleting,

we should make it so

this fix will also work with the manage course content
combined permission

test plan:
- turn on the
granular_permissions_manage_course_content feature flag

verify the following in the course announcements index:
- the delete row item menu option only shows for roles with
the manage_course_content_delete permission
- the lock/allow row item menu option only shows for roles with
the manage_course_content_edit permission
- if user has neither of these 2 permissions, the
announcement rows do not show a checkbox, and does
not show a manage menu

Change-Id: Ia4b2eee6461b6a85ae71a8b8e5af15586b7aad23
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310593
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Drake Harper <drake.harper@instructure.com>
Product-Review: Drake Harper <drake.harper@instructure.com>
QA-Review: Jason Gillett <jason.gillett@instructure.com>
2023-02-08 17:07:25 +00:00
Aaron Ogata 0aca0be810 allow additional columns to be ignored through Consul
refs AE-124

When running pre-deploy migrations that add a new column, if an application server loads the schema on a shard where the migration has already run, and tries to run queries on a shard where the migration has not already run, it can lead to errors. Fix this by allowing ignored_columns to append to its value dynamically through Consul.

Change-Id: I3b13e0fd2ac066e1439d3d314d71f2ebd8938e0c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310561
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jacob Burroughs <jburroughs@instructure.com>
QA-Review: Aaron Ogata <aogata@instructure.com>
Product-Review: Aaron Ogata <aogata@instructure.com>
2023-02-08 17:05:57 +00:00
Chris Soto fe4f7009d4 setting nq grade to nil not showing submissions
when a new quiz has multiple submissions and a teacher sets the grade
of a submission to nil, the teacher will no longer be able to see that
submission version in speedgrader or individual gradebook. this change
will now show nil submissions only when the workflow_state is "graded"

fixes EVAL-2136
flag=none

test plan:
- as teacher, create an auto graded new quiz and allow multiple
  submissions
- as student, take the quiz multiple times
- as teacher, go to gradebook and mark the grade for the new quiz
  to empty
- as teacher, go to speedgrader and verify that you can still see
  all the submissions

Change-Id: Ib9c4a8668c7c24d63357afba4d7b3b2942e21c82
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/309194
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Cameron Ray <cameron.ray@instructure.com>
Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com>
QA-Review: Cameron Ray <cameron.ray@instructure.com>
Product-Review: Jody Sailor
2023-02-08 17:00:17 +00:00
Andrea Cirulli 85949ed13c pin rubocop to 1.44.1 in rubocop-canvas gem
this is a temporary version lock to avoid a bug in rubocop 1.45.0
https://github.com/rubocop/rubocop/issues/11549

Change-Id: Ibc0f90c6d3ebaaa0857e2e8b265d2a6585e9fe17
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310676
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Aaron Ogata <aogata@instructure.com>
QA-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
Product-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
Build-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
2023-02-08 16:46:35 +00:00
Chawn Neal de91b4e1bf Set ConversationMessageParticipant root_account_ids on create
fixes VICE-3181
flag = none

description:
the cmp.root_account_ids are tied to the convo.root_account_ids.
if the convo.root_account_ids are updated
then the cmp.convo.root_account_ids will be set.

However, they are not set on create, this is what this ticket addresses.

Test Plan:
1. the specs are straightforward.
2. Create a message with Conversation.
3. Use rails console and see cmp.root_account_ids are:
 a. match convo.root_account_ids. (most important)
 b. not nil

Change-Id: I481849db52c991cf260bf519310ba2111c7a8058
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310604
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Drake Harper <drake.harper@instructure.com>
Product-Review: Drake Harper <drake.harper@instructure.com>
QA-Review: Caleb Guanzon <cguanzon@instructure.com>
2023-02-08 15:59:02 +00:00
Drake Harper cc370c1cfd Improve get conversation by id query in react inbox
refs VICE-3323
flag=react_inbox

Test Plan:
 - with react inbox ff turned on
 - go to inbox
 - open a single conversation
 - nothing should break and experience should be unchanged
 - to really test use the script for creating conversations
     (several thousand are needed to get performance issues)
 - when loading a single conversation watch rails server
 - should not trigger all conversations query

Change-Id: Ibf05279a62983bb043561f7b9a425346183a67a3
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310591
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Omar Soto-Fortuño <omar.soto@instructure.com>
Reviewed-by: Chawn Neal <chawn.neal@instructure.com>
Product-Review: Chawn Neal <chawn.neal@instructure.com>
2023-02-08 15:30:45 +00:00
Aaron Shafovaloff 50fd556f45 Improve types for grading inputs and results
Test plan:
  - Existing tests should pass

flag=none

Refs EVAL-2886

Change-Id: I9adc05fc38f748706df3445288279f674a0dfaff
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310609
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Derek Williams <derek.williams@instructure.com>
Reviewed-by: Christopher Soto <christopher.soto@instructure.com>
Reviewed-by: Cameron Ray <cameron.ray@instructure.com>
QA-Review: Aaron Shafovaloff <ashafovaloff@instructure.com>
Product-Review: Cameron Ray <cameron.ray@instructure.com>
2023-02-08 15:13:22 +00:00
Omar Gerardo Soto-Fortuño bda150e266 Populate missing root_account_ids for Communication Channels
closes VICE-3182
flag=none

test plan:
  - Specs pass

qa risk: low

Change-Id: I9fea3003c97a6e62f4f3a917491cfd77aa4fdb8c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310495
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Drake Harper <drake.harper@instructure.com>
Migration-Review: Jacob Burroughs <jburroughs@instructure.com>
Product-Review: Drake Harper <drake.harper@instructure.com>
QA-Review: Jason Gillett <jason.gillett@instructure.com>
2023-02-07 21:09:17 +00:00
Aaron Shafovaloff f9eca2680a Improve pre-commit hook
Runs a robust TypeScript check before running ESLint.

Test plan:
  - Make a change to a .ts/.tsx file that will cause a lint error
    - Try to commit a change
    - Verify that the precommit hook fails

flag=none

Change-Id: I6772041b2ae670ae9b9d654b07cbd97a80ad6896
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/310371
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
Reviewed-by: Christopher Soto <christopher.soto@instructure.com>
QA-Review: Aaron Shafovaloff <ashafovaloff@instructure.com>
Product-Review: Aaron Shafovaloff <ashafovaloff@instructure.com>
2023-02-07 18:42:53 +00:00