# HG changeset patch # User Denis Laxalde # Date 1479480130 -3600 # Node ID 48adf4dd1ce6d6dba06b223d9d3dac1592cb494d # Parent 1eb3d6cd39c3a8ba53838265fae9b159a97c1666# Parent 18e72d24dc58e578c08133e1d5327415ba2230da Merge 3.24 branch diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 .hgignore --- 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/.* diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 .hgtags --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 MANIFEST.in --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb.spec --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/__init__.py --- 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. diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/__pkginfo__.py diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/cwgettext.py --- 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() diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/dataimport/stores.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/devtools/devctl.py --- 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: diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/devtools/fake.py --- 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): diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/devtools/test/unittest_i18n.py --- 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: diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/devtools/testlib.py --- 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. diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/entities/wfobjs.py --- 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])) diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/hooks/syncschema.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/hooks/test/unittest_syncschema.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/i18n/de.po --- 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." diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/i18n/en.po --- 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 \n" "Language-Team: English \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" diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/i18n/es.po --- 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" diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/i18n/fr.po --- 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 \n" "Language-Team: 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" diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/misc/migration/3.24.0_Any.py --- 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') diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/__init__.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/auth.py --- 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 }, diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/bwcompat.py --- 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. diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/core.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/login.py --- 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) diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/pyramidctl.py --- 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/ - 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 configuration file option with .'}), ) - if cwversion >= (3, 21, 0): - options = options + ( - ('param', - {'short': 'p', - 'type': 'named', - 'metavar': 'key1:value1,key2:value2', - 'default': {}, - 'help': 'override configuration file option with .', - }), - ) _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) diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/resources.py --- 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): diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/rest_api.py --- 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( diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/test/test_bw_request.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/test/test_login.py --- 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__': diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/pyramid/tools.py --- 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) diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/req.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/server/repository.py --- 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')) diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/server/schema2sql.py --- 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 . """write a schema as sql""" - - from hashlib import md5 from six import string_types, text_type diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/server/session.py --- 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): diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/server/sqlutils.py --- 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 . """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) diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/skeleton/debian/control.tmpl --- 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. diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/sobjects/textparsers.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/test/unittest_repoapi.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/web/request.py --- 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') diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/web/test/unittest_application.py --- 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: diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 cubicweb/web/test/unittest_request.py --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/changelog --- 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 Fri, 18 Nov 2016 14:58:28 +0100 + cubicweb (3.24.0-1) unstable; urgency=medium * New upstream release. diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/compat --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/control --- 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. Uploaders: Sylvain Thenault , - Adrien Di Mascio , - Nicolas Chauvat + David Douard , 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. diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-common.install --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-ctl.bash_completion --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-ctl.cubicweb.init --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-ctl.install --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-ctl.logrotate --- 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 -} diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-ctl.postinst --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-ctl.postrm --- 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/ diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-dev.install --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-dev.lintian-overrides --- 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) diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-documentation.doc-base --- 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/* diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-documentation.install --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-server.install --- 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/ diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-server.postinst --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-server.prerm --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-twisted.install --- 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/ diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-twisted.postinst --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-twisted.prerm --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-web.install --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/cubicweb-web.lintian-overrides --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/pydist-overrides --- 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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/python-cubicweb-documentation.doc-base --- /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/* diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/python-cubicweb-documentation.docs --- /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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/python-cubicweb.lintian-overrides --- /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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 debian/rules --- 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 - diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 doc/changes/3.24.rst --- 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. diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 extras/cubicweb-ctl.bash_completion --- /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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 flake8-ok-files.txt --- /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 diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 setup.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', ], diff -r 1eb3d6cd39c3 -r 48adf4dd1ce6 tox.ini --- 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