Celebrate Excellence in Education: Nominate Outstanding Educators by April 15!
Found this content helpful? Log in or sign up to leave a like!
Hello!
I use Discussion Posts as the primary way my students submit their work. This submission is usually either text entered into the text editor box, a video file, or a Word file to download. I would like to download the submissions from the Discussion Posts just like I am able to download Assignment submissions. How do I download submissions for Discussion Posts?
Other posts to this forum that address this issue are from three years ago and had no real resolution. I am hoping that Canvas has corrected this problem and that I've simply missed the solution in my searches.
Solved! Go to Solution.
Good evening, @anchored21 ...
I don't think you're missing anything. Unfortunately, I don't believe that downloading attachments from discussion replies is possible ... at least not all at once. That would sure be nice, though. In searching the Community, I found some resources for you (some of which you may have also found in your own searching):
I would also point you to this Feature Idea that you may be interested in reading: Download discussion board posts - Canvas Community. If you feel this one aligns with something you'd like to see implemented in Canvas, you might want to consider giving it a star rating and also posting a comment to it letting the team of engineers at Instructure know why this would be important to you. This Guide gives more detail on the star rating system: How do idea conversations work in the Canvas Commu... - Canvas Community.
I know this probably isn't the answer you were looking for, but I hope it's helped to answer your question. Sing out if you have any other questions about this...thanks!
Good evening, @anchored21 ...
I don't think you're missing anything. Unfortunately, I don't believe that downloading attachments from discussion replies is possible ... at least not all at once. That would sure be nice, though. In searching the Community, I found some resources for you (some of which you may have also found in your own searching):
I would also point you to this Feature Idea that you may be interested in reading: Download discussion board posts - Canvas Community. If you feel this one aligns with something you'd like to see implemented in Canvas, you might want to consider giving it a star rating and also posting a comment to it letting the team of engineers at Instructure know why this would be important to you. This Guide gives more detail on the star rating system: How do idea conversations work in the Canvas Commu... - Canvas Community.
I know this probably isn't the answer you were looking for, but I hope it's helped to answer your question. Sing out if you have any other questions about this...thanks!
What I've been doing is selecting "all" of the page content, "copying" and then pasting it into a blank MS Word doc.
Crude, but effective. This is fine if I'm just trying to grab the raw content for future reference. It's searchable and readable. Word tries to "format" it, but ... well ... don't expect much.
Good enough for now.
So sad... so much discussion, over so many years, with so many participants... and no feature implemented.
Yes @rkelley1 - There is a lot of conversation around it, but it is aligned to a Theme, and that's great news! Hopefully, it is selected for voting in an upcoming window. How do I participate with themes?
Why does this site mark this as "Solved?" Did I miss an actual solution to this?
Hello @jrm4 ...
No...you're not missing anything. As I had indicated back in May 2021, this functionality is not possible. I believe the links that I had provided back then still hold true today. Even if functionality in Canvas is not possible, things can still be marked as "Solved". Essentially, it's like marking an answer as "correct" (which we used to be able to do in the old Community platform pre- August 2020) letting people know that a particular feature doesn't exist yet in Canvas. It's not necessarily "solved" in a way that Instructure fixed an issue. [Example: You can find many "known issues" listed here: Known Issues - Instructure Community (canvaslms.com)] Rather, it is marked as "solved" because the answer right now is, "no, this isn't current functionality". The links I had provided back in May to other similar questions all confirm that this functionality does not yet exist. But, the Feature Idea I linked to, Download discussion board posts - Instructure Community (canvaslms.com), does have an on-going discussion. So, you might want to add your comments there and give it a star rating to let Instructure know this would be important to you. How do idea conversations work in the Instructure ... - Instructure Community (canvaslms.com)
I hope this helps a bit to clarify things.
So you should change how you mark it. "In discussion" or "In progress" or something like that. I'm just pointing this out because it's super misleading for those of us, say, googling for a solution and seeing a highlighted word that strongly implies a solution exists, when it doesn't.
Hi there, @jrm4 ...
Unfortunately, I am not aware that this platform the Community site runs on has status descriptions of "in discussion" or "in progress" ... at least not in this part of the Community. This particular discussion is located in the Canvas Question Forum. This part of the Community is where people ask questions about Canvas...like how to do "x" or how to do "y". Questions can be marked with one or more "Solutions" ... as sometimes there is more than one way to accomplish the same thing...and so anything marked as a "Solution" is marked with a green border around it underneath the OP (original poster's) question...and this sometimes includes solutions that something, unfortunately, can't be done.
What I think you are really wanting is a way to see if this particular topic could have a status change. That is why I had originally linked to this Feature Idea: Download discussion board posts - Instructure Community (canvaslms.com). Feature Ideas have their own space here in the Community. And, if you take a look at this particular Feature Idea, it is still marked as "Open"...which means it is open for discussion and star ratings. Now, if you go here: Idea Conversations - Instructure Community (canvaslms.com) ... you'll find three drop-down lists that let you filter the many, many Feature Ideas that have already been submitted by people. You'll find other status labels such as "Moderating", "In Development", "On Beta", etc. [You can read more about each of these here: How do idea conversations work in the Instructure ... - Instructure Community (canvaslms.com)]. If and when the Feature Idea I linked to above moves forward, then Instructure will update that status from "Open" to something else.
Like you, I am a fellow Community member and don't have some of the super-admin abilities to make changes to how this platform operates. So, I hope that I've helped to clear up how both the Question Forum and the Feature Ideas spaces are different and how things work in each.
Have a good evening...be well.
Hello, I am also looking for information on how to download discussion board posts. The aforementioned solution isn't possible now as the Canvas Idea Conversation has been locked. I can't rate it or comment. Do you have another idea for those of us who would find this functionality extremely useful in our teaching?
Let me give you an honest answer, the people who work here or are coaching (I'lll bet a dollar they actually work here) are going to dress up their answers with a lot of blah blah.
The fact of the matter is, they *could* easily implement this if they wanted. I know this because I *teach, * among other things, advanced web programming.
They choose not to. I don't know why not, but it's why I don't have a lot of respect for this platform. If there were a reasonable answer for why (offhand, I can't think of one) they should give it.
So far, the "copy paste" answer is probably your best bet. That's what I did this semester. Later, I might see if there are any 3rd party discussion tools that can handle this better.
Hi @jrm4 -
I wanted to take a moment to clarify some of our user roles here in the Instructure Community.
The[Discussions] Download discussion board posts idea is linked to an Identified Theme, and that's great news. I know that it doesn't provide a timeline for development, but it does signify that the Product Team has evaluated the idea and will consider developing it in the future. However, the Theme itself needs to be voted on and then prioritized first. It may take some time to see the idea become a feature, but it is definitely a possibility. How do I participate with themes?
If you would prefer not to wait for the Ideas & Themes process, most of Canvas is open-sourced and available for anyone to download and customize. You can explore that option in the Instructure Canvas GitHub repository. With your development experience, you can potentially even do a pull request if you make changes that you'd like Instructure to consider adding back into the main code. I hope this option is helpful for you!
It's nice to get an honest answer with no gaslighting.
Hi jrm4, Did you find any external tools that could manage downloading the comments?
Working with graduate students in online seminars, this feature would be a game changer. Thanks.
Hi @jmessing,
Can I ask what you'd like to do with downloaded discussion content/posts? I'm curious because it could be possible to use the Canvas API to pull down some discussion content. Getting technical for a minute, this content would be in HTML, which isn't necessarily a great format to save. There's also a question of whether you'd want each post/reply as some kind of individual file, or if you just want to save the entire discussion thread as one big document?
I know some people have a desire to download an entire discussion so they could submit it to a plagiarism detection system, since it's not possible to check posts for plagiarism in Canvas right now. If this happens to be your intent (or the intent of anyone else who may read this post in the future), I'd say what you really want is the first option, even though you'll end up with a lot of files to check. With the second option, while it would be easy to upload one big document, there would be no clear owner/composer of that document which most plagiarism detection databases want to have. It would get likely put in as being created by you, which could create some copyright/ownership issues. Not saying don't do this at all, just raising awareness for the issue.
Depending on your answers, this could be something a coder could write something to handle for you, even if it doesn't get build into Canvas officially by Instructure.
-Chris
Thanks Chris. It’s for a record rather than plagiarism detection.
That was a quick reply :).
Okay, that should definitely be doable by using the API. I know this isn't something an average user would probably be able to tackle, but it's not out of the question for a coder. I've done some back-end API scripts, and could likely put together some kind of command-line type thing for this with Python, but most people probably wouldn't consider it to be super user friendly.
Let me ask a few more questions if you don't mind...
As you might already see, something that seems like a simple request (let me download a discussion) can get pretty complex pretty fast. I've only been thinking about this for 10 minutes or so and already come up with these questions. I'm sure Canvas developers have probably thought about something similar to this before and come up with way more questions than I have so far.
-Chris
Thanks Chris. It is something for me only.
Not necessary.
Yes
Hi @jmessing,
Thanks for the answers. I took a bit of my free time this evening just to play around with python to see if I could accomplish anything. I actually got a very very rough export of discussion text, which was cool. Then I tried adding some wrinkles like looking at a discussion post with an image, and then things started erroring out. There is probably a solution to the image issue, but I honestly can't spend too much of my family time on experiments like this. The good news is that as at least a proof of concept, something like this could be done. The bad news is that someone would have to dedicate time to doing it.
-Chris
Any chance you can share the python method? The discussions I need to download are only text replies. TY in advance
Update: I have posted a request to the Ideas section: https://community.canvaslms.com/t5/Canvas-Ideas/Add-download-function-to-discussion-board-threads/id...
Colleagues, feel free to give this idea some attention if you agree with me that to be able to download discussion posts would be a game-changing Canvas function!
I am a Mac user but I suppose this method could work for PC. I use a browser plugin called GoFullPage which can snapshot an entire browser page (including scrolling) into a PDF or PNG image. For each student, I go into SpeedGrader, move the rubric out of the frame (off to the right so it can't be seen), then use the browser to screenshot the entire page.
After I have done that for each student in each Discussion, I use a utility for combining images and PDFs into one PDF. (In Mac, its Combine PDF - it's a little buggy, and there are probably others out there, but this is the one I ha...). CombinePDF takes in both images and PDF files to combine into a single PDF, which I then label and email to each student.
The problem with this (other than the laborious process) is that it provides the student with a PDF that is an image of text - not actual selectable text. Still, if this is used as a study guide (which is my use case), it wouldn't matter too much. In a pinch, a student can always OCR the PDF using CloudConvert.com (free) or Adobe Acrobat, which make the text selectable.
It is not a complete solution but here is some code that shows you how to use the Canvas API to download discussion posts (including photos and links to videos) as a local HTML page
# ConcatenateDiscussions.py
#
# This code is not a complete solution. Rather it is a proof of concept that you can download discussion posts as an HMTL file.
# It takes the Canvas ID number of single student and downloads all the discussion posts of that student, embedding the images and the videos as iFrames.
# You can modify this code as you like.
# For me the difficult part was getting the contents of the discussion posts, including images and videos, as there is no direct API for that.
# I will put in a loop to iterate through all the students in my course, providing a portfolio of the year's achievement for each student.
# You could put it some code so that it only downloads answers from one assignment.
# YOu could get the code to put the hmtl in Canvas and send a Canvas message with the link to each student.
# https://community.canvaslms.com/t5/Developers-Group/Canvas-APIs-Getting-started-the-practical-ins-an...
# Coding assisted by AI: perplexity.ai
import csv
from canvasapi import Canvas
import html
import re
API_URL = "https://canvas.education.tas.gov.au/"
API_KEY = "NotMyRealAPIKey"
def clean_html_content(raw_html):
# Unescape HTML entities
unescaped = html.unescape(raw_html)
# Remove unnecessary whitespace
cleaned = ' '.join(unescaped.split())
# Function to clean up iframe tags
def clean_iframe(match):
iframe = match.group(0)
# Remove any inline styles
iframe = re.sub(r'style="[^"]*"', '', iframe)
# Add our own styling
iframe = iframe.replace('<iframe', '<iframe style="width: 400px; height: 225px; display: inline-block; margin: 5px;"')
return iframe
# Clean up iframe tags
cleaned = re.sub(r'<iframe[^>]*>.*?</iframe>', clean_iframe, cleaned, flags=re.DOTALL)
return cleaned
#Put in your API key (from settings on your Canvas user page)
canvas = Canvas(API_URL, API_KEY)
#Put in the real course number, taken from the URL of your course
course = canvas.get_course(999999)
print(course.name)
# Get all assignments for the course
assignments = course.get_assignments()
# Filter assignments to include only discussion posts
discussion_assignments = [
assignment for assignment in assignments
if 'discussion_topic' in assignment.submission_types
]
# Put in the real student ID number to test
student_id = 999999
# Get the student object to access their name
student = course.get_user(student_id)
file_name = f"{student.name.replace(' ', '')}.html"
# Add this CSS to your HTML head section:
css_styles = """
<style>
.video-placeholder {
width: 400px;
height: 225px;
background-color: #f0f0f0;
display: inline-block;
margin: 5px;
text-align: center;
line-height: 225px;
color: #666;
}
</style>
"""
# Include the CSS in your HTML content
html_content = f"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Discussion Posts for {student.name}</title>
<style>
body {{ font-family: Arial, sans-serif; line-height: 1.6; padding: 20px; }}
h1 {{ color: #333; }}
h2 {{ color: #666; }}
.post {{ margin-bottom: 20px; border-bottom: 1px solid #ccc; padding-bottom: 10px; }}
.post-info {{ font-style: italic; color: #888; }}
.post-content {{ margin-top: 10px; }}
</style>
{css_styles}
</head>
<body>
<h1>Discussion Posts for {student.name}</h1>
</body>
</html>
"""
# Get student's submissions for discussion assignments
for assignment in discussion_assignments:
html_content += f"<h2>Assignment: {assignment.name}</h2>"
# Get the discussion topic
if hasattr(assignment, 'discussion_topic'):
topic_id = assignment.discussion_topic['id']
discussion_topic = course.get_discussion_topic(topic_id)
# Get all top-level entries for this discussion topic
entries = discussion_topic.get_topic_entries()
for entry in entries:
if entry.user_id == student_id:
cleaned_message = clean_html_content(entry.message)
html_content += f"""
<div class="post">
<p class="post-info">Author: {entry.user['display_name']}</p>
<p class="post-info">Created at: {entry.created_at}</p>
<div class="post-content">{cleaned_message}</div>
</div>
"""
html_content += """
</body>
</html>
"""
# Save the HTML content to a file
with open(file_name, 'w', encoding='utf-8') as f:
f.write(html_content)
print(f"HTML file '{file_name}' has been created with the student's discussion posts.")
To participate in the Instructure Community, you need to sign up or log in:
Sign In