src/templates/blog/author.html \
src/templates/blog/base.html \
src/templates/blog/compose.html \
+ src/templates/blog/drafts.html \
src/templates/blog/feed.xml \
src/templates/blog/index.html \
src/templates/blog/post.html \
AND published_at <= NOW() \
ORDER BY published_at DESC", year)
+ def get_drafts(self, author=None, limit=None):
+ if author:
+ return self._get_posts("SELECT * FROM blog \
+ WHERE author_uid = %s \
+ AND (published_at IS NULL OR published_at > NOW()) \
+ ORDER BY COALESCE(updated_at, created_at) DESC LIMIT %s",
+ author.uid, limit)
+
+ return self._get_posts("SELECT * FROM blog \
+ WHERE (published_at IS NULL OR published_at > NOW()) \
+ ORDER BY COALESCE(updated_at, created_at) DESC LIMIT %s", limit)
+
def search(self, query, limit=None):
return self._get_posts("SELECT blog.* FROM blog \
LEFT JOIN blog_search_index search_index ON blog.id = search_index.post_id \
--- /dev/null
+{% extends "base.html" %}
+
+{% block title %}{{ _("My Drafts") }}{% end block %}
+
+{% block main %}
+ <div class="card">
+ <div class="card-body">
+ <h5>{{ _("My Drafts") }}</h5>
+
+ {% if drafts %}
+ {% for post in drafts %}
+ <strong class="mb-0">
+ <a href="/post/{{ post.slug }}">{{ post.title }}</a>
+ </strong>
+
+ <p class="text-muted small">
+ {% if post.updated_at %}
+ {{ _("Updated %s") % locale.format_date(post.updated_at) }}
+ {% else %}
+ {{ _("Created %s") % locale.format_date(post.created_at) }}
+ {% end %}
+
+ {% if post.published_at %}
+ <span class="badge badge-primary">
+ {{ _("Scheduled to be pushed at %s") % locale.format_date(post.published_at, shorter=True, relative=False) }}
+ </span>
+ {% end %}
+ </p>
+ {% end %}
+ {% end %}
+ </div>
+ </div>
+{% end block %}
(r"/", blog.IndexHandler),
(r"/authors/(\w+)", blog.AuthorHandler),
(r"/compose", blog.ComposeHandler),
+ (r"/drafts", blog.DraftsHandler),
(r"/post/([0-9a-z\-\.]+)", blog.PostHandler),
(r"/post/([0-9a-z\-\.]+)/edit", blog.EditHandler),
(r"/search", blog.SearchHandler),
self.render("blog/post.html", post=post)
+class DraftsHandler(base.BaseHandler):
+ @tornado.web.authenticated
+ def get(self):
+ drafts = self.backend.blog.get_drafts(author=self.current_user)
+
+ self.render("blog/drafts.html", drafts=drafts)
+
+
class SearchHandler(base.BaseHandler):
def get(self):
q = self.get_argument("q")