Fix filepath-related crashes, organize files better, download single-student submissions, fix dependencies, etc. #6
38
export.py
38
export.py
|
@ -148,6 +148,18 @@ def makeValidFilename(input_str):
|
||||||
|
|
||||||
return input_str
|
return input_str
|
||||||
|
|
||||||
|
def makeValidFolderPath(input_str):
|
||||||
|
# Remove invalid characters
|
||||||
|
valid_chars = "-_.()/ %s%s" % (string.ascii_letters, string.digits)
|
||||||
|
input_str = "".join(c for c in input_str if c in valid_chars)
|
||||||
|
|
||||||
|
# Remove leading and trailing whitespace
|
||||||
|
input_str = input_str.lstrip().rstrip().strip("/").strip("\\")
|
||||||
|
|
||||||
|
# Replace path separators with OS default
|
||||||
|
input_str=input_str.replace("/",os.sep)
|
||||||
|
|
||||||
|
return input_str
|
||||||
|
|
||||||
def findCourseModules(course, course_view):
|
def findCourseModules(course, course_view):
|
||||||
modules_dir = os.path.join(DL_LOCATION, course_view.term,
|
modules_dir = os.path.join(DL_LOCATION, course_view.term,
|
||||||
|
@ -220,8 +232,9 @@ def findCourseModules(course, course_view):
|
||||||
|
|
||||||
|
|
||||||
def downloadCourseFiles(course, course_view):
|
def downloadCourseFiles(course, course_view):
|
||||||
|
# file full_name starts with "course files"
|
||||||
dl_dir = os.path.join(DL_LOCATION, course_view.term,
|
dl_dir = os.path.join(DL_LOCATION, course_view.term,
|
||||||
course_view.course_code, "files")
|
course_view.course_code)
|
||||||
|
|
||||||
# Create directory if not present
|
# Create directory if not present
|
||||||
if not os.path.exists(dl_dir):
|
if not os.path.exists(dl_dir):
|
||||||
|
@ -231,7 +244,14 @@ def downloadCourseFiles(course, course_view):
|
||||||
files = course.get_files()
|
files = course.get_files()
|
||||||
|
|
||||||
for file in files:
|
for file in files:
|
||||||
dl_path = os.path.join(dl_dir,
|
file_folder=course.get_folder(file.folder_id)
|
||||||
|
|
||||||
|
folder_dl_dir=os.path.join(dl_dir,makeValidFolderPath(file_folder.full_name))
|
||||||
|
|
||||||
|
if not os.path.exists(folder_dl_dir):
|
||||||
|
os.makedirs(folder_dl_dir)
|
||||||
|
|
||||||
|
dl_path = os.path.join(folder_dl_dir,
|
||||||
makeValidFilename(str(file.display_name)))
|
makeValidFilename(str(file.display_name)))
|
||||||
|
|
||||||
# Download file if it doesn't already exist
|
# Download file if it doesn't already exist
|
||||||
|
@ -253,13 +273,13 @@ def download_submission_attachments(course, course_view):
|
||||||
|
|
||||||
for assignment in course_view.assignments:
|
for assignment in course_view.assignments:
|
||||||
for submission in assignment.submissions:
|
for submission in assignment.submissions:
|
||||||
attachment_dir = os.path.join(course_dir, assignment.title,
|
attachment_dir = os.path.join(course_dir, "assignments", assignment.title,
|
||||||
str(submission.user_id))
|
str(submission.user_id))
|
||||||
if not os.path.exists(attachment_dir):
|
if (not os.path.exists(attachment_dir)) and (submission.attachments):
|
||||||
os.makedirs(attachment_dir)
|
os.makedirs(attachment_dir)
|
||||||
for attachment in submission.attachments:
|
for attachment in submission.attachments:
|
||||||
filepath = os.path.join(attachment_dir, str(attachment.id) +
|
filepath = os.path.join(attachment_dir, makeValidFilename(str(attachment.id) +
|
||||||
"_" + attachment.filename)
|
"_" + attachment.filename))
|
||||||
if not os.path.exists(filepath):
|
if not os.path.exists(filepath):
|
||||||
print('Downloading attachment: {}'.format(filepath))
|
print('Downloading attachment: {}'.format(filepath))
|
||||||
r = requests.get(attachment.url, allow_redirects=True)
|
r = requests.get(attachment.url, allow_redirects=True)
|
||||||
|
@ -337,7 +357,7 @@ def findCourseAssignments(course):
|
||||||
|
|
||||||
# Title
|
# Title
|
||||||
if hasattr(assignment, "name"):
|
if hasattr(assignment, "name"):
|
||||||
assignment_view.title = str(assignment.name)
|
assignment_view.title = makeValidFilename(str(assignment.name))
|
||||||
else:
|
else:
|
||||||
assignment_view.title = ""
|
assignment_view.title = ""
|
||||||
# Description
|
# Description
|
||||||
|
@ -534,10 +554,10 @@ def getCourseView(course):
|
||||||
course_view = courseView()
|
course_view = courseView()
|
||||||
|
|
||||||
# Course term
|
# Course term
|
||||||
course_view.term = course.term["name"] if hasattr(course, "term") and "name" in course.term.keys() else ""
|
course_view.term = makeValidFilename(course.term["name"] if hasattr(course, "term") and "name" in course.term.keys() else "")
|
||||||
|
|
||||||
# Course code
|
# Course code
|
||||||
course_view.course_code = course.course_code if hasattr(course, "course_code") else ""
|
course_view.course_code = makeValidFilename(course.course_code if hasattr(course, "course_code") else "")
|
||||||
|
|
||||||
# Course name
|
# Course name
|
||||||
course_view.name = course.name if hasattr(course, "name") else ""
|
course_view.name = course.name if hasattr(course, "name") else ""
|
||||||
|
|
Loading…
Reference in New Issue