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
|
dir = dir_or_zip_file
|
||||||
else:
|
else:
|
||||||
dir = os.path.splitext(dir_or_zip_file)[0]
|
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)
|
extract_archive(dir_or_zip_file, outdir=dir, verbosity=-1)
|
||||||
login_ids = {stu.id: stu.login_id for stu in self.students}
|
login_ids = {stu.id: stu.login_id for stu in self.students}
|
||||||
for v in login_ids.values():
|
for v in login_ids.values():
|
||||||
|
@ -51,25 +54,40 @@ class Canvas:
|
||||||
os.mkdir(new_path)
|
os.mkdir(new_path)
|
||||||
if create_score_file:
|
if create_score_file:
|
||||||
open(os.path.join(new_path, self.score_filename), mode="w")
|
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, "*")):
|
for path in glob(os.path.join(dir, "*")):
|
||||||
|
print(path)
|
||||||
file_name = os.path.basename(path)
|
file_name = os.path.basename(path)
|
||||||
if "_" not in file_name:
|
if "_" not in file_name:
|
||||||
continue
|
continue
|
||||||
segments = file_name.split("_")
|
segments = file_name.split("_")
|
||||||
if segments[1] == "late":
|
if segments[1] == "late":
|
||||||
file_id = int(segments[2])
|
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:
|
else:
|
||||||
file_id = int(segments[1])
|
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:
|
try:
|
||||||
extract_archive(path, outdir=target_dir, verbosity=-1)
|
extract_archive(path, outdir=target_dir, verbosity=-1)
|
||||||
os.remove(path)
|
os.remove(path)
|
||||||
except PatoolError:
|
except PatoolError:
|
||||||
os.rename(path, os.path.join(target_dir, file_name))
|
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:
|
def upload_assignment_scores(self, dir: str, assignment_name: str) -> None:
|
||||||
assignment = first(self.assignments, lambda x: x.name == assignment_name)
|
assignment = first(self.assignments, lambda x: x.name == assignment_name)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user