feat: joj3 commands load settings from file

This commit is contained in:
张泊明518370910136 2024-09-12 17:58:25 -04:00
parent 5426d4c0b2
commit 0c2fdaaa34
GPG Key ID: CA088E6D9284F870
3 changed files with 14 additions and 4 deletions

View File

@ -6,6 +6,7 @@ from typing import List
from git import Repo from git import Repo
from typer import Argument, Option, Typer, echo from typer import Argument, Option, Typer, echo
from joint_teapot.config import Settings, set_settings, settings
from joint_teapot.teapot import Teapot from joint_teapot.teapot import Teapot
from joint_teapot.utils import joj3 from joint_teapot.utils import joj3
from joint_teapot.utils.logger import logger from joint_teapot.utils.logger import logger
@ -205,10 +206,11 @@ def unsubscribe_from_repos(pattern: str = Argument("")) -> None:
@app.command( @app.command(
"JOJ3-scoreboard", "joj3-scoreboard",
help="parse JOJ3 score json file into scoreboard and upload to gitea", help="parse JOJ3 score json file into scoreboard and upload to gitea",
) )
def JOJ3_scoreboard( def JOJ3_scoreboard(
env_path: str = Argument("", help="path to .env file"),
scorefile_path: str = Argument( scorefile_path: str = Argument(
"", help="path to score json file generated by JOJ3" "", help="path to score json file generated by JOJ3"
), ),
@ -224,6 +226,7 @@ def JOJ3_scoreboard(
"", help="name of scoreboard file in the gitea repo" "", help="name of scoreboard file in the gitea repo"
), ),
) -> None: ) -> None:
set_settings(Settings(_env_file=env_path))
repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading") repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading")
repo: Repo = tea.pot.git.get_repo(repo_name) repo: Repo = tea.pot.git.get_repo(repo_name)
if "grading" not in repo.remote().refs: if "grading" not in repo.remote().refs:
@ -248,10 +251,11 @@ def JOJ3_scoreboard(
@app.command( @app.command(
"JOJ3-failed-table", "joj3-failed-table",
help="parse JOJ3 score json file into failed table markdown file and upload to gitea", help="parse JOJ3 score json file into failed table markdown file and upload to gitea",
) )
def JOJ3_failed_table( def JOJ3_failed_table(
env_path: str = Argument("", help="path to .env file"),
scorefile_path: str = Argument( scorefile_path: str = Argument(
"", help="path to score json file generated by JOJ3" "", help="path to score json file generated by JOJ3"
), ),
@ -271,6 +275,7 @@ def JOJ3_failed_table(
"", help="name of failed table file in the gitea repo" "", help="name of failed table file in the gitea repo"
), ),
) -> None: ) -> None:
set_settings(Settings(_env_file=env_path))
repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading") repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading")
repo: Repo = tea.pot.git.get_repo(repo_name) repo: Repo = tea.pot.git.get_repo(repo_name)
if "grading" not in repo.remote().refs: if "grading" not in repo.remote().refs:

View File

@ -48,4 +48,9 @@ def get_settings() -> Settings:
return Settings() return Settings()
def set_settings(new_settings: Settings) -> None:
for field, value in new_settings.model_dump(exclude_unset=True).items():
setattr(settings, field, value)
settings: Settings = get_settings() settings: Settings = get_settings()

View File

@ -57,10 +57,10 @@ def generate_scoreboard(
# Update data # Update data
with open(score_file_path) as json_file: with open(score_file_path) as json_file:
scorefile: List[Dict[str, Any]] = json.load(json_file) stages: List[Dict[str, Any]] = json.load(json_file)
exercise_total_score = 0 exercise_total_score = 0
for stage in scorefile: for stage in stages:
for result in stage["results"]: for result in stage["results"]:
exercise_total_score += result["score"] exercise_total_score += result["score"]
submitter_row[columns.index(exercise_name)] = str(exercise_total_score) submitter_row[columns.index(exercise_name)] = str(exercise_total_score)