Skip to content

Commit a4802ee

Browse files
committed
refactor reading goals to use dataclass
1 parent 50c4ad5 commit a4802ee

File tree

3 files changed

+43
-37
lines changed

3 files changed

+43
-37
lines changed

openlibrary/core/yearly_reading_goals.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,36 @@
1+
from dataclasses import dataclass
12
from datetime import date, datetime
3+
from math import floor
24

35
from openlibrary.utils.dateutil import DATE_ONE_MONTH_AGO, DATE_ONE_WEEK_AGO
46

57
from . import db
68

79

10+
@dataclass
11+
class ReadingGoal:
12+
username: str
13+
year: int
14+
target: int
15+
created: datetime | None = None
16+
updated: datetime | None = None
17+
books_read: int = 0
18+
19+
@classmethod
20+
def from_row(cls, row: dict) -> 'ReadingGoal':
21+
return cls(
22+
username=row['username'],
23+
year=row['year'],
24+
target=row['target'],
25+
created=row.get('created'),
26+
updated=row.get('updated'),
27+
)
28+
29+
@property
30+
def progress(self) -> int:
31+
return floor((self.books_read / self.target) * 100) if self.target > 0 else 0
32+
33+
834
class YearlyReadingGoals:
935
TABLENAME = 'yearly_reading_goals'
1036

@@ -30,27 +56,25 @@ def create(cls, username: str, year: int, target: int) -> None:
3056

3157
# Read methods:
3258
@classmethod
33-
def select_by_username(cls, username: str, order: str = 'year ASC') -> list[dict]:
59+
def select_by_username(
60+
cls, username: str, order: str = 'year ASC'
61+
) -> list[ReadingGoal]:
3462
oldb = db.get_db()
3563

3664
where = 'username=$username'
37-
data = {
38-
'username': username,
39-
}
40-
41-
return list(oldb.select(cls.TABLENAME, where=where, order=order, vars=data))
65+
data = {'username': username}
66+
rows = list(oldb.select(cls.TABLENAME, where=where, order=order, vars=data))
67+
return [ReadingGoal.from_row(row) for row in rows]
4268

4369
@classmethod
44-
def select_by_username_and_year(cls, username: str, year: int) -> list[dict]:
70+
def select_by_username_and_year(cls, username: str, year: int) -> list[ReadingGoal]:
4571
oldb = db.get_db()
4672

4773
where = 'username=$username AND year=$year'
48-
data = {
49-
'username': username,
50-
'year': year,
51-
}
74+
data = {'username': username, 'year': year}
5275

53-
return list(oldb.select(cls.TABLENAME, where=where, vars=data))
76+
rows = list(oldb.select(cls.TABLENAME, where=where, vars=data))
77+
return [ReadingGoal.from_row(row) for row in rows]
5478

5579
@classmethod
5680
def total_yearly_reading_goals(cls, since: date | None = None) -> int:

openlibrary/plugins/upstream/yearly_reading_goals.py

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import json
22
from datetime import datetime
3-
from math import floor
43

54
import web
65

@@ -27,20 +26,14 @@ def GET(self):
2726
username = user['key'].split('/')[-1]
2827
if i.year:
2928
results = [
30-
{
31-
'year': i.year,
32-
'goal': record.target,
33-
}
29+
{'year': record.year, 'goal': record.target}
3430
for record in YearlyReadingGoals.select_by_username_and_year(
3531
username, i.year
3632
)
3733
]
3834
else:
3935
results = [
40-
{
41-
'year': record.year,
42-
'goal': record.target,
43-
}
36+
{'year': record.year, 'goal': record.target}
4437
for record in YearlyReadingGoals.select_by_username(username)
4538
]
4639

@@ -99,21 +92,10 @@ def get_reading_goals(year=None):
9992
username, BookshelfEvent.FINISH, year
10093
)
10194
read_count = len(books_read)
102-
result = YearlyGoal(data[0].year, data[0].target, read_count)
10395

104-
return result
105-
106-
107-
class YearlyGoal:
108-
def __init__(self, year, goal, books_read):
109-
self.year = year
110-
self.goal = goal
111-
self.books_read = books_read
112-
self.progress = floor((books_read / goal) * 100)
113-
114-
@classmethod
115-
def calc_progress(cls, books_read, goal):
116-
return floor((books_read / goal) * 100)
96+
to_return = data[0]
97+
to_return.books_read = read_count
98+
return to_return
11799

118100

119101
def setup():

openlibrary/templates/reading_goals/reading_goal_progress.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
<span class="reading-goal-progress__completed" style="width: $(completed)%;"></span>
1818
</div>
1919
<div class="reading-goal-progress__details">
20-
<a href="/account/books/already-read/year/$(goal.year)" data-ol-link-track="ReadingGoalProgress|AnnualSummaryLink">$:_('<span class="reading-goal-progress__books-read">%(books_read)d</span>/<span class="reading-goal-progress__goal">%(goal)d</span> Books', books_read=goal.books_read, goal=goal.goal)</a>
20+
<a href="/account/books/already-read/year/$(goal.year)" data-ol-link-track="ReadingGoalProgress|AnnualSummaryLink">$:_('<span class="reading-goal-progress__books-read">%(books_read)d</span>/<span class="reading-goal-progress__goal">%(goal)d</span> Books', books_read=goal.books_read, goal=goal.target)</a>
2121
<a class="edit-reading-goal-link" href="javascript:;">$_('Edit')</a>
2222
</div>
23-
$ reading_goal_form = render_template('reading_goals/reading_goal_form', goal=goal.goal, year=goal.year, update=True)
23+
$ reading_goal_form = render_template('reading_goals/reading_goal_form', goal=goal.target, year=goal.year, update=True)
2424
$ id = 'yearly-goal-modal-%d' % loop.index
2525
$ title = _('Edit %(year)d Reading Goal', year=goal.year)
2626
$:render_template('native_dialog', id, reading_goal_form, title=title)

0 commit comments

Comments
 (0)