Browse Source

Add some more queries

Getty Ritter 4 years ago
parent
commit
7bd9aca3c7
3 changed files with 40 additions and 8 deletions
  1. 12 0
      lc/config.py
  2. 16 6
      lc/model.py
  3. 12 2
      lc/routes.py

+ 12 - 0
lc/config.py

@@ -1,5 +1,17 @@
 import os
+import sys
 
 import playhouse.sqlite_ext
 
 DB = playhouse.sqlite_ext.SqliteExtDatabase(None)
+PER_PAGE = 50
+
+if sys.stderr.isatty():
+    def log(msg, *args, **kwargs):
+        sys.stderr.write(msg.format(*args, **kwargs))
+        sys.stderr.write("\n")
+else:
+    def log(msg, *args, **kwargs):
+        sys.stderr.write("\x1b[31m")
+        sys.stderr.write(msg.format(*args, **kwargs))
+        sys.stderr.write("\x1b[39m\n")

+ 16 - 6
lc/model.py

@@ -1,13 +1,14 @@
 import datetime
 import peewee
+import typing
 
-import lc.config
+import lc.config as c
 import lc.request as r
 
 
 class Model(peewee.Model):
     class Meta:
-        database = lc.config.DB
+        database = c.DB
 
 
 # TODO: figure out authorization for users (oauth? passwd?)
@@ -29,6 +30,12 @@ class User(Model):
     def base_url(self) -> str:
         return f"/u/{self.name}"
 
+    def get_links(self, page: int) -> typing.List["Link"]:
+        return Link.select().where(Link.user == self).paginate(page, c.PER_PAGE)
+
+    def get_tag(self, tag_name: str) -> "Tag":
+        return Tag.get((Tag.user==self) & (Tag.name==tag_name))
+
 
 class Link(Model):
     """
@@ -59,7 +66,7 @@ class Link(Model):
             user=user,
         )
         for tag_name in link.tags:
-            t = Tag.find_tag(user, tag_name)
+            t = Tag.get_or_create_tag(user, tag_name)
             HasTag.create(
                 link=l, tag=t,
             )
@@ -78,15 +85,18 @@ class Tag(Model):
     def url(self) -> str:
         return f"/u/{self.user.name}/t/{self.name}"
 
+    def get_links(self, page: int) -> typing.List[Link]:
+        return [ ht.link for ht in HasTag.select().where((HasTag.tag == self)).paginate(page, c.PER_PAGE) ]
+
     @staticmethod
-    def find_tag(user: User, tag_name: str):
+    def get_or_create_tag(user: User, tag_name: str):
         if (t := Tag.get_or_none(name=tag_name, user=user)) :
             return t
 
         parent = None
         if "/" in tag_name:
             parent_name = tag_name[: tag_name.rindex("/")]
-            parent = Tag.find_tag(user, parent_name)
+            parent = Tag.get_or_create_tag(user, parent_name)
 
         return Tag.create(name=tag_name, parent=parent, user=user,)
 
@@ -109,4 +119,4 @@ MODELS = [
 
 
 def create_tables():
-    lc.config.DB.create_tables(MODELS, safe=True)
+    c.DB.create_tables(MODELS, safe=True)

+ 12 - 2
lc/routes.py

@@ -1,7 +1,9 @@
 import os
 import flask
 import pystache
+import sys
 
+import lc.config
 import lc.model as m
 import lc.request as r
 
@@ -31,8 +33,10 @@ def create_user():
 @app.route("/u/<string:user>", methods=["GET", "POST"])
 def get_user(user):
     u = m.User.by_slug(user)
+    pg = int(flask.request.args.get('page', 0))
+    links = u.get_links(page=pg)
     return render(
-        "main", title=f"user {u.name}", content=render("linklist", links=u.links),
+        "main", title=f"user {u.name}", content=render("linklist", links=links),
     )
 
 
@@ -48,4 +52,10 @@ def link(user):
 
 @app.route("/u/<string:user>/t/<path:tag>")
 def get_tagged_links(user, tag):
-    pass
+    u = m.User.by_slug(user)
+    pg = int(flask.request.args.get('page', 0))
+    t = u.get_tag(tag)
+    links = t.get_links(page=pg)
+    return render(
+        "main", title=f"tag {tag}", content=render("linklist", links=links),
+    )