Skip to content

Commit

Permalink
Update accuracy summary
Browse files Browse the repository at this point in the history
  • Loading branch information
tsingwang committed Dec 8, 2024
1 parent 9aab69f commit ad3cbe5
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 28 deletions.
38 changes: 23 additions & 15 deletions tdict/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,9 @@ async def on_mount(self) -> None:
self.word_generator = db_api.list_today_words()
self.word = None
self.explanation = None
self.total_master = 0
self.total_forget = 0
r = db_api.get_review_history()
self.total_master = r.get("total_master", 0) if r else 0
self.total_forget = r.get("total_forget", 0) if r else 0
await self.next_word()

@work
Expand All @@ -145,17 +146,13 @@ async def next_word(self) -> None:
try:
self.word = next(self.word_generator)
except StopIteration:
self.word = None
if self.total_master + self.total_forget == 0:
self.query_one("#word").update("No schedule today, please add word.")
return
self.query_one("#word").update("Well done! See you tomorrow :)")
summary = "Accuracy: {}/{} = {:.2f}%".format(
self.total_master, self.total_master + self.total_forget,
100 * self.total_master / (self.total_master + self.total_forget)
)
self.query_one("#stats").update(summary)
return
# Refresh today word list
self.word_generator = db_api.list_today_words()
try:
self.word = next(self.word_generator)
except StopIteration:
self.word = None
return self.show_today_summary()

self.explanation = await youdao.query(self.word["word"])
if len(self.explanation.get('explanation', [])) > 0:
Expand All @@ -172,6 +169,17 @@ async def next_word(self) -> None:

youdao.play_voice(self.word["word"])

def show_today_summary(self) -> None:
if self.total_master + self.total_forget == 0:
self.query_one("#word").update("No schedule today, please add word.")
return
self.query_one("#word").update("Well done! See you tomorrow :)")
summary = "Accuracy: {}/{} = {:.2f}%".format(
self.total_master, self.total_master + self.total_forget,
100 * self.total_master / (self.total_master + self.total_forget)
)
self.query_one("#stats").update(summary)

async def action_delete_word(self) -> None:
if self.word is not None:
db_api.delete_word(self.word["word"])
Expand All @@ -182,7 +190,7 @@ async def action_play_voice(self) -> None:
youdao.play_voice(self.word["word"])

async def action_quit(self) -> None:
db_api.append_review_history(self.total_master, self.total_forget)
db_api.update_review_history(self.total_master, self.total_forget)


class TDictApp(App):
Expand All @@ -201,5 +209,5 @@ async def on_mount(self) -> None:

async def action_quit(self) -> None:
"""Override parent App method. Ctrl+C can be captured."""
await self.children[0].action_quit()
await self.get_screen("main").action_quit()
self.exit()
27 changes: 17 additions & 10 deletions tdict/db/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,18 +73,24 @@ def forget_word(word: str) -> None:
word.schedule_day = _schedule_day()


def append_review_history(total_master: int, total_forget: int):
def update_review_history(total_master: int, total_forget: int):
today = date.today()
with Session.begin() as session:
history = session.query(ReviewHistory).get(today)
if history:
history.total_master += total_master
history.total_forget += total_forget
history.total_master = total_master
history.total_forget = total_forget
else:
session.add(ReviewHistory(date=today, total_master=total_master,
total_forget=total_forget))


def get_review_history(date: date = date.today()) -> dict:
with Session.begin() as session:
r = session.query(ReviewHistory).get(date)
return r.to_dict() if r else None


def list_review_history(year: int|None = None) -> dict:
with Session.begin() as session:
if year:
Expand All @@ -95,18 +101,19 @@ def list_review_history(year: int|None = None) -> dict:
first_day = last_day - timedelta(days=last_day.weekday() + 52 * 7)

data = {
r.date: r.total_master + r.total_forget for r in session.query(ReviewHistory).\
filter(func.DATE(ReviewHistory.date) >= first_day).\
filter(func.DATE(ReviewHistory.date) <= last_day)
r.date: {"total_master": r.total_master,
"total_forget": r.total_forget} \
for r in session.query(ReviewHistory).\
filter(func.DATE(ReviewHistory.date) >= first_day).\
filter(func.DATE(ReviewHistory.date) <= last_day)
}

res = {}
while first_day <= last_day:
res[first_day] = 0
if first_day not in data:
data[first_day] = {"total_master": 0, "total_forget": 0}
first_day += timedelta(days=1)

res.update(data)
return res
return {k: v for k, v in sorted(data.items())}


def get_review_schedule() -> list:
Expand Down
3 changes: 3 additions & 0 deletions tdict/db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,8 @@ class ReviewHistory(Base):
total_master = Column(Integer, default=0)
total_forget = Column(Integer, default=0)

def to_dict(self):
return dict([(k, v) for k, v in self.__dict__.items() if k[0] != '_'])


Base.metadata.create_all(engine)
7 changes: 4 additions & 3 deletions tdict/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ async def query_word(word: str) -> None:
w["review_count"], w["forget_count"]))


def print_word_list(offset: int = 0, limit: int = 20) -> None:
def print_word_list(offset: int = 0, limit: int = 100) -> None:
table = Table(box=None)
table.add_column("SCHEDULE", justify="right")
table.add_column("WORD", justify="right", style="green bold")
Expand All @@ -40,13 +40,14 @@ def show_review_history(year: int|None) -> None:
total_days, reviewed_days, reviewed_words = 0, 0, 0
lines = [[] for i in range(7)]
n = 0
for first, last, (date, word_count) in loop_first_last(
for first, last, (date, v) in loop_first_last(
db_api.list_review_history(year).items()):
if first:
while n < date.weekday():
lines[n].append("~~")
n += 1

word_count = v.get("total_master", 0) + v.get("total_forget", 0)
total_days += 1
if word_count > 0:
reviewed_days += 1
Expand Down Expand Up @@ -87,7 +88,7 @@ def main():
parser = argparse.ArgumentParser()
parser.add_argument("word", nargs='?', help="The word to query.")
parser.add_argument("-u", dest="user", help="Use the user account.")
parser.add_argument("-l", dest="list", nargs='?', const="0,20", help="List words.")
parser.add_argument("-l", dest="list", nargs='?', const="0,40", help="List words.")
parser.add_argument("-a", dest="add", help="Add word.")
parser.add_argument("-d", dest="delete", help="Delete word.")
parser.add_argument("-s", "--summary", action="store_true", help="Summary.")
Expand Down

0 comments on commit ad3cbe5

Please sign in to comment.