src/pyams_content/component/paragraph/zmi/container.py
changeset 1006 cbb65b4b8742
parent 956 a8723fffbaf6
child 1070 ea0c7ac589c4
equal deleted inserted replaced
1005:107406cb705c 1006:cbb65b4b8742
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
    12 
    12 
    13 __docformat__ = 'restructuredtext'
    13 __docformat__ = 'restructuredtext'
    14 
    14 
    15 
       
    16 # import standard library
       
    17 import json
    15 import json
    18 
    16 
    19 # import interfaces
       
    20 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
       
    21 from pyams_content.component.association.interfaces import IAssociationContainer
       
    22 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
       
    23     IBaseParagraph, IParagraphFactorySettings
       
    24 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphTitleToolbar, \
       
    25     IParagraphContainerTable, IParagraphContainerView
       
    26 from pyams_form.interfaces.form import IFormSecurityContext, IInnerSubForm
       
    27 from pyams_i18n.interfaces import II18n
       
    28 from pyams_skin.interfaces import IInnerPage, IPageHeader
       
    29 from pyams_skin.interfaces.container import ITableElementEditor
       
    30 from pyams_skin.layer import IPyAMSLayer
       
    31 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
       
    32 from pyams_zmi.interfaces.menu import IPropertiesMenu
       
    33 from pyams_zmi.layer import IAdminLayer
       
    34 from z3c.table.interfaces import IColumn, IValues
       
    35 from zope.contentprovider.interfaces import IContentProvider
       
    36 
       
    37 # import packages
       
    38 from pyams_content.component.association.zmi import AssociationsContainerView
       
    39 from pyams_content.component.paragraph import BaseParagraph
       
    40 from pyams_content.shared.common.zmi import WfModifiedContentColumnMixin
       
    41 from pyams_content.skin import pyams_content
       
    42 from pyams_form.security import ProtectedFormObjectMixin
       
    43 from pyams_pagelet.pagelet import pagelet_config
       
    44 from pyams_skin.container import switch_element_visibility, switch_element_attribute
       
    45 from pyams_skin.page import DefaultPageHeaderAdapter
       
    46 from pyams_skin.table import BaseTable, I18nColumn, TrashColumn, SorterColumn, ImageColumn, \
       
    47     VisibilitySwitcherColumn, AttributeSwitcherColumn
       
    48 from pyams_skin.viewlet.menu import MenuItem
       
    49 from pyams_template.template import template_config
       
    50 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter, NullAdapter
       
    51 from pyams_utils.fanstatic import get_resource_path
       
    52 from pyams_utils.traversing import get_parent
       
    53 from pyams_utils.url import absolute_url
       
    54 from pyams_viewlet.manager import viewletmanager_config, WeightOrderedViewletManager, TemplateBasedViewletManager
       
    55 from pyams_viewlet.viewlet import viewlet_config, Viewlet
       
    56 from pyams_zmi.form import AdminDialogDisplayForm
       
    57 from pyams_zmi.view import AdminView, ContainerAdminView
       
    58 from pyams_zmi.zmi.table import InnerTableView
       
    59 from pyramid.decorator import reify
    17 from pyramid.decorator import reify
    60 from pyramid.exceptions import NotFound
    18 from pyramid.exceptions import NotFound
    61 from pyramid.view import view_config
    19 from pyramid.view import view_config
    62 from z3c.form import field
    20 from z3c.form import field
    63 from z3c.table.column import GetAttrColumn
    21 from z3c.table.column import GetAttrColumn
    64 from zope.interface import implementer, Interface
    22 from z3c.table.interfaces import IColumn, IValues
       
    23 from zope.contentprovider.interfaces import IContentProvider
       
    24 from zope.interface import Interface, implementer
       
    25 
       
    26 from pyams_content.component.association.interfaces import IAssociationContainer
       
    27 from pyams_content.component.association.zmi import AssociationsContainerView
       
    28 from pyams_content.component.paragraph import BaseParagraph
       
    29 from pyams_content.component.paragraph.interfaces import IBaseParagraph, IParagraphContainer, IParagraphContainerTarget, \
       
    30     IParagraphFactorySettings
       
    31 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerTable, IParagraphContainerView, \
       
    32     IParagraphInnerEditor, IParagraphTitleToolbar, IParagraphTitleValue
       
    33 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
       
    34 from pyams_content.shared.common.zmi import WfModifiedContentColumnMixin
       
    35 from pyams_content.skin import pyams_content
       
    36 from pyams_form.interfaces.form import IFormSecurityContext, IInnerSubForm
       
    37 from pyams_form.security import ProtectedFormObjectMixin
       
    38 from pyams_i18n.interfaces import II18n
       
    39 from pyams_pagelet.pagelet import pagelet_config
       
    40 from pyams_skin.container import switch_element_attribute, switch_element_visibility
       
    41 from pyams_skin.interfaces import IInnerPage, IPageHeader
       
    42 from pyams_skin.interfaces.container import ITableElementEditor
       
    43 from pyams_skin.layer import IPyAMSLayer
       
    44 from pyams_skin.page import DefaultPageHeaderAdapter
       
    45 from pyams_skin.table import AttributeSwitcherColumn, BaseTable, I18nColumn, ImageColumn, SorterColumn, TrashColumn, \
       
    46     VisibilitySwitcherColumn
       
    47 from pyams_skin.viewlet.menu import MenuItem
       
    48 from pyams_template.template import template_config
       
    49 from pyams_utils.adapter import ContextRequestViewAdapter, NullAdapter, adapter_config
       
    50 from pyams_utils.fanstatic import get_resource_path
       
    51 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
       
    52 from pyams_utils.traversing import get_parent
       
    53 from pyams_utils.url import absolute_url
       
    54 from pyams_viewlet.manager import TemplateBasedViewletManager, WeightOrderedViewletManager, viewletmanager_config
       
    55 from pyams_viewlet.viewlet import Viewlet, viewlet_config
       
    56 from pyams_zmi.form import AdminDialogDisplayForm
       
    57 from pyams_zmi.interfaces.menu import IPropertiesMenu
       
    58 from pyams_zmi.layer import IAdminLayer
       
    59 from pyams_zmi.view import AdminView, ContainerAdminView
       
    60 from pyams_zmi.zmi.table import InnerTableView
    65 
    61 
    66 from pyams_content import _
    62 from pyams_content import _
    67 
    63 
    68 
    64 
    69 @viewlet_config(name='paragraphs.menu', context=IParagraphContainerTarget, layer=IAdminLayer,
    65 @viewlet_config(name='paragraphs.menu', context=IParagraphContainerTarget, layer=IAdminLayer,
   250 @implementer(IParagraphTitleToolbar)
   246 @implementer(IParagraphTitleToolbar)
   251 class ParagraphTitleToolbarViewletManager(TemplateBasedViewletManager, WeightOrderedViewletManager):
   247 class ParagraphTitleToolbarViewletManager(TemplateBasedViewletManager, WeightOrderedViewletManager):
   252     """Paragraph title toolbar viewlet manager"""
   248     """Paragraph title toolbar viewlet manager"""
   253 
   249 
   254 
   250 
   255 def getParagraphTitleHints(item, request, table):
   251 def get_paragraph_title_hints(item, request, table):
   256     """Get paragraphs column title hints"""
   252     """Get paragraphs column title hints"""
   257     registry = request.registry
   253     registry = request.registry
   258     provider = registry.queryMultiAdapter((item, request, table), IContentProvider,
   254     provider = registry.queryMultiAdapter((item, request, table), IContentProvider,
   259                                           name='pyams_paragraph.title_toolbar')
   255                                           name='pyams_paragraph.title_toolbar')
   260     if provider is not None:
   256     if provider is not None:
   273 
   269 
   274     def renderCell(self, item):
   270     def renderCell(self, item):
   275         return '<span class="title">{0}</span>'.format(super(ParagraphContainerBaseTitleColumn, self).renderCell(item))
   271         return '<span class="title">{0}</span>'.format(super(ParagraphContainerBaseTitleColumn, self).renderCell(item))
   276 
   272 
   277     def getValue(self, obj):
   273     def getValue(self, obj):
       
   274         adapter = self.request.registry.queryMultiAdapter((obj, self.request), IParagraphTitleValue)
       
   275         if adapter is not None:
       
   276             return adapter
   278         return II18n(obj).query_attribute('title', request=self.request) or BaseParagraph.empty_title
   277         return II18n(obj).query_attribute('title', request=self.request) or BaseParagraph.empty_title
   279 
   278 
   280 
   279 
   281 @adapter_config(name='name', context=(IParagraphContainerTarget, IPyAMSLayer, ParagraphContainerTable),
   280 @adapter_config(name='name', context=(IParagraphContainerTarget, IPyAMSLayer, ParagraphContainerTable),
   282                 provides=IColumn)
   281                 provides=IColumn)
   290                '      data-ams-click-handler="PyAMS_content.paragraphs.switchAllEditors">' \
   289                '      data-ams-click-handler="PyAMS_content.paragraphs.switchAllEditors">' \
   291                '    <span class="small hint" title="{hint}" data-ams-hint-gravity="e">' \
   290                '    <span class="small hint" title="{hint}" data-ams-hint-gravity="e">' \
   292                '        <i class="fa fa-plus-square-o switch"></i>' \
   291                '        <i class="fa fa-plus-square-o switch"></i>' \
   293                '    </span>&nbsp;&nbsp;&nbsp;{title}' \
   292                '    </span>&nbsp;&nbsp;&nbsp;{title}' \
   294                '</span>'.format(
   293                '</span>'.format(
   295                     hint=self.request.localizer.translate(_("Click to open/close all paragraphs editors")),
   294             hint=self.request.localizer.translate(_("Click to open/close all paragraphs editors")),
   296                     title=super(ParagraphContainerTitleColumn, self).renderHeadCell())
   295             title=super(ParagraphContainerTitleColumn, self).renderHeadCell())
   297 
   296 
   298     def renderCell(self, item):
   297     def renderCell(self, item):
   299         provider = getParagraphTitleHints(item, self.request, self.table) or ''
   298         provider = get_paragraph_title_hints(item, self.request, self.table) or ''
   300         return '<div data-ams-stop-propagation="true" ' \
   299         return '<div data-ams-stop-propagation="true" ' \
   301                '     data-ams-click-handler="PyAMS_content.paragraphs.switchEditor">{provider}' \
   300                '     data-ams-click-handler="PyAMS_content.paragraphs.switchEditor">{provider}' \
   302                '    <span class="small hint" title="{hint}" data-ams-hint-gravity="e">' \
   301                '    <span class="small hint" title="{hint}" data-ams-hint-gravity="e">' \
   303                '        <i class="fa fa-plus-square-o switch"></i>' \
   302                '        <i class="fa fa-plus-square-o switch"></i>' \
   304                '    </span>&nbsp;&nbsp;&nbsp;<span class="title">{title}</span>' \
   303                '    </span>&nbsp;&nbsp;&nbsp;<span class="title">{title}</span>' \
   305                '</div>' \
   304                '</div>' \
   306                '<div class="inner-table-form editor margin-x-10 margin-bottom-0"></div>'.format(
   305                '<div class="inner-table-form editor margin-x-10 margin-bottom-0"></div>'.format(
   307                     provider=provider,
   306             provider=provider,
   308                     hint=self.request.localizer.translate(_("Click to open/close paragraph editor")),
   307             hint=self.request.localizer.translate(_("Click to open/close paragraph editor")),
   309                     title=super(ParagraphContainerTitleColumn, self).renderCell(item))
   308             title=super(ParagraphContainerTitleColumn, self).renderCell(item))
   310 
   309 
   311 
   310 
   312 @template_config(template='templates/paragraph-title-icon.pt', layer=IPyAMSLayer)
   311 @template_config(template='templates/paragraph-title-icon.pt', layer=IPyAMSLayer)
   313 class ParagraphContainerCounterBase(Viewlet):
   312 class ParagraphContainerCounterBase(Viewlet):
   314     """Paragraph container base counter viewlet"""
   313     """Paragraph container base counter viewlet"""
   431             associations = IAssociationContainer(paragraph, None)
   430             associations = IAssociationContainer(paragraph, None)
   432             if associations is not None:
   431             if associations is not None:
   433                 view = AssociationsContainerView(paragraph, self.request)
   432                 view = AssociationsContainerView(paragraph, self.request)
   434                 view.widget_icon_class = 'fa fa-fw {0}'.format(paragraph.icon_class)
   433                 view.widget_icon_class = 'fa fa-fw {0}'.format(paragraph.icon_class)
   435                 view.title = II18n(paragraph).query_attribute('title', request=self.request) or \
   434                 view.title = II18n(paragraph).query_attribute('title', request=self.request) or \
   436                     BaseParagraph.empty_title
   435                              BaseParagraph.empty_title
   437                 result.append(view)
   436                 result.append(view)
   438         return result
   437         return result
   439 
   438 
   440     def update(self):
   439     def update(self):
   441         super(ParagraphsAssociationsView, self).update()
   440         super(ParagraphsAssociationsView, self).update()