[py3k] Don't encode URLs
Python 3's urllib works with unicode objects.
# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>."""json export views"""__docformat__="restructuredtext en"fromcubicwebimport_fromcubicweb.uilibimportrest_tracebackfromcubicweb.utilsimportjson_dumpsfromcubicweb.predicatesimportExpectedValuePredicate,any_rset,empty_rsetfromcubicweb.viewimportEntityView,AnyRsetViewfromcubicweb.web.applicationimportanonymized_requestfromcubicweb.web.viewsimportbasecontrollers,managementclassJsonpController(basecontrollers.ViewController):"""The jsonp controller is the same as a ViewController but : - anonymize request (avoid CSRF attacks) - if ``vid`` parameter is passed, make sure it's sensible (i.e. either "jsonexport" or "ejsonexport") - if ``callback`` request parameter is passed, it's used as json padding Response's content-type will either be ``application/javascript`` or ``application/json`` depending on ``callback`` parameter presence or not. """__regid__='jsonp'defpublish(self,rset=None):if'vid'inself._cw.form:vid=self._cw.form['vid']ifvidnotin('jsonexport','ejsonexport'):self.warning("vid %s can't be used with jsonp controller, ""falling back to jsonexport",vid)self._cw.form['vid']='jsonexport'else:# if no vid is specified, use jsonexportself._cw.form['vid']='jsonexport'ifself._cw.vreg.config['anonymize-jsonp-queries']:withanonymized_request(self._cw):returnself._get_json_data(rset)else:returnself._get_json_data(rset)def_get_json_data(self,rset):json_data=super(JsonpController,self).publish(rset)if'callback'inself._cw.form:# jsonpjson_padding=self._cw.form['callback'].encode('ascii')# use ``application/javascript`` if ``callback`` parameter is# provided, keep ``application/json`` otherwiseself._cw.set_content_type('application/javascript')json_data=json_padding+b'('+json_data+b')'returnjson_dataclassJsonMixIn(object):"""mixin class for json views Handles the following optional request parameters: - ``_indent`` : must be an integer. If found, it is used to pretty print json output """templatable=Falsecontent_type='application/json'binary=Truedefwdata(self,data):if'_indent'inself._cw.form:indent=int(self._cw.form['_indent'])else:indent=None# python's json.dumps escapes non-ascii charactersself.w(json_dumps(data,indent=indent).encode('ascii'))classJsonRsetView(JsonMixIn,AnyRsetView):"""dumps raw result set in JSON format"""__regid__='jsonexport'__select__=any_rset()# means rset might be empty or have any shapetitle=_('json-export-view')defcall(self):# XXX mimic w3c recommandations to serialize SPARQL results in json?# http://www.w3.org/TR/rdf-sparql-json-res/self.wdata(self.cw_rset.rows)classJsonEntityView(JsonMixIn,EntityView):"""dumps rset entities in JSON The following additional metadata is added to each row : - ``__cwetype__`` : entity type """__regid__='ejsonexport'__select__=EntityView.__select__|empty_rset()title=_('json-entities-export-view')defcall(self):entities=[]forentityinself.cw_rset.entities():entity.complete()# fetch all attributes# hack to add extra metadataentity.cw_attr_cache.update({'__cwetype__':entity.cw_etype,})entities.append(entity)self.wdata(entities)class_requested_vid(ExpectedValuePredicate):"""predicate that checks vid parameter value It differs from ``match_view`` in that it doesn't expect a ``view`` parameter to be given to ``select`` but will rather check ``req.form['vid']`` to match expected vid. """def__call__(self,cls,req,rset=None,**kwargs):returnreq.form.get('vid')inself.expectedclassJsonErrorView(JsonMixIn,management.ErrorView):"""custom error view selected when client asks for a json view The returned json object will contain err / traceback informations. """__select__=(management.ErrorView.__select__&_requested_vid('jsonexport','ejsonexport'))defcall(self):errmsg,exclass,excinfo=self._excinfo()self.wdata({'errmsg':errmsg,'exclass':exclass,'traceback':rest_traceback(excinfo,errmsg),})