Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ability to the user to filter lists by date added #5334

Merged
20 changes: 15 additions & 5 deletions openlibrary/core/bookshelves.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from typing import Literal
from openlibrary.utils.dateutil import DATE_ONE_MONTH_AGO, DATE_ONE_WEEK_AGO

from . import db
Expand Down Expand Up @@ -116,7 +117,9 @@ def count_total_books_logged_by_user_per_shelf(cls, username, bookshelf_ids=None
return dict([(i['bookshelf_id'], i['count']) for i in result]) if result else {}

@classmethod
def get_users_logged_books(cls, username, bookshelf_id=None, limit=100, page=1):
def get_users_logged_books(cls, username, bookshelf_id=None, limit=100, page=1,
sort: Literal['created asc', 'created desc'] =
'created desc'):
"""Returns a list of Reading Log database records for books which
the user has logged. Records are described in core/schema.py
and include:
Expand All @@ -137,12 +140,19 @@ def get_users_logged_books(cls, username, bookshelf_id=None, limit=100, page=1):
'offset': limit * (page - 1),
'bookshelf_id': bookshelf_id
}
query = ("SELECT * from bookshelves_books WHERE "
"bookshelf_id=$bookshelf_id AND username=$username "
"LIMIT $limit OFFSET $offset")
if sort == 'created desc':
query = ("SELECT * from bookshelves_books WHERE "
"bookshelf_id=$bookshelf_id AND username=$username "
"ORDER BY created DESC "
"LIMIT $limit OFFSET $offset")
else:
query = ("SELECT * from bookshelves_books WHERE "
"bookshelf_id=$bookshelf_id AND username=$username "
"ORDER BY created ASC "
"LIMIT $limit OFFSET $offset")
if bookshelf_id is None:
query = ("SELECT * from bookshelves_books WHERE "
"username=$username")
"username=$username")
# XXX Removing limit, offset, etc from data looks like a bug
# unrelated / not fixing in this PR.
data = { 'username': username }
Expand Down
29 changes: 18 additions & 11 deletions openlibrary/plugins/upstream/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -712,28 +712,33 @@ def process_logged_books(self, logged_books):
if logged_books[i]['edition_id'] else '')
return works

def get_want_to_read(self, page=1, limit=RESULTS_PER_PAGE):
def get_want_to_read(self, page=1, limit=RESULTS_PER_PAGE,
sort='created', sort_order='desc'):
return self.process_logged_books(Bookshelves.get_users_logged_books(
self.user.get_username(), bookshelf_id=Bookshelves.PRESET_BOOKSHELVES['Want to Read'],
page=page, limit=limit))
page=page, limit=limit, sort=sort + ' ' + sort_order))

def get_currently_reading(self, page=1, limit=RESULTS_PER_PAGE):
def get_currently_reading(self, page=1, limit=RESULTS_PER_PAGE,
sort='created', sort_order='desc'):
return self.process_logged_books(Bookshelves.get_users_logged_books(
self.user.get_username(), bookshelf_id=Bookshelves.PRESET_BOOKSHELVES['Currently Reading'],
page=page, limit=limit))
page=page, limit=limit, sort=sort + ' ' + sort_order))

def get_already_read(self, page=1, limit=RESULTS_PER_PAGE):
def get_already_read(self, page=1, limit=RESULTS_PER_PAGE,
sort='created', sort_order='desc'):
return self.process_logged_books(Bookshelves.get_users_logged_books(
self.user.get_username(), bookshelf_id=Bookshelves.PRESET_BOOKSHELVES['Already Read'],
page=page, limit=limit))
page=page, limit=limit, sort=sort + ' ' + sort_order))

def get_works(self, key, page=1, limit=RESULTS_PER_PAGE):
def get_works(self, key, page=1, limit=RESULTS_PER_PAGE,
sort='created', sort_order='desc'):
"""
:rtype: list of openlibrary.plugins.upstream.models.Work
"""
key = key.lower()
if key in self.KEYS:
return self.KEYS[key](page=page, limit=limit)
return self.KEYS[key](page=page, limit=limit,
sort=sort, sort_order=sort_order)
else: # must be a list or invalid page!
#works = web.ctx.site.get_many([ ... ])
raise
Expand All @@ -751,7 +756,7 @@ class public_my_books(delegate.page):

def GET(self, username, key='loans'):
"""check if user's reading log is public"""
i = web.input(page=1)
i = web.input(page=1, sort='desc')
user = web.ctx.site.get('/people/%s' % username)
if not user:
return render.notfound("User %s" % username, create=False)
Expand All @@ -767,11 +772,13 @@ def GET(self, username, key='loans'):
'isbn_%s' % len(s['isbn']): s['isbn']
})[0]) for s in sponsorships)
else:
books = readlog.get_works(key, page=i.page)
books = readlog.get_works(key, page=i.page,
sort='created', sort_order=i.sort)
return render['account/books'](
books, key, sponsorship_count=len(sponsorships),
reading_log_counts=readlog.reading_log_counts, lists=readlog.lists,
user=user, logged_in_user=logged_in_user, public=is_public
user=user, logged_in_user=logged_in_user, public=is_public,
sort_order=str(i.sort)
)
raise web.seeother(user.key)

Expand Down
16 changes: 15 additions & 1 deletion openlibrary/templates/account/books.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
$def with (items, key, sponsorship_count=None, reading_log_counts=None, lists=None, user=None, logged_in_user=None, public=False)
$def with (items, key, sponsorship_count=None, reading_log_counts=None, lists=None, user=None, logged_in_user=None, public=False, sort_order='desc')
$# Displays a user's reading log
$# :param list items:
$# :param Literal['currently-reading', 'want-to-read', 'already-read', 'sponsorships', 'loans', 'waitlist'] key:
Expand All @@ -14,6 +14,8 @@
$ owners_page = logged_in_user and urlbase.startswith('/people/'+logged_in_user.key.split('/')[-1])
$ meta_photo_url = "https://archive.org/services/img/%s" % get_internet_archive_id(user.key)

$ sort_order = sort_order

$ current_page = int(input(page=1).page)
$ total_items = sponsorship_count if key == 'sponsorships' else int(reading_log_counts[key])
$ userDisplayName = user.displayname or ctx.user.displayname
Expand Down Expand Up @@ -102,6 +104,18 @@ <h3>
</ul>
</div>
<div class="mybooks-list">

<span class="mybooks-tools"><img src="/images/icons/icon_sort.png" alt="$_('Sorting by')" style="margin-right:10px;" width="9" height="11">
$if sort_order == 'desc':
<strong class="lightgreen">$_("Date Added (newest)")</strong>
|
<a href="$ctx.path?sort=asc">$_("Date Added (oldest)")</a>
$else:
<a href="$ctx.path?sort=desc">$_("Date Added (newest)")</a>
|
<strong class="lightgreen">$_("Date Added (oldest)")</strong>
</span>

$:macros.Pager(current_page, total_items, results_per_page=25)
<ul class="list-books">
$if items:
Expand Down