From c8ce4a5620b0ffd7f96bf12e388674bcf2b3c8a7 Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Wed, 22 Jul 2020 02:07:35 +0200 Subject: [PATCH] Allow multiple read dates Closes #5 --- scripts/books.py | 10 +++++-- scripts/goodreads.py | 2 +- scripts/importer.py | 2 +- scripts/renderer.py | 29 ++++++++++--------- .../lois-mcmaster-bujold/shards-of-honour.md | 12 ++++++++ templates/_review_list_entry.html | 2 +- templates/list_reviews.html | 4 +-- templates/review.html | 2 +- 8 files changed, 40 insertions(+), 23 deletions(-) diff --git a/scripts/books.py b/scripts/books.py index eb2a7abd8..f98688faa 100644 --- a/scripts/books.py +++ b/scripts/books.py @@ -114,7 +114,7 @@ def isbn(self): @property def relevant_date(self): if self.entry_type == "reviews": - result = self.metadata["review"]["date_read"] + result = sorted(self.metadata["review"]["date_read"])[-1] else: result = self.metadata["plan"]["date_added"] if isinstance(result, dt.date): @@ -225,7 +225,7 @@ def clean(self): if "review" in self.metadata and self.entry_type == "reviews": if not self.metadata["review"].get("date_read"): - raise Exception(f"A review needs a date_read. ({self.path})") + raise Exception(f"A review needs at least one date_read. ({self.path})") if "plan" in self.metadata: if not self.metadata["plan"].get("date_added"): @@ -292,6 +292,10 @@ def goodreads_url(self): return False return f"https://www.goodreads.com/book/show/{goodreads_id}-blabla" + @property + def date_read_lookup(self): + return {d.strftime("%Y"): d for d in self.metadata.get("review", {}).get("date_read", [])} + def find_goodreads_cover(self, force_new=False): if "goodreads.com" in self.metadata["book"]["cover_image_url"]: url = self.metadata["book"]["cover_image_url"] @@ -443,7 +447,7 @@ def get_review_info(review=None): ) return { - "date_read": date_read, + "date_read": sorted(known_metadata.get("date_read", []) + [date_read]), "rating": rating, "did_not_finish": did_not_finish, } diff --git a/scripts/goodreads.py b/scripts/goodreads.py index 048d663e7..7757b67b1 100644 --- a/scripts/goodreads.py +++ b/scripts/goodreads.py @@ -222,7 +222,7 @@ def push_to_goodreads(review): "review[rating]": review.metadata.get("review", {}).get("rating", 0), "shelf_name": shelf_name, } - read_at = review.metadata.get("review", {}).get("date_read", "") + read_at = review.metadata.get("review", {}).get("date_read", [])[-1] if read_at: if isinstance(read_at, (dt.date, dt.datetime)): read_at = read_at.strftime("%Y-%m-%d") diff --git a/scripts/importer.py b/scripts/importer.py index 3426397ec..f0ae3e67b 100644 --- a/scripts/importer.py +++ b/scripts/importer.py @@ -93,7 +93,7 @@ def import_books(): if not read_at: raise Exception(book) metadata["review"] = { - "date_read": read_at, + "date_read": [read_at], "rating": book["rating"], "did_not_finish": False, } diff --git a/scripts/renderer.py b/scripts/renderer.py index d7a5808ae..357b7331b 100644 --- a/scripts/renderer.py +++ b/scripts/renderer.py @@ -210,8 +210,9 @@ def get_stats(reviews, years): stats = {} time_lookup = defaultdict(list) for review in reviews: - key = review.relevant_date.strftime("%Y-%m") - time_lookup[key].append(review) + for timestamp in review.metadata["review"]["date_read"]: + key = timestamp.strftime("%Y-%m") + time_lookup[key].append(review) most_monthly_books = 0 most_monthly_pages = 0 @@ -300,6 +301,7 @@ def build_site(**kwargs): all_plans = sorted(all_plans, key=lambda x: x.relevant_date, reverse=True) all_events = sorted(all_events, key=lambda x: x.relevant_date, reverse=True) tags = defaultdict(list) + reviews_by_year = defaultdict(list) # Render single review pages redirects = [] @@ -312,12 +314,15 @@ def build_site(**kwargs): title=f"Review of {review.metadata['book']['title']}", active="read", ) - redirects.append( - ( - f"reviews/{review.relevant_date.year}/{review.metadata['book']['slug']}", - review.get_url_path(), + for timestamp in review.metadata["review"]["date_read"]: + year = timestamp.strftime("%Y") + redirects.append( + ( + f"reviews/{year}/{review.metadata['book']['slug']}", + review.get_url_path(), + ) ) - ) + reviews_by_year[year].append(review) review.spine = books.Spine(review) for tag in review.metadata["book"].get("tags", []): tags[tag].append(review) @@ -344,14 +349,10 @@ def build_site(**kwargs): # Render the "all reviews" page - all_years = sorted( - list(set(review.relevant_date.year for review in all_reviews)), reverse=True, - ) - for (year, reviews) in itertools.groupby( - all_reviews, key=lambda rev: rev.relevant_date.year - ): + all_years = sorted(list(reviews_by_year.keys()), reverse=True) + for (year, reviews) in reviews_by_year.items(): kwargs = { - "reviews": list(reviews), + "reviews": sorted(list(reviews), key=lambda rev: rev.date_read_lookup[year], reverse=True), "all_years": all_years, "year": year, "current_year": (year == this_year), diff --git a/src/reviews/lois-mcmaster-bujold/shards-of-honour.md b/src/reviews/lois-mcmaster-bujold/shards-of-honour.md index 7fbe93cfc..49f57ddc9 100644 --- a/src/reviews/lois-mcmaster-bujold/shards-of-honour.md +++ b/src/reviews/lois-mcmaster-bujold/shards-of-honour.md @@ -16,12 +16,24 @@ book: spine_color: '#cc2f20' tags: - scifi + - romance title: Shards of Honour plan: date_added: '2015-08-06' review: date_read: - 2017-01-01 + - 2020-07-04 did_not_finish: false rating: 4 --- + +I re-read "Shards of Honour" somewhat by accident while looking up a quote for [a writing +exercise](https://ramble.rixx.de/2020/07/07/tests-and-gifts.html). I had remembered it as a decent first entry in +brilliant series: Okay sci-fi, but nothing special. + +Hoo boy. Re-reading this book showed me just how wrong I was. This book is an excellent example of what sci-fi space +romance can look like. I'm not sure if I was in a better frame of mind when re-reading it, or if the knowledge of the +older versions of Cordelia and Aral helped, but here's how much I was into the book: My tooling converts books to text +files and opens them in vim, a plain text editor, so that I can copy and paste the quotes into my blog posts, *and I +read the entire book in my text editor. diff --git a/templates/_review_list_entry.html b/templates/_review_list_entry.html index d9b8b3cb7..b2471454b 100644 --- a/templates/_review_list_entry.html +++ b/templates/_review_list_entry.html @@ -14,7 +14,7 @@ {%- endif -%}
{% if review.metadata.review.date_read %} - read {{ review.metadata.review.date_read | render_date }} + {% if review.metadata.review.date_read|length > 1 %}last {% endif %}read {{ review.metadata.review.date_read[-1] | render_date }}
{% endif %}
diff --git a/templates/list_reviews.html b/templates/list_reviews.html index 797c270cd..0cabb4283 100644 --- a/templates/list_reviews.html +++ b/templates/list_reviews.html @@ -18,8 +18,8 @@

The {{ reviews|length }} book{% if reviews|length != 1 %}s{% endif %} {% for review in reviews %} - {% if review.metadata.review.date_read.strftime("%Y-%m") != dread %} - {% set dread = review.metadata.review.date_read.strftime("%Y-%m") %} + {% if review.date_read_lookup[year].strftime("%Y-%m") != dread %} + {% set dread = review.date_read_lookup[year].strftime("%Y-%m") %}

{% endif %} {% include "_review_list_entry.html" %} diff --git a/templates/review.html b/templates/review.html index bf6182dbf..443947ad3 100644 --- a/templates/review.html +++ b/templates/review.html @@ -36,7 +36,7 @@

{{ review.metadata.book.title | smartypants | safe }}

{% if review.metadata.review.date_read %} date read: - {{ review.metadata.review.date_read | render_date }} + {% for d in review.metadata.review.date_read %}{{ d | render_date }}
{% endfor %} {% endif %} {% if review.metadata.book.pages %}