From e6340a94ceb68fbaac98b7cfc2dbfd4f9fb7639b Mon Sep 17 00:00:00 2001 From: tom_taylor Date: Wed, 18 Sep 2024 20:57:26 +0000 Subject: [PATCH] Upload files to "/" this was for uploading quiz#3 which accidentally had front and back pages, to student's canvas shell --- upload_student_quiz3.py | 180 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 upload_student_quiz3.py diff --git a/upload_student_quiz3.py b/upload_student_quiz3.py new file mode 100644 index 0000000..5e06d40 --- /dev/null +++ b/upload_student_quiz3.py @@ -0,0 +1,180 @@ +# This program places questions in an existing homework assignment +from canvasapi import Canvas +from canvasapi import exceptions as canvas_exceptions +from os import chdir, listdir +import csv +from time import sleep + + +# location of the questions +API_URL = 'https://asu.instructure.com' +API_KEY = '''put api key here''' + +# Initialize a new Canvas object +canvas = Canvas(API_URL, API_KEY) +print('type of canvas:',type(canvas)) + +# test course +courseno = '''canvas course number for your courses''' #mat343 + +course = canvas.get_course(courseno) + +inventory = [] +with open('/Volumes/NO NAME/inventoryQ3_mat343.txt','r') as f : + csvreader = csv.reader(f, delimiter='\t') + for row in csvreader : + inventory += [row] + + +assignment_name = 'quiz3' +# get all the assignments from the Canvas course +assignments = course.get_assignments() +# assignments is a paginated list +# run through until you find the one you want +for a in assignments: + if assignment_name in a.name: + assignment = a + print('assignment:', assignment) + else : + print(a) + continue + +'''note that you need to set the assignment submission type to online:file_uploads, and the dates of submission need to include the date that you're actually submitting''' + + +for indx in range(len(inventory)) : + row = inventory[ indx ] + if row[5][-4:] != '.pdf' : + print('row has no filename:',row) + continue + print(row[0],row[1]) + stu_id = row[1] + # This is the ID from the Canvas gradebook for the student + + # The assignment must already exist in Canvas, be sure to create it first + # The assignment name is a unique portion of the assignment name in canvas + + + # location of the file to upload + file_name = '/Volumes/NO NAME/quiz3/' + row[ 5 ] + # Uploading directly to the assignment submission generates an error. + # First upload the file and associate with the student + try : + file_submission_tuple = assignment.upload_to_submission(file_name, user=stu_id) + except canvas_exceptions.Forbidden as err : + print('forbidden exception#1', row[0], row[1], err) + continue + # get the dictionary of information about the file that includes the id of the file + + file_submission = file_submission_tuple[1] + #print('file_submission', file_submission) + + # create a submission for the student + + submission = {} + submission[ 'user_id' ] = stu_id + submission[ 'submission_type' ] = 'online_upload' + + # the file has already been uploaded to canvas + # associate the file with this submission here + # I believe this "tricks" Canvas into thinking the student uploaded the file + + submission['file_ids'] = [file_submission['id']] + + # create a dictionary with the details of the submission + try : + assignment.submit(submission) + except canvas_exceptions.Forbidden as err : + print('forbidden exception#2', row[0], err) + continue + + # grading requires updating the subission. Probably because canvas thinks the initial submission comes from the student + + submission = assignment.get_submission(stu_id) + submission.edit(submission={'posted_grade':row[3]}) + sleep(1) + + +# // The submission's assignment id +# "assignment_id": 23, +# // The submission's assignment (see the assignments API) (optional) +# "assignment": null, +# // The submission's course (see the course API) (optional) +# "course": null, +# // This is the submission attempt number. +# "attempt": 1, +# // The content of the submission, if it was submitted directly in a text field. +# "body": "There are three factors too...", +# // The grade for the submission, translated into the assignment grading scheme +# // (so a letter grade, for example). +# "grade": "A-", +# // A boolean flag which is false if the student has re-submitted since the +# // submission was last graded. +# "grade_matches_current_submission": true, +# // URL to the submission. This will require the user to log in. +# "html_url": "http://example.com/courses/255/assignments/543/submissions/134", +# // URL to the submission preview. This will require the user to log in. +# "preview_url": "http://example.com/courses/255/assignments/543/submissions/134?preview=1", +# // The raw score +# "score": 13.5, +# // Associated comments for a submission (optional) +# "submission_comments": null, +# // The types of submission ex: +# // ('online_text_entry'|'online_url'|'online_upload'|'online_quiz'|'media_record +# // ing'|'student_annotation') +# "submission_type": "online_text_entry", +# // The timestamp when the assignment was submitted +# "submitted_at": "2012-01-01T01:00:00Z", +# // The URL of the submission (for 'online_url' submissions). +# "url": null, +# // The id of the user who created the submission +# "user_id": 134, +# // The id of the user who graded the submission. This will be null for +# // submissions that haven't been graded yet. It will be a positive number if a +# // real user has graded the submission and a negative number if the submission +# // was graded by a process (e.g. Quiz autograder and autograding LTI tools). +# // Specifically autograded quizzes set grader_id to the negative of the quiz id. +# // Submissions autograded by LTI tools set grader_id to the negative of the tool +# // id. +# "grader_id": 86, +# "graded_at": "2012-01-02T03:05:34Z", +# // The submissions user (see user API) (optional) +# "user": null, +# // Whether the submission was made after the applicable due date +# "late": false, +# // Whether the assignment is visible to the user who submitted the assignment. +# // Submissions where `assignment_visible` is false no longer count towards the +# // student's grade and the assignment can no longer be accessed by the student. +# // `assignment_visible` becomes false for submissions that do not have a grade +# // and whose assignment is no longer assigned to the student's section. +# "assignment_visible": true, +# // Whether the assignment is excused. Excused assignments have no impact on a +# // user's grade. +# "excused": true, +# // Whether the assignment is missing. +# "missing": true, +# // The status of the submission in relation to the late policy. Can be late, +# // missing, extended, none, or null. +# "late_policy_status": "missing", +# // The amount of points automatically deducted from the score by the +# // missing/late policy for a late or missing assignment. +# "points_deducted": 12.3, +# // The amount of time, in seconds, that an submission is late by. +# "seconds_late": 300, +# // The current state of the submission +# "workflow_state": "submitted", +# // Extra submission attempts allowed for the given user and assignment. +# "extra_attempts": 10, +# // A unique short ID identifying this submission without reference to the owning +# // user. Only included if the caller has administrator access for the current +# // account. +# "anonymous_id": "acJ4Q", +# // The date this submission was posted to the student, or nil if it has not been +# // posted. +# "posted_at": "2020-01-02T11:10:30Z", +# // The read status of this submission for the given user (optional). Including +# // read_status will mark submission(s) as read. +# "read_status": "read", +# // This indicates whether the submission has been reassigned by the instructor. +# "redo_request": true +# }