nicer __str__ and __repr__ methods on rql constraints
"""SPARQL integration:organization: Logilab:copyright: 2009 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"""v__docformat__="restructuredtext en"importrqlfromyamsimportxyfromlxmlimportetreefromlxml.builderimportEfromcubicweb.viewimportStartupView,AnyRsetViewfromcubicweb.webimportRedirect,form,formfields,formwidgetsasfwdgsfromcubicweb.web.viewsimportforms,urlrewritetry:fromcubicweb.spa2rqlimportSparql2rqlTranslatorexceptImportError:# fyzz not available (only a recommends)Sparql2rqlTranslator=NoneclassSparqlForm(forms.FieldsForm):id='sparql'sparql=formfields.StringField(help=_('type here a sparql query'))resultvid=formfields.StringField(choices=((_('table'),'table'),(_('sparql xml'),'sparqlxml')),widget=fwdgs.Radio,initial='table')form_buttons=[fwdgs.SubmitButton()]@propertydefaction(self):returnself.req.url()classSparqlFormView(form.FormViewMixIn,StartupView):id='sparql'defcall(self):form=self.vreg.select('forms','sparql',self.req)self.w(form.render())sparql=self.req.form.get('sparql')vid=self.req.form.get('resultvid','table')ifsparql:try:qinfo=Sparql2rqlTranslator(self.schema).translate(sparql)exceptrql.TypeResolverException,ex:self.w(self.req._('can not resolve entity types:')+u' '+unicode('ex'))exceptUnsupportedQuery:self.w(self.req._('we are not yet ready to handle this query'))exceptxy.UnsupportedVocabulary,ex:self.w(self.req._('unknown vocabulary:')+u' '+unicode('ex'))ifvid=='sparqlxml':url=self.build_url('view',rql=qinfo.finalize(),vid=vid)raiseRedirect(url)rset=self.req.execute(qinfo.finalize())self.wview(vid,rset,'null')## sparql resultset views #####################################################YAMS_XMLSCHEMA_MAPPING={'String':'string','Int':'integer','Float':'float','Boolean':'boolean','Datetime':'dateTime','Date':'date','Time':'time',# XXX the following types don't have direct mapping'Decimal':'string','Interval':'duration','Password':'string','Bytes':'base64Binary',}defxmlschema(yamstype):return'http://www.w3.org/2001/XMLSchema#%s'%YAMS_XMLSCHEMA_MAPPING[yamstype]classSparqlResultXmlView(AnyRsetView):"""The spec can be found here: http://www.w3.org/TR/rdf-sparql-XMLres/ """id='sparqlxml'content_type='application/sparql-results+xml'templatable=Falsedefcall(self):# XXX handle UNIONrqlst=self.rset.syntax_tree().children[0]varnames=[var.nameforvarinrqlst.selection]results=E.results()forrowidxinxrange(len(self.rset)):result=E.result()forcolidx,varnameinenumerate(varnames):result.append(self.cell_binding(rowidx,colidx,varname))results.append(result)sparql=E.sparql(E.head(*(E.variable(name=name)fornameinvarnames)),results)self.w(u'<?xml version="1.0"?>\n')self.w(etree.tostring(sparql,encoding=unicode,pretty_print=True))defcell_binding(self,row,col,varname):celltype=self.rset.description[row][col]ifself.schema.eschema(celltype).final:cellcontent=self.view('cell',self.rset,row=row,col=col)returnE.binding(E.literal(cellcontent,datatype=xmlschema(celltype)),name=varname)else:entity=self.entity(row,col)returnE.binding(E.uri(entity.absolute_url()),name=varname)defset_request_content_type(self):"""overriden to set the correct filetype and filename"""self.req.set_content_type(self.content_type,filename='sparql.xml',encoding=self.req.encoding)defregistration_callback(vreg):ifSparql2rqlTranslatorisnotNone:vreg.register_all(globals().values(),__name__)