merge
authorSylvain Thenault <sylvain.thenault@logilab.fr>
Fri, 05 Dec 2008 18:14:21 +0100
changeset 181 a57548916045
parent 180 8bcebdb5f55d (diff)
parent 173 a4a9e1a7e40f (current diff)
child 182 45a810beed18
merge
--- 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()