Просмотр исходного кода

Display datetimes / duration in a nicer format

jherve 1 год назад
Родитель
Сommit
b99036276d
5 измененных файлов с 34 добавлено и 3 удалено
  1. 1 0
      pyproject.toml
  2. 2 0
      requirements-dev.lock
  3. 2 0
      requirements.lock
  4. 22 1
      src/de_quoi_parle_le_monde/web.py
  5. 7 2
      templates/site_main_article_detail.html

+ 1 - 0
pyproject.toml

@@ -28,6 +28,7 @@ dependencies = [
     "asyncpg>=0.29.0",
     "asyncpg>=0.29.0",
     "annoy>=1.17.3",
     "annoy>=1.17.3",
     "numpy>=1.26.4",
     "numpy>=1.26.4",
+    "babel>=2.15.0",
 ]
 ]
 readme = "README.md"
 readme = "README.md"
 requires-python = ">= 3.11"
 requires-python = ">= 3.11"

+ 2 - 0
requirements-dev.lock

@@ -47,6 +47,8 @@ attrs==23.2.0
     # via cattrs
     # via cattrs
     # via de-quoi-parle-le-monde
     # via de-quoi-parle-le-monde
     # via requests-cache
     # via requests-cache
+babel==2.15.0
+    # via de-quoi-parle-le-monde
 beautifulsoup4==4.12.3
 beautifulsoup4==4.12.3
     # via de-quoi-parle-le-monde
     # via de-quoi-parle-le-monde
 boto3==1.34.69
 boto3==1.34.69

+ 2 - 0
requirements.lock

@@ -47,6 +47,8 @@ attrs==23.2.0
     # via cattrs
     # via cattrs
     # via de-quoi-parle-le-monde
     # via de-quoi-parle-le-monde
     # via requests-cache
     # via requests-cache
+babel==2.15.0
+    # via de-quoi-parle-le-monde
 beautifulsoup4==4.12.3
 beautifulsoup4==4.12.3
     # via de-quoi-parle-le-monde
     # via de-quoi-parle-le-monde
 boto3==1.34.69
 boto3==1.34.69

+ 22 - 1
src/de_quoi_parle_le_monde/web.py

@@ -1,16 +1,37 @@
+from datetime import timedelta
 from fastapi import FastAPI, Request, Depends
 from fastapi import FastAPI, Request, Depends
 from fastapi.responses import HTMLResponse
 from fastapi.responses import HTMLResponse
 from fastapi.staticfiles import StaticFiles
 from fastapi.staticfiles import StaticFiles
 from fastapi.templating import Jinja2Templates
 from fastapi.templating import Jinja2Templates
+from babel.dates import format_datetime, format_timedelta
+from babel import Locale
 
 
 from de_quoi_parle_le_monde.medias import media_collection
 from de_quoi_parle_le_monde.medias import media_collection
 from de_quoi_parle_le_monde.storage import Storage
 from de_quoi_parle_le_monde.storage import Storage
 from de_quoi_parle_le_monde.similarity_index import SimilaritySearch
 from de_quoi_parle_le_monde.similarity_index import SimilaritySearch
 
 
 
 
+def add_date_processing(_any):
+    def absolute_datetime(dt):
+        return format_datetime(dt, format="EEEE d MMMM @ HH:mm", locale=Locale("fr", "FR"))
+
+    def duration(reference, target):
+        delta = target - reference
+        kwargs = dict(granularity='hour', locale=Locale("fr", "FR"))
+        if delta > timedelta(0):
+            return f"{format_timedelta(delta, **kwargs)} après"
+        else:
+            return f"{format_timedelta(delta, **kwargs)} avant"
+
+    return {
+        "absolute_datetime": absolute_datetime,
+        "duration": duration
+    }
+
+
 app = FastAPI()
 app = FastAPI()
 app.mount("/static", StaticFiles(directory="static"), name="static")
 app.mount("/static", StaticFiles(directory="static"), name="static")
-templates = Jinja2Templates(directory="templates")
+templates = Jinja2Templates(directory="templates", context_processors=[add_date_processing])
 
 
 
 
 async def get_db():
 async def get_db():

+ 7 - 2
templates/site_main_article_detail.html

@@ -23,6 +23,7 @@
         </div>
         </div>
         <div class="focused">
         <div class="focused">
             <a href="{{ focused['url_article'] }}"><h2>{{ focused["title"] }} <img src="{{ url_for('static', path='/external-link.svg') }}" height="30px"></h2></a>
             <a href="{{ focused['url_article'] }}"><h2>{{ focused["title"] }} <img src="{{ url_for('static', path='/external-link.svg') }}" height="30px"></h2></a>
+            <time datetime="{{ focused['timestamp_virtual'] }}">{{ absolute_datetime(focused["timestamp_virtual"]) }}</time>
             <div class="similar">
             <div class="similar">
                 <h3>Articles similaires</h3>
                 <h3>Articles similaires</h3>
                 <ul>
                 <ul>
@@ -36,12 +37,16 @@
         </div>
         </div>
         {% if after %}
         {% if after %}
             <div class="after">
             <div class="after">
-                {{ article(after) }} @ {{ after["timestamp_virtual"] }}
+                {{ article(after) }}
+                <time class="absolute" datetime="{{ after['timestamp_virtual'] }}">{{ absolute_datetime(after["timestamp_virtual"]) }}</time>
+                (<time class="relative">{{ duration(focused["timestamp_virtual"], after["timestamp_virtual"]) }}</time>)
             </div>
             </div>
         {% endif %}
         {% endif %}
         {% if before %}
         {% if before %}
             <div class="before">
             <div class="before">
-                {{ article(before) }} @ {{ before["timestamp_virtual"] }}
+                {{ article(before) }}
+                <time datetime="{{ before['timestamp_virtual'] }}">{{ absolute_datetime(before["timestamp_virtual"]) }}</time>
+                (<time class="relative">{{ duration(focused["timestamp_virtual"], before["timestamp_virtual"]) }}</time>)
             </div>
             </div>
         {% endif %}
         {% endif %}
         <div class="down">
         <div class="down">