"""
return self.published_at and self.published_at <= datetime.datetime.now()
- def publish(self):
+ def publish(self, when=None):
if self.is_published():
return
- self.db.execute("UPDATE blog SET published_at = NOW() \
- WHERE id = %s", self.id)
+ self.db.execute("UPDATE blog SET published_at = COALESCE(%s, CURRENT_TIMESTAMP) \
+ WHERE id = %s", when, self.id)
# Update search indices
self.backend.blog.refresh()
</a>
{% end %}
</div>
+
+ {% if not post.is_published() %}
+ <form action="/post/{{ post.slug }}/publish" method="POST">
+ {% raw xsrf_form_html() %}
+
+ <div class="btn-toolbar mt-5">
+ <button type="submit" class="btn btn-primary btn-block btn-lg">
+ {{ _("Publish") }}
+ </button>
+ </div>
+ </form>
+ {% end %}
</div>
(r"/drafts", blog.DraftsHandler),
(r"/post/([0-9a-z\-\.]+)", blog.PostHandler),
(r"/post/([0-9a-z\-\.]+)/edit", blog.EditHandler),
+ (r"/post/([0-9a-z\-\.]+)/publish", blog.PublishHandler),
(r"/search", blog.SearchHandler),
(r"/tags/([0-9a-z\-\.]+)", blog.TagHandler),
(r"/years/([0-9]+)", blog.YearHandler),
#!/usr/bin/python
+import datetime
import email.utils
import tornado.web
self.render("blog/post.html", post=post)
+class PublishHandler(base.BaseHandler):
+ @tornado.web.authenticated
+ def post(self, slug):
+ post = self.backend.blog.get_by_slug(slug, published=not self.current_user)
+ if not post:
+ raise tornado.web.HTTPError(404)
+
+ # Is the post already published?
+ if post.is_published():
+ raise tornado.web.HTTPError(400, "Post is already published")
+
+ # Publish the post
+ with self.db.transaction():
+ post.publish()
+
+ self.redirect("/post/%s" % post.slug)
+
+
class DraftsHandler(base.BaseHandler):
@tornado.web.authenticated
def get(self):