]>
Commit | Line | Data |
---|---|---|
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) |