[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/ View implementation of RSS. NB. Specification for RSS 2.0 is significantly different to PythonScript implementation. Support for UID if available still required.

Charlie Clark charlie at begeistert.org
Mon Oct 4 11:40:58 EDT 2010


Log message for revision 117215:
  View implementation of RSS. NB. Specification for RSS 2.0 is significantly different to PythonScript implementation. Support for UID if available still required.

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/configure.zcml
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/rss.pt
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/rss.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/configure.zcml
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/configure.zcml	2010-10-04 12:15:01 UTC (rev 117214)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/configure.zcml	2010-10-04 15:40:57 UTC (rev 117215)
@@ -25,6 +25,15 @@
       permission="cmf.ListFolderContents"
       />
 
+  <browser:page
+      for="Products.CMFCore.interfaces.ISyndicatable"
+      layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
+      name="rss.xml"
+      class=".rss.View"
+      template="rss.pt"
+      permission="zope2.View"
+      />
+
   <adapter factory=".metadata.MinimalMetadataSchemaAdapter"/>
 
   <browser:page

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/rss.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/rss.pt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/rss.pt	2010-10-04 15:40:57 UTC (rev 117215)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"
+     xmlns:tal="http://xml.zope.org/namespaces/tal"
+     xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <channel tal:define="channel view/channel">
+    <title tal:content="channel/title"></title>
+    <link tal:content="context/portal_url">/</link>
+    <lastBuildDate tal:content="channel/base"></lastBuildDate>
+    <ttl tal:content="channel/ttl"></ttl>
+    <docs>http://www.rssboard.org/rss-specification</docs>
+    <description tal:content="channel/description"></description>
+    <atom:link tal:attributes="href request/URL"
+                rel="self" type="application/rss+xml" />
+
+    <item tal:repeat="item view/items">
+        <title tal:content="item/title"></title>
+        <description tal:content="item/description"></description>
+        <link tal:content="item/url"></link>
+        <guid tal:condition="item/uid" tal:content="item/uid" ></guid>
+        <pubDate tal:content="item/date"></pubDate>
+        <dc:publisher
+            tal:condition="item/publisher"
+            tal:content="item/publisher">PUBLISHER</dc:publisher>
+        <dc:creator
+            tal:repeat="creator item/creators"
+            tal:content="creator">CREATOR</dc:creator>
+        <dc:rights
+            tal:condition="item/rights"
+            tal:content="item/rights">RIGHTS</dc:rights>
+        <dc:subject
+            tal:repeat="subject item/subjects"
+            tal:content="subject">SUBJECT</dc:subject>
+    </item>
+    
+  </channel>
+</rss>
\ No newline at end of file

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/rss.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/rss.py	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/rss.py	2010-10-04 15:40:57 UTC (rev 117215)
@@ -0,0 +1,68 @@
+##############################################################################
+#
+# Copyright (c) 2010 Zope Foundation and Contributors.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""RSS view for syndicatable items"""
+
+from ZTUtils import LazyFilter
+
+from zope.component import getAdapter
+from zope.sequencesort.ssort import sort
+
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+
+from Products.CMFCore.interfaces import ISyndicationInfo
+from Products.CMFDefault.browser.utils import ViewBase, memoize, decode
+
+
+class View(ViewBase):
+
+    """Return an RSS conform list of content items"""
+
+    @property
+    @memoize
+    def synd_info(self):
+        return getAdapter(self.context, ISyndicationInfo).get_info()
+
+    @memoize
+    @decode
+    def items(self):
+        """Return items according to policy"""
+
+        stool = self._getTool("portal_syndication")
+        key, reverse = self.context.getDefaultSorting()
+        items = stool.getSyndicatableContent(self.context)
+        items = sort(items, ((key, 'cmp', reverse and 'desc' or 'asc'),))
+        items = LazyFilter(items, skip='View')
+        items = ({'title': o.Title(), 'description': o.Description(),
+                  'creators': o.listCreators(), 'subjects': o.Subject(),
+                  'rights': o.Rights, 'publisher': o.Publisher(),
+                  'url': o.absolute_url(), 'date': o.modified().rfc822(),
+                  'uid': None}
+                  for idx, o in enumerate(items)
+                    if idx < self.synd_info['max_items'])
+        return items
+
+    @memoize
+    @decode
+    def channel(self):
+        """Provide infomation about the channel"""
+        converter = {'daily':1, 'weekly':7, 'monthly': 30, 'yearly': 365}
+        ttl = 60 * 24 *(self.synd_info['frequency'] *
+                            converter[self.synd_info['period']])
+
+        info = {'base': self.synd_info['base'].rfc822(),
+                'ttl': ttl,
+                'period': self.synd_info['period'],
+                'title': self.context.Title(),
+                'description': self.context.Description()
+                }
+        return info


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/rss.py
___________________________________________________________________
Added: svn:eol-style
   + native



More information about the checkins mailing list