src/pyams_content/component/paragraph/zmi/pictogram.py
changeset 527 5dd1aa8bedd9
parent 516 a3f26cfd3094
child 550 9658debb49a3
equal deleted inserted replaced
526:b15153f45957 527:5dd1aa8bedd9
    27 from pyams_content.shared.common import IWfSharedContent
    27 from pyams_content.shared.common import IWfSharedContent
    28 from pyams_form.interfaces.form import IInnerForm, IEditFormButtons, IInnerSubForm
    28 from pyams_form.interfaces.form import IInnerForm, IEditFormButtons, IInnerSubForm
    29 from pyams_i18n.interfaces import II18n
    29 from pyams_i18n.interfaces import II18n
    30 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, IWidgetTitleViewletManager
    30 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, IWidgetTitleViewletManager
    31 from pyams_skin.layer import IPyAMSLayer
    31 from pyams_skin.layer import IPyAMSLayer
    32 from pyams_utils.interfaces import MANAGE_PERMISSION
       
    33 from pyams_zmi.interfaces import IPropertiesEditForm
    32 from pyams_zmi.interfaces import IPropertiesEditForm
    34 from z3c.form.interfaces import INPUT_MODE
    33 from z3c.form.interfaces import INPUT_MODE
    35 from z3c.table.interfaces import IValues, IColumn
    34 from z3c.table.interfaces import IValues, IColumn
    36 
    35 
    37 # import packages
    36 # import packages
    39 from pyams_content.component.paragraph.pictogram import PictogramParagraph, PictogramItem
    38 from pyams_content.component.paragraph.pictogram import PictogramParagraph, PictogramItem
    40 from pyams_content.component.paragraph.zmi import BaseParagraphAddMenu, BaseParagraphAJAXAddForm, \
    39 from pyams_content.component.paragraph.zmi import BaseParagraphAddMenu, BaseParagraphAJAXAddForm, \
    41     BaseParagraphPropertiesEditForm, BaseParagraphAJAXEditForm
    40     BaseParagraphPropertiesEditForm, BaseParagraphAJAXEditForm
    42 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer
    41 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer
    43 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget
    42 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget
    44 from pyams_content.skin import pyams_content
       
    45 from pyams_form.form import AJAXAddForm, AJAXEditForm
    43 from pyams_form.form import AJAXAddForm, AJAXEditForm
    46 from pyams_form.security import ProtectedFormObjectMixin
    44 from pyams_form.security import ProtectedFormObjectMixin
    47 from pyams_i18n.column import I18nAttrColumn
    45 from pyams_i18n.column import I18nAttrColumn
    48 from pyams_pagelet.pagelet import pagelet_config
    46 from pyams_pagelet.pagelet import pagelet_config
    49 from pyams_skin.table import BaseTable, SorterColumn, JsActionColumn, I18nColumn, TrashColumn
    47 from pyams_skin.container import switch_element_visibility
       
    48 from pyams_skin.event import get_json_widget_refresh_event, get_json_switched_table_refresh_event, \
       
    49     get_json_table_row_refresh_event
       
    50 from pyams_skin.table import BaseTable, SorterColumn, I18nColumn, TrashColumn, VisibilitySwitcherColumn
    50 from pyams_skin.viewlet.toolbar import ToolbarAction
    51 from pyams_skin.viewlet.toolbar import ToolbarAction
    51 from pyams_template.template import template_config
       
    52 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
    52 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
    53 from pyams_utils.fanstatic import get_resource_path
       
    54 from pyams_utils.text import get_text_start
    53 from pyams_utils.text import get_text_start
    55 from pyams_utils.traversing import get_parent
    54 from pyams_utils.traversing import get_parent
    56 from pyams_utils.url import absolute_url
    55 from pyams_utils.url import absolute_url
    57 from pyams_viewlet.viewlet import viewlet_config
    56 from pyams_viewlet.viewlet import viewlet_config
    58 from pyams_zmi.form import AdminDialogAddForm, InnerAdminDisplayForm, AdminDialogEditForm
    57 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
       
    58 from pyams_zmi.zmi.table import InnerTableView
    59 from pyramid.decorator import reify
    59 from pyramid.decorator import reify
    60 from pyramid.exceptions import NotFound
       
    61 from pyramid.view import view_config
    60 from pyramid.view import view_config
    62 from z3c.form import field, button
    61 from z3c.form import field, button
    63 from z3c.table.column import GetAttrColumn
    62 from z3c.table.column import GetAttrColumn
    64 from zope.interface import implementer, Interface
    63 from zope.interface import implementer, Interface
    65 
    64 
   112     
   111     
   113 @pagelet_config(name='properties.html', context=IPictogramParagraph, layer=IPyAMSLayer,
   112 @pagelet_config(name='properties.html', context=IPictogramParagraph, layer=IPyAMSLayer,
   114                 permission=MANAGE_CONTENT_PERMISSION)
   113                 permission=MANAGE_CONTENT_PERMISSION)
   115 class PictogramParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm):
   114 class PictogramParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm):
   116     """Pictogram paragraph properties edit form"""
   115     """Pictogram paragraph properties edit form"""
       
   116 
       
   117     prefix = 'pictograms_properties.'
   117 
   118 
   118     @property
   119     @property
   119     def title(self):
   120     def title(self):
   120         content = get_parent(self.context, IWfSharedContent)
   121         content = get_parent(self.context, IWfSharedContent)
   121         return II18n(content).query_attribute('title', request=self.request)
   122         return II18n(content).query_attribute('title', request=self.request)
   159 
   160 
   160     def get_ajax_output(self, changes):
   161     def get_ajax_output(self, changes):
   161         output = super(PictogramParagraphInnerAJAXEditForm, self).get_ajax_output(changes)
   162         output = super(PictogramParagraphInnerAJAXEditForm, self).get_ajax_output(changes)
   162         updated = changes.get(IPictogramParagraph, ())
   163         updated = changes.get(IPictogramParagraph, ())
   163         if 'renderer' in updated:
   164         if 'renderer' in updated:
   164             form = PictogramParagraphInnerEditForm(self.context, self.request)
   165             output.setdefault('events', []).append(
   165             form.update()
   166                 get_json_widget_refresh_event(self.context, self.request, PictogramParagraphInnerEditForm, 'renderer'))
   166             output.setdefault('events', []).append({
       
   167                 'event': 'myams.refresh',
       
   168                 'options': {
       
   169                     'handler': 'MyAMS.skin.refreshWidget',
       
   170                     'parent_id': '{0}_{1}_{2}'.format(
       
   171                         self.context.__class__.__name__,
       
   172                         getattr(form.getContent(), '__name__', 'noname').replace('++', ''),
       
   173                         form.id),
       
   174                     'widget_name': form.widgets['renderer'].name,
       
   175                     'content': form.widgets['renderer'].render()
       
   176                 }
       
   177             })
       
   178         return output
   167         return output
   179 
   168 
   180 
   169 
   181 #
   170 #
   182 # Pictogram paragraph renderer
   171 # Pictogram paragraph renderer
   192 #
   181 #
   193 
   182 
   194 class PictogramsTable(ProtectedFormObjectMixin, BaseTable):
   183 class PictogramsTable(ProtectedFormObjectMixin, BaseTable):
   195     """Pictograms view inner table"""
   184     """Pictograms view inner table"""
   196 
   185 
   197     @property
   186     prefix = 'pictograms'
   198     def id(self):
       
   199         return 'pictograms_{0}_list'.format(self.context.__name__)
       
   200 
   187 
   201     hide_header = True
   188     hide_header = True
   202     sortOn = None
   189     sortOn = None
   203 
   190 
   204     @property
   191     @property
   212     @property
   199     @property
   213     def data_attributes(self):
   200     def data_attributes(self):
   214         attributes = super(PictogramsTable, self).data_attributes
   201         attributes = super(PictogramsTable, self).data_attributes
   215         attributes['table'] = {
   202         attributes['table'] = {
   216             'id': self.id,
   203             'id': self.id,
   217             'data-ams-plugins': 'pyams_content',
       
   218             'data-ams-plugin-pyams_content-src': get_resource_path(pyams_content),
       
   219             'data-ams-location': absolute_url(IPictogramContainer(self.context), self.request),
   204             'data-ams-location': absolute_url(IPictogramContainer(self.context), self.request),
   220             'data-ams-tablednd-drag-handle': 'td.sorter',
   205             'data-ams-tablednd-drag-handle': 'td.sorter',
   221             'data-ams-tablednd-drop-target': 'set-pictograms-order.json'
   206             'data-ams-tablednd-drop-target': 'set-pictograms-order.json',
       
   207             'data-ams-visibility-switcher': 'switch-pictogram-visibility.json'
   222         }
   208         }
   223         attributes.setdefault('tr', {}).update({
       
   224             'id': lambda x, col: 'pictogram_{0}::{1}'.format(get_parent(x, IPictogramContainerTarget).__name__,
       
   225                                                              x.__name__),
       
   226             'data-ams-delete-target': 'delete-pictogram.json'
       
   227         })
       
   228         return attributes
   209         return attributes
   229 
   210 
   230     @reify
   211     @reify
   231     def values(self):
   212     def values(self):
   232         return list(super(PictogramsTable, self).values)
   213         return list(super(PictogramsTable, self).values)
   274         return '--'
   255         return '--'
   275 
   256 
   276 
   257 
   277 @adapter_config(name='show-hide', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable),
   258 @adapter_config(name='show-hide', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable),
   278                 provides=IColumn)
   259                 provides=IColumn)
   279 class PictogramsTableShowHideColumn(ProtectedFormObjectMixin, JsActionColumn):
   260 class PictogramsTableShowHideColumn(ProtectedFormObjectMixin, VisibilitySwitcherColumn):
   280     """Pictograms container visibility switcher column"""
   261     """Pictograms container visibility switcher column"""
   281 
   262 
   282     cssClasses = {'th': 'action',
   263 
   283                   'td': 'action switcher'}
   264 @view_config(name='switch-pictogram-visibility.json', context=IPictogramContainer, request_type=IPyAMSLayer,
   284 
   265              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   285     icon_class = 'fa fa-fw fa-eye'
   266 def switch_pictogram_visibility(request):
   286     icon_hint = _("Switch pictogram visibility")
       
   287 
       
   288     url = 'PyAMS_content.pictograms.switchVisibility'
       
   289 
       
   290     weight = 5
       
   291 
       
   292     def get_icon(self, item):
       
   293         if item.visible:
       
   294             icon_class = 'fa fa-fw fa-eye'
       
   295         else:
       
   296             icon_class = 'fa fa-fw fa-eye-slash text-danger'
       
   297         return '<i class="{icon_class}"></i>'.format(icon_class=icon_class)
       
   298 
       
   299     def renderCell(self, item):
       
   300         if self.permission and not self.request.has_permission(self.permission, context=item):
       
   301             return self.get_icon(item)
       
   302         else:
       
   303             return super(PictogramsTableShowHideColumn, self).renderCell(item)
       
   304 
       
   305 
       
   306 @view_config(name='set-pictogram-visibility.json', context=IPictogramContainer, request_type=IPyAMSLayer,
       
   307              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   308 def set_pictogram_visibility(request):
       
   309     """Set pictogram visibility"""
   267     """Set pictogram visibility"""
   310     container = IPictogramContainer(request.context)
   268     return switch_element_visibility(request, IPictogramContainer)
   311     pictogram = container.get(str(request.params.get('object_name')))
       
   312     if pictogram is None:
       
   313         raise NotFound()
       
   314     pictogram.visible = not pictogram.visible
       
   315     return {'visible': pictogram.visible}
       
   316 
   269 
   317 
   270 
   318 @adapter_config(name='name', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn)
   271 @adapter_config(name='name', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn)
   319 class PictogramsTableNameColumn(I18nColumn, I18nAttrColumn):
   272 class PictogramsTableNameColumn(I18nColumn, I18nAttrColumn):
   320     """Pictograms table name column"""
   273     """Pictograms table name column"""
   348 @adapter_config(name='trash', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn)
   301 @adapter_config(name='trash', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn)
   349 class PictogramsTableTrashColumn(ProtectedFormObjectMixin, TrashColumn):
   302 class PictogramsTableTrashColumn(ProtectedFormObjectMixin, TrashColumn):
   350     """Pictograms table trash column"""
   303     """Pictograms table trash column"""
   351 
   304 
   352 
   305 
   353 @view_config(name='delete-pictogram.json', context=IPictogramContainer, request_type=IPyAMSLayer,
       
   354              permission=MANAGE_PERMISSION, renderer='json', xhr=True)
       
   355 def delete_pictogram(request):
       
   356     """Delete pictogram"""
       
   357     translate = request.localizer.translate
       
   358     name = request.params.get('object_name')
       
   359     if not name:
       
   360         return {
       
   361             'status': 'message',
       
   362             'messagebox': {
       
   363                 'status': 'error',
       
   364                 'content': translate(_("No provided object_name argument!"))
       
   365             }
       
   366         }
       
   367     if name not in request.context:
       
   368         return {
       
   369             'status': 'message',
       
   370             'messagebox': {
       
   371                 'status': 'error',
       
   372                 'content': translate(_("Given pictogram name doesn't exist!"))
       
   373             }
       
   374         }
       
   375     del request.context[name]
       
   376     return {'status': 'success'}
       
   377 
       
   378 
       
   379 @adapter_config(name='pictograms', context=(IPictogramContainerTarget, IPyAMSLayer, IPictogramsParentForm),
   306 @adapter_config(name='pictograms', context=(IPictogramContainerTarget, IPyAMSLayer, IPictogramsParentForm),
   380                 provides=IInnerSubForm)
   307                 provides=IInnerSubForm)
   381 @template_config(template='templates/pictograms.pt', layer=IPyAMSLayer)
       
   382 @implementer(IPictogramsView)
   308 @implementer(IPictogramsView)
   383 class PictogramsView(InnerAdminDisplayForm):
   309 class PictogramsView(InnerTableView):
   384     """Pictograms view"""
   310     """Pictograms view"""
   385 
   311 
   386     fields = field.Fields(Interface)
   312     title = _("Pictograms")
       
   313 
       
   314     table_class = PictogramsTable
   387     weight = 100
   315     weight = 100
   388 
       
   389     def __init__(self, context, request, view):
       
   390         super(PictogramsView, self).__init__(context, request, view)
       
   391         self.table = PictogramsTable(context, request)
       
   392         self.table.view = self
       
   393 
       
   394     def update(self):
       
   395         super(PictogramsView, self).update()
       
   396         self.table.update()
       
   397 
   316 
   398 
   317 
   399 #
   318 #
   400 # Pictograms forms
   319 # Pictograms forms
   401 #
   320 #
   439              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   358              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   440 class PictogramAJAXAddForm(AJAXAddForm, PictogramAddForm):
   359 class PictogramAJAXAddForm(AJAXAddForm, PictogramAddForm):
   441     """Pictogram add form, JSON renderer"""
   360     """Pictogram add form, JSON renderer"""
   442 
   361 
   443     def get_ajax_output(self, changes):
   362     def get_ajax_output(self, changes):
   444         table = PictogramsTable(self.context, self.request)
       
   445         table.update()
       
   446         return {
   363         return {
   447             'status': 'success',
   364             'status': 'success',
   448             'message': self.request.localizer.translate(_("Pictogram was correctly added")),
   365             'message': self.request.localizer.translate(_("Pictogram was correctly added")),
   449             'events': [{
   366             'events': [get_json_switched_table_refresh_event(self.context, self.request, PictogramsTable), ]
   450                 'event': 'myams.refresh',
       
   451                 'options': {
       
   452                     'handler': 'PyAMS_content.pictograms.refreshPictograms',
       
   453                     'object_id': table.id,
       
   454                     'table': table.render()
       
   455                 }
       
   456             }]
       
   457         }
   367         }
   458 
   368 
   459 
   369 
   460 @pagelet_config(name='properties.html', context=IPictogramItem, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
   370 @pagelet_config(name='properties.html', context=IPictogramItem, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
   461 class PictogramPropertiesEditForm(AdminDialogEditForm):
   371 class PictogramPropertiesEditForm(AdminDialogEditForm):
   462     """Pictogram properties edit form"""
   372     """Pictogram properties edit form"""
       
   373 
       
   374     prefix = 'pictogram_properties.'
   463 
   375 
   464     legend = _("Edit pictogram properties")
   376     legend = _("Edit pictogram properties")
   465     icon_css_class = 'fa fa-fw fa-linode'
   377     icon_css_class = 'fa fa-fw fa-linode'
   466 
   378 
   467     fields = field.Fields(IPictogramItem).omit('__parent__', '__name__', 'visible')
   379     fields = field.Fields(IPictogramItem).omit('__parent__', '__name__', 'visible')
   482     def get_ajax_output(self, changes):
   394     def get_ajax_output(self, changes):
   483         output = super(PictogramPropertiesAJAXEditForm, self).get_ajax_output(changes)
   395         output = super(PictogramPropertiesAJAXEditForm, self).get_ajax_output(changes)
   484         updated = changes.get(IPictogramItem, ())
   396         updated = changes.get(IPictogramItem, ())
   485         if updated:
   397         if updated:
   486             target = get_parent(self.context, IPictogramContainerTarget)
   398             target = get_parent(self.context, IPictogramContainerTarget)
   487             table = PictogramsTable(target, self.request)
   399             output.setdefault('events', []).append(
   488             table.update()
   400                 get_json_table_row_refresh_event(target, self.request, PictogramsTable, self.context))
   489             row = table.setUpRow(self.context)
       
   490             output.setdefault('events', []).append({
       
   491                 'event': 'myams.refresh',
       
   492                 'options': {
       
   493                     'handler': 'MyAMS.skin.refreshRow',
       
   494                     'object_id': 'pictogram_{0}::{1}'.format(target.__name__,
       
   495                                                              self.context.__name__),
       
   496                     'row': table.renderRow(row)
       
   497                 }
       
   498             })
       
   499         return output
   401         return output