web/views/xmlrss.py
branchtls-sprint
changeset 1477 b056a49c16dc
parent 1135 00eb43688a57
child 1550 8260e857822b
--- a/web/views/xmlrss.py	Fri Apr 24 16:48:38 2009 +0200
+++ b/web/views/xmlrss.py	Fri Apr 24 17:04:14 2009 +0200
@@ -30,10 +30,10 @@
     content_type = 'text/xml'
     xml_root = 'rset'
     item_vid = 'xmlitem'
-    
+
     def cell_call(self, row, col):
         self.wview(self.item_vid, self.rset, row=row, col=col)
-        
+
     def call(self):
         """display a list of entities by calling their <item_vid> view"""
         self.w(u'<?xml version="1.0" encoding="%s"?>\n' % self.req.encoding)
@@ -66,7 +66,7 @@
                 self.w(u'  <%s>%s</%s>\n' % (attr, value, attr))
         self.w(u'</%s>\n' % (entity.e_schema))
 
-    
+
 class XmlRsetView(AnyRsetView):
     """dumps raw rset as xml"""
     id = 'rsetxml'
@@ -74,7 +74,7 @@
     templatable = False
     content_type = 'text/xml'
     xml_root = 'rset'
-        
+
     def call(self):
         w = self.w
         rset, descr = self.rset, self.rset.description
@@ -103,13 +103,13 @@
             w(u' </row>\n')
         w(u'</%s>\n' % self.xml_root)
 
-    
+
 # RSS stuff ###################################################################
 
 class RSSFeedURL(Component):
     id = 'rss_feed_url'
     __select__ = non_final_entity()
-    
+
     def feed_url(self):
         return self.build_url(rql=self.limited_rql(), vid='rss')
 
@@ -117,20 +117,20 @@
 class RSSEntityFeedURL(Component):
     id = 'rss_feed_url'
     __select__ = non_final_entity() & one_line_rset()
-    
+
     def feed_url(self):
         return self.entity(0, 0).rss_feed_url()
 
-        
+
 class RSSIconBox(BoxTemplate):
     """just display the RSS icon on uniform result set"""
     id = 'rss'
     __select__ = (BoxTemplate.__select__
                   & appobject_selectable('components', 'rss_feed_url'))
-    
+
     visible = False
     order = 999
-    
+
     def call(self, **kwargs):
         try:
             rss = self.req.external_resource('RSS_LOGO')
@@ -148,58 +148,57 @@
     templatable = False
     content_type = 'text/xml'
     http_cache_manager = MaxAgeHTTPCacheManager
-    cache_max_age = 60*60*2 # stay in http cache for 2 hours by default 
-    
-    def cell_call(self, row, col):
-        self.wview('rssitem', self.rset, row=row, col=col)
-        
-    def call(self):
-        """display a list of entities by calling their <item_vid> view"""
+    cache_max_age = 60*60*2 # stay in http cache for 2 hours by default
+
+    def _open(self):
         req = self.req
         self.w(u'<?xml version="1.0" encoding="%s"?>\n' % req.encoding)
-        self.w(u'''<rdf:RDF
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns="http://purl.org/rss/1.0/"
->''')
-        self.w(u'  <channel rdf:about="%s">\n' % xml_escape(req.url()))
-        self.w(u'    <title>%s RSS Feed</title>\n' % xml_escape(self.page_title()))
-        self.w(u'    <description>%s</description>\n' % xml_escape(req.form.get('vtitle', '')))
+        self.w(u'<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">\n')
+        self.w(u'  <channel>\n')
+        self.w(u'    <title>%s RSS Feed</title>\n' % html_escape(self.page_title()))
+        self.w(u'    <description>%s</description>\n' % html_escape(req.form.get('vtitle', '')))
         params = req.form.copy()
         params.pop('vid', None)
-        self.w(u'    <link>%s</link>\n' % xml_escape(self.build_url(**params)))
-        self.w(u'    <items>\n')
-        self.w(u'      <rdf:Seq>\n')
-        for entity in self.rset.entities():
-            self.w(u'      <rdf:li resource="%s" />\n' % xml_escape(entity.absolute_url()))
-        self.w(u'      </rdf:Seq>\n')
-        self.w(u'    </items>\n')
+        self.w(u'    <link>%s</link>\n' % html_escape(self.build_url(**params)))
+
+    def _close(self):
         self.w(u'  </channel>\n')
+        self.w(u'</rss>')
+
+    def call(self):
+        """display a list of entities by calling their <item_vid> view"""
+        self._open()
         for i in xrange(self.rset.rowcount):
             self.cell_call(i, 0)
-        self.w(u'</rdf:RDF>')
+        self._close()
 
+    def cell_call(self, row, col):
+        self.wview('rssitem', self.rset, row=row, col=col)
 
 class RssItemView(EntityView):
     id = 'rssitem'
     date_format = '%%Y-%%m-%%dT%%H:%%M%+03i:00' % (timezone / 3600)
+    add_div_section = False
 
     def cell_call(self, row, col):
         entity = self.complete_entity(row, col)
-        self.w(u'<item rdf:about="%s">\n' % xml_escape(entity.absolute_url()))
+        self.w(u'<item>\n')
+        self.w(u'<guid isPermaLink="true">%s</guid>\n' % html_escape(entity.absolute_url()))
+        self.render_title_link(entity)
+        self._marker('description', html_escape(entity.dc_description()))
+        self._marker('dc:date', entity.dc_date(self.date_format))
+        self.render_entity_creator(entity)
+        self.w(u'</item>\n')
+
+    def render_title_link(self, entity):
         self._marker('title', entity.dc_long_title())
         self._marker('link', entity.absolute_url())
-        self._marker('description', entity.dc_description())
-        self._marker('dc:date', entity.dc_date(self.date_format))
+
+    def render_entity_creator(self, entity):
         if entity.creator:
-            self.w(u'<author>')
-            self._marker('name', entity.creator.name())
-            email = entity.creator.get_email()
-            if email:
-                self._marker('email', email)
-            self.w(u'</author>')
-        self.w(u'</item>\n')
-        
+            self._marker('dc:creator', entity.dc_creator())
+
+
     def _marker(self, marker, value):
         if value:
-            self.w(u'  <%s>%s</%s>\n' % (marker, xml_escape(value), marker))
+            self.w(u'  <%s>%s</%s>\n' % (marker, html_escape(value), marker))