src/pyams_portal/zmi/layout.py
changeset 97 926d36ad8b8c
parent 84 2be886bff11b
child 111 39373f182ee4
--- a/src/pyams_portal/zmi/layout.py	Mon Jun 11 15:30:26 2018 +0200
+++ b/src/pyams_portal/zmi/layout.py	Mon Jun 11 15:31:15 2018 +0200
@@ -31,7 +31,7 @@
 from z3c.form.interfaces import IDataExtractedEvent, HIDDEN_MODE
 
 # import packages
-from pyams_form.form import AJAXAddForm, AJAXEditForm
+from pyams_form.form import AJAXAddForm, AJAXEditForm, ajax_config
 from pyams_pagelet.pagelet import pagelet_config
 from pyams_portal.zmi.template import PortalTemplateHeaderAdapter
 from pyams_skin.viewlet.menu import MenuItem
@@ -127,10 +127,14 @@
                        for portlet_name in configuration.toolbar_portlets or ()])
 
     def get_portlet(self, name):
-        return self.request.registry.getUtility(IPortlet, name=name)
+        return self.request.registry.queryUtility(IPortlet, name=name)
 
     def get_portlet_label(self, name):
-        return self.request.localizer.translate(self.get_portlet(name).label)
+        portlet = self.get_portlet(name)
+        if portlet is not None:
+            return self.request.localizer.translate(portlet.label)
+        else:
+            return self.request.localizer.translate(_("{{ missing portlet }}"))
 
     def get_portlet_preview(self, portlet_id):
         settings = self.portlet_configuration.get_portlet_configuration(portlet_id).settings
@@ -211,6 +215,8 @@
 
 @pagelet_config(name='add-template-slot.html', context=IPortalTemplate, layer=IPyAMSLayer,
                 permission=MANAGE_TEMPLATE_PERMISSION)
+@ajax_config(name='add-template-slot.json', context=IPortalTemplate, layer=IPyAMSLayer,
+             permission=MANAGE_TEMPLATE_PERMISSION, base=AJAXAddForm)
 class PortalTemplateSlotAddForm(AdminDialogAddForm):
     """Portal template slot add form"""
 
@@ -223,7 +229,6 @@
     icon_css_class = 'fa fa-fw fa-columns'
 
     fields = field.Fields(ISlot)
-    ajax_handler = 'add-template-slot.json'
     edit_permission = None
 
     def updateWidgets(self, prefix=None):
@@ -237,21 +242,6 @@
         config = IPortalTemplateConfiguration(self.context)
         return config.add_slot(data.get('name'), data.get('row_id'))
 
-
-@subscriber(IDataExtractedEvent, form_selector=PortalTemplateSlotAddForm)
-def handle_new_slot_data_extraction(event):
-    """Handle new slot form data extraction"""
-    config = IPortalTemplateConfiguration(event.form.context)
-    name = event.data.get('name')
-    if name in config.slot_names:
-        event.form.widgets.errors += (Invalid(_("Specified name is already used!")),)
-
-
-@view_config(name='add-template-slot.json', context=IPortalTemplate, request_type=IPyAMSLayer,
-             permission=MANAGE_TEMPLATE_PERMISSION, renderer='json', xhr=True)
-class PortalTemplateSlotAJAXAddForm(AJAXAddForm, PortalTemplateSlotAddForm):
-    """Portal template slot add form, AJAX handler"""
-
     def get_ajax_output(self, changes):
         return {
             'status': 'callback',
@@ -263,6 +253,15 @@
         }
 
 
+@subscriber(IDataExtractedEvent, form_selector=PortalTemplateSlotAddForm)
+def handle_new_slot_data_extraction(event):
+    """Handle new slot form data extraction"""
+    config = IPortalTemplateConfiguration(event.form.context)
+    name = event.data.get('name')
+    if name in config.slot_names:
+        event.form.widgets.errors += (Invalid(_("Specified name is already used!")),)
+
+
 @view_config(name='set-template-slot-order.json', context=IPortalTemplate, request_type=IPyAMSLayer,
              permission=MANAGE_TEMPLATE_PERMISSION, renderer='json', xhr=True)
 def set_template_slot_order(request):
@@ -296,6 +295,7 @@
 
 @pagelet_config(name='slot-properties.html', context=IPortalTemplate, layer=IPyAMSLayer,
                 permission=MANAGE_TEMPLATE_PERMISSION)
+@ajax_config(name='slot-properties.json', context=IPortalTemplate, layer=IPyAMSLayer)
 class PortalTemplateSlotPropertiesEditForm(AdminDialogEditForm):
     """Slot properties edit form"""
 
@@ -313,7 +313,6 @@
     label_css_class = 'control-label col-md-5'
     input_css_class = 'col-md-7'
 
-    ajax_handler = 'slot-properties.json'
     edit_permission = MANAGE_TEMPLATE_PERMISSION
 
     def __init__(self, context, request):
@@ -328,12 +327,6 @@
         super(PortalTemplateSlotPropertiesEditForm, self).updateWidgets(prefix)
         self.widgets['slot_name'].mode = HIDDEN_MODE
 
-
-@view_config(name='slot-properties.json', context=IPortalTemplate, request_type=IPyAMSLayer,
-             permission=MANAGE_TEMPLATE_PERMISSION, renderer='json', xhr=True)
-class PortalTemplateSlotPropertiesAJAXEditForm(AJAXEditForm, PortalTemplateSlotPropertiesEditForm):
-    """Slot properties edit form, AJAX renderer"""
-
     def get_ajax_output(self, changes):
         if changes:
             slot_name = self.widgets['slot_name'].value
@@ -347,7 +340,7 @@
                 }
             }
         else:
-            return super(PortalTemplateSlotPropertiesAJAXEditForm, self).get_ajax_output(changes)
+            return super(self.__class__, self).get_ajax_output(changes)
 
 
 @view_config(name='delete-template-slot.json', context=IPortalTemplate, request_type=IPyAMSLayer,
@@ -384,6 +377,8 @@
 
 @pagelet_config(name='add-template-portlet.html', context=IPortalTemplate, layer=IPyAMSLayer,
                 permission=MANAGE_TEMPLATE_PERMISSION)
+@ajax_config(name='add-template-portlet.json', context=IPortalTemplate, layer=IPyAMSLayer,
+             permission=MANAGE_TEMPLATE_PERMISSION, base=AJAXAddForm)
 class PortalTemplatePortletAddForm(AdminDialogAddForm):
     """Portal template portlet add form"""
 
@@ -396,7 +391,6 @@
     icon_css_class = 'fa fa-fw fa-columns'
 
     fields = field.Fields(IPortletAddingInfo)
-    ajax_handler = 'add-template-portlet.json'
     edit_permission = None
 
     def createAndAdd(self, data):
@@ -404,12 +398,6 @@
         config = IPortalTemplateConfiguration(self.context)
         return config.add_portlet(data.get('portlet_name'), data.get('slot_name'))
 
-
-@view_config(name='add-template-portlet.json', context=IPortalTemplate, request_type=IPyAMSLayer,
-             permission=MANAGE_TEMPLATE_PERMISSION, renderer='json', xhr=True)
-class PortalTemplatePortletAJAXAddForm(AJAXAddForm, PortalTemplatePortletAddForm):
-    """Portal template portlet add form, AJAX handler"""
-
     def get_ajax_output(self, changes):
         configuration = IPortalPortletsConfiguration(self.context)
         settings = configuration.get_portlet_configuration(changes['portlet_id']).settings