src/pyams_content/component/paragraph/zmi/pictogram.py
changeset 576 12171cf62cc4
parent 555 8e8a14452567
child 591 b694d5667d17
--- a/src/pyams_content/component/paragraph/zmi/pictogram.py	Mon Jun 04 15:00:16 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/pictogram.py	Mon Jun 04 16:43:56 2018 +0200
@@ -23,13 +23,15 @@
 from pyams_content.component.paragraph.zmi import IParagraphContainerView, IParagraphEditFormButtons
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
+from pyams_content.reference.pictograms.interfaces import IPictogramTable
 from pyams_content.shared.common import IWfSharedContent
 from pyams_form.interfaces.form import IInnerForm, IInnerSubForm
 from pyams_i18n.interfaces import II18n
 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, IWidgetTitleViewletManager
 from pyams_skin.layer import IPyAMSLayer
+from pyams_utils.interfaces.data import IObjectData
 from pyams_zmi.interfaces import IPropertiesEditForm
-from z3c.form.interfaces import INPUT_MODE
+from z3c.form.interfaces import INPUT_MODE, IDataExtractedEvent
 from z3c.table.interfaces import IValues, IColumn
 
 # import packages
@@ -48,6 +50,7 @@
 from pyams_skin.table import BaseTable, SorterColumn, I18nColumn, TrashColumn, VisibilitySwitcherColumn
 from pyams_skin.viewlet.toolbar import ToolbarAction
 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
+from pyams_utils.registry import query_utility
 from pyams_utils.text import get_text_start
 from pyams_utils.traversing import get_parent
 from pyams_utils.url import absolute_url
@@ -55,10 +58,11 @@
 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
 from pyams_zmi.zmi.table import InnerTableView
 from pyramid.decorator import reify
+from pyramid.events import subscriber
 from pyramid.view import view_config
 from z3c.form import field, button
 from z3c.table.column import GetAttrColumn
-from zope.interface import implementer, Interface
+from zope.interface import implementer, alsoProvides, Interface, Invalid
 
 from pyams_content import _
 
@@ -333,6 +337,22 @@
 
     def updateWidgets(self, prefix=None):
         super(PictogramAddForm, self).updateWidgets(prefix)
+        if 'pictogram_name' in self.widgets:
+            pictograms = query_utility(IPictogramTable)
+            if pictograms is not None:
+                label_id = '{0}_pictogram_label'.format(self.id)
+                widget = self.widgets['pictogram_name']
+                widget.after_widget_notice = '<span id="{0}" class="text-info">{1}</span>'.format(
+                    label_id,
+                    self.request.localizer.translate(_("Default header: --")))
+                widget.object_data = {
+                    'ams-change-handler': 'MyAMS.helpers.select2ChangeHelper',
+                    'ams-stop-propagation': 'true',
+                    'ams-select2-helper-type': 'html',
+                    'ams-select2-helper-url': absolute_url(pictograms, self.request, 'get-pictogram-header.html'),
+                    'ams-select2-helper-target': '#{0}'.format(label_id)
+                }
+                alsoProvides(widget, IObjectData)
         if 'body' in self.widgets:
             self.widgets['body'].widget_css_class = 'textarea height-100'
 
@@ -356,6 +376,14 @@
         }
 
 
+@subscriber(IDataExtractedEvent, form_selector=PictogramAddForm)
+def handle_pictogram_add_form_data_extraction(event):
+    """Handle pictogram add form data extraction"""
+    data = event.data
+    if not data.get('pictogram_name'):
+        event.form.widgets.errors += (Invalid(_("You must select a pictogram!")), )
+
+
 @pagelet_config(name='properties.html', context=IPictogramItem, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
 class PictogramPropertiesEditForm(AdminDialogEditForm):
     """Pictogram properties edit form"""
@@ -371,6 +399,28 @@
 
     def updateWidgets(self, prefix=None):
         super(PictogramPropertiesEditForm, self).updateWidgets(prefix)
+        if 'pictogram_name' in self.widgets:
+            pictograms = query_utility(IPictogramTable)
+            if pictograms is not None:
+                pictogram = pictograms.get(self.context.pictogram_name)
+                label_id = '{0}_pictogram_label'.format(self.id)
+                widget = self.widgets['pictogram_name']
+                widget.required = True
+                if pictogram is None:
+                    widget.after_widget_notice = '<span id="{0}" class="text-info">{1}</span>'.format(label_id, '--')
+                else:
+                    widget.after_widget_notice = '<span id="{0}" class="text-info">{1}</span>'.format(
+                        label_id,
+                        self.request.localizer.translate(_("Default header: {0}")).format(
+                            II18n(pictogram).query_attribute('header', request=self.request) or '--'))
+                widget.object_data = {
+                    'ams-change-handler': 'MyAMS.helpers.select2ChangeHelper',
+                    'ams-stop-propagation': 'true',
+                    'ams-select2-helper-type': 'html',
+                    'ams-select2-helper-url': absolute_url(pictograms, self.request, 'get-pictogram-header.html'),
+                    'ams-select2-helper-target': '#{0}'.format(label_id)
+                }
+                alsoProvides(widget, IObjectData)
         if 'body' in self.widgets:
             self.widgets['body'].widget_css_class = 'textarea height-100'
 
@@ -388,3 +438,11 @@
             output.setdefault('events', []).append(
                 get_json_table_row_refresh_event(target, self.request, PictogramsTable, self.context))
         return output
+
+
+@subscriber(IDataExtractedEvent, form_selector=PictogramPropertiesEditForm)
+def handle_pictogram_edit_form_data_extraction(event):
+    """Handle pictogram edit form data extraction"""
+    data = event.data
+    if not data.get('pictogram_name'):
+        event.form.widgets.errors += (Invalid(_("You must select a pictogram!")), )