# HG changeset patch # User Nicolas Chauvat # Date 1250447248 -7200 # Node ID e8581a4f1bae3fe955b8dfc761e9b8f7ba333e88 # Parent 1d9be3dffa94c1178a34c62862c1185971a3befd# Parent 4c804711548da391990ebf8634416e732a04f847 backport stable branch diff -r 1d9be3dffa94 -r e8581a4f1bae .hgtags --- a/.hgtags Fri Aug 14 15:53:12 2009 +0200 +++ b/.hgtags Sun Aug 16 20:27:28 2009 +0200 @@ -54,3 +54,5 @@ 82fe8a6d077b34e972664c8e2bace3ae30c94b9d cubicweb-debian-version-3.3.5-1 cfcc7f6121d6c6b53a1ef9bc96c3b7c82f33d169 cubicweb-version-3.4.2 e6a8cd8cc910507e5f928ddba6de3cf5e5bdf3d4 cubicweb-debian-version-3.4.2-1 +b2add17d5bc437a807976cd13870f92d3a94f2a6 cubicweb-version-3.4.3 +a3828745e2cf0c4bf1cab6f5397c524ba0510df6 cubicweb-debian-version-3.4.3-1 diff -r 1d9be3dffa94 -r e8581a4f1bae _exceptions.py --- a/_exceptions.py Fri Aug 14 15:53:12 2009 +0200 +++ b/_exceptions.py Sun Aug 16 20:27:28 2009 +0200 @@ -79,8 +79,6 @@ msg = 'You are not allowed to perform this operation' msg1 = 'You are not allowed to perform %s operation on %s' var = None - #def __init__(self, *args): - # self.args = args def __str__(self): try: @@ -118,9 +116,6 @@ this may be a programming/typo or a misconfiguration error """ -# class ViewNotFound(ObjectNotFound): -# """raised when an unregistered view is called""" - class NoSelectableObject(RegistryException): """some views with the given vid have been found but no one is applyable to the result set @@ -149,4 +144,3 @@ # pylint: disable-msg=W0611 from logilab.common.clcommands import BadCommandUsage - diff -r 1d9be3dffa94 -r e8581a4f1bae debian/changelog --- a/debian/changelog Fri Aug 14 15:53:12 2009 +0200 +++ b/debian/changelog Sun Aug 16 20:27:28 2009 +0200 @@ -1,3 +1,9 @@ +cubicweb (3.4.3-1) unstable; urgency=low + + * new upstream release + + -- Nicolas Chauvat Fri, 14 Aug 2009 17:54:06 +0200 + cubicweb (3.4.2-1) unstable; urgency=low * new upstream release @@ -132,37 +138,37 @@ -- Sylvain Thénault Tue, 27 Jan 2009 16:05:12 +0100 -cubicweb (3.0.3-1) DISTRIBUTION; urgency=low +cubicweb (3.0.3-1) unstable; urgency=low * new upstream release -- Aurélien Campéas Wed, 14 Jan 2009 18:25:21 +0100 -cubicweb (3.0.2-1) DISTRIBUTION; urgency=low +cubicweb (3.0.2-1) unstable; urgency=low * new upstream release -- Sylvain Thénault Wed, 14 Jan 2009 13:25:21 +0100 -cubicweb (3.0.1-1) DISTRIBUTION; urgency=low +cubicweb (3.0.1-1) unstable; urgency=low * new upstream release -- Sylvain Thénault Thu, 08 Jan 2009 18:27:37 +0100 -cubicweb (3.0.0-1) DISTRIBUTION; urgency=low +cubicweb (3.0.0-1) unstable; urgency=low * new upstream release -- Adrien Di Mascio Tue, 23 Dec 2008 18:42:43 +0100 -cubicweb (2.99.99-1) DISTRIBUTION; urgency=low +cubicweb (2.99.99-1) unstable; urgency=low * new upstream release -- Sylvain Thénault Mon, 22 Dec 2008 17:34:45 +0100 -cubicweb (2.99.7-1) DISTRIBUTION; urgency=low +cubicweb (2.99.7-1) unstable; urgency=low * remove buggy cubicweb-common.postinst * replace erudi|ginco by cubicweb where necessary in existing instance @@ -170,43 +176,43 @@ -- Sylvain Thénault Fri, 19 Dec 2008 17:11:00 +0100 -cubicweb (2.99.6-1) DISTRIBUTION; urgency=low +cubicweb (2.99.6-1) unstable; urgency=low * new upstream release -- Sylvain Thénault Fri, 19 Dec 2008 15:16:37 +0100 -cubicweb (2.99.5-1) DISTRIBUTION; urgency=low +cubicweb (2.99.5-1) unstable; urgency=low * new upstream release -- Sylvain Thénault Wed, 17 Dec 2008 14:14:26 +0100 -cubicweb (2.99.4-1) DISTRIBUTION; urgency=low +cubicweb (2.99.4-1) unstable; urgency=low * new upstream release -- Adrien Di Mascio Fri, 12 Dec 2008 10:00:31 +0100 -cubicweb (2.99.3-1) DISTRIBUTION; urgency=low +cubicweb (2.99.3-1) unstable; urgency=low * new upstream release -- Adrien Di Mascio Tue, 09 Dec 2008 07:42:16 +0100 -cubicweb (2.99.2-1) DISTRIBUTION; urgency=low +cubicweb (2.99.2-1) unstable; urgency=low * new upstream release -- Adrien Di Mascio Mon, 17 Nov 2008 15:02:16 +0100 -cubicweb (2.99.1-1) DISTRIBUTION; urgency=low +cubicweb (2.99.1-1) unstable; urgency=low * new upstream release -- Nicolas Chauvat Thu, 13 Nov 2008 11:02:16 +0100 -cubicweb (2.99.0-1) DISTRIBUTION; urgency=low +cubicweb (2.99.0-1) unstable; urgency=low * initial public release diff -r 1d9be3dffa94 -r e8581a4f1bae goa/testlib.py --- a/goa/testlib.py Fri Aug 14 15:53:12 2009 +0200 +++ b/goa/testlib.py Sun Aug 16 20:27:28 2009 +0200 @@ -6,7 +6,11 @@ """ __docformat__ = "restructuredtext en" -from logilab.common.testlib import TestCase +from logilab.common.testlib import TestCase, TestSkipped +try: + import google.appengine +except ImportError: + raise TestSkipped('Can not import google.appengine. Skip this module') import os, os.path as osp import time @@ -18,34 +22,17 @@ rqlannotation.SQLGenAnnotator = goarqlannotation.SQLGenAnnotator rqlannotation.set_qdata = goarqlannotation.set_qdata -try: - from google.appengine.api import apiproxy_stub_map - from google.appengine.api import datastore_file_stub - from google.appengine.ext import db as gdb - from cubicweb.goa import db, do_monkey_patch - import_appengine_failed = None -except ImportError, exc: - # XXX necessary ? - class db: - class Model: - pass - class DummyProperty: - def __init__(self, *args, **kwargs): - pass - TextProperty = DummyProperty - StringProperty = DummyProperty - BlobProperty = DummyProperty - DateProperty = DummyProperty - ReferenceProperty = DummyProperty - SelfReferenceProperty = DummyProperty - import_appengine_failed = 'cannot import appengine: %s' % exc - +from google.appengine.api import apiproxy_stub_map +from google.appengine.api import datastore_file_stub +from google.appengine.ext import db as gdb from cubicweb.devtools.fake import FakeRequest -from cubicweb.goa.goavreg import GAEVregistry + +from cubicweb.goa import db, do_monkey_patch +from cubicweb.goa.goavreg import GAEVRegistry from cubicweb.goa.goaconfig import GAEConfiguration from cubicweb.goa.dbinit import (create_user, create_groups, fix_entities, - init_persistent_schema, insert_versions) + init_persistent_schema, insert_versions) import logging logger = logging.getLogger() @@ -82,8 +69,6 @@ apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3', stub) def setUp(self): - if import_appengine_failed: - self.skip(import_appengine_failed) # Ensure we're in UTC. os.environ['TZ'] = 'UTC' time.tzset() diff -r 1d9be3dffa94 -r e8581a4f1bae misc/migration/3.4.3_Any.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/migration/3.4.3_Any.py Sun Aug 16 20:27:28 2009 +0200 @@ -0,0 +1,2 @@ +# sync and restart to make sure cwuri does not appear in forms +sync_schema_props_perms() diff -r 1d9be3dffa94 -r e8581a4f1bae server/migractions.py --- a/server/migractions.py Fri Aug 14 15:53:12 2009 +0200 +++ b/server/migractions.py Sun Aug 16 20:27:28 2009 +0200 @@ -169,16 +169,15 @@ bkup = tarfile.open(backupfile, 'r|gz') tmpdir = tempfile.mkdtemp() bkup.extractall(path=tmpdir) - if systemonly: - repo.system_source.restore(osp.join(tmpdir,'system'), drop=drop) - else: - for source in repo.sources: - try: - source.restore(osp.join(tmpdir, source.uri), drop=drop) - except Exception, exc: - print '-> error trying to restore [%s]' % exc - if not self.confirm('Continue anyway?', default='n'): - raise SystemExit(1) + for source in repo.sources: + if systemonly and source.uri != 'system': + continue + try: + source.restore(osp.join(tmpdir, source.uri), drop=drop) + except Exception, exc: + print '-> error trying to restore [%s]' % exc + if not self.confirm('Continue anyway?', default='n'): + raise SystemExit(1) bkup.close() shutil.rmtree(tmpdir) # call hooks diff -r 1d9be3dffa94 -r e8581a4f1bae server/repository.py diff -r 1d9be3dffa94 -r e8581a4f1bae server/serverctl.py --- a/server/serverctl.py Fri Aug 14 15:53:12 2009 +0200 +++ b/server/serverctl.py Sun Aug 16 20:27:28 2009 +0200 @@ -529,21 +529,20 @@ status = instance_status(config, eversion, dbversions) # * database version > installed software if status == 'needsoftupgrade': - print "database is using some earlier version than installed software!" - print "please upgrade your software and then upgrade the instance" - print "using command 'cubicweb-ctl upgrade %s'" % config.appid + print "** The database of %s is more recent than the installed software!" % config.appid + print "** Upgrade your software, then migrate the database by running the command" + print "** 'cubicweb-ctl upgrade %s'" % config.appid return # * database version < installed software, an upgrade will be necessary # anyway, just rewrite vc.conf and warn user he has to upgrade - if status == 'needapplupgrade': - print "database is using some older version than installed software." - print "You'll have to upgrade the instance using command" - print "'cubicweb-ctl upgrade %s'" % config.appid + elif status == 'needapplupgrade': + print "** The database of %s is older than the installed software." % config.appid + print "** Migrate the database by running the command" + print "** 'cubicweb-ctl upgrade %s'" % config.appid return # * database version = installed software, database version = instance fs version # ok! - def instance_status(config, cubicwebapplversion, vcconf): cubicwebversion = config.cubicweb_version() if cubicwebapplversion > cubicwebversion: diff -r 1d9be3dffa94 -r e8581a4f1bae server/test/unittest_extlite.py --- a/server/test/unittest_extlite.py Fri Aug 14 15:53:12 2009 +0200 +++ b/server/test/unittest_extlite.py Sun Aug 16 20:27:28 2009 +0200 @@ -5,7 +5,15 @@ class SQLiteTC(TestCase): sqlite_file = '_extlite_test.sqlite' + + def _cleanup(self): + try: + os.remove(self.sqlite_file) + except: + pass + def setUp(self): + self._cleanup() cnx1 = get_connection('sqlite', database=self.sqlite_file) cu = cnx1.cursor() cu.execute('CREATE TABLE toto(name integer);') @@ -13,10 +21,7 @@ cnx1.close() def tearDown(self): - try: - os.remove(self.sqlite_file) - except: - pass + self._cleanup() def test(self): lock = threading.Lock() diff -r 1d9be3dffa94 -r e8581a4f1bae web/application.py --- a/web/application.py Fri Aug 14 15:53:12 2009 +0200 +++ b/web/application.py Sun Aug 16 20:27:28 2009 +0200 @@ -41,10 +41,6 @@ if self.session_time: assert self.cleanup_session_time < self.session_time assert self.cleanup_anon_session_time < self.session_time - self.set_authmanager() - CW_EVENT_MANAGER.bind('after-registry-reload', self.set_authmanager) - - def set_authmanager(self): self.authmanager = self.vreg['components'].select('authmanager') def clean_sessions(self): diff -r 1d9be3dffa94 -r e8581a4f1bae web/data/cubicweb.edition.js --- a/web/data/cubicweb.edition.js Fri Aug 14 15:53:12 2009 +0200 +++ b/web/data/cubicweb.edition.js Sun Aug 16 20:27:28 2009 +0200 @@ -243,21 +243,22 @@ * @param ttype : the target (inlined) entity type * @param rtype : the relation type between both entities */ -function addInlineCreationForm(peid, ttype, rtype, role) { +function addInlineCreationForm(peid, ttype, rtype, role, insertBefore) { + insertBefore = insertBefore || getNode('add' + rtype + ':' + peid + 'link').parentNode; var d = asyncRemoteExec('inline_creation_form', peid, ttype, rtype, role); d.addCallback(function (response) { - var linknode = getNode('add' + rtype + ':' + peid + 'link'); var dom = getDomFromResponse(response); - var form = jQuery(dom); - form.css('display', 'none'); - form.insertBefore(linknode.parentNode).slideDown('fast'); - updateInlinedEntitiesCounters(rtype); - reorderTabindex(); - form.trigger('inlinedform-added'); + preprocessAjaxLoad(null, dom); + var form = jQuery(dom); + form.css('display', 'none'); + form.insertBefore(insertBefore).slideDown('fast'); + updateInlinedEntitiesCounters(rtype); + reorderTabindex(); + form.trigger('inlinedform-added'); postAjaxLoad(dom); }); d.addErrback(function (xxx) { - log('xxx =', xxx); + log('xxx =', xxx); }); } diff -r 1d9be3dffa94 -r e8581a4f1bae web/views/ajaxedit.py --- a/web/views/ajaxedit.py Fri Aug 14 15:53:12 2009 +0200 +++ b/web/views/ajaxedit.py Sun Aug 16 20:27:28 2009 +0200 @@ -40,14 +40,12 @@ etypes = rschema.subjects(entity.e_schema) if len(etypes) == 1: self.etype = etypes[0] - fakebox = [] self.w(u'
' % self.id) self.w(u'

%s

' % self.req._('relation %(relname)s of %(ent)s') % {'relname': rschema.display_name(self.req, role(self)), 'ent': entity.view('incontext')}) self.w(u'
    ') - self.w_unrelated(fakebox, entity) - for boxitem in fakebox: + for boxitem in self.unrelated_boxitems(entity): boxitem.render(self.w) self.w(u'
') diff -r 1d9be3dffa94 -r e8581a4f1bae web/views/basecontrollers.py --- a/web/views/basecontrollers.py Fri Aug 14 15:53:12 2009 +0200 +++ b/web/views/basecontrollers.py Sun Aug 16 20:27:28 2009 +0200 @@ -298,6 +298,31 @@ return None return None + def _call_view(self, view, **kwargs): + req = self.req + divid = req.form.get('divid', 'pageContent') + # we need to call pagination before with the stream set + stream = view.set_stream() + if req.form.get('paginate'): + if divid == 'pageContent': + # mimick main template behaviour + stream.write(u'
') + vtitle = self.req.form.get('vtitle') + if vtitle: + stream.write(u'

%s

\n' % vtitle) + view.pagination(req, self.rset, view.w, not view.need_navigation) + if divid == 'pageContent': + stream.write(u'
') + view.render(**kwargs) + extresources = req.html_headers.getvalue(skiphead=True) + if extresources: + stream.write(u'
\n') # XXX use a widget ? + stream.write(extresources) + stream.write(u'
\n') + if req.form.get('paginate') and divid == 'pageContent': + stream.write(u'
') + return stream.getvalue() + @xhtmlize def js_view(self): # XXX try to use the page-content template @@ -313,28 +338,7 @@ except NoSelectableObject: vid = req.form.get('fallbackvid', 'noresult') view = self.vreg['views'].select(vid, req, rset=rset) - divid = req.form.get('divid', 'pageContent') - # we need to call pagination before with the stream set - stream = view.set_stream() - if req.form.get('paginate'): - if divid == 'pageContent': - # mimick main template behaviour - stream.write(u'
') - vtitle = self.req.form.get('vtitle') - if vtitle: - stream.write(u'

%s

\n' % vtitle) - view.pagination(req, rset, view.w, not view.need_navigation) - if divid == 'pageContent': - stream.write(u'
') - view.render() - extresources = req.html_headers.getvalue(skiphead=True) - if extresources: - stream.write(u'
\n') # XXX use a widget ? - stream.write(extresources) - stream.write(u'
\n') - if req.form.get('paginate') and divid == 'pageContent': - stream.write(u'
') - return stream.getvalue() + return self._call_view(view) @xhtmlize def js_prop_widget(self, propkey, varname, tabindex=None): @@ -370,7 +374,8 @@ view = self.vreg['views'].select('inline-creation', self.req, etype=ttype, peid=peid, rtype=rtype, role=role) - return view.render(etype=ttype, peid=peid, rtype=rtype, role=role) + return self._call_view(view, etype=ttype, peid=peid, + rtype=rtype, role=role) @jsonize def js_validate_form(self, action, names, values):