]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/handlers_rss.py
Fix tracker.ipfire.org.
[people/shoehn/ipfire.org.git] / webapp / handlers_rss.py
1 #!/usr/bin/python
2
3 import logging
4 import textile
5 import tornado.database
6
7 import backend
8
9 from handlers_base import *
10
11 class RSSHandler(BaseHandler):
12 _default_limit = 10
13 _default_offset = 0
14
15 def prepare(self):
16 self.set_header("Content-Type", "application/rss+xml")
17
18 @property
19 def limit(self):
20 value = self.get_argument("limit", None)
21
22 try:
23 return int(value)
24 except (TypeError, ValueError):
25 return self._default_limit
26
27 @property
28 def offset(self):
29 value = self.get_argument("offset", None)
30
31 try:
32 return int(value)
33 except (TypeError, ValueError):
34 return self._default_offset
35
36 def get(self, *args, **kwargs):
37 url = "%s%s" % (self.request.host, self.request.path)
38
39 rss_id = "rss-%s-locale=%s-limit=%s-offset=%s" % \
40 (url, self.locale.code, self.limit, self.offset)
41
42 rss = self.memcached.get(rss_id)
43 if not rss:
44 logging.debug("Generating RSS feed (%s)..." % rss_id)
45 rss = self.generate(*args, **kwargs)
46
47 self.memcached.set(rss_id, rss, 900)
48
49 self.finish(rss)
50
51 def generate(self):
52 raise NotImplementedError
53
54
55 class RSSNewsHandler(RSSHandler):
56 def generate(self):
57 news = self.news.get_latest(locale=self.locale,
58 limit=self.limit, offset=self.offset)
59
60 items = []
61 for n in news:
62 # Get author information
63 n.author = self.get_account(n.author_id)
64
65 # Render text
66 n.text = textile.textile(n.text)
67
68 item = tornado.database.Row({
69 "title" : n.title,
70 "author" : n.author,
71 "published" : n.published,
72 "url" : "http://www.ipfire.org/news/%s" % n.slug,
73 "markup" : n.text,
74 })
75 items.append(item)
76
77 return self.render_string("feeds/news.xml", items=items)
78
79
80 class RSSPlanetAllHandler(RSSHandler):
81 def generate(self):
82 items = self.planet.get_entries(limit=self.limit, offset=self.offset)
83
84 return self.render_string("feeds/planet.xml", items=items)
85
86
87 class RSSPlanetUserHandler(RSSPlanetAllHandler):
88 def generate(self, user):
89 items = self.planet.get_entries_by_author(user,
90 limit=self.limit, offset=self.offset)
91
92 return self.render_string("feeds/planet.xml", items=items)