--- a/src/pyams_content/shared/common/zmi/summary.py Tue Nov 06 14:40:22 2018 +0100
+++ b/src/pyams_content/shared/common/zmi/summary.py Wed Nov 07 17:29:16 2018 +0100
@@ -12,20 +12,14 @@
__docformat__ = 'restructuredtext'
-
-# import standard library
-
from z3c.form import field
from z3c.form.interfaces import DISPLAY_MODE, IDataConverter
-from zope.interface import implementer, Interface
+from zope.interface import Interface, implementer
-from pyams_content import _
-# import interfaces
-from pyams_content.shared.common.interfaces import IWfSharedContent, IWfSharedContentRoles, IBaseSharedTool
+from pyams_content.shared.common.interfaces import IBaseSharedTool, IWfSharedContent, IWfSharedContentRoles
from pyams_content.shared.common.interfaces.types import IWfTypedSharedContent
-# import packages
from pyams_content.shared.common.zmi.header import SharedContentHeaderContentProvider
-from pyams_form.interfaces.form import IWidgetForm, IInnerTabForm, IInnerSubForm
+from pyams_form.interfaces.form import IInnerSubForm, IInnerTabForm, IWidgetForm
from pyams_pagelet.pagelet import pagelet_config
from pyams_security.utility import get_principal
from pyams_sequence.interfaces import ISequentialIdInfo
@@ -38,9 +32,11 @@
from pyams_utils.traversing import get_parent
from pyams_utils.url import absolute_url
from pyams_viewlet.viewlet import contentprovider_config
-from pyams_workflow.interfaces import IWorkflowState, IWorkflow, IWorkflowPublicationInfo, IWorkflowStateHistoryItem, \
+from pyams_workflow.interfaces import IWorkflow, IWorkflowPublicationInfo, IWorkflowState, IWorkflowStateHistoryItem, \
IWorkflowVersions
-from pyams_zmi.form import AdminDisplayForm, InnerAdminDisplayForm, InnerAdminAddForm
+from pyams_zmi.form import AdminDisplayForm, InnerAdminAddForm, InnerAdminDisplayForm
+
+from pyams_content import _
@pagelet_config(name='summary.html', context=IWfSharedContent, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@@ -97,13 +93,13 @@
def __new__(cls, context, request, form):
workflow = IWorkflow(context)
- state = IWorkflowState(context)
- if state.state not in workflow.waiting_states:
+ state = IWorkflowState(context, None)
+ if (state is None) or (state.state not in workflow.waiting_states):
return None
return InnerAdminDisplayForm.__new__(cls)
fields = field.Fields(IWorkflowState).select('state', 'state_urgency') + \
- field.Fields(IWorkflowStateHistoryItem).select('comment')
+ field.Fields(IWorkflowStateHistoryItem).select('comment')
def updateWidgets(self, prefix=None):
super(SharedContentWorkflowWaitingState, self).updateWidgets(prefix)
@@ -135,8 +131,8 @@
weight = 20
def __new__(cls, context, request, form):
- info = IWorkflowPublicationInfo(context)
- if not info.publication_effective_date:
+ info = IWorkflowPublicationInfo(context, None)
+ if (info is None) or not info.publication_effective_date:
return None
return InnerAdminDisplayForm.__new__(cls)
@@ -153,11 +149,17 @@
legend = _("Current version")
weight = 30
+ def __new__(cls, context, request, form):
+ state = IWorkflowState(context, None)
+ if state is None:
+ return None
+ return InnerAdminDisplayForm.__new__(cls)
+
fields = field.Fields(IWorkflowState).select('version_id', 'state') + \
- field.Fields(IWfSharedContent).select('creation_label') + \
- field.Fields(IWfSharedContentRoles).select('owner') + \
- field.Fields(IWfSharedContent).select('last_update_label') + \
- field.Fields(IWfSharedContent).select('modifiers')
+ field.Fields(IWfSharedContent).select('creation_label') + \
+ field.Fields(IWfSharedContentRoles).select('owner') + \
+ field.Fields(IWfSharedContent).select('last_update_label') + \
+ field.Fields(IWfSharedContent).select('modifiers')
def updateWidgets(self, prefix=None):
super(SharedContentWorkflowVersionSummary, self).updateWidgets(prefix)
@@ -182,20 +184,31 @@
legend = _("Content history")
+ def __new__(cls, context, request, form):
+ info = IWorkflowPublicationInfo(context, None)
+ if info is None:
+ return None
+ return InnerAdminDisplayForm.__new__(cls)
+
fields = field.Fields(IWorkflowPublicationInfo).select('first_publication_date') + \
- field.Fields(IWfSharedContent).select('first_owner')
+ field.Fields(IWfSharedContent).select('first_owner')
weight = 40
def updateWidgets(self, prefix=None):
super(SharedContentWorkflowHistorySummary, self).updateWidgets(prefix)
- workflow = IWorkflow(self.context)
- versions = IWorkflowVersions(self.context)
- value = ''
- for version in versions.get_versions():
- state = IWorkflowState(version)
- pub_date = tztime(state.get_first_state_date(workflow.published_states))
- if pub_date is not None:
- value = format_datetime(pub_date)
- break
- self.widgets['first_publication_date'].value = value
+ if 'first_publication_date' in self.widgets:
+ versions = IWorkflowVersions(self.context, None)
+ if versions is not None:
+ workflow = IWorkflow(self.context)
+ value = ''
+ for version in versions.get_versions():
+ state = IWorkflowState(version)
+ pub_date = tztime(state.get_first_state_date(workflow.published_states))
+ if pub_date is not None:
+ value = format_datetime(pub_date)
+ break
+ else:
+ info = IWorkflowPublicationInfo(self.context, None)
+ value = format_datetime(info.first_publication_date)
+ self.widgets['first_publication_date'].value = value
--- a/src/pyams_content/shared/site/zmi/container.py Tue Nov 06 14:40:22 2018 +0100
+++ b/src/pyams_content/shared/site/zmi/container.py Wed Nov 07 17:29:16 2018 +0100
@@ -12,8 +12,6 @@
__docformat__ = 'restructuredtext'
-
-# import standard library
import json
from datetime import datetime
@@ -27,17 +25,14 @@
from zope.intid.interfaces import IIntIds
from zope.lifecycleevent import ObjectMovedEvent
-from pyams_content import _
-# import interfaces
from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_SITE_PERMISSION
from pyams_content.shared.common.interfaces import ISharedContent
from pyams_content.shared.common.interfaces.zmi import IDashboardTable
from pyams_content.shared.common.zmi.dashboard import SharedToolDashboardOwnerColumn, SharedToolDashboardSequenceColumn, \
SharedToolDashboardStatusColumn, SharedToolDashboardStatusDateColumn, SharedToolDashboardStatusPrincipalColumn, \
SharedToolDashboardVersionColumn
-# import packages
from pyams_content.shared.site import WfSiteTopic
-from pyams_content.shared.site.interfaces import IContentLink, ISiteContainer, ISiteManager
+from pyams_content.shared.site.interfaces import IBaseSiteItem, IContentLink, ISiteContainer, ISiteManager
from pyams_content.skin import pyams_content
from pyams_content.skin.zmi.interfaces import ISiteTreeMenu, ISiteTreeTable, IUserAddingsMenuLabel
from pyams_form.form import ajax_config
@@ -71,8 +66,10 @@
from pyams_zmi.layer import IAdminLayer
from pyams_zmi.view import AdminView
+from pyams_content import _
-@adapter_config(context=(ISiteContainer, IAdminLayer), provides=IBreadcrumbItem)
+
+@adapter_config(context=(IBaseSiteItem, IAdminLayer), provides=IBreadcrumbItem)
class SiteContainerBreadcrumbAdapter(BreadcrumbAdminLayerItem):
"""Site container breadcrumb adapter"""
@@ -96,7 +93,7 @@
# Site container publication views
#
-@viewlet_config(name='workflow-publication.menu', context=ISiteContainer, layer=IPyAMSLayer, view=ISiteTreeTable,
+@viewlet_config(name='workflow-publication.menu', context=IBaseSiteItem, layer=IPyAMSLayer, view=ISiteTreeTable,
manager=ITableItemColumnActionsMenu, permission=MANAGE_SITE_PERMISSION, weight=210)
class SiteContainerTableItemWorkflowPublicationMenu(ToolbarMenuItem):
"""Site container tree item workflow publication menu"""
@@ -108,7 +105,7 @@
stop_propagation = True
-@viewlet_config(name='workflow-publication.menu', context=ISiteContainer, layer=IAdminLayer, manager=IPropertiesMenu,
+@viewlet_config(name='workflow-publication.menu', context=IBaseSiteItem, layer=IAdminLayer, manager=IPropertiesMenu,
permission=MANAGE_SITE_PERMISSION, weight=210)
class SiteContainerWorkflowPublicationMenu(MenuItem):
"""Site container workflow publication menu"""
@@ -119,9 +116,9 @@
modal_target = True
-@pagelet_config(name='workflow-publication.html', context=ISiteContainer, layer=IPyAMSLayer,
+@pagelet_config(name='workflow-publication.html', context=IBaseSiteItem, layer=IPyAMSLayer,
permission=MANAGE_SITE_PERMISSION)
-@ajax_config(name='workflow-publication.json', context=ISiteContainer, layer=IPyAMSLayer)
+@ajax_config(name='workflow-publication.json', context=IBaseSiteItem, layer=IPyAMSLayer)
class SiteContainerWorkflowPublicationEditForm(AdminDialogEditForm):
"""Site container workflow publication edit form"""
@@ -150,8 +147,8 @@
icon_class = 'fa-eye-slash text-danger opaque'
value = '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \
'data-ams-hint-gravity="e"></i>'.format(
- icon_class=icon_class,
- title=self.request.localizer.translate(_("Visible element?")))
+ icon_class=icon_class,
+ title=self.request.localizer.translate(_("Visible element?")))
intids = get_utility(IIntIds)
output.setdefault('events', []).append(
get_json_table_cell_refresh_event(self.context, self.request,
@@ -166,9 +163,9 @@
# Site container tree view
#
-@viewlet_config(name='site-tree.menu', layer=IAdminLayer, context=ISiteContainer, manager=ISiteManagementMenu,
+@viewlet_config(name='site-tree.menu', layer=IAdminLayer, context=IBaseSiteItem, manager=ISiteManagementMenu,
permission=VIEW_SYSTEM_PERMISSION, weight=10)
-@viewletmanager_config(name='site-tree.menu', layer=IAdminLayer, context=ISiteContainer, provides=ISiteTreeMenu)
+@viewletmanager_config(name='site-tree.menu', layer=IAdminLayer, context=IBaseSiteItem, provides=ISiteTreeMenu)
@implementer(ISiteTreeMenu)
class SiteContainerTreeMenu(MenuItem):
"""Site container tree menu"""
@@ -231,7 +228,7 @@
return attributes
-@adapter_config(name='sorter', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
+@adapter_config(name='sorter', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
class SiteContainerTreeSorterColumn(SorterColumn):
"""Site container tree sorter column"""
@@ -244,7 +241,7 @@
return ''
-@view_config(name='set-site-order.json', context=ISiteContainer, request_type=IPyAMSLayer,
+@view_config(name='set-site-order.json', context=IBaseSiteItem, request_type=IPyAMSLayer,
permission=MANAGE_SITE_PERMISSION, renderer='json', xhr=True)
def set_site_order(request):
"""Set site elements order"""
@@ -297,7 +294,7 @@
return result
-@adapter_config(name='visible', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
+@adapter_config(name='visible', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
class SiteContainerTreeVisibleColumn(JsActionColumn):
"""Site container tree visible column"""
@@ -332,8 +329,8 @@
icon_class = 'fa-eye-slash text-danger opaque'
return '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \
'data-ams-hint-gravity="e"></i>'.format(
- icon_class=icon_class,
- title=self.request.localizer.translate(self.get_icon_hint(item)))
+ icon_class=icon_class,
+ title=self.request.localizer.translate(self.get_icon_hint(item)))
def get_icon_hint(self, item):
translate = self.request.localizer.translate
@@ -349,7 +346,7 @@
return self.get_icon(item)
-@view_config(name='switch-content-visibility.json', context=ISiteContainer, request_type=IPyAMSLayer,
+@view_config(name='switch-content-visibility.json', context=IBaseSiteItem, request_type=IPyAMSLayer,
permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
def switch_content_visibility(request):
"""Switch content link visibility"""
@@ -364,7 +361,7 @@
}
-@adapter_config(name='name', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
+@adapter_config(name='name', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
class SiteContainerTreeNameColumn(NameColumn):
"""Site container tree name column"""
@@ -377,8 +374,8 @@
' <i class="fa fa-fw fa-plus-square-o switch"></i>' \
' </span> {title}' \
'</span>'.format(
- hint=self.request.localizer.translate(_("Click to open/close all folders")),
- title=super(SiteContainerTreeNameColumn, self).renderHeadCell())
+ hint=self.request.localizer.translate(_("Click to open/close all folders")),
+ title=super(SiteContainerTreeNameColumn, self).renderHeadCell())
def renderCell(self, item, name=None):
depth = -3
@@ -392,15 +389,15 @@
' <i class="fa fa-fw {switch}"></i>' \
' </span> <span class="title">{title}</span>' \
'</div>'.format(
- padding='<span class="tree-node-padding"></span>' * depth,
- hint=self.request.localizer.translate(_("Click to show/hide inner folders")),
- switch='fa-{state}-square-o switch'.format(
- state=self.table.rows_state or ('minus' if item in lineage(self.context) else 'plus'))
- if ISiteContainer.providedBy(item) else '',
- title=name or super(SiteContainerTreeNameColumn, self).renderCell(item))
+ padding='<span class="tree-node-padding"></span>' * depth,
+ hint=self.request.localizer.translate(_("Click to show/hide inner folders")),
+ switch='fa-{state}-square-o switch'.format(
+ state=self.table.rows_state or ('minus' if item in lineage(self.context) else 'plus'))
+ if ISiteContainer.providedBy(item) else '',
+ title=name or super(SiteContainerTreeNameColumn, self).renderCell(item))
-@adapter_config(name='content-type', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
+@adapter_config(name='content-type', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
class SiteContainerContentTypeColumn(I18nColumn, GetAttrColumn):
"""Site container content type column"""
@@ -412,7 +409,7 @@
return self.request.localizer.translate(obj.content_name)
-@adapter_config(name='sequence', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
+@adapter_config(name='sequence', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
class SiteContainerTreeSequenceColumn(SharedToolDashboardSequenceColumn):
"""Site container tree OID column"""
@@ -426,7 +423,7 @@
return result
-@adapter_config(name='status', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
+@adapter_config(name='status', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
class SiteContainerTreeStatusColumn(SharedToolDashboardStatusColumn):
"""Site container tree status column"""
@@ -440,7 +437,7 @@
return result
-@adapter_config(name='status_date', context=(ISiteContainer, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='status_date', context=(IBaseSiteItem, IPyAMSLayer, IDashboardTable), provides=IColumn)
class SiteContainerTreeStatusDateColumn(SharedToolDashboardStatusDateColumn):
"""Site container tree status date column"""
@@ -454,7 +451,7 @@
return result
-@adapter_config(name='version', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
+@adapter_config(name='version', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
class SiteContainerTreeVersionColumn(SharedToolDashboardVersionColumn):
"""Site container tree version column"""
@@ -468,7 +465,7 @@
return result
-@adapter_config(name='status_principal', context=(ISiteContainer, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='status_principal', context=(IBaseSiteItem, IPyAMSLayer, IDashboardTable), provides=IColumn)
class SiteContainerTreeStatusPrincipalColumn(SharedToolDashboardStatusPrincipalColumn):
"""Site container tree status principal column"""
@@ -482,7 +479,7 @@
return result
-@adapter_config(name='owner', context=(ISiteContainer, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='owner', context=(IBaseSiteItem, IPyAMSLayer, IDashboardTable), provides=IColumn)
class SiteContainerTreeOwnerColumn(SharedToolDashboardOwnerColumn):
"""Site container tree owner column"""
@@ -496,7 +493,7 @@
return result
-@adapter_config(name='trash', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
+@adapter_config(name='trash', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn)
class SiteContainerTreeTrashColumn(TrashColumn):
"""Site container tree trash column"""
@@ -516,7 +513,7 @@
return delete_container_element(request, ignore_permission=True)
-@adapter_config(context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IValues)
+@adapter_config(context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IValues)
class SiteContainerTreeValuesAdapter(ContextRequestViewAdapter):
"""Site container tree values adapter"""
@@ -540,7 +537,7 @@
return values
-@pagelet_config(name='site-tree.html', context=ISiteContainer, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@pagelet_config(name='site-tree.html', context=IBaseSiteItem, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@implementer(IInnerPage)
class SiteContainerTreeView(AdminView, ContainerView):
"""Site Container tree view"""
@@ -552,14 +549,14 @@
self.table = SiteContainerTreeTable(context, request, can_sort=ISiteManager.providedBy(context))
-@adapter_config(context=(ISiteContainer, IAdminLayer, ISiteTreeTable), provides=IPageHeader)
+@adapter_config(context=(IBaseSiteItem, IAdminLayer, ISiteTreeTable), provides=IPageHeader)
class SiteContainerViewHeaderAdapter(DefaultPageHeaderAdapter):
"""Site container tree view header adapter"""
icon_class = 'fa fa-fw fa-sitemap'
-@view_config(name='get-tree.json', context=ISiteContainer, request_type=IPyAMSLayer,
+@view_config(name='get-tree.json', context=IBaseSiteItem, request_type=IPyAMSLayer,
permission=VIEW_SYSTEM_PERMISSION, renderer='json', xhr=True)
def get_tree(request):
"""Get whole tree"""
@@ -596,7 +593,7 @@
return result
-@adapter_config(context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=ITableElementName)
+@adapter_config(context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=ITableElementName)
class SiteContainerTableElementName(ContextRequestViewAdapter):
"""Site container tree table element name"""
@@ -605,7 +602,7 @@
return II18n(self.context).query_attribute('title', request=self.request)
-@adapter_config(context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=ITableElementEditor)
+@adapter_config(context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=ITableElementEditor)
class SiteContainerTableElementEditor(DefaultElementEditorAdapter):
"""Site container tree table element editor"""