zu informieren.
</p>
<p>
- Um den Aufwand für die Entwickler in Maßen zu halten sind leider
+ Um den Aufwand für die Entwickler in Maßen zu halten sind
alle Einträge nur auf Englisch verfügbar.
</p>
{% else %}
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
- <title>IPFire.org - News</title>
- <link>http://www.ipfire.org/</link>
- <description>IPFire News Feed</description>
+ <title>{{ title }}</title>
+ <link>{{ url }}</link>
+ <description>{{ description }}</description>
<language>{{ lang }}</language>
- <copyright>IPFire-Team</copyright>
+ <copyright>IPFire Team</copyright>
<pubDate>Thu, 8 Nov 2007 00:00:00 +0200</pubDate>
{% for item in items %}
<item>
<title>{{ item.title }}</title>
- <link>http://www.ipfire.org/news/{{ item.slug }}</link>
- <author>{{ item.author.email }} ({{ item.author.cn }})</author>
- <guid>{{ item.uuid }}</guid>
- <pubDate>{{ item.date }}</pubDate>
+ <link>{{ item.url }}</link>
+ <author>{{ item.author.mail }} ({{ item.author.name }})</author>
+ <guid>{{ item.url }}</guid>
+ <pubDate>{{ item.date.strftime("%a, %d %b %Y %H:%M:%S +0200") }}</pubDate>
<description>
<![CDATA[
{{ item.text }}
(r"/downloads?", DownloadHandler),
# RSS feed
- (r"/news.rss", RSSHandler),
+ (r"/news.rss", RSSNewsHandler),
# Redirection for bookmarks, etc.
(r"/(de|en)/(.*)", LangCompatHandler)
(r"/", PlanetMainHandler),
(r"/post/([A-Za-z0-9_-]+)", PlanetPostingHandler),
(r"/user/([a-z0-9_-]+)", PlanetUserHandler),
+
+ # RSS
+ (r"/rss", RSSPlanetAllHandler),
+ (r"/user/([a-z0-9_-]+)/rss", RSSPlanetUserHandler),
] + static_handlers)
# stasy.ipfire.org
"year" : time.strftime("%Y"),
}
- def render(self, *args, **kwargs):
- kwargs.update(self.render_args)
+ def render(self, *args, **_kwargs):
+ kwargs = self.render_args
+ kwargs.update(_kwargs)
tornado.web.RequestHandler.render(self, *args, **kwargs)
- def render_string(self, *args, **kwargs):
- kwargs.update(self.render_args)
+ def render_string(self, *args, **_kwargs):
+ kwargs = self.render_args
+ kwargs.update(_kwargs)
return tornado.web.RequestHandler.render_string(self, *args, **kwargs)
def get_error_html(self, status_code, **kwargs):
@property
def tracker(self):
return backend.Tracker()
+
+ @property
+ def planet(self):
+ return backend.Planet()
class PlanetMainHandler(PlanetBaseHandler):
+ rss_url = "/rss"
+
def get(self):
offset = int(self.get_argument("offset", 0))
limit = int(self.get_argument("limit", 4))
offset=offset, limit=limit)
self.render("planet-user.html", author=author, entries=entries,
- offset=offset + limit, limit=limit)
+ offset=offset + limit, limit=limit, rss_url="/user/%s/rss" % author.uid)
class PlanetPostingHandler(PlanetBaseHandler):
--- /dev/null
+#!/usr/bin/python
+
+import textile
+import tornado.database
+
+import backend
+
+from handlers_base import *
+
+class RSSHandler(BaseHandler):
+ _cache_prefix = ""
+
+ @property
+ def cache_prefix(self):
+ return self._cache_prefix
+
+ def prepare(self):
+ self.set_header("Content-Type", "application/rss+xml")
+
+ def get(self):
+ offset = int(self.get_argument("offset", 0))
+ limit = int(self.get_argument("limit", 10))
+
+ rss_id = "rss-%s-locale=%s-limit=%s-offset=%s" % \
+ (self.cache_prefix, self.locale.code, limit, offset)
+
+ items = self.memcached.get(rss_id)
+ if not items:
+ items = self.generate()
+
+ self.memcached.set(rss_id, items, 15)
+
+ self.render("rss.xml", items=items, title=self.title,
+ url=self.url, description=self.description)
+
+ def generate(self):
+ raise NotImplementedError
+
+
+class RSSNewsHandler(RSSHandler):
+ _cache_prefix = "news"
+
+ title = "IPFire.org - News"
+ url = "http://www.ipfire.org/"
+ description = "IPFire News Feed"
+
+ def generate(self):
+ offset = int(self.get_argument("offset", 0))
+ limit = int(self.get_argument("limit", 10))
+
+ news = self.news.get_latest(
+ locale=self.locale,
+ limit=limit,
+ offset=offset,
+ )
+
+ items = []
+ for n in news:
+ # Get author information
+ author = self.get_account(n.author_id)
+ n.author = tornado.database.Row(
+ name = author.cn,
+ mail = author.email,
+ )
+
+ # Render text
+ n.text = textile.textile(n.text)
+
+ item = tornado.database.Row({
+ "title" : n.title,
+ "author" : n.author,
+ "date" : n.date,
+ "url" : "http://www.ipfire.org/news/%s" % n.slug,
+ "text" : n.text,
+ })
+ items.append(item)
+
+ return items
+
+
+class RSSPlanetAllHandler(RSSHandler):
+ _cache_prefix = "planet"
+
+ title = "IPFire.org - Planet"
+ url = "http://planet.ipfire.org/"
+ description = "IPFire Planet Feed"
+
+ def generate(self):
+ offset = int(self.get_argument("offset", 0))
+ limit = int(self.get_argument("limit", 10))
+
+ news = self.planet.get_entries(
+ limit=limit,
+ offset=offset,
+ )
+
+ items = []
+ for n in news:
+ # Get author information
+ author = tornado.database.Row(
+ name = n.author.cn,
+ mail = n.author.email,
+ )
+
+ item = tornado.database.Row({
+ "title" : n.title,
+ "author" : author,
+ "date" : n.published,
+ "url" : "http://planet.ipfire.org/post/%s" % n.slug,
+ "text" : textile.textile(n.text),
+ })
+ items.append(item)
+
+ return items
+
+
+class RSSPlanetUserHandler(RSSPlanetAllHandler):
+ @property
+ def cache_prefix(self):
+ return "%s-user=%s" % (self._cache_prefix, self.user)
+
+ def get(self, user):
+ self.user = user
+
+ return RSSPlanetAllHandler.get(self)
+
+ def generate(self):
+ offset = int(self.get_argument("offset", 0))
+ limit = int(self.get_argument("limit", 10))
+
+ news = self.planet.get_entries_by_author(
+ self.user,
+ limit=limit,
+ offset=offset,
+ )
+
+ items = []
+ for n in news:
+ # Get author information
+ author = tornado.database.Row(
+ name = n.author.cn,
+ mail = n.author.email,
+ )
+
+ item = tornado.database.Row({
+ "title" : n.title,
+ "author" : author,
+ "date" : n.published,
+ "url" : "http://planet.ipfire.org/post/%s" % n.slug,
+ "text" : textile.textile(n.text),
+ })
+ items.append(item)
+
+ return items