]>
Commit | Line | Data |
---|---|---|
bcc3ed4d MT |
1 | #!/usr/bin/python |
2 | ||
a6dc0bad | 3 | import logging |
bcc3ed4d MT |
4 | import textile |
5 | import tornado.database | |
6 | ||
7 | import backend | |
8 | ||
9 | from handlers_base import * | |
10 | ||
11 | class RSSHandler(BaseHandler): | |
a6dc0bad MT |
12 | _default_limit = 10 |
13 | _default_offset = 0 | |
bcc3ed4d MT |
14 | |
15 | def prepare(self): | |
16 | self.set_header("Content-Type", "application/rss+xml") | |
17 | ||
a6dc0bad MT |
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) | |
bcc3ed4d MT |
38 | |
39 | rss_id = "rss-%s-locale=%s-limit=%s-offset=%s" % \ | |
a6dc0bad | 40 | (url, self.locale.code, self.limit, self.offset) |
bcc3ed4d | 41 | |
a6dc0bad MT |
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) | |
bcc3ed4d | 46 | |
a6dc0bad MT |
47 | self.memcached.set(rss_id, rss, 900) |
48 | ||
49 | self.finish(rss) | |
bcc3ed4d MT |
50 | |
51 | def generate(self): | |
52 | raise NotImplementedError | |
53 | ||
54 | ||
55 | class RSSNewsHandler(RSSHandler): | |
bcc3ed4d | 56 | def generate(self): |
a6dc0bad MT |
57 | news = self.news.get_latest(locale=self.locale, |
58 | limit=self.limit, offset=self.offset) | |
bcc3ed4d MT |
59 | |
60 | items = [] | |
61 | for n in news: | |
62 | # Get author information | |
a6dc0bad | 63 | n.author = self.get_account(n.author_id) |
bcc3ed4d MT |
64 | |
65 | # Render text | |
66 | n.text = textile.textile(n.text) | |
67 | ||
68 | item = tornado.database.Row({ | |
a6dc0bad MT |
69 | "title" : n.title, |
70 | "author" : n.author, | |
ea324f48 | 71 | "published" : n.published, |
a6dc0bad MT |
72 | "url" : "http://www.ipfire.org/news/%s" % n.slug, |
73 | "markup" : n.text, | |
bcc3ed4d MT |
74 | }) |
75 | items.append(item) | |
76 | ||
a6dc0bad | 77 | return self.render_string("feeds/news.xml", items=items) |
bcc3ed4d MT |
78 | |
79 | ||
80 | class RSSPlanetAllHandler(RSSHandler): | |
bcc3ed4d | 81 | def generate(self): |
a6dc0bad | 82 | items = self.planet.get_entries(limit=self.limit, offset=self.offset) |
bcc3ed4d | 83 | |
a6dc0bad | 84 | return self.render_string("feeds/planet.xml", items=items) |
bcc3ed4d MT |
85 | |
86 | ||
87 | class RSSPlanetUserHandler(RSSPlanetAllHandler): | |
a6dc0bad MT |
88 | def generate(self, user): |
89 | items = self.planet.get_entries_by_author(user, | |
90 | limit=self.limit, offset=self.offset) | |
bcc3ed4d | 91 | |
a6dc0bad | 92 | return self.render_string("feeds/planet.xml", items=items) |