merge 3.18.x in 3.19 branch
authorJulien Cristau <julien.cristau@logilab.fr>
Mon, 17 Feb 2014 15:32:50 +0100
changeset 9543 39f981482e34
parent 9520 78702b55c089 (current diff)
parent 9542 79b9bf88be28 (diff)
child 9544 59111c3bd02c
merge 3.18.x in 3.19 branch
_exceptions.py
dataimport.py
devtools/devctl.py
etwist/server.py
hooks/security.py
misc/migration/3.18.0_Any.py
misc/migration/bootstrapmigration_repository.py
server/checkintegrity.py
server/session.py
server/sources/__init__.py
server/sources/datafeed.py
server/sources/native.py
server/sources/rql2sql.py
server/test/unittest_querier.py
web/data/images/loadingAnimation.gif
web/data/images/ui-bg_diagonals-thick_18_b81900_40x40.png
web/data/images/ui-bg_diagonals-thick_20_666666_40x40.png
web/data/images/ui-bg_flat_10_000000_40x100.png
web/data/images/ui-bg_glass_100_f6f6f6_1x400.png
web/data/images/ui-bg_glass_100_fdf5ce_1x400.png
web/data/images/ui-bg_gloss-wave_35_f6a828_500x100.png
web/data/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
web/data/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
web/data/images/ui-icons_228ef1_256x240.png
web/data/images/ui-icons_ef8c08_256x240.png
web/data/images/ui-icons_ffd27a_256x240.png
web/data/images/ui-icons_ffffff_256x240.png
web/views/sessions.py
--- a/.hgtags	Mon Feb 03 16:30:07 2014 +0100
+++ b/.hgtags	Mon Feb 17 15:32:50 2014 +0100
@@ -323,9 +323,18 @@
 838d58a30f7efc6a8f83ac27ae8de7d79b84b2bb cubicweb-version-3.17.12
 838d58a30f7efc6a8f83ac27ae8de7d79b84b2bb cubicweb-debian-version-3.17.12-1
 838d58a30f7efc6a8f83ac27ae8de7d79b84b2bb cubicweb-centos-version-3.17.12-1
+09b4ebb9b0f179009491410c07cd013a60258fc6 cubicweb-version-3.17.13
+09b4ebb9b0f179009491410c07cd013a60258fc6 cubicweb-debian-version-3.17.13-1
+09b4ebb9b0f179009491410c07cd013a60258fc6 cubicweb-centos-version-3.17.13-1
 db37bf35a1474843ded0a537f9cb4838f4a78cda cubicweb-version-3.18.0
 db37bf35a1474843ded0a537f9cb4838f4a78cda cubicweb-debian-version-3.18.0-1
 db37bf35a1474843ded0a537f9cb4838f4a78cda cubicweb-centos-version-3.18.0-1
 60322cb8636c0402cdac025d3297626c41583023 cubicweb-version-3.18.1
 60322cb8636c0402cdac025d3297626c41583023 cubicweb-debian-version-3.18.1-1
 60322cb8636c0402cdac025d3297626c41583023 cubicweb-centos-version-3.18.1-1
+6880674c1a2669e3635abd688755116dda72e65e cubicweb-version-3.18.2
+6880674c1a2669e3635abd688755116dda72e65e cubicweb-debian-version-3.18.2-1
+6880674c1a2669e3635abd688755116dda72e65e cubicweb-centos-version-3.18.2-1
+afd21fea201a745051357b7aa6be3c7da1ae5bd2 cubicweb-version-3.18.3
+afd21fea201a745051357b7aa6be3c7da1ae5bd2 cubicweb-debian-version-3.18.3-1
+afd21fea201a745051357b7aa6be3c7da1ae5bd2 cubicweb-centos-version-3.18.3-1
--- a/__pkginfo__.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/__pkginfo__.py	Mon Feb 17 15:32:50 2014 +0100
@@ -22,14 +22,13 @@
 
 modname = distname = "cubicweb"
 
-numversion = (3, 18, 2)
+numversion = (3, 18, 3)
 version = '.'.join(str(num) for num in numversion)
 
 description = "a repository of entities / relations for knowledge management"
 author = "Logilab"
 author_email = "contact@logilab.fr"
 web = 'http://www.cubicweb.org'
-ftp = 'ftp://ftp.logilab.org/pub/cubicweb'
 license = 'LGPL'
 
 classifiers = [
--- a/_exceptions.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/_exceptions.py	Mon Feb 17 15:32:50 2014 +0100
@@ -180,9 +180,9 @@
     :param txuuid: Unique identifier of the partialy undone transaction
 
     :type errors: list
-    :param errors: List of errors occured during undoing
+    :param errors: List of errors occurred during undoing
     """
-    msg = u"The following error(s) occured while undoing transaction #%d : %s"
+    msg = u"The following error(s) occurred while undoing transaction #%d : %s"
 
     def __init__(self, txuuid, errors):
         super(UndoTransactionException, self).__init__(txuuid, errors)
--- a/cubicweb.spec	Mon Feb 03 16:30:07 2014 +0100
+++ b/cubicweb.spec	Mon Feb 17 15:32:50 2014 +0100
@@ -7,7 +7,7 @@
 %endif
 
 Name:           cubicweb
-Version:        3.18.2
+Version:        3.18.3
 Release:        logilab.1%{?dist}
 Summary:        CubicWeb is a semantic web application framework
 Source0:        http://download.logilab.org/pub/cubicweb/cubicweb-%{version}.tar.gz
--- a/dataimport.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/dataimport.py	Mon Feb 17 15:32:50 2014 +0100
@@ -873,7 +873,7 @@
         return getattr(self, 'gen_%s' % rtype)(entity)
 
     def gen_cwuri(self, entity):
-        return u'%seid/%s' % (self.baseurl, entity.eid)
+        return u'%s%s' % (self.baseurl, entity.eid)
 
     def gen_creation_date(self, entity):
         return self.time
@@ -1115,9 +1115,9 @@
     def _handle_source_relation_sql(self, session, sql, attrs):
         self._append_to_entities(sql, attrs)
 
-    # XXX add_info is similar to the one in NativeSQLSource. It is rewritten
-    # here to correctly used the _handle_xxx of the SQLGenSourceWrapper. This
-    # part should be rewritten in a more clearly way.
+    # add_info is _copypasted_ from the one in NativeSQLSource. We want it
+    # there because it will use the _handlers of the SQLGenSourceWrapper, which
+    # are not like the ones in the native source.
     def add_info(self, session, entity, source, extid, complete):
         """add type and source info for an eid into the system table"""
         # begin by inserting eid/type/source/extid into the entities table
--- a/debian/changelog	Mon Feb 03 16:30:07 2014 +0100
+++ b/debian/changelog	Mon Feb 17 15:32:50 2014 +0100
@@ -1,3 +1,9 @@
+cubicweb (3.18.3-1) unstable; urgency=low
+
+  * new upstream release
+
+ -- Julien Cristau <julien.cristau@logilab.fr>  Fri, 14 Feb 2014 16:03:55 +0100
+
 cubicweb (3.18.2-1) unstable; urgency=low
 
   * new upstream release.
@@ -16,6 +22,12 @@
 
  -- Julien Cristau <julien.cristau@logilab.fr>  Fri, 10 Jan 2014 17:14:18 +0100
 
+cubicweb (3.17.13-1) unstable; urgency=low
+
+  * new upstream release
+
+ -- Aurelien Campeas <aurelien.campeas@logilab.fr>  Mon, 10 Feb 2014 17:57:58 +0100
+
 cubicweb (3.17.12-1) unstable; urgency=low
 
   * new upstream release
--- a/debian/copyright	Mon Feb 03 16:30:07 2014 +0100
+++ b/debian/copyright	Mon Feb 17 15:32:50 2014 +0100
@@ -1,5 +1,5 @@
 This package was debianized by Logilab <contact@logilab.fr>.
-It was downloaded from ftp://ftp.logilab.org/pub/cubicweb
+It was downloaded from http://download.logilab.org/pub/cubicweb
 
 
 Upstream Author:
@@ -8,7 +8,7 @@
 
 Copyright:
 
-    Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
+    Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
     http://www.logilab.fr/ -- mailto:contact@logilab.fr
 
 License:
--- a/devtools/devctl.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/devtools/devctl.py	Mon Feb 17 15:32:50 2014 +0100
@@ -619,7 +619,7 @@
                           % (cubesdir, err))
         cubedir = osp.join(cubesdir, cubename)
         if osp.exists(cubedir):
-            self.fail("%s already exists !" % cubedir)
+            self.fail("%s already exists!" % cubedir)
         skeldir = osp.join(BASEDIR, 'skeleton')
         default_name = 'cubicweb-%s' % cubename.lower().replace('_', '-')
         if verbose:
--- a/devtools/fill.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/devtools/fill.py	Mon Feb 17 15:32:50 2014 +0100
@@ -384,10 +384,10 @@
 
 def composite_relation(rschema):
     for obj in rschema.objects():
-        if obj.rdef(rschema, 'object').composite == 'subject':
+        if obj.rdef(rschema, 'object', takefirst=True).composite == 'subject':
             return True
     for obj in rschema.subjects():
-        if obj.rdef(rschema, 'subject').composite == 'object':
+        if obj.rdef(rschema, 'subject', takefirst=True).composite == 'object':
             return True
     return False
 
--- a/doc/book/en/admin/ldap.rst	Mon Feb 03 16:30:07 2014 +0100
+++ b/doc/book/en/admin/ldap.rst	Mon Feb 17 15:32:50 2014 +0100
@@ -45,8 +45,27 @@
   be overridden in some subsequent source synchronisation).
 
 
-Configurations options of an LDAPfeed source
---------------------------------------------
+Configuration of an LDAPfeed source
+-----------------------------------
+
+Additional sources are created at cube creation time or later through the
+user interface.
+
+Configure an `ldapfeed` source from the user interface under `Manage` then
+`data sources`:
+
+* At this point `type` has been set to `ldapfeed`.
+
+* The `parser` attribute shall be set to `ldapfeed`.
+
+* The `url` attribute shall be set to an URL such as ldap://ldapserver.domain/.
+
+* The `configuration` attribute contains many options. They are described in
+  detail in the next paragraph.
+
+
+Options of an LDAPfeed source
+-----------------------------
 
 Let us enumerate the options by categories (LDAP server connection,
 LDAP schema mapping information).
@@ -109,5 +128,5 @@
   source, it (automatically) is activated again
 
 * You can use the :class:`CWSourceHostConfig` to have variants for a source
-  configuration according to the host the instance is running on. To do so go on
-  the source's view from the sources management view.
+  configuration according to the host the instance is running on. To do so
+  go on the source's view from the sources management view.
--- a/doc/book/en/conf.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/doc/book/en/conf.py	Mon Feb 17 15:32:50 2014 +0100
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
 #
 # This file is part of CubicWeb.
@@ -65,7 +65,7 @@
 
 # General substitutions.
 project = 'CubicWeb'
-copyright = '2001-2011, Logilab'
+copyright = '2001-2014, Logilab'
 
 # The default replacements for |version| and |release|, also used in various
 # other places throughout the built documents.
--- a/doc/book/en/devrepo/fti.rst	Mon Feb 03 16:30:07 2014 +0100
+++ b/doc/book/en/devrepo/fti.rst	Mon Feb 17 15:32:50 2014 +0100
@@ -47,8 +47,8 @@
 See :class:`~cubicweb.entities.adapters.IFTIndexableAdapter` for more documentation.
 
 
-Yams and ``fultext_container``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Yams and ``fulltext_container``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 It is possible in the datamodel to indicate that fulltext-indexed
 attributes defined for an entity type will be used to index not the
--- a/etwist/server.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/etwist/server.py	Mon Feb 17 15:32:50 2014 +0100
@@ -238,6 +238,7 @@
         key, pdict = parse_header(ctype)
         if key == 'application/x-www-form-urlencoded':
             self.args.update(http.parse_qs(self.content.read(), 1))
+            self.content.seek(0)
         elif key == 'multipart/form-data':
             # defer this as it can be extremely time consumming
             # with big files
--- a/etwist/test/data/views.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/etwist/test/data/views.py	Mon Feb 17 15:32:50 2014 +0100
@@ -22,7 +22,7 @@
 
 class PutView(View):
     __regid__ = 'put'
-    __select__ = match_http_method('PUT')
+    __select__ = match_http_method('PUT') | match_http_method('POST')
     binary = True
 
     def call(self):
--- a/etwist/test/unittest_server.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/etwist/test/unittest_server.py	Mon Feb 17 15:32:50 2014 +0100
@@ -17,6 +17,7 @@
 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
 
 import os, os.path as osp, glob
+import urllib
 
 from cubicweb.devtools.testlib import CubicWebTC
 from cubicweb.devtools.httptest import CubicWebServerTC
@@ -57,9 +58,14 @@
 
 class ETwistHTTPTC(CubicWebServerTC):
     def test_put_content(self):
-        body = 'hop'
+        data = {'hip': 'hop'}
+        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
+        body = urllib.urlencode(data)
         response = self.web_request('?vid=put', method='PUT', body=body)
         self.assertEqual(body, response.body)
+        response = self.web_request('?vid=put', method='POST', body=body,
+                                    headers=headers)
+        self.assertEqual(body, response.body)
 
 if __name__ == '__main__':
     from logilab.common.testlib import unittest_main
--- a/ext/rest.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/ext/rest.py	Mon Feb 17 15:32:50 2014 +0100
@@ -127,7 +127,7 @@
         view = _cw.vreg['views'].select(vid, _cw, rset=rset)
         content = view.render()
     except Exception as exc:
-        content = 'an error occured while interpreting this rql directive: %r' % exc
+        content = 'an error occurred while interpreting this rql directive: %r' % exc
     set_classes(options)
     return [nodes.raw('', content, format='html')], []
 
@@ -184,7 +184,7 @@
         view = _cw.vreg['views'].select(vid, _cw, rset=rset)
         content = view.render()
     except Exception, exc:
-        content = 'An error occured while interpreting directive bookmark: %r' % exc
+        content = 'An error occurred while interpreting directive bookmark: %r' % exc
     set_classes(options)
     return [nodes.raw('', content, format='html')], []
 
--- a/ext/test/unittest_rest.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/ext/test/unittest_rest.py	Mon Feb 17 15:32:50 2014 +0100
@@ -68,7 +68,7 @@
     def test_rql_role_with_unknown_vid(self):
         context = self.context()
         out = rest_publish(context, ':rql:`Any X WHERE X is CWUser:toto`')
-        self.assertTrue(out.startswith("<p>an error occured while interpreting this rql directive: ObjectNotFound(u'toto',)</p>"))
+        self.assertTrue(out.startswith("<p>an error occurred while interpreting this rql directive: ObjectNotFound(u'toto',)</p>"))
 
     def test_rql_role_without_vid(self):
         context = self.context()
--- a/i18n/de.po	Mon Feb 03 16:30:07 2014 +0100
+++ b/i18n/de.po	Mon Feb 17 15:32:50 2014 +0100
@@ -468,7 +468,7 @@
 msgid "Detected problems"
 msgstr ""
 
-msgid "Do you want to delete the following element(s) ?"
+msgid "Do you want to delete the following element(s)?"
 msgstr "Wollen Sie das/die folgend(n) Element(e) löschen?"
 
 msgid "Download schema as OWL"
@@ -4501,8 +4501,8 @@
 msgstr "Mittwoch"
 
 #, python-format
-msgid "welcome %s !"
-msgstr "Willkommen %s !"
+msgid "welcome %s!"
+msgstr "Willkommen %s!"
 
 msgid "wf_info_for"
 msgstr "Chronik von"
@@ -4595,115 +4595,3 @@
 #, python-format
 msgid "you should un-inline relation %s which is supported and may be crossed "
 msgstr ""
-
-#~ msgid "%(cstr)s constraint failed for value %(value)r"
-#~ msgstr "%(cstr)s Einschränkung verletzt für Wert %(value)r"
-
-#~ msgid "%(value)r doesn't match the %(regexp)r regular expression"
-#~ msgstr "%(value)r entspricht nicht dem regulären Ausdruck %(regexp)r"
-
-#~ msgid "%s not estimated"
-#~ msgstr "%s unbekannt(e)"
-
-#~ msgid ""
-#~ "Can't restore relation %(rtype)s of entity %(eid)s, this relation does "
-#~ "not exists anymore in the schema."
-#~ msgstr ""
-#~ "Kann die Relation %(rtype)s der Entität %(eid)s nicht wieder herstellen, "
-#~ "diese Relation existiert nicht mehr in dem Schema."
-
-#~ msgid "Data connection graph for %s"
-#~ msgstr "Graf der Datenverbindungen für %s"
-
-#~ msgid "From:"
-#~ msgstr "Von:"
-
-#~ msgid "Got rhythm?"
-#~ msgstr "Hast Du Rhythmus ?"
-
-#~ msgid "Recipients:"
-#~ msgstr "Adressaten:"
-
-#~ msgid "Subject:"
-#~ msgstr "Subjekt :"
-
-#~ msgid "What's new?"
-#~ msgstr "Was ist neu?"
-
-#~ msgid "You can use any of the following substitutions in your text"
-#~ msgstr "Sie können die folgenden Ersetzungen in Ihrem Text verwenden:"
-
-#~ msgid "can't change the %s attribute"
-#~ msgstr "Kann das Attribut %s nicht ändern."
-
-#~ msgid "cost"
-#~ msgstr "Kosten"
-
-#~ msgid "emails successfully sent"
-#~ msgstr "E-Mails erfolgreich versandt."
-
-#~ msgid "embed"
-#~ msgstr "einbetten"
-
-#~ msgid "embedding this url is forbidden"
-#~ msgstr "Einbettung dieses URLs ist nicht erlaubt."
-
-#~ msgid "error while embedding page"
-#~ msgstr "Fehler beim Einbetten der Seite"
-
-#~ msgid "eta_date"
-#~ msgstr "Enddatum"
-
-#~ msgid "expected:"
-#~ msgstr "erwartet:"
-
-#~ msgid "external page"
-#~ msgstr "externe Seite"
-
-#~ msgid "incorrect value (%(value)s) for type \"%(type)s\""
-#~ msgstr "Wert %(value)s ungültig für den Typ \"%(type)s\""
-
-#~ msgid "initial estimation %s"
-#~ msgstr "Erste Schätzung %s"
-
-#~ msgid "invalid value %(value)s, it must be one of %(choices)s"
-#~ msgstr "Wert %(value)s ungültig, er muss zwischen %(choices)s"
-
-#~ msgid "milestone"
-#~ msgstr "Meilenstein"
-
-#~ msgid "no related project"
-#~ msgstr "kein verknüpftes Projekt"
-
-#~ msgid "progress"
-#~ msgstr "Fortschritt"
-
-#~ msgid "progress bar"
-#~ msgstr "Fortschrittsbalken"
-
-#~ msgid "project"
-#~ msgstr "Projekt"
-
-#~ msgid "send email"
-#~ msgstr "E-Mail senden"
-
-#~ msgid "sioc"
-#~ msgstr "sioc"
-
-#~ msgid "task progression"
-#~ msgstr "Fortschritt der Aufgabe"
-
-#~ msgid "todo_by"
-#~ msgstr "zu erledigen bis"
-
-#~ msgid "toggle filter"
-#~ msgstr "filter verbergen/zeigen"
-
-#~ msgid "violates unique_together constraints (%s)"
-#~ msgstr "Verletzung der unique_together-Einschränkung (%s)"
-
-#~ msgid "workflow already have a state of that name"
-#~ msgstr "Der Workflow hat bereits einen Zustand desselben Namens."
-
-#~ msgid "workflow already have a transition of that name"
-#~ msgstr "Der Workflow hat bereits einen Übergang desselben Namens."
--- a/i18n/en.po	Mon Feb 03 16:30:07 2014 +0100
+++ b/i18n/en.po	Mon Feb 17 15:32:50 2014 +0100
@@ -446,7 +446,7 @@
 msgid "Detected problems"
 msgstr ""
 
-msgid "Do you want to delete the following element(s) ?"
+msgid "Do you want to delete the following element(s)?"
 msgstr ""
 
 msgid "Download schema as OWL"
@@ -4390,7 +4390,7 @@
 msgstr ""
 
 #, python-format
-msgid "welcome %s !"
+msgid "welcome %s!"
 msgstr ""
 
 msgid "wf_info_for"
@@ -4482,12 +4482,3 @@
 #, python-format
 msgid "you should un-inline relation %s which is supported and may be crossed "
 msgstr ""
-
-#~ msgid "eta_date"
-#~ msgstr "ETA date"
-
-#~ msgid "todo_by"
-#~ msgstr "to do by"
-
-#~ msgid "violates unique_together constraints (%s)"
-#~ msgstr "violates unique_together constraints (%s)"
--- a/i18n/es.po	Mon Feb 03 16:30:07 2014 +0100
+++ b/i18n/es.po	Mon Feb 17 15:32:50 2014 +0100
@@ -468,7 +468,7 @@
 msgid "Detected problems"
 msgstr "Problemas detectados"
 
-msgid "Do you want to delete the following element(s) ?"
+msgid "Do you want to delete the following element(s)?"
 msgstr "Desea eliminar el(los) elemento(s) siguiente(s)"
 
 msgid "Download schema as OWL"
@@ -4547,8 +4547,8 @@
 msgstr "Miércoles"
 
 #, python-format
-msgid "welcome %s !"
-msgstr "¡ Bienvenido %s  !"
+msgid "welcome %s!"
+msgstr "¡ Bienvenido %s !"
 
 msgid "wf_info_for"
 msgstr "Histórico de"
@@ -4644,123 +4644,3 @@
 msgstr ""
 "usted debe  quitar la puesta en línea de la relación %s que es aceptada y "
 "puede ser cruzada"
-
-#~ msgid "%(cstr)s constraint failed for value %(value)r"
-#~ msgstr "el valor %(value)r no satisface la condición %(cstr)s"
-
-#~ msgid "%(value)r doesn't match the %(regexp)r regular expression"
-#~ msgstr "%(value)r no corresponde a la expresión regular %(regexp)r"
-
-#~ msgid "%s not estimated"
-#~ msgstr "%s no estimado(s)"
-
-#~ msgid ""
-#~ "Can't restore relation %(rtype)s of entity %(eid)s, this relation does "
-#~ "not exists anymore in the schema."
-#~ msgstr ""
-#~ "No puede restaurar la relación %(rtype)s de la entidad %(eid)s, esta "
-#~ "relación ya no existe en el esquema."
-
-#~ msgid "Data connection graph for %s"
-#~ msgstr "Gráfica de conexión de datos para %s"
-
-#~ msgid "From:"
-#~ msgstr "De: "
-
-#~ msgid "Got rhythm?"
-#~ msgstr "Tenemos Ritmo?"
-
-#~ msgid "Recipients:"
-#~ msgstr "Destinatarios :"
-
-#~ msgid "Subject:"
-#~ msgstr "Sujeto:"
-
-#~ msgid "What's new?"
-#~ msgstr "Lo más reciente"
-
-#~ msgid "You can use any of the following substitutions in your text"
-#~ msgstr ""
-#~ "Puede realizar cualquiera de las siguientes sustituciones en el contenido "
-#~ "de su email."
-
-#~ msgid "can't change the %s attribute"
-#~ msgstr "no puede modificar el atributo %s"
-
-#~ msgid "can't change this relation"
-#~ msgstr "no puede modificar esta relación"
-
-#~ msgid "cost"
-#~ msgstr "Costo"
-
-#~ msgid "emails successfully sent"
-#~ msgstr "Mensajes enviados con éxito"
-
-#~ msgid "embed"
-#~ msgstr "Incrustado"
-
-#~ msgid "embedding this url is forbidden"
-#~ msgstr "La inclusión de este url esta prohibida"
-
-#~ msgid "error while embedding page"
-#~ msgstr "Error durante la inclusión de la página"
-
-#~ msgid "eta_date"
-#~ msgstr "Fecha de fin"
-
-#~ msgid "expected:"
-#~ msgstr "Previsto :"
-
-#~ msgid "external page"
-#~ msgstr "Página externa"
-
-#~ msgid "incorrect value (%(value)s) for type \"%(type)s\""
-#~ msgstr "valor %(value)s incorrecto para el tipo \"%(type)s\""
-
-#~ msgid "initial estimation %s"
-#~ msgstr "Estimación inicial %s"
-
-#~ msgid "invalid value %(value)s, it must be one of %(choices)s"
-#~ msgstr "Valor %(value)s incorrecto, debe estar entre %(choices)s"
-
-#~ msgid "milestone"
-#~ msgstr "Milestone"
-
-#~ msgid "no related project"
-#~ msgstr "No tiene proyecto relacionado"
-
-#~ msgid "progress"
-#~ msgstr "Progreso"
-
-#~ msgid "progress bar"
-#~ msgstr "Barra de Progreso"
-
-#~ msgid "project"
-#~ msgstr "Proyecto"
-
-#~ msgid "send email"
-#~ msgstr "Enviar email"
-
-#~ msgid "sioc"
-#~ msgstr "SIOC"
-
-#~ msgid "task progression"
-#~ msgstr "Progreso de la Acción"
-
-#~ msgid "todo_by"
-#~ msgstr "Asignada a"
-
-#~ msgid "toggle filter"
-#~ msgstr "esconder/mostrar el filtro"
-
-#~ msgid "unknown source type"
-#~ msgstr "tipo de fuente desconocida"
-
-#~ msgid "violates unique_together constraints (%s)"
-#~ msgstr "viola el principio (o restricción) de singularidad (%s)"
-
-#~ msgid "workflow already have a state of that name"
-#~ msgstr "El Workflow ya tiene un Estado con ese nombre"
-
-#~ msgid "workflow already have a transition of that name"
-#~ msgstr "El Workflow ya tiene una transición con ese nombre"
--- a/i18n/fr.po	Mon Feb 03 16:30:07 2014 +0100
+++ b/i18n/fr.po	Mon Feb 17 15:32:50 2014 +0100
@@ -471,7 +471,7 @@
 msgid "Detected problems"
 msgstr "Problèmes détectés"
 
-msgid "Do you want to delete the following element(s) ?"
+msgid "Do you want to delete the following element(s)?"
 msgstr "Voulez-vous supprimer le(s) élément(s) suivant(s) ?"
 
 msgid "Download schema as OWL"
@@ -4569,7 +4569,7 @@
 msgstr "mercredi"
 
 #, python-format
-msgid "welcome %s !"
+msgid "welcome %s!"
 msgstr "bienvenue %s !"
 
 msgid "wf_info_for"
--- a/misc/migration/3.18.0_Any.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/misc/migration/3.18.0_Any.py	Mon Feb 17 15:32:50 2014 +0100
@@ -138,4 +138,7 @@
 # all attributes perms have to be refreshed ...
 for rschema in schema.relations():
     if rschema.final:
-        sync_schema_props_perms(rschema.type, syncprops=False)
+        if rschema.type in fsschema:
+            sync_schema_props_perms(rschema.type, syncprops=False, ask_confirm=False)
+        else:
+            print 'WARNING: attribute %s missing from fs schema' % rschema.type
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/migration/3.18.4_Any.py	Mon Feb 17 15:32:50 2014 +0100
@@ -0,0 +1,2 @@
+sync_schema_props_perms('CWSource')
+sync_schema_props_perms('CWSourceHostConfig')
--- a/misc/migration/bootstrapmigration_repository.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/misc/migration/bootstrapmigration_repository.py	Mon Feb 17 15:32:50 2014 +0100
@@ -157,7 +157,7 @@
             type, source, extid = session.describe(eid)
             if source == 'system':
                 rql('SET X cwuri %(u)s WHERE X eid %(x)s',
-                    {'x': eid, 'u': base_url + u'eid/%s' % eid})
+                    {'x': eid, 'u': u'%s%s' % (base_url, eid)})
         isession.commit()
         session.set_shared_data('do-not-insert-cwuri', False)
 
--- a/misc/scripts/chpasswd.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/misc/scripts/chpasswd.py	Mon Feb 17 15:32:50 2014 +0100
@@ -26,15 +26,15 @@
 if __args__:
     login = __args__.pop()
 else:
-    login = raw_input("login ? ")
+    login = raw_input("login? ")
 
 rset = rql('Any U WHERE U is CWUser, U login %(login)s', {'login': login})
 
 if len(rset) != 1:
     sys.exit("user '%s' does not exist!" % login)
 
-pass1 = getpass.getpass(prompt='Enter new password ? ')
-pass2 = getpass.getpass(prompt='Confirm ? ')
+pass1 = getpass.getpass(prompt='Enter new password? ')
+pass2 = getpass.getpass(prompt='Confirm? ')
 
 if pass1 != pass2:
     sys.exit("passwords don't match!")
--- a/misc/scripts/ldapuser2ldapfeed.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/misc/scripts/ldapuser2ldapfeed.py	Mon Feb 17 15:32:50 2014 +0100
@@ -90,7 +90,7 @@
 source_ent.cw_set(type=u"ldapfeed", parser=u"ldapfeed")
 
 
-if raw_input('Commit ?') in 'yY':
+if raw_input('Commit?') in 'yY':
     print 'committing'
     commit()
 else:
--- a/schemas/base.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/schemas/base.py	Mon Feb 17 15:32:50 2014 +0100
@@ -247,6 +247,7 @@
                                   'source\'s type'),
                     __permissions__={
                         'read':   ('managers',),
+                        'add':    ('managers',),
                         'update': ('managers',),
                         })
     # put this here and not in a subclass even if it's only for some sources
@@ -284,6 +285,7 @@
                                   'values defined on the source.'),
                     __permissions__={
                         'read':   ('managers',),
+                        'add':    ('managers',),
                         'update': ('managers',),
                         })
 
--- a/server/checkintegrity.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/server/checkintegrity.py	Mon Feb 17 15:32:50 2014 +0100
@@ -55,8 +55,8 @@
         eids[eid] = False
         return False
     elif len(result) > 1:
-        msg = ('  More than one entity with eid %s exists in source !\n'
-               '  WARNING : Unable to fix this, do it yourself !\n')
+        msg = ('  More than one entity with eid %s exists in source!\n'
+               '  WARNING : Unable to fix this, do it yourself!\n')
         sys.stderr.write(msg % eid)
     eids[eid] = True
     return True
--- a/server/rqlannotation.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/server/rqlannotation.py	Mon Feb 17 15:32:50 2014 +0100
@@ -35,15 +35,6 @@
     #if server.DEBUG:
     #    print '-------- sql annotate', repr(rqlst)
     getrschema = annotator.schema.rschema
-    need_distinct = rqlst.distinct
-    for rel in rqlst.iget_nodes(Relation):
-        if getrschema(rel.r_type).symmetric and not isinstance(rel.parent, Exists):
-            for vref in rel.iget_nodes(VariableRef):
-                stinfo = vref.variable.stinfo
-                if not stinfo['constnode'] and stinfo['selected']:
-                    need_distinct = True
-                    # XXX could mark as not invariant
-                    break
     for var in rqlst.defined_vars.itervalues():
         stinfo = var.stinfo
         if stinfo.get('ftirels'):
@@ -158,7 +149,6 @@
     for col_alias in rqlst.aliases.itervalues():
         if col_alias.stinfo.get('ftirels'):
             has_text_query = True
-    rqlst.need_distinct = need_distinct
     return has_text_query
 
 
--- a/server/session.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/server/session.py	Mon Feb 17 15:32:50 2014 +0100
@@ -1740,7 +1740,7 @@
 
 
 class InternalSession(Session):
-    """special session created internaly by the repository"""
+    """special session created internally by the repository"""
     is_internal_session = True
     running_dbapi_query = False
 
--- a/server/sources/datafeed.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/server/sources/datafeed.py	Mon Feb 17 15:32:50 2014 +0100
@@ -192,7 +192,7 @@
         myuris = self.source_cwuris(session)
         parser = self._get_parser(session, sourceuris=myuris, import_log=importlog)
         if self.process_urls(parser, self.urls, raise_on_error):
-            self.warning("some error occured, don't attempt to delete entities")
+            self.warning("some error occurred, don't attempt to delete entities")
         else:
             parser.handle_deletion(self.config, session, myuris)
         self.update_latest_retrieval(session)
--- a/server/sources/native.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/server/sources/native.py	Mon Feb 17 15:32:50 2014 +0100
@@ -372,7 +372,7 @@
             self._eid_creation_cnx.close()
             self._eid_creation_cnx = None
 
-    # XXX deprecates [un]map_attribute ?
+    # XXX deprecates [un]map_attribute?
     def map_attribute(self, etype, attr, cb, sourcedb=True):
         self._rql_sqlgen.attr_map['%s.%s' % (etype, attr)] = (cb, sourcedb)
 
--- a/server/sources/rql2sql.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/server/sources/rql2sql.py	Mon Feb 17 15:32:50 2014 +0100
@@ -116,7 +116,6 @@
             continue
         unstable.remove(varname)
         newselect = Select()
-        newselect.need_distinct = False
         myunion = Union()
         myunion.append(newselect)
         # extract aliases / selection
@@ -688,7 +687,7 @@
     Groups and sort are not handled here since they should not be handled at
     this level (see cubicweb.server.querier)
 
-    we should not have errors here !
+    we should not have errors here!
 
     WARNING: a CubicWebSQLGenerator instance is not thread safe, but generate is
     protected by a lock
@@ -703,9 +702,6 @@
                             }
         if not self.dbhelper.union_parentheses_support:
             self.union_sql = self.noparen_union_sql
-        if self.dbhelper.fti_need_distinct:
-            self.__union_sql = self.union_sql
-            self.union_sql = self.has_text_need_distinct_union_sql
         self._lock = threading.Lock()
         if attrmap is None:
             attrmap = {}
@@ -739,12 +735,6 @@
         finally:
             self._lock.release()
 
-    def has_text_need_distinct_union_sql(self, union, needalias=False):
-        if getattr(union, 'has_text_query', False):
-            for select in union.children:
-                select.need_distinct = True
-        return self.__union_sql(union, needalias)
-
     def union_sql(self, union, needalias=False): # pylint: disable=E0202
         if len(union.children) == 1:
             return self.select_sql(union.children[0], needalias)
@@ -772,7 +762,12 @@
         :needwrap: boolean telling if the query will be wrapped in an outer
           query (to deal with aggregat and/or grouping)
         """
-        distinct = selectsortterms = select.need_distinct
+        if select.distinct:
+            distinct = True
+        elif self.dbhelper.fti_need_distinct:
+            distinct = getattr(select.parent, 'has_text_query', False)
+        else:
+            distinct = False
         sorts = select.orderby
         groups = select.groupby
         having = select.having
@@ -796,6 +791,7 @@
         # selection (union or distinct query) and wrapping (union with groups)
         needwrap = False
         sols = select.solutions
+        selectsortterms = distinct
         if len(sols) > 1:
             # remove invariant from solutions
             sols, existssols, unstable = remove_unused_solutions(
--- a/server/test/unittest_querier.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/server/test/unittest_querier.py	Mon Feb 17 15:32:50 2014 +0100
@@ -706,17 +706,17 @@
         self.execute("INSERT Personne X: X nom 'trucmuche'")
         self.execute("SET X connait Y WHERE X nom 'chouette', Y nom 'bidule'")
         self.execute("SET X connait Y WHERE X nom 'machin', Y nom 'chouette'")
-        rset = self.execute('Any P where P connait P2')
-        self.assertEqual(len(rset.rows), 3, rset.rows)
-        rset = self.execute('Any P where NOT P connait P2')
+        rset = self.execute('Any P WHERE P connait P2')
+        self.assertEqual(len(rset.rows), 4, rset.rows)
+        rset = self.execute('Any P WHERE NOT P connait P2')
         self.assertEqual(len(rset.rows), 1, rset.rows) # trucmuche
-        rset = self.execute('Any P where P connait P2, P2 nom "bidule"')
+        rset = self.execute('Any P WHERE P connait P2, P2 nom "bidule"')
         self.assertEqual(len(rset.rows), 1, rset.rows)
-        rset = self.execute('Any P where P2 connait P, P2 nom "bidule"')
+        rset = self.execute('Any P WHERE P2 connait P, P2 nom "bidule"')
         self.assertEqual(len(rset.rows), 1, rset.rows)
-        rset = self.execute('Any P where P connait P2, P2 nom "chouette"')
+        rset = self.execute('Any P WHERE P connait P2, P2 nom "chouette"')
         self.assertEqual(len(rset.rows), 2, rset.rows)
-        rset = self.execute('Any P where P2 connait P, P2 nom "chouette"')
+        rset = self.execute('Any P WHERE P2 connait P, P2 nom "chouette"')
         self.assertEqual(len(rset.rows), 2, rset.rows)
 
     def test_select_inline(self):
--- a/setup.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/setup.py	Mon Feb 17 15:32:50 2014 +0100
@@ -188,7 +188,7 @@
             MyInstallMoreData.run(self)
             self.install_dir = _old_install_dir
     try:
-        import setuptools.command.easy_install # only if easy_install avaible
+        import setuptools.command.easy_install # only if easy_install available
         # monkey patch: Crack SandboxViolation verification
         from setuptools.sandbox import DirectorySandbox as DS
         old_ok = DS._ok
--- a/skeleton/setup.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/skeleton/setup.py	Mon Feb 17 15:32:50 2014 +0100
@@ -150,7 +150,7 @@
             old_install_data.run(self)
             self.install_dir = _old_install_dir
     try:
-        import setuptools.command.easy_install # only if easy_install avaible
+        import setuptools.command.easy_install # only if easy_install available
         # monkey patch: Crack SandboxViolation verification
         from setuptools.sandbox import DirectorySandbox as DS
         old_ok = DS._ok
--- a/sobjects/ldapparser.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/sobjects/ldapparser.py	Mon Feb 17 15:32:50 2014 +0100
@@ -201,7 +201,7 @@
                                    {'addr': emailaddr})
             if not rset:
                 # not found, create it. first forge an external id
-                emailextid = userdict['dn'] + '@@' + emailaddr
+                emailextid = userdict['dn'] + '@@' + emailaddr.encode('utf-8')
                 email = self.extid2entity(emailextid, 'EmailAddress',
                                           address=emailaddr)
                 entity.cw_set(use_email=email)
--- a/uilib.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/uilib.py	Mon Feb 17 15:32:50 2014 +0100
@@ -215,7 +215,7 @@
 
 ALLOWED_TAGS = (defs.general_block_tags | defs.list_tags | defs.table_tags |
                 defs.phrase_tags | defs.font_style_tags |
-                set(('span', 'a', 'br', 'img', 'map', 'area', 'sub', 'sup'))
+                set(('span', 'a', 'br', 'img', 'map', 'area', 'sub', 'sup', 'canvas'))
                 )
 
 CLEANER = clean.Cleaner(allow_tags=ALLOWED_TAGS, remove_unknown_tags=False,
--- a/utils.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/utils.py	Mon Feb 17 15:32:50 2014 +0100
@@ -375,9 +375,9 @@
             if skiphead:
                 # Don't insert <script> tags directly as they would be
                 # interpreted directly by some browsers (e.g. IE).
-                # Use <pre class="script"> tags instead and let
+                # Use <cubicweb:script> tags instead and let
                 # `loadAjaxHtmlHead` handle the script insertion / execution.
-                w(u'<pre class="script" src="%s"></pre>\n' %
+                w(u'<cubicweb:script src="%s"></cubicweb:script>\n' %
                   xml_escape(jsfile))
                 # FIXME: a probably better implementation might be to add
                 #        JS or CSS urls in a JS list that loadAjaxHtmlHead
@@ -392,9 +392,9 @@
         if self.post_inlined_scripts:
             if skiphead:
                 for script in self.post_inlined_scripts:
-                    w(u'<pre class="script">')
+                    w(u'<cubicweb:script>')
                     w(xml_escape(script))
-                    w(u'</pre>')
+                    w(u'</cubicweb:script>')
             else:
                 w(self.script_opening)
                 w(u'\n\n'.join(self.post_inlined_scripts))
@@ -455,8 +455,8 @@
         attrs = ' '.join('%s="%s"' % (attr, xml_escape(value))
                          for attr, value in self._htmlattrs)
         if attrs:
-            return '<html %s>' % attrs
-        return '<html>'
+            return '<html xmlns:cubicweb="http://www.cubicweb.org" %s>' % attrs
+        return '<html xmlns:cubicweb="http://www.cubicweb.org">'
 
     def getvalue(self):
         """writes HTML headers, closes </head> tag and writes HTML body"""
--- a/view.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/view.py	Mon Feb 17 15:32:50 2014 +0100
@@ -356,7 +356,7 @@
 
 class StartupView(View):
     """base class for views which doesn't need a particular result set to be
-    displayed (so they can always be displayed !)
+    displayed (so they can always be displayed!)
     """
     __select__ = none_rset()
 
--- a/web/component.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/component.py	Mon Feb 17 15:32:50 2014 +0100
@@ -108,12 +108,8 @@
         view = self.cw_extra_kwargs.get('view')
         if view is not None and hasattr(view, 'page_navigation_url'):
             url = view.page_navigation_url(self, path, params)
-        elif path in ('json', 'ajax'):
-            # 'ajax' is the new correct controller, but the old 'json'
-            # controller should still be supported
+        else:
             url = self.ajax_page_url(**params)
-        else:
-            url = self._cw.build_url(path, **params)
         # XXX hack to avoid opening a new page containing the evaluation of the
         # js expression on ajax call
         if url.startswith('javascript:'):
@@ -122,9 +118,9 @@
 
     def ajax_page_url(self, **params):
         divid = params.setdefault('divid', 'pageContent')
+        params['fname'] = 'view'
         params['rql'] = self.cw_rset.printable_rql()
-        return js_href("$(%s).loadxhtml(AJAX_PREFIX_URL, %s, 'get', 'swap')" % (
-            json_dumps('#'+divid), js.ajaxFuncArgs('view', params)))
+        return self._cw.build_url('ajax', **params)
 
     def page_link(self, path, params, start, stop, content):
         url = xml_escape(self.page_url(path, params, start, stop))
--- a/web/data/cubicweb.ajax.js	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/data/cubicweb.ajax.js	Mon Feb 17 15:32:50 2014 +0100
@@ -200,7 +200,7 @@
     },
 
     _loadAjaxScripts: function($responseHead, $head) {
-        $responseHead.find('pre.script').each(function(i) {
+        $responseHead.find('cubicweb\\:script').each(function(i) {
             var $srcnode = $(this);
             var url = $srcnode.attr('src');
             if (url) {
@@ -222,7 +222,7 @@
     	        jQuery.globalEval($srcnode.text());
     	    }
         });
-        $responseHead.find('pre.script').remove();
+        $responseHead.find('cubicweb\\:script').remove();
     }
 });
 
--- a/web/data/cubicweb.js	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/data/cubicweb.js	Mon Feb 17 15:32:50 2014 +0100
@@ -222,6 +222,9 @@
         cw.utils.nodeWalkDepthFirst(elem, function (elem) {
             var name = elem.name;
             if (name && name.length) {
+                if (elem.disabled) {
+                    return null;
+                }
                 var tagName = elem.tagName.toUpperCase();
                 if (tagName === "INPUT" && (elem.type == "radio" || elem.type == "checkbox") && !elem.checked) {
                     return null;
--- a/web/data/cubicweb.widgets.js	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/data/cubicweb.widgets.js	Mon Feb 17 15:32:50 2014 +0100
@@ -415,17 +415,16 @@
     var url = linode.attr('cubicweb:loadurl');
     if (url) {
         linode.find('ul.placeholder').remove();
-        linode.loadxhtml(url, {
-            callback: function(domnode) {
+        var d = linode.loadxhtml(url, null, 'post', 'append');
+        d.addCallback(function(domnode) {
                 linode.removeAttr('cubicweb:loadurl');
-                jQuery(domnode).treeview({
+                linode.find('> ul.treeview').treeview({
                     toggle: toggleTree,
                     prerendered: true
                 });
                 return null;
             }
-        },
-        'post', 'append');
+        );
     }
 }
 
Binary file web/data/images/animated-overlay.gif has changed
Binary file web/data/images/loadingAnimation.gif has changed
Binary file web/data/images/ui-bg_diagonals-thick_18_b81900_40x40.png has changed
Binary file web/data/images/ui-bg_diagonals-thick_20_666666_40x40.png has changed
Binary file web/data/images/ui-bg_flat_0_aaaaaa_40x100.png has changed
Binary file web/data/images/ui-bg_flat_10_000000_40x100.png has changed
Binary file web/data/images/ui-bg_flat_75_ffffff_40x100.png has changed
Binary file web/data/images/ui-bg_glass_100_f6f6f6_1x400.png has changed
Binary file web/data/images/ui-bg_glass_100_fdf5ce_1x400.png has changed
Binary file web/data/images/ui-bg_glass_55_fbf9ee_1x400.png has changed
Binary file web/data/images/ui-bg_glass_75_dadada_1x400.png has changed
Binary file web/data/images/ui-bg_glass_75_e6e6e6_1x400.png has changed
Binary file web/data/images/ui-bg_glass_95_fef1ec_1x400.png has changed
Binary file web/data/images/ui-bg_gloss-wave_35_f6a828_500x100.png has changed
Binary file web/data/images/ui-bg_highlight-soft_100_eeeeee_1x100.png has changed
Binary file web/data/images/ui-bg_highlight-soft_75_cccccc_1x100.png has changed
Binary file web/data/images/ui-bg_highlight-soft_75_ffe45c_1x100.png has changed
Binary file web/data/images/ui-icons_228ef1_256x240.png has changed
Binary file web/data/images/ui-icons_2e83ff_256x240.png has changed
Binary file web/data/images/ui-icons_454545_256x240.png has changed
Binary file web/data/images/ui-icons_888888_256x240.png has changed
Binary file web/data/images/ui-icons_cd0a0a_256x240.png has changed
Binary file web/data/images/ui-icons_ef8c08_256x240.png has changed
Binary file web/data/images/ui-icons_ffd27a_256x240.png has changed
Binary file web/data/images/ui-icons_ffffff_256x240.png has changed
--- a/web/facet.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/facet.py	Mon Feb 17 15:32:50 2014 +0100
@@ -880,7 +880,7 @@
     though linked to a different address entity. There is a great chance your
     users won't understand that...
 
-    That's where this class come in ! It's used to said that you want to filter
+    That's where this class come in! It's used to said that you want to filter
     according to the *attribute value* of a relatied entity, not to the entity
     itself. Now here is the source code for the facet:
 
--- a/web/test/unittest_views_baseviews.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/test/unittest_views_baseviews.py	Mon Feb 17 15:32:50 2014 +0100
@@ -133,7 +133,7 @@
             html_source = self.view('my-view').source
             source_lines = [line.strip() for line in html_source.splitlines(False)
                             if line.strip()]
-            self.assertListEqual(['<!DOCTYPE html>', '<html lang="en">'], source_lines[:2])
+            self.assertListEqual(['<!DOCTYPE html>', '<html xmlns:cubicweb="http://www.cubicweb.org" lang="en">'], source_lines[:2])
 
     def test_set_doctype_no_reset_xmldecl(self):
         """
@@ -151,7 +151,7 @@
             html_source = self.view('my-view').source
             source_lines = [line.strip() for line in html_source.splitlines(False)
                             if line.strip()]
-            self.assertListEqual([html_doctype, '<html lang="cz">', '<head>'],
+            self.assertListEqual([html_doctype, '<html xmlns:cubicweb="http://www.cubicweb.org" lang="cz">', '<head>'],
                                  source_lines[:3])
 
 if __name__ == '__main__':
--- a/web/views/ajaxcontroller.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/ajaxcontroller.py	Mon Feb 17 15:32:50 2014 +0100
@@ -246,7 +246,7 @@
         view.render(**kwargs)
         extresources = self._cw.html_headers.getvalue(skiphead=True)
         if extresources:
-            stream.write(u'<div class="ajaxHtmlHead">\n') # XXX use a widget ?
+            stream.write(u'<div class="ajaxHtmlHead">\n') # XXX use a widget?
             stream.write(extresources)
             stream.write(u'</div>\n')
         if divid == 'pageContent':
--- a/web/views/autoform.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/autoform.py	Mon Feb 17 15:32:50 2014 +0100
@@ -289,7 +289,7 @@
     def keep_entity(self, form, entity):
         if not entity.has_eid():
             return True
-        # are we regenerating form because of a validation error ?
+        # are we regenerating form because of a validation error?
         if form.form_previous_values:
             cdvalues = self._cw.list_form_param(eid_param(self.rtype, self.peid),
                                                 form.form_previous_values)
--- a/web/views/editforms.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/editforms.py	Mon Feb 17 15:32:50 2014 +0100
@@ -80,7 +80,7 @@
         w(u'<script type="text/javascript">updateMessage(\'%s\');</script>\n'
           % _('this action is not reversible!'))
         # XXX above message should have style of a warning
-        w(u'<h4>%s</h4>\n' % _('Do you want to delete the following element(s) ?'))
+        w(u'<h4>%s</h4>\n' % _('Do you want to delete the following element(s)?'))
         form = self._cw.vreg['forms'].select(self.__regid__, req,
                                              rset=self.cw_rset,
                                              onsubmit=onsubmit)
--- a/web/views/facets.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/facets.py	Mon Feb 17 15:32:50 2014 +0100
@@ -143,7 +143,7 @@
         :param vid:      ID of the view display in the div
         :type vid:       string
 
-        :param paginate: Is the view paginated ?
+        :param paginate: Is the view paginated?
         :type paginate:  boolean
 
         :param cssclass: Additional css classes to put on the form.
--- a/web/views/json.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/json.py	Mon Feb 17 15:32:50 2014 +0100
@@ -93,7 +93,7 @@
     title = _('json-export-view')
 
     def call(self):
-        # XXX mimic w3c recommandations to serialize SPARQL results in json ?
+        # XXX mimic w3c recommandations to serialize SPARQL results in json?
         #     http://www.w3.org/TR/rdf-sparql-json-res/
         self.wdata(self.cw_rset.rows)
 
--- a/web/views/navigation.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/navigation.py	Mon Feb 17 15:32:50 2014 +0100
@@ -55,6 +55,7 @@
 from logilab.mtconverter import xml_escape
 from logilab.common.deprecation import deprecated
 
+from cubicweb.utils import json_dumps
 from cubicweb.predicates import paginated_rset, sorted_rset, adaptable
 from cubicweb.uilib import cut
 from cubicweb.view import EntityAdapter
@@ -280,6 +281,13 @@
     nav = req.vreg['components'].select_or_none(
         'navigation', req, rset=rset, page_size=page_size, view=view)
     if nav:
+        domid = getattr(view, 'domid', 'pageContent')
+        view._cw.add_onload('''
+        jQuery('div.displayAllLink a, div.pagination a').click(function() {
+            cw.jqNode(%s).loadxhtml(this.href, null, 'get', 'swap');
+            return false;
+        });
+            ''' % json_dumps(domid))
         if w is None:
             w = view.w
         if req.form.get('__force_display'):
--- a/web/views/reledit.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/reledit.py	Mon Feb 17 15:32:50 2014 +0100
@@ -258,7 +258,7 @@
             _new_entity.eid = self._cw.varmaker.next()
             edit_entity = _new_entity
             # XXX see forms.py ~ 276 and entities.linked_to method
-            #     is there another way ?
+            #     is there another way?
             self._cw.form['__linkto'] = '%s:%s:%s' % (rschema, entity.eid, neg_role(role))
         assert edit_entity
         return label, edit_entity
--- a/web/views/sessions.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/sessions.py	Mon Feb 17 15:32:50 2014 +0100
@@ -88,7 +88,7 @@
         #      reopening. Is it actually a problem?
         if 'last_login_time' in req.vreg.schema:
             self._update_last_login_time(session)
-        req.set_message(req._('welcome %s !') % session.user.login)
+        req.set_message(req._('welcome %s!') % session.user.login)
 
     def _update_last_login_time(self, session):
         # XXX should properly detect missing permission / non writeable source
--- a/web/views/tableview.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/tableview.py	Mon Feb 17 15:32:50 2014 +0100
@@ -1068,7 +1068,7 @@
         """Build an url to the current view using the <navcomp> attributes
 
         :param navcomp: a NavigationComponent to call an url method on.
-        :param path:    expected to be json here ?
+        :param path:    expected to be json here?
         :param params: params to give to build_url method
 
         this is called by :class:`cubiweb.web.component.NavigationComponent`
--- a/web/views/urlrewrite.py	Mon Feb 03 16:30:07 2014 +0100
+++ b/web/views/urlrewrite.py	Mon Feb 17 15:32:50 2014 +0100
@@ -127,7 +127,7 @@
                     req.form.update(infos)
                     break
             elif inputurl.match(uri): # it's a regexp
-                # XXX what about i18n ? (vtitle for instance)
+                # XXX what about i18n? (vtitle for instance)
                 for param, value in infos.items():
                     if isinstance(value, basestring):
                         req.form[param] = inputurl.sub(value, uri)