# HG changeset patch # User Julien Cristau # Date 1417428790 -3600 # Node ID ab956b780d4e1721b8a9d767cf6a9d00e893eab2 # Parent 1b0cb3c6c95edb03fc0c5c8f474bbfe0e3efaeeb# Parent c53062c49d5309776236a5d69179adc531f54381 merge 3.19.6 into 3.20 branch diff -r 1b0cb3c6c95e -r ab956b780d4e .hgtags --- a/.hgtags Wed Jul 30 22:26:18 2014 +0200 +++ b/.hgtags Mon Dec 01 11:13:10 2014 +0100 @@ -276,8 +276,8 @@ ee860c51f56bd65c4f6ea363462c02700d1dab5a cubicweb-debian-version-3.16.3-1 ee860c51f56bd65c4f6ea363462c02700d1dab5a cubicweb-centos-version-3.16.3-1 041804bc48e91e440a5b573ceb0df5bf22863b80 cubicweb-version-3.16.4 +041804bc48e91e440a5b573ceb0df5bf22863b80 cubicweb-centos-version-3.16.4-1 041804bc48e91e440a5b573ceb0df5bf22863b80 cubicweb-debian-version-3.16.4-1 -041804bc48e91e440a5b573ceb0df5bf22863b80 cubicweb-centos-version-3.16.4-1 810a05fba1a46ab893b6cadac109097a047f8355 cubicweb-version-3.16.5 810a05fba1a46ab893b6cadac109097a047f8355 cubicweb-debiann-version-3.16.5-1 810a05fba1a46ab893b6cadac109097a047f8355 cubicweb-centos-version-3.16.5-1 @@ -297,38 +297,38 @@ 32b4d5314fd90fe050c931886190f9a372686148 cubicweb-debian-version-3.17.3-1 32b4d5314fd90fe050c931886190f9a372686148 cubicweb-centos-version-3.17.3-1 c7ba8e5d2e45e3d1289c1403df40d7dcb5e62acb cubicweb-version-3.17.4 +c7ba8e5d2e45e3d1289c1403df40d7dcb5e62acb cubicweb-centos-version-3.17.4-1 c7ba8e5d2e45e3d1289c1403df40d7dcb5e62acb cubicweb-debian-version-3.17.4-1 -c7ba8e5d2e45e3d1289c1403df40d7dcb5e62acb cubicweb-centos-version-3.17.4-1 +15dd5b37998b8ef5e8fab1ea0491e6bd8e9f3355 cubicweb-version-3.17.5 15dd5b37998b8ef5e8fab1ea0491e6bd8e9f3355 cubicweb-centos-version-3.17.5-1 -15dd5b37998b8ef5e8fab1ea0491e6bd8e9f3355 cubicweb-version-3.17.5 15dd5b37998b8ef5e8fab1ea0491e6bd8e9f3355 cubicweb-debian-version-3.17.5-1 +5b9fedf67a2912a80fe315a477df9e3ab104c734 cubicweb-version-3.17.6 5b9fedf67a2912a80fe315a477df9e3ab104c734 cubicweb-centos-version-3.17.6-1 -5b9fedf67a2912a80fe315a477df9e3ab104c734 cubicweb-version-3.17.6 5b9fedf67a2912a80fe315a477df9e3ab104c734 cubicweb-debian-version-3.17.6-1 +483181543899a762d068cfdc3ae751b54adc3f14 cubicweb-version-3.17.7 483181543899a762d068cfdc3ae751b54adc3f14 cubicweb-centos-version-3.17.7-1 -483181543899a762d068cfdc3ae751b54adc3f14 cubicweb-version-3.17.7 483181543899a762d068cfdc3ae751b54adc3f14 cubicweb-debian-version-3.17.7-1 -909eb8b584c437b3d2580beff1325c3d5b5dcfb5 cubicweb-centos-version-3.17.8-1 909eb8b584c437b3d2580beff1325c3d5b5dcfb5 cubicweb-version-3.17.8 909eb8b584c437b3d2580beff1325c3d5b5dcfb5 cubicweb-debian-version-3.17.8-1 +909eb8b584c437b3d2580beff1325c3d5b5dcfb5 cubicweb-centos-version-3.17.8-1 5668d210e49c910180ff27712b6ae9ce8286e06c cubicweb-version-3.17.9 5668d210e49c910180ff27712b6ae9ce8286e06c cubicweb-debian-version-3.17.9-1 -fe0e1863a13772836f40f743cc6fe4865f288ed3 cubicweb-centos-version-3.17.10-1 fe0e1863a13772836f40f743cc6fe4865f288ed3 cubicweb-version-3.17.10 fe0e1863a13772836f40f743cc6fe4865f288ed3 cubicweb-debian-version-3.17.10-1 +fe0e1863a13772836f40f743cc6fe4865f288ed3 cubicweb-centos-version-3.17.10-1 +7f67db7c848ec20152daf489d9e11f0fc8402e9b cubicweb-version-3.17.11 7f67db7c848ec20152daf489d9e11f0fc8402e9b cubicweb-centos-version-3.17.11-1 -7f67db7c848ec20152daf489d9e11f0fc8402e9b cubicweb-version-3.17.11 7f67db7c848ec20152daf489d9e11f0fc8402e9b cubicweb-debian-version-3.17.11-1 b02e2912cad5d80395e488c55b548495e8320198 cubicweb-debian-version-3.17.11-2 838d58a30f7efc6a8f83ac27ae8de7d79b84b2bb cubicweb-version-3.17.12 +838d58a30f7efc6a8f83ac27ae8de7d79b84b2bb cubicweb-centos-version-3.17.12-1 838d58a30f7efc6a8f83ac27ae8de7d79b84b2bb cubicweb-debian-version-3.17.12-1 -838d58a30f7efc6a8f83ac27ae8de7d79b84b2bb cubicweb-centos-version-3.17.12-1 09b4ebb9b0f179009491410c07cd013a60258fc6 cubicweb-version-3.17.13 +09b4ebb9b0f179009491410c07cd013a60258fc6 cubicweb-centos-version-3.17.13-1 09b4ebb9b0f179009491410c07cd013a60258fc6 cubicweb-debian-version-3.17.13-1 -09b4ebb9b0f179009491410c07cd013a60258fc6 cubicweb-centos-version-3.17.13-1 -fa00fc251d57f61e619d9c905502745fae21c58c cubicweb-centos-version-3.17.14-1 fa00fc251d57f61e619d9c905502745fae21c58c cubicweb-version-3.17.14 fa00fc251d57f61e619d9c905502745fae21c58c cubicweb-debian-version-3.17.14-1 +fa00fc251d57f61e619d9c905502745fae21c58c cubicweb-centos-version-3.17.14-1 ee413076752b3e606801ef55e48f7e7ccd1f7238 cubicweb-version-3.17.15 ee413076752b3e606801ef55e48f7e7ccd1f7238 cubicweb-debian-version-3.17.15-1 ee413076752b3e606801ef55e48f7e7ccd1f7238 cubicweb-centos-version-3.17.15-1 @@ -338,15 +338,18 @@ 57e9d1c70512d0f4e2c33d33db436a8274e10c1a cubicweb-version-3.17.17 57e9d1c70512d0f4e2c33d33db436a8274e10c1a cubicweb-debian-version-3.17.17-1 57e9d1c70512d0f4e2c33d33db436a8274e10c1a cubicweb-centos-version-3.17.17-1 +cda4b066933f216abe185786f5458176894bdaf0 cubicweb-version-3.17.18 +cda4b066933f216abe185786f5458176894bdaf0 cubicweb-centos-version-3.17.18-1 +cda4b066933f216abe185786f5458176894bdaf0 cubicweb-debian-version-3.17.18-1 db37bf35a1474843ded0a537f9cb4838f4a78cda cubicweb-version-3.18.0 db37bf35a1474843ded0a537f9cb4838f4a78cda cubicweb-debian-version-3.18.0-1 db37bf35a1474843ded0a537f9cb4838f4a78cda cubicweb-centos-version-3.18.0-1 60322cb8636c0402cdac025d3297626c41583023 cubicweb-version-3.18.1 +60322cb8636c0402cdac025d3297626c41583023 cubicweb-centos-version-3.18.1-1 60322cb8636c0402cdac025d3297626c41583023 cubicweb-debian-version-3.18.1-1 -60322cb8636c0402cdac025d3297626c41583023 cubicweb-centos-version-3.18.1-1 6880674c1a2669e3635abd688755116dda72e65e cubicweb-version-3.18.2 +6880674c1a2669e3635abd688755116dda72e65e cubicweb-centos-version-3.18.2-1 6880674c1a2669e3635abd688755116dda72e65e cubicweb-debian-version-3.18.2-1 -6880674c1a2669e3635abd688755116dda72e65e cubicweb-centos-version-3.18.2-1 afd21fea201a745051357b7aa6be3c7da1ae5bd2 cubicweb-version-3.18.3 afd21fea201a745051357b7aa6be3c7da1ae5bd2 cubicweb-debian-version-3.18.3-1 afd21fea201a745051357b7aa6be3c7da1ae5bd2 cubicweb-centos-version-3.18.3-1 @@ -354,11 +357,14 @@ 0176da9bc75293e200de4f7b934c5d4c7c805199 cubicweb-debian-version-3.18.4-1 0176da9bc75293e200de4f7b934c5d4c7c805199 cubicweb-centos-version-3.18.4-1 5071b69b6b0b0de937bb231404cbf652a103dbe0 cubicweb-version-3.18.5 +5071b69b6b0b0de937bb231404cbf652a103dbe0 cubicweb-centos-version-3.18.5-1 5071b69b6b0b0de937bb231404cbf652a103dbe0 cubicweb-debian-version-3.18.5-1 -5071b69b6b0b0de937bb231404cbf652a103dbe0 cubicweb-centos-version-3.18.5-1 d915013567429b481cb2c367071e36451c07a226 cubicweb-version-3.18.6 +d915013567429b481cb2c367071e36451c07a226 cubicweb-centos-version-3.18.6-1 d915013567429b481cb2c367071e36451c07a226 cubicweb-debian-version-3.18.6-1 -d915013567429b481cb2c367071e36451c07a226 cubicweb-centos-version-3.18.6-1 +cb96f4403cf2837b595992ceb0dfef2070d55e70 cubicweb-version-3.18.7 +cb96f4403cf2837b595992ceb0dfef2070d55e70 cubicweb-debian-version-3.18.7-1 +cb96f4403cf2837b595992ceb0dfef2070d55e70 cubicweb-centos-version-3.18.7-1 1141927b8494aabd16e31b0d0d9a50fe1fed5f2f cubicweb-version-3.19.0 1141927b8494aabd16e31b0d0d9a50fe1fed5f2f cubicweb-debian-version-3.19.0-1 1141927b8494aabd16e31b0d0d9a50fe1fed5f2f cubicweb-centos-version-3.19.0-1 @@ -377,3 +383,6 @@ 3ac86df519af2a1194cb3fc882d30d0e1bf44e3b cubicweb-version-3.19.5 3ac86df519af2a1194cb3fc882d30d0e1bf44e3b cubicweb-debian-version-3.19.5-1 3ac86df519af2a1194cb3fc882d30d0e1bf44e3b cubicweb-centos-version-3.19.5-1 +934341b848a6874688314d7c154183aca3aed530 cubicweb-version-3.19.6 +934341b848a6874688314d7c154183aca3aed530 cubicweb-debian-version-3.19.6-1 +934341b848a6874688314d7c154183aca3aed530 cubicweb-centos-version-3.19.6-1 diff -r 1b0cb3c6c95e -r ab956b780d4e __pkginfo__.py --- a/__pkginfo__.py Wed Jul 30 22:26:18 2014 +0200 +++ b/__pkginfo__.py Mon Dec 01 11:13:10 2014 +0100 @@ -22,7 +22,7 @@ modname = distname = "cubicweb" -numversion = (3, 19, 5) +numversion = (3, 19, 6) version = '.'.join(str(num) for num in numversion) description = "a repository of entities / relations for knowledge management" diff -r 1b0cb3c6c95e -r ab956b780d4e cubicweb.spec --- a/cubicweb.spec Wed Jul 30 22:26:18 2014 +0200 +++ b/cubicweb.spec Mon Dec 01 11:13:10 2014 +0100 @@ -7,7 +7,7 @@ %endif Name: cubicweb -Version: 3.19.5 +Version: 3.19.6 Release: logilab.1%{?dist} Summary: CubicWeb is a semantic web application framework Source0: http://download.logilab.org/pub/cubicweb/cubicweb-%{version}.tar.gz diff -r 1b0cb3c6c95e -r ab956b780d4e debian/changelog --- a/debian/changelog Wed Jul 30 22:26:18 2014 +0200 +++ b/debian/changelog Mon Dec 01 11:13:10 2014 +0100 @@ -1,3 +1,9 @@ +cubicweb (3.19.6-1) unstable; urgency=low + + * new upstream release + + -- David Douard Wed, 26 Nov 2014 16:22:39 +0100 + cubicweb (3.19.5-1) unstable; urgency=low * new upstream release @@ -34,6 +40,12 @@ -- Julien Cristau Mon, 28 Apr 2014 18:35:27 +0200 +cubicweb (3.18.7-1) unstable; urgency=low + + * new upstream release + + -- Aurelien Campeas Tue, 25 Nov 2014 12:14:36 +0100 + cubicweb (3.18.6-1) unstable; urgency=low * new upstream release @@ -76,6 +88,12 @@ -- Julien Cristau Fri, 10 Jan 2014 17:14:18 +0100 +cubicweb (3.17.18-1) unstable; urgency=low + + * new upstream release + + -- Aurelien Campeas Mon, 24 Nov 2014 17:41:24 +0100 + cubicweb (3.17.17-1) unstable; urgency=low * new upstream release diff -r 1b0cb3c6c95e -r ab956b780d4e devtools/__init__.py --- a/devtools/__init__.py Wed Jul 30 22:26:18 2014 +0200 +++ b/devtools/__init__.py Mon Dec 01 11:13:10 2014 +0100 @@ -292,6 +292,7 @@ class TestDataBaseHandler(object): DRIVER = None + db_cache = {} explored_glob = set() @@ -535,6 +536,10 @@ class PostgresTestDataBaseHandler(TestDataBaseHandler): DRIVER = 'postgres' + # Separate db_cache for PG databases, to avoid collisions with sqlite dbs + db_cache = {} + explored_glob = set() + __CTL = set() @classmethod @@ -560,8 +565,12 @@ env = os.environ.copy() env['PGPORT'] = str(port) env['PGHOST'] = str(directory) + options = '-h "" -k %s -p %s' % (directory, port) + options += ' -c fsync=off -c full_page_writes=off' + options += ' -c synchronous_commit=off' try: - subprocess.check_call(['pg_ctl', 'start', '-w', '-D', datadir, '-o', '-h "" -k %s -p %s' % (directory, port)], + subprocess.check_call(['pg_ctl', 'start', '-w', '-D', datadir, + '-o', options], env=env) except OSError, err: if err.errno == errno.ENOENT: @@ -670,12 +679,14 @@ backup_name = self._backup_name(db_id) self._drop(backup_name) self.system_source['db-name'] = backup_name - # during postgres database initialization, there is no repo set here. - assert self._repo is None - #self._repo.turn_repo_off() - createdb(self.helper, self.system_source, self.dbcnx, self.cursor, template=orig_name) - self.dbcnx.commit() - #self._repo.turn_repo_on() + if self._repo: + self._repo.turn_repo_off() + try: + createdb(self.helper, self.system_source, self.dbcnx, self.cursor, template=orig_name) + self.dbcnx.commit() + finally: + if self._repo: + self._repo.turn_repo_on() return backup_name finally: self.system_source['db-name'] = orig_name diff -r 1b0cb3c6c95e -r ab956b780d4e devtools/test/unittest_httptest.py --- a/devtools/test/unittest_httptest.py Wed Jul 30 22:26:18 2014 +0200 +++ b/devtools/test/unittest_httptest.py Mon Dec 01 11:13:10 2014 +0100 @@ -41,7 +41,7 @@ class TwistedCWIdentTC(CubicWebServerTC): - + test_db_id = 'httptest-cwident' anonymous_allowed = False tags = CubicWebServerTC.tags | Tags(('auth',)) diff -r 1b0cb3c6c95e -r ab956b780d4e devtools/test/unittest_webtest.py --- a/devtools/test/unittest_webtest.py Wed Jul 30 22:26:18 2014 +0200 +++ b/devtools/test/unittest_webtest.py Mon Dec 01 11:13:10 2014 +0100 @@ -15,6 +15,7 @@ class CWTIdentTC(CubicWebTestTC): + test_db_id = 'webtest-ident' anonymous_allowed = False tags = CubicWebTestTC.tags | Tags(('auth',)) diff -r 1b0cb3c6c95e -r ab956b780d4e hooks/syncschema.py --- a/hooks/syncschema.py Wed Jul 30 22:26:18 2014 +0200 +++ b/hooks/syncschema.py Mon Dec 01 11:13:10 2014 +0100 @@ -476,7 +476,7 @@ cnx.system_sql(str('ALTER TABLE %s ADD %s %s' % (table, column, attrtype)), rollback_on_failure=False) - self.info('added column %s to table %s', table, column) + self.info('added column %s to table %s', column, table) except Exception as ex: # the column probably already exists. this occurs when # the entity's type has just been added or if the column diff -r 1b0cb3c6c95e -r ab956b780d4e migration.py --- a/migration.py Wed Jul 30 22:26:18 2014 +0200 +++ b/migration.py Mon Dec 01 11:13:10 2014 +0100 @@ -525,7 +525,7 @@ self.errors.append( ('add', cube, version, source) ) elif versions: lower_strict = version_strictly_lower(self.cubes[cube], version) - if oper in ('>=','='): + if oper in ('>=','=','=='): if lower_strict: self.errors.append( ('update', cube, version, source) ) elif oper is None: diff -r 1b0cb3c6c95e -r ab956b780d4e misc/migration/3.18.0_Any.py --- a/misc/migration/3.18.0_Any.py Wed Jul 30 22:26:18 2014 +0200 +++ b/misc/migration/3.18.0_Any.py Mon Dec 01 11:13:10 2014 +0100 @@ -133,17 +133,19 @@ # recreate the constraints, hook will lead to low-level recreation for eschema in sorted(schema.entities()): if eschema._unique_together: + print 'recreate unique indexes for', eschema rql_args = schemaserial.uniquetogether2rqls(eschema) for rql, args in rql_args: args['x'] = eschema.eid session.execute(rql, args) - commit() - +commit() # all attributes perms have to be refreshed ... -for rschema in schema.relations(): +for rschema in sorted(schema.relations()): if rschema.final: if rschema.type in fsschema: - sync_schema_props_perms(rschema.type, syncprops=False, ask_confirm=False) + print 'sync perms for', rschema.type + sync_schema_props_perms(rschema.type, syncprops=False, ask_confirm=False, commit=False) else: print 'WARNING: attribute %s missing from fs schema' % rschema.type +commit() diff -r 1b0cb3c6c95e -r ab956b780d4e misc/migration/bootstrapmigration_repository.py --- a/misc/migration/bootstrapmigration_repository.py Wed Jul 30 22:26:18 2014 +0200 +++ b/misc/migration/bootstrapmigration_repository.py Mon Dec 01 11:13:10 2014 +0100 @@ -50,8 +50,14 @@ session.commit() if applcubicwebversion < (3, 19, 0) and cubicwebversion >= (3, 19, 0): - sql('ALTER TABLE "entities" DROP COLUMN "mtime"') - sql('ALTER TABLE "entities" DROP COLUMN "source"') + try: + # need explicit drop of the indexes on some database systems (sqlserver) + sql(repo.system_source.dbhelper.sql_drop_index('entities', 'mtime')) + sql('ALTER TABLE "entities" DROP COLUMN "mtime"') + sql('ALTER TABLE "entities" DROP COLUMN "source"') + except: # programming error, already migrated + print "Failed to drop mtime or source database columns" + print "'entities' table of the database has probably been already updated" commit() diff -r 1b0cb3c6c95e -r ab956b780d4e server/__init__.py --- a/server/__init__.py Wed Jul 30 22:26:18 2014 +0200 +++ b/server/__init__.py Mon Dec 01 11:13:10 2014 +0100 @@ -31,6 +31,8 @@ from logilab.common.modutils import LazyObject from logilab.common.textutils import splitstrip from logilab.common.registry import yes +from logilab import database + from yams import BASE_GROUPS from cubicweb import CW_SOFTWARE_ROOT diff -r 1b0cb3c6c95e -r ab956b780d4e server/schemaserial.py --- a/server/schemaserial.py Wed Jul 30 22:26:18 2014 +0200 +++ b/server/schemaserial.py Mon Dec 01 11:13:10 2014 +0100 @@ -454,7 +454,14 @@ def uniquetogether2rqls(eschema): rql_args = [] + # robustness against duplicated CWUniqueTogetherConstraint (pre 3.18) + columnset = set() for columns in eschema._unique_together: + if columns in columnset: + print ('schemaserial: skipping duplicate unique together %r %r' % + (eschema.type, columns)) + continue + columnset.add(columns) rql, args = _uniquetogether2rql(eschema, columns) args['name'] = y2sql.unique_index_name(eschema, columns) rql_args.append((rql, args)) diff -r 1b0cb3c6c95e -r ab956b780d4e server/session.py --- a/server/session.py Wed Jul 30 22:26:18 2014 +0200 +++ b/server/session.py Mon Dec 01 11:13:10 2014 +0100 @@ -1074,8 +1074,13 @@ cstate = self.commit_state if cstate == 'uncommitable': raise QueryError('transaction must be rolled back') - if cstate is not None: + if cstate == 'precommit': + self.warn('calling commit in precommit makes no sense; ignoring commit') return + if cstate == 'postcommit': + self.critical('postcommit phase is not allowed to write to the db; ignoring commit') + return + assert cstate is None # on rollback, an operation should have the following state # information: # - processed by the precommit/commit event or not diff -r 1b0cb3c6c95e -r ab956b780d4e server/sources/native.py --- a/server/sources/native.py Wed Jul 30 22:26:18 2014 +0200 +++ b/server/sources/native.py Mon Dec 01 11:13:10 2014 +0100 @@ -1505,11 +1505,12 @@ args['pwd'] = Binary(crypt_password(password, pwd.getvalue())) # get eid from login and (crypted) password rset = self.source.syntax_tree_search(cnx, self._auth_rqlst, args) + pwd = args['pwd'] try: user = rset[0][0] # If the stored hash uses a deprecated scheme (e.g. DES or MD5 used # before 3.14.7), update with a fresh one - if pwd.getvalue(): + if pwd is not None and pwd.getvalue(): verify, newhash = verify_and_update(password, pwd.getvalue()) if not verify: # should not happen, but... raise AuthenticationError('bad password') @@ -1564,6 +1565,8 @@ Tables are saved in chunks in different files in order to prevent a too high memory consumption. """ + blocksize = 100 + def __init__(self, source): """ :param: source an instance of the system source @@ -1647,10 +1650,7 @@ sql = 'SELECT * FROM %s' % table columns, rows_iterator = self._get_cols_and_rows(sql) self.logger.info('number of rows: %d', rowcount) - if table.startswith('cw_'): # entities - blocksize = 2000 - else: # relations and metadata - blocksize = 10000 + blocksize = self.blocksize if rowcount > 0: for i, start in enumerate(xrange(0, rowcount, blocksize)): rows = list(itertools.islice(rows_iterator, blocksize)) diff -r 1b0cb3c6c95e -r ab956b780d4e sobjects/services.py --- a/sobjects/services.py Wed Jul 30 22:26:18 2014 +0200 +++ b/sobjects/services.py Mon Dec 01 11:13:10 2014 +0100 @@ -30,7 +30,7 @@ """ __regid__ = 'repo_stats' - __select__ = match_user_groups('managers') + __select__ = match_user_groups('managers', 'users') def call(self): repo = self._cw.repo # Service are repo side only. diff -r 1b0cb3c6c95e -r ab956b780d4e web/data/cubicweb.ajax.js --- a/web/data/cubicweb.ajax.js Wed Jul 30 22:26:18 2014 +0200 +++ b/web/data/cubicweb.ajax.js Mon Dec 01 11:13:10 2014 +0100 @@ -431,13 +431,21 @@ } //============= higher level AJAX functions using remote calls ===============// + +var _i18ncache = {}; + /** * .. function:: _(message) * * emulation of gettext's _ shortcut */ function _(message) { - return loadRemote(AJAX_BASE_URL, ajaxFuncArgs('i18n', null, [message]), 'GET', true)[0]; + var form; + if (!(message in _i18ncache)) { + form = ajaxFuncArgs('i18n', null, [message]); + _i18ncache[message] = loadRemote(AJAX_BASE_URL, form, 'GET', true)[0]; + } + return _i18ncache[message]; } /** diff -r 1b0cb3c6c95e -r ab956b780d4e web/data/cubicweb.css --- a/web/data/cubicweb.css Wed Jul 30 22:26:18 2014 +0200 +++ b/web/data/cubicweb.css Mon Dec 01 11:13:10 2014 +0100 @@ -52,6 +52,11 @@ background: %(pageBgColor)s; } +/* more specific selectors to override jQueryUI's braindamaged CSS rules */ +#pageContent .ui-tabs-panel a, +#pageContent .ui-tabs-panel a:active, +#pageContent .ui-tabs-panel a:visited, +#pageContent .ui-tabs-panel a:link, a, a:active, a:visited, a:link { color: %(aColor)s; text-decoration: none; diff -r 1b0cb3c6c95e -r ab956b780d4e web/data/cubicweb.facets.js --- a/web/data/cubicweb.facets.js Wed Jul 30 22:26:18 2014 +0200 +++ b/web/data/cubicweb.facets.js Mon Dec 01 11:13:10 2014 +0100 @@ -35,7 +35,7 @@ }); // pick up hidden inputs (required metadata inputs such as 'facets' // but also RangeWidgets) - $form.find('input:hidden').each(function() { + $form.find('input[type="hidden"]').each(function() { names.push(this.name); values.push(this.value); }); diff -r 1b0cb3c6c95e -r ab956b780d4e web/data/cubicweb.old.css --- a/web/data/cubicweb.old.css Wed Jul 30 22:26:18 2014 +0200 +++ b/web/data/cubicweb.old.css Mon Dec 01 11:13:10 2014 +0100 @@ -55,6 +55,11 @@ font-size:105%; } +/* more specific selectors to override jQueryUI's braindamaged CSS rules */ +#pageContent .ui-tabs-panel a, +#pageContent .ui-tabs-panel a:active, +#pageContent .ui-tabs-panel a:visited, +#pageContent .ui-tabs-panel a:link, a, a:active, a:visited, a:link { color: %(aColor)s; text-decoration: none; diff -r 1b0cb3c6c95e -r ab956b780d4e web/data/cubicweb.preferences.js --- a/web/data/cubicweb.preferences.js Wed Jul 30 22:26:18 2014 +0200 +++ b/web/data/cubicweb.preferences.js Mon Dec 01 11:13:10 2014 +0100 @@ -25,7 +25,7 @@ function _toggleFieldset(fieldsetid, closeaction, linklabel, linkhref) { jQuery('#' + fieldsetid).find('div.openlink').each(function() { var link = A({ - 'href': "javascript:noop();", + 'href': "javascript:$.noop();", 'onclick': linkhref }, linklabel); diff -r 1b0cb3c6c95e -r ab956b780d4e web/data/cubicweb.widgets.js --- a/web/data/cubicweb.widgets.js Wed Jul 30 22:26:18 2014 +0200 +++ b/web/data/cubicweb.widgets.js Mon Dec 01 11:13:10 2014 +0100 @@ -355,7 +355,7 @@ Widgets.SuggestForm = defclass("SuggestForm", null, { __init__: function(inputid, initfunc, varargs, validatefunc, options) { - this.validatefunc = validatefunc || noop; + this.validatefunc = validatefunc || $.noop; this.sgfield = new Widgets.BaseSuggestField(inputid, initfunc, varargs, options); this.oklabel = options.oklabel || 'ok'; this.cancellabel = options.cancellabel || 'cancel'; @@ -369,11 +369,11 @@ 'class': "sgformbuttons" }, [A({ - 'href': "javascript: noop();", + 'href': "javascript: $.noop();", 'onclick': this.onValidateClicked }, this.oklabel), ' / ', A({ - 'href': "javascript: noop();", + 'href': "javascript: $.noop();", 'onclick': this.destroy }, escapeHTML(this.cancellabel))]); diff -r 1b0cb3c6c95e -r ab956b780d4e web/facet.py --- a/web/facet.py Wed Jul 30 22:26:18 2014 +0200 +++ b/web/facet.py Mon Dec 01 11:13:10 2014 +0100 @@ -1620,7 +1620,10 @@ cssclass += ' hideFacetBody' w(u'
%s
\n' % (cssclass, xml_escape(self.facet.__regid__), title)) - w(u'
\n') + cssclass = 'facetBody' + if not self.facet.start_unfolded: + cssclass += ' hidden' + w(u'
\n' % cssclass) w(u'\n' % ( xml_escape(self.facet.__regid__), self.value or u'')) w(u'
\n') diff -r 1b0cb3c6c95e -r ab956b780d4e web/test/unittest_http_headers.py --- a/web/test/unittest_http_headers.py Wed Jul 30 22:26:18 2014 +0200 +++ b/web/test/unittest_http_headers.py Mon Dec 01 11:13:10 2014 +0100 @@ -12,3 +12,7 @@ with self.assertRaises(ValueError): http_headers.generateTrueFalse('any value') + +if __name__ == '__main__': + from unittest import main + main() diff -r 1b0cb3c6c95e -r ab956b780d4e web/test/unittest_viewselector.py --- a/web/test/unittest_viewselector.py Wed Jul 30 22:26:18 2014 +0200 +++ b/web/test/unittest_viewselector.py Mon Dec 01 11:13:10 2014 +0100 @@ -218,7 +218,6 @@ rset = req.execute('Any N, X WHERE X in_group Y, Y name N') self.assertListEqual(self.pviews(req, rset), [('csvexport', csvexport.CSVRsetView), - ('ecsvexport', csvexport.CSVEntityView), ('jsonexport', json.JsonRsetView), ('rsetxml', xmlrss.XMLRsetView), ('table', tableview.RsetTableView), diff -r 1b0cb3c6c95e -r ab956b780d4e web/test/unittest_webconfig.py --- a/web/test/unittest_webconfig.py Wed Jul 30 22:26:18 2014 +0200 +++ b/web/test/unittest_webconfig.py Mon Dec 01 11:13:10 2014 +0100 @@ -25,7 +25,9 @@ class WebconfigTC(TestCase): def setUp(self): - self.config = ApptestConfiguration('data') + # need explicit None if dirname(__file__) is empty, see + # ApptestConfiguration.__init__ + self.config = ApptestConfiguration('data', apphome=os.path.dirname(__file__) or None) self.config._cubes = ['file'] self.config.load_configuration() @@ -42,7 +44,11 @@ rname = self.config.uiprops['FILE_ICON'].replace(self.config.datadir_url, '') self.assertIn('file', self.config.locate_resource(rname)[0].split(os.sep)) cubicwebcsspath = self.config.locate_resource('cubicweb.css')[0].split(os.sep) - self.assertTrue('web' in cubicwebcsspath or 'shared' in cubicwebcsspath) # 'shared' if tests under apycot + + # 'shared' if tests under apycot + self.assertTrue('web' in cubicwebcsspath or 'shared' in cubicwebcsspath, + 'neither "web" nor "shared" found in cubicwebcsspath (%s)' + % cubicwebcsspath) def test_sign_text(self): signature = self.config.sign_text(u'hôp') diff -r 1b0cb3c6c95e -r ab956b780d4e web/uihelper.py --- a/web/uihelper.py Wed Jul 30 22:26:18 2014 +0200 +++ b/web/uihelper.py Mon Dec 01 11:13:10 2014 +0100 @@ -76,12 +76,9 @@ def __init__(cls, name, bases, classdict): if cls.etype is None: return - if cls.uicfg_afs is None: - uicfg_afs = uicfg.autoform_section - if cls.uicfg_aff is None: - uicfg_aff = uicfg.autoform_field - if cls.uicfg_affk is None: - uicfg_affk = uicfg.autoform_field_kwargs + uicfg_afs = cls.uicfg_afs or uicfg.autoform_section + uicfg_aff = cls.uicfg_aff or uicfg.autoform_field + uicfg_affk = cls.uicfg_affk or uicfg.autoform_field_kwargs for attr_role in cls.hidden: uicfg_afs.hide_field(cls.etype, attr_role, formtype=cls.formtype) for attr_role in cls.rels_as_attrs: diff -r 1b0cb3c6c95e -r ab956b780d4e web/views/csvexport.py --- a/web/views/csvexport.py Wed Jul 30 22:26:18 2014 +0200 +++ b/web/views/csvexport.py Mon Dec 01 11:13:10 2014 +0100 @@ -21,7 +21,7 @@ _ = unicode from cubicweb.schema import display_name -from cubicweb.predicates import any_rset +from cubicweb.predicates import any_rset, empty_rset from cubicweb.uilib import UnicodeCSVWriter from cubicweb.view import EntityView, AnyRsetView @@ -80,7 +80,7 @@ contents) """ __regid__ = 'ecsvexport' - __select__ = any_rset() + __select__ = EntityView.__select__ | empty_rset() title = _('csv export (entities)') def call(self): diff -r 1b0cb3c6c95e -r ab956b780d4e web/views/cwuser.py --- a/web/views/cwuser.py Wed Jul 30 22:26:18 2014 +0200 +++ b/web/views/cwuser.py Mon Dec 01 11:13:10 2014 +0100 @@ -160,7 +160,8 @@ def entity_call(self, entity, **kwargs): entity.complete() self.w(u'%s' % ( - entity.absolute_url(), entity.name, entity.printable_value('name'))) + entity.absolute_url(), xml_escape(entity.name), + entity.printable_value('name'))) # user / groups management views ############################################### diff -r 1b0cb3c6c95e -r ab956b780d4e web/views/urlpublishing.py --- a/web/views/urlpublishing.py Wed Jul 30 22:26:18 2014 +0200 +++ b/web/views/urlpublishing.py Mon Dec 01 11:13:10 2014 +0100 @@ -209,7 +209,10 @@ if rset.rowcount == 1: req.form.setdefault('vid', 'primary') else: # rset.rowcount >= 1 - req.form.setdefault('vid', 'sameetypelist') + if len(rset.column_types(0)) > 1: + req.form.setdefault('vid', 'list') + else: + req.form.setdefault('vid', 'sameetypelist') def handle_etype(self, req, cls): rset = req.execute(cls.fetch_rql(req.user)) diff -r 1b0cb3c6c95e -r ab956b780d4e web/webctl.py --- a/web/webctl.py Wed Jul 30 22:26:18 2014 +0200 +++ b/web/webctl.py Mon Dec 01 11:13:10 2014 +0100 @@ -68,7 +68,8 @@ dest = osp.join(config.appdatahome, 'data') if osp.exists(dest): if (not ask_clean or - not ASK.confirm('Remove existing data directory %s?' % dest)): + not (config.verbosity and + ASK.confirm('Remove existing data directory %s?' % dest))): raise ExecutionError('Directory %s already exists. ' 'Remove it first.' % dest) rmtree(dest)