web/views/xmlrss.py
branchtls-sprint
changeset 1091 b5e253c0dd13
parent 824 a5e6acffde30
child 1135 00eb43688a57
equal deleted inserted replaced
1090:a99dc223c583 1091:b5e253c0dd13
     1 """base xml and rss views
     1 """base xml and rss views
     2 
       
     3 
     2 
     4 :organization: Logilab
     3 :organization: Logilab
     5 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     4 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     6 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     7 """
     6 """
     9 
     8 
    10 from time import timezone
     9 from time import timezone
    11 
    10 
    12 from logilab.mtconverter import xml_escape
    11 from logilab.mtconverter import xml_escape
    13 
    12 
       
    13 from cubicweb.selectors import non_final_entity, one_line_rset, appobject_selectable
    14 from cubicweb.view import EntityView, AnyRsetView
    14 from cubicweb.view import EntityView, AnyRsetView
    15 from cubicweb.web.httpcache import MaxAgeHTTPCacheManager
    15 from cubicweb.web.httpcache import MaxAgeHTTPCacheManager
       
    16 from cubicweb.web.component import Component
       
    17 from cubicweb.web.box import BoxTemplate
    16 from cubicweb.common.uilib import simple_sgml_tag
    18 from cubicweb.common.uilib import simple_sgml_tag
    17 
    19 
       
    20 _ = unicode
       
    21 
       
    22 
       
    23 # base xml views ##############################################################
    18 
    24 
    19 class XmlView(EntityView):
    25 class XmlView(EntityView):
    20     """xml view for entities"""
    26     """xml view for entities"""
    21     id = 'xml'
    27     id = 'xml'
    22     title = _('xml')
    28     title = _('xml')
    57                     value = '<![CDATA[%s]]>' % b64encode(value.getvalue())
    63                     value = '<![CDATA[%s]]>' % b64encode(value.getvalue())
    58                 elif isinstance(value, basestring):
    64                 elif isinstance(value, basestring):
    59                     value = xml_escape(value)
    65                     value = xml_escape(value)
    60                 self.w(u'  <%s>%s</%s>\n' % (attr, value, attr))
    66                 self.w(u'  <%s>%s</%s>\n' % (attr, value, attr))
    61         self.w(u'</%s>\n' % (entity.e_schema))
    67         self.w(u'</%s>\n' % (entity.e_schema))
    62 
       
    63 
    68 
    64     
    69     
    65 class XmlRsetView(AnyRsetView):
    70 class XmlRsetView(AnyRsetView):
    66     """dumps raw rset as xml"""
    71     """dumps raw rset as xml"""
    67     id = 'rsetxml'
    72     id = 'rsetxml'
    95                     val = self.view('final', rset, displaytime=True,
   100                     val = self.view('final', rset, displaytime=True,
    96                                     row=rowindex, col=colindex, format='text/plain')
   101                                     row=rowindex, col=colindex, format='text/plain')
    97                 w(simple_sgml_tag(tag, val, **attrs))
   102                 w(simple_sgml_tag(tag, val, **attrs))
    98             w(u' </row>\n')
   103             w(u' </row>\n')
    99         w(u'</%s>\n' % self.xml_root)
   104         w(u'</%s>\n' % self.xml_root)
   100     
   105 
       
   106     
       
   107 # RSS stuff ###################################################################
       
   108 
       
   109 class RSSFeedURL(Component):
       
   110     id = 'rss_feed_url'
       
   111     __select__ = non_final_entity()
       
   112     
       
   113     def feed_url(self):
       
   114         return self.build_url(rql=self.limited_rql(), vid='rss')
       
   115 
       
   116 
       
   117 class RSSEntityFeedURL(Component):
       
   118     id = 'rss_feed_url'
       
   119     __select__ = non_final_entity() & one_line_rset()
       
   120     
       
   121     def feed_url(self):
       
   122         return self.entity(0, 0).rss_feed_url()
       
   123 
       
   124         
       
   125 class RSSIconBox(BoxTemplate):
       
   126     """just display the RSS icon on uniform result set"""
       
   127     id = 'rss'
       
   128     __select__ = (BoxTemplate.__select__
       
   129                   & appobject_selectable('components', 'rss_feed_url'))
       
   130     
       
   131     visible = False
       
   132     order = 999
       
   133     
       
   134     def call(self, **kwargs):
       
   135         try:
       
   136             rss = self.req.external_resource('RSS_LOGO')
       
   137         except KeyError:
       
   138             self.error('missing RSS_LOGO external resource')
       
   139             return
       
   140         urlgetter = self.vreg.select_component('rss_feed_url', self.req, self.rset)
       
   141         url = urlgetter.feed_url()
       
   142         self.w(u'<a href="%s"><img src="%s" alt="rss"/></a>\n' % (html_escape(url), rss))
       
   143 
   101 
   144 
   102 class RssView(XmlView):
   145 class RssView(XmlView):
   103     id = 'rss'
   146     id = 'rss'
   104     title = _('rss')
   147     title = _('rss')
   105     templatable = False
   148     templatable = False