From e438f02b2347a7b71cc934579efd5657bbff2ef8 Mon Sep 17 00:00:00 2001
From: BoYanZh <bomingzh@sjtu.edu.cn>
Date: Thu, 14 Oct 2021 20:27:39 +0800
Subject: [PATCH] fix: canvas score file

---
 examples/ve482.py              |  5 ++++-
 joint_teapot/teapot.py         |  1 +
 joint_teapot/workers/canvas.py |  8 +++++---
 joint_teapot/workers/gitea.py  | 11 ++++++-----
 4 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/examples/ve482.py b/examples/ve482.py
index 86ed9fb..2270d0e 100644
--- a/examples/ve482.py
+++ b/examples/ve482.py
@@ -6,6 +6,7 @@ from joint_teapot import Teapot, logger
 
 class MyTeapot(Teapot):
     def ve482p1(self) -> None:
+        fault_repos = []
         for repo_name in self.gitea.get_all_repo_names():
             if not repo_name.endswith("p1"):
                 continue
@@ -14,7 +15,7 @@ class MyTeapot(Teapot):
             if succeed:
                 contain_c_file = False
                 contain_readme_file = False
-                for fn in glob.glob(f"{self.git.repos_dir}/{repo_name}/*.*"):
+                for fn in glob.glob(f"{self.git.repos_dir}/{repo_name}/*"):
                     basename = ntpath.basename(fn)
                     if basename.endswith(".c"):
                         contain_c_file = True
@@ -44,6 +45,8 @@ class MyTeapot(Teapot):
                         "title": "p1 submission pre-check failed",
                     },
                 )
+                fault_repos.append(repo_name)
+        logger.info(f"{len(fault_repos)} fault repo(s): {fault_repos}")
 
 
 if __name__ == "__main__":
diff --git a/joint_teapot/teapot.py b/joint_teapot/teapot.py
index bfc0542..1ff6e88 100644
--- a/joint_teapot/teapot.py
+++ b/joint_teapot/teapot.py
@@ -118,6 +118,7 @@ class Teapot:
         release = first(repo_releases, lambda item: item.name == release_name)
         if release is None or release.created_at.replace(tzinfo=None) >= due:
             return False
+        # TODO: checkout by commit hash to prevent re-create tag
         self.git.repo_clean_and_checkout(repo_name, f"tags/{release.tag_name}")
         logger.info(
             f"{self.gitea.org_name}/{repo_name} checkout to "
diff --git a/joint_teapot/workers/canvas.py b/joint_teapot/workers/canvas.py
index b2f5d48..55c1edc 100644
--- a/joint_teapot/workers/canvas.py
+++ b/joint_teapot/workers/canvas.py
@@ -49,6 +49,8 @@ class Canvas:
             new_path = os.path.join(dir, v)
             if not os.path.exists(new_path):
                 os.mkdir(new_path)
+            if create_score_file:
+                open(os.path.join(new_path, self.score_filename), mode="w")
         for path in glob(os.path.join(dir, "*")):
             file_name = os.path.basename(path)
             if "_" not in file_name:
@@ -68,8 +70,6 @@ class Canvas:
                 os.remove(path)
             except PatoolError:
                 os.rename(path, os.path.join(target_dir, file_name))
-            if create_score_file:
-                open(os.path.join(target_dir, self.score_filename), mode="w")
 
     def upload_assignment_scores(self, dir: str, assignment_name: str) -> None:
         assignment = first(self.assignments, lambda x: x.name == assignment_name)
@@ -88,7 +88,9 @@ class Canvas:
                 "submission": {"posted_grade": float(score)},
                 "comment": {"text_comment": "".join(comments)},
             }
-            logger.info(f"{assignment} {student} {data.__repr__()}")
+            logger.info(
+                f"Uploading grade for {assignment} {student}: {data.__repr__()}"
+            )
             submission.edit(**data)
 
 
diff --git a/joint_teapot/workers/gitea.py b/joint_teapot/workers/gitea.py
index 897b424..959765c 100644
--- a/joint_teapot/workers/gitea.py
+++ b/joint_teapot/workers/gitea.py
@@ -351,13 +351,14 @@ class Gitea:
         return False
 
     def close_all_issues(self) -> None:
-        for repo in list_all(self.organization_api.org_list_repos, self.org_name):
-            for issue in list_all(
-                self.issue_api.issue_list_issues, self.org_name, repo.name
-            ):
+        for repo_name in self.get_all_repo_names():
+            issues = list_all(
+                self.issue_api.issue_list_issues, self.org_name, repo_name
+            )
+            for issue in issues:
                 if issue.state != "closed":
                     self.issue_api.issue_edit_issue(
-                        self.org_name, repo.name, issue.number, body={"state": "closed"}
+                        self.org_name, repo_name, issue.number, body={"state": "closed"}
                     )
 
     def archieve_all_repos(self) -> None: