data load improvements

* support given date for pull
* support load for user score not in game db yet
This commit is contained in:
2022-06-20 10:33:49 -05:00
parent e94d0a7714
commit f5bf263635
3 changed files with 26 additions and 3 deletions

View File

@@ -84,7 +84,9 @@ def _save_db_scores(
db_holes = db.get_holes(game_no, ensure_all=True)
db_scores = db.get_scores(game_no)
db_scores_by_user = wordlinator.utils.scores.ScoreMatrix(db_scores).by_user()
db_scores_by_user = wordlinator.utils.scores.ScoreMatrix(db_scores).by_user(
usernames=list(scores.keys())
)
to_update = []
to_create = []
@@ -95,6 +97,7 @@ def _save_db_scores(
continue
db_user_match = [u for u in db_users if u.username == user]
if not db_user_match:
rich.print(f"[yellow]User {user} not in database, cannot add scores.")
continue
db_user = db_user_match[0]
twitter_score = twitter_scores.get(user, None)
@@ -169,6 +172,11 @@ def _get_day():
days.add_argument(
"--wordle-day", type=int, help="The wordle day number for the score report."
)
days.add_argument(
"--date",
type=wordlinator.utils.date_from_string,
help="a YYYY-MM-DD format date to pull a score report.",
)
args = parser.parse_args()
wordle_day = wordlinator.utils.WORDLE_TODAY
if args.wordle_day:
@@ -177,6 +185,8 @@ def _get_day():
wordle_day = wordlinator.utils.WordleDay.from_wordle_no(
wordle_day.wordle_no - args.days_ago
)
elif args.date:
wordle_day = wordlinator.utils.WordleDay.from_date(args.date)
return wordle_day

View File

@@ -1,3 +1,4 @@
import argparse
import dataclasses
import datetime
import typing
@@ -7,6 +8,14 @@ WORDLE_DAY_ZERO = datetime.date(2021, 6, 19)
WORDLE_GOLF_ROUND_DATES = [datetime.date(2022, 5, 9), datetime.date(2022, 5, 31)]
def date_from_string(datestr: str):
try:
return datetime.date.fromisoformat(datestr)
except ValueError:
msg = "Invalid date string, expected format: YYYY-mm-DD"
raise argparse.ArgumentTypeError(msg)
@dataclasses.dataclass
class GolfHole:
game_no: int

View File

@@ -153,8 +153,12 @@ class UserRow(ScoreRow):
class ScoreMatrix(ScoreContainer):
def by_user(self):
return self.dict_by("user_id.username", UserRow)
def by_user(self, usernames: typing.List[str] = []):
res = self.dict_by("user_id.username", UserRow)
for username in usernames:
if username not in res:
res[username] = UserRow([], username)
return res
def for_user(self, username):
user_scores = [s for s in self._scores if s.user_id.username == username]