@CharleyMarsh
Not directly, but there are lots of ways to get some of the information.
Within a browser, you can do the following:
The user Access Report works for faculty as well as students. It may not show the deleted access, but it lets you know the last time that the instructor viewed the content. That might be when they deleted or hid it, but maybe not.
For deletions, you can try adding /undelete to the end of your course URL. This will bring up a list of deleted items and show when it was created and last updated. The last updated should be when it was deleted. You can also (likely) restore the information from here.
For hiding/unhiding, do you mean publishing/unpublishing? Most items have a last updated date that will get updated when something is published or unpublished. You can add /api/v1 in between the instance and assignment/page name to get details. For example, if my assignment is at <instance>/courses/896851/assignments/3697779 then I would go <instance>/api/v1/courses/896851/assignments/3697779 to get the details about the assignment. This approach needs done for each assignment, page, discussion, quiz, etc.,. so it's not really the most efficient.
A better way is to use the GraphQL to get all the same information at one shot. For this, add /graphiql (that's a lowercase i (eye) in between the graph and ql). This information is also available through the REST API, but that lacks the fancy interface that graphiql provides.
Here is some code that you can paste in that will give you each assignment, whether it is published, when it was created, and when it was last updated.
query assignmentUpdates($courseId: ID, $c1: String) {
course(id: $courseId) {
assignmentsConnection(first: 100, after: $c1) {
nodes {
_id
name
published
createdAt
updatedAt
}
pageInfo {
hasNextPage
endCursor
}
}
}
}
In the Variables section at the bottom of the graphiql page, you would need to enter the courseId and starting value. Replace 896851 with your course ID. Then click the Run button at the top.
{
"courseId": 896851,
"c1": null
}
This comes as JSON, but you can select the array within the nodes property and go to an online JSON to CSV converter and convert it into a table.
Here's what mine looks like: The ... is not there, I just put added it for brevity.
{
"data": {
"course": {
"assignmentsConnection": {
"nodes": [
{
"_id": "24997381",
"name": "Group Assignment",
"published": true,
"createdAt": "2019-12-13T22:23:03-06:00",
"updatedAt": "2024-07-18T21:31:54-05:00"
},
{
"_id": "4994189",
"name": "Google Doc Upload",
"published": true,
"createdAt": "2014-05-26T09:24:23-05:00",
"updatedAt": "2024-07-18T21:31:53-05:00"
},
...
{
"_id": "22902199",
"name": "Studio / Arc Quiz",
"published": true,
"createdAt": "2019-07-18T16:24:41-05:00",
"updatedAt": "2024-07-18T21:31:54-05:00"
}
],
"pageInfo": {
"hasNextPage": true,
"endCursor": "MTAw"
}
}
}
}
}
Store or convert those results somewhere. You can also Ctrl/Cmd-f to look for a specific assignment. You can also search for published": false to get all of the assignments that are not published.
You need to look at pageInfo to see whether you got all of the results. In my case, I did not (the hasNextPage is false on your last page of results). If hasNextPage is true, then you need to take the endCursor and put that in for c1 in the Variables section.
To get the second 100 results, my Variables section now looks like this:
{
"courseId": 896851,
"c1": "MTAw"
}
After running it again, my hasNextPage is false, so I know I got all of the results. I ignore the endCursor because hasNextPage is false.
I showed assignments connection, but there is also discussionsConnection, filesConnection, pagesConnection, and quizzesConnection that can be used to get information about other object types. The pagesConnection and quizzesConnection is relatively new -- meaning today is the first day I've seen them. I don't know how long they've been there, but I've always had to get that information through the REST API, so it's nice it's under GraphQL now.
An issue with all of these is they give you the last time an assignment was updated and not all of the interim times that an assignment was changed. If the instructor unpublishes an assignment and then comes back three days later and edits the due date, it will only reflect when the due date was changed.
If you have a ballpark idea of when the item was changed, you may be able to use the user page views from the admin's view of the user and narrow the scope. You would need to look through the the page accesses to see when they did something. It's not fun to track things down that way.
It is much easier to track this information proactively rather than going back and trying to figure it out after the fact.
Unfortunately, no one thinks of that ahead of time, it's only after an instructor has messed something up that you need to know.
The first (not recommended) approach is that you could go through and run those GraphQL queries daily and save the data to a local database that you could then query. However, that only gives you the resolution of one day. If it's published, unpublished, date changed, and republished in-between your queries, it would only show the last update and you wouldn't know that it was unpublished in the middle.
Canvas Live Events is what I would use. In fact, I do use it. Canvas Live Events can send you an event notification when certain things happen. For example, under assignment, you can get a notification when an assignment is created or updated. Another one exists for wiki (content pages). If you have an instructor slacking on grading, you can get notifications when grade changes happen.
The deal with Live Events is that it's for your whole account, not for one specific course or instructor. It may not capture everything (but it's good enough for most stuff) and you have some overhead of downloading the events and storing them locally so you can process them.
I originally set ours up to track when students were accessing content and how they were accessing it. But I was able to leverage it a couple of times when we needed information about when instructors were doing things.