From a682c95ec10da7d4d917f0b002d1f5880f9df051 Mon Sep 17 00:00:00 2001 From: Jonathan Rehm Date: Wed, 16 Aug 2017 09:24:44 -0700 Subject: [PATCH] Show "More by" on author page Uses Goodread's list of author's books, filtering out the books that are already in the user's library. Requires the Goodreads dependency and API information. --- cps/static/css/style.css | 3 ++- cps/templates/author.html | 51 ++++++++++++++++++++++++++++++++++++--- cps/web.py | 36 ++++++++++++++++++--------- 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/cps/static/css/style.css b/cps/static/css/style.css index c2f200ca..673623c5 100644 --- a/cps/static/css/style.css +++ b/cps/static/css/style.css @@ -77,7 +77,8 @@ input.pill:not(:checked) + label .glyphicon { } .author-bio img {margin: 0 1em 1em 0;} -.author-link img {display: inline-block;max-width: 100px;} +.author-link {display: inline-block; margin-top: 10px; width: 100px;} +.author-link img {display: block; height: 100%;} #remove-from-shelves .btn, #shelf-action-errors { diff --git a/cps/templates/author.html b/cps/templates/author.html index bf33c812..156839ec 100644 --- a/cps/templates/author.html +++ b/cps/templates/author.html @@ -11,16 +11,15 @@ {%if author.about is not none %}

{{author.about|safe}}

{% endif %} - - - Goodreads - + - {{_("via")}} Goodreads +
{% endif %}
+

{{_("In Library")}}

{% if entries[0] %} {% for entry in entries %} @@ -62,4 +61,48 @@ {% endif %}
+ +{% if other_books is not none %} +
+

{{_("More by")}} {{ author.name|safe }}

+
+ {% for entry in other_books %} +
+
+ + + +
+
+

{{entry.title|shortentitle}}

+

+ {% for author in entry.authors %} + + {{author.name}} + + {% if not loop.last %} + & + {% endif %} + {% endfor %} +

+
+ {% for number in range((entry.average_rating)|float|round|int(2)) %} + + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + + {% endfor %} + {% endif %} + {% endfor %} +
+
+
+ {% endfor %} +
+ + + Goodreads + +
+{% endif %} {% endblock %} diff --git a/cps/web.py b/cps/web.py index eec1760d..9616c38b 100755 --- a/cps/web.py +++ b/cps/web.py @@ -8,11 +8,16 @@ except ImportError: gdrive_support = False try: - from goodreads import client as gr_client + from goodreads.client import GoodreadsClient goodreads_support = True except ImportError: goodreads_support = False +try: + from functools import reduce +except ImportError: + pass # We're not using Python 3 + import mimetypes import logging from logging.handlers import RotatingFileHandler @@ -1167,20 +1172,27 @@ def author_list(): def author(book_id, page): entries, random, pagination = fill_indexpage(page, db.Books, db.Books.authors.any(db.Authors.id == book_id), db.Books.timestamp.desc()) - if entries: - name = db.session.query(db.Authors).filter(db.Authors.id == book_id).first().name - - author_info = None - if goodreads_support and config.config_use_goodreads: - gc = gr_client.GoodreadsClient(config.config_goodreads_api_key, config.config_goodreads_api_secret) - author_info = gc.find_author(author_name=name) - - return render_title_template('author.html', entries=entries, pagination=pagination, - title=name, author=author_info) - else: + if entries is None: flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error") return redirect(url_for("index")) + name = db.session.query(db.Authors).filter(db.Authors.id == book_id).first().name + + author_info = None + other_books = None + if goodreads_support and config.config_use_goodreads: + gc = GoodreadsClient(config.config_goodreads_api_key, config.config_goodreads_api_secret) + author_info = gc.find_author(author_name=name) + + # Get all identifiers (ISBN, Goodreads, etc) and filter author's books by that list so we show fewer duplicates + # Note: Not all images will be shown, even though they're available on Goodreads.com. + # See https://www.goodreads.com/topic/show/18213769-goodreads-book-images + identifiers = reduce(lambda acc, book: acc + map(lambda identifier: identifier.val, book.identifiers), entries.all(), []) + other_books = filter(lambda book: book.isbn not in identifiers and book.gid["#text"] not in identifiers, author_info.books) + + return render_title_template('author.html', entries=entries, pagination=pagination, + title=name, author=author_info, other_books=other_books) + @app.route("/series") @login_required_if_no_ano