# HG changeset patch # User Sylvain Thénault # Date 1305099722 -7200 # Node ID b9813c9d32ac158f615f2b3e611509774f1ee5fd # Parent 5ad3154a88103c204ad9b2fefa30a8fd4cf99f45 [selectors] enhance rql_condition to make it usable as a condition on request's user diff -r 5ad3154a8810 -r b9813c9d32ac selectors.py --- a/selectors.py Tue May 10 18:50:13 2011 +0200 +++ b/selectors.py Wed May 11 09:42:02 2011 +0200 @@ -1160,9 +1160,12 @@ See :class:`~cubicweb.selectors.EntitySelector` documentation for entity lookup / score rules according to the input context. """ - def __init__(self, expression, once_is_enough=False): + def __init__(self, expression, once_is_enough=False, user_condition=False): super(rql_condition, self).__init__(once_is_enough) - if 'U' in frozenset(split_expression(expression)): + self.user_condition = user_condition + if user_condition: + rql = 'Any COUNT(U) WHERE U eid %%(u)s, %s' % expression + elif 'U' in frozenset(split_expression(expression)): rql = 'Any COUNT(X) WHERE X eid %%(x)s, U eid %%(u)s, %s' % expression else: rql = 'Any COUNT(X) WHERE X eid %%(x)s, %s' % expression @@ -1171,6 +1174,16 @@ def __str__(self): return '%s(%r)' % (self.__class__.__name__, self.rql) + @lltrace + def __call__(self, cls, req, **kwargs): + if self.user_condition: + try: + return req.execute(self.rql, {'u': req.user.eid})[0][0] + except Unauthorized: + return 0 + else: + return super(rql_condition, self).__call__(cls, req, **kwargs) + def _score(self, req, eid): try: return req.execute(self.rql, {'x': eid, 'u': req.user.eid})[0][0] diff -r 5ad3154a8810 -r b9813c9d32ac test/unittest_selectors.py --- a/test/unittest_selectors.py Tue May 10 18:50:13 2011 +0200 +++ b/test/unittest_selectors.py Wed May 11 09:42:02 2011 +0200 @@ -427,6 +427,13 @@ self.assertEqual(selector(None, req, entity=req.user), 1) self.assertEqual(selector(None, req), 0) + def test_rql_condition_user(self): + req = self.request() + selector = rql_condition('U login "admin"', user_condition=True) + self.assertEqual(selector(None, req), 1) + selector = rql_condition('U login "toto"', user_condition=True) + self.assertEqual(selector(None, req), 0) + if __name__ == '__main__': unittest_main()