Version 0.1.17 0.1.17
authorThierry Florac <thierry.florac@onf.fr>
Fri, 05 Oct 2018 15:49:10 +0200
changeset 201 6b6236f258ab
parent 200 b2bb69f30e67
child 202 66ebfde2a058
Version 0.1.17
.installed.cfg
bootstrap.py
docs/HISTORY.txt
src/pyams_portal.egg-info/PKG-INFO
src/pyams_portal.egg-info/SOURCES.txt
src/pyams_portal/locales/fr/LC_MESSAGES/pyams_portal.po~
--- a/.installed.cfg	Thu Oct 04 16:41:41 2018 +0200
+++ b/.installed.cfg	Fri Oct 05 15:49:10 2018 +0200
@@ -1,5 +1,6 @@
 [buildout]
-installed_develop_eggs = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-media.egg-link
+installed_develop_eggs = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/tmphvzy_3pybuild
+	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-media.egg-link
 	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-file.egg-link
 	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-sequence.egg-link
 	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-content.egg-link
@@ -23,15 +24,15 @@
 parts = package i18n pyflakes test
 
 [package]
-__buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/prequest
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/proutes
+__buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pserve
+	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pdistreport
 	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pviews
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pshell
+	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pcreate
 	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/ptweens
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pcreate
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pserve
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pdistreport
-__buildout_signature__ = zc.recipe.egg-8f8815b05e6871a2c4acf8d9c9b6e98f zc.buildout-2.10.0-py3.5.egg setuptools-8f8815b05e6871a2c4acf8d9c9b6e98f
+	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/prequest
+	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/proutes
+	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pshell
+__buildout_signature__ = zc.recipe.egg-1cfa1feb0fa42aa4d8579505a97c12a0 zc.buildout-1cfa1feb0fa42aa4d8579505a97c12a0 setuptools-1cfa1feb0fa42aa4d8579505a97c12a0
 _b = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin
 _d = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs
 _e = /var/local/env/pyams/eggs
@@ -49,7 +50,7 @@
 __buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pybabel
 	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/polint
 	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pot-create
-__buildout_signature__ = zc.recipe.egg-8f8815b05e6871a2c4acf8d9c9b6e98f zc.buildout-2.10.0-py3.5.egg setuptools-8f8815b05e6871a2c4acf8d9c9b6e98f
+__buildout_signature__ = zc.recipe.egg-1cfa1feb0fa42aa4d8579505a97c12a0 zc.buildout-1cfa1feb0fa42aa4d8579505a97c12a0 setuptools-1cfa1feb0fa42aa4d8579505a97c12a0
 _b = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin
 _d = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs
 _e = /var/local/env/pyams/eggs
@@ -64,7 +65,7 @@
 [pyflakes]
 __buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pyflakes
 	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/pyflakes
-__buildout_signature__ = zc.recipe.egg-8f8815b05e6871a2c4acf8d9c9b6e98f zc.buildout-2.10.0-py3.5.egg setuptools-8f8815b05e6871a2c4acf8d9c9b6e98f
+__buildout_signature__ = zc.recipe.egg-1cfa1feb0fa42aa4d8579505a97c12a0 zc.buildout-1cfa1feb0fa42aa4d8579505a97c12a0 setuptools-1cfa1feb0fa42aa4d8579505a97c12a0
 _b = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin
 _d = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs
 _e = /var/local/env/pyams/eggs
@@ -81,7 +82,7 @@
 [test]
 __buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/parts/test
 	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/test
-__buildout_signature__ = six-8f8815b05e6871a2c4acf8d9c9b6e98f zc.recipe.testrunner-8f8815b05e6871a2c4acf8d9c9b6e98f zc.recipe.egg-8f8815b05e6871a2c4acf8d9c9b6e98f zc.buildout-2.10.0-py3.5.egg zope.exceptions-8f8815b05e6871a2c4acf8d9c9b6e98f zope.interface-8f8815b05e6871a2c4acf8d9c9b6e98f zope.testrunner-8f8815b05e6871a2c4acf8d9c9b6e98f setuptools-8f8815b05e6871a2c4acf8d9c9b6e98f
+__buildout_signature__ = six-1cfa1feb0fa42aa4d8579505a97c12a0 zc.recipe.testrunner-1cfa1feb0fa42aa4d8579505a97c12a0 zc.recipe.egg-1cfa1feb0fa42aa4d8579505a97c12a0 zc.buildout-1cfa1feb0fa42aa4d8579505a97c12a0 zope.exceptions-1cfa1feb0fa42aa4d8579505a97c12a0 zope.interface-1cfa1feb0fa42aa4d8579505a97c12a0 zope.testrunner-1cfa1feb0fa42aa4d8579505a97c12a0 setuptools-1cfa1feb0fa42aa4d8579505a97c12a0
 _b = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin
 _d = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs
 _e = /var/local/env/pyams/eggs
@@ -93,73 +94,3 @@
 location = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/parts/test
 recipe = zc.recipe.testrunner
 script = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/bin/test
-
-[buildout]
-installed_develop_eggs = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-media.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-file.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-sequence.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-content.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/lingua.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-template.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-default-theme.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-security.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-workflow.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-skin.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-pagelet.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-viewlet.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-i18n.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-mail.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-thesaurus.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-portal.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-zmi.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-zmq.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-catalog.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-form.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-utils.egg-link
-
-[buildout]
-parts = i18n pyflakes test package
-
-[buildout]
-parts = pyflakes test package i18n
-
-[buildout]
-parts = test package i18n pyflakes
-
-[buildout]
-parts = package i18n pyflakes test
-
-[buildout]
-installed_develop_eggs = /home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-media.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-file.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-sequence.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-content.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/lingua.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-template.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-default-theme.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-security.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-workflow.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-skin.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-pagelet.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-viewlet.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-i18n.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-mail.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-thesaurus.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-portal.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-zmi.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-zmq.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-catalog.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-form.egg-link
-	/home/tflorac/Dropbox/src/PyAMS/pyams_portal/develop-eggs/pyams-utils.egg-link
-
-[buildout]
-parts = i18n pyflakes test package
-
-[buildout]
-parts = pyflakes test package i18n
-
-[buildout]
-parts = test package i18n pyflakes
-
-[buildout]
-parts = package i18n pyflakes test
--- a/bootstrap.py	Thu Oct 04 16:41:41 2018 +0200
+++ b/bootstrap.py	Fri Oct 05 15:49:10 2018 +0200
@@ -25,7 +25,10 @@
 
 from optparse import OptionParser
 
-tmpeggs = tempfile.mkdtemp()
+__version__ = '2015-07-01'
+# See zc.buildout's changelog if this version is up to date.
+
+tmpeggs = tempfile.mkdtemp(prefix='bootstrap-')
 
 usage = '''\
 [DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
@@ -35,18 +38,19 @@
 Simply run this script in a directory containing a buildout.cfg, using the
 Python that you want bin/buildout to use.
 
-Note that by using --find-links to point to local resources, you can keep 
+Note that by using --find-links to point to local resources, you can keep
 this script from going over the network.
 '''
 
 parser = OptionParser(usage=usage)
-parser.add_option("-v", "--version", help="use a specific zc.buildout version")
-
+parser.add_option("--version",
+                  action="store_true", default=False,
+                  help=("Return bootstrap.py version."))
 parser.add_option("-t", "--accept-buildout-test-releases",
                   dest='accept_buildout_test_releases',
                   action="store_true", default=False,
-                  help=("Normally, if you do not specify a --version, the "
-                        "bootstrap script and buildout gets the newest "
+                  help=("Normally, if you do not specify a --buildout-version, "
+                        "the bootstrap script and buildout gets the newest "
                         "*final* versions of zc.buildout and its recipes and "
                         "extensions for you.  If you use this flag, "
                         "bootstrap and buildout will get the newest releases "
@@ -59,36 +63,57 @@
 parser.add_option("--allow-site-packages",
                   action="store_true", default=False,
                   help=("Let bootstrap.py use existing site packages"))
-
+parser.add_option("--buildout-version",
+                  help="Use a specific zc.buildout version")
+parser.add_option("--setuptools-version",
+                  help="Use a specific setuptools version")
+parser.add_option("--setuptools-to-dir",
+                  help=("Allow for re-use of existing directory of "
+                        "setuptools versions"))
 
 options, args = parser.parse_args()
+if options.version:
+    print("bootstrap.py version %s" % __version__)
+    sys.exit(0)
+
 
 ######################################################################
 # load/install setuptools
 
 try:
-    if options.allow_site_packages:
-        import setuptools
-        import pkg_resources
     from urllib.request import urlopen
 except ImportError:
     from urllib2 import urlopen
 
 ez = {}
-exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
+if os.path.exists('ez_setup.py'):
+    exec(open('ez_setup.py').read(), ez)
+else:
+    exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
 
 if not options.allow_site_packages:
     # ez_setup imports site, which adds site packages
-    # this will remove them from the path to ensure that incompatible versions 
+    # this will remove them from the path to ensure that incompatible versions
     # of setuptools are not in the path
     import site
-    # inside a virtualenv, there is no 'getsitepackages'. 
+    # inside a virtualenv, there is no 'getsitepackages'.
     # We can't remove these reliably
     if hasattr(site, 'getsitepackages'):
         for sitepackage_path in site.getsitepackages():
-            sys.path[:] = [x for x in sys.path if sitepackage_path not in x]
+            # Strip all site-packages directories from sys.path that
+            # are not sys.prefix; this is because on Windows
+            # sys.prefix is a site-package directory.
+            if sitepackage_path != sys.prefix:
+                sys.path[:] = [x for x in sys.path
+                               if sitepackage_path not in x]
 
 setup_args = dict(to_dir=tmpeggs, download_delay=0)
+
+if options.setuptools_version is not None:
+    setup_args['version'] = options.setuptools_version
+if options.setuptools_to_dir is not None:
+    setup_args['to_dir'] = options.setuptools_to_dir
+
 ez['use_setuptools'](**setup_args)
 import setuptools
 import pkg_resources
@@ -104,7 +129,12 @@
 
 ws = pkg_resources.working_set
 
+setuptools_path = ws.find(
+    pkg_resources.Requirement.parse('setuptools')).location
+
+# Fix sys.path here as easy_install.pth added before PYTHONPATH
 cmd = [sys.executable, '-c',
+       'import sys; sys.path[0:0] = [%r]; ' % setuptools_path +
        'from setuptools.command.easy_install import main; main()',
        '-mZqNxd', tmpeggs]
 
@@ -117,21 +147,23 @@
 if find_links:
     cmd.extend(['-f', find_links])
 
-setuptools_path = ws.find(
-    pkg_resources.Requirement.parse('setuptools')).location
-
 requirement = 'zc.buildout'
-version = options.version
+version = options.buildout_version
 if version is None and not options.accept_buildout_test_releases:
     # Figure out the most recent final version of zc.buildout.
     import setuptools.package_index
     _final_parts = '*final-', '*final'
 
     def _final_version(parsed_version):
-        for part in parsed_version:
-            if (part[:1] == '*') and (part not in _final_parts):
-                return False
-        return True
+        try:
+            return not parsed_version.is_prerelease
+        except AttributeError:
+            # Older setuptools
+            for part in parsed_version:
+                if (part[:1] == '*') and (part not in _final_parts):
+                    return False
+            return True
+
     index = setuptools.package_index.PackageIndex(
         search_path=[setuptools_path])
     if find_links:
@@ -156,7 +188,7 @@
 cmd.append(requirement)
 
 import subprocess
-if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0:
+if subprocess.call(cmd) != 0:
     raise Exception(
         "Failed to execute command:\n%s" % repr(cmd)[1:-1])
 
--- a/docs/HISTORY.txt	Thu Oct 04 16:41:41 2018 +0200
+++ b/docs/HISTORY.txt	Fri Oct 05 15:49:10 2018 +0200
@@ -1,6 +1,13 @@
 History
 =======
 
+0.1.17
+------
+ - can't remove a template row or slot containing any portlet
+ - automatically remove cancelled slots
+ - added name to portlet renderer settings instances
+ - updated template properties edit form template
+
 0.1.16
 ------
  - added checks in slot adding form
--- a/src/pyams_portal.egg-info/PKG-INFO	Thu Oct 04 16:41:41 2018 +0200
+++ b/src/pyams_portal.egg-info/PKG-INFO	Fri Oct 05 15:49:10 2018 +0200
@@ -1,12 +1,11 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: pyams-portal
-Version: 0.1.16.1
+Version: 0.1.17
 Summary: PyAMS portal and portlets interfaces and classes
 Home-page: http://hg.ztfy.org/pyams/pyams_portal
 Author: Thierry Florac
 Author-email: tflorac@ulthar.net
 License: ZPL
-Description-Content-Type: UNKNOWN
 Description: 
         
         Portal template configuration storage
@@ -99,6 +98,13 @@
         History
         =======
         
+        0.1.17
+        ------
+         - can't remove a template row or slot containing any portlet
+         - automatically remove cancelled slots
+         - added name to portlet renderer settings instances
+         - updated template properties edit form template
+        
         0.1.16
         ------
          - added checks in slot adding form
@@ -207,3 +213,4 @@
 Classifier: Programming Language :: Python
 Classifier: Framework :: Pyramid
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Provides-Extra: test
--- a/src/pyams_portal.egg-info/SOURCES.txt	Thu Oct 04 16:41:41 2018 +0200
+++ b/src/pyams_portal.egg-info/SOURCES.txt	Fri Oct 05 15:49:10 2018 +0200
@@ -42,6 +42,27 @@
 src/pyams_portal/resources/css/portal.min.css
 src/pyams_portal/resources/js/portal.js
 src/pyams_portal/resources/js/portal.min.js
+src/pyams_portal/resources/js/i18n/fr.js
+src/pyams_portal/resources/js/i18n/fr.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.js
+src/pyams_portal/resources/js/i18n/fr.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.min.js
 src/pyams_portal/resources/less/portal.less
 src/pyams_portal/skin/__init__.py
 src/pyams_portal/templates/pagelet.pt
--- a/src/pyams_portal/locales/fr/LC_MESSAGES/pyams_portal.po~	Thu Oct 04 16:41:41 2018 +0200
+++ b/src/pyams_portal/locales/fr/LC_MESSAGES/pyams_portal.po~	Fri Oct 05 15:49:10 2018 +0200
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-09-21 16:10+0200\n"
+"POT-Creation-Date: 2018-09-21 18:10+0200\n"
 "PO-Revision-Date: 2015-05-12 12:10+0200\n"
 "Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
 "Language-Team: French <traduc@traduc.org>\n"
@@ -16,7 +16,7 @@
 "Generated-By: Lingua 3.10.dev0\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: src/pyams_portal/template.py:86
+#: src/pyams_portal/template.py:80
 msgid "Portal template"
 msgstr "Modèle de présentation"
 
@@ -128,13 +128,13 @@
 msgid "Presentation template"
 msgstr "Présentation"
 
-#: src/pyams_portal/zmi/template.py:167 src/pyams_portal/zmi/layout.py:277
-#: src/pyams_portal/zmi/layout.py:646
+#: src/pyams_portal/zmi/template.py:167 src/pyams_portal/zmi/layout.py:280
+#: src/pyams_portal/zmi/layout.py:660
 msgid "Specified name is already used!"
 msgstr "Le nom indiqué est déjà utilisé !"
 
-#: src/pyams_portal/zmi/template.py:111 src/pyams_portal/zmi/layout.py:241
-#: src/pyams_portal/zmi/layout.py:322 src/pyams_portal/zmi/layout.py:406
+#: src/pyams_portal/zmi/template.py:111 src/pyams_portal/zmi/layout.py:240
+#: src/pyams_portal/zmi/layout.py:336 src/pyams_portal/zmi/layout.py:420
 #, python-format
 msgid "« {0} »  portal template"
 msgstr "Modèle de présentation « {0} »"
@@ -144,71 +144,71 @@
 msgid "{0} (local template)"
 msgstr "{0} (modèle local)"
 
-#: src/pyams_portal/zmi/layout.py:82
+#: src/pyams_portal/zmi/layout.py:81
 msgid "Properties"
 msgstr "Propriétés"
 
-#: src/pyams_portal/zmi/layout.py:183
+#: src/pyams_portal/zmi/layout.py:182
 msgid "Add row..."
 msgstr "Ajouter une ligne"
 
-#: src/pyams_portal/zmi/layout.py:225
+#: src/pyams_portal/zmi/layout.py:224
 msgid "Add slot..."
 msgstr "Ajouter un panneau"
 
-#: src/pyams_portal/zmi/layout.py:243
+#: src/pyams_portal/zmi/layout.py:242
 msgid "Add slot"
 msgstr "Ajouter un panneau"
 
-#: src/pyams_portal/zmi/layout.py:390
+#: src/pyams_portal/zmi/layout.py:404
 msgid "Add portlet..."
 msgstr "Ajouter un composant"
 
-#: src/pyams_portal/zmi/layout.py:408
+#: src/pyams_portal/zmi/layout.py:422
 msgid "Add portlet"
 msgstr "Ajouter un composant"
 
-#: src/pyams_portal/zmi/layout.py:585
+#: src/pyams_portal/zmi/layout.py:599
 msgid "Duplicate template..."
 msgstr "Dupliquer le modèle"
 
-#: src/pyams_portal/zmi/layout.py:605
+#: src/pyams_portal/zmi/layout.py:619
 msgid "Duplicate template"
 msgstr "Dupliquer le modèle"
 
-#: src/pyams_portal/zmi/layout.py:72
+#: src/pyams_portal/zmi/layout.py:71
 msgid "Template management"
 msgstr "Ce modèle"
 
-#: src/pyams_portal/zmi/layout.py:109
+#: src/pyams_portal/zmi/layout.py:108
 msgid "Template configuration"
 msgstr "Configuration d'un modèle"
 
-#: src/pyams_portal/zmi/layout.py:595
+#: src/pyams_portal/zmi/layout.py:609
 msgid "Cancel"
 msgstr "Annuler"
 
-#: src/pyams_portal/zmi/layout.py:596
+#: src/pyams_portal/zmi/layout.py:610
 msgid "Duplicate this template"
 msgstr "Dupliquer ce modèle"
 
-#: src/pyams_portal/zmi/layout.py:616
+#: src/pyams_portal/zmi/layout.py:630
 msgid "New template name"
 msgstr "Nom du nouveau modèle"
 
-#: src/pyams_portal/zmi/layout.py:101
+#: src/pyams_portal/zmi/layout.py:100
 msgid "Local template configuration"
 msgstr "Configuration d'un modèle local"
 
-#: src/pyams_portal/zmi/layout.py:152
+#: src/pyams_portal/zmi/layout.py:151
 msgid "{{ missing portlet }}"
 msgstr "{{ composant indisponible }}"
 
-#: src/pyams_portal/zmi/layout.py:104
+#: src/pyams_portal/zmi/layout.py:103
 msgid "Inherited local template configuration"
 msgstr "Configuration d'un modèle local hérité"
 
-#: src/pyams_portal/zmi/layout.py:143
+#: src/pyams_portal/zmi/layout.py:142
 #, python-format
 msgid ""
 "Add component: {0}<br />Drag and drop button to page template to position "
@@ -217,16 +217,25 @@
 "Ajouter un composant : <strong>{0}</strong><br />Faire un glisser/déposer du "
 "bouton dans le modèle de présentation pour positionner le nouveau composant."
 
-#: src/pyams_portal/zmi/layout.py:327
+#: src/pyams_portal/zmi/layout.py:341
 #, python-format
 msgid "Edit « {0} » slot properties"
 msgstr "Propriétés du panneau « {0} »"
 
-#: src/pyams_portal/zmi/layout.py:107
+#: src/pyams_portal/zmi/layout.py:286
+msgid "Row ID must be an integer value!"
+msgstr "Le numéro de ligne doit être un nombre entier !"
+
+#: src/pyams_portal/zmi/layout.py:106
 #, python-format
 msgid "Shared template configuration ({0})"
 msgstr "Configuration d'un modèle partagé ({0})"
 
+#: src/pyams_portal/zmi/layout.py:290
+#, python-format
+msgid "Row ID must be between 1 and {0}!"
+msgstr "Le numéro de ligne doit être compris entre 1 et {0}"
+
 #: src/pyams_portal/zmi/container.py:102
 msgid "Shared portal templates"
 msgstr "Modèles de présentation partagés"
@@ -313,37 +322,37 @@
 msgid "Large desktop device (> 1170px)"
 msgstr "Écrans de grande taille (> 1170 px)"
 
-#: src/pyams_portal/zmi/templates/layout.pt:118
+#: src/pyams_portal/zmi/templates/layout.pt:116
 msgid "Reduce/restore portlet"
 msgstr "Réduire/restaurer le composant"
 
-#: src/pyams_portal/zmi/templates/layout.pt:123
+#: src/pyams_portal/zmi/templates/layout.pt:121
 msgid "Edit portlet properties"
 msgstr "Propriétés"
 
-#: src/pyams_portal/zmi/templates/layout.pt:125
+#: src/pyams_portal/zmi/templates/layout.pt:123
 msgid "Portlet settings are not those of original template"
 msgstr ""
 "Les propriétés du composant ne sont pas celles héritées du modèle de "
 "présentation"
 
-#: src/pyams_portal/zmi/templates/layout.pt:143
+#: src/pyams_portal/zmi/templates/layout.pt:141
 msgid "Delete row..."
 msgstr "Supprimer la ligne"
 
-#: src/pyams_portal/zmi/templates/layout.pt:152
+#: src/pyams_portal/zmi/templates/layout.pt:150
 msgid "Edit slot properties..."
 msgstr "Propriétés"
 
-#: src/pyams_portal/zmi/templates/layout.pt:159
+#: src/pyams_portal/zmi/templates/layout.pt:157
 msgid "Delete slot..."
 msgstr "Supprimer le panneau"
 
-#: src/pyams_portal/zmi/templates/layout.pt:167
+#: src/pyams_portal/zmi/templates/layout.pt:165
 msgid "Edit portlet properties..."
 msgstr "Propriétés"
 
-#: src/pyams_portal/zmi/templates/layout.pt:175
+#: src/pyams_portal/zmi/templates/layout.pt:173
 msgid "Delete portlet..."
 msgstr "Supprimer le composant"
 
@@ -395,32 +404,32 @@
 msgid "Hidden portlet"
 msgstr "NON affiché"
 
-#: src/pyams_portal/interfaces/__init__.py:70
+#: src/pyams_portal/interfaces/__init__.py:66
 msgid "Portlet"
 msgstr "Composant"
 
-#: src/pyams_portal/interfaces/__init__.py:73
-#: src/pyams_portal/interfaces/__init__.py:205
+#: src/pyams_portal/interfaces/__init__.py:69
+#: src/pyams_portal/interfaces/__init__.py:201
 msgid "Slot name"
 msgstr "Nom du panneau"
 
-#: src/pyams_portal/interfaces/__init__.py:74
+#: src/pyams_portal/interfaces/__init__.py:70
 msgid "Slot name to which this configuration applies"
 msgstr "Nom du panneau correspondant à la configuration"
 
-#: src/pyams_portal/interfaces/__init__.py:87
+#: src/pyams_portal/interfaces/__init__.py:83
 msgid "Portlet renderer"
 msgstr "Mode de rendu"
 
-#: src/pyams_portal/interfaces/__init__.py:88
+#: src/pyams_portal/interfaces/__init__.py:84
 msgid "Name of renderer used to render this portlet"
 msgstr "Mode de rendu utilisé pour restituer ce composant"
 
-#: src/pyams_portal/interfaces/__init__.py:121
+#: src/pyams_portal/interfaces/__init__.py:117
 msgid "Inherit parent configuration?"
 msgstr "Hériter de la configuration du parent ?"
 
-#: src/pyams_portal/interfaces/__init__.py:122
+#: src/pyams_portal/interfaces/__init__.py:118
 msgid ""
 "This option is only available if context's parent is using the same "
 "template..."
@@ -428,27 +437,27 @@
 "Cette option n'est disponible que si le parent utilise le même modèle de "
 "présentation..."
 
-#: src/pyams_portal/interfaces/__init__.py:206
+#: src/pyams_portal/interfaces/__init__.py:202
 msgid "This name must be unique in a given template"
 msgstr "Ce nom doit être unique au sein d'un modèle de présentation"
 
-#: src/pyams_portal/interfaces/__init__.py:209
+#: src/pyams_portal/interfaces/__init__.py:205
 msgid "Row ID"
-msgstr "ID de la ligne"
+msgstr "Numéro de la ligne"
 
-#: src/pyams_portal/interfaces/__init__.py:223
+#: src/pyams_portal/interfaces/__init__.py:219
 msgid "Visible slot?"
 msgstr "Panneau visible ?"
 
-#: src/pyams_portal/interfaces/__init__.py:224
+#: src/pyams_portal/interfaces/__init__.py:220
 msgid "Select 'no' to hide this slot..."
 msgstr "Choisir 'non' pour masquer ce panneau..."
 
-#: src/pyams_portal/interfaces/__init__.py:228
+#: src/pyams_portal/interfaces/__init__.py:224
 msgid "Extra small device width"
 msgstr "Largeur sur très petits périphériques"
 
-#: src/pyams_portal/interfaces/__init__.py:229
+#: src/pyams_portal/interfaces/__init__.py:225
 msgid ""
 "Slot width, in columns count, on extra small devices (phones...); set to 0 "
 "to hide the portlet"
@@ -456,11 +465,11 @@
 "Largeur du panneau, en nombre de colonnes, sur les très petits périphériques "
 "(téléphones...) ; indiquez une valeur de 0 pour masquer ce composant"
 
-#: src/pyams_portal/interfaces/__init__.py:235
+#: src/pyams_portal/interfaces/__init__.py:231
 msgid "Small device width"
 msgstr "Largeur sur petits périphériques"
 
-#: src/pyams_portal/interfaces/__init__.py:236
+#: src/pyams_portal/interfaces/__init__.py:232
 msgid ""
 "Slot width, in columns count, on small devices (tablets...); set to 0 to "
 "hide the portlet"
@@ -468,11 +477,11 @@
 "Largeur du panneau, en nombre de colonnes, sur les petits périphériques "
 "(tablettes...) ; indiquez une valeur de 0 pour masquer ce composant"
 
-#: src/pyams_portal/interfaces/__init__.py:242
+#: src/pyams_portal/interfaces/__init__.py:238
 msgid "Medium devices width"
 msgstr "Largeur sur périphériques moyens"
 
-#: src/pyams_portal/interfaces/__init__.py:243
+#: src/pyams_portal/interfaces/__init__.py:239
 msgid ""
 "Slot width, in columns count, on medium desktop devices (>= 992 pixels); set "
 "to 0 to hide the portlet"
@@ -480,11 +489,11 @@
 "Largeur du panneau, en nombre de colonnes, sur les périphériques moyens (>= "
 "992 pixels) ; indiquez une valeur de 0 pour masquer ce composant"
 
-#: src/pyams_portal/interfaces/__init__.py:249
+#: src/pyams_portal/interfaces/__init__.py:245
 msgid "Large devices width"
 msgstr "Largeur sur grands périphériques"
 
-#: src/pyams_portal/interfaces/__init__.py:250
+#: src/pyams_portal/interfaces/__init__.py:246
 msgid ""
 "Slot width, in columns count, on large desktop devices (>= 1200 pixels); set "
 "to 0 to hide the portlet"
@@ -492,27 +501,27 @@
 "Largeur du panneau, en nombre de colonnes, sur les grands périphériques (>= "
 "1200 pixels) ; indiquez une valeur de 0 pour masquer ce composant"
 
-#: src/pyams_portal/interfaces/__init__.py:256
+#: src/pyams_portal/interfaces/__init__.py:252
 msgid "CSS class"
 msgstr "Class CSS"
 
-#: src/pyams_portal/interfaces/__init__.py:257
+#: src/pyams_portal/interfaces/__init__.py:253
 msgid "CSS class applied to this slot"
 msgstr "Classe CSS spécifique appliquée à ce panneau"
 
-#: src/pyams_portal/interfaces/__init__.py:370
+#: src/pyams_portal/interfaces/__init__.py:366
 msgid "Template name"
 msgstr "Nom du modèle"
 
-#: src/pyams_portal/interfaces/__init__.py:371
+#: src/pyams_portal/interfaces/__init__.py:367
 msgid "Two registered templates can't share the same name..."
 msgstr "Deux modèles partagés ne peuvent pas utiliser le même nom..."
 
-#: src/pyams_portal/interfaces/__init__.py:392
+#: src/pyams_portal/interfaces/__init__.py:388
 msgid "Toolbar portlets"
 msgstr "Composants de la barre d'outils"
 
-#: src/pyams_portal/interfaces/__init__.py:393
+#: src/pyams_portal/interfaces/__init__.py:389
 msgid ""
 "These portlets will be directly available in templates configuration page "
 "toolbar"
@@ -520,52 +529,52 @@
 "Ces composants seront directement accessibles dans la page de configuration "
 "des modèles de présentation sous la forme d'une barre d'icônes"
 
-#: src/pyams_portal/interfaces/__init__.py:422
+#: src/pyams_portal/interfaces/__init__.py:418
 msgid "Inherit parent template?"
 msgstr "Hériter du modèle du parent ?"
 
-#: src/pyams_portal/interfaces/__init__.py:423
+#: src/pyams_portal/interfaces/__init__.py:419
 msgid "Should we reuse parent template?"
 msgstr "Doit-on ré-utiliser le modèle du parent ?"
 
-#: src/pyams_portal/interfaces/__init__.py:427
+#: src/pyams_portal/interfaces/__init__.py:423
 msgid "Override parent template?"
 msgstr "Ne pas hériter du modèle du parent ?"
 
-#: src/pyams_portal/interfaces/__init__.py:428
+#: src/pyams_portal/interfaces/__init__.py:424
 msgid "Should we override parent template?"
 msgstr "Doit-on remplacer le modèle de présentation du parent ?"
 
-#: src/pyams_portal/interfaces/__init__.py:432
+#: src/pyams_portal/interfaces/__init__.py:428
 msgid "Use local template?"
 msgstr "Utiliser un modèle local ?"
 
-#: src/pyams_portal/interfaces/__init__.py:433
+#: src/pyams_portal/interfaces/__init__.py:429
 msgid ""
 "If 'yes', you can define a custom local template instead of a shared template"
 msgstr ""
 "Si 'oui', vous pouvez définir un modèle de présentation local au lieu d'un "
 "modèle partagé"
 
-#: src/pyams_portal/interfaces/__init__.py:438
+#: src/pyams_portal/interfaces/__init__.py:434
 msgid "Local template"
 msgstr "Modèle local"
 
-#: src/pyams_portal/interfaces/__init__.py:443
+#: src/pyams_portal/interfaces/__init__.py:439
 msgid "Use shared template?"
 msgstr "Utiliser un modèle partagé"
 
-#: src/pyams_portal/interfaces/__init__.py:444
+#: src/pyams_portal/interfaces/__init__.py:440
 msgid "If 'yes', you can select a shared template"
 msgstr ""
 "Si 'oui', vous pouvez sélectionner un modèle de présentation partagé au lieu "
 "d'un modèle local"
 
-#: src/pyams_portal/interfaces/__init__.py:448
+#: src/pyams_portal/interfaces/__init__.py:444
 msgid "Page template"
 msgstr "Modèle de page"
 
-#: src/pyams_portal/interfaces/__init__.py:449
+#: src/pyams_portal/interfaces/__init__.py:445
 msgid "Template used for this page"
 msgstr "Modèle de présentation utilisé pour cette page"