[Assignments] Download Assignment Comments and Completed Rubrics

It would be nice to have an option to download everything related to a completed, graded assignment in one PDF: the annotated PDF of the submission, the "assignment comments" discussion, and the completed rubric with values.

 

Currently, within crocodo, we can "Download annotated PDF (includes comments)" and that's really helpful, but we have no way of downloading a record of the Assignment Comments and we have no way to download the rubric. (We've resorted to taking individual screen shots.)

 

This is important for accreditation - we need an archive of everything related to an assignment. Students need this for their e-portfolios, too.

 

This is related to a request in the old pre-2015 Zendesk request:

https://help.instructure.com/entries/22865834-Download-Speedgrader-Comments-with-Assignments which requested just that Assignment Comments be included. I would like to add Rubrics, too.

 

This idea was considered when developing our product plan for Q4 2019 and is not expected to influence development within Canvas at this time.

:smileyinfo: This idea will remain open for vote.

:smileyinfo: If this idea is in the top 10% by vote next cycle it will be reconsidered.

 

Read more about the feature idea process:

Adaptation: Feature Idea Process Changes

How does the feature idea process work in the Canvas Community?

What is the feature development process for Canvas?

What is the feature development process for Canvas?

Added to Theme

105 Comments
James
Community Champion

 @kmeeusen ​,

I didn't think you were saying that. I was just explaining that people who say "I can't do this unless it's native" are going to be waiting a long time. Canvas doesn't do some things by design because it could be better done by a 3rd party. They don't do other things because it doesn't fit in with their bigger picture. They don't do some things because there are bigger fish to fry that will impact more people. There are lots of reasons why something might not get done.

And nothing I contribute is intended to say the idea shouldn't be built into Canvas. I try to refrain from commenting about the merit of the idea.

My contributions are intended to help people until something better comes along. I would love for Canvas to come along and provide all the tools I've written for people. I wish I didn't have to write them because I really feel I'm not the most qualified person to be writing them. I don't know the product as well as they do and I don't know JavaScript as well as many other people. I don't run my code through different browsers and I'm not even going to attempt to support MSIE or Edge. I can't guarantee that it will work with screen readers or other assistive technology. Canvas needs to do that with anything they officially support. That means that Community can contribute code that may not work for everyone, but it should work for those who meet the prerequisites.

Historically, if you go back and read a bunch of my early posts, they were mostly "Yes, you can do this through the API and here's what you would need to do". That left people like you and Cindy out because you didn't have the technical resources to write and support that. Along the line somewhere, I decided that instead of just telling people what they could do, it would be easier for me to make a tool that would do it. If they were concerned about the technical stuff or they had the skills to understand it, all the better, but many of the people asking for things don't have those skills or care how it works, they just want it to work.

This particular instance hit my radar because I commented to  @kona  that the school's Canvas expert should do something to pull the rubric information out and then ... "oops, that's me." Kona asked if I wanted to do it for all of Health Professions and that's when I joined the conversation.

At one time, don't know if it's still the case or not, but people could work with Canvas to get custom solutions (read $$$). So, if something is so vital for people that they can't live without it, but they can't use the custom solutions offered by the Community, they can pay the big guns to work on it. And then all Canvas users benefit from it.

James
Community Champion

 @BKINNEY ​, Thanks for the video and the work you're putting into this.

I've got some ideas for simplifying the experience.

The first idea is that you could use a Google Spreadsheet to do this. Then you could automatically create the data and a pivot table and do formatting and other things. You could even have one page with the results and another page with the template itself. Those are some things you can't do through a simple CSV export. I haven't messed with obtaining a token the way you did, though, I just have them generate it on their own and then use it.

The second approach s adding a button directly to the assignment page itself like you mentioned in the original post. I think I can get that to work and then I won't have to mess with an LTI, but leverage the permissions within the browser without needing to ask for a token at all.

Let me stew on it for a couple of days --- I've got a backlog of papers that need graded and a couple of other projects I'm working on

kmeeusen
Community Champion

And we all appreciate the gifts you give us, whether we can personally make them work or not.

We are just now contracting with Instructure's Professional Services for a custom solution to a problem we have, and their prices are quite reasonable. What I like about using them in those very rare circumstances where we are willing and able to pay, are just those reasons you stated in your post - they know Canvas, and their solutions reflect all the variables that need to be considered.

However, so may folks are able to make very good use of the solutions that you provide us free of charge!

Keep them coming James, keep them coming and thank you!

BKINNEY
Community Contributor

James,

Thanks for the ideas. I'm not really understanding the part about using Google spreadsheets and a pivot table.  Can you explain a bit more? I know what pivot tables are, but I'm having a hard time guessing what design you have in mind. The data I'm providing only has one row per student. Even when there are multiple submissions, only the most recent shows up. Most likely I'm just being thick. In any case, I find that the users who want this sort of data are able to do what they want with it once they've got it in excel. Few if any prefer Google sheets. I could be mis-guessing my audience, but people that want to dig deep into their data generally know a thing or two about data management. This just gets them in the door in the simplest possible way.

I haven't looked at this in a long time, but last I tried, I was finding that my custom js files were not loading in the context of Canvas tools other than the wiki. So, for example, I was unable to add a button to the assignment interface in order to add some functionality around rubrics. I see how I could do it using Greasemonkey, or pretty much any developer console, but that's not easy enough for very many of my users. If you have been able to add a button in the context of an assignment or quiz, what's your secret?

James
Community Champion

 @BKINNEY ​,

Pivot tables aren't a necessity, but the reason I said that was two-fold. When I originally wrote my Discussion Count spreadsheet, I manually did the summing because it was my first attempt and I was glad to get that out. It was a case of "Something is better than nothing". I could have have just provided the raw data and let Excel or Google Sheets do it in a pivot table, but I was trying to get something usable into people's hands and so I met the need at hand rather than trying to write an extendable or a configurable version.

Here's some background:


There are two common ways I organize data. I'll borrow the language Minitab uses since that's what I use in my statistics class.

The first is called "unstacked", which is what your table is. Each variable gets a separate column. There is one for each row of the rubric and the values of the rubric are stored in those columns..

The second is called "stacked" and contains two variables / columns: one for the row of the rubric and one for the value. You would also store key information like the user identifier and the assignment id. You are free to store additional information like the actual text of of the rubric item rather than just the value, the description of the item, the maximum points available for that item, or even any comments that were made for that rubric item.

The unstacked is much easier for humans to digest, but limited in what it can display --- what the programmer decides to display.

The stacked is more like information coming from a database and gives you finer control over what you do with, at the expense of the user actually having to do something with it. In it's raw form, it looks pretty intimidating. A pivot table is the spreadsheets way of letting the user specify what to do with it. You can specify variables to use for rows and columns and then what to for the inside of the table. You can also filter based on the values of variables.

Then a user could do something like this: I use the same rubric for all 16 of my discussions. At the end of the semester, I would like to analyze my rubric and determine it's effectiveness. In particular, I suspect that item 3, quality of follow-up discussions, needs tweaking. With a pivot table, I could create a table that contains the text of the item as the row heading and along with percent of people got each item. If I like, I can add a column variable of the discussion number and now have it broken down by each discussion, but still keep the percents available.

With the unstacked table that you have, they're going to have to do manipulation to convert the raw values into percentages and there are no labels. It's good for a quick summary, but providing the raw data would put the power in the hands of the user rather than limiting them to what the developer decided to include.

Here's another example. Set up a filter based on the user. Then have the rubric row as the row variable and the score, item text, and any comments displayed in the column variables. Then if someone needs to generate a report for accreditation purposes, they could have all of the scores, the item description so the score makes sense, and the comments that went along with it. So, basically, you have a dump of the rubric and can include the comments as well.

But it comes at the cost of the user actually having to do something. If what you're wanting to do is have a fixed report that can be used for accreditation purposes, you don't want to do anything except dump the report with minimal human intervention.

By generating the spreadsheet in Google Sheets, or creating a multi-sheet Excel file (couldn't be a CSV), you basically get the power of multiple tables and not having to repeat yourself. One sheet could contain the raw data, another the descriptions of each row in the rubric, another containing the item description and point values for the items within that row. You can then do lookups from one table to another to combine the data into a usable report. You're basically doing a JOIN in SQL language.

Excel 2013+ has the ability to do a Data Model where you can specify those relationships graphically and then use a Power View to generate the report. Power Views are supposed to make the VLOOKUP() command obsolete according to Microsoft, but in my experience with them was terrible as you can't really do anything other than print a single page report and you can't manipulate the results like you can with regular data in a spreadsheet. If you want to avoid the data model and power view, you can just turn the data into tables and then do much of what you wanted anyway.

For an example of what can be done with multiple tables, check out the document How to list teachers who have published/unpublished courses  that I wrote.

Anyway, the Google Sheets stuff would be an alternative to the LTI approach you have. By letting Google Sheets make the API calls for you, you can get a spreadsheet that contains multiple pages and probably pre-configure a default pivot table for the user. You can download your Google Sheets as an Excel file if the person wants to play in Excel. Generating a multi-sheet spreadsheet from the JavaScript would involve using XML rather than CSV. There's probably a library out there that would help. The other option is to block off columns of the same sheet. For example, columns A-J are the raw data for each user/row combination, M-R contain the row descriptions and T-W contain the values and descriptions for each item within a row.

If you think your users are capable of doing complete calculations with Excel, but using Greasemonkey is too difficult, you haven't seen Greasemonkey properly done. I didn't know what I was doing when I wrote my first scripts. But by the time I got to Course Roster Enhancements , I had figured it out. With that script, you can install Greasemonkey and install the script that allows you to sort your Roster (the People page) by any of the columns in less than a minute (could be less than 30 but you do have to restart Firefox). The key was to the proper naming of the file. If you name it *.user.js, then Greasemonkey will automatically recognize it when you try to download it and ask you if you'd like to load install it. I also figured out that it would be better to make the scripts run on all *.instructure.com sites, so that the end user doesn't have to change anything unless they're using a custom domain.

I think if it removes the extra step of having to start the LTI, go to the other page, copy the URL of the assignment, switch back, paste that in, and then run the LTI and replaces it with just a single button on the assignment page itself, that people might be able to figure out Greasemonkey. And you're also able to add it to a custom JavaScript if you want, rather than making people install Greasemonkey, you can. That provides you with one place to make updates, but it also means that you have to make sure it works with more browsers.

I've added buttons styled the same way as Canvas (look at the source and borrow the code of the adjacent button) and using the Canvas Style Guide so that they look like a natural part of Canvas. We could check for the presence of a button that says "Download Submissions" and if it's there, then add our button. II've also done stuff with pagination and waiting until the entire document is loaded before it processes. I've also done stuff with pagination and waiting until the entire document is loaded before it processes. However, we're getting the information through an API call, so we don't have to wait for the page to load, so I don't have to mess with MutationObserver objects, which have been the stumbling block for me so far in getting Chrome / Tampermonkey to work. If it turns out that the page is dynamically loaded, then I would use a MutationObserver and for now, that would limit us to Firefox / Greasemonkey.

So while I haven't specifically added a button to an assignment, it sounds right in the neighborhood of what I have done. I haven't made an API call through JavaScript, but I've seen where  @codom  has. But I do it all through user scripts. I don't touch our global javascript file for things like this.

That probably brought up more questions than it answered, but I hope it at least provided some idea of what I was thinking about.

Cindy_Masek
Community Contributor

 @James ​  Thank you very much for your explanations and offers of sharing as a way of helping.  I'm sure these instructions will make sense as I begin diving in and working to learn more about them.  I do know and have used a pivot table before!  So I know something to start with!  You make a good point if we sit back and wait for native function the wait might be very long and finding a work-around is a realistic alternative.

 @kmeeusen ​ Thanks for reminding me that we aren't the only small college out there plugging away to make it all work with what we have. I hadn't thought of myself as someone who had the skills to hack the UI - but when I think of how we have a test instance - why not try.  And there is wisdom in not creating everything that everyone wants - it was the simplicity of Canvas over other LMS's that created part of the appeal.

Very good an useful conversations and insights all!

kona
Community Coach
Community Coach

 @Cindy_Masek ​, many of us in the Community (including Admins) aren't programmers! Luckily some of us have a programmer on campus that can help us, but if you don't maybe you could become friendly with one of your IT instructors. I married my campus programmer, but wouldn't necessarily want to recommend that to everyone. Smiley Wink

The awesomeness of what  @James ​ and a couple other programmers in the Community are doing is creating things that complete non-programmers (Admins and often faculty) can easily use to do things that aren't currently available on the front end of Canvas. I consider myself to be someone who knows almost nothing about programming, but have been able to quickly and easily follow James' directions (he normally makes video and text/screen shot directions) and download/use the different scripts/programs he's created. It's been both empowering and extremely satisfying to do this myself and get the needed/desired information. Smiley Happy

kmeeusen
Community Champion

Hi Cindy:

Two things.............

  1. Our state system chose Canvas three years ago, and part of why was that it was simple and easy to use - that appealed to us as well. That is why I am leery of all these feature requests, and vote many down - simple is good, and Canvas does not need to accommodate every users' preferred workflow.
  2. A few of us have created a Canvas Hacks Demo Course in Instructure Resources that anybody can be enrolled in. This course is a resource for folks who want to experiment with enhancing Canvas using coding (mostly HTML). The "hacks' range from very simple, to very complex and are organized into modules based on degree of complexity and all of the hacks include how-to instructions. You can be enrolled as: a Teacher so that you can also contribute your own hacks, or as a Student to view, borrow and try the stuff in there.

We are approaching 200 members and if you would like to be enrolled, shoot me your email address and I will hook you up. Just tell me what level of permission you would like, and you can always change your mind on that later.

Kelley

James
Community Champion

Status Update:

I've got the icon added to the assignments that have rubrics. I went with the rubric displayed at the bottom of the assignment page since that is only displayed when there actually is a rubric on the assignment. That symbol is the icon-ms-excel icon from the Canvas Style Guide.

2015-09-25_7-52-48.png

I also thought that on discussions, I could add it to the the pull-down at the top that has "Show Rubric". Quizzes are a different beast and I haven't even started looking at those yet.

I'm not sure what verbiage to use on the mouse over.

I could probably be easily convinced to make it a button at the top right under "Download Assignments" as Becky discussed. I originally had it there, but then wasn't sure where to put it for Discussions and wanted some consistent. I'm open to ideas, though.

I've got the downloading of the entire rubric from the Assignments API working, so I can get the labels that go with the values, not just the numbers themselves.

I found a JavaScript library that will create an Excel file within the browser, so it looks like I will be able to create a multi-page Excel file and have people download it as an .XLSX file. That's why I used the Excel icon instead of something else. Downloading as a .CSV is what everyone raves about, but to get a truly useful report, there are some aspects that don't make sense to repeat for every single item in the rubric, but only once per student. So it almost needs a summary and a detail page. That means .CSV is not the way to go, even though it's more widely supported. However, most people have some app that will open an Excel 2007+ file.

The JavaScript library supports writing a file, but most of the documentation is geared towards reading and parsing a file, so it may take a while to figure out how to do the other.

There's also a question of where the best place to post the announcement and final script are. I had a nugget that  @codom ​ wrote and I cleaned up that adds a View All Grades for Student button to Canvas, but it was buried deep in a discussion that had a different correct answer and people are missing it. I'd hate for the same thing to happen here.

BKINNEY
Community Contributor

Wow. That was quite a post. Lots of good stuff there. I won't try to respond to every point, just a couple.

First, I totally agree that having a tool available in the context of the assignment page is way better than asking people to paste in a url from some other window. So, from that standpoint, I love the Greasemonkey approach, even though I do not personally use FF except when I have to test one of my pages against it.

Second, I had an interesting aborted email conversation with a colleague who had seen your Sorting Rubrics greasemonkey solution. She sent me a link to the post, asking if 'this was something we could do here'. She seemed to think it was something I would install, and that once installed, it would be available to anyone on our campus.  I pointed out that it is a client-side tool, and suggested that she try to follow your instructions herself to see whether she thought it was easy enough to push out as a suggestion to faculty. She never responded. This same person was more than happy to paste a url into my LTI solution. That was in her comfort zone. Installing a FF addon was not. It isn't really a matter of what is harder or easier, more a matter of familiarity.

That said, I DO think that the Greasemonkey approach is super-cool, and once you get the hang of it, more convenient than LTI. I will look into ways to promote the idea, and perhaps offer a Greasemonkey option to my existing API-enabled solution. That way people could use whichever approach they prefer.