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 %}
{% 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)