]> git.ipfire.org Git - ipfire.org.git/blob - src/web/blog.py
blog: Add RSS feed to the blog
[ipfire.org.git] / src / web / blog.py
1 #!/usr/bin/python
2
3 import email.utils
4 import tornado.web
5
6 import handlers_base as base
7
8 from . import ui_modules
9
10 class IndexHandler(base.BaseHandler):
11 def get(self):
12 posts = self.planet.get_entries(limit=3)
13
14 self.render("blog/index.html", posts=posts)
15
16
17 class AuthorHandler(base.BaseHandler):
18 def get(self, uid):
19 author = self.accounts.get_by_uid(uid)
20 if not author:
21 raise tornado.web.HTTPError(404, "User is unknown")
22
23 # Get all posts from this author
24 posts = self.planet.get_entries_by_author(author.uid)
25 if not posts:
26 raise tornado.web.HTTPError(404, "User has no posts")
27
28 self.render("blog/author.html", author=author, posts=posts)
29
30
31 class FeedHandler(base.BaseHandler):
32 def get(self):
33 cache_key = "%s-%s" % (self.request.host, self.request.path)
34
35 # Get feed from cache if possible
36 feed = self.memcached.get(cache_key)
37 if not feed:
38 posts = self.planet.get_entries(limit=50)
39
40 # Render the feed
41 feed = self.render_string("blog/feed.xml", posts=posts,
42 now=email.utils.formatdate())
43
44 # Store in cache for 5min
45 self.memcached.set(cache_key, feed, 300)
46
47 # Set correct content type
48 self.set_header("Content-Type", "application/rss+xml")
49
50 # Deliver content
51 self.finish(feed)
52
53
54 class PostHandler(base.BaseHandler):
55 def get(self, slug):
56 entry = self.planet.get_entry_by_slug(slug)
57 if not entry:
58 raise tornado.web.HTTPError(404)
59
60 self.render("blog/post.html", post=entry)
61
62
63 class SearchHandler(base.BaseHandler):
64 def get(self):
65 q = self.get_argument("q")
66
67 posts = self.planet.search(q)
68 if not posts:
69 raise tornado.web.HTTPError(404, "Nothing found")
70
71 self.render("blog/search-results.html", q=q, posts=posts)
72
73
74 class PostModule(ui_modules.UIModule):
75 def render(self, post):
76 return self.render_string("blog/modules/post.html", post=post)
77
78
79 class PostsModule(ui_modules.UIModule):
80 def render(self, posts):
81 return self.render_string("blog/modules/posts.html", posts=posts)