]> git.ipfire.org Git - ipfire.org.git/blame - src/web/blog.py
login: Fix when no next parameter is given
[ipfire.org.git] / src / web / blog.py
CommitLineData
12e5de7e
MT
1#!/usr/bin/python
2
f0714277 3import email.utils
12e5de7e
MT
4import tornado.web
5
6import handlers_base as base
7
f91dfcc7
MT
8from . import ui_modules
9
8a897d25
MT
10class IndexHandler(base.BaseHandler):
11 def get(self):
0a6875dc 12 posts = self.backend.blog.get_newest(limit=3)
8a897d25
MT
13
14 self.render("blog/index.html", posts=posts)
15
16
cfc0823a
MT
17class 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
cdf85ee7 24 posts = self.backend.blog.get_by_author(author)
cfc0823a
MT
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
f0714277
MT
31class 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:
0a6875dc 38 posts = self.backend.blog.get_newest(limit=50)
f0714277
MT
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
12e5de7e
MT
54class PostHandler(base.BaseHandler):
55 def get(self, slug):
0a6875dc
MT
56 post = self.backend.blog.get_by_slug(slug)
57 if not post:
12e5de7e
MT
58 raise tornado.web.HTTPError(404)
59
0a6875dc 60 self.render("blog/post.html", post=post)
f91dfcc7
MT
61
62
e6b18dce
MT
63class SearchHandler(base.BaseHandler):
64 def get(self):
65 q = self.get_argument("q")
66
0a6875dc 67 posts = self.backend.blog.search(q, limit=50)
e6b18dce
MT
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
4bde7f18
MT
74class TagHandler(base.BaseHandler):
75 def get(self, tag):
76 posts = self.backend.blog.get_by_tag(tag)
77 if not posts:
78 raise tornado.web.HTTPError(404, "There are no posts with tag: %s" % tag)
79
80 self.render("blog/tag.html", posts=posts, tag=tag)
81
82
7e64f6a3
MT
83class YearHandler(base.BaseHandler):
84 def get(self, year):
85 posts = self.backend.blog.get_by_year(year)
86 if not posts:
87 raise tornado.web.HTTPError(404, "There are no posts in %s" % year)
88
89 self.render("blog/year.html", posts=posts, year=year)
90
91
92class HistoryNavigationModule(ui_modules.UIModule):
93 def render(self):
94 return self.render_string("blog/modules/history-navigation.html",
95 years=self.backend.blog.years)
96
97
98class ListModule(ui_modules.UIModule):
99 def render(self, posts):
100 return self.render_string("blog/modules/list.html", posts=posts)
101
102
f91dfcc7
MT
103class PostModule(ui_modules.UIModule):
104 def render(self, post):
105 return self.render_string("blog/modules/post.html", post=post)
8a897d25
MT
106
107
108class PostsModule(ui_modules.UIModule):
109 def render(self, posts):
0a6875dc 110 return self.render_string("blog/modules/posts.html", posts=list(posts))