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