Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 32 additions & 12 deletions openlibrary/core/yearly_reading_goals.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,32 @@
from dataclasses import dataclass
from datetime import date, datetime
from math import floor

from openlibrary.utils.dateutil import DATE_ONE_MONTH_AGO, DATE_ONE_WEEK_AGO

from . import db


@dataclass
class ReadingGoal:
username: str
year: int
target: int
books_read: int = 0

@property
def progress(self) -> int:
return floor((self.books_read / self.target) * 100) if self.target > 0 else 0

@classmethod
def from_row(cls, row: dict) -> 'ReadingGoal':
return cls(
username=row['username'],
year=row['year'],
target=row['target'],
)


class YearlyReadingGoals:
TABLENAME = 'yearly_reading_goals'

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

# Read methods:
@classmethod
def select_by_username(cls, username: str, order: str = 'year ASC') -> list[dict]:
def select_by_username(
cls, username: str, order: str = 'year ASC'
) -> list[ReadingGoal]:
oldb = db.get_db()

where = 'username=$username'
data = {
'username': username,
}

return list(oldb.select(cls.TABLENAME, where=where, order=order, vars=data))
data = {'username': username}
rows = list(oldb.select(cls.TABLENAME, where=where, order=order, vars=data))
return [ReadingGoal.from_row(row) for row in rows]

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

where = 'username=$username AND year=$year'
data = {
'username': username,
'year': year,
}
data = {'username': username, 'year': year}

return list(oldb.select(cls.TABLENAME, where=where, vars=data))
rows = list(oldb.select(cls.TABLENAME, where=where, vars=data))
return [ReadingGoal.from_row(row) for row in rows]

@classmethod
def total_yearly_reading_goals(cls, since: date | None = None) -> int:
Expand Down
28 changes: 5 additions & 23 deletions openlibrary/plugins/upstream/yearly_reading_goals.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import json
from datetime import datetime
from math import floor

import web

Expand All @@ -27,20 +26,14 @@ def GET(self):
username = user['key'].split('/')[-1]
if i.year:
results = [
{
'year': i.year,
'goal': record.target,
}
{'year': record.year, 'goal': record.target}
for record in YearlyReadingGoals.select_by_username_and_year(
username, i.year
)
]
else:
results = [
{
'year': record.year,
'goal': record.target,
}
{'year': record.year, 'goal': record.target}
for record in YearlyReadingGoals.select_by_username(username)
]

Expand Down Expand Up @@ -99,21 +92,10 @@ def get_reading_goals(year=None):
username, BookshelfEvent.FINISH, year
)
read_count = len(books_read)
result = YearlyGoal(data[0].year, data[0].target, read_count)

return result


class YearlyGoal:
def __init__(self, year, goal, books_read):
self.year = year
self.goal = goal
self.books_read = books_read
self.progress = floor((books_read / goal) * 100)

@classmethod
def calc_progress(cls, books_read, goal):
return floor((books_read / goal) * 100)
to_return = data[0]
to_return.books_read = read_count
return to_return


def setup():
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
<span class="reading-goal-progress__completed" style="width: $(completed)%;"></span>
</div>
<div class="reading-goal-progress__details">
<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>
<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>
<a class="edit-reading-goal-link" href="javascript:;">$_('Edit')</a>
</div>
$ reading_goal_form = render_template('reading_goals/reading_goal_form', goal=goal.goal, year=goal.year, update=True)
$ reading_goal_form = render_template('reading_goals/reading_goal_form', goal=goal.target, year=goal.year, update=True)
$ id = 'yearly-goal-modal-%d' % loop.index
$ title = _('Edit %(year)d Reading Goal', year=goal.year)
$:render_template('native_dialog', id, reading_goal_form, title=title)
Expand Down