Browse Source

Implement related tags feature as well

Getty Ritter 4 years ago
parent
commit
61d879f6ee
2 changed files with 17 additions and 2 deletions
  1. 4 2
      lc/app.py
  2. 13 0
      lc/model.py

+ 4 - 2
lc/app.py

@@ -172,7 +172,7 @@ class GetLink(Endpoint):
             "main",
             v.Page(
                 title=f"link {l.name}",
-                content=render("linklist", v.LinkList([l.to_view(self.user)])),
+                content=render("linklist", v.LinkList([l.to_view(self.user)], [])),
                 user=self.user,
             ),
         )
@@ -200,11 +200,13 @@ class GetTaggedLinks(Endpoint):
         pg = int(flask.request.args.get("page", 0))
         t = u.get_tag(tag)
         links, pages = t.get_links(as_user=self.user, page=pg)
+        tags = u.get_related_tags(t)
+        linklist = v.LinkList(links=links, pages=pages, tags=tags)
         return render(
             "main",
             v.Page(
                 title=f"tag {tag}",
-                content=render("linklist", v.LinkList(links=links, pages=pages,)),
+                content=render("linklist", linklist),
                 user=self.user,
             ),
         )

+ 13 - 0
lc/model.py

@@ -154,6 +154,19 @@ class User(Model):
             key=lambda t: t.name,
         )
 
+    def get_related_tags(self, tag: 'Tag') -> List[v.Tag]:
+        # SELECT * from has_tag t1, has_tag t2, link l WHERE t1.link_id == l.id AND t2.link_id == l.id AND t1.id != t2.id AND t1 = self
+        SelfTag = HasTag.alias()
+        query = (HasTag.select(HasTag.tag)
+                 .join(Link, on=(HasTag.link == Link.id))
+                 .join(SelfTag, on=(SelfTag.link == Link.id))
+                 .where((SelfTag.tag == tag) & (SelfTag.id != HasTag.id))
+                 .group_by(HasTag.tag))
+        return sorted(
+            (t.tag.to_view() for t in query),
+            key=lambda t: t.name,
+        )
+
 class Link(Model):
     """
     A link as stored in the database