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).
--- 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
--- 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__)