feat: support zip for prepare assignment & late file

This commit is contained in:
张泊明518370910136 2021-10-14 18:51:44 +08:00
parent ba88605f8e
commit ec3346b9ba
No known key found for this signature in database
GPG Key ID: FBEF5DE8B9F4C629
2 changed files with 14 additions and 3 deletions

View File

@ -113,8 +113,8 @@ def get_repos_status(
"prepare-assignment-dir", "prepare-assignment-dir",
help='prepare assignment dir from extracted canvas "Download Submissions" zip', help='prepare assignment dir from extracted canvas "Download Submissions" zip',
) )
def prepare_assignment_dir(dir: Path) -> None: def prepare_assignment_dir(dir_or_zip_file: Path) -> None:
tea.pot.canvas.prepare_assignment_dir(str(dir)) tea.pot.canvas.prepare_assignment_dir(str(dir_or_zip_file))
@app.command( @app.command(

View File

@ -36,7 +36,14 @@ class Canvas:
self.score_filename = score_filename self.score_filename = score_filename
logger.debug("Canvas initialized") logger.debug("Canvas initialized")
def prepare_assignment_dir(self, dir: str, create_score_file: bool = True) -> None: def prepare_assignment_dir(
self, dir_or_zip_file: str, create_score_file: bool = True
) -> None:
if os.path.isdir(dir_or_zip_file):
dir = dir_or_zip_file
else:
dir = os.path.splitext(dir_or_zip_file)[0]
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():
new_path = os.path.join(dir, v) new_path = os.path.join(dir, v)
@ -47,12 +54,14 @@ class Canvas:
if "_" not in file_name: if "_" not in file_name:
continue continue
segments = file_name.split("_") segments = file_name.split("_")
is_late = False
if segments[1] == "late": if segments[1] == "late":
file_id = int(segments[2]) file_id = int(segments[2])
student = first( student = first(
self.students, lambda x: x.login_id == login_ids[file_id] self.students, lambda x: x.login_id == login_ids[file_id]
) )
logger.info(f"{student} submits late") logger.info(f"{student} submits late")
is_late = True
else: else:
file_id = int(segments[1]) file_id = int(segments[1])
target_dir = os.path.join(dir, login_ids[file_id]) target_dir = os.path.join(dir, login_ids[file_id])
@ -61,6 +70,8 @@ class Canvas:
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))
if is_late:
open(os.path.join(target_dir, "SUBMIT_LATE"), mode="w")
if create_score_file: if create_score_file:
open(os.path.join(target_dir, self.score_filename), mode="w") open(os.path.join(target_dir, self.score_filename), mode="w")