--- 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'))
--- 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
--- 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
--- 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')
--- 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)
--- 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
--- 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'
--- 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):
--- 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'<h2>%s</h2>' % 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'<div class="tb">%s: %s</div>' % (exclass, html_escape(ex).replace("\n","<br />")))
+ if exclass is None:
+ self.w(u'<div class="tb">%s</div>'
+ % html_escape(ex).replace("\n","<br />"))
+ else:
+ self.w(u'<div class="tb">%s: %s</div>'
+ % (exclass, html_escape(ex).replace("\n","<br />")))
self.w(u'<hr />')
self.w(u'<div class="tb">%s</div>' % html_traceback(excinfo, ex, ''))
else:
--- 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'<tr><th colspan="4">%s</th></tr>\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'<tr><th colspan="4">%s</th></tr>\n' % self.req._('system entities'))
self.entity_types_table(eschema for eschema in schema.entities()