src/pyams_portal/zmi/template.py
changeset 289 fca4100c1733
parent 279 c025abc00397
child 290 3977d9c8618d
equal deleted inserted replaced
288:390514bce78a 289:fca4100c1733
    31     IWidgetTitleViewletManager
    31     IWidgetTitleViewletManager
    32 from pyams_skin.layer import IPyAMSLayer
    32 from pyams_skin.layer import IPyAMSLayer
    33 from pyams_skin.page import DefaultPageHeaderAdapter
    33 from pyams_skin.page import DefaultPageHeaderAdapter
    34 from pyams_skin.table import DefaultElementEditorAdapter
    34 from pyams_skin.table import DefaultElementEditorAdapter
    35 from pyams_skin.viewlet.breadcrumb import BreadcrumbAdminLayerItem
    35 from pyams_skin.viewlet.breadcrumb import BreadcrumbAdminLayerItem
       
    36 from pyams_skin.viewlet.menu import MenuItem
    36 from pyams_skin.viewlet.toolbar import ToolbarAction, ToolbarMenuDivider, ToolbarMenuItem
    37 from pyams_skin.viewlet.toolbar import ToolbarAction, ToolbarMenuDivider, ToolbarMenuItem
    37 from pyams_utils.adapter import ContextRequestAdapter, adapter_config
    38 from pyams_utils.adapter import ContextRequestAdapter, adapter_config
    38 from pyams_utils.registry import get_utility, query_utility
    39 from pyams_utils.registry import get_utility, query_utility
    39 from pyams_utils.traversing import get_parent
    40 from pyams_utils.traversing import get_parent
    40 from pyams_utils.unicode import translate_string
    41 from pyams_utils.unicode import translate_string
    41 from pyams_utils.url import absolute_url
    42 from pyams_utils.url import absolute_url
    42 from pyams_viewlet.viewlet import viewlet_config
    43 from pyams_viewlet.viewlet import viewlet_config
    43 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    44 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
       
    45 from pyams_zmi.interfaces.menu import IPropertiesMenu
    44 from pyams_zmi.layer import IAdminLayer
    46 from pyams_zmi.layer import IAdminLayer
    45 
    47 
    46 
    48 
    47 __docformat__ = 'restructuredtext'
    49 __docformat__ = 'restructuredtext'
    48 
    50 
    80         container = get_parent(self.context, IPortalTemplateContainer)
    82         container = get_parent(self.context, IPortalTemplateContainer)
    81         if container is not None:
    83         if container is not None:
    82             return self.context.name
    84             return self.context.name
    83         context = get_parent(self.context, IPortalContext)
    85         context = get_parent(self.context, IPortalContext)
    84         if context is not None:
    86         if context is not None:
    85             adapter = self.request.registry.queryMultiAdapter((context, self.request), ITableElementName)
    87             adapter = self.request.registry.queryMultiAdapter((context, self.request),
       
    88                                                               ITableElementName)
    86             if adapter is not None:
    89             if adapter is not None:
    87                 return self.request.localizer.translate(_("{0} (local template)")).format(adapter.name)
    90                 return self.request.localizer.translate(_("{0} (local template)")).format(
       
    91                     adapter.name)
    88         return '--'
    92         return '--'
    89 
    93 
    90 
    94 
    91 @adapter_config(context=(IPortalTemplate, IAdminLayer, Interface), provides=ITableElementEditor)
    95 @adapter_config(context=(IPortalTemplate, IAdminLayer, Interface), provides=ITableElementEditor)
    92 class PortalTemplateTableElementEditorAdapter(DefaultElementEditorAdapter):
    96 class PortalTemplateTableElementEditorAdapter(DefaultElementEditorAdapter):
   110         if container is not None:
   114         if container is not None:
   111             return translate(_("« {0} »  portal template")).format(self.context.name)
   115             return translate(_("« {0} »  portal template")).format(self.context.name)
   112         # check for portal context
   116         # check for portal context
   113         context = get_parent(self.context, IPortalContext)
   117         context = get_parent(self.context, IPortalContext)
   114         if context is not None:
   118         if context is not None:
   115             adapter = self.request.registry.queryMultiAdapter((context, self.request, self.view), IContentTitle)
   119             adapter = self.request.registry.queryMultiAdapter((context, self.request, self.view),
       
   120                                                               IContentTitle)
   116             if adapter is None:
   121             if adapter is None:
   117                 adapter = IContentTitle(context, None)
   122                 adapter = IContentTitle(context, None)
   118             if adapter is not None:
   123             if adapter is not None:
   119                 return adapter.title
   124                 return adapter.title
   120 
   125 
   121 
   126 
   122 #
   127 #
   123 # Template views
   128 # Template add views
   124 #
   129 #
   125 
   130 
   126 @viewlet_config(name='add-portal-template.action', context=ISite, layer=IAdminLayer,
   131 @viewlet_config(name='add-portal-template.action', context=ISite, layer=IAdminLayer,
   127                 view=PortalTemplateContainerTable, manager=IWidgetTitleViewletManager,
   132                 view=PortalTemplateContainerTable, manager=IWidgetTitleViewletManager,
   128                 permission=MANAGE_TEMPLATE_PERMISSION, weight=1)
   133                 permission=MANAGE_TEMPLATE_PERMISSION, weight=1)
   142 
   147 
   143     title = _("Portal templates")
   148     title = _("Portal templates")
   144     legend = _("Add shared template")
   149     legend = _("Add shared template")
   145     icon_css_class = 'fa fa-fw fa-columns'
   150     icon_css_class = 'fa fa-fw fa-columns'
   146 
   151 
   147     fields = field.Fields(IPortalTemplate)
   152     fields = field.Fields(IPortalTemplate).select('name')
   148     edit_permission = MANAGE_TEMPLATE_PERMISSION
   153     edit_permission = MANAGE_TEMPLATE_PERMISSION
   149 
   154 
   150     def create(self, data):
   155     def create(self, data):
   151         return PortalTemplate()
   156         return PortalTemplate()
   152 
   157 
   166     if name in container:
   171     if name in container:
   167         event.form.widgets.errors += (Invalid(_("Specified name is already used!")),)
   172         event.form.widgets.errors += (Invalid(_("Specified name is already used!")),)
   168 
   173 
   169 
   174 
   170 #
   175 #
   171 # Template renaming form
   176 # Template properties form
   172 #
   177 #
   173 
   178 
   174 @viewlet_config(name='rename.menu', context=IPortalTemplate, layer=IPyAMSLayer,
   179 @viewlet_config(name='properties.menu',
   175                 view=PortalTemplateLayoutView, manager=IContextActions,
   180                 context=IPortalTemplate, layer=IAdminLayer,
   176                 permission=MANAGE_TEMPLATE_PERMISSION, weight=100)
   181                 manager=IPropertiesMenu, weight=10,
   177 class PortalTemplateRenameMenu(ToolbarMenuItem):
   182                 permission=MANAGE_TEMPLATE_PERMISSION)
   178     """Portal template rename menu item"""
   183 class PortalTemplatePropertiesMenu(MenuItem):
       
   184     """Portal template properties menu item"""
   179 
   185 
   180     def __new__(cls, context, request, view, manager):
   186     def __new__(cls, context, request, view, manager):
   181         container = get_parent(context, IPortalTemplateContainer)
   187         container = get_parent(context, IPortalTemplateContainer)
   182         if container is None:
   188         if container is None:
   183             return None
   189             return None
   184         return ToolbarMenuDivider.__new__(cls)
   190         return MenuItem.__new__(cls)
   185 
   191 
   186     label = _("Rename template...")
   192     label = _("Template properties...")
   187     label_css_class = 'fa fa-fw fa-edit'
   193     label_css_class = 'fa fa-fw fa-edit'
   188 
   194 
   189     url = 'rename.html'
   195     url = 'properties.html'
   190     modal_target = True
   196     modal_target = True
   191 
   197 
   192 
   198 
   193 class IPortalTemplateRenameButtons(Interface):
   199 @pagelet_config(name='properties.html',
   194     """Portal template rename form buttons"""
   200                 context=IPortalTemplate, layer=IPyAMSLayer,
   195 
       
   196     close = CloseButton(name='close', title=_("Cancel"))
       
   197     rename = button.Button(name='rename', title=_("Rename template"))
       
   198 
       
   199 
       
   200 @pagelet_config(name='rename.html', context=IPortalTemplate, layer=IPyAMSLayer,
       
   201                 permission=MANAGE_TEMPLATE_PERMISSION)
   201                 permission=MANAGE_TEMPLATE_PERMISSION)
   202 @ajax_config(name='rename.json', context=IPortalTemplate, layer=IPyAMSLayer)
   202 @ajax_config(name='properties.json', context=IPortalTemplate, layer=IPyAMSLayer)
   203 class PortalTemplateRenameForm(AdminDialogEditForm):
   203 class PortalTemplatePropertiesEditForm(AdminDialogEditForm):
   204     """Portal template rename form"""
   204     """Portal template properties edit form"""
   205 
   205 
   206     legend = _("Rename template")
   206     legend = _("Template properties")
   207     icon_css_class = 'fa fa-fw fa-edit'
   207     icon_css_class = 'fa fa-fw fa-edit'
   208 
   208 
   209     fields = field.Fields(IPortalTemplate).select('name')
   209     fields = field.Fields(IPortalTemplate).select('name', 'css_class')
   210     buttons = button.Buttons(IPortalTemplateRenameButtons)
       
   211 
   210 
   212     edit_permission = MANAGE_TEMPLATE_PERMISSION
   211     edit_permission = MANAGE_TEMPLATE_PERMISSION
   213 
   212 
   214     _renamed = False
   213     _renamed = False
   215 
   214 
   216     def updateActions(self):
       
   217         super(PortalTemplateRenameForm, self).updateActions()
       
   218         if 'rename' in self.actions:
       
   219             self.actions['rename'].addClass('btn-primary')
       
   220 
       
   221     def update_content(self, content, data):
   215     def update_content(self, content, data):
   222         changes = super(PortalTemplateRenameForm, self).update_content(content, data)
   216         changes = super().update_content(content, data)
   223         if changes:
   217         if changes:
   224             data = data.get(self, data)
   218             data = data.get(self, data)
   225             old_name = content.__name__
   219             old_name = content.__name__
   226             new_name = translate_string(data.get('name'), spaces='-')
   220             new_name = translate_string(data.get('name'), spaces='-')
   227             if old_name != new_name:
   221             if old_name != new_name:
   235         if self._renamed:
   229         if self._renamed:
   236             return {
   230             return {
   237                 'status': 'redirect',
   231                 'status': 'redirect',
   238                 'location': absolute_url(self.getContent(), self.request, 'admin#properties.html')
   232                 'location': absolute_url(self.getContent(), self.request, 'admin#properties.html')
   239             }
   233             }
   240         else:
   234         return super().get_ajax_output(changes)
   241             return super(PortalTemplateRenameForm, self).get_ajax_output(changes)
       
   242 
   235 
   243 
   236 
   244 #
   237 #
   245 # Template duplication form
   238 # Template duplication form
   246 #
   239 #