merge default dev-dc
authorDamien Correia
Wed, 20 Jun 2018 12:21:20 +0200
branchdev-dc
changeset 718 35f7015089bc
parent 717 634e5e520bd0 (current diff)
parent 714 dd257ef7fcaa (diff)
child 719 79281dfc31f0
merge default
--- a/src/pyams_content/component/links/zmi/reverse.py	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/component/links/zmi/reverse.py	Wed Jun 20 12:21:20 2018 +0200
@@ -19,6 +19,8 @@
 from hypatia.interfaces import ICatalog
 from pyams_content.shared.common.interfaces import IWfSharedContent
 from pyams_content.shared.common.interfaces.zmi import ISiteRootDashboardTable
+from pyams_content.shared.site.interfaces import ISiteContainer
+from pyams_portal.interfaces import IPortalTemplate
 from pyams_sequence.interfaces import ISequentialIdInfo
 from pyams_skin.interfaces import IInnerPage
 from pyams_skin.layer import IPyAMSLayer
@@ -77,11 +79,23 @@
 
     @property
     def values(self):
+
+        def get_item(result):
+            parent = get_parent(result, IWfSharedContent)
+            if parent is not None:
+                return IWorkflowVersions(parent).get_last_versions(count=1)[0]
+            parent = get_parent(result, IPortalTemplate)
+            if parent is None:
+                parent = get_parent(result, ISiteContainer)
+            if parent is None:
+                parent = self.request.root
+            return parent
+
         catalog = get_utility(ICatalog)
         oid = ISequentialIdInfo(self.context).hex_oid
         params = Or(Eq(catalog['link_reference'], oid),
                     Eq(catalog['link_references'], oid))
-        return unique(map(lambda x: IWorkflowVersions(get_parent(x, IWfSharedContent)).get_last_versions(count=1)[0],
+        return unique(map(get_item,
                           CatalogResultSet(CatalogQuery(catalog).query(params,
                                                                        sort_index='modified_date'))))
 
--- a/src/pyams_content/component/paragraph/zmi/pictogram.py	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/pictogram.py	Wed Jun 20 12:21:20 2018 +0200
@@ -39,6 +39,7 @@
     BaseParagraphPropertiesEditForm, BaseParagraphAJAXEditForm
 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget
 from pyams_content.reference.pictograms.zmi.widget import PictogramSelectFieldWidget
+from pyams_file.zmi.image import render_image
 from pyams_form.form import AJAXAddForm, ajax_config
 from pyams_form.security import ProtectedFormObjectMixin
 from pyams_i18n.column import I18nAttrColumn
@@ -227,7 +228,7 @@
         if pictogram is not None:
             image = II18n(pictogram).query_attribute('image', request=self.request)
             if image:
-                return '<img src="{0}" />'.format(absolute_url(image, self.request, '++thumb++48x48'))
+                return render_image(image, 48, 48, self.request)
         return '--'
 
 
--- a/src/pyams_content/reference/pictograms/zmi/__init__.py	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/reference/pictograms/zmi/__init__.py	Wed Jun 20 12:21:20 2018 +0200
@@ -14,9 +14,6 @@
 
 
 # import standard library
-import sys
-
-from random import randint
 from uuid import uuid4
 
 # import interfaces
@@ -32,6 +29,7 @@
 
 # import packages
 from pyams_content.reference.pictograms import Pictogram
+from pyams_file.zmi.image import render_image
 from pyams_form.form import AJAXAddForm, ajax_config
 from pyams_i18n.column import I18nAttrColumn
 from pyams_pagelet.pagelet import pagelet_config
@@ -40,7 +38,6 @@
 from pyams_skin.viewlet.toolbar import ToolbarAction
 from pyams_utils.adapter import adapter_config
 from pyams_utils.traversing import get_parent
-from pyams_utils.url import absolute_url
 from pyams_viewlet.viewlet import viewlet_config
 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
 from pyramid.httpexceptions import HTTPNotFound
@@ -142,8 +139,8 @@
     def getValue(self, obj):
         image = II18n(obj).query_attribute('image', request=self.request)
         if image:
-            timestamp = randint(0, sys.maxsize)
-            return '<img src="{0}?_={1}" />'.format(absolute_url(image, self.request, '++thumb++32x32'), timestamp)
+            return render_image(image, 32, 32, timestamp=True)
+        return '--'
 
 
 @adapter_config(name='name', context=(IPictogramTable, IAdminLayer, PictogramTableContentsTable), provides=IColumn)
--- a/src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt	Wed Jun 20 12:21:20 2018 +0200
@@ -22,9 +22,9 @@
 					</a>
 				</div>
 				<div class="width-50 text-center pull-left margin-right-10">
-					<img tal:define="img i18n:pictogram.image"
-						 tal:condition="img"
-						 tal:attributes="src extension:absolute_url(img, '++thumb++48x48')" />
+					<tal:var define="img i18n:pictogram.image"
+							 condition="img"
+							 content="structure extension:thumbnail(img, 48, 48)" />
 				</div>
 				<span tal:content="i18n:pictogram.title">Title</span>
 			</div>
@@ -49,9 +49,9 @@
 					</a>
 				</div>
 				<div class="width-50 text-center pull-left margin-right-10">
-					<img tal:define="img i18n:pictogram.image"
-						 tal:condition="img"
-						 tal:attributes="src extension:absolute_url(img, '++thumb++48x48')" />
+					<tal:var define="img i18n:pictogram.image"
+							 condition="img"
+							 content="structure extension:thumbnail(img, 48, 48)" />
 				</div>
 				<span tal:content="i18n:pictogram.title">Title</span>
 			</div>
--- a/src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt	Wed Jun 20 12:21:20 2018 +0200
@@ -1,8 +1,8 @@
-<div i18n:domain="pyams_content">
-	<img class="padding-5"
-		 tal:define="image i18n:context.image"
-		 tal:attributes="src extension:absolute_url(image, '++thumb++32x32')" />
-	<span tal:define="header i18n:context.header"
+<div class="padding-5" i18n:domain="pyams_content">
+	<tal:var define="image i18n:context.image"
+			 condition="image"
+			 content="structure extension:thumbnail(image, 32, 32)" />
+	<span class="padding-left-5" tal:define="header i18n:context.header"
 		  i18n:translate="">Default header:
 		<strong i18n:name="header" tal:content="header or '--'" />
 	</span>
--- a/src/pyams_content/root/__init__.py	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/root/__init__.py	Wed Jun 20 12:21:20 2018 +0200
@@ -47,6 +47,8 @@
 from pyramid.events import subscriber
 from zope.interface import implementer
 
+from pyams_content import _
+
 
 @implementer(IDefaultProtectionPolicy, ISiteRoot, ISiteRootRoles, IPortalContext,
              IIllustrationTarget, IHeaderTarget, IFooterTarget, IAlertTarget, IPreviewTarget)
@@ -62,6 +64,8 @@
     operators = RolePrincipalsFieldProperty(ISiteRootRoles['operators'])
     templates_managers = RolePrincipalsFieldProperty(ISiteRootRoles['templates_managers'])
 
+    content_name = _("Site root")
+
 
 @utility_config(provides=ISiteRootFactory)
 class SiteRootFactory(object):
--- a/src/pyams_content/root/zmi/__init__.py	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/root/zmi/__init__.py	Wed Jun 20 12:21:20 2018 +0200
@@ -25,7 +25,8 @@
 from pyams_content.skin.zmi.interfaces import IDashboardMenu, IMyDashboardMenu, IAllContentsMenu
 from pyams_i18n.interfaces import II18n
 from pyams_skin.interfaces import IInnerPage, IPageHeader
-from pyams_skin.interfaces.configuration import IBackOfficeConfiguration
+from pyams_skin.interfaces.configuration import IBackOfficeConfiguration, IConfiguration
+from pyams_skin.interfaces.container import ITableElementName, ITableElementEditor
 from pyams_skin.interfaces.viewlet import IBreadcrumbItem
 from pyams_skin.layer import IPyAMSLayer
 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
@@ -45,11 +46,11 @@
 from pyams_pagelet.pagelet import pagelet_config
 from pyams_skin.container import ContainerView
 from pyams_skin.page import DefaultPageHeaderAdapter
-from pyams_skin.table import I18nColumn
+from pyams_skin.table import I18nColumn, DefaultElementEditorAdapter
 from pyams_skin.viewlet.breadcrumb import BreadcrumbItem
 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.adapter import adapter_config, ContextRequestViewAdapter, ContextRequestAdapter
 from pyams_utils.list import unique
 from pyams_utils.registry import get_utility, get_all_utilities_registered_for
 from pyams_viewlet.manager import viewletmanager_config
@@ -77,6 +78,24 @@
     label = _("Home")
 
 
+@adapter_config(context=(ISiteRoot, IPyAMSLayer), provides=ITableElementName)
+class SiteRootTableElementNameAdapter(ContextRequestAdapter):
+    """Site root table element name adapter"""
+
+    @property
+    def name(self):
+        configuration = IConfiguration(self.context)
+        return II18n(configuration).query_attribute('short_title', request=self.request)
+
+
+@adapter_config(context=(ISiteRoot, IAdminLayer, Interface), provides=ITableElementEditor)
+class SiteRootTableElementEditorAdapter(DefaultElementEditorAdapter):
+    """Site root table element editor adapter"""
+
+    view_name = 'admin#site-tree.html'
+    modal_target = False
+
+
 #
 # Main dashboard menu
 #
@@ -800,4 +819,7 @@
     weight = 1
 
     def getValue(self, obj):
-        return self.request.localizer.translate(obj.content_name)
+        try:
+            return self.request.localizer.translate(obj.content_name)
+        except AttributeError:
+            return '--'
--- a/src/pyams_content/root/zmi/templates/dashboard.pt	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/root/zmi/templates/dashboard.pt	Wed Jun 20 12:21:20 2018 +0200
@@ -25,7 +25,9 @@
 							<label class="input">
 								<button type="submit" class="icon-append fa fa-fw fa-search no-border no-padding"
 										data-ams-form-hide-loading="true"></button>
-								<input type="text" name="query" placeholder="Quick search..." i18n:attributes="placeholder" />
+								<input type="text" name="query"
+									   placeholder="Quick search..." i18n:attributes="placeholder"
+									   data-ams-events-handlers='{"keyup": "MyAMS.helpers.clearSearchTarget"}' />
 							</label>
 						</div>
 						<div class="col-md-6">
@@ -36,7 +38,8 @@
 				</form>
 			</div>
 		</div>
-		<div id="search_results" tal:define="global dashboard_length 0">
+		<div id="search_results"></div>
+		<tal:var define="global dashboard_length 0">
 			<tal:loop repeat="table view.tables">
 				<tal:if condition="table.values">
 					<tal:var content="structure table.render()" />
@@ -46,6 +49,6 @@
 			<div tal:condition="not:dashboard_length" class="alert alert-info" i18n:translate="">
 				You are not actually concerned by any content.
 			</div>
-		</div>
+		</tal:var>
 	</div>
 </div>
--- a/src/pyams_content/shared/common/zmi/templates/dashboard.pt	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/templates/dashboard.pt	Wed Jun 20 12:21:20 2018 +0200
@@ -25,7 +25,9 @@
 							<label class="input">
 								<button type="submit" class="icon-append fa fa-fw fa-search no-border no-padding"
 										data-ams-form-hide-loading="true"></button>
-								<input type="text" name="query" placeholder="Quick search..." i18n:attributes="placeholder" />
+								<input type="text" name="query"
+									   placeholder="Quick search..." i18n:attributes="placeholder"
+									   data-ams-events-handlers='{"keyup": "MyAMS.helpers.clearSearchTarget"}' />
 							</label>
 						</div>
 						<div class="col-md-6">
@@ -36,7 +38,8 @@
 				</form>
 			</div>
 		</div>
-		<div id="search_results" tal:define="global dashboard_length 0">
+		<div id="search_results"></div>
+		<tal:var define="global dashboard_length 0">
 			<tal:loop repeat="table view.tables">
 				<tal:if condition="table.values">
 					<tal:var content="structure table.render()" />
@@ -46,6 +49,6 @@
 			<div tal:condition="not:dashboard_length" class="alert alert-info" i18n:translate="">
 				You are not actually concerned by any content.
 			</div>
-		</div>
+		</tal:var>
 	</div>
 </div>
--- a/src/pyams_content/shared/site/folder.py	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/shared/site/folder.py	Wed Jun 20 12:21:20 2018 +0200
@@ -42,6 +42,8 @@
 
 from pyams_content import _
 
+from pyams_content import _
+
 
 @implementer(IDefaultProtectionPolicy, ISiteFolder, ISiteFolderRoles,
              IIllustrationTarget, ILinkIllustrationTarget, IPortalContext, IPreviewTarget)
--- a/src/pyams_content/shared/site/manager.py	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/shared/site/manager.py	Wed Jun 20 12:21:20 2018 +0200
@@ -50,6 +50,8 @@
 from zope.schema.fieldproperty import FieldProperty
 from zope.schema.vocabulary import SimpleTerm, SimpleVocabulary
 
+from pyams_content import _
+
 
 @implementer(ISiteManager, IParagraphFactorySettings, IThemesManagerTarget, IPictogramManagerTarget,
              IIllustrationTarget, ILinkIllustrationTarget, IPortalContext, IHeaderTarget,
@@ -63,6 +65,8 @@
     sequence_name = ''  # use default sequence generator
     sequence_prefix = ''
 
+    content_name = _("Site manager")
+
     @property
     def folder_factory(self):
         return ISiteFolderFactory(self, SiteFolder)
--- a/src/pyams_content/shared/site/zmi/folder.py	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/shared/site/zmi/folder.py	Wed Jun 20 12:21:20 2018 +0200
@@ -20,6 +20,7 @@
 from pyams_content.shared.common.interfaces import IBaseSharedTool
 from pyams_content.shared.site.interfaces import ISiteContainer, ISiteManager, ISiteFolder
 from pyams_i18n.interfaces import INegotiator, II18n
+from pyams_skin.interfaces.container import ITableElementName, ITableElementEditor
 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, IMenuHeader
 from pyams_skin.layer import IPyAMSLayer
 from pyams_zmi.interfaces.menu import ISiteManagementMenu
@@ -33,6 +34,7 @@
 from pyams_form.form import AJAXAddForm, AJAXEditForm, ajax_config
 from pyams_i18n.schema import I18nTextLineField
 from pyams_pagelet.pagelet import pagelet_config
+from pyams_skin.table import DefaultElementEditorAdapter
 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
 from pyams_utils.adapter import adapter_config, ContextRequestAdapter
 from pyams_utils.registry import get_utility
@@ -164,6 +166,23 @@
 # Site folder edit form
 #
 
+@adapter_config(context=(ISiteFolder, IPyAMSLayer), provides=ITableElementName)
+class SiteFolderTableElementNameAdapter(ContextRequestAdapter):
+    """Site folder table element name adapter"""
+
+    @property
+    def name(self):
+        return II18n(self.context).query_attribute('short_name', request=self.request)
+
+
+@adapter_config(context=(ISiteFolder, IAdminLayer, Interface), provides=ITableElementEditor)
+class SiteFolderTableElementEditorAdapter(DefaultElementEditorAdapter):
+    """Site folder table element editor adapter"""
+
+    view_name = 'admin#site-tree.html'
+    modal_target = False
+
+
 @pagelet_config(name='properties.html', context=ISiteFolder, layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION)
 class SiteFolderPropertiesEditForm(SharedToolPropertiesEditForm):
     """Site folder properties edit form"""
--- a/src/pyams_content/shared/site/zmi/manager.py	Mon Jun 18 10:14:25 2018 +0200
+++ b/src/pyams_content/shared/site/zmi/manager.py	Wed Jun 20 12:21:20 2018 +0200
@@ -21,7 +21,7 @@
 from pyams_content.shared.site.interfaces import ISiteManager, ISiteManagerFactory
 from pyams_content.skin.zmi.interfaces import ISiteTreeTable, IUserAddingsMenuLabel
 from pyams_i18n.interfaces import II18n, INegotiator
-from pyams_skin.interfaces.container import ITableElementEditor
+from pyams_skin.interfaces.container import ITableElementEditor, ITableElementName
 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, IBreadcrumbItem, IMenuHeader
 from pyams_skin.layer import IPyAMSLayer
 from pyams_zmi.interfaces.menu import ISiteManagementMenu
@@ -45,7 +45,7 @@
 from pyramid.events import subscriber
 from pyramid.path import DottedNameResolver
 from z3c.form import field
-from zope.interface import Invalid
+from zope.interface import Invalid, Interface
 
 from pyams_content import _
 
@@ -68,6 +68,31 @@
     css_class = 'strong'
 
 
+@adapter_config(context=(ISiteManager, IPyAMSLayer), provides=ITableElementName)
+class SiteManagerTableElementNameAdapter(ContextRequestAdapter):
+    """Site manager table element name adapter"""
+
+    @property
+    def name(self):
+        return II18n(self.context).query_attribute('short_name', request=self.request)
+
+
+@adapter_config(context=(ISiteManager, IAdminLayer, Interface), provides=ITableElementEditor)
+class SiteManagerTableElementEditorAdapter(DefaultElementEditorAdapter):
+    """Site manager table element editor adapter"""
+
+    view_name = 'admin#site-tree.html'
+    modal_target = False
+
+
+@adapter_config(context=(ISiteManager, IAdminLayer, ISiteTreeTable), provides=ITableElementEditor)
+class SiteManagerTableElementEditor(DefaultElementEditorAdapter):
+    """Site tree table element editor"""
+
+    view_name = 'admin#site-tree.html'
+    modal_target = False
+
+
 @adapter_config(context=(ISiteManager, IAdminLayer), provides=IUserAddingsMenuLabel)
 class SiteManagerUserAddingsMenuLabelAdapter(ContextRequestAdapter):
     """Site manager user addings menu label adapter"""
@@ -137,11 +162,3 @@
     site = query_utility(ISiteManager, name=short_name)
     if site is not None:
         event.form.widgets.errors += (Invalid(_("A site manager is already registered with this name!!")),)
-
-
-@adapter_config(context=(ISiteManager, IAdminLayer, ISiteTreeTable), provides=ITableElementEditor)
-class SiteManagerTableElementEditor(DefaultElementEditorAdapter):
-    """Site tree table element editor"""
-
-    view_name = 'admin#site-tree.html'
-    modal_target = False