Skip to content

Commit

Permalink
Allow multiple read dates
Browse files Browse the repository at this point in the history
Closes #5
  • Loading branch information
rixx committed Jul 22, 2020
1 parent adef431 commit c8ce4a5
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 23 deletions.
10 changes: 7 additions & 3 deletions scripts/books.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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"):
Expand Down Expand Up @@ -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"]
Expand Down Expand Up @@ -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,
}
Expand Down
2 changes: 1 addition & 1 deletion scripts/goodreads.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
2 changes: 1 addition & 1 deletion scripts/importer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
Expand Down
29 changes: 15 additions & 14 deletions scripts/renderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 = []
Expand All @@ -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)
Expand All @@ -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),
Expand Down
12 changes: 12 additions & 0 deletions src/reviews/lois-mcmaster-bujold/shards-of-honour.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
2 changes: 1 addition & 1 deletion templates/_review_list_entry.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
{%- endif -%}
<br/>
{% 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 }}
<br/>
{% endif %}
<div class="rating">
Expand Down
4 changes: 2 additions & 2 deletions templates/list_reviews.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ <h2>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") %}
<p id="{{ dread }}"></p>
{% endif %}
{% include "_review_list_entry.html" %}
Expand Down
2 changes: 1 addition & 1 deletion templates/review.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ <h1>{{ review.metadata.book.title | smartypants | safe }}</h1>
{% if review.metadata.review.date_read %}
<tr>
<td>date read:</td>
<th>{{ review.metadata.review.date_read | render_date }}</th>
<th>{% for d in review.metadata.review.date_read %}{{ d | render_date }}<br>{% endfor %}</th>
</tr>
{% endif %}
{% if review.metadata.book.pages %}
Expand Down

0 comments on commit c8ce4a5

Please sign in to comment.