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