feat: optimize prepare assignment logic
This commit is contained in:
parent
e438f02b23
commit
48feb3e244
|
@ -43,6 +43,9 @@ class Canvas:
|
|||
dir = dir_or_zip_file
|
||||
else:
|
||||
dir = os.path.splitext(dir_or_zip_file)[0]
|
||||
if os.path.exists(dir):
|
||||
logger.error(f"{dir} exists, can not unzip submissions file")
|
||||
return
|
||||
extract_archive(dir_or_zip_file, outdir=dir, verbosity=-1)
|
||||
login_ids = {stu.id: stu.login_id for stu in self.students}
|
||||
for v in login_ids.values():
|
||||
|
@ -51,25 +54,40 @@ class Canvas:
|
|||
os.mkdir(new_path)
|
||||
if create_score_file:
|
||||
open(os.path.join(new_path, self.score_filename), mode="w")
|
||||
late_students = set()
|
||||
submitted_ids = set()
|
||||
for path in glob(os.path.join(dir, "*")):
|
||||
print(path)
|
||||
file_name = os.path.basename(path)
|
||||
if "_" not in file_name:
|
||||
continue
|
||||
segments = file_name.split("_")
|
||||
if segments[1] == "late":
|
||||
file_id = int(segments[2])
|
||||
student = first(
|
||||
self.students, lambda x: x.login_id == login_ids[file_id]
|
||||
)
|
||||
logger.info(f"{student} submits late")
|
||||
else:
|
||||
file_id = int(segments[1])
|
||||
target_dir = os.path.join(dir, login_ids[file_id])
|
||||
login_id = login_ids[file_id]
|
||||
if segments[1] == "late":
|
||||
student = first(self.students, lambda x: x.login_id == login_id)
|
||||
late_students.add(student)
|
||||
target_dir = os.path.join(dir, login_id)
|
||||
try:
|
||||
extract_archive(path, outdir=target_dir, verbosity=-1)
|
||||
os.remove(path)
|
||||
except PatoolError:
|
||||
os.rename(path, os.path.join(target_dir, file_name))
|
||||
submitted_ids.add(login_id)
|
||||
if login_ids:
|
||||
no_submission_students = [
|
||||
first(self.students, lambda x: x.login_id == login_id)
|
||||
for login_id in set(login_ids.values()) - submitted_ids
|
||||
]
|
||||
if no_submission_students:
|
||||
tmp = ", ".join([str(student) for student in no_submission_students])
|
||||
logger.info(f"No submission student(s): {tmp}")
|
||||
if late_students:
|
||||
tmp = ", ".join([str(student) for student in late_students])
|
||||
logger.info(f"Late student(s): {tmp}")
|
||||
|
||||
def upload_assignment_scores(self, dir: str, assignment_name: str) -> None:
|
||||
assignment = first(self.assignments, lambda x: x.name == assignment_name)
|
||||
|
|
Loading…
Reference in New Issue
Block a user