[testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
# 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"_=unicodefromcubicweb.utilsimportjson_dumpsfromcubicweb.predicatesimportany_rsetfromcubicweb.viewimportEntityView,AnyRsetViewfromcubicweb.web.applicationimportanonymized_requestfromcubicweb.web.viewsimportbasecontrollersclassJsonpController(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']# use ``application/javascript`` is ``callback`` parameter is# provided, let ``application/json`` otherwiseself._cw.set_content_type('application/javascript')json_data='%s(%s)'%(json_padding,json_data)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=Noneself.w(json_dumps(data,indent=indent))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'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)