--- a/src/pyams_portal/zmi/layout.py Fri Sep 21 18:09:11 2018 +0200
+++ b/src/pyams_portal/zmi/layout.py Fri Sep 21 18:09:43 2018 +0200
@@ -21,10 +21,10 @@
from pyramid.exceptions import NotFound
from pyramid.view import view_config
from transaction.interfaces import ITransactionManager
-from z3c.form import field, button
-from z3c.form.interfaces import IDataExtractedEvent, HIDDEN_MODE
+from z3c.form import button, field
+from z3c.form.interfaces import HIDDEN_MODE, IDataExtractedEvent
from zope.copy import copy
-from zope.interface import implementer, Invalid, Interface
+from zope.interface import Interface, Invalid, implementer
# import packages
from pyams_cache.beaker import get_cache
@@ -34,27 +34,26 @@
from pyams_pagelet.interfaces import IPagelet, PageletCreatedEvent
from pyams_pagelet.pagelet import pagelet_config
from pyams_portal import _
-from pyams_portal.interfaces import IPortalTemplate, IPortalTemplateConfiguration, ISlot, \
- IPortletAddingInfo, IPortlet, ISlotConfiguration, IPortletPreviewer, IPortalTemplateContainer, \
- IPortalTemplateContainerConfiguration, IPortalPortletsConfiguration, IPortalContext, IPortalPage, \
- MANAGE_TEMPLATE_PERMISSION, LOCAL_TEMPLATE_NAME
-from pyams_portal.portlet import PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME
+from pyams_portal.interfaces import IPortalContext, IPortalPage, IPortalPortletsConfiguration, IPortalTemplate, \
+ IPortalTemplateConfiguration, IPortalTemplateContainer, IPortalTemplateContainerConfiguration, IPortlet, \
+ IPortletAddingInfo, IPortletPreviewer, ISlot, ISlotConfiguration, LOCAL_TEMPLATE_NAME, MANAGE_TEMPLATE_PERMISSION
+from pyams_portal.portlet import PORTLETS_CACHE_NAME, PORTLETS_CACHE_REGION
from pyams_portal.zmi.template import PortalTemplateHeaderAdapter
from pyams_skin.interfaces import IInnerPage, IPageHeader
-from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, IMenuHeader, IContextActions
+from pyams_skin.interfaces.viewlet import IContextActions, IMenuHeader, IToolbarAddingMenu
from pyams_skin.layer import IPyAMSLayer
from pyams_skin.viewlet.menu import MenuItem
from pyams_skin.viewlet.toolbar import JsToolbarMenuItem, ToolbarMenuDivider, ToolbarMenuItem
from pyams_template.template import template_config
from pyams_utils.adapter import adapter_config
-from pyams_utils.registry import query_utility, get_utility
+from pyams_utils.registry import get_utility, query_utility
from pyams_utils.traversing import get_parent
from pyams_utils.unicode import translate_string
from pyams_utils.url import absolute_url
from pyams_viewlet.manager import viewletmanager_config
from pyams_viewlet.viewlet import viewlet_config
from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
-from pyams_zmi.interfaces.menu import IPropertiesMenu, IContentManagementMenu
+from pyams_zmi.interfaces.menu import IContentManagementMenu, IPropertiesMenu
from pyams_zmi.layer import IAdminLayer
from pyams_zmi.view import AdminView
@@ -255,7 +254,10 @@
def createAndAdd(self, data):
data = data.get(self, data)
config = IPortalTemplateConfiguration(self.context)
- return config.add_slot(data.get('name'), data.get('row_id'))
+ row_id = data.get('row_id')
+ if row_id is not None:
+ row_id = row_id - 1
+ return config.add_slot(data.get('name'), row_id)
def get_ajax_output(self, changes):
return {
@@ -272,9 +274,21 @@
def handle_new_slot_data_extraction(event):
"""Handle new slot form data extraction"""
config = IPortalTemplateConfiguration(event.form.context)
- name = event.data.get('name')
+ data = event.data
+ name = data.get('name')
if name in config.slot_names:
event.form.widgets.errors += (Invalid(_("Specified name is already used!")),)
+ row_id = data.get('row_id')
+ if row_id is not None:
+ try:
+ row_id = int(row_id)
+ except ValueError:
+ event.form.widgets.errors += (Invalid(_("Row ID must be an integer value!")),)
+ else:
+ if not 0 < row_id <= config.rows:
+ translate = event.form.request.localizer.translate
+ event.form.widgets.errors += (Invalid(translate(_("Row ID must be between 1 and {0}!")).format(
+ config.rows)),)
@view_config(name='set-template-slot-order.json', context=IPortalTemplate, request_type=IPyAMSLayer,