diff --git a/requirements/base.in b/requirements/base.in index e2ba92d..6b1b2e9 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -16,3 +16,4 @@ psycopg2 djangorestframework django-htmx wagtail-metadata +humanize diff --git a/requirements/base.txt b/requirements/base.txt index 50bda00..7971a4b 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -28,6 +28,7 @@ draftjs-exporter==2.1.7 # via wagtail et-xmlfile==1.1.0 # via openpyxl gunicorn==20.1.0 # via -r requirements/base.in html5lib==1.1 # via wagtail +humanize==4.3.0 # via -r requirements/base.in idna==3.3 # via requests l18n==2021.3 # via wagtail lxml==4.9.1 # via -r requirements/base.in diff --git a/requirements/dev.txt b/requirements/dev.txt index 5c81e41..2a68d76 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -40,6 +40,7 @@ flake8==4.0.1 # via -r requirements/dev.in gunicorn==20.1.0 # via -r requirements/base.txt honcho==1.1.0 # via -r requirements/dev.in html5lib==1.1 # via -r requirements/base.txt, wagtail +humanize==4.3.0 # via -r requirements/base.txt idna==3.3 # via -r requirements/base.txt, requests isort==5.10.1 # via -r requirements/dev.in l18n==2021.3 # via -r requirements/base.txt, wagtail diff --git a/website/common/models.py b/website/common/models.py index 9128bed..6496a49 100644 --- a/website/common/models.py +++ b/website/common/models.py @@ -1,4 +1,4 @@ -import math +from datetime import timedelta from typing import Any, Optional from django.db import models @@ -68,11 +68,18 @@ class BaseContentPage(BasePage, MetadataMixin): return get_table_of_contents(self.content_html) @cached_property - def reading_time(self) -> int: + def reading_time(self) -> timedelta: """ https://help.medium.com/hc/en-us/articles/214991667-Read-time """ - return int(math.ceil(self.word_count / 265)) + return timedelta(seconds=(self.word_count / 265) * 60) + + @cached_property + def show_reading_time(self) -> bool: + """ + Only show reading time if it's longer than 2 minutes + """ + return self.reading_time.total_seconds() >= 120 @cached_property def word_count(self) -> int: diff --git a/website/common/templates/common/content-details.html b/website/common/templates/common/content-details.html index 738d693..1566a6b 100644 --- a/website/common/templates/common/content-details.html +++ b/website/common/templates/common/content-details.html @@ -1,4 +1,4 @@ -{% load wagtailcore_tags %} +{% load wagtailcore_tags humanize_tags %}
@@ -11,11 +11,11 @@
{% endif %} - {% if page.reading_time %} + {% if page.show_reading_time %}
- {{ page.reading_time }} minutes + {{ page.reading_time|naturaldelta }}
{% endif %} diff --git a/website/common/templates/wagtailmetadata/parts/tags.html b/website/common/templates/wagtailmetadata/parts/tags.html index 2a0aaf0..6b3c9eb 100644 --- a/website/common/templates/wagtailmetadata/parts/tags.html +++ b/website/common/templates/wagtailmetadata/parts/tags.html @@ -1,10 +1,12 @@ {% extends "wagtailmetadata/parts/tags.html" %} +{% load humanize_tags %} + {% block twitter %} {{ block.super }} - {% if object.reading_time %} + {% if object.show_reading_time %} - + {% endif %} {% endblock %} diff --git a/website/contact/models.py b/website/contact/models.py index 9be1cc9..90e8c65 100644 --- a/website/contact/models.py +++ b/website/contact/models.py @@ -41,11 +41,8 @@ class ContactPage(BaseContentPage): subpage_types: list = [] @cached_property - def reading_time(self) -> int: - """ - How does one read a list page? - """ - return 0 + def show_reading_time(self) -> bool: + return False @cached_property def table_of_contents(self) -> list[TocEntry]: diff --git a/website/search/models.py b/website/search/models.py index 6363b94..8d991b0 100644 --- a/website/search/models.py +++ b/website/search/models.py @@ -24,11 +24,8 @@ class SearchPage(RoutablePageMixin, BaseContentPage): PAGE_SIZE = 15 @cached_property - def reading_time(self) -> int: - """ - How does one read a search page? - """ - return 0 + def show_reading_time(self) -> bool: + return False @cached_property def table_of_contents(self) -> list[TocEntry]: diff --git a/website/settings.py b/website/settings.py index f2fdd06..25e23a3 100644 --- a/website/settings.py +++ b/website/settings.py @@ -33,6 +33,7 @@ INSTALLED_APPS = [ "website.images", "website.contact", "website.spotify", + "website.utils", "website.contrib.code_block", "website.contrib.mermaid_block", "website.contrib.unsplash", diff --git a/website/spotify/models.py b/website/spotify/models.py index 5cb367c..fc131cc 100644 --- a/website/spotify/models.py +++ b/website/spotify/models.py @@ -35,15 +35,11 @@ class SpotifyPlaylistPage(BaseContentPage): return [] @cached_property - def reading_time(self) -> int: - return int( - timedelta( - milliseconds=sum( - track["track"]["duration_ms"] - for track in self.playlist_data["tracks"] - ) - ).total_seconds() - / 60 + def reading_time(self) -> timedelta: + return timedelta( + milliseconds=sum( + track["track"]["duration_ms"] for track in self.playlist_data["tracks"] + ) ) @cached_property diff --git a/website/utils/templatetags/humanize_tags.py b/website/utils/templatetags/humanize_tags.py new file mode 100644 index 0000000..11b6898 --- /dev/null +++ b/website/utils/templatetags/humanize_tags.py @@ -0,0 +1,6 @@ +import humanize +from django.template import Library + +register = Library() + +register.filter(humanize.naturaldelta)