"""base xml and rss views:organization: Logilab:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""__docformat__="restructuredtext en"_=unicodefromtimeimporttimezonefromlogilab.mtconverterimportxml_escapefromcubicweb.selectorsimportnon_final_entity,one_line_rset,appobject_selectablefromcubicweb.viewimportEntityView,AnyRsetView,Componentfromcubicweb.uilibimportsimple_sgml_tagfromcubicweb.webimporthttpcache,box# base xml views ##############################################################classXMLView(EntityView):"""xml view for entities"""__regid__='xml'title=_('xml')templatable=Falsecontent_type='text/xml'xml_root='rset'item_vid='xmlitem'defcell_call(self,row,col):self.wview(self.item_vid,self.cw_rset,row=row,col=col)defcall(self):"""display a list of entities by calling their <item_vid> view"""self.w(u'<?xml version="1.0" encoding="%s"?>\n'%self._cw.encoding)self.w(u'<%s size="%s">\n'%(self.xml_root,len(self.cw_rset)))foriinxrange(self.cw_rset.rowcount):self.cell_call(i,0)self.w(u'</%s>\n'%self.xml_root)classXMLItemView(EntityView):__regid__='xmlitem'defcell_call(self,row,col):""" element as an item for an xml feed """entity=self.cw_rset.complete_entity(row,col)self.w(u'<%s>\n'%(entity.e_schema))forrschema,attrschemainentity.e_schema.attribute_definitions():attr=rschema.typetry:value=entity[attr]exceptKeyError:# BytescontinueifvalueisnotNone:ifattrschema=='Bytes':frombase64importb64encodevalue='<![CDATA[%s]]>'%b64encode(value.getvalue())elifisinstance(value,basestring):value=xml_escape(value)self.w(u' <%s>%s</%s>\n'%(attr,value,attr))self.w(u'</%s>\n'%(entity.e_schema))classXMLRsetView(AnyRsetView):"""dumps raw rset as xml"""__regid__='rsetxml'title=_('xml export')templatable=Falsecontent_type='text/xml'xml_root='rset'defcall(self):w=self.wrset,descr=self.cw_rset,self.cw_rset.descriptioneschema=self._cw.vreg.schema.eschemalabels=self.columns_labels(tr=False)w(u'<?xml version="1.0" encoding="%s"?>\n'%self._cw.encoding)w(u'<%s query="%s">\n'%(self.xml_root,xml_escape(rset.printable_rql())))forrowindex,rowinenumerate(self.cw_rset):w(u' <row>\n')forcolindex,valinenumerate(row):etype=descr[rowindex][colindex]tag=labels[colindex]attrs={}if'('intag:attrs['expr']=tagtag='funccall'ifvalisnotNoneandnoteschema(etype).final:attrs['eid']=val# csvrow.append(val) # val is eid in that caseval=self._cw.view('textincontext',rset,row=rowindex,col=colindex)else:val=self._cw.view('final',rset,row=rowindex,col=colindex,format='text/plain')w(simple_sgml_tag(tag,val,**attrs))w(u' </row>\n')w(u'</%s>\n'%self.xml_root)# RSS stuff ###################################################################classRSSFeedURL(Component):__regid__='rss_feed_url'__select__=non_final_entity()deffeed_url(self):returnself._cw.build_url(rql=self.cw_rset.limited_rql(),vid='rss')classRSSEntityFeedURL(Component):__regid__='rss_feed_url'__select__=non_final_entity()&one_line_rset()deffeed_url(self):returnself.cw_rset.get_entity(0,0).rss_feed_url()classRSSIconBox(box.BoxTemplate):"""just display the RSS icon on uniform result set"""__regid__='rss'__select__=(box.BoxTemplate.__select__&appobject_selectable('components','rss_feed_url'))visible=Falseorder=999defcall(self,**kwargs):try:rss=self._cw.external_resource('RSS_LOGO')exceptKeyError:self.error('missing RSS_LOGO external resource')returnurlgetter=self._cw.vreg['components'].select('rss_feed_url',self._cw,rset=self.cw_rset)url=urlgetter.feed_url()self.w(u'<a href="%s"><img src="%s" alt="rss"/></a>\n'%(xml_escape(url),rss))classRSSView(XMLView):__regid__='rss'title=_('rss')templatable=Falsecontent_type='text/xml'http_cache_manager=httpcache.MaxAgeHTTPCacheManagercache_max_age=60*60*2# stay in http cache for 2 hours by defaultdef_open(self):req=self._cwself.w(u'<?xml version="1.0" encoding="%s"?>\n'%req.encoding)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'%xml_escape(self.page_title()))self.w(u' <description>%s</description>\n'%xml_escape(req.form.get('vtitle','')))params=req.form.copy()params.pop('vid',None)self.w(u' <link>%s</link>\n'%xml_escape(self._cw.build_url(**params)))def_close(self):self.w(u' </channel>\n')self.w(u'</rss>')defcall(self):"""display a list of entities by calling their <item_vid> view"""self._open()foriinxrange(self.cw_rset.rowcount):self.cell_call(i,0)self._close()defcell_call(self,row,col):self.wview('rssitem',self.cw_rset,row=row,col=col)classRSSItemView(EntityView):__regid__='rssitem'date_format='%%Y-%%m-%%dT%%H:%%M%+03i:00'%(timezone/3600)add_div_section=Falsedefcell_call(self,row,col):entity=self.cw_rset.complete_entity(row,col)self.w(u'<item>\n')self.w(u'<guid isPermaLink="true">%s</guid>\n'%xml_escape(entity.absolute_url()))self.render_title_link(entity)self.render_description(entity)self._marker('dc:date',entity.dc_date(self.date_format))self.render_entity_creator(entity)self.w(u'</item>\n')defrender_description(self,entity):self._marker('description',entity.dc_description(format='text/html'))defrender_title_link(self,entity):self._marker('title',entity.dc_long_title())self._marker('link',entity.absolute_url())defrender_entity_creator(self,entity):ifentity.creator:self._marker('dc:creator',entity.dc_creator())def_marker(self,marker,value):ifvalue:self.w(u' <%s>%s</%s>\n'%(marker,xml_escape(value),marker))