# HG changeset patch # User Rabah Meradi # Date 1434353497 -7200 # Node ID 2dc0b0db23294358812b835553d161dfd23dea45 # Parent 286611d1d7a43ecf875d2874f673f55e6c8ed242 use CubicWeb request to execute RQL rset should be retrieved with cw_request, as it's then bound to it and propagate to all entities created from this rset (._cw). From there it may reach code expecting a request, not a connection (view, selector, etc). diff -r 286611d1d7a4 -r 2dc0b0db2329 pyramid_cubicweb/rest_api.py --- a/pyramid_cubicweb/rest_api.py Thu Aug 27 11:25:42 2015 +0200 +++ b/pyramid_cubicweb/rest_api.py Mon Jun 15 09:31:37 2015 +0200 @@ -21,13 +21,13 @@ 'x', 'Substitute') if self.attrname == 'eid': try: - rset = self.request.cw_cnx.execute( + rset = self.request.cw_request.execute( st.as_string(), {'x': int(self.value)}) except (ValueError, TypeResolverException): # conflicting eid/type raise HTTPNotFound() else: - rset = self.request.cw_cnx.execute( + rset = self.request.cw_request.execute( st.as_string(), {'x': unicode(self.value)}) return rset diff -r 286611d1d7a4 -r 2dc0b0db2329 pyramid_cubicweb/tests/test_rest_api.py --- a/pyramid_cubicweb/tests/test_rest_api.py Thu Aug 27 11:25:42 2015 +0200 +++ b/pyramid_cubicweb/tests/test_rest_api.py Mon Jun 15 09:31:37 2015 +0200 @@ -2,10 +2,15 @@ from . import PyramidCWTest +from pyramid_cubicweb.rest_api import EntityResource +from pyramid_cubicweb.core import CubicWebPyramidRequest +from pyramid.view import view_config + class RestApiTest(PyramidCWTest): def includeme(self, config): config.include('pyramid_cubicweb.rest_api') + config.include('pyramid_cubicweb.tests.test_rest_api') def test_delete(self): with self.admin_access.repo_cnx() as cnx: @@ -18,3 +23,32 @@ with self.admin_access.repo_cnx() as cnx: self.assertEqual(cnx.find('CWGroup', name=u'tmp').rowcount, 0) + + def test_rql_execute(self): + with self.admin_access.repo_cnx() as cnx: + cnx.create_entity('CWGroup', name=u'tmp') + cnx.commit() + self.login() + params = {'test_rql_execute': 'test'} + self.webapp.get('/cwgroup/tmp', params=params) + + +@view_config( + route_name='cwentities', + context=EntityResource, + request_method='GET', + request_param=('test_rql_execute',) +) +def test_rql_execute_view(context, request): + """Return 500 response if rset.req is not a CubicWeb request. + """ + if isinstance(context.rset.req, CubicWebPyramidRequest): + request.response.status_int = 204 + else: + request.response.status_int = 500 + request.response.text = 'rset.req is not a CubicWeb request' + return request.response + + +def includeme(config): + config.scan(__name__)