# HG changeset patch # User Sylvain Thénault # Date 1297164210 -3600 # Node ID 013f81b729def8efb25ef3512082420cb49bfe7d # Parent e350771c23a32b2a1eeb903d4a426dd537ddd161# Parent 3d72028a6cd4576f94af17607351c9c9b7c2d9da backport stable diff -r e350771c23a3 -r 013f81b729de .hgtags --- a/.hgtags Mon Feb 07 18:19:40 2011 +0100 +++ b/.hgtags Tue Feb 08 12:23:30 2011 +0100 @@ -179,3 +179,5 @@ 1484257fe9aeb29d0210e635c12ae5b3d6118cfb cubicweb-debian-version-3.10.6-1 1959d97ebf2e6a0f7cd05d4cc48bb955c4351da5 cubicweb-version-3.10.7 bf5d9a1415e3c9abe6b68ba3b24a8ad741f9de3c cubicweb-debian-version-3.10.7-1 +e581a86a68f089946a98c966ebca7aee58a5718f cubicweb-version-3.10.8 +132b525de25bc75ed6389c45aee77e847cb3a437 cubicweb-debian-version-3.10.8-1 diff -r e350771c23a3 -r 013f81b729de __pkginfo__.py --- a/__pkginfo__.py Mon Feb 07 18:19:40 2011 +0100 +++ b/__pkginfo__.py Tue Feb 08 12:23:30 2011 +0100 @@ -1,4 +1,4 @@ -# pylint: disable=W0622,C0103 + # pylint: disable=W0622,C0103 # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # @@ -52,7 +52,7 @@ 'Twisted': '', # XXX graphviz # server dependencies - 'logilab-database': '>= 1.3.2', + 'logilab-database': '>= 1.3.3', 'pysqlite': '>= 2.5.5', # XXX install pysqlite2 } diff -r e350771c23a3 -r 013f81b729de debian/changelog --- a/debian/changelog Mon Feb 07 18:19:40 2011 +0100 +++ b/debian/changelog Tue Feb 08 12:23:30 2011 +0100 @@ -1,3 +1,9 @@ +cubicweb (3.10.8-1) unstable; urgency=low + + * new upstream release + + -- Sylvain Thénault Wed, 02 Feb 2011 11:09:22 +0100 + cubicweb (3.10.7-1) unstable; urgency=low * new upstream release diff -r e350771c23a3 -r 013f81b729de debian/control --- a/debian/control Mon Feb 07 18:19:40 2011 +0100 +++ b/debian/control Tue Feb 08 12:23:30 2011 +0100 @@ -33,7 +33,7 @@ Conflicts: cubicweb-multisources Replaces: cubicweb-multisources Provides: cubicweb-multisources -Depends: ${misc:Depends}, ${python:Depends}, cubicweb-common (= ${source:Version}), cubicweb-ctl (= ${source:Version}), python-logilab-database (>= 1.3.2), cubicweb-postgresql-support | cubicweb-mysql-support | python-pysqlite2 +Depends: ${misc:Depends}, ${python:Depends}, cubicweb-common (= ${source:Version}), cubicweb-ctl (= ${source:Version}), python-logilab-database (>= 1.3.3), cubicweb-postgresql-support | cubicweb-mysql-support | python-pysqlite2 Recommends: pyro (<< 4.0.0), cubicweb-documentation (= ${source:Version}) Description: server part of the CubicWeb framework CubicWeb is a semantic web application framework. diff -r e350771c23a3 -r 013f81b729de ext/rest.py --- a/ext/rest.py Mon Feb 07 18:19:40 2011 +0100 +++ b/ext/rest.py Tue Feb 08 12:23:30 2011 +0100 @@ -47,6 +47,8 @@ from cubicweb import UnknownEid from cubicweb.ext.html4zope import Writer +from cubicweb.web.views import vid_from_rset # XXX better not to import c.w.views here... + # We provide our own parser as an attempt to get rid of # state machine reinstanciation @@ -93,6 +95,23 @@ return [nodes.reference(rawtext, utils.unescape(rest), refuri=ref, **options)], [] +def rql_role(role, rawtext, text, lineno, inliner, options={}, content=[]): + """:rql:`Any X,Y WHERE X is CWUser, X login Y:table`""" + _cw = inliner.document.settings.context._cw + text = text.strip() + if ':' in text: + rql, vid = text.rsplit(u':', 1) + rql = rql.strip() + else: + rql, vid = text, None + _cw.ensure_ro_rql(rql) + rset = _cw.execute(rql, {'userid': _cw.user.eid}) + if vid is None: + vid = vid_from_rset(_cw, rset, _cw.vreg.schema) + view = _cw.vreg['views'].select(vid, _cw, rset=rset) + content = view.render() + set_classes(options) + return [nodes.raw('', content, format='html')], [] def winclude_directive(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine): @@ -288,6 +307,7 @@ return _INITIALIZED = True register_canonical_role('eid', eid_reference_role) + register_canonical_role('rql', rql_role) directives.register_directive('winclude', winclude_directive) if pygments_directive is not None: directives.register_directive('sourcecode', pygments_directive) diff -r e350771c23a3 -r 013f81b729de ext/test/unittest_rest.py --- a/ext/test/unittest_rest.py Mon Feb 07 18:19:40 2011 +0100 +++ b/ext/test/unittest_rest.py Tue Feb 08 12:23:30 2011 +0100 @@ -56,5 +56,17 @@ ''') + + def test_rql_role_with_vid(self): + context = self.context() + out = rest_publish(context, ':rql:`Any X WHERE X is CWUser:table`') + self.assert_(out.endswith('anon' + '\n\n

\n')) + + def test_rql_role_without_vid(self): + context = self.context() + out = rest_publish(context, ':rql:`Any X WHERE X is CWUser`') + self.assertEqual(out, u'

cwuser_plural

\n') + if __name__ == '__main__': unittest_main() diff -r e350771c23a3 -r 013f81b729de i18n/de.po --- a/i18n/de.po Mon Feb 07 18:19:40 2011 +0100 +++ b/i18n/de.po Tue Feb 08 12:23:30 2011 +0100 @@ -1321,11 +1321,9 @@ #, python-format msgid "" -"can't set inlined=%(inlined)s, %(stype)s %(rtype)s %(otype)s has cardinality=" +"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality=" "%(card)s" msgstr "" -"Kann 'inlined' = %(inlined)s nicht zuweisen, %(stype)s %(rtype)s %(otype)s " -"hat die Kardinalität %(card)s" msgid "cancel" msgstr "" @@ -4346,3 +4344,10 @@ msgid "you should probably delete that property" msgstr "Sie sollten diese Eigenschaft wahrscheinlich löschen." + +#~ msgid "" +#~ "can't set inlined=%(inlined)s, %(stype)s %(rtype)s %(otype)s has " +#~ "cardinality=%(card)s" +#~ msgstr "" +#~ "Kann 'inlined' = %(inlined)s nicht zuweisen, %(stype)s %(rtype)s " +#~ "%(otype)s hat die Kardinalität %(card)s" diff -r e350771c23a3 -r 013f81b729de i18n/en.po --- a/i18n/en.po Mon Feb 07 18:19:40 2011 +0100 +++ b/i18n/en.po Tue Feb 08 12:23:30 2011 +0100 @@ -1275,7 +1275,7 @@ #, python-format msgid "" -"can't set inlined=%(inlined)s, %(stype)s %(rtype)s %(otype)s has cardinality=" +"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality=" "%(card)s" msgstr "" diff -r e350771c23a3 -r 013f81b729de i18n/es.po --- a/i18n/es.po Mon Feb 07 18:19:40 2011 +0100 +++ b/i18n/es.po Tue Feb 08 12:23:30 2011 +0100 @@ -1321,11 +1321,11 @@ #, python-format msgid "" -"can't set inlined=%(inlined)s, %(stype)s %(rtype)s %(otype)s has cardinality=" +"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality=" "%(card)s" msgstr "" -"no puede poner 'inlined' = %(inlined)s, %(stype)s %(rtype)s %(otype)s tiene " -"cardinalidad %(card)s" +"no puede poner 'inlined' = True, %(stype)s %(rtype)s %(otype)s " + "tiene cardinalidad %(card)s" msgid "cancel" msgstr "" diff -r e350771c23a3 -r 013f81b729de i18n/fr.po --- a/i18n/fr.po Mon Feb 07 18:19:40 2011 +0100 +++ b/i18n/fr.po Tue Feb 08 12:23:30 2011 +0100 @@ -1323,11 +1323,11 @@ #, python-format msgid "" -"can't set inlined=%(inlined)s, %(stype)s %(rtype)s %(otype)s has cardinality=" +"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality=" "%(card)s" msgstr "" -"ne peut mettre 'inlined' = %(inlined)s, %(stype)s %(rtype)s %(otype)s a pour " -"cardinalité %(card)s" +"ne peut mettre 'inlined'=Vrai, %(stype)s %(rtype)s %(otype)s a " +"pour cardinalité %(card)s" msgid "cancel" msgstr "annuler" diff -r e350771c23a3 -r 013f81b729de server/rqlannotation.py --- a/server/rqlannotation.py Mon Feb 07 18:19:40 2011 +0100 +++ b/server/rqlannotation.py Tue Feb 08 12:23:30 2011 +0100 @@ -195,7 +195,7 @@ for rel in sorted(relations, key=lambda x: (x.children[0].name, x.r_type)): # only equality relation with a variable as rhs may be principal if rel.operator() not in ('=', 'IS') \ - or not isinstance(rel.children[1].children[0], VariableRef): + or not isinstance(rel.children[1].children[0], VariableRef) or rel.neged(strict=True): continue if rel.scope is rel.stmt: return rel diff -r e350771c23a3 -r 013f81b729de server/serverctl.py --- a/server/serverctl.py Mon Feb 07 18:19:40 2011 +0100 +++ b/server/serverctl.py Tue Feb 08 12:23:30 2011 +0100 @@ -75,7 +75,7 @@ user = raw_input('Connect as user ? [%r]: ' % default_user) user = user.strip() or default_user if user == source.get('db-user'): - password = source['db-password'] + password = source.get('db-password') else: password = getpass('password: ') else: @@ -219,7 +219,7 @@ return user = source['db-user'] or None cnx = confirm_on_error_or_die('connecting to database %s' % dbname, - _db_sys_cnx, source, 'DROP DATABASE', user=user) + _db_sys_cnx, source, 'DROP DATABASE') if cnx is ERROR: return cursor = cnx.cursor() @@ -328,14 +328,15 @@ elif self.config.create_db: print '\n'+underline_title('Creating the system database') # connect on the dbms system base to create our base - dbcnx = _db_sys_cnx(source, 'CREATE/DROP DATABASE and / or USER', verbose=verbose) + dbcnx = _db_sys_cnx(source, 'CREATE/DROP DATABASE and / or USER', + verbose=verbose) cursor = dbcnx.cursor() try: if helper.users_support: user = source['db-user'] if not helper.user_exists(cursor, user) and (automatic or \ ASK.confirm('Create db user %s ?' % user, default_is_yes=False)): - helper.create_user(source['db-user'], source['db-password']) + helper.create_user(source['db-user'], source.get('db-password')) print '-> user %s created.' % user if dbname in helper.list_databases(cursor): if automatic or ASK.confirm('Database %s already exists -- do you want to drop it ?' % dbname): diff -r e350771c23a3 -r 013f81b729de server/sources/rql2sql.py --- a/server/sources/rql2sql.py Mon Feb 07 18:19:40 2011 +0100 +++ b/server/sources/rql2sql.py Tue Feb 08 12:23:30 2011 +0100 @@ -991,24 +991,21 @@ unification (eg X attr1 A, Y attr2 A). In case of selection, nothing to do here. """ - contextrels = {} for var in rhs_vars: if var.name in self._varmap: # ensure table is added self._var_info(var.variable) principal = var.variable.stinfo.get('principal') if principal is not None and principal is not relation: - contextrels[var.name] = relation - if not contextrels: - return '' - # we have to generate unification expression - lhssql = self._inlined_var_sql(relation.children[0].variable, - relation.r_type) - try: - self._state.ignore_varmap = True - return '%s%s' % (lhssql, relation.children[1].accept(self)) - finally: - self._state.ignore_varmap = False + # we have to generate unification expression + lhssql = self._inlined_var_sql(relation.children[0].variable, + relation.r_type) + try: + self._state.ignore_varmap = True + return '%s%s' % (lhssql, relation.children[1].accept(self)) + finally: + self._state.ignore_varmap = False + return '' def _visit_attribute_relation(self, rel): """generate SQL for an attribute relation""" diff -r e350771c23a3 -r 013f81b729de server/test/unittest_rql2sql.py --- a/server/test/unittest_rql2sql.py Mon Feb 07 18:19:40 2011 +0100 +++ b/server/test/unittest_rql2sql.py Tue Feb 08 12:23:30 2011 +0100 @@ -180,6 +180,10 @@ FROM cw_Personne AS _X WHERE _X.cw_prenom=lulu AND NOT (EXISTS(SELECT 1 FROM owned_by_relation AS rel_owned_by0, in_group_relation AS rel_in_group1, cw_CWGroup AS _G WHERE rel_owned_by0.eid_from=_X.cw_eid AND rel_in_group1.eid_from=rel_owned_by0.eid_to AND rel_in_group1.eid_to=_G.cw_eid AND ((_G.cw_name=lulufanclub) OR (_G.cw_name=managers))))'''), + ('Any X WHERE X title V, NOT X wikiid V, NOT X title "parent", X is Card', + '''SELECT _X.cw_eid +FROM cw_Card AS _X +WHERE NOT (_X.cw_wikiid=_X.cw_title) AND NOT (_X.cw_title=parent)''') ] diff -r e350771c23a3 -r 013f81b729de web/data/cubicweb.ajax.box.js --- a/web/data/cubicweb.ajax.box.js Mon Feb 07 18:19:40 2011 +0100 +++ b/web/data/cubicweb.ajax.box.js Tue Feb 08 12:23:30 2011 +0100 @@ -16,7 +16,7 @@ var d = loadRemote('json', ajaxFuncArgs(fname, null, eid, value)); d.addCallback(function() { $('#' + holderid).empty(); - var formparams = ajaxFuncArgs('render', null, 'boxes', boxid, eid); + var formparams = ajaxFuncArgs('render', null, 'ctxcomponents', boxid, eid); $('#' + cw.utils.domid(boxid) + eid).loadxhtml('json', formparams); if (msg) { document.location.hash = '#header'; @@ -28,7 +28,7 @@ function ajaxBoxRemoveLinkedEntity(boxid, eid, relatedeid, delfname, msg) { var d = loadRemote('json', ajaxFuncArgs(delfname, null, eid, relatedeid)); d.addCallback(function() { - var formparams = ajaxFuncArgs('render', null, 'boxes', boxid, eid); + var formparams = ajaxFuncArgs('render', null, 'ctxcomponents', boxid, eid); $('#' + cw.utils.domid(boxid) + eid).loadxhtml('json', formparams); if (msg) { document.location.hash = '#header'; diff -r e350771c23a3 -r 013f81b729de web/data/cubicweb.ajax.js --- a/web/data/cubicweb.ajax.js Mon Feb 07 18:19:40 2011 +0100 +++ b/web/data/cubicweb.ajax.js Tue Feb 08 12:23:30 2011 +0100 @@ -419,7 +419,7 @@ var d = loadRemote('json', ajaxFuncArgs('delete_bookmark', null, beid)); d.addCallback(function(boxcontent) { $('#bookmarks_box').loadxhtml('json', - ajaxFuncArgs('render', null, 'boxes', + ajaxFuncArgs('render', null, 'ctxcomponents', 'bookmarks_box')); document.location.hash = '#header'; updateMessage(_("bookmark has been removed")); @@ -633,7 +633,7 @@ reloadBox = cw.utils.deprecatedFunction( '[3.9] reloadBox() is deprecated, use loadxhtml instead', function(boxid, rql) { - return reloadComponent(boxid, rql, 'boxes', boxid); + return reloadComponent(boxid, rql, 'ctxcomponents', boxid); } );