data load improvements
* support given date for pull * support load for user score not in game db yet
This commit is contained in:
@@ -84,7 +84,9 @@ def _save_db_scores(
|
|||||||
db_holes = db.get_holes(game_no, ensure_all=True)
|
db_holes = db.get_holes(game_no, ensure_all=True)
|
||||||
db_scores = db.get_scores(game_no)
|
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_update = []
|
||||||
to_create = []
|
to_create = []
|
||||||
@@ -95,6 +97,7 @@ def _save_db_scores(
|
|||||||
continue
|
continue
|
||||||
db_user_match = [u for u in db_users if u.username == user]
|
db_user_match = [u for u in db_users if u.username == user]
|
||||||
if not db_user_match:
|
if not db_user_match:
|
||||||
|
rich.print(f"[yellow]User {user} not in database, cannot add scores.")
|
||||||
continue
|
continue
|
||||||
db_user = db_user_match[0]
|
db_user = db_user_match[0]
|
||||||
twitter_score = twitter_scores.get(user, None)
|
twitter_score = twitter_scores.get(user, None)
|
||||||
@@ -169,6 +172,11 @@ def _get_day():
|
|||||||
days.add_argument(
|
days.add_argument(
|
||||||
"--wordle-day", type=int, help="The wordle day number for the score report."
|
"--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()
|
args = parser.parse_args()
|
||||||
wordle_day = wordlinator.utils.WORDLE_TODAY
|
wordle_day = wordlinator.utils.WORDLE_TODAY
|
||||||
if args.wordle_day:
|
if args.wordle_day:
|
||||||
@@ -177,6 +185,8 @@ def _get_day():
|
|||||||
wordle_day = wordlinator.utils.WordleDay.from_wordle_no(
|
wordle_day = wordlinator.utils.WordleDay.from_wordle_no(
|
||||||
wordle_day.wordle_no - args.days_ago
|
wordle_day.wordle_no - args.days_ago
|
||||||
)
|
)
|
||||||
|
elif args.date:
|
||||||
|
wordle_day = wordlinator.utils.WordleDay.from_date(args.date)
|
||||||
return wordle_day
|
return wordle_day
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import argparse
|
||||||
import dataclasses
|
import dataclasses
|
||||||
import datetime
|
import datetime
|
||||||
import typing
|
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)]
|
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
|
@dataclasses.dataclass
|
||||||
class GolfHole:
|
class GolfHole:
|
||||||
game_no: int
|
game_no: int
|
||||||
|
|||||||
@@ -153,8 +153,12 @@ class UserRow(ScoreRow):
|
|||||||
|
|
||||||
|
|
||||||
class ScoreMatrix(ScoreContainer):
|
class ScoreMatrix(ScoreContainer):
|
||||||
def by_user(self):
|
def by_user(self, usernames: typing.List[str] = []):
|
||||||
return self.dict_by("user_id.username", UserRow)
|
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):
|
def for_user(self, username):
|
||||||
user_scores = [s for s in self._scores if s.user_id.username == username]
|
user_scores = [s for s in self._scores if s.user_id.username == username]
|
||||||
|
|||||||
Reference in New Issue
Block a user