self.render("blog/year.html", posts=posts, year=year)
+class ComposeHandler(base.BaseHandler):
+ @tornado.web.authenticated
+ def get(self):
+ self.render("blog/compose.html", post=None)
+
+ @tornado.web.authenticated
+ def post(self):
+ title = self.get_argument("title")
+ text = self.get_argument("text")
+ tags = self.get_argument("tags", None)
+
+ with self.db.transaction():
+ post = self.backend.blog.create_post(title, text,
+ author=self.current_user, tags=tags)
+
+ self.redirect("/posts")
+
+
+class EditHandler(base.BaseHandler):
+ @tornado.web.authenticated
+ def get(self, slug):
+ post = self.backend.blog.get_by_slug(slug)
+ if not post:
+ raise tornado.web.HTTPError(404)
+
+ # XXX check if post is editable
+
+ self.render("blog/compose.html", post=post)
+
+ @tornado.web.authenticated
+ def post(self, slug):
+ post = self.backend.blog.get_by_slug(slug)
+ if not post:
+ raise tornado.web.HTTPError(404)
+
+ # XXX check if post is editable
+
+ with self.db.transaction():
+ # Update title
+ post.title = self.get_argument("title")
+
+ # Update text
+ post.text = self.get_argument("text")
+
+ # Update tags
+ post.tags = (t.strip() for t in self.get_argument("tags", "").split(","))
+
+ # Mark post as updated
+ post.updated()
+
+ # Return to blog if the post is already published
+ if post.is_published():
+ self.redirect("/post/%s" % post.slug)
+ return
+
+ # Otherwise return to list of unpublished posts
+ self.redirect("/posts")
+
+
class HistoryNavigationModule(ui_modules.UIModule):
def render(self):
return self.render_string("blog/modules/history-navigation.html",