src/pyams_content/root/zmi/sites.py
changeset 284 796b6f241aff
parent 278 f78a3411bf62
child 301 9bdda3bcd680
equal deleted inserted replaced
283:9139536eab90 284:796b6f241aff
       
     1 #
       
     2 # Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
       
     3 # All Rights Reserved.
       
     4 #
       
     5 # This software is subject to the provisions of the Zope Public License,
       
     6 # Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
       
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
       
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
       
    10 # FOR A PARTICULAR PURPOSE.
       
    11 #
       
    12 
       
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 
       
    16 # import standard library
       
    17 
       
    18 # import interfaces
       
    19 from pyams_content.interfaces import MANAGE_SITE_ROOT_PERMISSION
       
    20 from pyams_content.root.interfaces import ISiteRoot
       
    21 from pyams_content.shared.common.interfaces import ISharedSite, IBaseSharedTool
       
    22 from pyams_content.shared.common.interfaces.zmi import IDashboardTable
       
    23 from pyams_content.zmi.interfaces import ISiteTreeMenu, ISiteTreeTable
       
    24 from pyams_sequence.interfaces import ISequentialIdInfo
       
    25 from pyams_skin.interfaces import IInnerPage, IPageHeader
       
    26 from pyams_skin.layer import IPyAMSLayer
       
    27 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
       
    28 from pyams_workflow.interfaces import IWorkflowPublicationInfo
       
    29 from pyams_zmi.interfaces.menu import ISiteManagementMenu
       
    30 from pyams_zmi.layer import IAdminLayer
       
    31 from z3c.table.interfaces import IColumn, IValues
       
    32 
       
    33 # import packages
       
    34 from pyams_pagelet.pagelet import pagelet_config
       
    35 from pyams_skin.container import ContainerView
       
    36 from pyams_skin.page import DefaultPageHeaderAdapter
       
    37 from pyams_skin.table import BaseTable, TrashColumn, ActionColumn, I18nColumn
       
    38 from pyams_skin.viewlet.menu import MenuItem
       
    39 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
       
    40 from pyams_utils.url import absolute_url
       
    41 from pyams_viewlet.manager import viewletmanager_config
       
    42 from pyams_viewlet.viewlet import viewlet_config
       
    43 from pyams_zmi.view import AdminView
       
    44 from pyramid.view import view_config
       
    45 from z3c.table.column import GetAttrColumn
       
    46 from zope.interface import implementer
       
    47 
       
    48 from pyams_content import _
       
    49 
       
    50 
       
    51 #
       
    52 # Sites and blogs view
       
    53 #
       
    54 
       
    55 @viewlet_config(name='site-tree.menu', layer=IAdminLayer, context=ISiteRoot, manager=ISiteManagementMenu,
       
    56                 permission=VIEW_SYSTEM_PERMISSION, weight=5)
       
    57 @viewletmanager_config(name='site-tree.menu', layer=IAdminLayer, context=ISiteRoot, provides=ISiteTreeMenu)
       
    58 @implementer(ISiteTreeMenu)
       
    59 class SiteTreeMenu(MenuItem):
       
    60     """Site tree menu"""
       
    61 
       
    62     label = _("Site tree")
       
    63     icon_class = 'fa-sitemap'
       
    64     url = '#site-tree.html'
       
    65 
       
    66 
       
    67 @implementer(IDashboardTable, ISiteTreeTable)
       
    68 class SiteTreeTable(BaseTable):
       
    69     """Site tree table"""
       
    70 
       
    71     id = 'site_tree_table'
       
    72     title = _("Blogs and shared sites")
       
    73 
       
    74     sortOn = None
       
    75 
       
    76     @property
       
    77     def data_attributes(self):
       
    78         attributes = super(SiteTreeTable, self).data_attributes
       
    79         attributes['table'] = {'data-ams-location': absolute_url(self.context, self.request),
       
    80                                'data-ams-delete-target': 'delete-shared-site.json'}
       
    81         return attributes
       
    82 
       
    83 
       
    84 @adapter_config(name='visible', context=(ISiteRoot, IPyAMSLayer, SiteTreeTable), provides=IColumn)
       
    85 class SiteTreeVisibleColumn(ActionColumn):
       
    86     """Site tree visible column"""
       
    87 
       
    88     cssClasses = {'th': 'action',
       
    89                   'td': 'action'}
       
    90 
       
    91     icon_class = 'fa fa-fw fa-eye'
       
    92     icon_hint = _("Visible site?")
       
    93 
       
    94     weight = 5
       
    95 
       
    96     def renderCell(self, item):
       
    97         return self.get_icon(item)
       
    98 
       
    99     def get_icon(self, item):
       
   100         info = IWorkflowPublicationInfo(item, None)
       
   101         if info is None:
       
   102             return ''
       
   103         else:
       
   104             if info.is_published():
       
   105                 icon_class = 'fa-eye opacity-75'
       
   106             else:
       
   107                 icon_class = 'fa-eye-slash text-danger opaque'
       
   108             return '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" data-ams-hint-gravity="e"></i>'.format(
       
   109                 icon_class=icon_class,
       
   110                 title=self.request.localizer.translate(self.icon_hint))
       
   111 
       
   112 
       
   113 @adapter_config(name='oid', context=(ISiteRoot, IPyAMSLayer, SiteTreeTable), provides=IColumn)
       
   114 class SiteTreeOidColumn(I18nColumn, GetAttrColumn):
       
   115     """Site tree OID column"""
       
   116 
       
   117     _header = _("OID")
       
   118     weight = 70
       
   119 
       
   120     def getValue(self, obj):
       
   121         sequence = ISequentialIdInfo(obj, None)
       
   122         if sequence is None:
       
   123             return '--'
       
   124         else:
       
   125             try:
       
   126                 return sequence.get_short_oid()
       
   127             except TypeError:
       
   128                 return '--'
       
   129 
       
   130 
       
   131 @adapter_config(name='trash', context=(ISiteRoot, IAdminLayer, SiteTreeTable), provides=IColumn)
       
   132 class SiteTreeTrashColumn(TrashColumn):
       
   133     """Site tree trash column"""
       
   134 
       
   135     icon_hint = _("Delete shared site")
       
   136     permission = MANAGE_SITE_ROOT_PERMISSION
       
   137 
       
   138 
       
   139 @adapter_config(context=(ISiteRoot, IAdminLayer, SiteTreeTable), provides=IValues)
       
   140 class SiteTreValuesAdapter(ContextRequestViewAdapter):
       
   141     """Site tree values adapter"""
       
   142 
       
   143     @property
       
   144     def values(self):
       
   145         return [value for value in self.context.values()
       
   146                 if IBaseSharedTool.providedBy(value) or ISharedSite.providedBy(value)]
       
   147 
       
   148 
       
   149 @pagelet_config(name='site-tree.html', context=ISiteRoot, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   150 @implementer(IInnerPage)
       
   151 class SiteTreeView(AdminView, ContainerView):
       
   152     """Site tree view"""
       
   153 
       
   154     table_class = SiteTreeTable
       
   155 
       
   156     def __init__(self, context, request):
       
   157         super(SiteTreeView, self).__init__(context, request)
       
   158 
       
   159 
       
   160 @adapter_config(context=(ISiteRoot, IAdminLayer, SiteTreeView), provides=IPageHeader)
       
   161 class SiteViewHeaderAdapter(DefaultPageHeaderAdapter):
       
   162     """Site tree view header adapter"""
       
   163 
       
   164     icon_class = 'fa fa-fw fa-sitemap'
       
   165 
       
   166 
       
   167 @view_config(name='delete-shared-site.json', context=ISiteRoot, request_type=IPyAMSLayer,
       
   168              permission=MANAGE_SITE_ROOT_PERMISSION, renderer='json', xhr=True)
       
   169 def delete_shared_site(request):
       
   170     """Delete shared site from site manager"""
       
   171     translate = request.localizer.translate
       
   172     name = request.params.get('object_name')
       
   173     if not name:
       
   174         return {'status': 'message',
       
   175                 'messagebox': {'status': 'error',
       
   176                                'content': translate(_("No provided object_name argument!"))}}
       
   177     if name not in request.context:
       
   178         return {'status': 'message',
       
   179                 'messagebox': {'status': 'error',
       
   180                                'content': translate(_("Given site name doesn't exist!"))}}
       
   181     del request.context[name]
       
   182     return {'status': 'success'}