src/pyams_content/shared/common/zmi/dashboard.py
changeset 1394 ed31bfceddda
parent 1330 cad3e22cc2bd
--- a/src/pyams_content/shared/common/zmi/dashboard.py	Wed Jul 01 14:10:50 2020 +0200
+++ b/src/pyams_content/shared/common/zmi/dashboard.py	Wed Jul 01 18:05:38 2020 +0200
@@ -10,27 +10,25 @@
 # FOR A PARTICULAR PURPOSE.
 #
 
-__docformat__ = 'restructuredtext'
-
 from hypatia.catalog import CatalogQuery
 from hypatia.interfaces import ICatalog
-from hypatia.query import And, Or, Eq, Any
+from hypatia.query import And, Any, Eq, Or
 from z3c.table.column import GetAttrColumn
-from z3c.table.interfaces import IValues, IColumn
+from z3c.table.interfaces import IColumn, IValues
 from zope.dublincore.interfaces import IZopeDublinCore
-from zope.interface import implementer, Interface
+from zope.interface import Interface, implementer
 from zope.intid.interfaces import IIntIds
 
 from pyams_catalog.query import CatalogResultSet
 from pyams_content.interfaces import MANAGE_SITE_ROOT_PERMISSION, PUBLISH_CONTENT_PERMISSION
 from pyams_content.profile.interfaces import IAdminProfile
 from pyams_content.shared.common import CONTENT_TYPES
-from pyams_content.shared.common.interfaces import IBaseSharedTool, IWfSharedContent, IManagerRestrictions
-from pyams_content.shared.common.interfaces.types import IWfTypedSharedContent
-from pyams_content.shared.common.interfaces.zmi import IDashboardTable, ISharedToolDashboardTable, \
-    IDashboardSearchHeader
+from pyams_content.shared.common.interfaces import IBaseSharedTool, IManagerRestrictions, \
+    ISharedTool, IWfSharedContent
+from pyams_content.shared.common.interfaces.zmi import IDashboardSearchHeader, IDashboardTable, \
+    IDashboardTypeColumnValue, ISharedToolDashboardTable
 from pyams_content.zmi import pyams_content
-from pyams_content.zmi.interfaces import IDashboardMenu, IMyDashboardMenu, IAllContentsMenu
+from pyams_content.zmi.interfaces import IAllContentsMenu, IDashboardMenu, IMyDashboardMenu
 from pyams_i18n.interfaces import II18n
 from pyams_pagelet.pagelet import pagelet_config
 from pyams_security.interfaces import ISecurityManager
@@ -40,11 +38,11 @@
 from pyams_skin.interfaces.container import ITableElementName
 from pyams_skin.layer import IPyAMSLayer
 from pyams_skin.page import DefaultPageHeaderAdapter
-from pyams_skin.table import BaseTable, I18nColumn, NameColumn, JsActionColumn
+from pyams_skin.table import BaseTable, I18nColumn, JsActionColumn, NameColumn
 from pyams_skin.viewlet.menu import MenuItem
 from pyams_template.template import template_config
-from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
-from pyams_utils.date import format_datetime, SH_DATETIME_FORMAT
+from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
+from pyams_utils.date import SH_DATETIME_FORMAT, format_datetime
 from pyams_utils.fanstatic import get_resource_path
 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
 from pyams_utils.list import unique_iter
@@ -54,11 +52,15 @@
 from pyams_utils.traversing import get_parent
 from pyams_viewlet.manager import viewletmanager_config
 from pyams_viewlet.viewlet import viewlet_config
-from pyams_workflow.interfaces import IWorkflowState, IWorkflow, IWorkflowVersions, IWorkflowPublicationInfo
+from pyams_workflow.interfaces import IWorkflow, IWorkflowPublicationInfo, IWorkflowState, \
+    IWorkflowVersions
 from pyams_zmi.interfaces.menu import IContentManagementMenu
 from pyams_zmi.layer import IAdminLayer
 from pyams_zmi.view import InnerAdminView
 
+
+__docformat__ = 'restructuredtext'
+
 from pyams_content import _
 
 
@@ -102,17 +104,21 @@
 class SharedToolDashboardTypeColumn(I18nColumn, GetAttrColumn):
     """Shared tool dashboard type column"""
 
-    _header = _("Type")
+    _header = _("Content type")
     weight = 9
 
     def getValue(self, obj):
-        content = IWfTypedSharedContent(obj, None)
-        if content is not None:
-            data_type = content.get_data_type()
-            if data_type is not None:
-                return II18n(data_type).query_attribute('navigation_label', request=self.request) or \
-                       II18n(data_type).query_attribute('label', request=self.request)
-        return '--'
+        value = self.request.registry.queryMultiAdapter((obj, self.request, self.table),
+                                                        IDashboardTypeColumnValue)
+        return value or '--'
+
+
+@adapter_config(name='type', context=(ISharedTool, IPyAMSLayer, ISharedToolDashboardTable),
+                provides=IColumn)
+class SharedContentDashboardTypeColumn(SharedToolDashboardTypeColumn):
+    """Shared tool dashboard type column"""
+
+    _header = _("Type")
 
 
 @adapter_config(name='name', context=(Interface, IPyAMSLayer, IDashboardTable), provides=IColumn)
@@ -122,7 +128,8 @@
     _header = _("Title")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, IDashboardTable), provides=ITableElementName)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, IDashboardTable),
+                provides=ITableElementName)
 class SharedToolDashboardNameAdapter(ContextRequestViewAdapter):
     """Shared tool dashboard name adapter"""
 
@@ -131,7 +138,8 @@
         return II18n(self.context).query_attribute('title', request=self.request)
 
 
-@adapter_config(context=(IWfSharedContent, IPyAMSLayer, IDashboardTable), provides=ITableElementName)
+@adapter_config(context=(IWfSharedContent, IPyAMSLayer, IDashboardTable),
+                provides=ITableElementName)
 class SharedToolDashboardContentNameAdapter(ContextRequestViewAdapter):
     """Shared tool dashboard content name adapter"""
 
@@ -140,7 +148,8 @@
         return II18n(self.context).query_attribute('title', request=self.request)
 
 
-@adapter_config(name='sequence', context=(Interface, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='sequence', context=(Interface, IPyAMSLayer, IDashboardTable),
+                provides=IColumn)
 class SharedToolDashboardSequenceColumn(I18nColumn, GetAttrColumn):
     """Shared tool dashboard sequence ID column"""
 
@@ -160,7 +169,8 @@
             return '--'
 
 
-@adapter_config(name='status', context=(Interface, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='status', context=(Interface, IPyAMSLayer, IDashboardTable),
+                provides=IColumn)
 class SharedToolDashboardStatusColumn(I18nColumn, GetAttrColumn):
     """Shared tool dashboard status column"""
 
@@ -187,7 +197,8 @@
             return '--'
 
 
-@adapter_config(name='status_date', context=(Interface, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='status_date', context=(Interface, IPyAMSLayer, IDashboardTable),
+                provides=IColumn)
 class SharedToolDashboardStatusDateColumn(I18nColumn, GetAttrColumn):
     """Shared tool dashboard status date column"""
 
@@ -204,7 +215,8 @@
             return '--'
 
 
-@adapter_config(name='version', context=(Interface, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='version', context=(Interface, IPyAMSLayer, IDashboardTable),
+                provides=IColumn)
 class SharedToolDashboardVersionColumn(I18nColumn, GetAttrColumn):
     """Shared tool dashboard version column"""
 
@@ -219,7 +231,8 @@
             return '--'
 
 
-@adapter_config(name='status_principal', context=(Interface, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='status_principal', context=(Interface, IPyAMSLayer, IDashboardTable),
+                provides=IColumn)
 class SharedToolDashboardStatusPrincipalColumn(I18nColumn, GetAttrColumn):
     """Shared tool dashboard status principal column"""
 
@@ -237,7 +250,8 @@
             return '--'
 
 
-@adapter_config(name='owner', context=(Interface, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='owner', context=(Interface, IPyAMSLayer, IDashboardTable),
+                provides=IColumn)
 class SharedToolDashboardOwnerColumn(I18nColumn, GetAttrColumn):
     """Shared tool dashboard owner column"""
 
@@ -259,7 +273,8 @@
                 return '--'
 
 
-@adapter_config(name='modified', context=(Interface, IPyAMSLayer, IDashboardTable), provides=IColumn)
+@adapter_config(name='modified', context=(Interface, IPyAMSLayer, IDashboardTable),
+                provides=IColumn)
 class SharedToolDashboardModifiedColumn(I18nColumn, GetAttrColumn):
     """Shared tool dashboard modified column"""
 
@@ -291,7 +306,8 @@
     url = '#dashboard.html'
 
 
-@pagelet_config(name='dashboard.html', context=IBaseSharedTool, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@pagelet_config(name='dashboard.html', context=IBaseSharedTool, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
 @template_config(template='templates/dashboard.pt', layer=IAdminLayer)
 class SharedToolDashboardView(InnerAdminView):
     """Shared tool dashboard view"""
@@ -314,17 +330,20 @@
     @property
     def header_title(self):
         registry = self.request.registry
-        adapter = registry.queryMultiAdapter((self.context, self.request, self), IDashboardSearchHeader)
+        adapter = registry.queryMultiAdapter((self.context, self.request, self),
+                                             IDashboardSearchHeader)
         if adapter is not None:
             return adapter.title
         else:
             translate = self.request.localizer.translate
-            return translate(_("SEARCH - Between all contents of type « {type} »")).format(
+            return translate(_("SEARCH - Between all contents of type "
+                               "« {type} »")).format(
                 type=II18n(self.context).query_attribute('title', request=self.request)
             )
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolDashboardView), provides=IPageHeader)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolDashboardView),
+                provides=IPageHeader)
 class SharedToolDashboardHeaderAdapter(DefaultPageHeaderAdapter):
     """Shared tool properties header adapter"""
 
@@ -346,7 +365,8 @@
     _plural_title = _("MANAGER - {0} contents waiting for your action")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolDashboardManagerWaitingTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolDashboardManagerWaitingTable),
+                provides=IValues)
 class SharedToolDashboardManagerWaitingValues(ContextRequestViewAdapter):
     """Shared tool dashboard waiting values adapter"""
 
@@ -359,8 +379,9 @@
                  Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                  Any(catalog['workflow_state'], workflow.waiting_states)
         yield from filter(self.check_access,
-                          unique_iter(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
-                                                           key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
+                          unique_iter(map(lambda x: sorted(
+                              IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
+                              key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
                                           CatalogResultSet(CatalogQuery(catalog).query(params,
                                                                                        sort_index='modified_date')))))
 
@@ -390,7 +411,8 @@
     dt_sort_order = 'asc'
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolDashboardOwnerWaitingTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolDashboardOwnerWaitingTable),
+                provides=IValues)
 class SharedToolDashboardOwnerWaitingValues(ContextRequestViewAdapter):
     """Shared tool dashboard waiting owned contents values adapter"""
 
@@ -403,10 +425,11 @@
                  Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                  Any(catalog['workflow_state'], workflow.waiting_states) & \
                  Eq(catalog['workflow_principal'], self.request.principal.id)
-        yield from unique_iter(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
-                                                    key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
-                                   CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                                sort_index='modified_date'))))
+        yield from unique_iter(
+            map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
+                                 key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
+                CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                             sort_index='modified_date'))))
 
 
 #
@@ -427,7 +450,8 @@
             return _("CONTRIBUTOR - Last {0} modified contents")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolDashboardOwnerModifiedTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolDashboardOwnerModifiedTable),
+                provides=IValues)
 class SharedToolDashboardOwnerModifiedValues(ContextRequestViewAdapter):
     """Shared tool dashboard waiting owned contents values adapter"""
 
@@ -439,12 +463,13 @@
                      Any(catalog['content_type'], CONTENT_TYPES.keys()),
                      Or(Eq(catalog['role:owner'], self.request.principal.id),
                         Eq(catalog['role:contributor'], self.request.principal.id)))
-        yield from unique_iter(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
-                                                    key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
-                                   CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                                limit=50,
-                                                                                sort_index='modified_date',
-                                                                                reverse=True))))
+        yield from unique_iter(
+            map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
+                                 key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
+                CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                             limit=50,
+                                                             sort_index='modified_date',
+                                                             reverse=True))))
 
 
 #
@@ -540,14 +565,16 @@
                                                                                 reverse=True))))
 
 
-@pagelet_config(name='my-favorites.html', context=IBaseSharedTool, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@pagelet_config(name='my-favorites.html', context=IBaseSharedTool, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
 class SharedToolFavoritesView(InnerAdminView, ContainerView):
     """Shared tool favorites view"""
 
     table_class = SharedToolFavoritesTable
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolFavoritesView), provides=IPageHeader)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolFavoritesView),
+                provides=IPageHeader)
 class SharedToolFavoritesHeaderAdapter(DefaultPageHeaderAdapter):
     """Shared tool favorites header adapter"""
 
@@ -584,7 +611,8 @@
     _plural_title = _("CONTRIBUTOR - {0} contents in preparation")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolPreparationsTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolPreparationsTable),
+                provides=IValues)
 class SharedToolPreparationsValues(ContextRequestViewAdapter):
     """Shared tool preparations values adapter"""
 
@@ -611,7 +639,8 @@
     table_class = SharedToolPreparationsTable
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolPreparationsView), provides=IPageHeader)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolPreparationsView),
+                provides=IPageHeader)
 class SharedToolPreparationsHeaderAdapter(DefaultPageHeaderAdapter):
     """Shared tool preparations header adapter"""
 
@@ -648,7 +677,8 @@
     _plural_title = _("CONTRIBUTOR - {0} submitted contents")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolSubmissionsTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolSubmissionsTable),
+                provides=IValues)
 class SharedToolSubmissionsValues(ContextRequestViewAdapter):
     """Shared tool submissions values adapter"""
 
@@ -675,7 +705,8 @@
     table_class = SharedToolSubmissionsTable
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolSubmissionsView), provides=IPageHeader)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolSubmissionsView),
+                provides=IPageHeader)
 class SharedToolSubmissionsHeaderAdapter(DefaultPageHeaderAdapter):
     """Shared tool submissions header adapter"""
 
@@ -712,7 +743,8 @@
     _plural_title = _("CONTRIBUTOR - {0} published contents")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolPublicationsTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolPublicationsTable),
+                provides=IValues)
 class SharedToolPublicationsValues(ContextRequestViewAdapter):
     """Shared tool publications values adapter"""
 
@@ -739,7 +771,8 @@
     table_class = SharedToolPublicationsTable
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolPublicationsView), provides=IPageHeader)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolPublicationsView),
+                provides=IPageHeader)
 class SharedToolPublicationsHeaderAdapter(DefaultPageHeaderAdapter):
     """Shared tool publications header adapter"""
 
@@ -776,7 +809,8 @@
     _plural_title = _("CONTRIBUTOR - {0} retired contents")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolRetiredContentsTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolRetiredContentsTable),
+                provides=IValues)
 class SharedToolRetiredContentsValues(ContextRequestViewAdapter):
     """Shared tool retired contents values adapter"""
 
@@ -803,7 +837,8 @@
     table_class = SharedToolRetiredContentsTable
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolRetiredContentsView), provides=IPageHeader)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolRetiredContentsView),
+                provides=IPageHeader)
 class SharedToolRetiredContentsHeaderAdapter(DefaultPageHeaderAdapter):
     """Shared tool retired contents header adapter"""
 
@@ -840,7 +875,8 @@
     _plural_title = _("CONTRIBUTOR - {0} archived contents")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolArchivedContentsTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolArchivedContentsTable),
+                provides=IValues)
 class SharedToolArchivedContentsValues(ContextRequestViewAdapter):
     """Shared tool archived contents values adapter"""
 
@@ -873,7 +909,8 @@
     table_class = SharedToolArchivedContentsTable
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolArchivedContentsView), provides=IPageHeader)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolArchivedContentsView),
+                provides=IPageHeader)
 class SharedToolArchivedContentsHeaderAdapter(DefaultPageHeaderAdapter):
     """Shared tool archived contents header adapter"""
 
@@ -932,7 +969,8 @@
             return _("CONTRIBUTORS - Last published contents (in the limit of 50)")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAllPublicationsTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAllPublicationsTable),
+                provides=IValues)
 class SharedToolAllPublicationsValues(ContextRequestViewAdapter):
     """Shared tool published contents values adapter"""
 
@@ -958,7 +996,8 @@
     table_class = SharedToolAllPublicationsTable
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAllPublicationsView), provides=IPageHeader)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAllPublicationsView),
+                provides=IPageHeader)
 class SharedToolAllPublicationsHeaderAdapter(DefaultPageHeaderAdapter):
     """Shared tool published contents header adapter"""
 
@@ -1001,7 +1040,8 @@
             return _("CONTRIBUTORS - Last updated contents (in the limit of 50)")
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAllUpdatesTable), provides=IValues)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAllUpdatesTable),
+                provides=IValues)
 class SharedToolAllUpdatesValues(ContextRequestViewAdapter):
     """Shared tool updated contents values adapter"""
 
@@ -1025,7 +1065,8 @@
     table_class = SharedToolAllUpdatesTable
 
 
-@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAllUpdatesView), provides=IPageHeader)
+@adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAllUpdatesView),
+                provides=IPageHeader)
 class SharedToolAllUpdatesHeaderAdapter(DefaultPageHeaderAdapter):
     """Shared tool updated contents header adapter"""