]> git.ipfire.org Git - people/shoehn/ipfire.org.git/commitdiff
Add RSS for planet.ipfire.org.
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 2 Jan 2011 18:34:26 +0000 (19:34 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 2 Jan 2011 18:34:26 +0000 (19:34 +0100)
www/templates/planet-main.html
www/templates/rss.xml
www/webapp/__init__.py
www/webapp/handlers_base.py
www/webapp/handlers_planet.py
www/webapp/handlers_rss.py [new file with mode: 0644]

index af9d02b02b30f45d50a4a5c7ff4aac027faa3335..388e12c964ce4042d3c8910f4520932cca6299c2 100644 (file)
@@ -14,7 +14,7 @@
                                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 %}
index f87c9ddff22953f1eed6cb62d6635c971cb0b2a7..d4809bffd69aa4ea0cb48dbedfd01104c1ab66ef 100644 (file)
@@ -1,19 +1,19 @@
 <?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 }}
index 705966e99bc9fb731d6e77021d1b043502468b99..06a49214d5f81c061b79a79ea3d5d874be1e7f2f 100644 (file)
@@ -64,7 +64,7 @@ class Application(tornado.web.Application):
                        (r"/downloads?", DownloadHandler),
 
                        # RSS feed
-                       (r"/news.rss", RSSHandler),
+                       (r"/news.rss", RSSNewsHandler),
 
                        # Redirection for bookmarks, etc.
                        (r"/(de|en)/(.*)", LangCompatHandler)
@@ -98,6 +98,10 @@ class Application(tornado.web.Application):
                        (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
index 109b378c697c34feffd870781ad1d8eae103dd42..263b11c51ce52862cb14924fe1f5bff7406f7405 100644 (file)
@@ -46,12 +46,14 @@ class BaseHandler(tornado.web.RequestHandler):
                        "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):
@@ -104,3 +106,7 @@ class BaseHandler(tornado.web.RequestHandler):
        @property
        def tracker(self):
                return backend.Tracker()
+
+       @property
+       def planet(self):
+               return backend.Planet()
index 3bb533bf03036143b6a5eac746319db110f8698c..dcd82ec25e55487589ee1814ff5420da0bee9161 100644 (file)
@@ -19,6 +19,8 @@ class PlanetBaseHandler(BaseHandler):
 
 
 class PlanetMainHandler(PlanetBaseHandler):
+       rss_url = "/rss"
+
        def get(self):
                offset = int(self.get_argument("offset", 0))
                limit = int(self.get_argument("limit", 4))
@@ -43,7 +45,7 @@ class PlanetUserHandler(PlanetBaseHandler):
                        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):
diff --git a/www/webapp/handlers_rss.py b/www/webapp/handlers_rss.py
new file mode 100644 (file)
index 0000000..a30c008
--- /dev/null
@@ -0,0 +1,154 @@
+#!/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