src/templates/blog/feed.xml \
src/templates/blog/index.html \
src/templates/blog/post.html \
- src/templates/blog/search-results.html
+ src/templates/blog/search-results.html \
+ src/templates/blog/tag.html
templates_blogdir = $(templatesdir)/blog
WHERE published_at IS NOT NULL \
AND published_at <= NOW() \
AND %s = ANY(tags) \
- ORDER BY published_at DESC LIMIT %s", limit)
+ ORDER BY published_at DESC LIMIT %s", tag, limit)
def get_by_author(self, uid, limit=None):
return self._get_posts("SELECT * FROM blog \
--- /dev/null
+{% extends "base.html" %}
+
+{% block title %}{{ _("Posts tagged with '%s'") % tag }}{% end block %}
+
+{% block main %}
+ <div class="card">
+ <div class="card-body">
+ {% module BlogPosts(posts) %}
+ </div>
+ </div>
+{% end block %}
(r"/authors/(\w+)", blog.AuthorHandler),
(r"/post/(.*)", blog.PostHandler),
(r"/search", blog.SearchHandler),
+ (r"/tags/([0-9a-z\-]+)", blog.TagHandler),
# RSS Feed
(r"/feed.xml", blog.FeedHandler),
self.render("blog/search-results.html", q=q, posts=posts)
+class TagHandler(base.BaseHandler):
+ def get(self, tag):
+ posts = self.backend.blog.get_by_tag(tag)
+ if not posts:
+ raise tornado.web.HTTPError(404, "There are no posts with tag: %s" % tag)
+
+ self.render("blog/tag.html", posts=posts, tag=tag)
+
+
class PostModule(ui_modules.UIModule):
def render(self, post):
return self.render_string("blog/modules/post.html", post=post)