backport stable
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 06 May 2011 08:52:09 +0200
changeset 7322 108c87e0538c
parent 7314 d3104c697adb (diff)
parent 7321 0a1c405384d0 (current diff)
child 7323 53f38d39287f
backport stable
--- a/cwvreg.py	Fri May 06 08:48:26 2011 +0200
+++ b/cwvreg.py	Fri May 06 08:52:09 2011 +0200
@@ -412,10 +412,8 @@
                      if not isinstance(view, class_deprecated)]
             try:
                 view = self._select_best(views, req, rset=rset, **kwargs)
-                if view.linkable():
+                if view is not None and view.linkable():
                     yield view
-            except NoSelectableObject:
-                continue
             except Exception:
                 self.exception('error while trying to select %s view for %s',
                                vid, rset)
--- a/devtools/__init__.py	Fri May 06 08:48:26 2011 +0200
+++ b/devtools/__init__.py	Fri May 06 08:52:09 2011 +0200
@@ -28,15 +28,17 @@
 import pickle
 import glob
 import warnings
+import hashlib
 from datetime import timedelta
 from os.path import (abspath, join, exists, basename, dirname, normpath, split,
                      isfile, isabs, splitext, isdir, expanduser)
 from functools import partial
-import hashlib
 
 from logilab.common.date import strptime
 from logilab.common.decorators import cached, clear_cache
-from cubicweb import CW_SOFTWARE_ROOT, ConfigurationError, schema, cwconfig, BadConnectionId
+
+from cubicweb import ConfigurationError, ExecutionError, BadConnectionId
+from cubicweb import CW_SOFTWARE_ROOT, schema, cwconfig
 from cubicweb.server.serverconfig import ServerConfiguration
 from cubicweb.etwist.twconfig import TwistedConfiguration
 
@@ -197,7 +199,10 @@
         directory from wich tests are launched or by specifying an alternative
         sources file using self.sourcefile.
         """
-        sources = super(TestServerConfiguration, self).sources()
+        try:
+            sources = super(TestServerConfiguration, self).sources()
+        except ExecutionError:
+            sources = {}
         if not sources:
             sources = DEFAULT_SOURCES
         if 'admin' not in sources:
--- a/devtools/testlib.py	Fri May 06 08:48:26 2011 +0200
+++ b/devtools/testlib.py	Fri May 06 08:52:09 2011 +0200
@@ -561,6 +561,8 @@
             if views:
                 try:
                     view = viewsvreg._select_best(views, req, rset=rset)
+                    if view is None:
+                        raise NoSelectableObject((req,), {'rset':rset}, views)
                     if view.linkable():
                         yield view
                     else:
--- a/entities/test/unittest_wfobjs.py	Fri May 06 08:48:26 2011 +0200
+++ b/entities/test/unittest_wfobjs.py	Fri May 06 08:52:09 2011 +0200
@@ -165,7 +165,7 @@
         user = self.user()
         iworkflowable = user.cw_adapt_to('IWorkflowable')
         iworkflowable.fire_transition('deactivate', comment=u'deactivate user')
-        user.clear_all_caches()
+        user.cw_clear_all_caches()
         self.assertEqual(iworkflowable.state, 'deactivated')
         self._test_manager_deactivate(user)
         trinfo = self._test_manager_deactivate(user)
@@ -192,7 +192,7 @@
         self.commit()
         iworkflowable.fire_transition('wake up')
         self.commit()
-        user.clear_all_caches()
+        user.cw_clear_all_caches()
         self.assertEqual(iworkflowable.state, 'deactivated')
 
     # XXX test managers can change state without matching transition
@@ -274,14 +274,14 @@
         self.assertEqual(iworkflowable.subworkflow_input_transition(), None)
         iworkflowable.fire_transition('swftr1', u'go')
         self.commit()
-        group.clear_all_caches()
+        group.cw_clear_all_caches()
         self.assertEqual(iworkflowable.current_state.eid, swfstate1.eid)
         self.assertEqual(iworkflowable.current_workflow.eid, swf.eid)
         self.assertEqual(iworkflowable.main_workflow.eid, mwf.eid)
         self.assertEqual(iworkflowable.subworkflow_input_transition().eid, swftr1.eid)
         iworkflowable.fire_transition('tr1', u'go')
         self.commit()
-        group.clear_all_caches()
+        group.cw_clear_all_caches()
         self.assertEqual(iworkflowable.current_state.eid, state2.eid)
         self.assertEqual(iworkflowable.current_workflow.eid, mwf.eid)
         self.assertEqual(iworkflowable.main_workflow.eid, mwf.eid)
@@ -295,10 +295,10 @@
         # force back to state1
         iworkflowable.change_state('state1', u'gadget')
         iworkflowable.fire_transition('swftr1', u'au')
-        group.clear_all_caches()
+        group.cw_clear_all_caches()
         iworkflowable.fire_transition('tr2', u'chapeau')
         self.commit()
-        group.clear_all_caches()
+        group.cw_clear_all_caches()
         self.assertEqual(iworkflowable.current_state.eid, state3.eid)
         self.assertEqual(iworkflowable.current_workflow.eid, mwf.eid)
         self.assertEqual(iworkflowable.main_workflow.eid, mwf.eid)
@@ -390,7 +390,7 @@
                                  ):
             iworkflowable.fire_transition(trans)
             self.commit()
-            group.clear_all_caches()
+            group.cw_clear_all_caches()
             self.assertEqual(iworkflowable.state, nextstate)
 
 
@@ -408,11 +408,11 @@
         wf.add_state('asleep', initial=True)
         self.execute('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
                      {'wf': wf.eid, 'x': self.member.eid})
-        self.member.clear_all_caches()
+        self.member.cw_clear_all_caches()
         iworkflowable = self.member.cw_adapt_to('IWorkflowable')
         self.assertEqual(iworkflowable.state, 'activated')# no change before commit
         self.commit()
-        self.member.clear_all_caches()
+        self.member.cw_clear_all_caches()
         self.assertEqual(iworkflowable.current_workflow.eid, wf.eid)
         self.assertEqual(iworkflowable.state, 'asleep')
         self.assertEqual(iworkflowable.workflow_history, ())
@@ -429,7 +429,7 @@
         self.execute('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
                      {'wf': wf.eid, 'x': self.member.eid})
         self.commit()
-        self.member.clear_all_caches()
+        self.member.cw_clear_all_caches()
         self.assertEqual(iworkflowable.current_workflow.eid, wf.eid)
         self.assertEqual(iworkflowable.state, 'asleep')
         self.assertEqual(parse_hist(iworkflowable.workflow_history),
@@ -472,10 +472,10 @@
         self.commit()
         self.execute('DELETE X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
                      {'wf': wf.eid, 'x': self.member.eid})
-        self.member.clear_all_caches()
+        self.member.cw_clear_all_caches()
         self.assertEqual(iworkflowable.state, 'asleep')# no change before commit
         self.commit()
-        self.member.clear_all_caches()
+        self.member.cw_clear_all_caches()
         self.assertEqual(iworkflowable.current_workflow.name, "default user workflow")
         self.assertEqual(iworkflowable.state, 'activated')
         self.assertEqual(parse_hist(iworkflowable.workflow_history),
@@ -504,13 +504,13 @@
         self.execute('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
                      {'wf': wf.eid, 'x': user.eid})
         self.commit()
-        user.clear_all_caches()
+        user.cw_clear_all_caches()
         self.assertEqual(iworkflowable.state, 'asleep')
         self.assertEqual([t.name for t in iworkflowable.possible_transitions()],
                           ['rest'])
         iworkflowable.fire_transition('rest')
         self.commit()
-        user.clear_all_caches()
+        user.cw_clear_all_caches()
         self.assertEqual(iworkflowable.state, 'asleep')
         self.assertEqual([t.name for t in iworkflowable.possible_transitions()],
                           ['rest'])
@@ -520,7 +520,7 @@
         self.commit()
         iworkflowable.fire_transition('rest')
         self.commit()
-        user.clear_all_caches()
+        user.cw_clear_all_caches()
         self.assertEqual(iworkflowable.state, 'dead')
         self.assertEqual(parse_hist(iworkflowable.workflow_history),
                           [('asleep', 'asleep', 'rest', None),
--- a/entities/wfobjs.py	Fri May 06 08:48:26 2011 +0200
+++ b/entities/wfobjs.py	Fri May 06 08:52:09 2011 +0200
@@ -326,8 +326,8 @@
             result[ep.subwf_state.eid] = ep.destination and ep.destination.eid
         return result
 
-    def clear_all_caches(self):
-        super(WorkflowTransition, self).clear_all_caches()
+    def cw_clear_all_caches(self):
+        super(WorkflowTransition, self).cw_clear_all_caches()
         clear_cache(self, 'exit_points')
 
 
--- a/entity.py	Fri May 06 08:48:26 2011 +0200
+++ b/entity.py	Fri May 06 08:52:09 2011 +0200
@@ -918,7 +918,7 @@
             assert role
             self._cw_related_cache.pop('%s_%s' % (rtype, role), None)
 
-    def clear_all_caches(self): # XXX cw_clear_all_caches
+    def cw_clear_all_caches(self):
         """flush all caches on this entity. Further attributes/relations access
         will triggers new database queries to get back values.
 
@@ -1000,6 +1000,10 @@
 
     # deprecated stuff #########################################################
 
+    @deprecated('[3.13] use entity.cw_clear_all_caches()')
+    def clear_all_caches(self):
+        return self.cw_clear_all_caches()
+
     @deprecated('[3.9] use entity.cw_attr_value(attr)')
     def get_value(self, name):
         return self.cw_attr_value(name)
--- a/etwist/server.py	Fri May 06 08:48:26 2011 +0200
+++ b/etwist/server.py	Fri May 06 08:52:09 2011 +0200
@@ -17,14 +17,19 @@
 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
 """twisted server for CubicWeb web instances"""
 
+from __future__ import with_statement
+
 __docformat__ = "restructuredtext en"
 
 import sys
 import os
+import os.path as osp
 import select
 import errno
 import traceback
 import threading
+import re
+import hashlib
 from os.path import join
 from time import mktime
 from datetime import date, timedelta
@@ -41,7 +46,8 @@
 
 from logilab.common.decorators import monkeypatch
 
-from cubicweb import AuthenticationError, ConfigurationError, CW_EVENT_MANAGER
+from cubicweb import (AuthenticationError, ConfigurationError,
+                      CW_EVENT_MANAGER, CubicWebException)
 from cubicweb.utils import json_dumps
 from cubicweb.web import Redirect, DirectResponse, StatusResponse, LogOut
 from cubicweb.web.application import CubicWebPublisher
@@ -70,13 +76,70 @@
                             code=http.FORBIDDEN,
                             stream='Access forbidden')
 
-class File(static.File):
-    """Prevent from listing directories"""
+
+class NoListingFile(static.File):
     def directoryListing(self):
         return ForbiddenDirectoryLister()
 
 
-class LongTimeExpiringFile(File):
+class DataLookupDirectory(NoListingFile):
+    def __init__(self, config, path):
+        self.md5_version = config.instance_md5_version()
+        NoListingFile.__init__(self, path)
+        self.config = config
+        self.here = path
+        self._defineChildResources()
+        if self.config.debugmode:
+            self.data_modconcat_basepath = '/data/??'
+        else:
+            self.data_modconcat_basepath = '/data/%s/??' % self.md5_version
+
+    def _defineChildResources(self):
+        self.putChild(self.md5_version, self)
+
+    def getChild(self, path, request):
+        if not path:
+            if request.uri.startswith(self.data_modconcat_basepath):
+                resource_relpath = request.uri[len(self.data_modconcat_basepath):]
+                if resource_relpath:
+                    paths = resource_relpath.split(',')
+                    try:
+                        return ConcatFiles(self.config, paths)
+                    except ConcatFileNotFoundError:
+                        return self.childNotFound
+            return self.directoryListing()
+        childpath = join(self.here, path)
+        dirpath, rid = self.config.locate_resource(childpath)
+        if dirpath is None:
+            # resource not found
+            return self.childNotFound
+        filepath = os.path.join(dirpath, rid)
+        if os.path.isdir(filepath):
+            resource = DataLookupDirectory(self.config, childpath)
+            # cache resource for this segment path to avoid recomputing
+            # directory lookup
+            self.putChild(path, resource)
+            return resource
+        else:
+            return NoListingFile(filepath)
+
+
+class FCKEditorResource(NoListingFile):
+    def __init__(self, config, path):
+        NoListingFile.__init__(self, path)
+        self.config = config
+
+    def getChild(self, path, request):
+        pre_path = request.path.split('/')[1:]
+        if pre_path[0] == 'https':
+            pre_path.pop(0)
+            uiprops = self.config.https_uiprops
+        else:
+            uiprops = self.config.uiprops
+        return static.File(osp.join(uiprops['FCKEDITOR_PATH'], path))
+
+
+class LongTimeExpiringFile(DataLookupDirectory):
     """overrides static.File and sets a far future ``Expires`` date
     on the resouce.
 
@@ -88,28 +151,77 @@
       etc.
 
     """
+    def _defineChildResources(self):
+        pass
+
     def render(self, request):
         # XXX: Don't provide additional resource information to error responses
         #
         # the HTTP RFC recommands not going further than 1 year ahead
         expires = date.today() + timedelta(days=6*30)
         request.setHeader('Expires', generateDateTime(mktime(expires.timetuple())))
-        return File.render(self, request)
+        return DataLookupDirectory.render(self, request)
+
+
+class ConcatFileNotFoundError(CubicWebException):
+    pass
+
+
+class ConcatFiles(LongTimeExpiringFile):
+    def __init__(self, config, paths):
+        _, ext = osp.splitext(paths[0])
+        # create a unique / predictable filename
+        fname = 'cache_concat_' + hashlib.md5(';'.join(paths)).hexdigest() + ext
+        filepath = osp.join(config.appdatahome, 'uicache', fname)
+        LongTimeExpiringFile.__init__(self, config, filepath)
+        self._concat_cached_filepath(filepath, paths)
 
+    def _concat_cached_filepath(self, filepath, paths):
+        if not self._up_to_date(filepath, paths):
+            concat_data = []
+            for path in paths:
+                # FIXME locate_resource is called twice() in debug-mode, but
+                # it's a @cached method
+                dirpath, rid = self.config.locate_resource(path)
+                if rid is None:
+                    raise ConcatFileNotFoundError(path)
+                concat_data.append(open(osp.join(dirpath, rid)).read())
+            with open(filepath, 'wb') as f:
+                f.write('\n'.join(concat_data))
+
+    def _up_to_date(self, filepath, paths):
+        """
+        The concat-file is considered up-to-date if it exists.
+        In debug mode, an additional check is performed to make sure that
+        concat-file is more recent than all concatenated files
+        """
+        if not osp.isfile(filepath):
+            return False
+        if self.config.debugmode:
+            concat_lastmod = os.stat(filepath).st_mtime
+            for path in paths:
+                dirpath, rid = self.config.locate_resource(path)
+                if rid is None:
+                    raise ConcatFileNotFoundError(path)
+                path = osp.join(dirpath, rid)
+                if os.stat(path).st_mtime > concat_lastmod:
+                    return False
+        return True
 
 class CubicWebRootResource(resource.Resource):
     def __init__(self, config, vreg=None):
+        resource.Resource.__init__(self)
         self.config = config
         # instantiate publisher here and not in init_publisher to get some
         # checks done before daemonization (eg versions consistency)
         self.appli = CubicWebPublisher(config, vreg=vreg)
         self.base_url = config['base-url']
         self.https_url = config['https-url']
-        self.children = {}
-        self.static_directories = set(('data%s' % config.instance_md5_version(),
-                                       'data', 'static', 'fckeditor'))
         global MAX_POST_LENGTH
         MAX_POST_LENGTH = config['max-post-length']
+        self.putChild('static', NoListingFile(config.static_directory))
+        self.putChild('fckeditor', FCKEditorResource(self.config, ''))
+        self.putChild('data', DataLookupDirectory(self.config, ''))
 
     def init_publisher(self):
         config = self.config
@@ -152,38 +264,6 @@
 
     def getChild(self, path, request):
         """Indicate which resource to use to process down the URL's path"""
-        pre_path = request.path.split('/')[1:]
-        if pre_path[0] == 'https':
-            pre_path.pop(0)
-            uiprops = self.config.https_uiprops
-        else:
-            uiprops = self.config.uiprops
-        directory = pre_path[0]
-        # Anything in data/, static/, fckeditor/ and the generated versioned
-        # data directory is treated as static files
-        if directory in self.static_directories:
-            # take care fckeditor may appears as root directory or as a data
-            # subdirectory
-            if directory == 'static':
-                return File(self.config.static_directory)
-            if directory == 'fckeditor':
-                return File(uiprops['FCKEDITOR_PATH'])
-            if directory != 'data':
-                # versioned directory, use specific file with http cache
-                # headers so their are cached for a very long time
-                cls = LongTimeExpiringFile
-            else:
-                cls = File
-            if path == 'fckeditor':
-                return cls(uiprops['FCKEDITOR_PATH'])
-            if path == directory: # recurse
-                return self
-            datadir, path = self.config.locate_resource(path)
-            if datadir is None:
-                return self # recurse
-            self.debug('static file %s from %s', path, datadir)
-            return cls(join(datadir, path))
-        # Otherwise we use this single resource
         return self
 
     def render(self, request):
--- a/hooks/workflow.py	Fri May 06 08:48:26 2011 +0200
+++ b/hooks/workflow.py	Fri May 06 08:52:09 2011 +0200
@@ -148,7 +148,7 @@
 
 class WorkflowHook(hook.Hook):
     __abstract__ = True
-    category = 'workflow'
+    category = 'metadata'
 
 
 class SetInitialStateHook(WorkflowHook):
@@ -160,21 +160,15 @@
         _SetInitialStateOp(self._cw, entity=self.entity)
 
 
-class PrepareStateChangeHook(WorkflowHook):
-    """record previous state information"""
-    __regid__ = 'cwdelstate'
-    __select__ = WorkflowHook.__select__ & hook.match_rtype('in_state')
-    events = ('before_delete_relation',)
+class FireTransitionHook(WorkflowHook):
+    """check the transition is allowed and add missing information into the
+    TrInfo entity.
 
-    def __call__(self):
-        self._cw.transaction_data.setdefault('pendingrelations', []).append(
-            (self.eidfrom, self.rtype, self.eidto))
-
-
-class FireTransitionHook(WorkflowHook):
-    """check the transition is allowed, add missing information. Expect that:
+    Expect that:
     * wf_info_for inlined relation is set
     * by_transition or to_state (managers only) inlined relation is set
+
+    Check for automatic transition to be fired at the end
     """
     __regid__ = 'wffiretransition'
     __select__ = WorkflowHook.__select__ & is_instance('TrInfo')
@@ -273,7 +267,7 @@
 
 
 class FiredTransitionHook(WorkflowHook):
-    """change related entity state"""
+    """change related entity state and handle exit of subworkflow"""
     __regid__ = 'wffiretransition'
     __select__ = WorkflowHook.__select__ & is_instance('TrInfo')
     events = ('after_add_entity',)
@@ -296,6 +290,7 @@
     __regid__ = 'wfcheckinstate'
     __select__ = WorkflowHook.__select__ & hook.match_rtype('in_state')
     events = ('before_add_relation',)
+    category = 'integrity'
 
     def __call__(self):
         session = self._cw
--- a/i18n/de.po	Fri May 06 08:48:26 2011 +0200
+++ b/i18n/de.po	Fri May 06 08:52:09 2011 +0200
@@ -8,10 +8,10 @@
 "PO-Revision-Date: 2010-09-15 14:55+0200\n"
 "Last-Translator: Dr. Leo <fhaxbox66@googlemail.com>\n"
 "Language-Team: English <devel@logilab.fr.org>\n"
-"Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
 "Generated-By: pygettext.py 1.5\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
@@ -27,8 +27,8 @@
 "url: %(url)s\n"
 msgstr ""
 "\n"
-"%(user)s hat den Zustand geändert von <%(previous_state)s> in <"
-"%(current_state)s> für die Entität\n"
+"%(user)s hat den Zustand geändert von <%(previous_state)s> in <%"
+"(current_state)s> für die Entität\n"
 "'%(title)s'\n"
 "\n"
 "%(comment)s\n"
@@ -418,8 +418,8 @@
 "Can't restore relation %(rtype)s, %(role)s entity %(eid)s doesn't exist "
 "anymore."
 msgstr ""
-"Kann die Relation %(rtype)s nicht wieder herstellen, die Entität %(role)s "
-"%(eid)s existiert nicht mehr."
+"Kann die Relation %(rtype)s nicht wieder herstellen, die Entität %(role)s %"
+"(eid)s existiert nicht mehr."
 
 #, python-format
 msgid ""
@@ -468,10 +468,10 @@
 msgid "Download schema as OWL"
 msgstr "Herunterladen des Schemas im OWL-Format"
 
+msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Email-Adresse"
 
-msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Email-Adresse"
 
@@ -1105,9 +1105,6 @@
 msgid "add_permission"
 msgstr "Berechtigung hinzufügen"
 
-msgid "add_permission_object"
-msgstr "hat die Berechtigung zum Hinzufügen"
-
 msgctxt "CWGroup"
 msgid "add_permission_object"
 msgstr "kann hinzufügen"
@@ -1116,6 +1113,9 @@
 msgid "add_permission_object"
 msgstr "benutzt, um die Hinzufüge-Berechtigung zu festzulegen für"
 
+msgid "add_permission_object"
+msgstr "hat die Berechtigung zum Hinzufügen"
+
 msgid "add_relation"
 msgstr "hinzufügen"
 
@@ -1125,11 +1125,11 @@
 
 #, python-format
 msgid ""
-"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
-"Die Relation %(rtype)s von %(frometype)s #%(eidfrom)s zu %(toetype)s #"
-"%(eidto)s wurde hinzugefügt."
+"Die Relation %(rtype)s von %(frometype)s #%(eidfrom)s zu %(toetype)s #%"
+"(eidto)s wurde hinzugefügt."
 
 msgid "addrelated"
 msgstr "hinzufügen"
@@ -1164,9 +1164,6 @@
 msgid "allowed_transition"
 msgstr "erlaubter Übergang"
 
-msgid "allowed_transition_object"
-msgstr "ausstehende Zustände"
-
 msgctxt "BaseTransition"
 msgid "allowed_transition_object"
 msgstr "ausstehende Zustände"
@@ -1179,6 +1176,9 @@
 msgid "allowed_transition_object"
 msgstr "ausstehende Zustände"
 
+msgid "allowed_transition_object"
+msgstr "ausstehende Zustände"
+
 msgid "an electronic mail address associated to a short alias"
 msgstr "Eine E-Mail-Adresse wurde mit einem Alias verknüpft."
 
@@ -1261,13 +1261,13 @@
 msgid "bookmarked_by"
 msgstr "Lesezeichen angelegt durch"
 
-msgid "bookmarked_by_object"
-msgstr "hat Lesezeichen"
-
 msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "verwendet Lesezeichen"
 
+msgid "bookmarked_by_object"
+msgstr "hat Lesezeichen"
+
 msgid "bookmarks"
 msgstr "Lesezeichen"
 
@@ -1305,9 +1305,6 @@
 msgid "by_transition"
 msgstr "je Übergang"
 
-msgid "by_transition_object"
-msgstr "Übergangsinformation"
-
 msgctxt "BaseTransition"
 msgid "by_transition_object"
 msgstr "Übergangsinformation"
@@ -1320,6 +1317,9 @@
 msgid "by_transition_object"
 msgstr "Übergangsinformation"
 
+msgid "by_transition_object"
+msgstr "Übergangsinformation"
+
 msgid "calendar"
 msgstr "Kalender anzeigen"
 
@@ -1363,8 +1363,8 @@
 
 #, python-format
 msgid ""
-"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality="
-"%(card)s"
+"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality=%(card)"
+"s"
 msgstr ""
 
 msgid "cancel"
@@ -1472,10 +1472,10 @@
 msgid "condition"
 msgstr "Bedingung"
 
+msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "Bedingung von"
 
-msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "Bedingung von"
 
@@ -1485,11 +1485,11 @@
 msgid "config"
 msgstr ""
 
-msgctxt "CWSource"
+msgctxt "CWSourceHostConfig"
 msgid "config"
 msgstr ""
 
-msgctxt "CWSourceHostConfig"
+msgctxt "CWSource"
 msgid "config"
 msgstr ""
 
@@ -1513,10 +1513,10 @@
 msgid "constrained_by"
 msgstr "eingeschränkt durch"
 
+msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "Einschränkungen"
 
-msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "Einschränkungen"
 
@@ -1530,10 +1530,10 @@
 msgid "constraint_of"
 msgstr ""
 
+msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr ""
 
-msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr ""
 
@@ -1622,8 +1622,8 @@
 msgstr "Erstelle Relation %(linkto)s"
 
 msgid ""
-"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource "
-"%(linkto)s)"
+"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource %"
+"(linkto)s)"
 msgstr ""
 
 msgid ""
@@ -1712,8 +1712,8 @@
 msgstr "Erstelle Workflow-Übergang, der zum Zustand %(linkto)s führt."
 
 msgid ""
-"creating WorkflowTransition (WorkflowTransition transition_of Workflow "
-"%(linkto)s)"
+"creating WorkflowTransition (WorkflowTransition transition_of Workflow %"
+"(linkto)s)"
 msgstr "Erstelle Workflow-Übergang des Workflows %(linkto)s"
 
 msgid "creation"
@@ -1735,13 +1735,13 @@
 msgid "cstrtype"
 msgstr "Einschränkungstyp"
 
-msgid "cstrtype_object"
-msgstr "benutzt von"
-
 msgctxt "CWConstraintType"
 msgid "cstrtype_object"
 msgstr "Einschränkungstyp von"
 
+msgid "cstrtype_object"
+msgstr "benutzt von"
+
 msgid "csv entities export"
 msgstr "CSV-Export von Entitäten"
 
@@ -1866,10 +1866,10 @@
 msgid "cw_for_source"
 msgstr ""
 
+msgctxt "CWSource"
 msgid "cw_for_source_object"
 msgstr ""
 
-msgctxt "CWSource"
 msgid "cw_for_source_object"
 msgstr ""
 
@@ -1880,10 +1880,10 @@
 msgid "cw_host_config_of"
 msgstr ""
 
+msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr ""
 
-msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr ""
 
@@ -1894,6 +1894,7 @@
 msgid "cw_schema"
 msgstr ""
 
+msgctxt "CWEType"
 msgid "cw_schema_object"
 msgstr ""
 
@@ -1901,7 +1902,7 @@
 msgid "cw_schema_object"
 msgstr ""
 
-msgctxt "CWEType"
+msgctxt "CWRelation"
 msgid "cw_schema_object"
 msgstr ""
 
@@ -1909,7 +1910,6 @@
 msgid "cw_schema_object"
 msgstr ""
 
-msgctxt "CWRelation"
 msgid "cw_schema_object"
 msgstr ""
 
@@ -2001,10 +2001,10 @@
 msgid "default_workflow"
 msgstr "Standard-Workflow"
 
+msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "Standard-Workflow von"
 
-msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "Standard-Workflow von"
 
@@ -2084,9 +2084,6 @@
 msgid "delete_permission"
 msgstr "Lösch-Berechtigung"
 
-msgid "delete_permission_object"
-msgstr "hat Lösch-Berechtigung"
-
 msgctxt "CWGroup"
 msgid "delete_permission_object"
 msgstr "hat Lösch-Berechtigung für"
@@ -2095,14 +2092,17 @@
 msgid "delete_permission_object"
 msgstr "hat die Berechtigung, zu löschen"
 
+msgid "delete_permission_object"
+msgstr "hat Lösch-Berechtigung"
+
 #, python-format
 msgid "deleted %(etype)s #%(eid)s (%(title)s)"
 msgstr "Löschen der Entität %(etype)s #%(eid)s (%(title)s)"
 
 #, python-format
 msgid ""
-"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 "Relation %(rtype)s von %(frometype)s #%(eidfrom)s zu %(toetype)s #%(eidto)s "
 "gelöscht"
@@ -2113,7 +2113,15 @@
 msgid "description"
 msgstr "Beschreibung"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description"
+msgstr "Beschreibung"
+
+msgctxt "CWRelation"
+msgid "description"
+msgstr "Beschreibung"
+
+msgctxt "Workflow"
 msgid "description"
 msgstr "Beschreibung"
 
@@ -2121,38 +2129,38 @@
 msgid "description"
 msgstr "Beschreibung"
 
-msgctxt "CWEType"
-msgid "description"
-msgstr "Beschreibung"
-
-msgctxt "CWRType"
-msgid "description"
-msgstr "Beschreibung"
-
-msgctxt "CWRelation"
-msgid "description"
-msgstr "Beschreibung"
-
-msgctxt "State"
-msgid "description"
-msgstr "Beschreibung"
-
 msgctxt "Transition"
 msgid "description"
 msgstr "Beschreibung"
 
-msgctxt "Workflow"
-msgid "description"
-msgstr "Beschreibung"
-
 msgctxt "WorkflowTransition"
 msgid "description"
 msgstr "Beschreibung"
 
+msgctxt "State"
+msgid "description"
+msgstr "Beschreibung"
+
+msgctxt "CWRType"
+msgid "description"
+msgstr "Beschreibung"
+
+msgctxt "BaseTransition"
+msgid "description"
+msgstr "Beschreibung"
+
 msgid "description_format"
 msgstr "Format"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description_format"
+msgstr "Format"
+
+msgctxt "CWRelation"
+msgid "description_format"
+msgstr "Format"
+
+msgctxt "Workflow"
 msgid "description_format"
 msgstr "Format"
 
@@ -2160,7 +2168,15 @@
 msgid "description_format"
 msgstr "Format"
 
-msgctxt "CWEType"
+msgctxt "Transition"
+msgid "description_format"
+msgstr "Format"
+
+msgctxt "WorkflowTransition"
+msgid "description_format"
+msgstr "Format"
+
+msgctxt "State"
 msgid "description_format"
 msgstr "Format"
 
@@ -2168,23 +2184,7 @@
 msgid "description_format"
 msgstr "Format"
 
-msgctxt "CWRelation"
-msgid "description_format"
-msgstr "Format"
-
-msgctxt "State"
-msgid "description_format"
-msgstr "Format"
-
-msgctxt "Transition"
-msgid "description_format"
-msgstr "Format"
-
-msgctxt "Workflow"
-msgid "description_format"
-msgstr "Format"
-
-msgctxt "WorkflowTransition"
+msgctxt "BaseTransition"
 msgid "description_format"
 msgstr "Format"
 
@@ -2207,18 +2207,18 @@
 msgid "destination_state"
 msgstr "Zielzustand"
 
+msgctxt "Transition"
+msgid "destination_state"
+msgstr "Zielzustand"
+
 msgctxt "SubWorkflowExitPoint"
 msgid "destination_state"
 msgstr "Zielzustand"
 
-msgctxt "Transition"
-msgid "destination_state"
-msgstr "Zielzustand"
-
+msgctxt "State"
 msgid "destination_state_object"
 msgstr "Ziel von"
 
-msgctxt "State"
 msgid "destination_state_object"
 msgstr "Ziel von"
 
@@ -2386,6 +2386,9 @@
 msgid "external page"
 msgstr "externe Seite"
 
+msgid "facet-loading-msg"
+msgstr ""
+
 msgid "facet.filters"
 msgstr ""
 
@@ -2485,13 +2488,13 @@
 msgid "for_user"
 msgstr "für Nutzer"
 
-msgid "for_user_object"
-msgstr "hat als Eigenschaft"
-
 msgctxt "CWUser"
 msgid "for_user_object"
 msgstr "verwendet die Eigenschaften"
 
+msgid "for_user_object"
+msgstr "hat als Eigenschaft"
+
 msgid "friday"
 msgstr "Freitag"
 
@@ -2513,13 +2516,13 @@
 msgid "from_entity"
 msgstr "Relation der Entität"
 
-msgid "from_entity_object"
-msgstr "der Entität"
-
 msgctxt "CWEType"
 msgid "from_entity_object"
 msgstr "Subjektrelation"
 
+msgid "from_entity_object"
+msgstr "der Entität"
+
 msgid "from_interval_start"
 msgstr "Von"
 
@@ -2530,13 +2533,13 @@
 msgid "from_state"
 msgstr "Anfangszustand"
 
-msgid "from_state_object"
-msgstr "Übergänge aus diesem Zustand"
-
 msgctxt "State"
 msgid "from_state_object"
 msgstr "Anfangszustand von"
 
+msgid "from_state_object"
+msgstr "Übergänge aus diesem Zustand"
+
 msgid "full text or RQL query"
 msgstr "Volltextsuche oder RQL-Anfrage"
 
@@ -2585,16 +2588,16 @@
 "graphical representation of the %(etype)s entity type from %(appid)s data "
 "model"
 msgstr ""
-"graphische Darstellung des Datenmodells des Entitätstyps (etype)s von "
-"%(appid)s"
+"graphische Darstellung des Datenmodells des Entitätstyps (etype)s von %"
+"(appid)s"
 
 #, python-format
 msgid ""
 "graphical representation of the %(rtype)s relation type from %(appid)s data "
 "model"
 msgstr ""
-"graphische Darstellung des Datenmodells des Relationstyps %(rtype)s von "
-"%(appid)s"
+"graphische Darstellung des Datenmodells des Relationstyps %(rtype)s von %"
+"(appid)s"
 
 msgid "group in which a user should be to be allowed to pass this transition"
 msgstr ""
@@ -2624,6 +2627,9 @@
 msgid "header-right"
 msgstr ""
 
+msgid "help"
+msgstr ""
+
 msgid "hide filter form"
 msgstr "Filter verbergen"
 
@@ -2712,13 +2718,13 @@
 msgid "in_group"
 msgstr "gehört zu der Gruppe"
 
-msgid "in_group_object"
-msgstr "Mitglieder"
-
 msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "enthält die Nutzer"
 
+msgid "in_group_object"
+msgstr "Mitglieder"
+
 msgid "in_state"
 msgstr "Zustand"
 
@@ -2775,10 +2781,10 @@
 msgid "initial_state"
 msgstr "Anfangszustand"
 
+msgctxt "State"
 msgid "initial_state_object"
 msgstr "Anfangszustand von"
 
-msgctxt "State"
 msgid "initial_state_object"
 msgstr "Anfangszustand von"
 
@@ -3079,11 +3085,23 @@
 msgid "name"
 msgstr "Name"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "name"
+msgstr "Name"
+
+msgctxt "Transition"
 msgid "name"
 msgstr "Name"
 
-msgctxt "CWCache"
+msgctxt "CWSource"
+msgid "name"
+msgstr ""
+
+msgctxt "Workflow"
+msgid "name"
+msgstr "Name"
+
+msgctxt "CWGroup"
 msgid "name"
 msgstr "Name"
 
@@ -3091,11 +3109,11 @@
 msgid "name"
 msgstr "Name"
 
-msgctxt "CWEType"
+msgctxt "WorkflowTransition"
 msgid "name"
 msgstr "Name"
 
-msgctxt "CWGroup"
+msgctxt "State"
 msgid "name"
 msgstr "Name"
 
@@ -3107,23 +3125,11 @@
 msgid "name"
 msgstr "Name"
 
-msgctxt "CWSource"
-msgid "name"
-msgstr ""
-
-msgctxt "State"
+msgctxt "BaseTransition"
 msgid "name"
 msgstr "Name"
 
-msgctxt "Transition"
-msgid "name"
-msgstr "Name"
-
-msgctxt "Workflow"
-msgid "name"
-msgstr "Name"
-
-msgctxt "WorkflowTransition"
+msgctxt "CWCache"
 msgid "name"
 msgstr "Name"
 
@@ -3355,13 +3361,13 @@
 msgid "prefered_form"
 msgstr "bevorzugte form"
 
-msgid "prefered_form_object"
-msgstr "bevorzugte form vor"
-
 msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "bevorzugte form von"
 
+msgid "prefered_form_object"
+msgstr "bevorzugte form vor"
+
 msgid "preferences"
 msgstr "Einstellungen"
 
@@ -3378,13 +3384,13 @@
 msgid "primary_email"
 msgstr "primäre E-Mail-Adresse"
 
-msgid "primary_email_object"
-msgstr "Objekt der primären E-Mail-Adresse"
-
 msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "primäre E-Mail-Adresse von"
 
+msgid "primary_email_object"
+msgstr "Objekt der primären E-Mail-Adresse"
+
 msgid "profile"
 msgstr "Profil"
 
@@ -3412,11 +3418,11 @@
 msgid "read_permission"
 msgstr "Leseberechtigung"
 
-msgctxt "CWAttribute"
+msgctxt "CWEType"
 msgid "read_permission"
 msgstr "Leseberechtigung"
 
-msgctxt "CWEType"
+msgctxt "CWAttribute"
 msgid "read_permission"
 msgstr "Leseberechtigung"
 
@@ -3424,9 +3430,6 @@
 msgid "read_permission"
 msgstr "Leseberechtigung"
 
-msgid "read_permission_object"
-msgstr "hat eine Leseberechtigung"
-
 msgctxt "CWGroup"
 msgid "read_permission_object"
 msgstr "kann lesen"
@@ -3435,6 +3438,9 @@
 msgid "read_permission_object"
 msgstr "kann lesen"
 
+msgid "read_permission_object"
+msgstr "hat eine Leseberechtigung"
+
 msgid "regexp matching host(s) to which this config applies"
 msgstr ""
 
@@ -3489,13 +3495,13 @@
 msgid "relation_type"
 msgstr "Relationstyp"
 
-msgid "relation_type_object"
-msgstr "Definition"
-
 msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "definition"
 
+msgid "relation_type_object"
+msgstr "Definition"
+
 msgid "relations"
 msgstr "Relationen"
 
@@ -3506,10 +3512,10 @@
 msgid "relations deleted"
 msgstr "Relationen entfernt"
 
+msgctxt "CWRType"
 msgid "relations_object"
 msgstr "Relationen von"
 
-msgctxt "CWRType"
 msgid "relations_object"
 msgstr "Relationen von"
 
@@ -3526,11 +3532,11 @@
 msgid "require_group"
 msgstr "auf Gruppe beschränkt"
 
-msgctxt "CWPermission"
+msgctxt "Transition"
 msgid "require_group"
 msgstr "auf Gruppe beschränkt"
 
-msgctxt "Transition"
+msgctxt "CWPermission"
 msgid "require_group"
 msgstr "auf Gruppe beschränkt"
 
@@ -3538,10 +3544,10 @@
 msgid "require_group"
 msgstr "auf Gruppe beschränkt"
 
+msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "hat die Rechte"
 
-msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "hat die Rechte"
 
@@ -3749,10 +3755,10 @@
 msgid "specializes"
 msgstr "spezialisiert"
 
+msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "Vorgänger von"
 
-msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "Vorgänger von"
 
@@ -3795,13 +3801,13 @@
 msgid "state_of"
 msgstr "Zustand von"
 
-msgid "state_of_object"
-msgstr "hat als Zustand"
-
 msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "enthält die Zustände"
 
+msgid "state_of_object"
+msgstr "hat als Zustand"
+
 msgid "status change"
 msgstr "Zustand ändern"
 
@@ -3844,20 +3850,20 @@
 msgid "subworkflow_exit"
 msgstr "Ende des Subworkflows"
 
-msgid "subworkflow_exit_object"
-msgstr "Endzustand"
-
 msgctxt "SubWorkflowExitPoint"
 msgid "subworkflow_exit_object"
 msgstr "Endzustände"
 
-msgid "subworkflow_object"
-msgstr "verwendet vom Übergang"
+msgid "subworkflow_exit_object"
+msgstr "Endzustand"
 
 msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "Subworkflow von"
 
+msgid "subworkflow_object"
+msgstr "verwendet vom Übergang"
+
 msgid "subworkflow_state"
 msgstr "Zustand des Subworkflows"
 
@@ -3865,10 +3871,10 @@
 msgid "subworkflow_state"
 msgstr "Zustand"
 
+msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "Endzustand von"
 
-msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "Endzustand von"
 
@@ -3989,10 +3995,10 @@
 msgid "to_entity"
 msgstr "für die Entität"
 
+msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "Objekt der Relation"
 
-msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "Objekt der Relation"
 
@@ -4006,13 +4012,13 @@
 msgid "to_state"
 msgstr "Zielstatus"
 
-msgid "to_state_object"
-msgstr "Übergänge zu dem Zustand"
-
 msgctxt "State"
 msgid "to_state_object"
 msgstr "Übergang zu diesem Zustand"
 
+msgid "to_state_object"
+msgstr "Übergänge zu dem Zustand"
+
 msgid "today"
 msgstr ""
 
@@ -4060,10 +4066,10 @@
 msgid "transition_of"
 msgstr "Übergang des/der"
 
+msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "hat als Übergang"
 
-msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "hat als Übergang"
 
@@ -4080,10 +4086,6 @@
 msgid "type"
 msgstr "Typ"
 
-msgctxt "CWSource"
-msgid "type"
-msgstr ""
-
 msgctxt "Transition"
 msgid "type"
 msgstr "Typ"
@@ -4092,6 +4094,10 @@
 msgid "type"
 msgstr "Typ"
 
+msgctxt "CWSource"
+msgid "type"
+msgstr ""
+
 msgid "type here a sparql query"
 msgstr "Geben sie eine sparql-Anfrage ein"
 
@@ -4180,17 +4186,14 @@
 msgid "update_permission"
 msgstr "Änderungsrecht"
 
+msgctxt "CWEType"
+msgid "update_permission"
+msgstr "Änderungsrecht"
+
 msgctxt "CWAttribute"
 msgid "update_permission"
 msgstr "Änderungsrecht"
 
-msgctxt "CWEType"
-msgid "update_permission"
-msgstr "Änderungsrecht"
-
-msgid "update_permission_object"
-msgstr "hat die Änderungsberechtigung"
-
 msgctxt "CWGroup"
 msgid "update_permission_object"
 msgstr "kann ändern"
@@ -4199,6 +4202,9 @@
 msgid "update_permission_object"
 msgstr "kann ändern"
 
+msgid "update_permission_object"
+msgstr "hat die Änderungsberechtigung"
+
 msgid "update_relation"
 msgstr "aktualisieren"
 
@@ -4242,13 +4248,13 @@
 msgid "use_email"
 msgstr "verwendet die E-Mail-Adresse"
 
-msgid "use_email_object"
-msgstr "Adresse verwendet von"
-
 msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "verwendet von"
 
+msgid "use_email_object"
+msgstr "Adresse verwendet von"
+
 msgid "use_template_format"
 msgstr "Benutzung des 'cubicweb template'-Formats"
 
@@ -4447,10 +4453,10 @@
 msgid "workflow_of"
 msgstr "Workflow von"
 
+msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "hat als Workflow"
 
-msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "hat als Workflow"
 
--- a/i18n/en.po	Fri May 06 08:48:26 2011 +0200
+++ b/i18n/en.po	Fri May 06 08:52:09 2011 +0200
@@ -5,13 +5,13 @@
 msgstr ""
 "Project-Id-Version: 2.0\n"
 "POT-Creation-Date: 2006-01-12 17:35+CET\n"
-"PO-Revision-Date: 2010-09-15 14:55+0200\n"
+"PO-Revision-Date: 2011-04-29 12:57+0200\n"
 "Last-Translator: Sylvain Thenault <sylvain.thenault@logilab.fr>\n"
 "Language-Team: English <devel@logilab.fr.org>\n"
-"Language: en\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: en\n"
 "Generated-By: pygettext.py 1.5\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
@@ -444,10 +444,10 @@
 msgid "Download schema as OWL"
 msgstr ""
 
+msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Email address"
 
-msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Email address"
 
@@ -1065,9 +1065,6 @@
 msgid "add_permission"
 msgstr "add permission"
 
-msgid "add_permission_object"
-msgstr "has permission to add"
-
 msgctxt "CWGroup"
 msgid "add_permission_object"
 msgstr "can add"
@@ -1076,6 +1073,9 @@
 msgid "add_permission_object"
 msgstr "used to define add permission on"
 
+msgid "add_permission_object"
+msgstr "has permission to add"
+
 msgid "add_relation"
 msgstr "add"
 
@@ -1085,8 +1085,8 @@
 
 #, python-format
 msgid ""
-"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 
 msgid "addrelated"
@@ -1122,9 +1122,6 @@
 msgid "allowed_transition"
 msgstr "allowed transition"
 
-msgid "allowed_transition_object"
-msgstr "incoming states"
-
 msgctxt "BaseTransition"
 msgid "allowed_transition_object"
 msgstr "incoming states"
@@ -1137,6 +1134,9 @@
 msgid "allowed_transition_object"
 msgstr "incoming states"
 
+msgid "allowed_transition_object"
+msgstr "incoming states"
+
 msgid "an electronic mail address associated to a short alias"
 msgstr ""
 
@@ -1216,13 +1216,13 @@
 msgid "bookmarked_by"
 msgstr "bookmarked by"
 
-msgid "bookmarked_by_object"
-msgstr "has bookmarks"
-
 msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "uses bookmarks"
 
+msgid "bookmarked_by_object"
+msgstr "has bookmarks"
+
 msgid "bookmarks"
 msgstr ""
 
@@ -1260,9 +1260,6 @@
 msgid "by_transition"
 msgstr "by transition"
 
-msgid "by_transition_object"
-msgstr "transition information"
-
 msgctxt "BaseTransition"
 msgid "by_transition_object"
 msgstr "transition information"
@@ -1275,6 +1272,9 @@
 msgid "by_transition_object"
 msgstr "transition information"
 
+msgid "by_transition_object"
+msgstr "transition information"
+
 msgid "calendar"
 msgstr ""
 
@@ -1317,8 +1317,8 @@
 
 #, python-format
 msgid ""
-"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality="
-"%(card)s"
+"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality=%(card)"
+"s"
 msgstr ""
 
 msgid "cancel"
@@ -1426,10 +1426,10 @@
 msgid "condition"
 msgstr "condition"
 
+msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condition of"
 
-msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condition of"
 
@@ -1439,11 +1439,11 @@
 msgid "config"
 msgstr ""
 
-msgctxt "CWSource"
+msgctxt "CWSourceHostConfig"
 msgid "config"
 msgstr "configuration"
 
-msgctxt "CWSourceHostConfig"
+msgctxt "CWSource"
 msgid "config"
 msgstr "configuration"
 
@@ -1467,10 +1467,10 @@
 msgid "constrained_by"
 msgstr "constrained by"
 
+msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "constraints"
 
-msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "constraints"
 
@@ -1484,10 +1484,10 @@
 msgid "constraint_of"
 msgstr "constraint of"
 
+msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "constrained by"
 
-msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "constrained by"
 
@@ -1575,8 +1575,8 @@
 msgstr "creating relation %(linkto)s"
 
 msgid ""
-"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource "
-"%(linkto)s)"
+"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource %"
+"(linkto)s)"
 msgstr "creating host configuration for source %(linkto)s"
 
 msgid ""
@@ -1665,8 +1665,8 @@
 msgstr "creating workflow-transition leading to state %(linkto)s"
 
 msgid ""
-"creating WorkflowTransition (WorkflowTransition transition_of Workflow "
-"%(linkto)s)"
+"creating WorkflowTransition (WorkflowTransition transition_of Workflow %"
+"(linkto)s)"
 msgstr "creating workflow-transition of workflow %(linkto)s"
 
 msgid "creation"
@@ -1688,13 +1688,13 @@
 msgid "cstrtype"
 msgstr "constraint type"
 
-msgid "cstrtype_object"
-msgstr "used by"
-
 msgctxt "CWConstraintType"
 msgid "cstrtype_object"
 msgstr "constraint type of"
 
+msgid "cstrtype_object"
+msgstr "used by"
+
 msgid "csv entities export"
 msgstr ""
 
@@ -1821,10 +1821,10 @@
 msgid "cw_for_source"
 msgstr "for source"
 
+msgctxt "CWSource"
 msgid "cw_for_source_object"
 msgstr "mapping"
 
-msgctxt "CWSource"
 msgid "cw_for_source_object"
 msgstr "mapping"
 
@@ -1835,10 +1835,10 @@
 msgid "cw_host_config_of"
 msgstr "source"
 
+msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr "host configuration"
 
-msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr "host configuration"
 
@@ -1849,6 +1849,7 @@
 msgid "cw_schema"
 msgstr "maps"
 
+msgctxt "CWEType"
 msgid "cw_schema_object"
 msgstr "mapped by"
 
@@ -1856,7 +1857,7 @@
 msgid "cw_schema_object"
 msgstr "mapped by"
 
-msgctxt "CWEType"
+msgctxt "CWRelation"
 msgid "cw_schema_object"
 msgstr "mapped by"
 
@@ -1864,7 +1865,6 @@
 msgid "cw_schema_object"
 msgstr "mapped by"
 
-msgctxt "CWRelation"
 msgid "cw_schema_object"
 msgstr "mapped by"
 
@@ -1956,10 +1956,10 @@
 msgid "default_workflow"
 msgstr "default workflow"
 
+msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "default workflow of"
 
-msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "default workflow of"
 
@@ -2035,9 +2035,6 @@
 msgid "delete_permission"
 msgstr "delete_permission"
 
-msgid "delete_permission_object"
-msgstr "has permission to delete"
-
 msgctxt "CWGroup"
 msgid "delete_permission_object"
 msgstr "has permission to delete"
@@ -2046,14 +2043,17 @@
 msgid "delete_permission_object"
 msgstr "has permission to delete"
 
+msgid "delete_permission_object"
+msgstr "has permission to delete"
+
 #, python-format
 msgid "deleted %(etype)s #%(eid)s (%(title)s)"
 msgstr ""
 
 #, python-format
 msgid ""
-"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 
 msgid "depends on the constraint type"
@@ -2062,7 +2062,15 @@
 msgid "description"
 msgstr "description"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description"
+msgstr "description"
+
+msgctxt "CWRelation"
+msgid "description"
+msgstr "description"
+
+msgctxt "Workflow"
 msgid "description"
 msgstr "description"
 
@@ -2070,38 +2078,38 @@
 msgid "description"
 msgstr "description"
 
-msgctxt "CWEType"
-msgid "description"
-msgstr "description"
-
-msgctxt "CWRType"
-msgid "description"
-msgstr "description"
-
-msgctxt "CWRelation"
-msgid "description"
-msgstr "description"
-
-msgctxt "State"
-msgid "description"
-msgstr "description"
-
 msgctxt "Transition"
 msgid "description"
 msgstr "description"
 
-msgctxt "Workflow"
-msgid "description"
-msgstr "description"
-
 msgctxt "WorkflowTransition"
 msgid "description"
 msgstr "description"
 
+msgctxt "State"
+msgid "description"
+msgstr "description"
+
+msgctxt "CWRType"
+msgid "description"
+msgstr "description"
+
+msgctxt "BaseTransition"
+msgid "description"
+msgstr "description"
+
 msgid "description_format"
 msgstr "format"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "CWRelation"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "Workflow"
 msgid "description_format"
 msgstr "format"
 
@@ -2109,7 +2117,15 @@
 msgid "description_format"
 msgstr "format"
 
-msgctxt "CWEType"
+msgctxt "Transition"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "WorkflowTransition"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "State"
 msgid "description_format"
 msgstr "format"
 
@@ -2117,23 +2133,7 @@
 msgid "description_format"
 msgstr "format"
 
-msgctxt "CWRelation"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "State"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "Transition"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "Workflow"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "WorkflowTransition"
+msgctxt "BaseTransition"
 msgid "description_format"
 msgstr "format"
 
@@ -2154,18 +2154,18 @@
 msgid "destination_state"
 msgstr "destination state"
 
+msgctxt "Transition"
+msgid "destination_state"
+msgstr "destination state"
+
 msgctxt "SubWorkflowExitPoint"
 msgid "destination_state"
 msgstr "destination state"
 
-msgctxt "Transition"
-msgid "destination_state"
-msgstr "destination state"
-
+msgctxt "State"
 msgid "destination_state_object"
 msgstr "destination of"
 
-msgctxt "State"
 msgid "destination_state_object"
 msgstr "destination of"
 
@@ -2328,6 +2328,9 @@
 msgid "external page"
 msgstr ""
 
+msgid "facet-loading-msg"
+msgstr "processing, please wait"
+
 msgid "facet.filters"
 msgstr "filter"
 
@@ -2427,13 +2430,13 @@
 msgid "for_user"
 msgstr "for user"
 
-msgid "for_user_object"
-msgstr "use properties"
-
 msgctxt "CWUser"
 msgid "for_user_object"
 msgstr "property of"
 
+msgid "for_user_object"
+msgstr "use properties"
+
 msgid "friday"
 msgstr ""
 
@@ -2455,13 +2458,13 @@
 msgid "from_entity"
 msgstr "from entity"
 
-msgid "from_entity_object"
-msgstr "subjet relation"
-
 msgctxt "CWEType"
 msgid "from_entity_object"
 msgstr "subjec relation"
 
+msgid "from_entity_object"
+msgstr "subjet relation"
+
 msgid "from_interval_start"
 msgstr "from"
 
@@ -2472,10 +2475,10 @@
 msgid "from_state"
 msgstr "from state"
 
+msgctxt "State"
 msgid "from_state_object"
 msgstr "transitions from this state"
 
-msgctxt "State"
 msgid "from_state_object"
 msgstr "transitions from this state"
 
@@ -2559,6 +2562,9 @@
 msgid "header-right"
 msgstr "header (right)"
 
+msgid "help"
+msgstr ""
+
 msgid "hide filter form"
 msgstr ""
 
@@ -2639,10 +2645,10 @@
 msgid "in_group"
 msgstr "in group"
 
+msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "contains"
 
-msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "contains"
 
@@ -2700,10 +2706,10 @@
 msgid "initial_state"
 msgstr "initial state"
 
+msgctxt "State"
 msgid "initial_state_object"
 msgstr "initial state of"
 
-msgctxt "State"
 msgid "initial_state_object"
 msgstr "initial state of"
 
@@ -2992,11 +2998,23 @@
 msgid "name"
 msgstr ""
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "name"
+msgstr "name"
+
+msgctxt "Transition"
 msgid "name"
 msgstr "name"
 
-msgctxt "CWCache"
+msgctxt "CWSource"
+msgid "name"
+msgstr "name"
+
+msgctxt "Workflow"
+msgid "name"
+msgstr "name"
+
+msgctxt "CWGroup"
 msgid "name"
 msgstr "name"
 
@@ -3004,11 +3022,11 @@
 msgid "name"
 msgstr "name"
 
-msgctxt "CWEType"
+msgctxt "WorkflowTransition"
 msgid "name"
 msgstr "name"
 
-msgctxt "CWGroup"
+msgctxt "State"
 msgid "name"
 msgstr "name"
 
@@ -3020,23 +3038,11 @@
 msgid "name"
 msgstr "name"
 
-msgctxt "CWSource"
-msgid "name"
-msgstr "name"
-
-msgctxt "State"
+msgctxt "BaseTransition"
 msgid "name"
 msgstr "name"
 
-msgctxt "Transition"
-msgid "name"
-msgstr "name"
-
-msgctxt "Workflow"
-msgid "name"
-msgstr "name"
-
-msgctxt "WorkflowTransition"
+msgctxt "CWCache"
 msgid "name"
 msgstr "name"
 
@@ -3265,10 +3271,10 @@
 msgid "prefered_form"
 msgstr "prefered form"
 
+msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "prefered over"
 
-msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "prefered over"
 
@@ -3288,10 +3294,10 @@
 msgid "primary_email"
 msgstr "primary email"
 
+msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "primary email of"
 
-msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "primary email of"
 
@@ -3322,11 +3328,11 @@
 msgid "read_permission"
 msgstr "can be read by"
 
-msgctxt "CWAttribute"
+msgctxt "CWEType"
 msgid "read_permission"
 msgstr "read permission"
 
-msgctxt "CWEType"
+msgctxt "CWAttribute"
 msgid "read_permission"
 msgstr "read permission"
 
@@ -3334,9 +3340,6 @@
 msgid "read_permission"
 msgstr "read permission"
 
-msgid "read_permission_object"
-msgstr "has permission to read"
-
 msgctxt "CWGroup"
 msgid "read_permission_object"
 msgstr "can be read by"
@@ -3345,6 +3348,9 @@
 msgid "read_permission_object"
 msgstr "can be read by"
 
+msgid "read_permission_object"
+msgstr "has permission to read"
+
 msgid "regexp matching host(s) to which this config applies"
 msgstr ""
 
@@ -3399,10 +3405,10 @@
 msgid "relation_type"
 msgstr "relation type"
 
+msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "relation definitions"
 
-msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "relation definitions"
 
@@ -3416,10 +3422,10 @@
 msgid "relations deleted"
 msgstr ""
 
+msgctxt "CWRType"
 msgid "relations_object"
 msgstr "constrained by"
 
-msgctxt "CWRType"
 msgid "relations_object"
 msgstr "constrained by"
 
@@ -3436,11 +3442,11 @@
 msgid "require_group"
 msgstr "require group"
 
-msgctxt "CWPermission"
+msgctxt "Transition"
 msgid "require_group"
 msgstr "require group"
 
-msgctxt "Transition"
+msgctxt "CWPermission"
 msgid "require_group"
 msgstr "require group"
 
@@ -3448,10 +3454,10 @@
 msgid "require_group"
 msgstr "require group"
 
+msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "required by"
 
-msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "required by"
 
@@ -3649,10 +3655,10 @@
 msgid "specializes"
 msgstr "specializes"
 
+msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "specialized by"
 
-msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "specialized by"
 
@@ -3693,10 +3699,10 @@
 msgid "state_of"
 msgstr "state of"
 
+msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "use states"
 
-msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "use states"
 
@@ -3740,17 +3746,17 @@
 msgid "subworkflow_exit"
 msgstr "subworkflow exit"
 
-msgid "subworkflow_exit_object"
-msgstr "subworkflow exit of"
-
 msgctxt "SubWorkflowExitPoint"
 msgid "subworkflow_exit_object"
 msgstr "subworkflow exit of"
 
+msgid "subworkflow_exit_object"
+msgstr "subworkflow exit of"
+
+msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "subworkflow of"
 
-msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "subworkflow of"
 
@@ -3761,10 +3767,10 @@
 msgid "subworkflow_state"
 msgstr "subworkflow state"
 
+msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "exit point"
 
-msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "exit point"
 
@@ -3884,10 +3890,10 @@
 msgid "to_entity"
 msgstr "to entity"
 
+msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "object relations"
 
-msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "object relations"
 
@@ -3901,10 +3907,10 @@
 msgid "to_state"
 msgstr "to state"
 
+msgctxt "State"
 msgid "to_state_object"
 msgstr "transitions to this state"
 
-msgctxt "State"
 msgid "to_state_object"
 msgstr "transitions to this state"
 
@@ -3955,10 +3961,10 @@
 msgid "transition_of"
 msgstr "transition of"
 
+msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "use transitions"
 
-msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "use transitions"
 
@@ -3975,10 +3981,6 @@
 msgid "type"
 msgstr "type"
 
-msgctxt "CWSource"
-msgid "type"
-msgstr "type"
-
 msgctxt "Transition"
 msgid "type"
 msgstr "type"
@@ -3987,6 +3989,10 @@
 msgid "type"
 msgstr "type"
 
+msgctxt "CWSource"
+msgid "type"
+msgstr "type"
+
 msgid "type here a sparql query"
 msgstr ""
 
@@ -4075,17 +4081,14 @@
 msgid "update_permission"
 msgstr "can be updated by"
 
+msgctxt "CWEType"
+msgid "update_permission"
+msgstr "can be updated by"
+
 msgctxt "CWAttribute"
 msgid "update_permission"
 msgstr "can be updated by"
 
-msgctxt "CWEType"
-msgid "update_permission"
-msgstr "can be updated by"
-
-msgid "update_permission_object"
-msgstr "has permission to update"
-
 msgctxt "CWGroup"
 msgid "update_permission_object"
 msgstr "has permission to update"
@@ -4094,6 +4097,9 @@
 msgid "update_permission_object"
 msgstr "has permission to update"
 
+msgid "update_permission_object"
+msgstr "has permission to update"
+
 msgid "update_relation"
 msgstr "update"
 
@@ -4134,10 +4140,10 @@
 msgid "use_email"
 msgstr "use email"
 
+msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "used by"
 
-msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "used by"
 
@@ -4329,10 +4335,10 @@
 msgid "workflow_of"
 msgstr "workflow of"
 
+msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "may use workflow"
 
-msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "may use workflow"
 
--- a/i18n/es.po	Fri May 06 08:48:26 2011 +0200
+++ b/i18n/es.po	Fri May 06 08:52:09 2011 +0200
@@ -8,10 +8,10 @@
 "PO-Revision-Date: 2011-05-03 12:53-0600\n"
 "Last-Translator: CreaLibre <info@crealibre.com>\n"
 "Language-Team: es <contact@logilab.fr>\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
 
 #, python-format
 msgid ""
@@ -25,8 +25,8 @@
 "url: %(url)s\n"
 msgstr ""
 "\n"
-"%(user)s ha cambiado su estado de <%(previous_state)s> hacia <"
-"%(current_state)s> por la entidad\n"
+"%(user)s ha cambiado su estado de <%(previous_state)s> hacia <%"
+"(current_state)s> por la entidad\n"
 "'%(title)s'\n"
 "\n"
 "%(comment)s\n"
@@ -468,10 +468,10 @@
 msgid "Download schema as OWL"
 msgstr "Descargar el esquema en formato OWL"
 
+msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Correo Electrónico"
 
-msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Correo Electrónico"
 
@@ -1115,9 +1115,6 @@
 msgid "add_permission"
 msgstr "Permiso de agregar"
 
-msgid "add_permission_object"
-msgstr "tiene permiso de agregar"
-
 msgctxt "CWGroup"
 msgid "add_permission_object"
 msgstr "tiene permiso de agregar"
@@ -1126,6 +1123,9 @@
 msgid "add_permission_object"
 msgstr "tiene permiso de agregar"
 
+msgid "add_permission_object"
+msgstr "tiene permiso de agregar"
+
 msgid "add_relation"
 msgstr "agregar"
 
@@ -1135,8 +1135,8 @@
 
 #, python-format
 msgid ""
-"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 "la relación %(rtype)s de %(frometype)s #%(eidfrom)s a %(toetype)s #%(eidto)s "
 "ha sido agregada"
@@ -1174,9 +1174,6 @@
 msgid "allowed_transition"
 msgstr "transiciones autorizadas"
 
-msgid "allowed_transition_object"
-msgstr "Estados de entrada"
-
 msgctxt "BaseTransition"
 msgid "allowed_transition_object"
 msgstr "transición autorizada de"
@@ -1189,6 +1186,9 @@
 msgid "allowed_transition_object"
 msgstr "transición autorizada de"
 
+msgid "allowed_transition_object"
+msgstr "Estados de entrada"
+
 msgid "an electronic mail address associated to a short alias"
 msgstr "una dirección electrónica asociada a este alias"
 
@@ -1272,10 +1272,10 @@
 msgid "bookmarked_by"
 msgstr "está en los Favoritos de"
 
+msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "tiene como Favoritos"
 
-msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "tiene como Favoritos"
 
@@ -1316,9 +1316,6 @@
 msgid "by_transition"
 msgstr "transición"
 
-msgid "by_transition_object"
-msgstr "cambio de estados"
-
 msgctxt "BaseTransition"
 msgid "by_transition_object"
 msgstr "tiene como información"
@@ -1331,6 +1328,9 @@
 msgid "by_transition_object"
 msgstr "tiene como información"
 
+msgid "by_transition_object"
+msgstr "cambio de estados"
+
 msgid "calendar"
 msgstr "mostrar un calendario"
 
@@ -1373,8 +1373,8 @@
 
 #, python-format
 msgid ""
-"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality="
-"%(card)s"
+"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality=%(card)"
+"s"
 msgstr ""
 "no puede poner 'inlined' = True, %(stype)s %(rtype)s %(otype)s tiene "
 "cardinalidad %(card)s"
@@ -1486,10 +1486,10 @@
 msgid "condition"
 msgstr "condición"
 
+msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condición de"
 
-msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condición de"
 
@@ -1499,11 +1499,11 @@
 msgid "config"
 msgstr "configuración"
 
-msgctxt "CWSource"
+msgctxt "CWSourceHostConfig"
 msgid "config"
 msgstr "configuración"
 
-msgctxt "CWSourceHostConfig"
+msgctxt "CWSource"
 msgid "config"
 msgstr "configuración"
 
@@ -1527,10 +1527,10 @@
 msgid "constrained_by"
 msgstr "Restricción impuesta por"
 
+msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "Restricción de"
 
-msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "Restricción de"
 
@@ -1544,10 +1544,10 @@
 msgid "constraint_of"
 msgstr "restricción de"
 
+msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "restringida por"
 
-msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "restringida por"
 
@@ -1641,7 +1641,6 @@
 msgid "creating CWRelation (CWRelation relation_type CWRType %(linkto)s)"
 msgstr "Creación de la relación %(linkto)s"
 
-msgid ""
 "creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource "
 "%(linkto)s)"
 msgstr "creación de una configuración host para la fuente %(linkto)s"
@@ -1736,8 +1735,8 @@
 "Creación de una Transición Workflow permitida desde el estado %(linkto)s"
 
 msgid ""
-"creating WorkflowTransition (WorkflowTransition transition_of Workflow "
-"%(linkto)s)"
+"creating WorkflowTransition (WorkflowTransition transition_of Workflow %"
+"(linkto)s)"
 msgstr "Creación de una Transición Workflow del Workflow %(linkto)s"
 
 msgid "creation"
@@ -1759,13 +1758,13 @@
 msgid "cstrtype"
 msgstr "Tipo"
 
-msgid "cstrtype_object"
-msgstr "utilizado por"
-
 msgctxt "CWConstraintType"
 msgid "cstrtype_object"
 msgstr "Tipo de restricciones"
 
+msgid "cstrtype_object"
+msgstr "utilizado por"
+
 msgid "csv entities export"
 msgstr "Exportar entidades en csv"
 
@@ -1895,10 +1894,10 @@
 msgid "cw_for_source"
 msgstr "fuente"
 
+msgctxt "CWSource"
 msgid "cw_for_source_object"
 msgstr "elemento de mapeo"
 
-msgctxt "CWSource"
 msgid "cw_for_source_object"
 msgstr "elemento de mapeo"
 
@@ -1909,10 +1908,10 @@
 msgid "cw_host_config_of"
 msgstr "configuración del host de"
 
+msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr "tiene la configuración del host"
 
-msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr "tiene la configuración del host"
 
@@ -1923,6 +1922,7 @@
 msgid "cw_schema"
 msgstr "esquema"
 
+msgctxt "CWEType"
 msgid "cw_schema_object"
 msgstr "mapeado por"
 
@@ -1930,7 +1930,7 @@
 msgid "cw_schema_object"
 msgstr "mapeado por"
 
-msgctxt "CWEType"
+msgctxt "CWRelation"
 msgid "cw_schema_object"
 msgstr "mapeado por"
 
@@ -1938,7 +1938,6 @@
 msgid "cw_schema_object"
 msgstr "mapeado por"
 
-msgctxt "CWRelation"
 msgid "cw_schema_object"
 msgstr "mapeado por"
 
@@ -2031,10 +2030,10 @@
 msgid "default_workflow"
 msgstr "Workflow por defecto"
 
+msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "Workflow por defecto de"
 
-msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "Workflow por defecto de"
 
@@ -2120,9 +2119,6 @@
 msgid "delete_permission"
 msgstr "Permiso de eliminar"
 
-msgid "delete_permission_object"
-msgstr "posee permiso para eliminar"
-
 msgctxt "CWGroup"
 msgid "delete_permission_object"
 msgstr "puede eliminar"
@@ -2131,14 +2127,17 @@
 msgid "delete_permission_object"
 msgstr "puede eliminar"
 
+msgid "delete_permission_object"
+msgstr "posee permiso para eliminar"
+
 #, python-format
 msgid "deleted %(etype)s #%(eid)s (%(title)s)"
 msgstr "Eliminación de la entidad %(etype)s #%(eid)s (%(title)s)"
 
 #, python-format
 msgid ""
-"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 "La relación %(rtype)s de %(frometype)s #%(eidfrom)s a %(toetype)s #%(eidto)s "
 "ha sido suprimida."
@@ -2149,7 +2148,15 @@
 msgid "description"
 msgstr "Descripción"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description"
+msgstr "Descripción"
+
+msgctxt "CWRelation"
+msgid "description"
+msgstr "Descripción"
+
+msgctxt "Workflow"
 msgid "description"
 msgstr "Descripción"
 
@@ -2157,38 +2164,38 @@
 msgid "description"
 msgstr "Descripción"
 
-msgctxt "CWEType"
-msgid "description"
-msgstr "Descripción"
-
-msgctxt "CWRType"
-msgid "description"
-msgstr "Descripción"
-
-msgctxt "CWRelation"
-msgid "description"
-msgstr "Descripción"
-
-msgctxt "State"
-msgid "description"
-msgstr "Descripción"
-
 msgctxt "Transition"
 msgid "description"
 msgstr "Descripción"
 
-msgctxt "Workflow"
-msgid "description"
-msgstr "Descripción"
-
 msgctxt "WorkflowTransition"
 msgid "description"
 msgstr "Descripción"
 
+msgctxt "State"
+msgid "description"
+msgstr "Descripción"
+
+msgctxt "CWRType"
+msgid "description"
+msgstr "Descripción"
+
+msgctxt "BaseTransition"
+msgid "description"
+msgstr "Descripción"
+
 msgid "description_format"
 msgstr "Formato"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description_format"
+msgstr "Formato"
+
+msgctxt "CWRelation"
+msgid "description_format"
+msgstr "Formato"
+
+msgctxt "Workflow"
 msgid "description_format"
 msgstr "Formato"
 
@@ -2196,7 +2203,15 @@
 msgid "description_format"
 msgstr "Formato"
 
-msgctxt "CWEType"
+msgctxt "Transition"
+msgid "description_format"
+msgstr "Formato"
+
+msgctxt "WorkflowTransition"
+msgid "description_format"
+msgstr "Formato"
+
+msgctxt "State"
 msgid "description_format"
 msgstr "Formato"
 
@@ -2204,23 +2219,7 @@
 msgid "description_format"
 msgstr "Formato"
 
-msgctxt "CWRelation"
-msgid "description_format"
-msgstr "Formato"
-
-msgctxt "State"
-msgid "description_format"
-msgstr "Formato"
-
-msgctxt "Transition"
-msgid "description_format"
-msgstr "Formato"
-
-msgctxt "Workflow"
-msgid "description_format"
-msgstr "Formato"
-
-msgctxt "WorkflowTransition"
+msgctxt "BaseTransition"
 msgid "description_format"
 msgstr "Formato"
 
@@ -2246,21 +2245,21 @@
 msgid "destination_state"
 msgstr "Estado destino"
 
+msgctxt "Transition"
+msgid "destination_state"
+msgstr "Estado destino"
+
 msgctxt "SubWorkflowExitPoint"
 msgid "destination_state"
 msgstr "Estado destino"
 
-msgctxt "Transition"
-msgid "destination_state"
-msgstr "Estado destino"
-
-msgid "destination_state_object"
-msgstr "Destino de"
-
 msgctxt "State"
 msgid "destination_state_object"
 msgstr "Estado final de"
 
+msgid "destination_state_object"
+msgstr "Destino de"
+
 msgid "detach attached file"
 msgstr "soltar el archivo existente"
 
@@ -2429,6 +2428,9 @@
 msgid "external page"
 msgstr "Página externa"
 
+msgid "facet-loading-msg"
+msgstr ""
+
 msgid "facet.filters"
 msgstr "Filtros"
 
@@ -2528,13 +2530,13 @@
 msgid "for_user"
 msgstr "Propiedad del Usuario"
 
-msgid "for_user_object"
-msgstr "Utiliza las propiedades"
-
 msgctxt "CWUser"
 msgid "for_user_object"
 msgstr "Tiene como preferencia"
 
+msgid "for_user_object"
+msgstr "Utiliza las propiedades"
+
 msgid "friday"
 msgstr "Viernes"
 
@@ -2556,13 +2558,13 @@
 msgid "from_entity"
 msgstr "Relación de la entidad"
 
-msgid "from_entity_object"
-msgstr "Relación sujeto"
-
 msgctxt "CWEType"
 msgid "from_entity_object"
 msgstr "Entidad de"
 
+msgid "from_entity_object"
+msgstr "Relación sujeto"
+
 msgid "from_interval_start"
 msgstr "De"
 
@@ -2573,13 +2575,13 @@
 msgid "from_state"
 msgstr "Estado de Inicio"
 
-msgid "from_state_object"
-msgstr "Transiciones desde este estado"
-
 msgctxt "State"
 msgid "from_state_object"
 msgstr "Estado de Inicio de"
 
+msgid "from_state_object"
+msgstr "Transiciones desde este estado"
+
 msgid "full text or RQL query"
 msgstr "Texto de búsqueda o demanda RQL"
 
@@ -2636,8 +2638,8 @@
 "graphical representation of the %(rtype)s relation type from %(appid)s data "
 "model"
 msgstr ""
-"Representación gráfica del modelo de datos para el tipo de relación "
-"%(rtype)s de %(appid)s"
+"Representación gráfica del modelo de datos para el tipo de relación %(rtype)"
+"s de %(appid)s"
 
 msgid "group in which a user should be to be allowed to pass this transition"
 msgstr "Grupo en el cual el usuario debe estar lograr la transición"
@@ -2666,6 +2668,9 @@
 msgid "header-right"
 msgstr "encabezado (derecho)"
 
+msgid "help"
+msgstr ""
+
 msgid "hide filter form"
 msgstr "Esconder el filtro"
 
@@ -2755,13 +2760,13 @@
 msgid "in_group"
 msgstr "Forma parte del grupo"
 
-msgid "in_group_object"
-msgstr "Miembros"
-
 msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "Contiene los usuarios"
 
+msgid "in_group_object"
+msgstr "Miembros"
+
 msgid "in_state"
 msgstr "Estado"
 
@@ -2817,10 +2822,10 @@
 msgid "initial_state"
 msgstr "Estado inicial"
 
+msgctxt "State"
 msgid "initial_state_object"
 msgstr "Estado inicial de"
 
-msgctxt "State"
 msgid "initial_state_object"
 msgstr "Estado inicial de"
 
@@ -3120,11 +3125,23 @@
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "name"
+msgstr "Nombre"
+
+msgctxt "Transition"
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "CWCache"
+msgctxt "CWSource"
+msgid "name"
+msgstr ""
+
+msgctxt "Workflow"
+msgid "name"
+msgstr "Nombre"
+
+msgctxt "CWGroup"
 msgid "name"
 msgstr "Nombre"
 
@@ -3132,13 +3149,13 @@
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "CWEType"
+msgctxt "WorkflowTransition"
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "CWGroup"
+msgctxt "State"
 msgid "name"
-msgstr "Nombre"
+msgstr "nombre"
 
 msgctxt "CWPermission"
 msgid "name"
@@ -3148,23 +3165,11 @@
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "CWSource"
-msgid "name"
-msgstr "nombre"
-
-msgctxt "State"
+msgctxt "BaseTransition"
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "Transition"
-msgid "name"
-msgstr "Nombre"
-
-msgctxt "Workflow"
-msgid "name"
-msgstr "Nombre"
-
-msgctxt "WorkflowTransition"
+msgctxt "CWCache"
 msgid "name"
 msgstr "Nombre"
 
@@ -3396,13 +3401,13 @@
 msgid "prefered_form"
 msgstr "Email principal"
 
-msgid "prefered_form_object"
-msgstr "Formato preferido sobre"
-
 msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "Email principal de"
 
+msgid "prefered_form_object"
+msgstr "Formato preferido sobre"
+
 msgid "preferences"
 msgstr "Preferencias"
 
@@ -3419,13 +3424,13 @@
 msgid "primary_email"
 msgstr "Dirección principal de correo electrónico"
 
-msgid "primary_email_object"
-msgstr "Dirección de email principal (objeto)"
-
 msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "Dirección principal de correo electrónico de"
 
+msgid "primary_email_object"
+msgstr "Dirección de email principal (objeto)"
+
 msgid "profile"
 msgstr "perfil"
 
@@ -3453,11 +3458,11 @@
 msgid "read_permission"
 msgstr "Permiso de lectura"
 
-msgctxt "CWAttribute"
+msgctxt "CWEType"
 msgid "read_permission"
 msgstr "Permiso de Lectura"
 
-msgctxt "CWEType"
+msgctxt "CWAttribute"
 msgid "read_permission"
 msgstr "Permiso de Lectura"
 
@@ -3465,9 +3470,6 @@
 msgid "read_permission"
 msgstr "Permiso de Lectura"
 
-msgid "read_permission_object"
-msgstr "Tiene acceso de lectura a"
-
 msgctxt "CWGroup"
 msgid "read_permission_object"
 msgstr "Puede leer"
@@ -3476,6 +3478,9 @@
 msgid "read_permission_object"
 msgstr "Puede leer"
 
+msgid "read_permission_object"
+msgstr "Tiene acceso de lectura a"
+
 msgid "regexp matching host(s) to which this config applies"
 msgstr ""
 "expresión regular de los nombres de hosts a los cuales esta configuración "
@@ -3538,10 +3543,10 @@
 msgid "relation_type"
 msgstr "Tipo de Relación"
 
+msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "Definición de Relaciones"
 
-msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "Definición de Relaciones"
 
@@ -3555,10 +3560,10 @@
 msgid "relations deleted"
 msgstr "Relaciones Eliminadas"
 
+msgctxt "CWRType"
 msgid "relations_object"
 msgstr "relaciones de"
 
-msgctxt "CWRType"
 msgid "relations_object"
 msgstr "relaciones de"
 
@@ -3575,11 +3580,11 @@
 msgid "require_group"
 msgstr "Restringida al Grupo"
 
-msgctxt "CWPermission"
+msgctxt "Transition"
 msgid "require_group"
 msgstr "Restringida al Grupo"
 
-msgctxt "Transition"
+msgctxt "CWPermission"
 msgid "require_group"
 msgstr "Restringida al Grupo"
 
@@ -3587,10 +3592,10 @@
 msgid "require_group"
 msgstr "Restringida al Grupo"
 
+msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "Posee derechos sobre"
 
-msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "Posee derechos sobre"
 
@@ -3799,10 +3804,10 @@
 msgid "specializes"
 msgstr "Especializa"
 
+msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "Especializado por"
 
-msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "Especializado por"
 
@@ -3845,10 +3850,10 @@
 msgid "state_of"
 msgstr "Estado de"
 
+msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "Tiene por Estado"
 
-msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "Tiene por Estado"
 
@@ -3894,17 +3899,17 @@
 msgid "subworkflow_exit"
 msgstr "Salida del Sub-Workflow"
 
-msgid "subworkflow_exit_object"
-msgstr "Salida Sub-Workflow de"
-
 msgctxt "SubWorkflowExitPoint"
 msgid "subworkflow_exit_object"
 msgstr "Salida Sub-Workflow de"
 
+msgid "subworkflow_exit_object"
+msgstr "Salida Sub-Workflow de"
+
+msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "Sub-Workflow de"
 
-msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "Sub-Workflow de"
 
@@ -3915,10 +3920,10 @@
 msgid "subworkflow_state"
 msgstr "Estado de Sub-Workflow"
 
+msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "Estado de Salida de"
 
-msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "Estado de Salida de"
 
@@ -4039,10 +4044,10 @@
 msgid "to_entity"
 msgstr "Por la entidad"
 
+msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "Objeto de la Relación"
 
-msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "Objeto de la Relación"
 
@@ -4056,10 +4061,10 @@
 msgid "to_state"
 msgstr "Hacia el Estado"
 
+msgctxt "State"
 msgid "to_state_object"
 msgstr "Transición hacia este Estado"
 
-msgctxt "State"
 msgid "to_state_object"
 msgstr "Transición hacia este Estado"
 
@@ -4110,10 +4115,10 @@
 msgid "transition_of"
 msgstr "Transición de"
 
+msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "Utiliza las transiciones"
 
-msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "Utiliza las transiciones"
 
@@ -4142,6 +4147,10 @@
 msgid "type"
 msgstr "Tipo"
 
+msgctxt "CWSource"
+msgid "type"
+msgstr ""
+
 msgid "type here a sparql query"
 msgstr "Escriba aquí su consulta en Sparql"
 
@@ -4230,17 +4239,14 @@
 msgid "update_permission"
 msgstr "Puede ser modificado por"
 
+msgctxt "CWEType"
+msgid "update_permission"
+msgstr "Puede ser modificado por"
+
 msgctxt "CWAttribute"
 msgid "update_permission"
 msgstr "Puede ser modificado por"
 
-msgctxt "CWEType"
-msgid "update_permission"
-msgstr "Puede ser modificado por"
-
-msgid "update_permission_object"
-msgstr "Tiene permiso de modificar"
-
 msgctxt "CWGroup"
 msgid "update_permission_object"
 msgstr "Puede modificar"
@@ -4249,6 +4255,9 @@
 msgid "update_permission_object"
 msgstr "Puede modificar"
 
+msgid "update_permission_object"
+msgstr "Tiene permiso de modificar"
+
 msgid "update_relation"
 msgstr "Modificar"
 
@@ -4292,13 +4301,13 @@
 msgid "use_email"
 msgstr "Usa el Correo Electrónico"
 
-msgid "use_email_object"
-msgstr "Email utilizado por"
-
 msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "Utilizado por"
 
+msgid "use_email_object"
+msgstr "Email utilizado por"
+
 msgid "use_template_format"
 msgstr "Utilización del formato 'cubicweb template'"
 
@@ -4496,10 +4505,10 @@
 msgid "workflow_of"
 msgstr "Workflow de"
 
+msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "Utiliza el Workflow"
 
-msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "Utiliza el Workflow"
 
--- a/i18n/fr.po	Fri May 06 08:48:26 2011 +0200
+++ b/i18n/fr.po	Fri May 06 08:52:09 2011 +0200
@@ -4,13 +4,13 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: cubicweb 2.46.0\n"
-"PO-Revision-Date: 2011-01-03 14:35+0100\n"
+"PO-Revision-Date: 2011-04-29 12:57+0200\n"
 "Last-Translator: Logilab Team <contact@logilab.fr>\n"
 "Language-Team: fr <contact@logilab.fr>\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
 
 #, python-format
 msgid ""
@@ -466,10 +466,10 @@
 msgid "Download schema as OWL"
 msgstr "Télécharger le schéma au format OWL"
 
+msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Adresse électronique"
 
-msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Adresse électronique"
 
@@ -1113,9 +1113,6 @@
 msgid "add_permission"
 msgstr "permission d'ajout"
 
-msgid "add_permission_object"
-msgstr "a la permission d'ajouter"
-
 msgctxt "CWGroup"
 msgid "add_permission_object"
 msgstr "a la permission d'ajouter"
@@ -1124,6 +1121,9 @@
 msgid "add_permission_object"
 msgstr "a la permission d'ajouter"
 
+msgid "add_permission_object"
+msgstr "a la permission d'ajouter"
+
 msgid "add_relation"
 msgstr "ajouter"
 
@@ -1133,11 +1133,11 @@
 
 #, python-format
 msgid ""
-"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
-"la relation %(rtype)s de %(frometype)s #%(eidfrom)s vers %(toetype)s #"
-"%(eidto)s a été ajoutée"
+"la relation %(rtype)s de %(frometype)s #%(eidfrom)s vers %(toetype)s #%"
+"(eidto)s a été ajoutée"
 
 msgid "addrelated"
 msgstr "ajouter"
@@ -1172,9 +1172,6 @@
 msgid "allowed_transition"
 msgstr "transitions autorisées"
 
-msgid "allowed_transition_object"
-msgstr "états en entrée"
-
 msgctxt "BaseTransition"
 msgid "allowed_transition_object"
 msgstr "transition autorisée de"
@@ -1187,6 +1184,9 @@
 msgid "allowed_transition_object"
 msgstr "transition autorisée de"
 
+msgid "allowed_transition_object"
+msgstr "états en entrée"
+
 msgid "an electronic mail address associated to a short alias"
 msgstr "une adresse électronique associée à un alias"
 
@@ -1270,10 +1270,10 @@
 msgid "bookmarked_by"
 msgstr "utilisé par"
 
+msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "utilise le(s) signet(s)"
 
-msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "utilise le(s) signet(s)"
 
@@ -1315,9 +1315,6 @@
 msgid "by_transition"
 msgstr "transition"
 
-msgid "by_transition_object"
-msgstr "changement d'états"
-
 msgctxt "BaseTransition"
 msgid "by_transition_object"
 msgstr "a pour information"
@@ -1330,6 +1327,9 @@
 msgid "by_transition_object"
 msgstr "a pour information"
 
+msgid "by_transition_object"
+msgstr "changement d'états"
+
 msgid "calendar"
 msgstr "afficher un calendrier"
 
@@ -1372,8 +1372,8 @@
 
 #, python-format
 msgid ""
-"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality="
-"%(card)s"
+"can't set inlined=True, %(stype)s %(rtype)s %(otype)s has cardinality=%(card)"
+"s"
 msgstr ""
 "ne peut mettre 'inlined'=Vrai, %(stype)s %(rtype)s %(otype)s a pour "
 "cardinalité %(card)s"
@@ -1485,10 +1485,10 @@
 msgid "condition"
 msgstr "condition"
 
+msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condition de"
 
-msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condition de"
 
@@ -1498,11 +1498,11 @@
 msgid "config"
 msgstr "configuration"
 
-msgctxt "CWSource"
+msgctxt "CWSourceHostConfig"
 msgid "config"
 msgstr "configuration"
 
-msgctxt "CWSourceHostConfig"
+msgctxt "CWSource"
 msgid "config"
 msgstr "configuration"
 
@@ -1526,10 +1526,10 @@
 msgid "constrained_by"
 msgstr "contraint par"
 
+msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "contrainte de"
 
-msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "contrainte de"
 
@@ -1543,10 +1543,10 @@
 msgid "constraint_of"
 msgstr "contrainte de"
 
+msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "contraint par"
 
-msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "contraint par"
 
@@ -1642,8 +1642,8 @@
 msgstr "création relation %(linkto)s"
 
 msgid ""
-"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource "
-"%(linkto)s)"
+"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource %"
+"(linkto)s)"
 msgstr "création d'une configuration d'hôte pour la source %(linkto)s"
 
 msgid ""
@@ -1736,8 +1736,8 @@
 msgstr "création d'une transition workflow autorisée depuis l'état %(linkto)s"
 
 msgid ""
-"creating WorkflowTransition (WorkflowTransition transition_of Workflow "
-"%(linkto)s)"
+"creating WorkflowTransition (WorkflowTransition transition_of Workflow %"
+"(linkto)s)"
 msgstr "création d'une transition workflow du workflow %(linkto)s"
 
 msgid "creation"
@@ -1759,13 +1759,13 @@
 msgid "cstrtype"
 msgstr "type"
 
-msgid "cstrtype_object"
-msgstr "utilisé par"
-
 msgctxt "CWConstraintType"
 msgid "cstrtype_object"
 msgstr "type des contraintes"
 
+msgid "cstrtype_object"
+msgstr "utilisé par"
+
 msgid "csv entities export"
 msgstr "export d'entités en CSV"
 
@@ -1898,10 +1898,10 @@
 msgid "cw_for_source"
 msgstr "source"
 
+msgctxt "CWSource"
 msgid "cw_for_source_object"
 msgstr "élément de mapping"
 
-msgctxt "CWSource"
 msgid "cw_for_source_object"
 msgstr "élément de mapping"
 
@@ -1912,10 +1912,10 @@
 msgid "cw_host_config_of"
 msgstr "host configuration of"
 
+msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr "has host configuration"
 
-msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr "has host configuration"
 
@@ -1926,6 +1926,7 @@
 msgid "cw_schema"
 msgstr "schéma"
 
+msgctxt "CWEType"
 msgid "cw_schema_object"
 msgstr "mappé par"
 
@@ -1933,7 +1934,7 @@
 msgid "cw_schema_object"
 msgstr "mappé par"
 
-msgctxt "CWEType"
+msgctxt "CWRelation"
 msgid "cw_schema_object"
 msgstr "mappé par"
 
@@ -1941,7 +1942,6 @@
 msgid "cw_schema_object"
 msgstr "mappé par"
 
-msgctxt "CWRelation"
 msgid "cw_schema_object"
 msgstr "mappé par"
 
@@ -2033,10 +2033,10 @@
 msgid "default_workflow"
 msgstr "workflow par défaut"
 
+msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "workflow par défaut de"
 
-msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "workflow par défaut de"
 
@@ -2119,9 +2119,6 @@
 msgid "delete_permission"
 msgstr "permission de supprimer"
 
-msgid "delete_permission_object"
-msgstr "a la permission de supprimer"
-
 msgctxt "CWGroup"
 msgid "delete_permission_object"
 msgstr "peut supprimer"
@@ -2130,14 +2127,17 @@
 msgid "delete_permission_object"
 msgstr "peut supprimer"
 
+msgid "delete_permission_object"
+msgstr "a la permission de supprimer"
+
 #, python-format
 msgid "deleted %(etype)s #%(eid)s (%(title)s)"
 msgstr "suppression de l'entité %(etype)s #%(eid)s (%(title)s)"
 
 #, python-format
 msgid ""
-"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 "relation %(rtype)s de %(frometype)s #%(eidfrom)s vers %(toetype)s #%(eidto)s "
 "supprimée"
@@ -2148,7 +2148,15 @@
 msgid "description"
 msgstr "description"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description"
+msgstr "description"
+
+msgctxt "CWRelation"
+msgid "description"
+msgstr "description"
+
+msgctxt "Workflow"
 msgid "description"
 msgstr "description"
 
@@ -2156,38 +2164,38 @@
 msgid "description"
 msgstr "description"
 
-msgctxt "CWEType"
-msgid "description"
-msgstr "description"
-
-msgctxt "CWRType"
-msgid "description"
-msgstr "description"
-
-msgctxt "CWRelation"
-msgid "description"
-msgstr "description"
-
-msgctxt "State"
-msgid "description"
-msgstr "description"
-
 msgctxt "Transition"
 msgid "description"
 msgstr "description"
 
-msgctxt "Workflow"
-msgid "description"
-msgstr "description"
-
 msgctxt "WorkflowTransition"
 msgid "description"
 msgstr "description"
 
+msgctxt "State"
+msgid "description"
+msgstr "description"
+
+msgctxt "CWRType"
+msgid "description"
+msgstr "description"
+
+msgctxt "BaseTransition"
+msgid "description"
+msgstr "description"
+
 msgid "description_format"
 msgstr "format"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "CWRelation"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "Workflow"
 msgid "description_format"
 msgstr "format"
 
@@ -2195,7 +2203,15 @@
 msgid "description_format"
 msgstr "format"
 
-msgctxt "CWEType"
+msgctxt "Transition"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "WorkflowTransition"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "State"
 msgid "description_format"
 msgstr "format"
 
@@ -2203,23 +2219,7 @@
 msgid "description_format"
 msgstr "format"
 
-msgctxt "CWRelation"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "State"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "Transition"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "Workflow"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "WorkflowTransition"
+msgctxt "BaseTransition"
 msgid "description_format"
 msgstr "format"
 
@@ -2245,21 +2245,21 @@
 msgid "destination_state"
 msgstr "état de destination"
 
+msgctxt "Transition"
+msgid "destination_state"
+msgstr "état de destination"
+
 msgctxt "SubWorkflowExitPoint"
 msgid "destination_state"
 msgstr "état de destination"
 
-msgctxt "Transition"
-msgid "destination_state"
-msgstr "état de destination"
-
-msgid "destination_state_object"
-msgstr "destination de"
-
 msgctxt "State"
 msgid "destination_state_object"
 msgstr "état final de"
 
+msgid "destination_state_object"
+msgstr "destination de"
+
 msgid "detach attached file"
 msgstr "détacher le fichier existant"
 
@@ -2427,6 +2427,9 @@
 msgid "external page"
 msgstr "page externe"
 
+msgid "facet-loading-msg"
+msgstr "en cours de traitement, merci de patienter"
+
 msgid "facet.filters"
 msgstr "facettes"
 
@@ -2526,13 +2529,13 @@
 msgid "for_user"
 msgstr "propriété de l'utilisateur"
 
-msgid "for_user_object"
-msgstr "utilise les propriétés"
-
 msgctxt "CWUser"
 msgid "for_user_object"
 msgstr "a pour préférence"
 
+msgid "for_user_object"
+msgstr "utilise les propriétés"
+
 msgid "friday"
 msgstr "vendredi"
 
@@ -2554,13 +2557,13 @@
 msgid "from_entity"
 msgstr "relation de l'entité"
 
-msgid "from_entity_object"
-msgstr "relation sujet"
-
 msgctxt "CWEType"
 msgid "from_entity_object"
 msgstr "entité de"
 
+msgid "from_entity_object"
+msgstr "relation sujet"
+
 msgid "from_interval_start"
 msgstr "De"
 
@@ -2571,13 +2574,13 @@
 msgid "from_state"
 msgstr "état de départ"
 
-msgid "from_state_object"
-msgstr "transitions depuis cet état"
-
 msgctxt "State"
 msgid "from_state_object"
 msgstr "état de départ de"
 
+msgid "from_state_object"
+msgstr "transitions depuis cet état"
+
 msgid "full text or RQL query"
 msgstr "texte à rechercher ou requête RQL"
 
@@ -2626,16 +2629,16 @@
 "graphical representation of the %(etype)s entity type from %(appid)s data "
 "model"
 msgstr ""
-"réprésentation graphique du modèle de données pour le type d'entité "
-"%(etype)s de %(appid)s"
+"réprésentation graphique du modèle de données pour le type d'entité %(etype)"
+"s de %(appid)s"
 
 #, python-format
 msgid ""
 "graphical representation of the %(rtype)s relation type from %(appid)s data "
 "model"
 msgstr ""
-"réprésentation graphique du modèle de données pour le type de relation "
-"%(rtype)s de %(appid)s"
+"réprésentation graphique du modèle de données pour le type de relation %"
+"(rtype)s de %(appid)s"
 
 msgid "group in which a user should be to be allowed to pass this transition"
 msgstr ""
@@ -2665,6 +2668,9 @@
 msgid "header-right"
 msgstr "en-tête (droite)"
 
+msgid "help"
+msgstr ""
+
 msgid "hide filter form"
 msgstr "cacher le filtre"
 
@@ -2753,13 +2759,13 @@
 msgid "in_group"
 msgstr "fait partie du groupe"
 
-msgid "in_group_object"
-msgstr "membres"
-
 msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "contient les utilisateurs"
 
+msgid "in_group_object"
+msgstr "membres"
+
 msgid "in_state"
 msgstr "état"
 
@@ -2815,10 +2821,10 @@
 msgid "initial_state"
 msgstr "état initial"
 
+msgctxt "State"
 msgid "initial_state_object"
 msgstr "état initial de"
 
-msgctxt "State"
 msgid "initial_state_object"
 msgstr "état initial de"
 
@@ -3119,11 +3125,23 @@
 msgid "name"
 msgstr "nom"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "name"
+msgstr "nom"
+
+msgctxt "Transition"
 msgid "name"
 msgstr "nom"
 
-msgctxt "CWCache"
+msgctxt "CWSource"
+msgid "name"
+msgstr "nom"
+
+msgctxt "Workflow"
+msgid "name"
+msgstr "nom"
+
+msgctxt "CWGroup"
 msgid "name"
 msgstr "nom"
 
@@ -3131,11 +3149,11 @@
 msgid "name"
 msgstr "nom"
 
-msgctxt "CWEType"
+msgctxt "WorkflowTransition"
 msgid "name"
 msgstr "nom"
 
-msgctxt "CWGroup"
+msgctxt "State"
 msgid "name"
 msgstr "nom"
 
@@ -3147,23 +3165,11 @@
 msgid "name"
 msgstr "nom"
 
-msgctxt "CWSource"
-msgid "name"
-msgstr "nom"
-
-msgctxt "State"
+msgctxt "BaseTransition"
 msgid "name"
 msgstr "nom"
 
-msgctxt "Transition"
-msgid "name"
-msgstr "nom"
-
-msgctxt "Workflow"
-msgid "name"
-msgstr "nom"
-
-msgctxt "WorkflowTransition"
+msgctxt "CWCache"
 msgid "name"
 msgstr "nom"
 
@@ -3397,13 +3403,13 @@
 msgid "prefered_form"
 msgstr "forme préférée"
 
-msgid "prefered_form_object"
-msgstr "forme préférée à"
-
 msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "forme préférée de"
 
+msgid "prefered_form_object"
+msgstr "forme préférée à"
+
 msgid "preferences"
 msgstr "préférences"
 
@@ -3420,13 +3426,13 @@
 msgid "primary_email"
 msgstr "email principal"
 
-msgid "primary_email_object"
-msgstr "adresse email principale (object)"
-
 msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "adresse principale de"
 
+msgid "primary_email_object"
+msgstr "adresse email principale (object)"
+
 msgid "profile"
 msgstr "profil"
 
@@ -3454,11 +3460,11 @@
 msgid "read_permission"
 msgstr "permission de lire"
 
-msgctxt "CWAttribute"
+msgctxt "CWEType"
 msgid "read_permission"
 msgstr "permission de lire"
 
-msgctxt "CWEType"
+msgctxt "CWAttribute"
 msgid "read_permission"
 msgstr "permission de lire"
 
@@ -3466,9 +3472,6 @@
 msgid "read_permission"
 msgstr "permission de lire"
 
-msgid "read_permission_object"
-msgstr "a la permission de lire"
-
 msgctxt "CWGroup"
 msgid "read_permission_object"
 msgstr "peut lire"
@@ -3477,6 +3480,9 @@
 msgid "read_permission_object"
 msgstr "peut lire"
 
+msgid "read_permission_object"
+msgstr "a la permission de lire"
+
 msgid "regexp matching host(s) to which this config applies"
 msgstr ""
 "expression régulière des noms d'hôtes auxquels cette configuration s'applique"
@@ -3538,10 +3544,10 @@
 msgid "relation_type"
 msgstr "type de relation"
 
+msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "définition"
 
-msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "définition"
 
@@ -3555,10 +3561,10 @@
 msgid "relations deleted"
 msgstr "relations supprimées"
 
+msgctxt "CWRType"
 msgid "relations_object"
 msgstr "relations de"
 
-msgctxt "CWRType"
 msgid "relations_object"
 msgstr "relations de"
 
@@ -3575,11 +3581,11 @@
 msgid "require_group"
 msgstr "restreinte au groupe"
 
-msgctxt "CWPermission"
+msgctxt "Transition"
 msgid "require_group"
 msgstr "restreinte au groupe"
 
-msgctxt "Transition"
+msgctxt "CWPermission"
 msgid "require_group"
 msgstr "restreinte au groupe"
 
@@ -3587,10 +3593,10 @@
 msgid "require_group"
 msgstr "restreinte au groupe"
 
+msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "a les droits"
 
-msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "a les droits"
 
@@ -3800,10 +3806,10 @@
 msgid "specializes"
 msgstr "spécialise"
 
+msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "parent de"
 
-msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "parent de"
 
@@ -3846,13 +3852,13 @@
 msgid "state_of"
 msgstr "état de"
 
-msgid "state_of_object"
-msgstr "a pour état"
-
 msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "contient les états"
 
+msgid "state_of_object"
+msgstr "a pour état"
+
 msgid "status change"
 msgstr "changer l'état"
 
@@ -3895,20 +3901,20 @@
 msgid "subworkflow_exit"
 msgstr "sortie du sous-workflow"
 
-msgid "subworkflow_exit_object"
-msgstr "états de sortie"
-
 msgctxt "SubWorkflowExitPoint"
 msgid "subworkflow_exit_object"
 msgstr "états de sortie"
 
-msgid "subworkflow_object"
-msgstr "utilisé par la transition"
+msgid "subworkflow_exit_object"
+msgstr "états de sortie"
 
 msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "sous workflow de"
 
+msgid "subworkflow_object"
+msgstr "utilisé par la transition"
+
 msgid "subworkflow_state"
 msgstr "état du sous-workflow"
 
@@ -3916,10 +3922,10 @@
 msgid "subworkflow_state"
 msgstr "état"
 
+msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "état de sortie de"
 
-msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "état de sortie de"
 
@@ -4040,10 +4046,10 @@
 msgid "to_entity"
 msgstr "pour l'entité"
 
+msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "objet de la relation"
 
-msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "objet de la relation"
 
@@ -4057,13 +4063,13 @@
 msgid "to_state"
 msgstr "état de destination"
 
-msgid "to_state_object"
-msgstr "transitions vers cet état"
-
 msgctxt "State"
 msgid "to_state_object"
 msgstr "transition vers cet état"
 
+msgid "to_state_object"
+msgstr "transitions vers cet état"
+
 msgid "today"
 msgstr "aujourd'hui"
 
@@ -4111,10 +4117,10 @@
 msgid "transition_of"
 msgstr "transition de"
 
+msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "a pour transition"
 
-msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "a pour transition"
 
@@ -4131,10 +4137,6 @@
 msgid "type"
 msgstr "type"
 
-msgctxt "CWSource"
-msgid "type"
-msgstr "type"
-
 msgctxt "Transition"
 msgid "type"
 msgstr "type"
@@ -4143,6 +4145,10 @@
 msgid "type"
 msgstr "type"
 
+msgctxt "CWSource"
+msgid "type"
+msgstr "type"
+
 msgid "type here a sparql query"
 msgstr "Tapez une requête sparql"
 
@@ -4231,17 +4237,14 @@
 msgid "update_permission"
 msgstr "permission de modification"
 
+msgctxt "CWEType"
+msgid "update_permission"
+msgstr "permission de modifier"
+
 msgctxt "CWAttribute"
 msgid "update_permission"
 msgstr "permission de modifier"
 
-msgctxt "CWEType"
-msgid "update_permission"
-msgstr "permission de modifier"
-
-msgid "update_permission_object"
-msgstr "a la permission de modifier"
-
 msgctxt "CWGroup"
 msgid "update_permission_object"
 msgstr "peut modifier"
@@ -4250,6 +4253,9 @@
 msgid "update_permission_object"
 msgstr "peut modifier"
 
+msgid "update_permission_object"
+msgstr "a la permission de modifier"
+
 msgid "update_relation"
 msgstr "modifier"
 
@@ -4293,13 +4299,13 @@
 msgid "use_email"
 msgstr "utilise l'adresse électronique"
 
-msgid "use_email_object"
-msgstr "adresse utilisée par"
-
 msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "utilisée par"
 
+msgid "use_email_object"
+msgstr "adresse utilisée par"
+
 msgid "use_template_format"
 msgstr "utilisation du format 'cubicweb template'"
 
@@ -4496,10 +4502,10 @@
 msgid "workflow_of"
 msgstr "workflow de"
 
+msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "a pour workflow"
 
-msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "a pour workflow"
 
--- a/rset.py	Fri May 06 08:48:26 2011 +0200
+++ b/rset.py	Fri May 06 08:52:09 2011 +0200
@@ -475,43 +475,57 @@
         entity.eid = eid
         # cache entity
         req.set_entity_cache(entity)
-        eschema = entity.e_schema
         # try to complete the entity if there are some additional columns
         if len(rowvalues) > 1:
-            rqlst = self.syntax_tree()
-            if rqlst.TYPE == 'select':
-                # UNION query, find the subquery from which this entity has been
-                # found
-                select, col = rqlst.locate_subquery(col, etype, self.args)
+            eschema = entity.e_schema
+            eid_col, attr_cols, rel_cols = self._rset_structure(eschema, col)
+            entity.eid = rowvalues[eid_col]
+            for attr, col_idx in attr_cols.items():
+                entity.cw_attr_cache[attr] = rowvalues[col_idx]
+            for (rtype, role), col_idx in rel_cols.items():
+                value = rowvalues[col_idx]
+                if value is None:
+                    if role == 'subject':
+                        rql = 'Any Y WHERE X %s Y, X eid %s'
+                    else:
+                        rql = 'Any Y WHERE Y %s X, X eid %s'
+                    rrset = ResultSet([], rql % (rtype, entity.eid))
+                    rrset.req = req
+                else:
+                    rrset = self._build_entity(row, col_idx).as_rset()
+                entity.cw_set_relation_cache(rtype, role, rrset)
+        return entity
+
+    @cached
+    def _rset_structure(self, eschema, entity_col):
+        eid_col = col = entity_col
+        rqlst = self.syntax_tree()
+        attr_cols = {}
+        rel_cols = {}
+        if rqlst.TYPE == 'select':
+            # UNION query, find the subquery from which this entity has been
+            # found
+            select, col = rqlst.locate_subquery(entity_col, eschema.type, self.args)
+        else:
+            select = rqlst
+        # take care, due to outer join support, we may find None
+        # values for non final relation
+        for i, attr, role in attr_desc_iterator(select, col, entity_col):
+            if role == 'subject':
+                rschema = eschema.subjrels[attr]
             else:
-                select = rqlst
-            # take care, due to outer join support, we may find None
-            # values for non final relation
-            for i, attr, role in attr_desc_iterator(select, col, entity.cw_col):
-                if role == 'subject':
-                    rschema = eschema.subjrels[attr]
-                    if rschema.final:
-                        if attr == 'eid':
-                            entity.eid = rowvalues[i]
-                        else:
-                            entity.cw_attr_cache[attr] = rowvalues[i]
-                        continue
+                rschema = eschema.objrels[attr]
+            if rschema.final:
+                if attr == 'eid':
+                    eid_col = i
                 else:
-                    rschema = eschema.objrels[attr]
+                    attr_cols[attr] = i
+            else:
                 rdef = eschema.rdef(attr, role)
                 # only keep value if it can't be multivalued
                 if rdef.role_cardinality(role) in '1?':
-                    if rowvalues[i] is None:
-                        if role == 'subject':
-                            rql = 'Any Y WHERE X %s Y, X eid %s'
-                        else:
-                            rql = 'Any Y WHERE Y %s X, X eid %s'
-                        rrset = ResultSet([], rql % (attr, entity.eid))
-                        rrset.req = req
-                    else:
-                        rrset = self._build_entity(row, i).as_rset()
-                    entity.cw_set_relation_cache(attr, role, rrset)
-        return entity
+                    rel_cols[(attr, role)] = i
+        return eid_col, attr_cols, rel_cols
 
     @cached
     def syntax_tree(self):
--- a/server/serverconfig.py	Fri May 06 08:48:26 2011 +0200
+++ b/server/serverconfig.py	Fri May 06 08:52:09 2011 +0200
@@ -255,7 +255,7 @@
     # configuration file (#16102)
     @cached
     def read_sources_file(self):
-        return read_config(self.sources_file())
+        return read_config(self.sources_file(), raise_if_unreadable=True)
 
     def sources(self):
         """return a dictionnaries containing sources definitions indexed by
--- a/server/sources/pyrorql.py	Fri May 06 08:48:26 2011 +0200
+++ b/server/sources/pyrorql.py	Fri May 06 08:52:09 2011 +0200
@@ -437,7 +437,7 @@
         cu = session.pool[self.uri]
         cu.execute('SET %s WHERE X eid %%(x)s' % ','.join(relations), kwargs)
         self._query_cache.clear()
-        entity.clear_all_caches()
+        entity.cw_clear_all_caches()
 
     def delete_entity(self, session, entity):
         """delete an entity from the source"""
@@ -453,8 +453,8 @@
                    {'x': self.eid2extid(subject, session),
                     'y': self.eid2extid(object, session)})
         self._query_cache.clear()
-        session.entity_from_eid(subject).clear_all_caches()
-        session.entity_from_eid(object).clear_all_caches()
+        session.entity_from_eid(subject).cw_clear_all_caches()
+        session.entity_from_eid(object).cw_clear_all_caches()
 
     def delete_relation(self, session, subject, rtype, object):
         """delete a relation from the source"""
@@ -463,8 +463,8 @@
                    {'x': self.eid2extid(subject, session),
                     'y': self.eid2extid(object, session)})
         self._query_cache.clear()
-        session.entity_from_eid(subject).clear_all_caches()
-        session.entity_from_eid(object).clear_all_caches()
+        session.entity_from_eid(subject).cw_clear_all_caches()
+        session.entity_from_eid(object).cw_clear_all_caches()
 
 
 class RQL2RQL(object):
--- a/server/sources/rql2sql.py	Fri May 06 08:48:26 2011 +0200
+++ b/server/sources/rql2sql.py	Fri May 06 08:52:09 2011 +0200
@@ -1357,6 +1357,8 @@
                 operator = ' LIKE '
             else:
                 operator = ' %s ' % operator
+        elif operator == 'REGEXP':
+            return ' %s' % self.dbhelper.sql_regexp_match_expression(rhs.accept(self))
         elif (operator == '=' and isinstance(rhs, Constant)
               and rhs.eval(self._args) is None):
             if lhs is None:
@@ -1407,6 +1409,8 @@
         if constant.type is None:
             return 'NULL'
         value = constant.value
+        if constant.type == 'etype':
+            return value
         if constant.type == 'Int' and  isinstance(constant.parent, SortTerm):
             return value
         if constant.type in ('Date', 'Datetime'):
--- a/server/test/unittest_ldapuser.py	Fri May 06 08:48:26 2011 +0200
+++ b/server/test/unittest_ldapuser.py	Fri May 06 08:52:09 2011 +0200
@@ -239,7 +239,7 @@
         iworkflowable.fire_transition('deactivate')
         try:
             cnx.commit()
-            adim.clear_all_caches()
+            adim.cw_clear_all_caches()
             self.assertEqual(adim.in_state[0].name, 'deactivated')
             trinfo = iworkflowable.latest_trinfo()
             self.assertEqual(trinfo.owned_by[0].login, SYT)
--- a/server/test/unittest_querier.py	Fri May 06 08:48:26 2011 +0200
+++ b/server/test/unittest_querier.py	Fri May 06 08:52:09 2011 +0200
@@ -443,6 +443,15 @@
             self.assertEqual(rset.rows[0][0], result)
             self.assertEqual(rset.description, [('Int',)])
 
+    def test_regexp_based_pattern_matching(self):
+        peid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0]
+        peid2 = self.execute("INSERT Personne X: X nom 'cidule'")[0][0]
+        rset = self.execute('Any X WHERE X is Personne, X nom REGEXP "^b"')
+        self.assertEqual(len(rset.rows), 1, rset.rows)
+        self.assertEqual(rset.rows[0][0], peid1)
+        rset = self.execute('Any X WHERE X is Personne, X nom REGEXP "idu"')
+        self.assertEqual(len(rset.rows), 2, rset.rows)
+
     def test_select_aggregat_count(self):
         rset = self.execute('Any COUNT(X)')
         self.assertEqual(len(rset.rows), 1)
--- a/server/test/unittest_rql2sql.py	Fri May 06 08:48:26 2011 +0200
+++ b/server/test/unittest_rql2sql.py	Fri May 06 08:52:09 2011 +0200
@@ -1331,6 +1331,18 @@
                     '''SELECT SUBSTR(_P.cw_nom, 1, 1)
 FROM cw_Personne AS _P''')
 
+    def test_cast(self):
+        self._check("Any CAST(String, P) WHERE P is Personne",
+                    '''SELECT CAST(_P.cw_eid AS text)
+FROM cw_Personne AS _P''')
+
+    def test_regexp(self):
+        self._check("Any X WHERE X login REGEXP '[0-9].*'",
+                    '''SELECT _X.cw_eid
+FROM cw_CWUser AS _X
+WHERE _X.cw_login ~ [0-9].*
+''')
+
     def test_parser_parse(self):
         for t in self._parse(PARSER):
             yield t
@@ -1630,6 +1642,9 @@
         for t in self._parse(HAS_TEXT_LG_INDEXER):
             yield t
 
+    def test_regexp(self):
+        self.skipTest('regexp-based pattern matching not implemented in sqlserver')
+
     def test_or_having_fake_terms(self):
         self._check('Any X WHERE X is CWUser, X creation_date D HAVING YEAR(D) = "2010" OR D = NULL',
                     '''SELECT _X.cw_eid
@@ -1726,6 +1741,10 @@
         for t in self._parse(WITH_LIMIT):# + ADVANCED_WITH_LIMIT_OR_ORDERBY):
             yield t
 
+    def test_cast(self):
+        self._check("Any CAST(String, P) WHERE P is Personne",
+                    '''SELECT CAST(_P.cw_eid AS nvarchar(max))
+FROM cw_Personne AS _P''')
 
 
 class SqliteSQLGeneratorTC(PostgresSQLGeneratorTC):
@@ -1739,6 +1758,14 @@
                     '''SELECT MONTH(_P.cw_creation_date)
 FROM cw_Personne AS _P''')
 
+    def test_regexp(self):
+        self._check("Any X WHERE X login REGEXP '[0-9].*'",
+                    '''SELECT _X.cw_eid
+FROM cw_CWUser AS _X
+WHERE _X.cw_login REGEXP [0-9].*
+''')
+
+
     def test_union(self):
         for t in self._parse((
             ('(Any N ORDERBY 1 WHERE X name N, X is State)'
@@ -1879,6 +1906,18 @@
                     '''SELECT EXTRACT(MONTH from _P.cw_creation_date)
 FROM cw_Personne AS _P''')
 
+    def test_cast(self):
+        self._check("Any CAST(String, P) WHERE P is Personne",
+                    '''SELECT CAST(_P.cw_eid AS mediumtext)
+FROM cw_Personne AS _P''')
+
+    def test_regexp(self):
+        self._check("Any X WHERE X login REGEXP '[0-9].*'",
+                    '''SELECT _X.cw_eid
+FROM cw_CWUser AS _X
+WHERE _X.cw_login REGEXP [0-9].*
+''')
+
     def test_from_clause_needed(self):
         queries = [("Any 1 WHERE EXISTS(T is CWGroup, T name 'managers')",
                     '''SELECT 1
--- a/server/test/unittest_undo.py	Fri May 06 08:48:26 2011 +0200
+++ b/server/test/unittest_undo.py	Fri May 06 08:52:09 2011 +0200
@@ -150,8 +150,8 @@
         txuuid = self.commit()
         actions = self.cnx.transaction_info(txuuid).actions_list()
         self.assertEqual(len(actions), 1)
-        toto.clear_all_caches()
-        e.clear_all_caches()
+        toto.cw_clear_all_caches()
+        e.cw_clear_all_caches()
         errors = self.cnx.undo_transaction(txuuid)
         undotxuuid = self.commit()
         self.assertEqual(undotxuuid, None) # undo not undoable
@@ -192,7 +192,7 @@
         self.commit()
         errors = self.cnx.undo_transaction(txuuid)
         self.commit()
-        p.clear_all_caches()
+        p.cw_clear_all_caches()
         self.assertEqual(p.fiche[0].eid, c2.eid)
         self.assertEqual(len(errors), 1)
         self.assertEqual(errors[0],
--- a/test/unittest_entity.py	Fri May 06 08:48:26 2011 +0200
+++ b/test/unittest_entity.py	Fri May 06 08:52:09 2011 +0200
@@ -539,7 +539,7 @@
         self.assertEqual(person.rest_path(), 'personne/doe')
         # ambiguity test
         person2 = req.create_entity('Personne', prenom=u'remi', nom=u'doe')
-        person.clear_all_caches()
+        person.cw_clear_all_caches()
         self.assertEqual(person.rest_path(), 'personne/eid/%s' % person.eid)
         self.assertEqual(person2.rest_path(), 'personne/eid/%s' % person2.eid)
         # unique attr with None value (wikiid in this case)
--- a/test/unittest_selectors.py	Fri May 06 08:48:26 2011 +0200
+++ b/test/unittest_selectors.py	Fri May 06 08:52:09 2011 +0200
@@ -193,7 +193,7 @@
 class WorkflowSelectorTC(CubicWebTC):
     def _commit(self):
         self.commit()
-        self.wf_entity.clear_all_caches()
+        self.wf_entity.cw_clear_all_caches()
 
     def setup_database(self):
         wf = self.shell().add_workflow("wf_test", 'StateFull', default=True)
--- a/test/unittest_utils.py	Fri May 06 08:48:26 2011 +0200
+++ b/test/unittest_utils.py	Fri May 06 08:52:09 2011 +0200
@@ -22,8 +22,8 @@
 import datetime
 
 from logilab.common.testlib import TestCase, unittest_main
-
-from cubicweb.utils import make_uid, UStringIO, SizeConstrainedList, RepeatList
+from cubicweb.devtools.testlib import CubicWebTC
+from cubicweb.utils import make_uid, UStringIO, SizeConstrainedList, RepeatList, HTMLHead
 from cubicweb.entity import Entity
 
 try:
@@ -155,6 +155,102 @@
     def test_encoding_unknown_stuff(self):
         self.assertEqual(self.encode(TestCase), 'null')
 
+class HTMLHeadTC(CubicWebTC):
+    def test_concat_urls(self):
+        base_url = u'http://test.fr/data/'
+        head = HTMLHead(base_url)
+        urls = [base_url + u'bob1.js',
+                base_url + u'bob2.js',
+                base_url + u'bob3.js']
+        result = head.concat_urls(urls)
+        expected = u'http://test.fr/data/??bob1.js,bob2.js,bob3.js'
+        self.assertEqual(result, expected)
+
+    def test_group_urls(self):
+        base_url = u'http://test.fr/data/'
+        head = HTMLHead(base_url)
+        urls_spec = [(base_url + u'bob0.js', None),
+                     (base_url + u'bob1.js', None),
+                     (u'http://ext.com/bob2.js', None),
+                     (u'http://ext.com/bob3.js', None),
+                     (base_url + u'bob4.css', 'all'),
+                     (base_url + u'bob5.css', 'all'),
+                     (base_url + u'bob6.css', 'print'),
+                     (base_url + u'bob7.css', 'print'),
+                     (base_url + u'bob8.css', ('all', u'[if IE 8]')),
+                     (base_url + u'bob9.css', ('print', u'[if IE 8]'))
+                     ]
+        result = head.group_urls(urls_spec)
+        expected = [(base_url + u'??bob0.js,bob1.js', None),
+                    (u'http://ext.com/bob2.js', None),
+                    (u'http://ext.com/bob3.js', None),
+                    (base_url + u'??bob4.css,bob5.css', 'all'),
+                    (base_url + u'??bob6.css,bob7.css', 'print'),
+                    (base_url + u'bob8.css', ('all', u'[if IE 8]')),
+                    (base_url + u'bob9.css', ('print', u'[if IE 8]'))
+                    ]
+        self.assertEqual(list(result), expected)
+
+    def test_getvalue_with_concat(self):
+        base_url = u'http://test.fr/data/'
+        head = HTMLHead(base_url)
+        head.add_js(base_url + u'bob0.js')
+        head.add_js(base_url + u'bob1.js')
+        head.add_js(u'http://ext.com/bob2.js')
+        head.add_js(u'http://ext.com/bob3.js')
+        head.add_css(base_url + u'bob4.css')
+        head.add_css(base_url + u'bob5.css')
+        head.add_css(base_url + u'bob6.css', 'print')
+        head.add_css(base_url + u'bob7.css', 'print')
+        head.add_ie_css(base_url + u'bob8.css')
+        head.add_ie_css(base_url + u'bob9.css', 'print', u'[if lt IE 7]')
+        result = head.getvalue()
+        expected = u"""<head>
+<link rel="stylesheet" type="text/css" media="all" href="http://test.fr/data/??bob4.css,bob5.css"/>
+<link rel="stylesheet" type="text/css" media="print" href="http://test.fr/data/??bob6.css,bob7.css"/>
+<!--[if lt IE 8]>
+<link rel="stylesheet" type="text/css" media="all" href="http://test.fr/data/bob8.css"/>
+<!--[if lt IE 7]>
+<link rel="stylesheet" type="text/css" media="print" href="http://test.fr/data/bob9.css"/>
+<![endif]--> 
+<script type="text/javascript" src="http://test.fr/data/??bob0.js,bob1.js"></script>
+<script type="text/javascript" src="http://ext.com/bob2.js"></script>
+<script type="text/javascript" src="http://ext.com/bob3.js"></script>
+</head>
+"""
+        self.assertEqual(result, expected)
+
+    def test_getvalue_without_concat(self):
+        base_url = u'http://test.fr/data/'
+        head = HTMLHead()
+        head.add_js(base_url + u'bob0.js')
+        head.add_js(base_url + u'bob1.js')
+        head.add_js(u'http://ext.com/bob2.js')
+        head.add_js(u'http://ext.com/bob3.js')
+        head.add_css(base_url + u'bob4.css')
+        head.add_css(base_url + u'bob5.css')
+        head.add_css(base_url + u'bob6.css', 'print')
+        head.add_css(base_url + u'bob7.css', 'print')
+        head.add_ie_css(base_url + u'bob8.css')
+        head.add_ie_css(base_url + u'bob9.css', 'print', u'[if lt IE 7]')
+        result = head.getvalue()
+        expected = u"""<head>
+<link rel="stylesheet" type="text/css" media="all" href="http://test.fr/data/bob4.css"/>
+<link rel="stylesheet" type="text/css" media="all" href="http://test.fr/data/bob5.css"/>
+<link rel="stylesheet" type="text/css" media="print" href="http://test.fr/data/bob6.css"/>
+<link rel="stylesheet" type="text/css" media="print" href="http://test.fr/data/bob7.css"/>
+<!--[if lt IE 8]>
+<link rel="stylesheet" type="text/css" media="all" href="http://test.fr/data/bob8.css"/>
+<!--[if lt IE 7]>
+<link rel="stylesheet" type="text/css" media="print" href="http://test.fr/data/bob9.css"/>
+<![endif]--> 
+<script type="text/javascript" src="http://test.fr/data/bob0.js"></script>
+<script type="text/javascript" src="http://test.fr/data/bob1.js"></script>
+<script type="text/javascript" src="http://ext.com/bob2.js"></script>
+<script type="text/javascript" src="http://ext.com/bob3.js"></script>
+</head>
+"""
+        self.assertEqual(result, expected)
 
 if __name__ == '__main__':
     unittest_main()
--- a/toolsutils.py	Fri May 06 08:48:26 2011 +0200
+++ b/toolsutils.py	Fri May 06 08:52:09 2011 +0200
@@ -159,15 +159,11 @@
         print '-> set permissions to 0600 for %s' % filepath
     chmod(filepath, 0600)
 
-def read_config(config_file):
-    """read the instance configuration from a file and return it as a
-    dictionnary
-
-    :type config_file: str
-    :param config_file: path to the configuration file
-
-    :rtype: dict
-    :return: a dictionary with specified values associated to option names
+def read_config(config_file, raise_if_unreadable=False):
+    """read some simple configuration from `config_file` and return it as a
+    dictionary. If `raise_if_unreadable` is false (the default), an empty
+    dictionary will be returned if the file is inexistant or unreadable, else
+    :exc:`ExecutionError` will be raised.
     """
     from logilab.common.fileutils import lines
     config = current = {}
@@ -190,8 +186,12 @@
             value = value.strip()
             current[option] = value or None
     except IOError, ex:
-        warning('missing or non readable configuration file %s (%s)',
-                config_file, ex)
+        if raise_if_unreadable:
+            raise ExecutionError('%s. Are you logged with the correct user '
+                                 'to use this instance?' % ex)
+        else:
+            warning('missing or non readable configuration file %s (%s)',
+                    config_file, ex)
     return config
 
 
--- a/utils.py	Fri May 06 08:48:26 2011 +0200
+++ b/utils.py	Fri May 06 08:52:09 2011 +0200
@@ -240,7 +240,7 @@
     xhtml_safe_script_opening = u'<script type="text/javascript"><!--//--><![CDATA[//><!--\n'
     xhtml_safe_script_closing = u'\n//--><!]]></script>'
 
-    def __init__(self):
+    def __init__(self, datadir_url=None):
         super(HTMLHead, self).__init__()
         self.jsvars = []
         self.jsfiles = []
@@ -248,6 +248,7 @@
         self.ie_cssfiles = []
         self.post_inlined_scripts = []
         self.pagedata_unload = False
+        self.datadir_url = datadir_url
 
 
     def add_raw(self, rawheader):
@@ -284,7 +285,7 @@
         if jsfile not in self.jsfiles:
             self.jsfiles.append(jsfile)
 
-    def add_css(self, cssfile, media):
+    def add_css(self, cssfile, media='all'):
         """adds `cssfile` to the list of javascripts used in the webpage
 
         This function checks if the file has already been added
@@ -304,6 +305,45 @@
             self.post_inlined_scripts.append(self.js_unload_code)
             self.pagedata_unload = True
 
+    def concat_urls(self, urls):
+        """concatenates urls into one url usable by Apache mod_concat
+
+        This method returns the url without modifying it if there is only
+        one element in the list
+        :param urls: list of local urls/filenames to concatenate
+        """
+        if len(urls) == 1:
+            return urls[0]
+        len_prefix = len(self.datadir_url)
+        concated = u','.join(url[len_prefix:] for url in urls)
+        return (u'%s??%s' % (self.datadir_url, concated))
+
+    def group_urls(self, urls_spec):
+        """parses urls_spec in order to generate concatenated urls
+        for js and css includes
+
+        This method checks if the file is local and if it shares options
+        with direct neighbors
+        :param urls_spec: entire list of urls/filenames to inspect
+        """
+        concatable = []
+        prev_islocal = False
+        prev_key = None
+        for url, key in urls_spec:
+            islocal = url.startswith(self.datadir_url)
+            if concatable and (islocal != prev_islocal or key != prev_key):
+                yield (self.concat_urls(concatable), prev_key)
+                del concatable[:]
+            if not islocal:
+                yield (url, key)
+            else:
+                concatable.append(url)
+            prev_islocal = islocal
+            prev_key = key
+        if concatable:
+            yield (self.concat_urls(concatable), prev_key)
+
+
     def getvalue(self, skiphead=False):
         """reimplement getvalue to provide a consistent (and somewhat browser
         optimzed cf. http://stevesouders.com/cuzillion) order in external
@@ -321,18 +361,20 @@
                 w(vardecl + u'\n')
             w(self.xhtml_safe_script_closing)
         # 2/ css files
-        for cssfile, media in self.cssfiles:
+        for cssfile, media in (self.group_urls(self.cssfiles) if self.datadir_url else self.cssfiles):
             w(u'<link rel="stylesheet" type="text/css" media="%s" href="%s"/>\n' %
               (media, xml_escape(cssfile)))
         # 3/ ie css if necessary
         if self.ie_cssfiles:
-            for cssfile, media, iespec in self.ie_cssfiles:
+            ie_cssfiles = ((x, (y, z)) for x, y, z in self.ie_cssfiles)
+            for cssfile, (media, iespec) in (self.group_urls(ie_cssfiles) if self.datadir_url else ie_cssfiles):
                 w(u'<!--%s>\n' % iespec)
                 w(u'<link rel="stylesheet" type="text/css" media="%s" href="%s"/>\n' %
                   (media, xml_escape(cssfile)))
             w(u'<![endif]--> \n')
         # 4/ js files
-        for jsfile in self.jsfiles:
+        jsfiles = ((x, None) for x in self.jsfiles)
+        for jsfile, media in self.group_urls(jsfiles) if self.datadir_url else jsfiles:
             w(u'<script type="text/javascript" src="%s"></script>\n' %
               xml_escape(jsfile))
         # 5/ post inlined scripts (i.e. scripts depending on other JS files)
--- a/vregistry.py	Fri May 06 08:48:26 2011 +0200
+++ b/vregistry.py	Fri May 06 08:52:09 2011 +0200
@@ -184,7 +184,10 @@
 
         raise :exc:`NoSelectableObject` if not object apply
         """
-        return self._select_best(self[__oid], *args, **kwargs)
+        obj =  self._select_best(self[__oid], *args, **kwargs)
+        if obj is None:
+            raise NoSelectableObject(args, kwargs, self[__oid] )
+        return obj
 
     def select_or_none(self, __oid, *args, **kwargs):
         """return the most specific object among those with the given oid
@@ -202,16 +205,18 @@
         context
         """
         for appobjects in self.itervalues():
-            try:
-                yield self._select_best(appobjects, *args, **kwargs)
-            except NoSelectableObject:
+            obj = self._select_best(appobjects,  *args, **kwargs)
+            if obj is None:
                 continue
+            yield obj
 
     def _select_best(self, appobjects, *args, **kwargs):
         """return an instance of the most specific object according
         to parameters
 
-        raise `NoSelectableObject` if not object apply
+        return None if not object apply (don't raise `NoSelectableObject` since
+        it's costly when searching appobjects using `possible_objects`
+        (e.g. searching for hooks).
         """
         if len(args) > 1:
             warn('[3.5] only the request param can not be named when calling select*',
@@ -224,7 +229,7 @@
             elif appobjectscore > 0 and appobjectscore == score:
                 winners.append(appobject)
         if winners is None:
-            raise NoSelectableObject(args, kwargs, appobjects)
+            return None
         if len(winners) > 1:
             # log in production environement / test, error while debugging
             msg = 'select ambiguity: %s\n(args: %s, kwargs: %s)'
--- a/web/controller.py	Fri May 06 08:48:26 2011 +0200
+++ b/web/controller.py	Fri May 06 08:52:09 2011 +0200
@@ -165,7 +165,7 @@
         elif self._edited_entity:
             # clear caches in case some attribute participating to the rest path
             # has been modified
-            self._edited_entity.clear_all_caches()
+            self._edited_entity.cw_clear_all_caches()
             path = self._edited_entity.rest_path()
         else:
             path = 'view'
--- a/web/data/cubicweb.ajax.js	Fri May 06 08:48:26 2011 +0200
+++ b/web/data/cubicweb.ajax.js	Fri May 06 08:52:09 2011 +0200
@@ -86,6 +86,41 @@
 
 var JSON_BASE_URL = baseuri() + 'json?';
 
+/**
+ * returns true if `url` is a mod_concat-like url
+ * (e.g. http://..../data??resource1.js,resource2.js)
+ */
+function _modconcatLikeUrl(url) {
+    var base = baseuri();
+    if (!base.endswith('/')) {
+        base += '/';
+    }
+    var modconcat_rgx = new RegExp('(' + base + 'data/([a-z0-9]+/)?)\\?\\?(.+)');
+    return modconcat_rgx.exec(url);
+}
+
+/**
+ * decomposes a mod_concat-like url into its corresponding list of
+ * resources' urls
+ *
+ * >>> _listResources('http://foo.com/data/??a.js,b.js,c.js')
+ * ['http://foo.com/data/a.js', 'http://foo.com/data/b.js', 'http://foo.com/data/c.js']
+ */
+function _listResources(src) {
+    var resources = [];
+    var groups = _modconcatLikeUrl(src);
+    if (groups == null) {
+        resources.push(src);
+    } else {
+        var dataurl = groups[1];
+        $.each(cw.utils.lastOf(groups).split(','),
+               function() {
+                   resources.push(dataurl + this);
+               });
+    }
+    return resources;
+}
+
 //============= utility function handling remote calls responses. ==============//
 function _loadAjaxHtmlHead($node, $head, tag, srcattr) {
     var jqtagfilter = tag + '[' + srcattr + ']';
@@ -93,29 +128,32 @@
         cw['loaded_'+srcattr] = [];
         var loaded = cw['loaded_'+srcattr];
         jQuery('head ' + jqtagfilter).each(function(i) {
-                   loaded.push(this.getAttribute(srcattr));
-               });
+            // tab1.push.apply(tab1, tab2) <=> tab1 += tab2 (python-wise)
+            loaded.push.apply(loaded, _listResources(this.getAttribute(srcattr)));
+        });
     } else {
         var loaded = cw['loaded_'+srcattr];
     }
     $node.find(tag).each(function(i) {
-        var url = this.getAttribute(srcattr);
+        var srcnode = this;
+        var url = srcnode.getAttribute(srcattr);
         if (url) {
-            if (jQuery.inArray(url, loaded) == -1) {
-                // take care to <script> tags: jQuery append method script nodes
-                // don't appears in the DOM (See comments on
-                // http://api.jquery.com/append/), which cause undesired
-                // duplicated load in our case. After trying to use bare DOM api
-                // to avoid this, we switched to handle a list of already loaded
-                // stuff ourselves, since bare DOM api gives bug with the
-                // server-response event, since we loose control on when the
-                // script is loaded (jQuery load it immediatly).
-                loaded.push(url);
-                jQuery(this).appendTo($head);
-            }
-        } else {
-            jQuery(this).appendTo($head);
+            $.each(_listResources(url), function() {
+                var resource = '' + this; // implicit object->string cast
+                if ($.inArray(resource, loaded) == -1) {
+                    // take care to <script> tags: jQuery append method script nodes
+                    // don't appears in the DOM (See comments on
+                    // http://api.jquery.com/append/), which cause undesired
+                    // duplicated load in our case. After trying to use bare DOM api
+                    // to avoid this, we switched to handle a list of already loaded
+                    // stuff ourselves, since bare DOM api gives bug with the
+                    // server-response event, since we loose control on when the
+                    // script is loaded (jQuery load it immediatly).
+                    loaded.push(resource);
+                }
+            });
         }
+	jQuery(srcnode).appendTo($head);
     });
     $node.find(jqtagfilter).remove();
 }
--- a/web/data/cubicweb.facets.css	Fri May 06 08:48:26 2011 +0200
+++ b/web/data/cubicweb.facets.css	Fri May 06 08:52:09 2011 +0200
@@ -109,11 +109,15 @@
 div#facetLoading {
   display: none;
   position: fixed;
-  padding-left: 20px;
+  background: #f2f2f2;
   top: 400px;
   width: 200px;
-  height: 100px;
+  padding: 1em;
   font-size:      120%;
   font-weight:    bold;
   text-align:     center;
 }
+
+div.facetTitleSelected {
+  background: url("required.png") no-repeat right top;
+}
--- a/web/data/cubicweb.facets.js	Fri May 06 08:48:26 2011 +0200
+++ b/web/data/cubicweb.facets.js	Fri May 06 08:52:09 2011 +0200
@@ -238,6 +238,18 @@
     });
 }
 
+// change css class of facets that have a value selected
+function updateFacetTitles() {
+    $('.facet').each(function() {
+        var $divTitle = $(this).find('.facetTitle');
+        var facetSelected = $(this).find('.facetValueSelected');
+        if (facetSelected.length) {
+            $divTitle.addClass('facetTitleSelected');
+        } else {
+            $divTitle.removeClass('facetTitleSelected');
+        }
+    });
+}
 
 // we need to differenciate cases where initFacetBoxEvents is called with one
 // argument or without any argument. If we use `initFacetBoxEvents` as the
@@ -245,4 +257,34 @@
 // his, so we use this small anonymous function instead.
 jQuery(document).ready(function() {
     initFacetBoxEvents();
+    jQuery(cw).bind('facets-content-loaded', onFacetContentLoaded);
+    jQuery(cw).bind('facets-content-loading', onFacetFiltering);
+    jQuery(cw).bind('facets-content-loading', updateFacetTitles);
 });
+
+function showFacetLoading(parentid) {
+    var loadingWidth = 200; // px
+    var loadingHeight = 100; // px
+    var $msg = jQuery('#facetLoading');
+    var $parent = jQuery('#' + parentid);
+    var leftPos = $parent.offset().left + ($parent.width() - loadingWidth) / 2;
+    $parent.fadeTo('normal', 0.2);
+    $msg.css('left', leftPos).show();
+}
+
+function onFacetFiltering(event, divid /* ... */) {
+    showFacetLoading(divid);
+}
+
+function onFacetContentLoaded(event, divid, rql, vid, extraparams) {
+    jQuery('#facetLoading').hide();
+}
+
+jQuery(document).ready(function () {
+    if (jQuery('div.facetBody').length) {
+        var $loadingDiv = $(DIV({id:'facetLoading'},
+                                facetLoadingMsg));
+        $loadingDiv.corner();
+        $('body').append($loadingDiv);
+    }
+});
--- a/web/data/cubicweb.js	Fri May 06 08:48:26 2011 +0200
+++ b/web/data/cubicweb.js	Fri May 06 08:52:09 2011 +0200
@@ -308,6 +308,17 @@
     },
 
     /**
+     * returns the last element of an array-like object or undefined if empty
+     */
+    lastOf: function(array) {
+        if (array.length) {
+            return array[array.length-1];
+        } else {
+            return undefined;
+        }
+    },
+
+    /**
      * .. function:: difference(lst1, lst2)
      *
      * returns a list containing all elements in `lst1` that are not
--- a/web/request.py	Fri May 06 08:48:26 2011 +0200
+++ b/web/request.py	Fri May 06 08:52:09 2011 +0200
@@ -92,7 +92,7 @@
             self.uiprops = vreg.config.uiprops
             self.datadir_url = vreg.config.datadir_url
         # raw html headers that can be added from any view
-        self.html_headers = HTMLHead()
+        self.html_headers = HTMLHead(self.datadir_url)
         # form parameters
         self.setup_params(form)
         # dictionnary that may be used to store request data that has to be
@@ -256,7 +256,7 @@
         """used by AutomaticWebTest to clear html headers between tests on
         the same resultset
         """
-        self.html_headers = HTMLHead()
+        self.html_headers = HTMLHead(self.datadir_url)
         return self
 
     # web state helpers #######################################################
@@ -415,7 +415,8 @@
 
     @cached # so it's writed only once
     def fckeditor_config(self):
-        self.add_js('fckeditor/fckeditor.js')
+        fckeditor_url = self.build_url('fckeditor/fckeditor.js')
+        self.add_js(fckeditor_url, localfile=False)
         self.html_headers.define_var('fcklang', self.lang)
         self.html_headers.define_var('fckconfigpath',
                                      self.data_url('cubicweb.fckcwconfig.js'))
@@ -888,10 +889,20 @@
 def _parse_accept_header(raw_header, value_parser=None, value_sort_key=None):
     """returns an ordered list accepted types
 
-    returned value is a list of 2-tuple (value, score), ordered
-    by score. Exact type of `value` will depend on what `value_parser`
-    will reutrn. if `value_parser` is None, then the raw value, as found
-    in the http header, is used.
+    :param value_parser: a function to parse a raw accept chunk. If None
+    is provided, the function defaults to identity. If a function is provided,
+    it must accept 2 parameters ``value`` and ``other_params``. ``value`` is
+    the value found before the first ';', `other_params` is a dictionary
+    built from all other chunks after this first ';'
+
+    :param value_sort_key: a key function to sort values found in the accept
+    header. This function will be passed a 3-tuple
+    (raw_value, parsed_value, score). If None is provided, the default
+    sort_key is 1./score
+
+    :return: a list of 3-tuple (raw_value, parsed_value, score),
+    ordered by score. ``parsed_value`` will be the return value of
+    ``value_parser(raw_value)``
     """
     if value_sort_key is None:
         value_sort_key = lambda infos: 1./infos[-1]
@@ -926,7 +937,7 @@
     'text/html;level=1', `mimetypeinfo` will be ('text', '*', {'level': '1'})
     """
     try:
-        media_type, media_subtype = value.strip().split('/')
+        media_type, media_subtype = value.strip().split('/', 1)
     except ValueError: # safety belt : '/' should always be present
         media_type = value.strip()
         media_subtype = '*'
--- a/web/test/unittest_views_basecontrollers.py	Fri May 06 08:48:26 2011 +0200
+++ b/web/test/unittest_views_basecontrollers.py	Fri May 06 08:52:09 2011 +0200
@@ -194,7 +194,7 @@
                     'use_email-object:'+emaileid: peid,
                     }
         path, params = self.expect_redirect_publish(req, 'edit')
-        email.clear_all_caches()
+        email.cw_clear_all_caches()
         self.assertEqual(email.address, 'adim@logilab.fr')
 
 
--- a/web/views/facets.py	Fri May 06 08:48:26 2011 +0200
+++ b/web/views/facets.py	Fri May 06 08:52:09 2011 +0200
@@ -73,6 +73,7 @@
         req = self._cw
         req.add_js( self.needs_js )
         req.add_css( self.needs_css)
+        req.html_headers.define_var('facetLoadingMsg', req._('facet-loading-msg'))
         if self.roundcorners:
             req.html_headers.add_onload('jQuery(".facet").corner("tl br 10px");')
         rset, vid, divid, paginate = self._get_context()
--- a/web/views/urlpublishing.py	Fri May 06 08:48:26 2011 +0200
+++ b/web/views/urlpublishing.py	Fri May 06 08:52:09 2011 +0200
@@ -260,9 +260,8 @@
             else:
                 try:
                     action = actionsreg._select_best(actions, req, rset=rset)
+                    if action is not None:
+                        raise Redirect(action.url())
                 except RegistryException:
-                    continue
-                else:
-                    # XXX avoid redirect
-                    raise Redirect(action.url())
+                    pass # continue searching
         raise PathDontMatch()
--- a/web/webconfig.py	Fri May 06 08:48:26 2011 +0200
+++ b/web/webconfig.py	Fri May 06 08:52:09 2011 +0200
@@ -300,19 +300,14 @@
         if not (self.repairing or self.creating):
             self.global_set_option('base-url', baseurl)
         httpsurl = self['https-url']
+        datadir_path = 'data/' if self.debugmode else 'data/%s/' % self.instance_md5_version()
         if httpsurl:
             if httpsurl[-1] != '/':
                 httpsurl += '/'
                 if not self.repairing:
                     self.global_set_option('https-url', httpsurl)
-            if self.debugmode:
-                self.https_datadir_url = httpsurl + 'data/'
-            else:
-                self.https_datadir_url = httpsurl + 'data%s/' % self.instance_md5_version()
-        if self.debugmode:
-            self.datadir_url = baseurl + 'data/'
-        else:
-            self.datadir_url = baseurl + 'data%s/' % self.instance_md5_version()
+            self.https_datadir_url = httpsurl + datadir_path
+        self.datadir_url = baseurl + datadir_path
 
     def _build_ui_properties(self):
         # self.datadir_url[:-1] to remove trailing /
--- a/web/webctl.py	Fri May 06 08:48:26 2011 +0200
+++ b/web/webctl.py	Fri May 06 08:52:09 2011 +0200
@@ -21,9 +21,22 @@
 
 __docformat__ = "restructuredtext en"
 
+import os, os.path as osp
+from shutil import copy
+
 from logilab.common.shellutils import ASK
 
-from cubicweb.toolsutils import CommandHandler, underline_title
+from cubicweb import ExecutionError
+from cubicweb.cwctl import CWCTL
+from cubicweb.cwconfig import CubicWebConfiguration as cwcfg
+from cubicweb.toolsutils import Command, CommandHandler, underline_title
+
+
+try:
+    from os import symlink as linkdir
+except ImportError:
+    from shutil import copytree as linkdir
+
 
 class WebCreateHandler(CommandHandler):
     cmdname = 'create'
@@ -43,3 +56,57 @@
 
     def postcreate(self, *args, **kwargs):
         """hooks called once instance's initialization has been completed"""
+
+
+class GenStaticDataDir(Command):
+    """Create a directory merging all data directory content from cubes and CW.
+    """
+    name = 'gen-static-datadir'
+    arguments = '<instance> [dirpath]'
+    min_args = 1
+    max_args = 2
+
+    options = ()
+
+    def run(self, args):
+        appid = args.pop(0)
+        config = cwcfg.config_for(appid)
+        if args:
+            dest = args[0]
+        else:
+            dest = osp.join(config.appdatahome, 'data')
+        if osp.exists(dest):
+            raise ExecutionError('Directory %s already exists. '
+                                 'Remove it first.' % dest)
+        config.quick_start = True # notify this is not a regular start
+        # list all resources (no matter their order)
+        resources = set()
+        for datadir in self._datadirs(config):
+            for dirpath, dirnames, filenames in os.walk(datadir):
+                rel_dirpath = dirpath[len(datadir)+1:]
+                resources.update(osp.join(rel_dirpath, f) for f in filenames)
+        # locate resources and copy them to destination
+        for resource in resources:
+            dirname = osp.dirname(resource)
+            dest_resource = osp.join(dest, dirname)
+            if not osp.isdir(dest_resource):
+                os.makedirs(dest_resource)
+            resource_dir, resource_path = config.locate_resource(resource)
+            copy(osp.join(resource_dir, resource_path), dest_resource)
+        # handle md5 version subdirectory
+        linkdir(dest, osp.join(dest, config.instance_md5_version()))
+        print ('You can use apache rewrite rule below :\n'
+               'RewriteRule ^/data/(.*) %s/$1 [L]' % dest)
+
+    def _datadirs(self, config):
+        repo = config.repository()
+        if config._cubes is None:
+            # web only config
+            config.init_cubes(repo.get_cubes())
+        for cube in repo.get_cubes():
+            cube_datadir = osp.join(cwcfg.cube_dir(cube), 'data')
+            if osp.isdir(cube_datadir):
+                yield cube_datadir
+        yield osp.join(config.shared_dir(), 'data')
+
+CWCTL.register(GenStaticDataDir)