Explorar o código

Display a list of similar articles to the one displayed

jherve hai 1 ano
pai
achega
d887493524

+ 21 - 4
src/de_quoi_parle_le_monde/storage.py

@@ -300,10 +300,27 @@ class Storage:
                 """,
             )
 
-            return [
-                {"id": r[0], "featured_article_id": r[1], "title": r[2], "url": r[3]}
-                for r in rows
-            ]
+            return [self._from_featured_article_snapshot_row(r) for r in rows]
+
+    async def list_featured_article_snapshots(
+        self, featured_article_snapshot_ids: list[int]
+    ):
+        async with self.conn as conn:
+            placeholders = ", ".join(["?" for _ in featured_article_snapshot_ids])
+            rows = await conn.execute_fetchall(
+                f"""
+                    SELECT *
+                    FROM featured_article_snapshots
+                    WHERE id IN ({placeholders})
+                """,
+                featured_article_snapshot_ids,
+            )
+
+            return [self._from_featured_article_snapshot_row(r) for r in rows]
+
+    @staticmethod
+    def _from_featured_article_snapshot_row(r):
+        return {"id": r[0], "featured_article_id": r[1], "title": r[2], "url": r[3]}
 
     async def list_all_embedded_featured_article_snapshot_ids(self) -> list[int]:
         async with self.conn as conn:

+ 16 - 0
src/de_quoi_parle_le_monde/web.py

@@ -55,6 +55,21 @@ async def site_main_article_snapshot(
     same_site_articles = [
         a for a in main_articles if a["site_id"] == id and a["time_diff"] != 0
     ]
+    [(_, similar)] = await sim_index.search(
+        [focused_article["featured_article_snapshot_id"]],
+        20,
+        lambda s: s < 1.0 and s >= 0.5,
+    )
+    similar_by_id = {s[0]: s[1] for s in similar}
+    similar_articles = await storage.list_featured_article_snapshots(
+        list(similar_by_id.keys())
+    )
+    # A list of articles and score, sorted by descending score
+    similar_articles_and_score = sorted(
+        [(a, similar_by_id[a["id"]]) for a in similar_articles],
+        key=lambda a: a[1],
+        reverse=True,
+    )
 
     return templates.TemplateResponse(
         request=request,
@@ -62,6 +77,7 @@ async def site_main_article_snapshot(
         context={
             "site_id": id,
             "focused": focused_article,
+            "similar": similar_articles_and_score,
             "simultaneous_up": [
                 a
                 for a in simultaneous_articles

+ 8 - 1
templates/site_main_article_detail.html

@@ -21,7 +21,14 @@
                 {% endfor %}
             </ul>
         </div>
-        <div class="focused">{{ focused["title"] }}</div>
+        <div class="focused">
+            <h2>{{ focused["title"] }}</h2>
+            <ul>
+                {% for s in similar %}
+                    <li>{{ s[1] }} {{ s[0]["title"] }}</li>
+                {% endfor %}
+            </ul>
+        </div>
         {% if after %}
             <div class="after">
                 {{ article(after) }} @ {{ after["timestamp_virtual"] }}