src/pyams_content/component/paragraph/zmi/__init__.py
changeset 1345 9b406fb98cfa
parent 1243 837612af4dc3
child 1429 9b93fdd5ba30
equal deleted inserted replaced
1344:646ec926f14a 1345:9b406fb98cfa
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
    12 
    12 
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 from pyramid.decorator import reify
    13 from pyramid.decorator import reify
    16 from pyramid.location import lineage
    14 from pyramid.location import lineage
    17 from z3c.form import button, field
    15 from z3c.form import button, field
    18 from zope.interface import Interface
    16 from zope.interface import Interface
    19 
    17 
    20 from pyams_content.component.paragraph import IParagraphContainer, IParagraphTitle
    18 from pyams_content.component.paragraph import IParagraphContainer, IParagraphTitle
    21 from pyams_content.component.paragraph.interfaces import IBaseParagraph, IParagraphContainerTarget, IParagraphFactory, \
    19 from pyams_content.component.paragraph.interfaces import IBaseParagraph, IParagraphContainerTarget, \
    22     IParagraphFactorySettings, IParagraphRenderer, PARAGRAPH_HIDDEN_FIELDS
    20     IParagraphFactory, IParagraphFactorySettings, IParagraphRenderer, PARAGRAPH_HIDDEN_FIELDS
    23 from pyams_content.component.paragraph.zmi.container import ParagraphContainerBaseTable, ParagraphContainerTable
    21 from pyams_content.component.paragraph.zmi.container import ParagraphContainerBaseTable, \
       
    22     ParagraphContainerTable
    24 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerView
    23 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerView
    25 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer
    24 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer
    26 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget
    25 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget
    27 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_TOOL_PERMISSION
    26 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_TOOL_PERMISSION
    28 from pyams_content.shared.common.interfaces import IWfSharedContent
    27 from pyams_content.shared.common.interfaces import IWfSharedContent
    47 from pyams_viewlet.viewlet import viewlet_config
    46 from pyams_viewlet.viewlet import viewlet_config
    48 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    47 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    49 from pyams_zmi.interfaces.menu import IPropertiesMenu
    48 from pyams_zmi.interfaces.menu import IPropertiesMenu
    50 from pyams_zmi.layer import IAdminLayer
    49 from pyams_zmi.layer import IAdminLayer
    51 
    50 
       
    51 
       
    52 __docformat__ = 'restructuredtext'
       
    53 
    52 from pyams_content import _
    54 from pyams_content import _
    53 
    55 
    54 
    56 
    55 #
    57 #
    56 # Default paragraphs settings
    58 # Default paragraphs settings
    57 #
    59 #
    58 
    60 
    59 @viewlet_config(name='default-paragraphs.menu', context=IParagraphFactorySettings, layer=IAdminLayer,
    61 @viewlet_config(name='default-paragraphs.menu', context=IParagraphFactorySettings,
    60                 manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, weight=10)
    62                 layer=IAdminLayer, manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION,
       
    63                 weight=10)
    61 class DefaultParagraphsSettingsMenu(MenuItem):
    64 class DefaultParagraphsSettingsMenu(MenuItem):
    62     """Default paragraphs settings menu"""
    65     """Default paragraphs settings menu"""
    63 
    66 
    64     label = _("Content block types...")
    67     label = _("Content block types...")
    65     icon_class = 'fa-paragraph'
    68     icon_class = 'fa-paragraph'
    66     url = 'default-paragraphs.html'
    69     url = 'default-paragraphs.html'
    67     modal_target = True
    70     modal_target = True
    68 
    71 
    69 
    72 
    70 @pagelet_config(name='default-paragraphs.html', context=IParagraphFactorySettings, layer=IPyAMSLayer,
    73 @pagelet_config(name='default-paragraphs.html', context=IParagraphFactorySettings,
    71                 permission=MANAGE_TOOL_PERMISSION)
    74                 layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION)
    72 @ajax_config(name='default-paragraphs.json', context=IParagraphFactorySettings, layer=IPyAMSLayer)
    75 @ajax_config(name='default-paragraphs.json', context=IParagraphFactorySettings, layer=IPyAMSLayer)
    73 class DefaultParagraphsEditForm(AdminDialogEditForm):
    76 class DefaultParagraphsEditForm(AdminDialogEditForm):
    74     """Default paragraphs edit form"""
    77     """Default paragraphs edit form"""
    75 
    78 
    76     prefix = 'default_paragraphs.'
    79     prefix = 'default_paragraphs.'
    79 
    82 
    80     fields = field.Fields(IParagraphFactorySettings)
    83     fields = field.Fields(IParagraphFactorySettings)
    81     edit_permission = MANAGE_TOOL_PERMISSION
    84     edit_permission = MANAGE_TOOL_PERMISSION
    82 
    85 
    83 
    86 
    84 @adapter_config(context=(IParagraphFactorySettings, IPyAMSLayer, DefaultParagraphsEditForm), provides=IFormHelp)
    87 @adapter_config(context=(IParagraphFactorySettings, IPyAMSLayer, DefaultParagraphsEditForm),
       
    88                 provides=IFormHelp)
    85 class DefaultParagraphsEditFormHelp(FormHelp):
    89 class DefaultParagraphsEditFormHelp(FormHelp):
    86     """Default paragraphs edit form help"""
    90     """Default paragraphs edit form help"""
    87 
    91 
    88     message = _("You can define which types of paragraphs are allowed in this container.\n\n"
    92     message = _("You can define which types of paragraphs are allowed in this container.\n\n"
    89                 "Default paragraphs will be added automatically (in selected order) to any new created content.\n\n"
    93                 "Default paragraphs will be added automatically (in selected order) to any new "
    90                 "NOTICE: removing types from allowed types list will have no effect on already created contents!")
    94                 "created content.\n\n"
       
    95                 "NOTICE: removing types from allowed types list will have no effect on already "
       
    96                 "created contents!")
    91     message_format = 'rest'
    97     message_format = 'rest'
    92 
    98 
    93 
    99 
    94 #
   100 #
    95 # Base paragraph forms
   101 # Base paragraph forms
   113                 'visible': context.visible
   119                 'visible': context.visible
   114             }
   120             }
   115         }
   121         }
   116 
   122 
   117 
   123 
   118 def get_json_paragraph_toolbar_refresh_event(context, request, table_factory=None, viewlet_factory=None):
   124 def get_json_paragraph_toolbar_refresh_event(context, request, table_factory=None,
       
   125                                              viewlet_factory=None):
   119     """Get JSON response value for paragraph toolbar refresh event"""
   126     """Get JSON response value for paragraph toolbar refresh event"""
   120     if table_factory is None:
   127     if table_factory is None:
   121         from pyams_content.component.paragraph.zmi.container \
   128         from pyams_content.component.paragraph.zmi.container \
   122             import ParagraphContainerTable as table_factory
   129             import ParagraphContainerTable as table_factory
   123     if viewlet_factory is None:
   130     if viewlet_factory is None:
   137                 'toolbar_tag': viewlet.render()
   144                 'toolbar_tag': viewlet.render()
   138             }
   145             }
   139         }
   146         }
   140 
   147 
   141 
   148 
   142 def get_json_paragraph_markers_refresh_event(context, request, form, viewlet_factory, marker_type=None):
   149 def get_json_paragraph_markers_refresh_event(context, request, form, viewlet_factory,
       
   150                                              marker_type=None):
   143     """Get JSON response value for paragraph markers refresh event"""
   151     """Get JSON response value for paragraph markers refresh event"""
   144     parent = get_parent(context, IParagraphContainerTarget)
   152     parent = get_parent(context, IParagraphContainerTarget)
   145     if parent is not None:
   153     if parent is not None:
   146         marker = viewlet_factory(context, request, form, None)
   154         marker = viewlet_factory(context, request, form, None)
   147         if marker is not None:
   155         if marker is not None:
   163     paragraph_type = None
   171     paragraph_type = None
   164     modal_target = True
   172     modal_target = True
   165 
   173 
   166     def __new__(cls, context, request, view, manager):
   174     def __new__(cls, context, request, view, manager):
   167         settings = get_parent(context, IParagraphFactorySettings)
   175         settings = get_parent(context, IParagraphFactorySettings)
   168         if (settings is not None) and (cls.paragraph_type not in (settings.allowed_paragraphs or ())):
   176         if (settings is not None) and (
       
   177                 cls.paragraph_type not in (settings.allowed_paragraphs or ())):
   169             return None
   178             return None
   170         return ToolbarMenuItem.__new__(cls)
   179         return ToolbarMenuItem.__new__(cls)
   171 
   180 
   172 
   181 
   173 @viewlet_config(name='custom-paragraphs.divider', context=IParagraphContainerTarget, view=IParagraphContainerView,
   182 @viewlet_config(name='custom-paragraphs.divider', context=IParagraphContainerTarget,
   174                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=500)
   183                 view=IParagraphContainerView, layer=IPyAMSLayer, manager=IToolbarAddingMenu,
       
   184                 weight=500)
   175 class ParagraphsAddMenuDivider(ProtectedFormObjectMixin, MenuDivider):
   185 class ParagraphsAddMenuDivider(ProtectedFormObjectMixin, MenuDivider):
   176     """Paragraphs add menu divider"""
   186     """Paragraphs add menu divider"""
   177 
   187 
   178     def __new__(cls, context, request, view, manager):
   188     def __new__(cls, context, request, view, manager):
   179         settings = get_parent(context, IParagraphFactorySettings)
   189         settings = get_parent(context, IParagraphFactorySettings)
   315                 get_json_paragraph_refresh_event(self.context, self.request))
   325                 get_json_paragraph_refresh_event(self.context, self.request))
   316         elif 'renderer' in self.widgets:
   326         elif 'renderer' in self.widgets:
   317             renderer_interface = self.widgets['renderer'].field.interface
   327             renderer_interface = self.widgets['renderer'].field.interface
   318             if 'renderer' in changes.get(renderer_interface, ()):
   328             if 'renderer' in changes.get(renderer_interface, ()):
   319                 output.setdefault('events', []).append(
   329                 output.setdefault('events', []).append(
   320                     get_json_widget_refresh_event(self.context, self.request, self.__class__, 'renderer'))
   330                     get_json_widget_refresh_event(self.context, self.request, self.__class__,
       
   331                                                   'renderer'))
   321                 renderer = self.context.get_renderer(self.request)
   332                 renderer = self.context.get_renderer(self.request)
   322                 if (renderer is not None) and \
   333                 if (renderer is not None) and \
   323                         (renderer.settings_interface is not None):
   334                         (renderer.settings_interface is not None):
   324                     output['smallbox'] = {
   335                     output['smallbox'] = {
   325                         'status': 'info',
   336                         'status': 'info',
   326                         'message': self.request.localizer.translate(_("You changed renderer selection. Don't omit to "
   337                         'message': self.request.localizer.translate(
   327                                                                       "update new renderer properties...")),
   338                             _("You changed renderer selection. Don't omit to "
       
   339                               "update new renderer properties...")),
   328                         'timeout': 5000
   340                         'timeout': 5000
   329                     }
   341                     }
   330         return output
   342         return output
   331 
   343 
   332 
   344