Merge 3.24 branch
authorDenis Laxalde <denis.laxalde@logilab.fr>
Fri, 18 Nov 2016 15:42:10 +0100
changeset 11841 48adf4dd1ce6
parent 11840 1eb3d6cd39c3 (current diff)
parent 11839 18e72d24dc58 (diff)
child 11850 87443f279b0f
Merge 3.24 branch
cubicweb/__pkginfo__.py
debian/cubicweb-common.install
debian/cubicweb-ctl.bash_completion
debian/cubicweb-ctl.cubicweb.init
debian/cubicweb-ctl.install
debian/cubicweb-ctl.logrotate
debian/cubicweb-ctl.postinst
debian/cubicweb-dev.install
debian/cubicweb-dev.lintian-overrides
debian/cubicweb-documentation.doc-base
debian/cubicweb-documentation.install
debian/cubicweb-server.install
debian/cubicweb-server.postinst
debian/cubicweb-server.prerm
debian/cubicweb-twisted.install
debian/cubicweb-twisted.postinst
debian/cubicweb-twisted.prerm
debian/cubicweb-web.install
debian/cubicweb-web.lintian-overrides
debian/pydist-overrides
--- a/.hgignore	Thu Nov 17 11:00:01 2016 +0100
+++ b/.hgignore	Fri Nov 18 15:42:10 2016 +0100
@@ -12,6 +12,14 @@
 \.swp$
 ^doc/book/en/apidoc$
 \.old$
+\.pybuild
+debian/python-cubicweb
+debian/*.log
+debian/*.substvars
+debian/cubicweb-doc
+debian/cubicweb
+debian/files
+
 syntax: regexp
 .*/data.*/database/.*
 .*/data/ldapdb/.*
--- a/.hgtags	Thu Nov 17 11:00:01 2016 +0100
+++ b/.hgtags	Fri Nov 18 15:42:10 2016 +0100
@@ -581,3 +581,6 @@
 8b287ad7b95bbd3b30914b3e98c26b5bb789b9bf debian/3.23.2-1
 9f7949b63ab2214827a873cc26068cadb658142f 3.24.0
 9f7949b63ab2214827a873cc26068cadb658142f centos/3.24.0-1
+da52fda6f15b76823361bb64c9b69686707137c2 3.24.1
+da52fda6f15b76823361bb64c9b69686707137c2 debian/3.24.1-1
+da52fda6f15b76823361bb64c9b69686707137c2 centos/3.24.1-1
--- a/MANIFEST.in	Thu Nov 17 11:00:01 2016 +0100
+++ b/MANIFEST.in	Fri Nov 18 15:42:10 2016 +0100
@@ -5,8 +5,11 @@
 include pylintrc
 include jshintrc
 include tox.ini
+include flake8-ok-files.txt
+
 include bin/cubicweb-*
 include man/cubicweb-ctl.1
+recursive-include extras *.bash_completion
 
 include doc/*.rst
 include doc/*.txt
--- a/cubicweb.spec	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb.spec	Fri Nov 18 15:42:10 2016 +0100
@@ -8,7 +8,7 @@
 %{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
 
 Name:           cubicweb
-Version:        3.24.0
+Version:        3.24.1
 Release:        logilab.1%{?dist}
 Summary:        CubicWeb is a semantic web application framework
 Source0:        https://pypi.python.org/packages/source/c/cubicweb/cubicweb-%{version}.tar.gz
--- a/cubicweb/__init__.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/__init__.py	Fri Nov 18 15:42:10 2016 +0100
@@ -29,24 +29,27 @@
 import warnings
 import zlib
 
-warnings.filterwarnings('ignore', category=UserWarning,
-                        message='.*was already imported',
-                        module='.*pygments')
-
-
 from six import PY2, binary_type, text_type
 from six.moves import builtins
 
+from logilab.common.deprecation import deprecated
+from logilab.common.logging_ext import set_log_methods
+from yams.constraints import BASE_CONVERTERS, BASE_CHECKERS
+from yams.schema import role_name as rname
+
+from cubicweb.__pkginfo__ import version as __version__   # noqa
+
+# make all exceptions accessible from the package
+from logilab.common.registry import ObjectNotFound, NoSelectableObject, RegistryNotFound  # noqa
+from yams import ValidationError
+from cubicweb._exceptions import *  # noqa
+
 if PY2:
     # http://bugs.python.org/issue10211
     from StringIO import StringIO as BytesIO
 else:
     from io import BytesIO
 
-from logilab.common.deprecation import deprecated
-from logilab.common.logging_ext import set_log_methods
-from yams.constraints import BASE_CONVERTERS, BASE_CHECKERS
-
 # ignore the pygments UserWarnings
 warnings.filterwarnings('ignore', category=UserWarning,
                         message='.*was already imported',
@@ -54,21 +57,12 @@
 
 # pre python 2.7.2 safety
 logging.basicConfig()
+set_log_methods(sys.modules[__name__], logging.getLogger('cubicweb'))
 
 # this is necessary for i18n devtools test where chdir is done while __path__ is relative, which
 # breaks later imports
-__path__[0] = os.path.abspath(__path__[0])
-CW_SOFTWARE_ROOT = __path__[0]
-
-
-from cubicweb.__pkginfo__ import version as __version__   # noqa
-
-
-set_log_methods(sys.modules[__name__], logging.getLogger('cubicweb'))
-
-# make all exceptions accessible from the package
-from cubicweb._exceptions import *  # noqa
-from logilab.common.registry import ObjectNotFound, NoSelectableObject, RegistryNotFound  # noqa
+__path__[0] = os.path.abspath(__path__[0])  # noqa
+CW_SOFTWARE_ROOT = __path__[0]  # noqa
 
 
 # '_' is available to mark internationalized string but should not be used to
@@ -163,6 +157,8 @@
 
 def check_password(eschema, value):
     return isinstance(value, (binary_type, Binary))
+
+
 BASE_CHECKERS['Password'] = check_password
 
 
@@ -170,6 +166,8 @@
     if isinstance(value, Binary):
         return value
     return binary_type(value)
+
+
 BASE_CONVERTERS['Password'] = str_or_binary
 
 
@@ -230,6 +228,7 @@
             else:
                 callback(context, *args, **kwargs)
 
+
 CW_EVENT_MANAGER = CubicWebEventManager()
 
 
@@ -249,9 +248,6 @@
     return _decorator
 
 
-from yams.schema import role_name as rname
-
-
 def validation_error(entity, errors, substitutions=None, i18nvalues=None):
     """easy way to retrieve a :class:`cubicweb.ValidationError` for an entity or eid.
 
--- a/cubicweb/cwgettext.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/cwgettext.py	Fri Nov 18 15:42:10 2016 +0100
@@ -18,6 +18,8 @@
 
 import gettext
 
+from six import PY3
+
 
 class cwGNUTranslations(gettext.GNUTranslations):
     # The encoding of a msgctxt and a msgid in a .mo file is
@@ -83,6 +85,9 @@
             else:
                 return msgid2
 
+    if PY3:
+        ugettext = gettext.GNUTranslations.gettext
+
     def upgettext(self, context, message):
         ctxt_message_id = self.CONTEXT_ENCODING % (context, message)
         missing = object()
--- a/cubicweb/dataimport/stores.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/dataimport/stores.py	Fri Nov 18 15:42:10 2016 +0100
@@ -63,7 +63,7 @@
 from copy import copy
 from itertools import count
 
-from six import text_type, add_metaclass
+from six import add_metaclass
 
 import pytz
 
--- a/cubicweb/devtools/devctl.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/devtools/devctl.py	Fri Nov 18 15:42:10 2016 +0100
@@ -102,6 +102,7 @@
 
 def cleanup_sys_modules(config):
     # cleanup sys.modules, required when we're updating multiple cubes
+    appobjects_path = config.appobjects_path()
     for name, mod in list(sys.modules.items()):
         if mod is None:
             # duh ? logilab.common.os for instance
@@ -112,7 +113,7 @@
         if mod.__file__ is None:
             # odd/rare but real
             continue
-        for path in config.appobjects_path():
+        for path in appobjects_path:
             if mod.__file__.startswith(path):
                 del sys.modules[name]
                 break
@@ -568,8 +569,12 @@
     cubedir = osp.abspath(osp.normpath(cubedir))
     workdir = tempfile.mkdtemp()
     try:
-        distname = osp.basename(cubedir)
-        cubename = distname.split('_')[-1]
+        cubename = osp.basename(cubedir)
+        if cubename.startswith('cubicweb_'):  # new layout
+            distname = cubename
+            cubename = cubename[len('cubicweb_'):]
+        else:
+            distname = 'cubicweb_' + cubename
         print('cubedir', cubedir)
         extract_cls = I18nCubeMessageExtractor
         try:
--- a/cubicweb/devtools/fake.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/devtools/fake.py	Fri Nov 18 15:42:10 2016 +0100
@@ -55,12 +55,20 @@
         return {'system': {'db-driver': 'sqlite'}}
 
 
+class FakeCWRegistryStore(CWRegistryStore):
+
+    def property_value(self, key):
+        if key == 'ui.language':
+            return 'en'
+        assert False
+
+
 class FakeRequest(ConnectionCubicWebRequestBase):
     """test implementation of an cubicweb request object"""
 
     def __init__(self, *args, **kwargs):
         if not (args or 'vreg' in kwargs):
-            kwargs['vreg'] = CWRegistryStore(FakeConfig(), initlog=False)
+            kwargs['vreg'] = FakeCWRegistryStore(FakeConfig(), initlog=False)
         kwargs['https'] = False
         self._http_method = kwargs.pop('method', 'GET')
         self._url = kwargs.pop('url', None)
@@ -134,7 +142,7 @@
         if vreg is None:
             vreg = getattr(self.repo, 'vreg', None)
         if vreg is None:
-            vreg = CWRegistryStore(FakeConfig(), initlog=False)
+            vreg = FakeCWRegistryStore(FakeConfig(), initlog=False)
         self.vreg = vreg
         self.cnxset = FakeConnectionsSet()
         self.user = user or FakeUser()
@@ -176,7 +184,7 @@
         self._count = 0
         self.schema = schema
         self.config = config or FakeConfig()
-        self.vreg = vreg or CWRegistryStore(self.config, initlog=False)
+        self.vreg = vreg or FakeCWRegistryStore(self.config, initlog=False)
         self.vreg.schema = schema
 
     def internal_session(self):
--- a/cubicweb/devtools/test/unittest_i18n.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/devtools/test/unittest_i18n.py	Fri Nov 18 15:42:10 2016 +0100
@@ -136,11 +136,11 @@
 
     @patch('pkg_resources.load_entry_point', return_value=FakeMessageExtractor)
     def test_cube_custom_extractor(self, mock_load_entry_point):
-        for distname, cubedir in [
-            ('cubicweb_i18ntestcube',
-             osp.join(DATADIR, 'libpython', 'cubicweb_i18ntestcube')),
+        distname = 'cubicweb_i18ntestcube'  # same for new and legacy layout
+        for cubedir in [
+            osp.join(DATADIR, 'libpython', 'cubicweb_i18ntestcube'),
             # Legacy cubes.
-            ('i18ntestcube', osp.join(DATADIR, 'cubes', 'i18ntestcube')),
+            osp.join(DATADIR, 'cubes', 'i18ntestcube'),
         ]:
             with self.subTest(cubedir=cubedir):
                 with capture_stdout() as stream:
--- a/cubicweb/devtools/testlib.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/devtools/testlib.py	Fri Nov 18 15:42:10 2016 +0100
@@ -28,7 +28,6 @@
 from inspect import isgeneratorfunction
 from itertools import chain
 from warnings import warn
-import tempfile
 
 from six import text_type, string_types, reraise
 from six.moves import range
@@ -45,7 +44,7 @@
 
 from cubicweb import (ValidationError, NoSelectableObject, AuthenticationError,
                       BadConnectionId)
-from cubicweb import cwconfig, devtools, web, server, repoapi
+from cubicweb import cwconfig, devtools, web, server
 from cubicweb.utils import json
 from cubicweb.sobjects import notification
 from cubicweb.web import Redirect, application, eid_param
@@ -53,6 +52,7 @@
 from cubicweb.server.session import Session
 from cubicweb.devtools import SYSTEM_ENTITIES, SYSTEM_RELATIONS, VIEW_VALIDATORS
 from cubicweb.devtools import fake, htmlparser, DEFAULT_EMPTY_DB_ID
+from cubicweb.devtools.fill import insert_entity_queries, make_relations_queries
 
 
 if sys.version_info[:2] < (3, 4):
@@ -208,6 +208,7 @@
     def sendmail(self, fromaddr, recipients, msg):
         MAILBOX.append(Email(fromaddr, recipients, msg))
 
+
 cwconfig.SMTP = MockSMTP
 
 
@@ -852,7 +853,9 @@
             path = location
             params = {}
         else:
-            cleanup = lambda p: (p[0], urlunquote(p[1]))
+            def cleanup(p):
+                return (p[0], urlunquote(p[1]))
+
             params = dict(cleanup(p.split('=', 1)) for p in params.split('&') if p)
         if path.startswith(req.base_url()):  # may be relative
             path = path[len(req.base_url()):]
@@ -968,8 +971,11 @@
             viewfunc = view.render
         else:
             kwargs['view'] = view
-            viewfunc = lambda **k: viewsreg.main_template(req, template,
-                                                          rset=rset, **kwargs)
+
+            def viewfunc(**k):
+                return viewsreg.main_template(req, template,
+                                              rset=rset, **kwargs)
+
         return self._test_view(viewfunc, view, template, kwargs)
 
     def _test_view(self, viewfunc, view, template='main-template', kwargs={}):
@@ -1105,11 +1111,8 @@
 
 # auto-populating test classes and utilities ###################################
 
-from cubicweb.devtools.fill import insert_entity_queries, make_relations_queries
-
 # XXX cleanup unprotected_entities & all mess
 
-
 def how_many_dict(schema, cnx, how_many, skip):
     """given a schema, compute how many entities by type we need to be able to
     satisfy relations cardinality.
--- a/cubicweb/entities/wfobjs.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/entities/wfobjs.py	Fri Nov 18 15:42:10 2016 +0100
@@ -235,7 +235,7 @@
         # check one of the rql expression conditions matches if any
         if self.condition:
             if DBG:
-                print('my_be_fired: %r: %s' %
+                print('may_be_fired: %r: %s' %
                       (self.name, [(rqlexpr.expression,
                                     rqlexpr.check_expression(self._cw, eid))
                                     for rqlexpr in self.condition]))
--- a/cubicweb/hooks/syncschema.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/hooks/syncschema.py	Fri Nov 18 15:42:10 2016 +0100
@@ -201,6 +201,13 @@
         for eschema in self.cnx.repo.schema.entities():
             if not eschema.final:
                 clear_cache(eschema, 'ordered_relations')
+                # clear additional cached properties
+                try:
+                    # is_composite use composite_rdef_roles, hence one try except should be enough
+                    del eschema.composite_rdef_roles
+                    del eschema.is_composite
+                except AttributeError:
+                    pass
 
     def postcommit_event(self):
         repo = self.cnx.repo
--- a/cubicweb/hooks/test/unittest_syncschema.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/hooks/test/unittest_syncschema.py	Fri Nov 18 15:42:10 2016 +0100
@@ -400,6 +400,23 @@
             # comparison on Python 2.
             self.assertEqual(set(rdef.constraints), set([cstr, cstr3]))
 
+    def test_eschema_composite_properties(self):
+        with self.admin_access.repo_cnx() as cnx:
+            part_eschema = self.schema['EmailPart']
+            email_eschema = self.schema['Email']
+            parts_rdef = email_eschema.rdef('parts')
+            self.assertEqual(part_eschema.composite_rdef_roles, [])
+            self.assertEqual(part_eschema.is_composite, False)
+            self.assertEqual(email_eschema.composite_rdef_roles,
+                             [(parts_rdef, 'subject')])
+            self.assertEqual(email_eschema.is_composite, True)
+            cnx.execute('DELETE CWRType X WHERE X name "parts"')
+            cnx.commit()
+            self.assertEqual(part_eschema.composite_rdef_roles, [])
+            self.assertEqual(part_eschema.is_composite, False)
+            self.assertEqual(email_eschema.composite_rdef_roles, [])
+            self.assertEqual(email_eschema.is_composite, False)
+
 
 if __name__ == '__main__':
     import unittest
--- a/cubicweb/i18n/de.po	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/i18n/de.po	Fri Nov 18 15:42:10 2016 +0100
@@ -43,13 +43,6 @@
 msgstr " :"
 
 #, python-format
-msgid "\"action\" must be specified in options; allowed values are %s"
-msgstr ""
-
-msgid "\"role=subject\" or \"role=object\" must be specified in options"
-msgstr ""
-
-#, python-format
 msgid "%(KEY-cstr)s constraint failed for value %(KEY-value)r"
 msgstr ""
 
@@ -110,10 +103,6 @@
 msgstr "%d Jahre"
 
 #, python-format
-msgid "%s could be supported"
-msgstr ""
-
-#, python-format
 msgid "%s error report"
 msgstr "%s Fehlerbericht"
 
@@ -125,19 +114,6 @@
 msgid "%s updated"
 msgstr "%s aktualisiert"
 
-#, python-format
-msgid "'%s' action doesn't take any options"
-msgstr ""
-
-#, python-format
-msgid ""
-"'%s' action for in_state relation should at least have 'linkattr=name' option"
-msgstr ""
-
-#, python-format
-msgid "'%s' action requires 'linkattr' option"
-msgstr ""
-
 msgid "(UNEXISTANT EID)"
 msgstr "(EID nicht gefunden)"
 
@@ -225,6 +201,9 @@
 msgid "Attributes permissions:"
 msgstr "Rechte der Attribute"
 
+msgid "Authentication failed. Please check your credentials."
+msgstr ""
+
 # schema pot file, generated on 2009-09-16 16:46:55
 #
 # singular and plural forms for each entity type
@@ -349,6 +328,12 @@
 msgid "CWRelation_plural"
 msgstr "Relationen"
 
+msgid "CWSession"
+msgstr ""
+
+msgid "CWSession_plural"
+msgstr ""
+
 msgid "CWSource"
 msgstr ""
 
@@ -358,12 +343,6 @@
 msgid "CWSourceHostConfig_plural"
 msgstr ""
 
-msgid "CWSourceSchemaConfig"
-msgstr ""
-
-msgid "CWSourceSchemaConfig_plural"
-msgstr ""
-
 msgid "CWSource_plural"
 msgstr ""
 
@@ -461,9 +440,6 @@
 msgid "Deleted %(etype)s : %(entity)s"
 msgstr ""
 
-msgid "Detected problems"
-msgstr ""
-
 msgid "Do you want to delete the following element(s)?"
 msgstr "Wollen Sie das/die folgend(n) Element(e) löschen?"
 
@@ -492,9 +468,6 @@
 "reapply your changes."
 msgstr ""
 
-msgid "Entity and relation supported by this source"
-msgstr ""
-
 msgid "ExternalUri"
 msgstr "Externer Uri"
 
@@ -600,15 +573,15 @@
 msgid "New CWRelation"
 msgstr "Neue Relation"
 
+msgid "New CWSession"
+msgstr ""
+
 msgid "New CWSource"
 msgstr ""
 
 msgid "New CWSourceHostConfig"
 msgstr ""
 
-msgid "New CWSourceSchemaConfig"
-msgstr ""
-
 msgid "New CWUniqueTogetherConstraint"
 msgstr "Neue unique-together-Einschränkung"
 
@@ -665,6 +638,9 @@
 msgid "Password_plural"
 msgstr "Passwörter"
 
+msgid "Persistent session. Used by cubicweb.pyramid to store the session data."
+msgstr ""
+
 msgid "Please note that this is only a shallow copy"
 msgstr "Achtung: dies ist nur eine flache Kopie!"
 
@@ -818,15 +794,15 @@
 msgid "This CWRelation:"
 msgstr "Diese Relation:"
 
+msgid "This CWSession:"
+msgstr ""
+
 msgid "This CWSource:"
 msgstr ""
 
 msgid "This CWSourceHostConfig:"
 msgstr ""
 
-msgid "This CWSourceSchemaConfig:"
-msgstr ""
-
 msgid "This CWUniqueTogetherConstraint:"
 msgstr "Diese unique-together-Einschränkung:"
 
@@ -953,9 +929,6 @@
 "\"Durchsuchen\" oberhalb eine neue Datei hochladen, oder den Datei-Inhalt "
 "mit dem Widget unterhalb editieren."
 
-msgid "You can't change this relation"
-msgstr ""
-
 msgid "You cannot remove the system source"
 msgstr ""
 
@@ -1173,15 +1146,15 @@
 msgid "add a CWRelation"
 msgstr ""
 
+msgid "add a CWSession"
+msgstr ""
+
 msgid "add a CWSource"
 msgstr ""
 
 msgid "add a CWSourceHostConfig"
 msgstr ""
 
-msgid "add a CWSourceSchemaConfig"
-msgstr ""
-
 msgid "add a CWUniqueTogetherConstraint"
 msgstr ""
 
@@ -1287,16 +1260,9 @@
 msgid "allow to set a specific workflow for an entity"
 msgstr "erlaube, einen bestimmten Workflow für eine Entität zu setzen"
 
-msgid "allowed options depends on the source type"
-msgstr ""
-
 msgid "allowed transitions from this state"
 msgstr "erlaubte Übergänge von diesem Zustand"
 
-#, python-format
-msgid "allowed values for \"action\" are %s"
-msgstr ""
-
 msgid "allowed_transition"
 msgstr "erlaubter Übergang"
 
@@ -2020,20 +1986,6 @@
 msgid "cw.users-management"
 msgstr ""
 
-msgid "cw_for_source"
-msgstr ""
-
-msgctxt "CWSourceSchemaConfig"
-msgid "cw_for_source"
-msgstr ""
-
-msgid "cw_for_source_object"
-msgstr ""
-
-msgctxt "CWSource"
-msgid "cw_for_source_object"
-msgstr ""
-
 msgid "cw_host_config_of"
 msgstr ""
 
@@ -2062,28 +2014,6 @@
 msgid "cw_import_of_object"
 msgstr ""
 
-msgid "cw_schema"
-msgstr ""
-
-msgctxt "CWSourceSchemaConfig"
-msgid "cw_schema"
-msgstr ""
-
-msgid "cw_schema_object"
-msgstr ""
-
-msgctxt "CWEType"
-msgid "cw_schema_object"
-msgstr ""
-
-msgctxt "CWRType"
-msgid "cw_schema_object"
-msgstr ""
-
-msgctxt "CWRelation"
-msgid "cw_schema_object"
-msgstr ""
-
 msgid "cw_source"
 msgstr ""
 
@@ -2117,15 +2047,19 @@
 msgid "cwrtype-permissions"
 msgstr "Berechtigungen"
 
+msgid "cwsessiondata"
+msgstr ""
+
+msgctxt "CWSession"
+msgid "cwsessiondata"
+msgstr ""
+
 msgid "cwsource-imports"
 msgstr ""
 
 msgid "cwsource-main"
 msgstr ""
 
-msgid "cwsource-mapping"
-msgstr ""
-
 msgid "cwuri"
 msgstr "interner URI"
 
@@ -2463,9 +2397,6 @@
 msgid "entities deleted"
 msgstr "Entitäten gelöscht"
 
-msgid "entity and relation types can't be mapped, only attributes or relations"
-msgstr ""
-
 msgid "entity copied"
 msgstr "Entität kopiert"
 
@@ -2502,9 +2433,6 @@
 msgid "entityview"
 msgstr ""
 
-msgid "error"
-msgstr ""
-
 msgid "error while publishing ReST text"
 msgstr "Fehler beim Übersetzen von reST"
 
@@ -3450,10 +3378,6 @@
 msgid "options"
 msgstr "Optionen"
 
-msgctxt "CWSourceSchemaConfig"
-msgid "options"
-msgstr ""
-
 msgid "order"
 msgstr "Reihenfolge"
 
@@ -3646,24 +3570,6 @@
 msgid "relation %(relname)s of %(ent)s"
 msgstr "Relation %(relname)s von %(ent)s"
 
-#, python-format
-msgid ""
-"relation %(rtype)s with %(etype)s as %(role)s is supported but no target "
-"type supported"
-msgstr ""
-
-#, python-format
-msgid ""
-"relation %(type)s with %(etype)s as %(role)s and target type %(target)s is "
-"mandatory but not supported"
-msgstr ""
-
-#, python-format
-msgid ""
-"relation %s is supported but none of its definitions matches supported "
-"entities"
-msgstr ""
-
 msgid "relation add"
 msgstr "Relation hinzufügen"
 
@@ -4155,15 +4061,9 @@
 msgid "this entity is currently owned by"
 msgstr "Diese Entität gehört:"
 
-msgid "this parser doesn't use a mapping"
-msgstr ""
-
 msgid "this resource does not exist"
 msgstr "cette ressource est introuvable"
 
-msgid "this source doesn't use a mapping"
-msgstr ""
-
 msgid "thursday"
 msgstr "Donnerstag"
 
@@ -4564,6 +4464,9 @@
 msgid "view identifier"
 msgstr "Nutzername"
 
+msgid "view original"
+msgstr ""
+
 msgid "view title"
 msgstr "Titel"
 
@@ -4576,9 +4479,6 @@
 msgid "visible"
 msgstr "sichtbar"
 
-msgid "warning"
-msgstr ""
-
 msgid "we are not yet ready to handle this query"
 msgstr "Momentan können wir diese sparql-Anfrage noch nicht ausführen."
 
--- a/cubicweb/i18n/en.po	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/i18n/en.po	Fri Nov 18 15:42:10 2016 +0100
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: 2.0\n"
 "POT-Creation-Date: 2006-01-12 17:35+CET\n"
-"PO-Revision-Date: 2011-04-29 12:57+0200\n"
+"PO-Revision-Date: 2016-11-14 12:24+0100\n"
 "Last-Translator: Sylvain Thenault <sylvain.thenault@logilab.fr>\n"
 "Language-Team: English <devel@logilab.fr.org>\n"
 "Language: en\n"
@@ -35,13 +35,6 @@
 msgstr ":"
 
 #, python-format
-msgid "\"action\" must be specified in options; allowed values are %s"
-msgstr ""
-
-msgid "\"role=subject\" or \"role=object\" must be specified in options"
-msgstr ""
-
-#, python-format
 msgid "%(KEY-cstr)s constraint failed for value %(KEY-value)r"
 msgstr ""
 
@@ -102,10 +95,6 @@
 msgstr ""
 
 #, python-format
-msgid "%s could be supported"
-msgstr ""
-
-#, python-format
 msgid "%s error report"
 msgstr ""
 
@@ -117,19 +106,6 @@
 msgid "%s updated"
 msgstr ""
 
-#, python-format
-msgid "'%s' action doesn't take any options"
-msgstr ""
-
-#, python-format
-msgid ""
-"'%s' action for in_state relation should at least have 'linkattr=name' option"
-msgstr ""
-
-#, python-format
-msgid "'%s' action requires 'linkattr' option"
-msgstr ""
-
 msgid "(UNEXISTANT EID)"
 msgstr ""
 
@@ -214,6 +190,9 @@
 msgid "Attributes permissions:"
 msgstr ""
 
+msgid "Authentication failed. Please check your credentials."
+msgstr "Authentication failed. Please check your credentials."
+
 # schema pot file, generated on 2009-09-16 16:46:55
 #
 # singular and plural forms for each entity type
@@ -338,6 +317,12 @@
 msgid "CWRelation_plural"
 msgstr "Relations"
 
+msgid "CWSession"
+msgstr "Persistent session"
+
+msgid "CWSession_plural"
+msgstr "Persistent sessions"
+
 msgid "CWSource"
 msgstr "Data source"
 
@@ -347,12 +332,6 @@
 msgid "CWSourceHostConfig_plural"
 msgstr "Source host configurations"
 
-msgid "CWSourceSchemaConfig"
-msgstr "Source schema configuration"
-
-msgid "CWSourceSchemaConfig_plural"
-msgstr "Source schema configurations"
-
 msgid "CWSource_plural"
 msgstr "Data sources"
 
@@ -439,9 +418,6 @@
 msgid "Deleted %(etype)s : %(entity)s"
 msgstr ""
 
-msgid "Detected problems"
-msgstr ""
-
 msgid "Do you want to delete the following element(s)?"
 msgstr ""
 
@@ -470,9 +446,6 @@
 "reapply your changes."
 msgstr ""
 
-msgid "Entity and relation supported by this source"
-msgstr ""
-
 msgid "ExternalUri"
 msgstr "External Uri"
 
@@ -578,15 +551,15 @@
 msgid "New CWRelation"
 msgstr "New relation"
 
+msgid "New CWSession"
+msgstr "New persistent session"
+
 msgid "New CWSource"
 msgstr "New source"
 
 msgid "New CWSourceHostConfig"
 msgstr "New source host configuration"
 
-msgid "New CWSourceSchemaConfig"
-msgstr "New source schema configuration"
-
 msgid "New CWUniqueTogetherConstraint"
 msgstr "New unicity constraint"
 
@@ -641,6 +614,9 @@
 msgid "Password_plural"
 msgstr "Passwords"
 
+msgid "Persistent session. Used by cubicweb.pyramid to store the session data."
+msgstr "Persistent session. Used by cubicweb.pyramid to store the session data."
+
 msgid "Please note that this is only a shallow copy"
 msgstr ""
 
@@ -794,15 +770,15 @@
 msgid "This CWRelation:"
 msgstr "This relation:"
 
+msgid "This CWSession:"
+msgstr "This persistent session :"
+
 msgid "This CWSource:"
 msgstr "This data source:"
 
 msgid "This CWSourceHostConfig:"
 msgstr "This source host configuration:"
 
-msgid "This CWSourceSchemaConfig:"
-msgstr "This source schema configuration:"
-
 msgid "This CWUniqueTogetherConstraint:"
 msgstr "This unicity constraint:"
 
@@ -922,9 +898,6 @@
 "content online with the widget below."
 msgstr ""
 
-msgid "You can't change this relation"
-msgstr ""
-
 msgid "You cannot remove the system source"
 msgstr ""
 
@@ -1135,15 +1108,15 @@
 msgid "add a CWRelation"
 msgstr ""
 
+msgid "add a CWSession"
+msgstr "add a persistent session"
+
 msgid "add a CWSource"
 msgstr ""
 
 msgid "add a CWSourceHostConfig"
 msgstr ""
 
-msgid "add a CWSourceSchemaConfig"
-msgstr ""
-
 msgid "add a CWUniqueTogetherConstraint"
 msgstr ""
 
@@ -1247,16 +1220,9 @@
 msgid "allow to set a specific workflow for an entity"
 msgstr ""
 
-msgid "allowed options depends on the source type"
-msgstr ""
-
 msgid "allowed transitions from this state"
 msgstr ""
 
-#, python-format
-msgid "allowed values for \"action\" are %s"
-msgstr ""
-
 msgid "allowed_transition"
 msgstr "allowed transition"
 
@@ -1977,20 +1943,6 @@
 msgid "cw.users-management"
 msgstr "users"
 
-msgid "cw_for_source"
-msgstr "for source"
-
-msgctxt "CWSourceSchemaConfig"
-msgid "cw_for_source"
-msgstr "for source"
-
-msgid "cw_for_source_object"
-msgstr "mapping"
-
-msgctxt "CWSource"
-msgid "cw_for_source_object"
-msgstr "mapping"
-
 msgid "cw_host_config_of"
 msgstr "source"
 
@@ -2019,28 +1971,6 @@
 msgid "cw_import_of_object"
 msgstr "imports"
 
-msgid "cw_schema"
-msgstr "maps"
-
-msgctxt "CWSourceSchemaConfig"
-msgid "cw_schema"
-msgstr "maps"
-
-msgid "cw_schema_object"
-msgstr "mapped by"
-
-msgctxt "CWEType"
-msgid "cw_schema_object"
-msgstr "mapped by"
-
-msgctxt "CWRType"
-msgid "cw_schema_object"
-msgstr "mapped by"
-
-msgctxt "CWRelation"
-msgid "cw_schema_object"
-msgstr "mapped by"
-
 msgid "cw_source"
 msgstr "source"
 
@@ -2074,15 +2004,19 @@
 msgid "cwrtype-permissions"
 msgstr "permissions"
 
+msgid "cwsessiondata"
+msgstr "session data"
+
+msgctxt "CWSession"
+msgid "cwsessiondata"
+msgstr "session data"
+
 msgid "cwsource-imports"
 msgstr ""
 
 msgid "cwsource-main"
 msgstr "description"
 
-msgid "cwsource-mapping"
-msgstr "mapping"
-
 msgid "cwuri"
 msgstr "internal uri"
 
@@ -2412,9 +2346,6 @@
 msgid "entities deleted"
 msgstr ""
 
-msgid "entity and relation types can't be mapped, only attributes or relations"
-msgstr ""
-
 msgid "entity copied"
 msgstr ""
 
@@ -2451,9 +2382,6 @@
 msgid "entityview"
 msgstr "entity views"
 
-msgid "error"
-msgstr ""
-
 msgid "error while publishing ReST text"
 msgstr ""
 
@@ -3368,10 +3296,6 @@
 msgid "options"
 msgstr ""
 
-msgctxt "CWSourceSchemaConfig"
-msgid "options"
-msgstr "options"
-
 msgid "order"
 msgstr ""
 
@@ -3563,24 +3487,6 @@
 msgid "relation %(relname)s of %(ent)s"
 msgstr ""
 
-#, python-format
-msgid ""
-"relation %(rtype)s with %(etype)s as %(role)s is supported but no target "
-"type supported"
-msgstr ""
-
-#, python-format
-msgid ""
-"relation %(type)s with %(etype)s as %(role)s and target type %(target)s is "
-"mandatory but not supported"
-msgstr ""
-
-#, python-format
-msgid ""
-"relation %s is supported but none of its definitions matches supported "
-"entities"
-msgstr ""
-
 msgid "relation add"
 msgstr ""
 
@@ -4058,15 +3964,9 @@
 msgid "this entity is currently owned by"
 msgstr ""
 
-msgid "this parser doesn't use a mapping"
-msgstr ""
-
 msgid "this resource does not exist"
 msgstr ""
 
-msgid "this source doesn't use a mapping"
-msgstr ""
-
 msgid "thursday"
 msgstr ""
 
@@ -4456,6 +4356,9 @@
 msgid "view identifier"
 msgstr ""
 
+msgid "view original"
+msgstr "view original"
+
 msgid "view title"
 msgstr ""
 
@@ -4468,9 +4371,6 @@
 msgid "visible"
 msgstr ""
 
-msgid "warning"
-msgstr ""
-
 msgid "we are not yet ready to handle this query"
 msgstr ""
 
@@ -4556,9 +4456,3 @@
 
 msgid "you should probably delete that property"
 msgstr ""
-
-#~ msgid "components_etypenavigation"
-#~ msgstr "filtering by type"
-
-#~ msgid "components_etypenavigation_description"
-#~ msgstr "permit to filter search results by entity type"
--- a/cubicweb/i18n/es.po	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/i18n/es.po	Fri Nov 18 15:42:10 2016 +0100
@@ -46,16 +46,6 @@
 msgstr ":"
 
 #, python-format
-msgid "\"action\" must be specified in options; allowed values are %s"
-msgstr ""
-"\"action\" debe estar especificada en opciones; los valores permitidos son : "
-"%s"
-
-msgid "\"role=subject\" or \"role=object\" must be specified in options"
-msgstr ""
-"\"role=subject\" o \"role=object\" debe ser especificado en las opciones"
-
-#, python-format
 msgid "%(KEY-cstr)s constraint failed for value %(KEY-value)r"
 msgstr "%(KEY-cstr)s restricción errónea para el valor %(KEY-value)r"
 
@@ -116,10 +106,6 @@
 msgstr "%d años"
 
 #, python-format
-msgid "%s could be supported"
-msgstr "%s podría ser mantenido"
-
-#, python-format
 msgid "%s error report"
 msgstr "%s reporte de errores"
 
@@ -131,21 +117,6 @@
 msgid "%s updated"
 msgstr "%s actualizado"
 
-#, python-format
-msgid "'%s' action doesn't take any options"
-msgstr "la acción '%s'  no acepta opciones"
-
-#, python-format
-msgid ""
-"'%s' action for in_state relation should at least have 'linkattr=name' option"
-msgstr ""
-"'%s' acción en la relación in_state debe por lo menos tener la opción "
-"'linkattr=name'"
-
-#, python-format
-msgid "'%s' action requires 'linkattr' option"
-msgstr "la acción '%s' requiere una opción 'linkattr'"
-
 msgid "(UNEXISTANT EID)"
 msgstr "(EID INEXISTENTE"
 
@@ -233,6 +204,9 @@
 msgid "Attributes permissions:"
 msgstr "Permisos de atributos:"
 
+msgid "Authentication failed. Please check your credentials."
+msgstr ""
+
 # schema pot file, generated on 2009-09-16 16:46:55
 #
 # singular and plural forms for each entity type
@@ -357,6 +331,12 @@
 msgid "CWRelation_plural"
 msgstr "Relaciones"
 
+msgid "CWSession"
+msgstr ""
+
+msgid "CWSession_plural"
+msgstr ""
+
 msgid "CWSource"
 msgstr "Fuente de datos"
 
@@ -366,12 +346,6 @@
 msgid "CWSourceHostConfig_plural"
 msgstr "Configuraciones de fuente"
 
-msgid "CWSourceSchemaConfig"
-msgstr "Configuraciones de Esquema de Fuente"
-
-msgid "CWSourceSchemaConfig_plural"
-msgstr "Configuraciones de Esquema de Fuente"
-
 msgid "CWSource_plural"
 msgstr "Fuentes de Datos"
 
@@ -470,9 +444,6 @@
 msgid "Deleted %(etype)s : %(entity)s"
 msgstr "Se eliminó %(etype)s : %(entity)s"
 
-msgid "Detected problems"
-msgstr "Problemas detectados"
-
 msgid "Do you want to delete the following element(s)?"
 msgstr "Desea eliminar el/los elemento(s) a continuación?"
 
@@ -501,9 +472,6 @@
 "reapply your changes."
 msgstr ""
 
-msgid "Entity and relation supported by this source"
-msgstr "Entidades y relaciones aceptadas por esta fuente"
-
 msgid "ExternalUri"
 msgstr "Uri externo"
 
@@ -609,15 +577,15 @@
 msgid "New CWRelation"
 msgstr "Nueva definición de relación final"
 
+msgid "New CWSession"
+msgstr ""
+
 msgid "New CWSource"
 msgstr "Nueva fuente"
 
 msgid "New CWSourceHostConfig"
 msgstr "Nueva configuración de fuente"
 
-msgid "New CWSourceSchemaConfig"
-msgstr "Nueva parte de mapeo de fuente"
-
 msgid "New CWUniqueTogetherConstraint"
 msgstr "Nueva restricción de singularidad"
 
@@ -672,6 +640,9 @@
 msgid "Password_plural"
 msgstr "Contraseñas"
 
+msgid "Persistent session. Used by cubicweb.pyramid to store the session data."
+msgstr ""
+
 msgid "Please note that this is only a shallow copy"
 msgstr "Recuerde que sólo es una copia superficial"
 
@@ -828,15 +799,15 @@
 msgid "This CWRelation:"
 msgstr "Esta definición de relación no final:"
 
+msgid "This CWSession:"
+msgstr ""
+
 msgid "This CWSource:"
 msgstr "Esta fuente:"
 
 msgid "This CWSourceHostConfig:"
 msgstr "Esta configuración de fuente:"
 
-msgid "This CWSourceSchemaConfig:"
-msgstr "Esta parte de mapeo de fuente:"
-
 msgid "This CWUniqueTogetherConstraint:"
 msgstr "Esta restricción de singularidad:"
 
@@ -967,9 +938,6 @@
 "\"buscar\" en la parte superior, o editar el contenido del archivo en línea\n"
 "en el campo siguiente."
 
-msgid "You can't change this relation"
-msgstr "Usted no puede modificar esta relación"
-
 msgid "You cannot remove the system source"
 msgstr "Usted no puede eliminar la fuente sistema"
 
@@ -1192,15 +1160,15 @@
 msgid "add a CWRelation"
 msgstr ""
 
+msgid "add a CWSession"
+msgstr ""
+
 msgid "add a CWSource"
 msgstr ""
 
 msgid "add a CWSourceHostConfig"
 msgstr ""
 
-msgid "add a CWSourceSchemaConfig"
-msgstr ""
-
 msgid "add a CWUniqueTogetherConstraint"
 msgstr ""
 
@@ -1306,16 +1274,9 @@
 msgid "allow to set a specific workflow for an entity"
 msgstr "permite definir un Workflow específico para una entidad"
 
-msgid "allowed options depends on the source type"
-msgstr "las opciones permitidas dependen del tipo de fuente"
-
 msgid "allowed transitions from this state"
 msgstr "transiciones autorizadas desde este estado"
 
-#, python-format
-msgid "allowed values for \"action\" are %s"
-msgstr "los valores permitidos por \"acción\" son %s"
-
 msgid "allowed_transition"
 msgstr "transiciones autorizadas"
 
@@ -2063,20 +2024,6 @@
 msgid "cw.users-management"
 msgstr "usuarios"
 
-msgid "cw_for_source"
-msgstr "fuente"
-
-msgctxt "CWSourceSchemaConfig"
-msgid "cw_for_source"
-msgstr "fuente"
-
-msgid "cw_for_source_object"
-msgstr "elemento de mapeo"
-
-msgctxt "CWSource"
-msgid "cw_for_source_object"
-msgstr "elemento de mapeo"
-
 msgid "cw_host_config_of"
 msgstr "configuración del host de"
 
@@ -2105,28 +2052,6 @@
 msgid "cw_import_of_object"
 msgstr "importación"
 
-msgid "cw_schema"
-msgstr "esquema"
-
-msgctxt "CWSourceSchemaConfig"
-msgid "cw_schema"
-msgstr "esquema"
-
-msgid "cw_schema_object"
-msgstr "mapeado por"
-
-msgctxt "CWEType"
-msgid "cw_schema_object"
-msgstr "mapeado por"
-
-msgctxt "CWRType"
-msgid "cw_schema_object"
-msgstr "mapeado por"
-
-msgctxt "CWRelation"
-msgid "cw_schema_object"
-msgstr "mapeado por"
-
 msgid "cw_source"
 msgstr "desde la fuente de datos"
 
@@ -2160,15 +2085,19 @@
 msgid "cwrtype-permissions"
 msgstr "Permisos"
 
+msgid "cwsessiondata"
+msgstr ""
+
+msgctxt "CWSession"
+msgid "cwsessiondata"
+msgstr ""
+
 msgid "cwsource-imports"
 msgstr "importación"
 
 msgid "cwsource-main"
 msgstr "descripción"
 
-msgid "cwsource-mapping"
-msgstr "mapeo"
-
 msgid "cwuri"
 msgstr "Uri Interna"
 
@@ -2516,11 +2445,6 @@
 msgid "entities deleted"
 msgstr "Entidades eliminadas"
 
-msgid "entity and relation types can't be mapped, only attributes or relations"
-msgstr ""
-"los tipos de entidad y relación no pueden ser mapeados, solo los atributos y "
-"las relaciones"
-
 msgid "entity copied"
 msgstr "Entidad copiada"
 
@@ -2557,9 +2481,6 @@
 msgid "entityview"
 msgstr "vistas de entidades"
 
-msgid "error"
-msgstr "error"
-
 msgid "error while publishing ReST text"
 msgstr ""
 "Se ha producido un error durante la interpretación del texto en formato ReST"
@@ -3503,10 +3424,6 @@
 msgid "options"
 msgstr "Opciones"
 
-msgctxt "CWSourceSchemaConfig"
-msgid "options"
-msgstr "opciones"
-
 msgid "order"
 msgstr "Orden"
 
@@ -3701,30 +3618,6 @@
 msgid "relation %(relname)s of %(ent)s"
 msgstr "relación %(relname)s de %(ent)s"
 
-#, python-format
-msgid ""
-"relation %(rtype)s with %(etype)s as %(role)s is supported but no target "
-"type supported"
-msgstr ""
-"la relación %(rtype)s con %(etype)s como %(role)s es aceptada pero ningún "
-"tipo target es aceptado"
-
-#, python-format
-msgid ""
-"relation %(type)s with %(etype)s as %(role)s and target type %(target)s is "
-"mandatory but not supported"
-msgstr ""
-"la relación %(type)s con %(etype)s como %(role)s y tipo objetivo %(target)s "
-"es obligatoria pero no mantenida"
-
-#, python-format
-msgid ""
-"relation %s is supported but none of its definitions matches supported "
-"entities"
-msgstr ""
-"la relación %s es aceptada pero ninguna de sus definiciones corresponden a "
-"los tipos de entidades aceptadas"
-
 msgid "relation add"
 msgstr "Agregar Relación"
 
@@ -4220,15 +4113,9 @@
 msgid "this entity is currently owned by"
 msgstr "Esta Entidad es propiedad de"
 
-msgid "this parser doesn't use a mapping"
-msgstr "este analizador (parser) no utiliza mapeo"
-
 msgid "this resource does not exist"
 msgstr "Este recurso no existe"
 
-msgid "this source doesn't use a mapping"
-msgstr "esta fuente no utiliza mapeo"
-
 msgid "thursday"
 msgstr "Jueves"
 
@@ -4627,6 +4514,9 @@
 msgid "view identifier"
 msgstr "Identificador"
 
+msgid "view original"
+msgstr ""
+
 msgid "view title"
 msgstr "Nombre"
 
@@ -4639,9 +4529,6 @@
 msgid "visible"
 msgstr "Visible"
 
-msgid "warning"
-msgstr "atención"
-
 msgid "we are not yet ready to handle this query"
 msgstr "Aún no podemos manejar este tipo de consulta Sparql"
 
@@ -4731,18 +4618,70 @@
 msgid "you should probably delete that property"
 msgstr "probablamente debería  suprimir esta propriedad"
 
+#~ msgid "\"action\" must be specified in options; allowed values are %s"
+#~ msgstr ""
+#~ "\"action\" debe estar especificada en opciones; los valores permitidos "
+#~ "son : %s"
+
+#~ msgid "\"role=subject\" or \"role=object\" must be specified in options"
+#~ msgstr ""
+#~ "\"role=subject\" o \"role=object\" debe ser especificado en las opciones"
+
+#~ msgid "%s could be supported"
+#~ msgstr "%s podría ser mantenido"
+
 #~ msgid "%s relation should not be in mapped"
 #~ msgstr "la relación %s no debería estar mapeada"
 
+#~ msgid "'%s' action doesn't take any options"
+#~ msgstr "la acción '%s'  no acepta opciones"
+
+#~ msgid ""
+#~ "'%s' action for in_state relation should at least have 'linkattr=name' "
+#~ "option"
+#~ msgstr ""
+#~ "'%s' acción en la relación in_state debe por lo menos tener la opción "
+#~ "'linkattr=name'"
+
+#~ msgid "'%s' action requires 'linkattr' option"
+#~ msgstr "la acción '%s' requiere una opción 'linkattr'"
+
 #~ msgid "Any"
 #~ msgstr "Cualquiera"
 
 #~ msgid "Browse by category"
 #~ msgstr "Busca por categoría"
 
+#~ msgid "CWSourceSchemaConfig"
+#~ msgstr "Configuraciones de Esquema de Fuente"
+
+#~ msgid "CWSourceSchemaConfig_plural"
+#~ msgstr "Configuraciones de Esquema de Fuente"
+
+#~ msgid "Detected problems"
+#~ msgstr "Problemas detectados"
+
+#~ msgid "Entity and relation supported by this source"
+#~ msgstr "Entidades y relaciones aceptadas por esta fuente"
+
+#~ msgid "New CWSourceSchemaConfig"
+#~ msgstr "Nueva parte de mapeo de fuente"
+
 #~ msgid "No account? Try public access at %s"
 #~ msgstr "No esta registrado? Use el acceso público en %s"
 
+#~ msgid "This CWSourceSchemaConfig:"
+#~ msgstr "Esta parte de mapeo de fuente:"
+
+#~ msgid "You can't change this relation"
+#~ msgstr "Usted no puede modificar esta relación"
+
+#~ msgid "allowed options depends on the source type"
+#~ msgstr "las opciones permitidas dependen del tipo de fuente"
+
+#~ msgid "allowed values for \"action\" are %s"
+#~ msgstr "los valores permitidos por \"acción\" son %s"
+
 #~ msgid "anonymous"
 #~ msgstr "anónimo"
 
@@ -4766,9 +4705,57 @@
 #~ msgid "components_etypenavigation_description"
 #~ msgstr "Permite filtrar por tipo de entidad los resultados de una búsqueda"
 
+#~ msgid "cw_for_source"
+#~ msgstr "fuente"
+
+#~ msgctxt "CWSourceSchemaConfig"
+#~ msgid "cw_for_source"
+#~ msgstr "fuente"
+
+#~ msgid "cw_for_source_object"
+#~ msgstr "elemento de mapeo"
+
+#~ msgctxt "CWSource"
+#~ msgid "cw_for_source_object"
+#~ msgstr "elemento de mapeo"
+
+#~ msgid "cw_schema"
+#~ msgstr "esquema"
+
+#~ msgctxt "CWSourceSchemaConfig"
+#~ msgid "cw_schema"
+#~ msgstr "esquema"
+
+#~ msgid "cw_schema_object"
+#~ msgstr "mapeado por"
+
+#~ msgctxt "CWEType"
+#~ msgid "cw_schema_object"
+#~ msgstr "mapeado por"
+
+#~ msgctxt "CWRType"
+#~ msgid "cw_schema_object"
+#~ msgstr "mapeado por"
+
+#~ msgctxt "CWRelation"
+#~ msgid "cw_schema_object"
+#~ msgstr "mapeado por"
+
+#~ msgid "cwsource-mapping"
+#~ msgstr "mapeo"
+
 #~ msgid "edit canceled"
 #~ msgstr "Edición cancelada"
 
+#~ msgid ""
+#~ "entity and relation types can't be mapped, only attributes or relations"
+#~ msgstr ""
+#~ "los tipos de entidad y relación no pueden ser mapeados, solo los "
+#~ "atributos y las relaciones"
+
+#~ msgid "error"
+#~ msgstr "error"
+
 #~ msgid "error while querying source %s, some data may be missing"
 #~ msgstr ""
 #~ "Un error ha ocurrido al interrogar  %s, es posible que los \n"
@@ -4782,9 +4769,40 @@
 #~ msgid "no edited fields specified for entity %s"
 #~ msgstr "Ningún campo editable especificado para la entidad %s"
 
+#~ msgctxt "CWSourceSchemaConfig"
+#~ msgid "options"
+#~ msgstr "opciones"
+
+#~ msgid ""
+#~ "relation %(rtype)s with %(etype)s as %(role)s is supported but no target "
+#~ "type supported"
+#~ msgstr ""
+#~ "la relación %(rtype)s con %(etype)s como %(role)s es aceptada pero ningún "
+#~ "tipo target es aceptado"
+
+#~ msgid ""
+#~ "relation %(type)s with %(etype)s as %(role)s and target type %(target)s "
+#~ "is mandatory but not supported"
+#~ msgstr ""
+#~ "la relación %(type)s con %(etype)s como %(role)s y tipo objetivo "
+#~ "%(target)s es obligatoria pero no mantenida"
+
+#~ msgid ""
+#~ "relation %s is supported but none of its definitions matches supported "
+#~ "entities"
+#~ msgstr ""
+#~ "la relación %s es aceptada pero ninguna de sus definiciones corresponden "
+#~ "a los tipos de entidades aceptadas"
+
 #~ msgid "the value \"%s\" is already used, use another one"
 #~ msgstr "El valor \"%s\" ya esta en uso, favor de utilizar otro"
 
+#~ msgid "this parser doesn't use a mapping"
+#~ msgstr "este analizador (parser) no utiliza mapeo"
+
+#~ msgid "this source doesn't use a mapping"
+#~ msgstr "esta fuente no utiliza mapeo"
+
 #~ msgid "timeline"
 #~ msgstr "Escala de Tiempo"
 
@@ -4794,6 +4812,9 @@
 #~ msgid "value %(KEY-value)s must be %(KEY-op)s %(KEY-boundary)s"
 #~ msgstr "El valor %(KEY-value)s debe ser %(KEY-op)s %(KEY-boundary)s"
 
+#~ msgid "warning"
+#~ msgstr "atención"
+
 #~ msgid "web sessions without CNX"
 #~ msgstr "sesiones web sin conexión asociada"
 
--- a/cubicweb/i18n/fr.po	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/i18n/fr.po	Fri Nov 18 15:42:10 2016 +0100
@@ -4,7 +4,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: cubicweb 2.46.0\n"
-"PO-Revision-Date: 2014-06-24 13:29+0200\n"
+"PO-Revision-Date: 2016-11-14 11:26+0100\n"
 "Last-Translator: Logilab Team <contact@logilab.fr>\n"
 "Language-Team: fr <contact@logilab.fr>\n"
 "Language: \n"
@@ -40,16 +40,6 @@
 msgstr " :"
 
 #, python-format
-msgid "\"action\" must be specified in options; allowed values are %s"
-msgstr ""
-"\"action\" doit être specifié dans les options; les valeurs autorisées "
-"sont : %s"
-
-msgid "\"role=subject\" or \"role=object\" must be specified in options"
-msgstr ""
-"\"role=subject\" ou \"role=object\" doit être specifié dans les options"
-
-#, python-format
 msgid "%(KEY-cstr)s constraint failed for value %(KEY-value)r"
 msgstr "la valeur %(KEY-value)r ne satisfait pas la contrainte %(KEY-cstr)s"
 
@@ -111,10 +101,6 @@
 msgstr "%d années"
 
 #, python-format
-msgid "%s could be supported"
-msgstr "%s pourrait être supporté"
-
-#, python-format
 msgid "%s error report"
 msgstr "%s rapport d'erreur"
 
@@ -126,21 +112,6 @@
 msgid "%s updated"
 msgstr "%s mis à jour"
 
-#, python-format
-msgid "'%s' action doesn't take any options"
-msgstr "l'action '%s' ne prend pas d'option"
-
-#, python-format
-msgid ""
-"'%s' action for in_state relation should at least have 'linkattr=name' option"
-msgstr ""
-"l'action '%s' pour la relation in_state doit au moins avoir l'option "
-"'linkattr=name'"
-
-#, python-format
-msgid "'%s' action requires 'linkattr' option"
-msgstr "l'action '%s' nécessite une option 'linkattr'"
-
 msgid "(UNEXISTANT EID)"
 msgstr "(EID INTROUVABLE)"
 
@@ -227,6 +198,9 @@
 msgid "Attributes permissions:"
 msgstr "Permissions des attributs"
 
+msgid "Authentication failed. Please check your credentials."
+msgstr "Échec de l'authentification. Veuillez vérifier vos identifiant et mot de passe."
+
 # schema pot file, generated on 2009-09-16 16:46:55
 #
 # singular and plural forms for each entity type
@@ -351,6 +325,12 @@
 msgid "CWRelation_plural"
 msgstr "Relations"
 
+msgid "CWSession"
+msgstr "Session persistante"
+
+msgid "CWSession_plural"
+msgstr "Sessions persistantes"
+
 msgid "CWSource"
 msgstr "Source de données"
 
@@ -360,12 +340,6 @@
 msgid "CWSourceHostConfig_plural"
 msgstr "Configurations de source"
 
-msgid "CWSourceSchemaConfig"
-msgstr "Configuration de schéma de source"
-
-msgid "CWSourceSchemaConfig_plural"
-msgstr "Configurations de schéma de source"
-
 msgid "CWSource_plural"
 msgstr "Source de données"
 
@@ -464,9 +438,6 @@
 msgid "Deleted %(etype)s : %(entity)s"
 msgstr "Entité %(etype)s supprimée : %(entity)s"
 
-msgid "Detected problems"
-msgstr "Problèmes détectés"
-
 msgid "Do you want to delete the following element(s)?"
 msgstr "Voulez-vous supprimer le(s) élément(s) suivant(s) ?"
 
@@ -497,9 +468,6 @@
 "L'entité %(eid)s a été modifiée depuis votre demande d'édition. Veuillez "
 "recharger cette page et réappliquer vos changements."
 
-msgid "Entity and relation supported by this source"
-msgstr "Entités et relations supportés par cette source"
-
 msgid "ExternalUri"
 msgstr "Uri externe"
 
@@ -605,15 +573,15 @@
 msgid "New CWRelation"
 msgstr "Nouvelle définition de relation non finale"
 
+msgid "New CWSession"
+msgstr "Nouvelle session persistante"
+
 msgid "New CWSource"
 msgstr "Nouvelle source"
 
 msgid "New CWSourceHostConfig"
 msgstr "Nouvelle configuration de source"
 
-msgid "New CWSourceSchemaConfig"
-msgstr "Nouvelle partie de mapping de source"
-
 msgid "New CWUniqueTogetherConstraint"
 msgstr "Nouvelle contrainte unique_together"
 
@@ -668,6 +636,9 @@
 msgid "Password_plural"
 msgstr "Mots de passe"
 
+msgid "Persistent session. Used by cubicweb.pyramid to store the session data."
+msgstr "Session persistante. Utilisée par cubicweb.pyramid pour stocker les données de session."
+
 msgid "Please note that this is only a shallow copy"
 msgstr "Attention, cela n'effectue qu'une copie de surface"
 
@@ -826,15 +797,15 @@
 msgid "This CWRelation:"
 msgstr "Cette définition de relation :"
 
+msgid "This CWSession:"
+msgstr "Cette session persistante :"
+
 msgid "This CWSource:"
 msgstr "Cette source :"
 
 msgid "This CWSourceHostConfig:"
 msgstr "Cette configuration de source :"
 
-msgid "This CWSourceSchemaConfig:"
-msgstr "Cette partie de mapping de source :"
-
 msgid "This CWUniqueTogetherConstraint:"
 msgstr "Cette contrainte unique_together :"
 
@@ -965,9 +936,6 @@
 "\"parcourir\" ci-dessus, soit éditer le contenu du fichier en ligne\n"
 "avec le champ ci-dessous."
 
-msgid "You can't change this relation"
-msgstr "Vous ne pouvez pas modifier cette relation"
-
 msgid "You cannot remove the system source"
 msgstr "Vous ne pouvez pas supprimer la source système"
 
@@ -1190,15 +1158,15 @@
 msgid "add a CWRelation"
 msgstr ""
 
+msgid "add a CWSession"
+msgstr "Ajouter une session persistante"
+
 msgid "add a CWSource"
 msgstr ""
 
 msgid "add a CWSourceHostConfig"
 msgstr ""
 
-msgid "add a CWSourceSchemaConfig"
-msgstr ""
-
 msgid "add a CWUniqueTogetherConstraint"
 msgstr ""
 
@@ -1304,16 +1272,9 @@
 msgid "allow to set a specific workflow for an entity"
 msgstr "permet de spécifier un workflow donné pour une entité"
 
-msgid "allowed options depends on the source type"
-msgstr "les options autorisées dépendent du type de la source"
-
 msgid "allowed transitions from this state"
 msgstr "transitions autorisées depuis cet état"
 
-#, python-format
-msgid "allowed values for \"action\" are %s"
-msgstr "les valeurs autorisées pour \"action\" sont %s"
-
 msgid "allowed_transition"
 msgstr "transitions autorisées"
 
@@ -2066,20 +2027,6 @@
 msgid "cw.users-management"
 msgstr "utilisateurs"
 
-msgid "cw_for_source"
-msgstr "source"
-
-msgctxt "CWSourceSchemaConfig"
-msgid "cw_for_source"
-msgstr "source"
-
-msgid "cw_for_source_object"
-msgstr "élément de mapping"
-
-msgctxt "CWSource"
-msgid "cw_for_source_object"
-msgstr "élément de mapping"
-
 msgid "cw_host_config_of"
 msgstr "host configuration of"
 
@@ -2108,28 +2055,6 @@
 msgid "cw_import_of_object"
 msgstr "imports"
 
-msgid "cw_schema"
-msgstr "schéma"
-
-msgctxt "CWSourceSchemaConfig"
-msgid "cw_schema"
-msgstr "schéma"
-
-msgid "cw_schema_object"
-msgstr "mappé par"
-
-msgctxt "CWEType"
-msgid "cw_schema_object"
-msgstr "mappé par"
-
-msgctxt "CWRType"
-msgid "cw_schema_object"
-msgstr "mappé par"
-
-msgctxt "CWRelation"
-msgid "cw_schema_object"
-msgstr "mappé par"
-
 msgid "cw_source"
 msgstr "source"
 
@@ -2163,15 +2088,19 @@
 msgid "cwrtype-permissions"
 msgstr "permissions"
 
+msgid "cwsessiondata"
+msgstr "Données de session"
+
+msgctxt "CWSession"
+msgid "cwsessiondata"
+msgstr "Données de session"
+
 msgid "cwsource-imports"
 msgstr "imports"
 
 msgid "cwsource-main"
 msgstr "description"
 
-msgid "cwsource-mapping"
-msgstr "mapping"
-
 msgid "cwuri"
 msgstr "uri interne"
 
@@ -2515,11 +2444,6 @@
 msgid "entities deleted"
 msgstr "entités supprimées"
 
-msgid "entity and relation types can't be mapped, only attributes or relations"
-msgstr ""
-"les types d'entités et de relations ne peuvent être mappés, uniquement les "
-"relations"
-
 msgid "entity copied"
 msgstr "entité copiée"
 
@@ -2556,9 +2480,6 @@
 msgid "entityview"
 msgstr "vues d'entité"
 
-msgid "error"
-msgstr "erreur"
-
 msgid "error while publishing ReST text"
 msgstr ""
 "une erreur s'est produite lors de l'interprétation du texte au format ReST"
@@ -3502,10 +3423,6 @@
 msgid "options"
 msgstr "options"
 
-msgctxt "CWSourceSchemaConfig"
-msgid "options"
-msgstr "options"
-
 msgid "order"
 msgstr "ordre"
 
@@ -3701,30 +3618,6 @@
 msgid "relation %(relname)s of %(ent)s"
 msgstr "relation %(relname)s de %(ent)s"
 
-#, python-format
-msgid ""
-"relation %(rtype)s with %(etype)s as %(role)s is supported but no target "
-"type supported"
-msgstr ""
-"la relation %(rtype)s avec %(etype)s comme %(role)s est supportée mais aucun "
-"type cible n'est supporté"
-
-#, python-format
-msgid ""
-"relation %(type)s with %(etype)s as %(role)s and target type %(target)s is "
-"mandatory but not supported"
-msgstr ""
-"la relation %(rtype)s avec %(etype)s comme %(role)s est obligatoire mais non "
-"supportée"
-
-#, python-format
-msgid ""
-"relation %s is supported but none of its definitions matches supported "
-"entities"
-msgstr ""
-"la relation %s est supportée mais aucune de ses définitions ne correspondent "
-"aux types d'entités supportés"
-
 msgid "relation add"
 msgstr "ajout de relation"
 
@@ -4221,15 +4114,9 @@
 msgid "this entity is currently owned by"
 msgstr "cette entité appartient à"
 
-msgid "this parser doesn't use a mapping"
-msgstr "ce parseur n'utilise pas de mapping"
-
 msgid "this resource does not exist"
 msgstr "cette ressource est introuvable"
 
-msgid "this source doesn't use a mapping"
-msgstr "cette source n'utilise pas de mapping"
-
 msgid "thursday"
 msgstr "jeudi"
 
@@ -4634,6 +4521,9 @@
 msgid "view identifier"
 msgstr "identifiant"
 
+msgid "view original"
+msgstr "voir l'original"
+
 msgid "view title"
 msgstr "titre"
 
@@ -4646,9 +4536,6 @@
 msgid "visible"
 msgstr "visible"
 
-msgid "warning"
-msgstr "attention"
-
 msgid "we are not yet ready to handle this query"
 msgstr ""
 "nous ne sommes pas capable de gérer ce type de requête sparql pour le moment"
@@ -4738,10 +4625,3 @@
 
 msgid "you should probably delete that property"
 msgstr "vous devriez probablement supprimer cette propriété"
-
-#~ msgid "edit canceled"
-#~ msgstr "édition annulée"
-
-#~ msgid "the value \"%s\" is already used, use another one"
-#~ msgstr ""
-#~ "la valeur \"%s\" est déjà utilisée, veuillez utiliser une autre valeur"
--- a/cubicweb/misc/migration/3.24.0_Any.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/misc/migration/3.24.0_Any.py	Fri Nov 18 15:42:10 2016 +0100
@@ -8,4 +8,6 @@
 sql('ALTER TABLE entities DROP COLUMN extid')
 sql('DROP INDEX entities_type_idx')
 
+# force cw_schema deletion before CWSourceSchemaConfig to avoid nasty bug
+drop_relation_type('cw_schema')
 drop_entity_type('CWSourceSchemaConfig')
--- a/cubicweb/pyramid/__init__.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/__init__.py	Fri Nov 18 15:42:10 2016 +0100
@@ -28,6 +28,7 @@
     config.include('cubicweb.pyramid')
     return config
 
+
 def settings_from_cwconfig(cwconfig):
     '''
     Extract settings from pyramid.ini and pyramid-debug.ini (if in debug)
@@ -42,21 +43,21 @@
     if cwconfig.debugmode:
         settings_filenames.insert(
             0, os.path.join(cwconfig.apphome, 'pyramid-debug.ini'))
-    
+
         settings.update({
             'pyramid.debug_authorization': True,
             'pyramid.debug_notfound': True,
             'pyramid.debug_routematch': True,
             'pyramid.reload_templates': True,
         })
-    
+
     for fname in settings_filenames:
         if os.path.exists(fname):
             cp = SafeConfigParser()
             cp.read(fname)
             settings.update(cp.items('main'))
             break
-    
+
     return settings
 
 
--- a/cubicweb/pyramid/auth.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/auth.py	Fri Nov 18 15:42:10 2016 +0100
@@ -159,8 +159,8 @@
                 defaults={
                     'hashalg': 'sha512',
                     'cookie_name': 'pauth_tkt',
-                    'max_age': 3600*24*30,
-                    'reissue_time': 3600*24,
+                    'max_age': 3600 * 24 * 30,
+                    'reissue_time': 3600 * 24,
                     'http_only': True,
                     'secure': True
                 },
--- a/cubicweb/pyramid/bwcompat.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/bwcompat.py	Fri Nov 18 15:42:10 2016 +0100
@@ -103,7 +103,6 @@
             if content is not None:
                 request.response.body = content
 
-
         except LogOut as ex:
             # The actual 'logging out' logic should be in separated function
             # that is accessible by the pyramid views
@@ -116,6 +115,11 @@
                 content = vreg['views'].main_template(req, 'login')
                 request.response.status_code = 403
                 request.response.body = content
+        except cubicweb.web.NotFound as ex:
+            view = vreg['views'].select('404', req)
+            content = vreg['views'].main_template(req, view=view)
+            request.response.status_code = ex.status
+            request.response.body = content
         finally:
             # XXX CubicWebPyramidRequest.headers_out should
             # access directly the pyramid response headers.
--- a/cubicweb/pyramid/core.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/core.py	Fri Nov 18 15:42:10 2016 +0100
@@ -7,7 +7,6 @@
 import rql
 
 from cubicweb.web.request import CubicWebRequestBase
-from cubicweb import repoapi
 
 import cubicweb
 import cubicweb.web
@@ -29,9 +28,11 @@
     This behavior makes sure the actual session data is not loaded until
     actually accessed.
     """
+
     def __init__(self, session, *args, **kw):
         super(Connection, self).__init__(session, *args, **kw)
         self._session = session
+        self.lang = session._cached_lang
 
     def _get_session_data(self):
         return self._session.data
@@ -272,14 +273,15 @@
     """A lightweight version of
     :meth:`cubicweb.server.repository.Repository.connect` that does not keep
     track of opened sessions, removing the need of closing them"""
-    user = tools.cached_build_user(repo, eid)
+    user, lang = tools.cached_build_user(repo, eid)
     session = Session(request, user, repo)
+    session._cached_lang = lang
     tools.cnx_attach_entity(session, user)
     # Calling the hooks should be done only once, disabling it completely for
     # now
-    #with session.new_cnx() as cnx:
-        #repo.hm.call_hooks('session_open', cnx)
-        #cnx.commit()
+    # with session.new_cnx() as cnx:
+    #     repo.hm.call_hooks('session_open', cnx)
+    #     cnx.commit()
     # repo._sessions[session.sessionid] = session
     return session
 
--- a/cubicweb/pyramid/login.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/login.py	Fri Nov 18 15:42:10 2016 +0100
@@ -47,6 +47,10 @@
             user = repo.authenticate_user(cnx, login, password=password)
             user_eid = user.eid
     except cubicweb.AuthenticationError:
+        if repo.vreg.config.get('language-mode') != '':
+            lang = request.cw_request.negotiated_language()
+            if lang is not None:
+                request.cw_request.set_language(lang)
         request.cw_request.set_message(request.cw_request._(
             "Authentication failed. Please check your credentials."))
         request.cw_request.post = dict(request.params)
--- a/cubicweb/pyramid/pyramidctl.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/pyramidctl.py	Fri Nov 18 15:42:10 2016 +0100
@@ -11,13 +11,11 @@
 import os
 import signal
 import sys
-import tempfile
 import time
 import threading
 import subprocess
 
 from cubicweb import BadCommandUsage, ExecutionError
-from cubicweb.__pkginfo__ import numversion as cwversion
 from cubicweb.cwconfig import CubicWebConfiguration as cwcfg
 from cubicweb.cwctl import CWCTL, InstanceCommand, init_cmdline_log_threshold
 from cubicweb.pyramid import wsgi_application_from_cwconfig
@@ -34,12 +32,11 @@
 class PyramidStartHandler(InstanceCommand):
     """Start an interactive pyramid server.
 
-    This command requires http://hg.logilab.org/review/pyramid_cubicweb/
-
     <instance>
       identifier of the instance to configure.
     """
     name = 'pyramid'
+    actionverb = 'started'
 
     options = (
         ('no-daemon',
@@ -86,20 +83,15 @@
           'metavar': 'N',
           'help': 'Dump profile stats to ouput every N requests '
                   '(default: 100)'}),
+        ('param',
+         {'short': 'p',
+          'type': 'named',
+          'metavar': 'key1:value1,key2:value2',
+          'default': {},
+          'help': 'override <key> configuration file option with <value>.'}),
     )
-    if cwversion >= (3, 21, 0):
-        options = options + (
-            ('param',
-             {'short': 'p',
-              'type': 'named',
-              'metavar': 'key1:value1,key2:value2',
-              'default': {},
-              'help': 'override <key> configuration file option with <value>.',
-              }),
-        )
 
     _reloader_environ_key = 'CW_RELOADER_SHOULD_RUN'
-    _reloader_filelist_environ_key = 'CW_RELOADER_FILELIST'
 
     def debug(self, msg):
         print('DEBUG - %s' % msg)
@@ -222,17 +214,17 @@
         os.dup2(0, 1)  # standard output (1)
         os.dup2(0, 2)  # standard error (2)
 
-    def restart_with_reloader(self):
+    def restart_with_reloader(self, filelist_path):
         self.debug('Starting subprocess with file monitor')
 
-        with tempfile.NamedTemporaryFile(delete=False) as f:
-            filelist_path = f.name
+        # Create or clear monitored files list file.
+        with open(filelist_path, 'w') as f:
+            pass
 
         while True:
             args = [self.quote_first_command_arg(sys.executable)] + sys.argv
             new_environ = os.environ.copy()
             new_environ[self._reloader_environ_key] = 'true'
-            new_environ[self._reloader_filelist_environ_key] = filelist_path
             proc = None
             try:
                 try:
@@ -299,12 +291,13 @@
         autoreload = self['reload'] or self['debug']
         daemonize = not (self['no-daemon'] or debugmode or autoreload)
 
-        if autoreload and not os.environ.get(self._reloader_environ_key):
-            return self.restart_with_reloader()
+        cwconfig = cwcfg.config_for(appid, debugmode=debugmode)
+        filelist_path = os.path.join(cwconfig.apphome,
+                                     '.pyramid-reload-files.list')
 
-        cwconfig = cwcfg.config_for(appid, debugmode=debugmode)
-        if cwversion >= (3, 21, 0):
-            cwconfig.cmdline_options = self.config.param
+        if autoreload and not os.environ.get(self._reloader_environ_key):
+            return self.restart_with_reloader(filelist_path)
+
         if autoreload:
             _turn_sigterm_into_systemexit()
             self.debug('Running reloading file monitor')
@@ -313,8 +306,7 @@
             extra_files.extend(self.i18nfiles(cwconfig))
             self.install_reloader(
                 self['reload-interval'], extra_files,
-                filelist_path=os.environ.get(
-                    self._reloader_filelist_environ_key))
+                filelist_path=filelist_path)
 
         if daemonize:
             self.daemonize(cwconfig['pid-file'])
@@ -343,6 +335,7 @@
             return 3
         return 0
 
+
 CWCTL.register(PyramidStartHandler)
 
 
--- a/cubicweb/pyramid/resources.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/resources.py	Fri Nov 18 15:42:10 2016 +0100
@@ -64,8 +64,17 @@
         self.cls = vreg['etypes'].etype_class(self.etype)
 
     def __getitem__(self, value):
-        attrname = self.cls.cw_rest_attr_info()[0]
-        return EntityResource(self.request, self.cls, attrname, value)
+        # Try eid first, then rest attribute as for URL path evaluation
+        # mecanism in cubicweb.web.views.urlpublishing.
+        for attrname in ('eid', self.cls.cw_rest_attr_info()[0]):
+            resource = EntityResource(self.request, self.cls, attrname, value)
+            try:
+                rset = resource.rset
+            except HTTPNotFound:
+                continue
+            if rset.rowcount:
+                return resource
+        raise KeyError(value)
 
     @reify
     def rset(self):
--- a/cubicweb/pyramid/rest_api.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/rest_api.py	Fri Nov 18 15:42:10 2016 +0100
@@ -1,10 +1,8 @@
 from __future__ import absolute_import
 
 
-from pyramid.httpexceptions import HTTPNotFound
 from pyramid.view import view_config
 from cubicweb.pyramid.resources import EntityResource, ETypeResource
-from cubicweb.pyramid.predicates import MatchIsETypePredicate
 
 
 @view_config(
--- a/cubicweb/pyramid/test/test_bw_request.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/test/test_bw_request.py	Fri Nov 18 15:42:10 2016 +0100
@@ -52,7 +52,7 @@
         self.assertIn('https://', r.text)
 
     def test_big_content(self):
-        content = b'x'*100001
+        content = b'x' * 100001
 
         req = CubicWebPyramidRequest(
             self.make_request('/', {
@@ -97,6 +97,11 @@
                 content_type='application/x-www-form-urlencoded'))
         self.assertEqual(u"é", req.form['arg'])
 
+    def test_404(self):
+        r = self.webapp.get('/unexisting/', status=404)
+        self.assertNotIn('error occurred', r.text)
+        self.assertIn('resource does not exist', r.text)
+
 
 if __name__ == '__main__':
     from unittest import main
--- a/cubicweb/pyramid/test/test_login.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/test/test_login.py	Fri Nov 18 15:42:10 2016 +0100
@@ -1,3 +1,6 @@
+from os.path import join
+from shutil import rmtree
+
 from cubicweb.pyramid.test import PyramidCWTest
 
 
@@ -41,9 +44,17 @@
         self.assertIsNotNone(cookies['pauth_tkt'].expires)
 
     def test_login_bad_password(self):
-        res = self.webapp.post('/login', {
-            '__login': self.admlogin, '__password': 'empty'}, status=403)
-        self.assertIn('Authentication failed', res.text)
+        self.config.i18ncompile(['en', 'fr'])
+        try:
+            self.config._gettext_init()
+            res = self.webapp.post(
+                '/login',
+                {'__login': self.admlogin, '__password': 'empty'},
+                headers={'Accept-Language': 'fr'},
+                status=403)
+        finally:
+            rmtree(join(self.config.apphome, 'i18n'))
+        self.assertIn(u"\xc9chec de l'authentification", res.text)
 
 
 if __name__ == '__main__':
--- a/cubicweb/pyramid/tools.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/pyramid/tools.py	Fri Nov 18 15:42:10 2016 +0100
@@ -43,21 +43,17 @@
     """Cached version of
     :meth:`cubicweb.server.repository.Repository._build_user`
     """
+    if eid in _user_cache:
+        user, lang = _user_cache[eid]
+        entity = clone_user(repo, user)
+        return entity, lang
+
     with repo.internal_cnx() as cnx:
-        if eid in _user_cache:
-            entity = clone_user(repo, _user_cache[eid])
-            # XXX the cnx is needed here so that the CWUser instance has an
-            # access to the vreg, which it needs when its 'prefered_language'
-            # property is accessed.
-            # If this property did not need a cnx to access a vreg, we could
-            # avoid the internal_cnx() and save more time.
-            cnx_attach_entity(cnx, entity)
-            return entity
-
         user = repo._build_user(cnx, eid)
+        lang = user.prefered_language()
         user.cw_clear_relation_cache()
-        _user_cache[eid] = clone_user(repo, user)
-        return user
+        _user_cache[eid] = (clone_user(repo, user), lang)
+        return user, lang
 
 
 def clear_cache():
@@ -72,5 +68,5 @@
     """
     repo = config.registry['cubicweb.repository']
     interval = int(config.registry.settings.get(
-        'cubicweb.usercache.expiration_time', 60*5))
+        'cubicweb.usercache.expiration_time', 60 * 5))
     repo.looping_task(interval, clear_cache)
--- a/cubicweb/req.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/req.py	Fri Nov 18 15:42:10 2016 +0100
@@ -74,6 +74,7 @@
         # should be emptied on commit/rollback of the server session / web
         # connection
         self.user = None
+        self.lang = None
         self.local_perm_cache = {}
         self._ = text_type
 
@@ -95,7 +96,15 @@
         Raises :exc:`KeyError` if translation doesn't exist.
         """
         self.lang = lang
-        gettext, pgettext = self.vreg.config.translations[lang]
+        try:
+            gettext, pgettext = self.vreg.config.translations[lang]
+        except KeyError:
+            assert self.vreg.config.mode == 'test'
+            gettext = text_type
+
+            def pgettext(x, y):
+                return text_type(y)
+
         # use _cw.__ to translate a message without registering it to the catalog
         self._ = self.__ = gettext
         self.pgettext = pgettext
--- a/cubicweb/server/repository.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/server/repository.py	Fri Nov 18 15:42:10 2016 +0100
@@ -32,6 +32,7 @@
 from itertools import chain
 from time import time, localtime, strftime
 from contextlib import contextmanager
+from logging import getLogger
 
 from six.moves import range, queue
 
@@ -45,6 +46,7 @@
                       UnknownEid, AuthenticationError, ExecutionError,
                       BadConnectionId, ValidationError, Unauthorized,
                       UniqueTogetherError, onevent, ViolatedConstraint)
+from cubicweb import set_log_methods
 from cubicweb import cwvreg, schema, server
 from cubicweb.server import ShuttingDown, utils, hook, querier, sources
 from cubicweb.server.session import Session, InternalManager
@@ -155,6 +157,7 @@
 
     def __init__(self, config, tasks_manager=None, vreg=None):
         self.config = config
+        self.sources_by_eid = {}
         if vreg is None:
             vreg = cwvreg.CWRegistryStore(config)
         self.vreg = vreg
@@ -262,7 +265,6 @@
     # internals ###############################################################
 
     def init_sources_from_database(self):
-        self.sources_by_eid = {}
         if self.config.quick_start or 'CWSource' not in self.schema:  # 3.10 migration
             self.system_source.init_creating()
             return
@@ -1033,6 +1035,4 @@
     info = warning = error = critical = exception = debug = lambda msg, *a, **kw: None
 
 
-from logging import getLogger
-from cubicweb import set_log_methods
 set_log_methods(Repository, getLogger('cubicweb.repository'))
--- a/cubicweb/server/schema2sql.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/server/schema2sql.py	Fri Nov 18 15:42:10 2016 +0100
@@ -17,8 +17,6 @@
 # with yams. If not, see <http://www.gnu.org/licenses/>.
 """write a schema as sql"""
 
-
-
 from hashlib import md5
 
 from six import string_types, text_type
--- a/cubicweb/server/session.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/server/session.py	Fri Nov 18 15:42:10 2016 +0100
@@ -168,6 +168,7 @@
         if self.oldwrite is not None:
             self.cnx.write_security = self.oldwrite
 
+
 HOOKS_ALLOW_ALL = object()
 HOOKS_DENY_ALL = object()
 DEFAULT_SECURITY = object()  # evaluated to true by design
@@ -383,6 +384,8 @@
         assert not self._open
         self._open = True
         self.cnxset = self.repo._get_cnxset()
+        if self.lang is None:
+            self.set_language(self.user.prefered_language())
         return self
 
     def __exit__(self, exctype=None, excvalue=None, tb=None):
--- a/cubicweb/server/sqlutils.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/server/sqlutils.py	Fri Nov 18 15:42:10 2016 +0100
@@ -16,10 +16,9 @@
 # You should have received a copy of the GNU Lesser General Public License along
 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
 """SQL utilities functions and classes."""
+
 from __future__ import print_function
 
-
-
 import sys
 import re
 import subprocess
@@ -458,6 +457,7 @@
     # only defining here to prevent pylint from complaining
     info = warning = error = critical = exception = debug = lambda msg, *a, **kw: None
 
+
 set_log_methods(SQLAdapterMixIn, getLogger('cubicweb.sqladapter'))
 
 
@@ -560,6 +560,7 @@
     import yams.constraints
     yams.constraints.patch_sqlite_decimal()
 
+
 sqlite_hooks = SQL_CONNECT_HOOKS.setdefault('sqlite', [])
 sqlite_hooks.append(_init_sqlite_connection)
 
@@ -571,5 +572,6 @@
     # rolled back
     cnx.commit()
 
+
 postgres_hooks = SQL_CONNECT_HOOKS.setdefault('postgres', [])
 postgres_hooks.append(_init_postgres_connection)
--- a/cubicweb/skeleton/debian/control.tmpl	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/skeleton/debian/control.tmpl	Fri Nov 18 15:42:10 2016 +0100
@@ -13,7 +13,7 @@
 Package: %(distname)s
 Architecture: all
 Depends:
- cubicweb-common (>= %(version)s),
+ python-cubicweb (>= %(version)s),
  python-six (>= 1.4.0),
  ${python:Depends},
  ${misc:Depends},
@@ -22,5 +22,5 @@
  .
  %(longdesc)s
  .
- This package will install all the components you need to run the
- %(distname)s application (cube :)..
+ This package will install all the components you need to run an application
+ using the %(distname)s cube.
--- a/cubicweb/sobjects/textparsers.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/sobjects/textparsers.py	Fri Nov 18 15:42:10 2016 +0100
@@ -22,8 +22,6 @@
 will provide the text to analyze...
 """
 
-
-
 import re
 
 from cubicweb import UnknownEid
--- a/cubicweb/test/unittest_repoapi.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/test/unittest_repoapi.py	Fri Nov 18 15:42:10 2016 +0100
@@ -83,6 +83,13 @@
             rset = cnx.execute('Any X WHERE X is CWUser')
             self.assertTrue(rset)
 
+    def test_cnx_has_lang(self):
+        """check that client and repo cnx have .lang set"""
+        with self.admin_access.client_cnx() as cnx:
+            self.assertEqual(cnx.lang, 'en')
+        with self.admin_access.repo_cnx() as cnx:
+            self.assertEqual(cnx.lang, 'en')
+
 
 if __name__ == '__main__':
     from logilab.common.testlib import unittest_main
--- a/cubicweb/web/request.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/web/request.py	Fri Nov 18 15:42:10 2016 +0100
@@ -146,10 +146,9 @@
         #: Header used for the final response
         self.headers_out = Headers()
         #: HTTP status use by the final response
-        self.status_out  = 200
-        # set up language based on request headers or site default (we don't
-        # have a user yet, and might not get one)
-        self.set_user_language(None)
+        self.status_out = 200
+        # set up language based on site default (we don't have a user yet, and might not get one)
+        self.set_language(vreg.property_value('ui.language'))
         #: dictionary that may be used to store request data that has to be
         #: shared among various components used to publish the request (views,
         #: controller, application...)
@@ -664,7 +663,7 @@
     def build_url_path(self, *args):
         path = super(_CubicWebRequestBase, self).build_url_path(*args)
         lang_prefix = ''
-        if self.lang and self.vreg.config.get('language-mode') == 'url-prefix':
+        if self.lang is not None and self.vreg.config.get('language-mode') == 'url-prefix':
             lang_prefix = '%s/' % self.lang
         return lang_prefix + path
 
@@ -929,18 +928,6 @@
                 return lang
         return None
 
-    def set_user_language(self, user):
-        vreg = self.vreg
-        if user is not None:
-            try:
-                lang = vreg.typed_value('ui.language', user.properties['ui.language'])
-                self.set_language(lang)
-                return
-            except KeyError:
-                pass
-        # site's default language
-        self.set_default_language(vreg)
-
 
 def _cnx_func(name):
     def proxy(req, *args, **kwargs):
@@ -993,25 +980,15 @@
         self.cnx = cnx
         self.session = cnx.session
         self._set_user(cnx.user)
-        self.set_user_language(cnx.user)
+        # set language according to the one defined on the connection which consider user's
+        # preference
+        self.set_language(cnx.lang)
 
     def execute(self, *args, **kwargs):
         rset = self.cnx.execute(*args, **kwargs)
         rset.req = self
         return rset
 
-    def set_default_language(self, vreg):
-        try:
-            lang = vreg.property_value('ui.language')
-        except Exception: # property may not be registered
-            lang = 'en'
-        try:
-            self.set_language(lang)
-        except KeyError:
-            # this occurs usually during test execution
-            self._ = self.__ = text_type
-            self.pgettext = lambda x, y: text_type(y)
-
     entity_metas = _cnx_func('entity_metas')  # XXX deprecated
     entity_type = _cnx_func('entity_type')
     source_defs = _cnx_func('source_defs')
--- a/cubicweb/web/test/unittest_application.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/web/test/unittest_application.py	Fri Nov 18 15:42:10 2016 +0100
@@ -248,8 +248,9 @@
         """Language negociated, normal case."""
         self.config.global_set_option('language-mode', 'http-negotiation')
         orig_translations = self.config.translations.copy()
-        self.config.translations = {'fr': (text_type, text_type),
-                                    'en': (text_type, text_type)}
+        self.config.translations = {
+            'fr': (text_type, lambda x, y: text_type(y)),
+            'en': (text_type, lambda x, y: text_type(y))}
         try:
             headers = {'Accept-Language': 'fr'}
             with self.admin_access.web_request(headers=headers) as req:
--- a/cubicweb/web/test/unittest_request.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/cubicweb/web/test/unittest_request.py	Fri Nov 18 15:42:10 2016 +0100
@@ -6,7 +6,7 @@
 
 from six import text_type
 
-from cubicweb.devtools.fake import FakeConfig
+from cubicweb.devtools.fake import FakeConfig, FakeCWRegistryStore
 
 from cubicweb.web.request import (CubicWebRequestBase, _parse_accept_header,
                                   _mimetype_sort_key, _mimetype_parser, _charset_sort_key)
@@ -72,8 +72,7 @@
 class WebRequestTC(unittest.TestCase):
 
     def test_base_url(self):
-        dummy_vreg = type('DummyVreg', (object,), {})()
-        dummy_vreg.config = FakeConfig()
+        dummy_vreg = FakeCWRegistryStore(FakeConfig(), initlog=False)
         dummy_vreg.config['base-url'] = 'http://babar.com/'
         dummy_vreg.config['https-url'] = 'https://toto.com/'
 
@@ -88,8 +87,7 @@
         self.assertEqual('https://toto.com/', req.base_url(True))
 
     def test_negotiated_language(self):
-        vreg = type('DummyVreg', (object,), {})()
-        vreg.config = FakeConfig()
+        vreg = FakeCWRegistryStore(FakeConfig(), initlog=False)
         vreg.config.translations = {'fr': (None, None), 'en': (None, None)}
         headers = {
             'Accept-Language': 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3',
@@ -98,7 +96,7 @@
         self.assertEqual(req.negotiated_language(), 'fr')
 
     def test_build_url_language_from_url(self):
-        vreg = type('DummyVreg', (object,), {'config': FakeConfig()})()
+        vreg = FakeCWRegistryStore(FakeConfig(), initlog=False)
         vreg.config['base-url'] = 'http://testing.fr/cubicweb/'
         vreg.config['language-mode'] = 'url-prefix'
         vreg.config.translations['fr'] = text_type, text_type
--- a/debian/changelog	Thu Nov 17 11:00:01 2016 +0100
+++ b/debian/changelog	Fri Nov 18 15:42:10 2016 +0100
@@ -1,3 +1,20 @@
+cubicweb (3.24.1-1) unstable; urgency=medium
+
+  * New upstream release.
+
+  * Ship the CubicWeb library in a single binary package python-cubicweb. Yet
+    keep meta packages for dependencies on the HTTP server (Pyramid or
+    Twisted) and the database backend.
+
+  * Remove cubicweb-mysql-support.
+
+  * Use dh_python and pybuild.
+
+  * Remove all daemon-related stuff from cubicweb-ctl package (since a
+    CubicWeb application should now be managed by a WSGI server).
+
+ -- David Douard <david.douard@logilab.fr>  Fri, 18 Nov 2016 14:58:28 +0100
+
 cubicweb (3.24.0-1) unstable; urgency=medium
 
   * New upstream release.
--- a/debian/compat	Thu Nov 17 11:00:01 2016 +0100
+++ b/debian/compat	Fri Nov 18 15:42:10 2016 +0100
@@ -1,1 +1,1 @@
-7
+9
--- a/debian/control	Thu Nov 17 11:00:01 2016 +0100
+++ b/debian/control	Fri Nov 18 15:42:10 2016 +0100
@@ -3,12 +3,15 @@
 Priority: optional
 Maintainer: Logilab S.A. <contact@logilab.fr>
 Uploaders: Sylvain Thenault <sylvain.thenault@logilab.fr>,
-           Adrien Di Mascio <Adrien.DiMascio@logilab.fr>,
-           Nicolas Chauvat <nicolas.chauvat@logilab.fr>
+           David Douard <david.douard@logilab.fr>,
 Build-Depends:
- debhelper (>= 7),
- python (>= 2.6),
+ debhelper (>= 9),
+ dh-python,
+ dh-systemd,
+ python-all,
+ python-setuptools,
  python-six (>= 1.4.0),
+ python-docutils,
  python-sphinx,
  python-logilab-common (>= 1.2.2),
  python-unittest2,
@@ -20,22 +23,93 @@
  python-lxml,
  python-setuptools,
  python-pyramid,
+ python-pyramid-multiauth,
  python-waitress,
-Standards-Version: 3.9.1
+ python-passlib,
+ python-wsgicors,
+ sphinx-common,
+Standards-Version: 3.9.6
 Homepage: https://www.cubicweb.org
-X-Python-Version: >= 2.6
+X-Python-Version: >= 2.7
 
-Package: cubicweb
+
+Package: python-cubicweb
 Architecture: all
 Depends:
  ${misc:Depends},
  ${python:Depends},
- cubicweb-server (= ${source:Version}),
- cubicweb-twisted (= ${source:Version})
+ python-six (>= 1.4.0),
+ python-logilab-mtconverter (>= 0.8.0),
+ python-logilab-common (>= 1.2.0),
+ python-logilab-database (>= 1.15.0),
+ python-yams (>= 0.44.0),
+ python-rql (>= 0.34.0),
+ python-lxml,
+ python-markdown,
+ python-passlib,
+ python-tz,
+ graphviz,
+ gettext,
 Recommends:
- postgresql
- | mysql
- | sqlite3
+ cubicweb-ctl (= ${source:Version}),
+ python-cubicweb-postgresql-support (= ${source:Version})
+ | sqlite3,
+ python-cubicweb-pyramid (= ${source:Version}),
+# common recommends
+ python-simpletal (>= 4.0),
+ python-crypto,
+# web recommends (mostly)
+ python-docutils (>= 0.6),
+ python-vobject,
+ fckeditor,
+ python-fyzz,
+ python-imaging,
+ python-rdflib,
+ python-werkzeug,
+# dev recommends
+ python-unittest2 (>= 0.7.0),
+ python-pysqlite2,
+Suggests:
+ python-zmq,
+ python-cwclientlib (>= 0.4.0),
+ python-cubicweb-twisted (= ${source:Version}),
+ python-cubicweb-documentation (= ${source:Version}),
+ w3c-dtd-xhtml,
+ xvfb,
+Replaces:
+ cubicweb (<< 3.24.0-1~),
+ cubicweb-server (<< 3.24.0-1~),
+ cubicweb-twisted (<< 3.24.0-1~),
+ cubicweb-web (<< 3.24.0-1~),
+ cubicweb-core,
+ cubicweb-common (<< 3.24.0-1~),
+Breaks:
+ cubicweb (<< 3.24.0-1~),
+ cubicweb-server (<< 3.24.0-1~),
+ cubicweb-twisted (<< 3.24.0-1~),
+ cubicweb-inlinedit (<< 1.1.1),
+ cubicweb-bootstrap (<< 0.6.6),
+ cubicweb-folder (<< 1.10.0),
+ cubicweb-web (<< 3.24.0-1~),
+ cubicweb-comment (<< 1.9.1),
+ cubicweb-person (<< 1.8.0),
+ cubicweb-geocoding (<< 0.2.0),
+ cubicweb-invoice (<< 0.6.1),
+ cubicweb-mercurial-server (<< 0.4.2),
+ cubicweb-forgotpwd (<< 0.4.3),
+ cubicweb-registration (<< 0.4.3),
+ cubicweb-vcsfile (<< 1.15.0),
+ cubicweb-bootstrap (<< 0.6),
+ cubicweb-common (<< 3.24.0-1~),
+Provides:
+ cubicweb,
+ cubicweb-server,
+ cubicweb-web-frontend,
+ cubicweb-web,
+ cubicweb-common,
+Conflicts:
+ cubicweb-multisources,
+ cubicweb-core,
 Description: the complete CubicWeb framework
  CubicWeb is a semantic web application framework.
  .
@@ -44,39 +118,13 @@
  on different computers, in which case you need to install the corresponding
  packages on the different hosts.
 
-Package: cubicweb-server
-Architecture: all
-Conflicts:
- cubicweb-multisources
-Replaces: cubicweb-multisources
-Provides: cubicweb-multisources
-Depends:
- ${misc:Depends},
- ${python:Depends},
- cubicweb-common (= ${source:Version}),
- cubicweb-ctl (= ${source:Version}),
- python-logilab-database (>= 1.15.0),
- cubicweb-postgresql-support
- | cubicweb-mysql-support
- | python-pysqlite2,
- python-passlib,
- python-tz,
-Recommends:
- cubicweb-documentation (= ${source:Version}),
-Suggests:
- python-zmq,
- python-cwclientlib (>= 0.4.0),
-Description: server part of the CubicWeb framework
- CubicWeb is a semantic web application framework.
- .
- This package provides the repository server part of the system.
- .
- This package provides the repository server part of the library and
- necessary shared data files such as the schema library.
 
-Package: cubicweb-postgresql-support
+Package: python-cubicweb-postgresql-support
 Architecture: all
 # postgresql-client packages for backup/restore of non local database
+Replaces: cubicweb-postgresql-support (<< 3.24.0-1~)
+Breaks: cubicweb-postgresql-support (<< 3.24.0-1~)
+Provides: cubicweb-postgresql-support
 Depends:
  ${misc:Depends},
  ${python:Depends},
@@ -85,51 +133,26 @@
 Description: postgres support for the CubicWeb framework
  CubicWeb is a semantic web application framework.
  .
- This virtual package provides dependencies to use postgres for the
- cubicweb repository.
-
-Package: cubicweb-mysql-support
-Architecture: all
-# mysql-client packages for backup/restore of non local database
-Depends:
- ${misc:Depends},
- ${python:Depends},
- python-mysqldb,
- mysql-client
-Description: mysql support for the CubicWeb framework
- CubicWeb is a semantic web application framework.
- .
- This virtual package provides dependencies to use mysql for the
+ This virtual package provides dependencies to use PostgreSQL for the
  cubicweb repository.
 
 
-Package: cubicweb-twisted
+Package: python-cubicweb-twisted
 Architecture: all
-Provides: cubicweb-web-frontend
 Depends:
- ${misc:Depends},
- ${python:Depends},
- cubicweb-web (= ${source:Version}),
- cubicweb-ctl (= ${source:Version}),
+ python-cubicweb (= ${source:Version}),
  python-twisted-web (<< 16.0.0),
-Recommends:
- cubicweb-documentation (= ${source:Version})
-Description: twisted-based web interface for the CubicWeb framework
+Description: meta package to use Twisted as HTTP server for CubicWeb
  CubicWeb is a semantic web application framework.
  .
- This package provides a twisted based HTTP server to serve
- the adaptative web interface (see cubicweb-web package).
- .
- This package provides only the twisted server part of the library.
+ This package includes dependencies to run a Twisted based HTTP server to serve
+ the adaptative web interface.
 
 
-Package: cubicweb-pyramid
+Package: python-cubicweb-pyramid
 Architecture: all
 Depends:
- ${misc:Depends},
- ${python:Depends},
- cubicweb-web (= ${source:Version}),
- cubicweb-ctl (= ${source:Version}),
+ python-cubicweb (= ${source:Version}),
  python-pyramid (>= 1.5.0),
  python-pyramid-multiauth,
  python-waitress (>= 0.8.9),
@@ -140,76 +163,9 @@
  pyramid-cubicweb
 Replaces:
  pyramid-cubicweb
-Description: Integrate CubicWeb with a Pyramid application
+Description: meta package to use Pyramid as HTTP server for CubicWeb
  Provides pyramid extensions to load a CubicWeb instance and serve it through
  the pyramid stack.
- .
- It prefigures what CubicWeb 4.0 will be.
-
-
-Package: cubicweb-web
-Architecture: all
-Depends:
- ${misc:Depends},
- ${python:Depends},
- cubicweb-common (= ${source:Version}),
-Recommends:
- python-docutils (>= 0.6),
- python-vobject,
- fckeditor,
- python-fyzz,
- python-imaging,
- python-rdflib,
- python-werkzeug,
-Breaks:
- cubicweb-inlinedit (<< 1.1.1),
- cubicweb-bootstrap (<< 0.6.6),
- cubicweb-folder (<< 1.10.0),
-Description: web interface library for the CubicWeb framework
- CubicWeb is a semantic web application framework.
- .
- This package provides an adaptative web interface to the CubicWeb server.
- It also ships a WSGI interface for CubicWeb instances.
- Install the cubicweb-twisted package to serve this interface via HTTP.
- .
- This package provides the web interface part of the library and
- necessary shared data files such as defaut views, images...
-
-
-Package: cubicweb-common
-Architecture: all
-Depends:
- ${misc:Depends},
- ${python:Depends},
- graphviz,
- gettext,
- python-six (>= 1.4.0),
- python-logilab-mtconverter (>= 0.8.0),
- python-logilab-common (>= 1.2.0),
- python-markdown,
- python-yams (>= 0.44.0),
- python-rql (>= 0.34.0),
- python-lxml
-Recommends:
- python-simpletal (>= 4.0),
- python-crypto
-Conflicts: cubicweb-core
-Replaces: cubicweb-core
-Breaks:
- cubicweb-comment (<< 1.9.1),
- cubicweb-person (<< 1.8.0),
- cubicweb-geocoding (<< 0.2.0),
- cubicweb-invoice (<< 0.6.1),
- cubicweb-mercurial-server (<< 0.4.2),
- cubicweb-forgotpwd (<< 0.4.3),
- cubicweb-registration (<< 0.4.3),
- cubicweb-vcsfile (<< 1.15.0),
- cubicweb-bootstrap (<< 0.6),
-Description: common library for the CubicWeb framework
- CubicWeb is a semantic web application framework.
- .
- This package provides the common parts of the library used by both server
- code and web application code.
 
 
 Package: cubicweb-ctl
@@ -217,7 +173,7 @@
 Depends:
  ${misc:Depends},
  ${python:Depends},
- cubicweb-common (= ${source:Version})
+ python-cubicweb (= ${source:Version})
 Description: tool to manage the CubicWeb framework
  CubicWeb is a semantic web application framework.
  .
@@ -226,33 +182,100 @@
  to automatically start and stop CubicWeb applications on boot or shutdown.
 
 
-Package: cubicweb-dev
+Package: python-cubicweb-documentation
 Architecture: all
+Section: doc
+Replaces: cubicweb-documentation (<< 3.24.0-1~)
+Breaks: cubicweb-documentation (<< 3.24.0-1~)
+Provides: cubicweb-documentation
 Depends:
  ${misc:Depends},
- ${python:Depends},
- cubicweb-server (= ${source:Version}),
- cubicweb-web (= ${source:Version}),
- cubicweb-twisted (= ${source:Version}),
- python-unittest2 (>= 0.7.0),
- python-pysqlite2
-Suggests:
- w3c-dtd-xhtml,
- xvfb
-Description: tests suite and development tools for the CubicWeb framework
- CubicWeb is a semantic web application framework.
- .
- This package provides the CubicWeb tests suite and some development tools
- helping in the creation of application.
-
-
-Package: cubicweb-documentation
-Architecture: all
-Depends:
- ${misc:Depends},
+ ${sphinxdoc:Depends},
 Recommends:
  doc-base
 Description: documentation for the CubicWeb framework
  CubicWeb is a semantic web application framework.
  .
  This package provides the system's documentation.
+
+
+# Transitional packages after renaming of (most) binary packages
+
+Package: cubicweb
+Architecture: all
+Priority: extra
+Section: oldlibs
+Depends:
+ python-cubicweb, ${misc:Depends}
+Description: transitional package
+  This is a transitional package. It can safely be removed.
+
+
+Package: cubicweb-server
+Architecture: all
+Priority: extra
+Section: oldlibs
+Depends:
+ python-cubicweb, ${misc:Depends}
+Description: transitional package
+  This is a transitional package. It can safely be removed.
+
+
+Package: cubicweb-postgresql-support
+Architecture: all
+Priority: extra
+Section: oldlibs
+Depends:
+ python-cubicweb-postgresql-support, ${misc:Depends}
+Description: transitional package
+  This is a transitional package. It can safely be removed.
+
+
+Package: cubicweb-twisted
+Architecture: all
+Priority: extra
+Section: oldlibs
+Depends:
+ python-cubicweb-twisted, ${misc:Depends}
+Description: transitional package
+  This is a transitional package. It can safely be removed.
+
+
+Package: cubicweb-web
+Architecture: all
+Priority: extra
+Section: oldlibs
+Depends:
+ python-cubicweb, ${misc:Depends}
+Description: transitional package
+  This is a transitional package. It can safely be removed.
+
+
+Package: cubicweb-common
+Architecture: all
+Priority: extra
+Section: oldlibs
+Depends:
+ python-cubicweb, ${misc:Depends}
+Description: transitional package
+  This is a transitional package. It can safely be removed.
+
+
+Package: cubicweb-dev
+Architecture: all
+Priority: extra
+Section: oldlibs
+Depends:
+ python-cubicweb, ${misc:Depends}
+Description: transitional package
+  This is a transitional package. It can safely be removed.
+
+
+Package: cubicweb-documentation
+Architecture: all
+Priority: extra
+Section: oldlibs
+Depends:
+ python-cubicweb-documentation, ${misc:Depends}
+Description: transitional package
+  This is a transitional package. It can safely be removed.
--- a/debian/cubicweb-common.install	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-usr/lib/python2*/*-packages/cubicweb/entities/
-usr/lib/python2*/*-packages/cubicweb/ext/
-usr/share/cubicweb/cubes/
-usr/lib/python2*/*-packages/cubicweb/*.py
--- a/debian/cubicweb-ctl.bash_completion	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-# -*- shell-script -*-
-
-_ec_commands()
-{
-    local commands
-    commands="$("$ec" listcommands 2>/dev/null)" || commands=""
-    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$commands' -- "$cur"))
-}
-
-_ec()
-{
-    local cur prev cmd cmd_index opts i
-    local ec="$1"
-
-    COMPREPLY=()
-    cur="$2"
-    prev="$3"
-
-    # searching for the command
-    # (first non-option argument that doesn't follow a global option that
-    #  receives an argument)
-    for ((i=1; $i<=$COMP_CWORD; i++)); do
-	if [[ ${COMP_WORDS[i]} != -* ]]; then
-	    cmd="${COMP_WORDS[i]}"
-	    cmd_index=$i
-	    break
-	fi
-    done
-
-    if [[ "$cur" == -* ]]; then
-        if [ -z "$cmd" ]; then
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '--help' -- "$cur"))
-	else
-	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || commands=""
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options' -- "$cur"))
-	fi
-	return
-    fi
-
-    if [ -z "$cmd" ] || [ $COMP_CWORD -eq $i ]; then
-	_ec_commands
-	return
-    fi
-
-    # try to generate completion candidates for whatever command the user typed
-    if _ec_command_specific; then
-	return
-    fi
-}
-
-_ec_command_specific()
-{
-    if [ "$(type -t "_ec_cmd_$cmd")" = function ]; then
-	"_ec_cmd_$cmd"
-	return 0
-    fi
-
-    case "$cmd" in
-	client)
-	    if [ "$prev" == "-b" ] || [ "$prev" == "--batch" ]; then
-		COMPREPLY=( $( compgen -o filenames -G "$cur*" ) )
-		return
-	    fi
-	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
-	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
-	;;
-	db-dump)
-	    if [ "$prev" == "-o" ] || [ "$prev" == "--output" ]; then
-		COMPREPLY=( $( compgen -o filenames -G "$cur*" ) )
-		return
-	    fi
-	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
-	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
-	;;
-	# commands with template as argument
- 	i18ncube)
-	    cubes="$("$ec" listcubes 2>/dev/null)" || cubes=""
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $cubes' -- "$cur"))
- 	;;
-	# generic commands with instance as argument
- 	start|stop|reload|restart|upgrade|start-repository|db-create|db-init|db-check|db-grant-user)
-	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
-	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
- 	;;
-	# generic commands without argument
- 	list|newtemplate|i18ncubicweb|live-server)
-	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
- 	;;
-	# generic commands without option
- 	shell|i18ninstance|delete|status|schema-sync)
-	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
- 	;;
-	# XXX should do better
- 	create)
-	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
- 	;;
- 	db-copy,db-restore,mboximport)
-	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
-	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
- 	;;
- 	*)
- 	    return 1
- 	;;
-    esac
-
-    return 0
-}
-
-complete -o bashdefault -o default -F _ec cubicweb-ctl 2>/dev/null \
-    || complete -o default -F _ec cubicweb-ctl
--- a/debian/cubicweb-ctl.cubicweb.init	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-#!/bin/sh -e
-
-### BEGIN INIT INFO
-# Provides:          cubicweb
-# Required-Start:    $remote_fs $syslog $local_fs $network
-# Required-Stop:     $remote_fs $syslog $local_fs $network
-# Should-Start:      postgresql
-# Should-Stop:       postgresql
-# Default-Start:     2 3 4 5
-# Default-Stop:      0 1 6
-# Short-Description: Start cubicweb application at boot time
-### END INIT INFO
-
-# FIXME Seems to be inadequate here
-cd /tmp
-
-# FIXME Work-around about the following lintian error
-#     E: cubicweb-ctl: init.d-script-does-not-implement-required-option /etc/init.d/cubicweb start
-#
-# Check if we are sure to not want the start-stop-daemon machinery here
-# Refer to Debian Policy Manual section 9.3.2 (Writing the scripts) for details.
-
-case $1 in
-    force-reload)
-        python -W ignore /usr/bin/cubicweb-ctl reload --force
-        ;;
-    status)
-        python -W ignore /usr/bin/cubicweb-ctl status
-        ;;
-    start|stop|restart|*)
-        python -W ignore /usr/bin/cubicweb-ctl $1 --force
-        ;;
-esac
--- a/debian/cubicweb-ctl.install	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-usr/bin/cubicweb-ctl usr/bin/
-usr/lib/python2*/*-packages/cubicweb/cwctl.py
-../cubicweb-ctl.bash_completion etc/bash_completion.d/cubicweb-ctl
--- a/debian/cubicweb-ctl.logrotate	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/var/log/cubicweb/*.log {
-        weekly
-        missingok
-        rotate 10
-        compress
-        delaycompress
-        notifempty
-        create 640 root adm
-        sharedscripts
-        postrotate
-           if [ -x /usr/sbin/invoke-rc.d ]; then \
-              invoke-rc.d cubicweb reload > /dev/null 2>&1; \
-           else \
-              /etc/init.d/cubicweb reload > /dev/null 2>&1; \
-           fi; \
-        endscript
-}
--- a/debian/cubicweb-ctl.postinst	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-#! /bin/sh -e
-
-case "$1" in
-    configure|abort-upgrade|abort-remove|abort-deconfigure)
-        update-rc.d cubicweb defaults 99 >/dev/null
-    ;;
-    *)
-        echo "postinst called with unknown argument \`$1'" >&2
-        exit 1
-    ;;
-esac
-
-#DEBHELPER#
-
-exit 0
--- a/debian/cubicweb-ctl.postrm	Thu Nov 17 11:00:01 2016 +0100
+++ b/debian/cubicweb-ctl.postrm	Fri Nov 18 15:42:10 2016 +0100
@@ -1,9 +1,5 @@
 #!/bin/sh -e
 
-if [ "$1" = "remove" ]; then
-        update-rc.d cubicweb remove >/dev/null
-fi
- 
 if [ "$1" = "purge" ] ; then
         rm -rf /etc/cubicweb.d/
         rm -rf /var/log/cubicweb/
--- a/debian/cubicweb-dev.install	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-usr/lib/python2*/*-packages/cubicweb/devtools/
-usr/lib/python2*/*-packages/cubicweb/skeleton/
-usr/lib/python2*/*-packages/cubicweb/test
-usr/lib/python2*/*-packages/cubicweb/dataimport/test
-usr/lib/python2*/*-packages/cubicweb/entities/test
-usr/lib/python2*/*-packages/cubicweb/ext/test
-usr/lib/python2*/*-packages/cubicweb/server/test
-usr/lib/python2*/*-packages/cubicweb/sobjects/test
-usr/lib/python2*/*-packages/cubicweb/hooks/test
-usr/lib/python2*/*-packages/cubicweb/web/test
-usr/lib/python2*/*-packages/cubicweb/etwist/test
--- a/debian/cubicweb-dev.lintian-overrides	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-missing-dep-for-interpreter make => make | build-essential | dpkg-dev (usr/*/cubicweb/skeleton/debian/rules)
--- a/debian/cubicweb-documentation.doc-base	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-Document: cubicweb-doc
-Title: CubicWeb documentation
-Author: Logilab
-Abstract: Some base documentation for CubicWeb users and developpers
-Section: Apps/Programming
-
-Format: HTML
-Index: /usr/share/doc/cubicweb-documentation/html/index.html
-Files: /usr/share/doc/cubicweb-documentation/html/*
--- a/debian/cubicweb-documentation.install	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-../../doc/book usr/share/doc/cubicweb-documentation
-../../doc/_build/html usr/share/doc/cubicweb-documentation
--- a/debian/cubicweb-server.install	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-usr/lib/python2*/*-packages/cubicweb/dataimport/
-usr/lib/python2*/*-packages/cubicweb/server/
-usr/lib/python2*/*-packages/cubicweb/hooks/
-usr/lib/python2*/*-packages/cubicweb/sobjects/
-usr/lib/python2*/*-packages/cubicweb/schemas/
-usr/share/cubicweb/migration/
--- a/debian/cubicweb-server.postinst	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-#! /bin/sh -e
-
-if [ -x "/etc/init.d/cubicweb-ctl" ]; then
-    invoke-rc.d cubicweb-ctl restart || true
-fi
- 
- 
-#DEBHELPER#
- 
-exit 0
--- a/debian/cubicweb-server.prerm	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-#! /bin/sh -e
- 
-case "$1" in
-    remove)
-	if [ -x "/etc/init.d/cubicweb-ctl" ]; then
-	    invoke-rc.d cubicweb-ctl stop || true
-	fi
-    ;;
-esac
- 
-#DEBHELPER#
- 
-exit 0
--- a/debian/cubicweb-twisted.install	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-usr/lib/python2*/*-packages/cubicweb/etwist/
--- a/debian/cubicweb-twisted.postinst	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-#! /bin/sh -e
-
-if [ -x "/etc/init.d/cubicweb-ctl" ]; then
-    invoke-rc.d cubicweb-ctl restart || true
-fi
- 
- 
-#DEBHELPER#
- 
-exit 0
--- a/debian/cubicweb-twisted.prerm	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-#! /bin/sh -e
- 
-case "$1" in
-    remove)
-	if [ -x "/etc/init.d/cubicweb-ctl" ]; then
-	    invoke-rc.d cubicweb-ctl stop || true
-	fi
-    ;;
-esac
- 
-#DEBHELPER#
- 
-exit 0
--- a/debian/cubicweb-web.install	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-usr/lib/python2*/*-packages/cubicweb/web
-usr/lib/python2*/*-packages/cubicweb/wsgi
-usr/share/cubicweb/cubes/shared/data
-usr/share/cubicweb/cubes/shared/wdoc
--- a/debian/cubicweb-web.lintian-overrides	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-cubicweb-web: embedded-javascript-library usr/share/cubicweb/cubes/shared/data/jquery.js
--- a/debian/pydist-overrides	Thu Nov 17 11:00:01 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-cubicweb cubicweb-common
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/python-cubicweb-documentation.doc-base	Fri Nov 18 15:42:10 2016 +0100
@@ -0,0 +1,9 @@
+Document: cubicweb-doc
+Title: CubicWeb Documentation
+Author: Logilab
+Abstract: Some base documentation for CubicWeb users and developpers
+Section: Apps/Programming
+
+Format: HTML
+Index: /usr/share/doc/python-cubicweb-documentation/html/index.html
+Files: /usr/share/doc/python-cubicweb-documentation/html/*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/python-cubicweb-documentation.docs	Fri Nov 18 15:42:10 2016 +0100
@@ -0,0 +1,2 @@
+debian/cubicweb-doc/html 
+doc/book
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/python-cubicweb.lintian-overrides	Fri Nov 18 15:42:10 2016 +0100
@@ -0,0 +1,2 @@
+missing-dep-for-interpreter make => make | build-essential | dpkg-dev (usr/*/cubicweb/skeleton/debian/rules)
+embedded-javascript-library usr/share/cubicweb/cubes/shared/data/jquery.js
--- a/debian/rules	Thu Nov 17 11:00:01 2016 +0100
+++ b/debian/rules	Fri Nov 18 15:42:10 2016 +0100
@@ -3,82 +3,27 @@
 # GNU copyright 1997 to 1999 by Joey Hess.
 
 # Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-build: build-stamp
-build-stamp:
-	dh_testdir
-	python setup.py build
-	# cubicweb.foo needs to be importable by sphinx, so create a cubicweb symlink to the source dir
-	mkdir -p debian/pythonpath
-	ln -sf $(CURDIR)/cubicweb debian/pythonpath
-	# documentation build is now made optional since it can break for old
-	# distributions and we don't want to block a new release of Cubicweb
-	# because of documentation issues.
-	-PYTHONPATH=$${PYTHONPATH:+$${PYTHONPATH}:}$(CURDIR)/debian/pythonpath $(MAKE) -C doc all
-	rm -rf debian/pythonpath
-	touch build-stamp
+# export DH_VERBOSE=1
 
-clean:
-	dh_testdir
-	rm -f build-stamp configure-stamp
-	rm -rf build
-	#rm -rf debian/cubicweb-*/
-	find . -name "*.pyc" -delete
-	-$(MAKE) -C doc clean
-	dh_clean
+export PYBUILD_NAME=cubicweb
+export PYBUILD_DISABLE_python2=test
 
-install: build
-	dh_testdir
-	dh_testroot
-	dh_clean
-	dh_installdirs
-
-	python setup.py -q install --no-compile --prefix=debian/tmp/usr
+%:
+	dh $@ --with python2,sphinxdoc --buildsystem=pybuild
 
-	# Put all the python library and data in cubicweb-common
-	# and scripts in cubicweb-server
-	dh_install -vi --sourcedir=debian/tmp
-	# cwctl in the cubicweb-ctl package
-	rm -f debian/cubicweb-common/usr/lib/python*/*/cubicweb/cwctl.py
-        # wdoc in the cubicweb-web package
-	rm -rf debian/cubicweb-common/usr/share/cubicweb/cubes/shared/wdoc
-	rm -rf debian/cubicweb-common/usr/share/cubicweb/cubes/shared/data
-	dh_lintian
-
-	# Remove unittests directory (should be available in cubicweb-dev only)
-	rm -rf debian/cubicweb-server/usr/lib/python2*/*-packages/cubicweb/dataimport/test
-	rm -rf debian/cubicweb-server/usr/lib/python2*/*-packages/cubicweb/server/test
-	rm -rf debian/cubicweb-server/usr/lib/python2*/*-packages/cubicweb/hooks/test
-	rm -rf debian/cubicweb-server/usr/lib/python2*/*-packages/cubicweb/sobjects/test
-	rm -rf debian/cubicweb-web/usr/lib/python2*/*-packages/cubicweb/web/test
-	rm -rf debian/cubicweb-twisted/usr/lib/python2*/*-packages/cubicweb/etwist/test
-	rm -rf debian/cubicweb-common/usr/lib/python2*/*-packages/cubicweb/ext/test
-	rm -rf debian/cubicweb-common/usr/lib/python2*/*-packages/cubicweb/entities/test
-	rm -rf debian/cubicweb-pyramid/usr/lib/python2*/*-packages/cubicweb/pyramid/tests
-
+override_dh_auto_build: export http_proxy=127.0.0.1:9
+override_dh_auto_build: export https_proxy=127.0.0.1:9
+override_dh_auto_build:
+	dh_auto_build
+ifeq (,$(findstring nodocs, $(DEB_BUILD_OPTIONS)))
+	PYTHONPATH=. sphinx-build -N -bhtml doc/ debian/cubicweb-doc/html
+endif
 
-# Build architecture-independent files here.
-binary-indep: build install
-	dh_testdir
-	dh_testroot -i
-	dh_python2 -i
-	dh_python2 -i /usr/share/cubicweb
-	dh_installinit -i -n --name cubicweb -u"defaults 99"
-	dh_installlogrotate -i
-	dh_installdocs -i -A README
-	dh_installman -i
-	dh_installchangelogs -i -Xdoc/changes
-	dh_link -i
-	dh_compress -i -X.py -X.ini -X.xml -X.js -X.rst -X.txt -Xchangelog.html
-	dh_fixperms -i
-	dh_installdeb -i
-	dh_gencontrol  -i
-	dh_md5sums -i
-	dh_builddeb -i
+override_dh_auto_install:
+	dh_auto_install
+	mv debian/python-${PYBUILD_NAME}/usr/bin/cubicweb-ctl \
+		debian/cubicweb-ctl/usr/bin/cubicweb-ctl
 
-binary-arch:
+override_dh_installchangelogs:
+	dh_installchangelogs -Xdoc/changes
 
-binary: binary-indep
-.PHONY: build clean binary binary-indep binary-arch
-
--- a/doc/changes/3.24.rst	Thu Nov 17 11:00:01 2016 +0100
+++ b/doc/changes/3.24.rst	Fri Nov 18 15:42:10 2016 +0100
@@ -1,5 +1,5 @@
-3.34 (UNRELEASED)
-=================
+3.24
+====
 
 New features
 ------------
@@ -13,3 +13,85 @@
   discovery by CubicWeb is handled by a new setuptools entry point
   ``cubicweb.cubes``. A backward compatibility layer is kept for "legacy"
   cubes.
+
+* Pyramid support made it into CubicWeb core. Applications that use it
+  should now declare the `cubicweb[pyramid]` dependency instead of
+  `cubicweb-pyramid`.
+
+* New `NullStore` class in ``cubicweb.dataimport.stores`` as new base class for
+  every store, and allowing to test your dataimport chain without actually
+  importing anything.
+
+
+Major changes
+-------------
+
+There has been several important changes to the core internals of CubicWeb:
+
+* Dropped `asource` and `extid` columns from the `entities` table as well as the
+  index on the `type` column, for a sensible optimization on both massive data
+  insertion and database size / index rebuilding.
+
+* Dropped the `moved_entities` table and related mecanism to remember that an
+  entity has been moved from a source to the system database - this is now the
+  responsability of source's parser to detect this (usually by remembering its
+  original external id as `cwuri`).
+
+* Dropped the original 'give me an eid for this extid, but call me back on
+  another line if it has to be created' mecanism on which the ``cwxmlparser`` was
+  relying, in favor of parsers using the dataimport API. This includes dropping
+  the ``cwxmlparser``. If you're using it, you'll have to write a specific
+  parser, examples to come.
+
+* Dropped source mapping handling (schema, views, logic) with its client
+  the ``cwxmlparser``. This is not worth the burden, specific parsers should be
+  preferred.
+
+The above changes lead to the following API changes:
+
+* `req.entity_metas(eid)` doesn't return anymore a 'type' nor 'source' keys, use
+  `req.entity_type(eid)` instead or 'cw_source' relation to get those
+  information,
+
+* deprecated `entity.cw_metainformation()`, which doesn't return anymore it's
+  'source' key,
+
+* dropped `repository.type_and_source_from_eid(eid, cnx)`,
+  `repository.extid2eid(...)` and `source.eid_type_source(cnx, eid)`,
+
+* dropped `source.support_entity(etype)` and `source.support_relation(rtype)`,
+
+* dropped 'cw_source' key from default JSON representation of an entity,
+
+* dropped `source_uris()` and `handle_deletion(...)` method from datafeed parser
+  base class, deletion of entities is now the responsability of specific
+  implementation (see ``ldapparser`` for example),
+
+* entities from external source are always displayed in the UI with a link
+  to the local entity, not the original one simplifying `entity.absolute_url()`
+  implementation and allowing to drop `use_ext_eid` argument of
+  `entity.rest_path()` (though it's still supported for backward compat).
+
+
+Changes to the massive store
+-----------------------------
+
+Several improvments have been done to ``cubicweb.dataimport.massive_store``,
+with among the more important ones:
+
+* Extended store API to provide more control to end-users:
+  `fill_entities_table`, `fill_relation_table`, `fill_meta_relation_table`.
+
+* Dropped `on_commit` / `on_rollback` arguments of the constructor.
+
+* Use a slave specific temporary table for entities insertion as for relations
+  (should improve concurrency when using in master/slaves mode).
+
+* Delay dropping of constraint to the `finish` method, avoiding performance
+  problem that was occuring because indexes were dropped at store creation time.
+
+* Consider the given metadata generator when looking for which metadata tables
+  should have their constraints dropped.
+
+* Don't drop index on `entities.eid`, it's too costly to rebuild on database
+  with some million of entities.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/cubicweb-ctl.bash_completion	Fri Nov 18 15:42:10 2016 +0100
@@ -0,0 +1,116 @@
+# -*- shell-script -*-
+
+_ec_commands()
+{
+    local commands
+    commands="$("$ec" listcommands 2>/dev/null)" || commands=""
+    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$commands' -- "$cur"))
+}
+
+_ec()
+{
+    local cur prev cmd cmd_index opts i
+    local ec="$1"
+
+    COMPREPLY=()
+    cur="$2"
+    prev="$3"
+
+    # searching for the command
+    # (first non-option argument that doesn't follow a global option that
+    #  receives an argument)
+    for ((i=1; $i<=$COMP_CWORD; i++)); do
+	if [[ ${COMP_WORDS[i]} != -* ]]; then
+	    cmd="${COMP_WORDS[i]}"
+	    cmd_index=$i
+	    break
+	fi
+    done
+
+    if [[ "$cur" == -* ]]; then
+        if [ -z "$cmd" ]; then
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '--help' -- "$cur"))
+	else
+	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || commands=""
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options' -- "$cur"))
+	fi
+	return
+    fi
+
+    if [ -z "$cmd" ] || [ $COMP_CWORD -eq $i ]; then
+	_ec_commands
+	return
+    fi
+
+    # try to generate completion candidates for whatever command the user typed
+    if _ec_command_specific; then
+	return
+    fi
+}
+
+_ec_command_specific()
+{
+    if [ "$(type -t "_ec_cmd_$cmd")" = function ]; then
+	"_ec_cmd_$cmd"
+	return 0
+    fi
+
+    case "$cmd" in
+	client)
+	    if [ "$prev" == "-b" ] || [ "$prev" == "--batch" ]; then
+		COMPREPLY=( $( compgen -o filenames -G "$cur*" ) )
+		return
+	    fi
+	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
+	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
+	;;
+	db-dump)
+	    if [ "$prev" == "-o" ] || [ "$prev" == "--output" ]; then
+		COMPREPLY=( $( compgen -o filenames -G "$cur*" ) )
+		return
+	    fi
+	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
+	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
+	;;
+	# commands with template as argument
+ 	i18ncube)
+	    cubes="$("$ec" listcubes 2>/dev/null)" || cubes=""
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $cubes' -- "$cur"))
+ 	;;
+	# generic commands with instance as argument
+ 	start|stop|reload|restart|upgrade|start-repository|db-create|db-init|db-check|db-grant-user)
+	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
+	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
+ 	;;
+	# generic commands without argument
+ 	list|newtemplate|i18ncubicweb|live-server)
+	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
+ 	;;
+	# generic commands without option
+ 	shell|i18ninstance|delete|status|schema-sync)
+	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
+ 	;;
+	# XXX should do better
+ 	create)
+	    options="$("$ec" listcommands "$cmd" 2>/dev/null)" || options=""
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
+ 	;;
+ 	db-copy,db-restore,mboximport)
+	    instances="$("$ec" listinstances 2>/dev/null)" || instances=""
+	    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$options $instances' -- "$cur"))
+ 	;;
+ 	*)
+ 	    return 1
+ 	;;
+    esac
+
+    return 0
+}
+
+complete -o bashdefault -o default -F _ec cubicweb-ctl 2>/dev/null \
+    || complete -o default -F _ec cubicweb-ctl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flake8-ok-files.txt	Fri Nov 18 15:42:10 2016 +0100
@@ -0,0 +1,105 @@
+cubicweb/dataimport/csv.py
+cubicweb/dataimport/importer.py
+cubicweb/dataimport/massive_store.py
+cubicweb/dataimport/stores.py
+cubicweb/dataimport/test/data-massimport/schema.py
+cubicweb/dataimport/test/data/schema.py
+cubicweb/dataimport/test/test_csv.py
+cubicweb/dataimport/test/test_pgstore.py
+cubicweb/dataimport/test/test_massive_store.py
+cubicweb/dataimport/test/test_stores.py
+cubicweb/dataimport/test/unittest_importer.py
+cubicweb/devtools/test/data/cubes/i18ntestcube/__init__.py
+cubicweb/devtools/test/data/cubes/__init__.py
+cubicweb/devtools/test/data/schema.py
+cubicweb/devtools/testlib.py
+cubicweb/devtools/test/unittest_devctl.py
+cubicweb/devtools/test/unittest_i18n.py
+cubicweb/devtools/test/unittest_webtest.py
+cubicweb/devtools/webtest.py
+cubicweb/entities/adapters.py
+cubicweb/entities/test/unittest_base.py
+cubicweb/etwist/__init__.py
+cubicweb/ext/__init__.py
+cubicweb/hooks/test/data/hooks.py
+cubicweb/hooks/test/unittest_notification.py
+cubicweb/hooks/test/unittest_security.py
+cubicweb/hooks/test/unittest_syncsession.py
+cubicweb/__init__.py
+cubicweb/__main__.py
+cubicweb/pylintext.py
+cubicweb/server/repository.py
+cubicweb/server/rqlannotation.py
+cubicweb/server/schema2sql.py
+cubicweb/server/session.py
+cubicweb/server/sqlutils.py
+cubicweb/server/test/datacomputed/migratedapp/schema.py
+cubicweb/server/test/datacomputed/schema.py
+cubicweb/server/test/data/entities.py
+cubicweb/server/test/data-migractions/cubes/fakecustomtype/__init__.py
+cubicweb/server/test/data-migractions/cubes/fakeemail/__init__.py
+cubicweb/server/test/data-migractions/cubes/__init__.py
+cubicweb/server/test/data-migractions/migratedapp/__init__.py
+cubicweb/server/test/data-schema2sql/__init__.py
+cubicweb/server/test/unittest_checkintegrity.py
+cubicweb/server/test/unittest_ldapsource.py
+cubicweb/skeleton/test/pytestconf.py
+cubicweb/sobjects/test/unittest_notification.py
+cubicweb/sobjects/test/unittest_register_user.py
+cubicweb/sobjects/textparsers.py
+cubicweb/test/data/cubes/comment/__init__.py
+cubicweb/test/data/cubes/comment/__pkginfo__.py
+cubicweb/test/data/cubes/email/entities.py
+cubicweb/test/data/cubes/email/hooks.py
+cubicweb/test/data/cubes/email/__init__.py
+cubicweb/test/data/cubes/email/__pkginfo__.py
+cubicweb/test/data/cubes/email/views/__init__.py
+cubicweb/test/data/cubes/file/entities/__init__.py
+cubicweb/test/data/cubes/file/hooks/__init__.py
+cubicweb/test/data/cubes/file/__init__.py
+cubicweb/test/data/cubes/file/__pkginfo__.py
+cubicweb/test/data/cubes/file/views.py
+cubicweb/test/data/cubes/forge/__init__.py
+cubicweb/test/data/cubes/forge/__pkginfo__.py
+cubicweb/test/data/cubes/mycube/__init__.py
+cubicweb/test/data/cubes/mycube/__pkginfo__.py
+cubicweb/test/data/migration/0.1.0_common.py
+cubicweb/test/data/migration/0.1.0_repository.py
+cubicweb/test/data_schemareader/schema.py
+cubicweb/test/data/server_migration/bootstrapmigration_repository.py
+cubicweb/test/data/views.py
+cubicweb/test/unittest_binary.py
+cubicweb/test/unittest_mail.py
+cubicweb/test/unittest_repoapi.py
+cubicweb/test/unittest_schema.py
+cubicweb/test/unittest_toolsutils.py
+cubicweb/test/unittest_utils.py
+cubicweb/web/formwidgets.py
+cubicweb/web/test/data/entities.py
+cubicweb/web/test/unittest_http_headers.py
+cubicweb/web/test/unittest_views_basetemplates.py
+cubicweb/web/test/unittest_views_cwsources.py
+cubicweb/web/test/unittest_views_json.py
+cubicweb/web/views/json.py
+cubicweb/web/views/searchrestriction.py
+cubicweb/xy.py
+cubicweb/pyramid/auth.py
+cubicweb/pyramid/bwcompat.py
+cubicweb/pyramid/core.py
+cubicweb/pyramid/defaults.py
+cubicweb/pyramid/init_instance.py
+cubicweb/pyramid/__init__.py
+cubicweb/pyramid/login.py
+cubicweb/pyramid/predicates.py
+cubicweb/pyramid/profile.py
+cubicweb/pyramid/resources.py
+cubicweb/pyramid/rest_api.py
+cubicweb/pyramid/session.py
+cubicweb/pyramid/tools.py
+cubicweb/pyramid/test/__init__.py
+cubicweb/pyramid/test/test_bw_request.py
+cubicweb/pyramid/test/test_core.py
+cubicweb/pyramid/test/test_login.py
+cubicweb/pyramid/test/test_rest_api.py
+cubicweb/pyramid/test/test_tools.py
+cubicweb/pyramid/pyramidctl.py
--- a/setup.py	Thu Nov 17 11:00:01 2016 +0100
+++ b/setup.py	Fri Nov 18 15:42:10 2016 +0100
@@ -228,7 +228,7 @@
         'Markdown',
         'unittest2 >= 0.7.0',
     ],
-    extra_requires={
+    extras_require={
         'captcha': [
             'Pillow',
         ],
--- a/tox.ini	Thu Nov 17 11:00:01 2016 +0100
+++ b/tox.ini	Fri Nov 18 15:42:10 2016 +0100
@@ -25,8 +25,9 @@
 skip_install = true
 deps =
   flake8 >= 3
-commands =
-  flake8 {toxinidir}
+whitelist_externals =
+  /bin/sh
+commands = /bin/sh -c "flake8 `xargs -a {toxinidir}/flake8-ok-files.txt`"
 
 [testenv:doc]
 changedir = doc
@@ -40,7 +41,7 @@
 deps =
   check-manifest
 commands =
-  check-manifest {toxinidir} \
+  {envpython} -m check_manifest {toxinidir} \
 # ignore symlinks that are not recognized by check-manifest, see
 # https://github.com/mgedmin/check-manifest/issues/69
     --ignore cubicweb/devtools/test/data/cubes/i18ntestcube*,cubicweb/test/data/legacy_cubes*
@@ -53,112 +54,6 @@
 ignore = W503
 max-line-length = 100
 exclude = setup.py,doc/*,cubicweb/misc/*,cubicweb/test/*,cubicweb/*/test/*,.tox/*
-filename=
-  cubicweb/dataimport/csv.py,
-  cubicweb/dataimport/importer.py,
-  cubicweb/dataimport/massive_store.py,
-  cubicweb/dataimport/stores.py,
-  cubicweb/dataimport/test/data-massimport/schema.py,
-  cubicweb/dataimport/test/data/schema.py,
-  cubicweb/dataimport/test/test_csv.py,
-  cubicweb/dataimport/test/test_pgstore.py,
-  cubicweb/dataimport/test/test_massive_store.py,
-  cubicweb/dataimport/test/test_stores.py,
-  cubicweb/dataimport/test/unittest_importer.py,
-  cubicweb/devtools/test/data/cubes/i18ntestcube/__init__.py,
-  cubicweb/devtools/test/data/cubes/__init__.py,
-  cubicweb/devtools/test/data/schema.py,
-  cubicweb/devtools/testlib.py,
-  cubicweb/devtools/test/unittest_devctl.py,
-  cubicweb/devtools/test/unittest_i18n.py,
-  cubicweb/devtools/test/unittest_webtest.py,
-  cubicweb/devtools/webtest.py,
-  cubicweb/entities/adapters.py,
-  cubicweb/entities/test/unittest_base.py,
-  cubicweb/etwist/__init__.py,
-  cubicweb/ext/__init__.py,
-  cubicweb/hooks/test/data/hooks.py,
-  cubicweb/hooks/test/unittest_notification.py,
-  cubicweb/hooks/test/unittest_security.py,
-  cubicweb/hooks/test/unittest_syncsession.py,
-  cubicweb/__init__.py,
-  cubicweb/__main__.py,
-  cubicweb/pylintext.py,
-  cubicweb/server/repository.py,
-  cubicweb/server/rqlannotation.py,
-  cubicweb/server/schema2sql.py,
-  cubicweb/server/session.py,
-  cubicweb/server/sqlutils.py,
-  cubicweb/server/test/datacomputed/migratedapp/schema.py,
-  cubicweb/server/test/datacomputed/schema.py,
-  cubicweb/server/test/data/entities.py,
-  cubicweb/server/test/data-migractions/cubes/fakecustomtype/__init__.py,
-  cubicweb/server/test/data-migractions/cubes/fakeemail/__init__.py,
-  cubicweb/server/test/data-migractions/cubes/__init__.py,
-  cubicweb/server/test/data-migractions/migratedapp/__init__.py,
-  cubicweb/server/test/data-schema2sql/__init__.py,
-  cubicweb/server/test/unittest_checkintegrity.py,
-  cubicweb/server/test/unittest_ldapsource.py,
-  cubicweb/skeleton/test/pytestconf.py,
-  cubicweb/sobjects/test/unittest_notification.py,
-  cubicweb/sobjects/test/unittest_register_user.py,
-  cubicweb/sobjects/textparsers.py,
-  cubicweb/test/data/cubes/comment/__init__.py,
-  cubicweb/test/data/cubes/comment/__pkginfo__.py,
-  cubicweb/test/data/cubes/email/entities.py,
-  cubicweb/test/data/cubes/email/hooks.py,
-  cubicweb/test/data/cubes/email/__init__.py,
-  cubicweb/test/data/cubes/email/__pkginfo__.py,
-  cubicweb/test/data/cubes/email/views/__init__.py,
-  cubicweb/test/data/cubes/file/entities/__init__.py,
-  cubicweb/test/data/cubes/file/hooks/__init__.py,
-  cubicweb/test/data/cubes/file/__init__.py,
-  cubicweb/test/data/cubes/file/__pkginfo__.py,
-  cubicweb/test/data/cubes/file/views.py,
-  cubicweb/test/data/cubes/forge/__init__.py,
-  cubicweb/test/data/cubes/forge/__pkginfo__.py,
-  cubicweb/test/data/cubes/mycube/__init__.py,
-  cubicweb/test/data/cubes/mycube/__pkginfo__.py,
-  cubicweb/test/data/migration/0.1.0_common.py,
-  cubicweb/test/data/migration/0.1.0_repository.py,
-  cubicweb/test/data_schemareader/schema.py,
-  cubicweb/test/data/server_migration/bootstrapmigration_repository.py,
-  cubicweb/test/data/views.py,
-  cubicweb/test/unittest_binary.py,
-  cubicweb/test/unittest_mail.py,
-  cubicweb/test/unittest_repoapi.py,
-  cubicweb/test/unittest_schema.py,
-  cubicweb/test/unittest_toolsutils.py,
-  cubicweb/test/unittest_utils.py,
-  cubicweb/web/formwidgets.py,
-  cubicweb/web/test/data/entities.py,
-  cubicweb/web/test/unittest_http_headers.py,
-  cubicweb/web/test/unittest_views_basetemplates.py,
-  cubicweb/web/test/unittest_views_cwsources.py,
-  cubicweb/web/test/unittest_views_json.py,
-  cubicweb/web/views/json.py,
-  cubicweb/web/views/searchrestriction.py,
-  cubicweb/xy.py,
-  cubicweb/pyramid/auth.py,
-  cubicweb/pyramid/bwcompat.py,
-  cubicweb/pyramid/core.py,
-  cubicweb/pyramid/defaults.py,
-  cubicweb/pyramid/init_instance.py,
-  cubicweb/pyramid/__init__.py,
-  cubicweb/pyramid/login.py,
-  cubicweb/pyramid/predicates.py,
-  cubicweb/pyramid/profile.py,
-  cubicweb/pyramid/resources.py,
-  cubicweb/pyramid/rest_api.py,
-  cubicweb/pyramid/session.py,
-  cubicweb/pyramid/tools.py,
-  cubicweb/pyramid/test/__init__.py,
-  cubicweb/pyramid/test/test_bw_request.py,
-  cubicweb/pyramid/test/test_core.py,
-  cubicweb/pyramid/test/test_login.py,
-  cubicweb/pyramid/test/test_rest_api.py,
-  cubicweb/pyramid/test/test_tools.py,
-  cubicweb/pyramid/pyramidctl.py,
 
 
 # vim: wrap sts=2 sw=2