# HG changeset patch # User Sylvain Thenault # Date 1228497261 -3600 # Node ID a57548916045b411e593f686d85882e5dfce6613 # Parent 8bcebdb5f55d78611a4fa32726fad5e3b9d9a5dc# Parent a4a9e1a7e40f07a2131a64e82c3aae1f6eb71002 merge diff -r a4a9e1a7e40f -r a57548916045 cwconfig.py --- a/cwconfig.py Fri Dec 05 11:51:03 2008 +0100 +++ b/cwconfig.py Fri Dec 05 18:14:21 2008 +0100 @@ -12,6 +12,7 @@ from os.path import exists, join, expanduser, abspath, basename from logilab.common.decorators import cached +from logilab.common.logging_ext import set_log_methods, init_log from logilab.common.configuration import (Configuration, Method, ConfigurationMixIn, merge_options) @@ -443,49 +444,12 @@ def init_log(self, logthreshold=None, debug=False, logfile=None, syslog=False): """init the log service""" - if os.environ.get('APYCOT_ROOT'): - logthreshold = logging.CRITICAL - # redirect logs to stdout to avoid apycot output parsing failure - handler = logging.StreamHandler(sys.stdout) - else: + if logthreshold is None: if debug: - if logthreshold is None: - logthreshold = logging.DEBUG # LLDEBUG - handler = logging.StreamHandler() - elif logfile is None: - if syslog: - from logging import handlers - handler = handlers.SysLogHandler() - else: - handler = logging.StreamHandler() + logthreshold = 'DEBUG' else: - try: - handler = logging.FileHandler(logfile) - except IOError: - handler = logging.StreamHandler() - if logthreshold is None: - thresholdname = self['log-threshold'] - logthreshold = getattr(logging, THRESHOLD_MAP.get(thresholdname, - thresholdname)) - # configure the root logger - logger = logging.getLogger() - logger.setLevel(logthreshold) - # only addHandler and removeHandler method while I would like a - # setHandler method, so do it this way :$ - logger.handlers = [handler] - isatty = hasattr(sys.__stdout__, 'isatty') and sys.__stdout__.isatty() - if debug and isatty: - from logilab.common.logging_ext import ColorFormatter - fmt = ColorFormatter(self.log_format, '%Y-%m-%d %H:%M:%S') - def col_fact(record): - if 'XXX' in record.message: - return 'cyan' - if 'kick' in record.message: - return 'red' - fmt.colorfilters.append(col_fact) - else: - fmt = logging.Formatter(self.log_format, '%Y-%m-%d %H:%M:%S') - logger.handlers[0].setFormatter(fmt) + logthreshold = self['log-threshold'] + init_log(debug, syslog, logthreshold, logfile, self.log_format) # configure simpleTal logger logging.getLogger('simpleTAL').setLevel(logging.ERROR) @@ -839,18 +803,8 @@ sourcedirs.append(self.i18n_lib_dir()) return i18n.compile_i18n_catalogs(sourcedirs, i18ndir, langs) +set_log_methods(CubicWebConfiguration, logging.getLogger('cubicweb.configuration')) # alias to get a configuration instance from an application id application_configuration = CubicWebConfiguration.config_for -# map logilab.common.logger thresholds to logging thresholds -THRESHOLD_MAP = {'LOG_DEBUG': 'DEBUG', - 'LOG_INFO': 'INFO', - 'LOG_NOTICE': 'INFO', - 'LOG_WARN': 'WARNING', - 'LOG_ERR': 'ERROR', - 'LOG_CRIT': 'CRITICAL', - } - -from cubicweb import set_log_methods -set_log_methods(CubicWebConfiguration, logging.getLogger('cubicweb.configuration')) diff -r a4a9e1a7e40f -r a57548916045 cwvreg.py --- a/cwvreg.py Fri Dec 05 11:51:03 2008 +0100 +++ b/cwvreg.py Fri Dec 05 18:14:21 2008 +0100 @@ -27,9 +27,10 @@ class CubicWebRegistry(VRegistry): """extend the generic VRegistry with some cubicweb specific stuff""" - def __init__(self, config, debug=None): - # first init log service - config.init_log(debug=debug) + def __init__(self, config, debug=None, initlog=True): + if initlog: + # first init log service + config.init_log(debug=debug) super(CubicWebRegistry, self).__init__(config) self.schema = None self.reset() @@ -342,6 +343,7 @@ return RQLHelper(self.schema, special_relations={'eid': 'uid', 'has_text': 'fti'}) + class MulCnxCubicWebRegistry(CubicWebRegistry): """special registry to be used when an application has to deal with connections to differents repository. This class add some additional wrapper diff -r a4a9e1a7e40f -r a57548916045 dbapi.py --- a/dbapi.py Fri Dec 05 11:51:03 2008 +0100 +++ b/dbapi.py Fri Dec 05 18:14:21 2008 +0100 @@ -45,20 +45,20 @@ from Pyro import core, naming, config as pyroconfig from Pyro.errors import NamingError, ProtocolError core.initClient(banner=0) - pyroconfig.PYRO_NS_DEFAULTGROUP = ':' + config['pyro-ns-group'] + nsid = ':%s.%s' % (config['pyro-ns-group'], database) locator = naming.NameServerLocator() # resolve the Pyro object try: nshost, nsport = config['pyro-ns-host'], config['pyro-ns-port'] - uri = locator.getNS(nshost, nsport).resolve(database) + uri = locator.getNS(nshost, nsport) .resolve(nsid) except ProtocolError: raise ConnectionError('Could not connect to the Pyro name server ' '(host: %s:%i)' % (nshost, nsport)) - except NamingError: + except NamingError, ex: raise ConnectionError('Could not get repository for %s ' - '(not registered in Pyro),' + '(not registered in Pyro), ' 'you may have to restart your server-side ' - 'application' % database) + 'application' % nsid) return core.getProxyForURI(uri) def repo_connect(repo, user, password, cnxprops=None): @@ -74,7 +74,8 @@ return cnx def connect(database=None, user=None, password=None, host=None, - group=None, cnxprops=None, port=None, setvreg=True, mulcnx=True): + group=None, cnxprops=None, port=None, setvreg=True, mulcnx=True, + initlog=True): """Constructor for creating a connection to the CubicWeb repository. Returns a Connection object. @@ -97,9 +98,9 @@ vreg = repo.vreg elif setvreg: if mulcnx: - vreg = MulCnxCubicWebRegistry(config) + vreg = MulCnxCubicWebRegistry(config, initlog=initlog) else: - vreg = CubicWebRegistry(config) + vreg = CubicWebRegistry(config, initlog=initlog) vreg.set_schema(repo.get_schema()) else: vreg = None diff -r a4a9e1a7e40f -r a57548916045 misc/migration/2.99.0_Any.py --- a/misc/migration/2.99.0_Any.py Fri Dec 05 11:51:03 2008 +0100 +++ b/misc/migration/2.99.0_Any.py Fri Dec 05 18:14:21 2008 +0100 @@ -1,11 +1,12 @@ from cubicweb import CW_MIGRATION_MAP for pk, in rql('Any K WHERE X is EProperty, X pkey IN (%s), X pkey K' - % ','.join("'system.version.%s'" % cube for cube in CW_MIGRATION_MAP)): + % ','.join("'system.version.%s'" % cube for cube in CW_MIGRATION_MAP), + ask_confirm=False): cube = pk.split('.')[-1] newk = pk.replace(cube, CW_MIGRATION_MAP[cube]) rql('SET X pkey %(newk)s WHERE X pkey %(oldk)s', - {'oldk': pk, 'newk': newk}) + {'oldk': pk, 'newk': newk}, ask_confirm=False) print 'renamed', pk, 'to', newk add_entity_type('ECache') diff -r a4a9e1a7e40f -r a57548916045 vregistry.py --- a/vregistry.py Fri Dec 05 11:51:03 2008 +0100 +++ b/vregistry.py Fri Dec 05 18:14:21 2008 +0100 @@ -334,14 +334,24 @@ raise NoSelectableObject if not object apply """ - score, winner = 0, None + score, winners = 0, [] for vobject in vobjects: vobjectscore = vobject.__select__(*args, **kwargs) if vobjectscore > score: - score, winner = vobjectscore, vobject - if winner is None: + score, winners = vobjectscore, [vobject] + elif vobjectscore > 0 and vobjectscore == score: + winners.append(vobject) + if not winners: raise NoSelectableObject('args: %s\nkwargs: %s %s' % (args, kwargs.keys(), [repr(v) for v in vobjects])) + if len(winners) > 1: + if self.config.mode == 'installed': + self.error('select ambiguity, args: %s\nkwargs: %s %s', + args, kwargs.keys(), [repr(v) for v in winners]) + else: + raise Exception('select ambiguity, args: %s\nkwargs: %s %s' + % (args, kwargs.keys(), [repr(v) for v in winners])) + winner = winners[0] # return the result of the .selected method of the vobject return winner.selected(*args, **kwargs) diff -r a4a9e1a7e40f -r a57548916045 web/application.py --- a/web/application.py Fri Dec 05 11:51:03 2008 +0100 +++ b/web/application.py Fri Dec 05 18:14:21 2008 +0100 @@ -31,9 +31,9 @@ def __init__(self): self.session_time = self.vreg.config['http-session-time'] or None assert self.session_time is None or self.session_time > 0 - self.cleanup_session_time = self.vreg.config['cleanup-session-time'] or 120 + self.cleanup_session_time = self.vreg.config['cleanup-session-time'] or 43200 assert self.cleanup_session_time > 0 - self.cleanup_anon_session_time = self.vreg.config['cleanup-anonymous-session-time'] or 720 + self.cleanup_anon_session_time = self.vreg.config['cleanup-anonymous-session-time'] or 120 assert self.cleanup_anon_session_time > 0 if self.session_time: assert self.cleanup_session_time < self.session_time diff -r a4a9e1a7e40f -r a57548916045 web/box.py --- a/web/box.py Fri Dec 05 11:51:03 2008 +0100 +++ b/web/box.py Fri Dec 05 18:14:21 2008 +0100 @@ -14,8 +14,9 @@ extresources_registerer, etype_rtype_priority_registerer) from cubicweb.common.selectors import (etype_rtype_selector, onelinerset_selector, - accept_selector, accept_rtype_selector, - primaryview_selector, contextprop_selector) + accept_selector, accept_rtype_selector, + primaryview_selector, contextprop_selector, + _rqlcondition_selector) from cubicweb.common.view import Template from cubicweb.common.appobject import ReloadableMixIn @@ -151,7 +152,8 @@ __registerer__ = accepts_registerer __selectors__ = (onelinerset_selector, primaryview_selector, contextprop_selector, etype_rtype_selector, - accept_rtype_selector, accept_selector) + accept_rtype_selector, accept_selector, + _rqlcondition_selector) accepts = ('Any',) context = 'incontext' diff -r a4a9e1a7e40f -r a57548916045 web/views/baseviews.py --- a/web/views/baseviews.py Fri Dec 05 11:51:03 2008 +0100 +++ b/web/views/baseviews.py Fri Dec 05 18:14:21 2008 +0100 @@ -200,8 +200,7 @@ def summary(self, entity): """default implementation return an empty string""" - return u'' - + return u'' def render_entity_attributes(self, entity, siderelations): for rschema, targetschema in self.iter_attributes(entity): diff -r a4a9e1a7e40f -r a57548916045 web/views/management.py --- a/web/views/management.py Fri Dec 05 11:51:03 2008 +0100 +++ b/web/views/management.py Fri Dec 05 18:14:21 2008 +0100 @@ -199,11 +199,17 @@ self.w(u'

%s

' % title) if 'errmsg' in req.data: ex = req.data['errmsg'] + exclass = None else: + exclass = ex.__class__.__name__ ex = exc_message(ex, req.encoding) if excinfo is not None and self.config['print-traceback']: - exclass = ex.__class__.__name__ - self.w(u'
%s: %s
' % (exclass, html_escape(ex).replace("\n","
"))) + if exclass is None: + self.w(u'
%s
' + % html_escape(ex).replace("\n","
")) + else: + self.w(u'
%s: %s
' + % (exclass, html_escape(ex).replace("\n","
"))) self.w(u'
') self.w(u'
%s
' % html_traceback(excinfo, ex, '')) else: diff -r a4a9e1a7e40f -r a57548916045 web/views/startup.py --- a/web/views/startup.py Fri Dec 05 11:51:03 2008 +0100 +++ b/web/views/startup.py Fri Dec 05 18:14:21 2008 +0100 @@ -85,7 +85,7 @@ if manager: self.w(u'%s\n' % self.req._('application entities')) self.entity_types_table(eschema for eschema in schema.entities() - if not eschema.meta and not eschema.is_subobject()) + if not eschema.meta and not eschema.is_subobject(strict=True)) if manager: self.w(u'%s\n' % self.req._('system entities')) self.entity_types_table(eschema for eschema in schema.entities()