src/pyams_content/shared/site/zmi/container.py
changeset 1060 29b1aaf9e080
parent 972 bfdb9bbc9175
child 1070 ea0c7ac589c4
equal deleted inserted replaced
1059:34e6d07ea2e9 1060:29b1aaf9e080
    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 from datetime import datetime
    16 from datetime import datetime
    19 
    17 
    20 from pyramid.exceptions import NotFound
    18 from pyramid.exceptions import NotFound
    21 from pyramid.location import lineage
    19 from pyramid.location import lineage
    25 from z3c.table.interfaces import IColumn, IValues
    23 from z3c.table.interfaces import IColumn, IValues
    26 from zope.interface import implementer
    24 from zope.interface import implementer
    27 from zope.intid.interfaces import IIntIds
    25 from zope.intid.interfaces import IIntIds
    28 from zope.lifecycleevent import ObjectMovedEvent
    26 from zope.lifecycleevent import ObjectMovedEvent
    29 
    27 
    30 from pyams_content import _
       
    31 # import interfaces
       
    32 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_SITE_PERMISSION
    28 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_SITE_PERMISSION
    33 from pyams_content.shared.common.interfaces import ISharedContent
    29 from pyams_content.shared.common.interfaces import ISharedContent
    34 from pyams_content.shared.common.interfaces.zmi import IDashboardTable
    30 from pyams_content.shared.common.interfaces.zmi import IDashboardTable
    35 from pyams_content.shared.common.zmi.dashboard import SharedToolDashboardOwnerColumn, SharedToolDashboardSequenceColumn, \
    31 from pyams_content.shared.common.zmi.dashboard import SharedToolDashboardOwnerColumn, SharedToolDashboardSequenceColumn, \
    36     SharedToolDashboardStatusColumn, SharedToolDashboardStatusDateColumn, SharedToolDashboardStatusPrincipalColumn, \
    32     SharedToolDashboardStatusColumn, SharedToolDashboardStatusDateColumn, SharedToolDashboardStatusPrincipalColumn, \
    37     SharedToolDashboardVersionColumn
    33     SharedToolDashboardVersionColumn
    38 # import packages
       
    39 from pyams_content.shared.site import WfSiteTopic
    34 from pyams_content.shared.site import WfSiteTopic
    40 from pyams_content.shared.site.interfaces import IContentLink, ISiteContainer, ISiteManager
    35 from pyams_content.shared.site.interfaces import IBaseSiteItem, IContentLink, ISiteContainer, ISiteManager
    41 from pyams_content.skin import pyams_content
    36 from pyams_content.skin import pyams_content
    42 from pyams_content.skin.zmi.interfaces import ISiteTreeMenu, ISiteTreeTable, IUserAddingsMenuLabel
    37 from pyams_content.skin.zmi.interfaces import ISiteTreeMenu, ISiteTreeTable, IUserAddingsMenuLabel
    43 from pyams_form.form import ajax_config
    38 from pyams_form.form import ajax_config
    44 from pyams_i18n.interfaces import II18n
    39 from pyams_i18n.interfaces import II18n
    45 from pyams_pagelet.pagelet import pagelet_config
    40 from pyams_pagelet.pagelet import pagelet_config
    69 from pyams_zmi.form import AdminDialogEditForm
    64 from pyams_zmi.form import AdminDialogEditForm
    70 from pyams_zmi.interfaces.menu import IPropertiesMenu, ISiteManagementMenu
    65 from pyams_zmi.interfaces.menu import IPropertiesMenu, ISiteManagementMenu
    71 from pyams_zmi.layer import IAdminLayer
    66 from pyams_zmi.layer import IAdminLayer
    72 from pyams_zmi.view import AdminView
    67 from pyams_zmi.view import AdminView
    73 
    68 
    74 
    69 from pyams_content import _
    75 @adapter_config(context=(ISiteContainer, IAdminLayer), provides=IBreadcrumbItem)
    70 
       
    71 
       
    72 @adapter_config(context=(IBaseSiteItem, IAdminLayer), provides=IBreadcrumbItem)
    76 class SiteContainerBreadcrumbAdapter(BreadcrumbAdminLayerItem):
    73 class SiteContainerBreadcrumbAdapter(BreadcrumbAdminLayerItem):
    77     """Site container breadcrumb adapter"""
    74     """Site container breadcrumb adapter"""
    78 
    75 
    79     @property
    76     @property
    80     def label(self):
    77     def label(self):
    94 
    91 
    95 #
    92 #
    96 # Site container publication views
    93 # Site container publication views
    97 #
    94 #
    98 
    95 
    99 @viewlet_config(name='workflow-publication.menu', context=ISiteContainer, layer=IPyAMSLayer, view=ISiteTreeTable,
    96 @viewlet_config(name='workflow-publication.menu', context=IBaseSiteItem, layer=IPyAMSLayer, view=ISiteTreeTable,
   100                 manager=ITableItemColumnActionsMenu, permission=MANAGE_SITE_PERMISSION, weight=210)
    97                 manager=ITableItemColumnActionsMenu, permission=MANAGE_SITE_PERMISSION, weight=210)
   101 class SiteContainerTableItemWorkflowPublicationMenu(ToolbarMenuItem):
    98 class SiteContainerTableItemWorkflowPublicationMenu(ToolbarMenuItem):
   102     """Site container tree item workflow publication menu"""
    99     """Site container tree item workflow publication menu"""
   103 
   100 
   104     label = _("Publication dates...")
   101     label = _("Publication dates...")
   106     url = 'workflow-publication.html'
   103     url = 'workflow-publication.html'
   107     modal_target = True
   104     modal_target = True
   108     stop_propagation = True
   105     stop_propagation = True
   109 
   106 
   110 
   107 
   111 @viewlet_config(name='workflow-publication.menu', context=ISiteContainer, layer=IAdminLayer, manager=IPropertiesMenu,
   108 @viewlet_config(name='workflow-publication.menu', context=IBaseSiteItem, layer=IAdminLayer, manager=IPropertiesMenu,
   112                 permission=MANAGE_SITE_PERMISSION, weight=210)
   109                 permission=MANAGE_SITE_PERMISSION, weight=210)
   113 class SiteContainerWorkflowPublicationMenu(MenuItem):
   110 class SiteContainerWorkflowPublicationMenu(MenuItem):
   114     """Site container workflow publication menu"""
   111     """Site container workflow publication menu"""
   115 
   112 
   116     label = _("Publication dates...")
   113     label = _("Publication dates...")
   117     icon_class = 'fa-eye'
   114     icon_class = 'fa-eye'
   118     url = 'workflow-publication.html'
   115     url = 'workflow-publication.html'
   119     modal_target = True
   116     modal_target = True
   120 
   117 
   121 
   118 
   122 @pagelet_config(name='workflow-publication.html', context=ISiteContainer, layer=IPyAMSLayer,
   119 @pagelet_config(name='workflow-publication.html', context=IBaseSiteItem, layer=IPyAMSLayer,
   123                 permission=MANAGE_SITE_PERMISSION)
   120                 permission=MANAGE_SITE_PERMISSION)
   124 @ajax_config(name='workflow-publication.json', context=ISiteContainer, layer=IPyAMSLayer)
   121 @ajax_config(name='workflow-publication.json', context=IBaseSiteItem, layer=IPyAMSLayer)
   125 class SiteContainerWorkflowPublicationEditForm(AdminDialogEditForm):
   122 class SiteContainerWorkflowPublicationEditForm(AdminDialogEditForm):
   126     """Site container workflow publication edit form"""
   123     """Site container workflow publication edit form"""
   127 
   124 
   128     prefix = 'site_publication.'
   125     prefix = 'site_publication.'
   129 
   126 
   148                     icon_class = 'fa-eye opacity-75'
   145                     icon_class = 'fa-eye opacity-75'
   149                 else:
   146                 else:
   150                     icon_class = 'fa-eye-slash text-danger opaque'
   147                     icon_class = 'fa-eye-slash text-danger opaque'
   151                 value = '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \
   148                 value = '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \
   152                         'data-ams-hint-gravity="e"></i>'.format(
   149                         'data-ams-hint-gravity="e"></i>'.format(
   153                             icon_class=icon_class,
   150                     icon_class=icon_class,
   154                             title=self.request.localizer.translate(_("Visible element?")))
   151                     title=self.request.localizer.translate(_("Visible element?")))
   155                 intids = get_utility(IIntIds)
   152                 intids = get_utility(IIntIds)
   156                 output.setdefault('events', []).append(
   153                 output.setdefault('events', []).append(
   157                     get_json_table_cell_refresh_event(self.context, self.request,
   154                     get_json_table_cell_refresh_event(self.context, self.request,
   158                                                       '{0}::{1}'.format(SiteContainerTreeTable.id,
   155                                                       '{0}::{1}'.format(SiteContainerTreeTable.id,
   159                                                                         intids.queryId(self.context)),
   156                                                                         intids.queryId(self.context)),
   164 
   161 
   165 #
   162 #
   166 # Site container tree view
   163 # Site container tree view
   167 #
   164 #
   168 
   165 
   169 @viewlet_config(name='site-tree.menu', layer=IAdminLayer, context=ISiteContainer, manager=ISiteManagementMenu,
   166 @viewlet_config(name='site-tree.menu', layer=IAdminLayer, context=IBaseSiteItem, manager=ISiteManagementMenu,
   170                 permission=VIEW_SYSTEM_PERMISSION, weight=10)
   167                 permission=VIEW_SYSTEM_PERMISSION, weight=10)
   171 @viewletmanager_config(name='site-tree.menu', layer=IAdminLayer, context=ISiteContainer, provides=ISiteTreeMenu)
   168 @viewletmanager_config(name='site-tree.menu', layer=IAdminLayer, context=IBaseSiteItem, provides=ISiteTreeMenu)
   172 @implementer(ISiteTreeMenu)
   169 @implementer(ISiteTreeMenu)
   173 class SiteContainerTreeMenu(MenuItem):
   170 class SiteContainerTreeMenu(MenuItem):
   174     """Site container tree menu"""
   171     """Site container tree menu"""
   175 
   172 
   176     label = _("Site tree")
   173     label = _("Site tree")
   229             'data-ams-tree-node-parent-id': lambda x, col: intids.queryId(x.__parent__)
   226             'data-ams-tree-node-parent-id': lambda x, col: intids.queryId(x.__parent__)
   230         })
   227         })
   231         return attributes
   228         return attributes
   232 
   229 
   233 
   230 
   234 @adapter_config(name='sorter', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   231 @adapter_config(name='sorter', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   235 class SiteContainerTreeSorterColumn(SorterColumn):
   232 class SiteContainerTreeSorterColumn(SorterColumn):
   236     """Site container tree sorter column"""
   233     """Site container tree sorter column"""
   237 
   234 
   238     permission = MANAGE_SITE_PERMISSION
   235     permission = MANAGE_SITE_PERMISSION
   239 
   236 
   242             return super(SiteContainerTreeSorterColumn, self).renderCell(item)
   239             return super(SiteContainerTreeSorterColumn, self).renderCell(item)
   243         else:
   240         else:
   244             return ''
   241             return ''
   245 
   242 
   246 
   243 
   247 @view_config(name='set-site-order.json', context=ISiteContainer, request_type=IPyAMSLayer,
   244 @view_config(name='set-site-order.json', context=IBaseSiteItem, request_type=IPyAMSLayer,
   248              permission=MANAGE_SITE_PERMISSION, renderer='json', xhr=True)
   245              permission=MANAGE_SITE_PERMISSION, renderer='json', xhr=True)
   249 def set_site_order(request):
   246 def set_site_order(request):
   250     """Set site elements order"""
   247     """Set site elements order"""
   251     intids = get_utility(IIntIds)
   248     intids = get_utility(IIntIds)
   252     parent_oid = int(request.params.get('parent'))
   249     parent_oid = int(request.params.get('parent'))
   295         row = table.setUpRow(item)
   292         row = table.setUpRow(item)
   296         result.append(table.renderRow(row).strip())
   293         result.append(table.renderRow(row).strip())
   297     return result
   294     return result
   298 
   295 
   299 
   296 
   300 @adapter_config(name='visible', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   297 @adapter_config(name='visible', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   301 class SiteContainerTreeVisibleColumn(JsActionColumn):
   298 class SiteContainerTreeVisibleColumn(JsActionColumn):
   302     """Site container tree visible column"""
   299     """Site container tree visible column"""
   303 
   300 
   304     cssClasses = {'th': 'action',
   301     cssClasses = {'th': 'action',
   305                   'td': 'action'}
   302                   'td': 'action'}
   330                     icon_class = 'fa-eye opacity-75'
   327                     icon_class = 'fa-eye opacity-75'
   331                 else:
   328                 else:
   332                     icon_class = 'fa-eye-slash text-danger opaque'
   329                     icon_class = 'fa-eye-slash text-danger opaque'
   333             return '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \
   330             return '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \
   334                    'data-ams-hint-gravity="e"></i>'.format(
   331                    'data-ams-hint-gravity="e"></i>'.format(
   335                     icon_class=icon_class,
   332                 icon_class=icon_class,
   336                     title=self.request.localizer.translate(self.get_icon_hint(item)))
   333                 title=self.request.localizer.translate(self.get_icon_hint(item)))
   337 
   334 
   338     def get_icon_hint(self, item):
   335     def get_icon_hint(self, item):
   339         translate = self.request.localizer.translate
   336         translate = self.request.localizer.translate
   340         if IContentLink.providedBy(item) and self.request.has_permission(self.permission, context=item):
   337         if IContentLink.providedBy(item) and self.request.has_permission(self.permission, context=item):
   341             return translate(self.active_icon_hint)
   338             return translate(self.active_icon_hint)
   347             return super(SiteContainerTreeVisibleColumn, self).renderCell(item)
   344             return super(SiteContainerTreeVisibleColumn, self).renderCell(item)
   348         else:
   345         else:
   349             return self.get_icon(item)
   346             return self.get_icon(item)
   350 
   347 
   351 
   348 
   352 @view_config(name='switch-content-visibility.json', context=ISiteContainer, request_type=IPyAMSLayer,
   349 @view_config(name='switch-content-visibility.json', context=IBaseSiteItem, request_type=IPyAMSLayer,
   353              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   350              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   354 def switch_content_visibility(request):
   351 def switch_content_visibility(request):
   355     """Switch content link visibility"""
   352     """Switch content link visibility"""
   356     container = ISiteContainer(request.context)
   353     container = ISiteContainer(request.context)
   357     content = container.get(str(request.params.get('object_name')))
   354     content = container.get(str(request.params.get('object_name')))
   362         'visible': content.visible,
   359         'visible': content.visible,
   363         'published': IWorkflowPublicationInfo(content.__parent__).is_published()
   360         'published': IWorkflowPublicationInfo(content.__parent__).is_published()
   364     }
   361     }
   365 
   362 
   366 
   363 
   367 @adapter_config(name='name', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   364 @adapter_config(name='name', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   368 class SiteContainerTreeNameColumn(NameColumn):
   365 class SiteContainerTreeNameColumn(NameColumn):
   369     """Site container tree name column"""
   366     """Site container tree name column"""
   370 
   367 
   371     _header = _("Folders and topics")
   368     _header = _("Folders and topics")
   372 
   369 
   375                '      data-ams-click-handler="MyAMS.tree.switchTree">' \
   372                '      data-ams-click-handler="MyAMS.tree.switchTree">' \
   376                '    <span class="small hint" title="{hint}" data-ams-hint-gravity="e">' \
   373                '    <span class="small hint" title="{hint}" data-ams-hint-gravity="e">' \
   377                '        <i class="fa fa-fw fa-plus-square-o switch"></i>' \
   374                '        <i class="fa fa-fw fa-plus-square-o switch"></i>' \
   378                '    </span>&nbsp;&nbsp;{title}' \
   375                '    </span>&nbsp;&nbsp;{title}' \
   379                '</span>'.format(
   376                '</span>'.format(
   380                     hint=self.request.localizer.translate(_("Click to open/close all folders")),
   377             hint=self.request.localizer.translate(_("Click to open/close all folders")),
   381                     title=super(SiteContainerTreeNameColumn, self).renderHeadCell())
   378             title=super(SiteContainerTreeNameColumn, self).renderHeadCell())
   382 
   379 
   383     def renderCell(self, item, name=None):
   380     def renderCell(self, item, name=None):
   384         depth = -3
   381         depth = -3
   385         for node in lineage(item):
   382         for node in lineage(item):
   386             depth += 1
   383             depth += 1
   390                '          data-ams-click-handler="MyAMS.tree.switchTableNode"' \
   387                '          data-ams-click-handler="MyAMS.tree.switchTableNode"' \
   391                '          data-ams-stop-propagation="true">' \
   388                '          data-ams-stop-propagation="true">' \
   392                '        <i class="fa fa-fw {switch}"></i>' \
   389                '        <i class="fa fa-fw {switch}"></i>' \
   393                '    </span>&nbsp;&nbsp;<span class="title">{title}</span>' \
   390                '    </span>&nbsp;&nbsp;<span class="title">{title}</span>' \
   394                '</div>'.format(
   391                '</div>'.format(
   395                 padding='<span class="tree-node-padding"></span>' * depth,
   392             padding='<span class="tree-node-padding"></span>' * depth,
   396                 hint=self.request.localizer.translate(_("Click to show/hide inner folders")),
   393             hint=self.request.localizer.translate(_("Click to show/hide inner folders")),
   397                 switch='fa-{state}-square-o switch'.format(
   394             switch='fa-{state}-square-o switch'.format(
   398                     state=self.table.rows_state or ('minus' if item in lineage(self.context) else 'plus'))
   395                 state=self.table.rows_state or ('minus' if item in lineage(self.context) else 'plus'))
   399                 if ISiteContainer.providedBy(item) else '',
   396             if ISiteContainer.providedBy(item) else '',
   400                 title=name or super(SiteContainerTreeNameColumn, self).renderCell(item))
   397             title=name or super(SiteContainerTreeNameColumn, self).renderCell(item))
   401 
   398 
   402 
   399 
   403 @adapter_config(name='content-type', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   400 @adapter_config(name='content-type', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   404 class SiteContainerContentTypeColumn(I18nColumn, GetAttrColumn):
   401 class SiteContainerContentTypeColumn(I18nColumn, GetAttrColumn):
   405     """Site container content type column"""
   402     """Site container content type column"""
   406 
   403 
   407     _header = _("Content")
   404     _header = _("Content")
   408 
   405 
   410 
   407 
   411     def getValue(self, obj):
   408     def getValue(self, obj):
   412         return self.request.localizer.translate(obj.content_name)
   409         return self.request.localizer.translate(obj.content_name)
   413 
   410 
   414 
   411 
   415 @adapter_config(name='sequence', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   412 @adapter_config(name='sequence', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   416 class SiteContainerTreeSequenceColumn(SharedToolDashboardSequenceColumn):
   413 class SiteContainerTreeSequenceColumn(SharedToolDashboardSequenceColumn):
   417     """Site container tree OID column"""
   414     """Site container tree OID column"""
   418 
   415 
   419     def getValue(self, obj):
   416     def getValue(self, obj):
   420         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   417         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   424         if IContentLink.providedBy(obj):
   421         if IContentLink.providedBy(obj):
   425             result = '&raquo; {0}'.format(result)
   422             result = '&raquo; {0}'.format(result)
   426         return result
   423         return result
   427 
   424 
   428 
   425 
   429 @adapter_config(name='status', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   426 @adapter_config(name='status', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   430 class SiteContainerTreeStatusColumn(SharedToolDashboardStatusColumn):
   427 class SiteContainerTreeStatusColumn(SharedToolDashboardStatusColumn):
   431     """Site container tree status column"""
   428     """Site container tree status column"""
   432 
   429 
   433     def getValue(self, obj):
   430     def getValue(self, obj):
   434         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   431         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   438         if IContentLink.providedBy(obj):
   435         if IContentLink.providedBy(obj):
   439             result = '({0})'.format(result)
   436             result = '({0})'.format(result)
   440         return result
   437         return result
   441 
   438 
   442 
   439 
   443 @adapter_config(name='status_date', context=(ISiteContainer, IPyAMSLayer, IDashboardTable), provides=IColumn)
   440 @adapter_config(name='status_date', context=(IBaseSiteItem, IPyAMSLayer, IDashboardTable), provides=IColumn)
   444 class SiteContainerTreeStatusDateColumn(SharedToolDashboardStatusDateColumn):
   441 class SiteContainerTreeStatusDateColumn(SharedToolDashboardStatusDateColumn):
   445     """Site container tree status date column"""
   442     """Site container tree status date column"""
   446 
   443 
   447     def getValue(self, obj):
   444     def getValue(self, obj):
   448         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   445         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   452         if IContentLink.providedBy(obj):
   449         if IContentLink.providedBy(obj):
   453             result = '({0})'.format(result)
   450             result = '({0})'.format(result)
   454         return result
   451         return result
   455 
   452 
   456 
   453 
   457 @adapter_config(name='version', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   454 @adapter_config(name='version', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   458 class SiteContainerTreeVersionColumn(SharedToolDashboardVersionColumn):
   455 class SiteContainerTreeVersionColumn(SharedToolDashboardVersionColumn):
   459     """Site container tree version column"""
   456     """Site container tree version column"""
   460 
   457 
   461     def getValue(self, obj):
   458     def getValue(self, obj):
   462         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   459         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   466         if IContentLink.providedBy(obj):
   463         if IContentLink.providedBy(obj):
   467             result = '({0})'.format(result)
   464             result = '({0})'.format(result)
   468         return result
   465         return result
   469 
   466 
   470 
   467 
   471 @adapter_config(name='status_principal', context=(ISiteContainer, IPyAMSLayer, IDashboardTable), provides=IColumn)
   468 @adapter_config(name='status_principal', context=(IBaseSiteItem, IPyAMSLayer, IDashboardTable), provides=IColumn)
   472 class SiteContainerTreeStatusPrincipalColumn(SharedToolDashboardStatusPrincipalColumn):
   469 class SiteContainerTreeStatusPrincipalColumn(SharedToolDashboardStatusPrincipalColumn):
   473     """Site container tree status principal column"""
   470     """Site container tree status principal column"""
   474 
   471 
   475     def getValue(self, obj):
   472     def getValue(self, obj):
   476         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   473         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   480         if IContentLink.providedBy(obj):
   477         if IContentLink.providedBy(obj):
   481             result = '({0})'.format(result)
   478             result = '({0})'.format(result)
   482         return result
   479         return result
   483 
   480 
   484 
   481 
   485 @adapter_config(name='owner', context=(ISiteContainer, IPyAMSLayer, IDashboardTable), provides=IColumn)
   482 @adapter_config(name='owner', context=(IBaseSiteItem, IPyAMSLayer, IDashboardTable), provides=IColumn)
   486 class SiteContainerTreeOwnerColumn(SharedToolDashboardOwnerColumn):
   483 class SiteContainerTreeOwnerColumn(SharedToolDashboardOwnerColumn):
   487     """Site container tree owner column"""
   484     """Site container tree owner column"""
   488 
   485 
   489     def getValue(self, obj):
   486     def getValue(self, obj):
   490         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   487         target = obj.get_target() if IContentLink.providedBy(obj) else obj
   494         if IContentLink.providedBy(obj):
   491         if IContentLink.providedBy(obj):
   495             result = '({0})'.format(result)
   492             result = '({0})'.format(result)
   496         return result
   493         return result
   497 
   494 
   498 
   495 
   499 @adapter_config(name='trash', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   496 @adapter_config(name='trash', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
   500 class SiteContainerTreeTrashColumn(TrashColumn):
   497 class SiteContainerTreeTrashColumn(TrashColumn):
   501     """Site container tree trash column"""
   498     """Site container tree trash column"""
   502 
   499 
   503     icon_hint = _("Delete site item")
   500     icon_hint = _("Delete site item")
   504     permission = MANAGE_SITE_PERMISSION
   501     permission = MANAGE_SITE_PERMISSION
   514 def delete_site_item(request):
   511 def delete_site_item(request):
   515     """Delete item from site container"""
   512     """Delete item from site container"""
   516     return delete_container_element(request, ignore_permission=True)
   513     return delete_container_element(request, ignore_permission=True)
   517 
   514 
   518 
   515 
   519 @adapter_config(context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IValues)
   516 @adapter_config(context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IValues)
   520 class SiteContainerTreeValuesAdapter(ContextRequestViewAdapter):
   517 class SiteContainerTreeValuesAdapter(ContextRequestViewAdapter):
   521     """Site container tree values adapter"""
   518     """Site container tree values adapter"""
   522 
   519 
   523     @property
   520     @property
   524     def values(self):
   521     def values(self):
   538             if ISiteContainer.providedBy(container):
   535             if ISiteContainer.providedBy(container):
   539                 get_values(container, values)
   536                 get_values(container, values)
   540         return values
   537         return values
   541 
   538 
   542 
   539 
   543 @pagelet_config(name='site-tree.html', context=ISiteContainer, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   540 @pagelet_config(name='site-tree.html', context=IBaseSiteItem, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   544 @implementer(IInnerPage)
   541 @implementer(IInnerPage)
   545 class SiteContainerTreeView(AdminView, ContainerView):
   542 class SiteContainerTreeView(AdminView, ContainerView):
   546     """Site Container tree view"""
   543     """Site Container tree view"""
   547 
   544 
   548     table_class = SiteContainerTreeTable
   545     table_class = SiteContainerTreeTable
   550     def __init__(self, context, request):
   547     def __init__(self, context, request):
   551         super(ContainerView, self).__init__(context, request)
   548         super(ContainerView, self).__init__(context, request)
   552         self.table = SiteContainerTreeTable(context, request, can_sort=ISiteManager.providedBy(context))
   549         self.table = SiteContainerTreeTable(context, request, can_sort=ISiteManager.providedBy(context))
   553 
   550 
   554 
   551 
   555 @adapter_config(context=(ISiteContainer, IAdminLayer, ISiteTreeTable), provides=IPageHeader)
   552 @adapter_config(context=(IBaseSiteItem, IAdminLayer, ISiteTreeTable), provides=IPageHeader)
   556 class SiteContainerViewHeaderAdapter(DefaultPageHeaderAdapter):
   553 class SiteContainerViewHeaderAdapter(DefaultPageHeaderAdapter):
   557     """Site container tree view header adapter"""
   554     """Site container tree view header adapter"""
   558 
   555 
   559     icon_class = 'fa fa-fw fa-sitemap'
   556     icon_class = 'fa fa-fw fa-sitemap'
   560 
   557 
   561 
   558 
   562 @view_config(name='get-tree.json', context=ISiteContainer, request_type=IPyAMSLayer,
   559 @view_config(name='get-tree.json', context=IBaseSiteItem, request_type=IPyAMSLayer,
   563              permission=VIEW_SYSTEM_PERMISSION, renderer='json', xhr=True)
   560              permission=VIEW_SYSTEM_PERMISSION, renderer='json', xhr=True)
   564 def get_tree(request):
   561 def get_tree(request):
   565     """Get whole tree"""
   562     """Get whole tree"""
   566 
   563 
   567     def get_tree_values(parent):
   564     def get_tree_values(parent):
   594         row = table.setUpRow(item)
   591         row = table.setUpRow(item)
   595         result.append(table.renderRow(row).strip())
   592         result.append(table.renderRow(row).strip())
   596     return result
   593     return result
   597 
   594 
   598 
   595 
   599 @adapter_config(context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=ITableElementName)
   596 @adapter_config(context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=ITableElementName)
   600 class SiteContainerTableElementName(ContextRequestViewAdapter):
   597 class SiteContainerTableElementName(ContextRequestViewAdapter):
   601     """Site container tree table element name"""
   598     """Site container tree table element name"""
   602 
   599 
   603     @property
   600     @property
   604     def name(self):
   601     def name(self):
   605         return II18n(self.context).query_attribute('title', request=self.request)
   602         return II18n(self.context).query_attribute('title', request=self.request)
   606 
   603 
   607 
   604 
   608 @adapter_config(context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=ITableElementEditor)
   605 @adapter_config(context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=ITableElementEditor)
   609 class SiteContainerTableElementEditor(DefaultElementEditorAdapter):
   606 class SiteContainerTableElementEditor(DefaultElementEditorAdapter):
   610     """Site container tree table element editor"""
   607     """Site container tree table element editor"""
   611 
   608 
   612     view_name = 'admin#site-tree.html'
   609     view_name = 'admin#site-tree.html'
   613     modal_target = False
   610     modal_target = False