--- a/src/pyams_default_theme/component/keynumber/portlet/__init__.py Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/component/keynumber/portlet/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -32,7 +32,7 @@
from pyams_default_theme import _
-class KeyNumberPortletDefaultRenderer(PortletRenderer):
+class KeyNumberPortletBaseRenderer(PortletRenderer):
"""Key numbers portlet default renderer"""
def get_link_info(cls, link):
@@ -49,7 +49,7 @@
@adapter_config(context=(IPortalContext, IPyAMSLayer, Interface, IKeyNumberPortletSettings),
provides=IPortletRenderer)
@template_config(template='templates/horizontal-render.pt', layer=IPyAMSLayer)
-class KeyNumberPortletHorizontalRenderer(KeyNumberPortletDefaultRenderer):
+class KeyNumberPortletHorizontalRenderer(KeyNumberPortletBaseRenderer):
"""Key numbers portlet horizontal renderer"""
label = _("Horizontal list with carousel")
@@ -58,7 +58,7 @@
@adapter_config(name='vertical', context=(IPortalContext, IPyAMSLayer, Interface, IKeyNumberPortletSettings),
provides=IPortletRenderer)
@template_config(template='templates/vertical-render.pt', layer=IPyAMSLayer)
-class KeyNumberPortletVerticalRenderer(KeyNumberPortletDefaultRenderer):
+class KeyNumberPortletVerticalRenderer(KeyNumberPortletBaseRenderer):
"""Key numbers portlet vertical renderer"""
label = _("Vertical list")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/paragraph/interfaces/map.py Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+from pyams_content.component.paragraph.interfaces.map import have_gis
+if have_gis:
+
+ # import standard library
+
+ # import interfaces
+ from pyams_gis.interfaces.configuration import IMapConfiguration
+
+ # import packages
+ from zope.interface import Attribute
+ from zope.schema import Bool
+
+ from pyams_default_theme import _
+
+
+ class IMapParagraphDefaultRendererSettings(IMapConfiguration):
+ """Map paragraph default renderer settings interface"""
+
+ no_use_default_map_configuration = Bool(title=_("Don't use default configuration?"),
+ required=True,
+ default=False)
+
+ use_default_map_configuration = Bool(title=_("Use default configuration?"),
+ required=True,
+ default=True)
+
+ configuration = Attribute("Map configuration")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/paragraph/map.py Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,99 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+from pyams_content.component.paragraph.interfaces.map import have_gis, IMapParagraph
+if have_gis:
+
+ # import standard library
+
+ # import interfaces
+ from pyams_content.features.renderer.interfaces import IContentRenderer
+ from pyams_default_theme.component.paragraph.interfaces.map import IMapParagraphDefaultRendererSettings
+ from pyams_gis.interfaces.configuration import IMapConfiguration
+ from pyams_gis.interfaces.utility import IMapManager
+ from pyams_skin.layer import IPyAMSLayer
+
+ # import packages
+ from pyams_content.features.renderer.skin import BaseContentRenderer
+ from pyams_gis.configuration import MapConfiguration
+ from pyams_template.template import template_config
+ from pyams_utils.adapter import adapter_config, get_annotation_adapter
+ from pyams_utils.registry import get_utility
+ from zope.interface import implementer
+ from zope.schema.fieldproperty import FieldProperty
+
+ from pyams_default_theme import _
+
+
+ #
+ # Map paragraph default renderer settings
+ #
+
+ MAP_DEFAULT_RENDERER_SETTINGS_KEY = 'pyams_content.map.renderer:default'
+
+
+ @implementer(IMapParagraphDefaultRendererSettings)
+ class MapParagraphDefaultRendererSettings(MapConfiguration):
+ """Map paragraph default renderer settings"""
+
+ _use_default_map_configuration = FieldProperty(IMapParagraphDefaultRendererSettings[
+ 'use_default_map_configuration'])
+
+ @property
+ def use_default_map_configuration(self):
+ return self._use_default_map_configuration
+
+ @use_default_map_configuration.setter
+ def use_default_map_configuration(self, value):
+ self._use_default_map_configuration = value
+
+ @property
+ def no_use_default_map_configuration(self):
+ return not bool(self.use_default_map_configuration)
+
+ @no_use_default_map_configuration.setter
+ def no_use_default_map_configuration(self, value):
+ self.use_default_map_configuration = not bool(value)
+
+ @property
+ def configuration(self):
+ if self.use_default_map_configuration:
+ manager = get_utility(IMapManager)
+ return IMapConfiguration(manager)
+ else:
+ return self
+
+
+ @adapter_config(context=IMapParagraph, provides=IMapParagraphDefaultRendererSettings)
+ def map_paragraph_default_renderer_settings_factory(context):
+ """Map paragraph default renderer settings factory"""
+ return get_annotation_adapter(context, MAP_DEFAULT_RENDERER_SETTINGS_KEY,
+ MapParagraphDefaultRendererSettings)
+
+
+ #
+ # Map paragraph default renderer
+ #
+
+ @adapter_config(name='default', context=(IMapParagraph, IPyAMSLayer), provides=IContentRenderer)
+ @template_config(template='templates/map-default.pt', layer=IPyAMSLayer)
+ class MapParagraphDefaultRenderer(BaseContentRenderer):
+ """Map paragraph default renderer"""
+
+ label = _("Default map renderer")
+
+ settings_interface = IMapParagraphDefaultRendererSettings
+
+ i18n_context_attrs = ('title', )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/paragraph/zmi/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/paragraph/zmi/map.py Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,67 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+from pyams_content.component.paragraph.interfaces.map import have_gis
+if have_gis:
+
+ # import standard library
+
+ # import interfaces
+ from pyams_default_theme.component.paragraph.interfaces.map import IMapParagraphDefaultRendererSettings
+ from pyams_form.interfaces.form import IFormManager
+ from pyams_skin.layer import IPyAMSLayer
+
+ # import packages
+ from pyams_content.features.renderer.zmi import RendererPropertiesEditForm
+ from pyams_form.group import NamedWidgetsGroup
+ from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
+ from pyams_zmi.form import AdminDialogEditForm
+ from z3c.form import field
+ from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget
+
+ from pyams_default_theme import _
+
+
+ @adapter_config(context=(IMapParagraphDefaultRendererSettings, IPyAMSLayer, RendererPropertiesEditForm),
+ provides=IFormManager)
+ class MapParagraphDefaultRendererSettingsFormManager(ContextRequestViewAdapter):
+ """Map paragraph default renderer settings form manager"""
+
+ def getFields(self):
+ fields = field.Fields(IMapParagraphDefaultRendererSettings).omit('use_default_map_configuration')
+ fields['no_use_default_map_configuration'].widgetFactory = SingleCheckBoxFieldWidget
+ return fields
+
+ def update(self):
+ view = self.view
+ view.dialog_class = 'modal-large'
+ AdminDialogEditForm.update(view)
+
+ def updateWidgets(self, prefix=None):
+ AdminDialogEditForm.updateWidgets(self.view, prefix)
+
+ def updateActions(self):
+ AdminDialogEditForm.updateActions(self.view)
+
+ def updateGroups(self):
+ view = self.view
+ view.add_group(NamedWidgetsGroup(view, 'configuration', view.widgets,
+ view.fields.keys(),
+ legend=_("Don't use default map configuration"),
+ css_class='inner',
+ switch=True,
+ checkbox_switch=True,
+ checkbox_field=IMapParagraphDefaultRendererSettings['no_use_default_map_configuration']))
+ AdminDialogEditForm.updateGroups(view)
--- a/src/pyams_default_theme/features/footer/__init__.py Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/footer/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -16,12 +16,22 @@
# import standard library
# import interfaces
+from pyams_content.component.association.interfaces import ASSOCIATION_CONTAINER_KEY
from pyams_content.features.footer.interfaces import IFooterTarget, IFooterSettings
+from pyams_content.features.menu.interfaces import IMenuLinksContainerTarget, IMenuLinksContainer
+from pyams_default_theme.features.footer.interfaces import ISimpleFooterRendererSettings, ISimpleFooterLinksMenu
from pyams_default_theme.layer import IPyAMSDefaultLayer
+from zope.location.interfaces import ISublocations
# import packages
+from persistent import Persistent
+from pyams_content.features.menu import Menu
+from pyams_utils.adapter import get_annotation_adapter, adapter_config, ContextAdapter
from pyams_utils.traversing import get_parent
from pyams_viewlet.viewlet import contentprovider_config, ViewContentProvider
+from zope.interface import implementer
+from zope.location import Location
+from zope.schema.fieldproperty import FieldProperty
@contentprovider_config(name='pyams.footer', layer=IPyAMSDefaultLayer)
@@ -29,11 +39,16 @@
"""Footer content provider"""
footer = None
+ renderer = None
def update(self):
parent = get_parent(self.context, IFooterTarget)
if parent is not None:
- self.footer = IFooterSettings(parent, None)
+ footer = self.footer = IFooterSettings(parent, None)
+ if footer is not None:
+ renderer = self.renderer = footer.get_renderer(self.request)
+ if renderer is not None:
+ renderer.update()
def render(self):
if self.footer is None:
@@ -42,3 +57,36 @@
if renderer is None:
return ''
return renderer.render()
+
+
+#
+# Simple footer renderer settings
+#
+
+SIMPLE_FOOTER_LINKS_KEY = '{0}::links'.format(ASSOCIATION_CONTAINER_KEY)
+
+
+@implementer(ISimpleFooterRendererSettings, IMenuLinksContainerTarget)
+class SimpleFooterRendererSettings(Persistent, Location):
+ """Simple footer renderer settings"""
+
+ copyright = FieldProperty(ISimpleFooterRendererSettings['copyright'])
+
+ @property
+ def links(self):
+ return get_annotation_adapter(self, SIMPLE_FOOTER_LINKS_KEY, Menu,
+ markers=ISimpleFooterLinksMenu, name='++ass++links')
+
+
+@adapter_config(name='links', context=ISimpleFooterRendererSettings, provides=IMenuLinksContainer)
+def simple_footer_links_adapter(context):
+ """Simple footer links adapter"""
+ return context.links
+
+
+@adapter_config(name='links', context=ISimpleFooterRendererSettings, provides=ISublocations)
+class SimpleFooterRendererSettingsSublocations(ContextAdapter):
+ """Simple footer renderer settings sub-locations adapter"""
+
+ def sublocations(self):
+ return self.context.links.values()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/features/footer/interfaces.py Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.features.footer.interfaces import IFooterRendererSettings
+
+# import packages
+from zope.interface import Interface, Attribute
+from zope.schema import TextLine
+
+from pyams_default_theme import _
+
+
+class ISimpleFooterRendererSettings(IFooterRendererSettings):
+ """Simple footer renderer settings"""
+
+ copyright = TextLine(title=_("Copyright"),
+ description=_("Copyright mention displayed in page footer"),
+ required=False)
+
+ links = Attribute("Footer links")
+
+
+class ISimpleFooterLinksMenu(Interface):
+ """Simple footer links marker interface"""
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/features/footer/skin/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.component.association.interfaces import IAssociationInfo
+from pyams_content.features.footer.interfaces import IFooterTarget, IFooterRenderer, IFooterSettings, \
+ IFooterRendererSettings
+from pyams_default_theme.features.footer.interfaces import ISimpleFooterRendererSettings
+from pyams_skin.layer import IPyAMSLayer
+
+# import packages
+from pyams_content.features.footer.skin import BaseFooterRenderer
+from pyams_default_theme.features.footer import SimpleFooterRendererSettings
+from pyams_template.template import template_config
+from pyams_utils.adapter import adapter_config
+
+from pyams_default_theme import _
+
+
+SIMPLE_FOOTER_RENDERER_NAME = 'PyAMS simple header'
+
+
+#
+# Simple footer renderer
+#
+
+@adapter_config(name=SIMPLE_FOOTER_RENDERER_NAME, context=(IFooterTarget, IPyAMSLayer),
+ provides=IFooterRenderer)
+@adapter_config(name=SIMPLE_FOOTER_RENDERER_NAME, context=(IFooterSettings, IPyAMSLayer),
+ provides=IFooterRenderer)
+@template_config(template='templates/simple-footer.pt', layer=IPyAMSLayer)
+class SimpleFooterRenderer(BaseFooterRenderer):
+ """Simple footer renderer"""
+
+ name = SIMPLE_FOOTER_RENDERER_NAME
+ label = _("PyAMS simple footer with links")
+ weight = 1
+
+ settings_key = 'PyAMS::simple'
+ settings_interface = ISimpleFooterRendererSettings
+
+ @staticmethod
+ def get_link_info(link):
+ return IAssociationInfo(link)
+
+
+@adapter_config(context=SimpleFooterRenderer, provides=IFooterRendererSettings)
+def simple_footer_renderer_settings_factory(context):
+ """Simple footer renderer settings factory"""
+ return SimpleFooterRendererSettings()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/features/footer/skin/templates/simple-footer.pt Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,15 @@
+<div class="footer footer-simple"
+ tal:define="settings view.settings" i18n:domain="pyams_default_theme">
+ <ul class="nav nav-tabs" role="tablist">
+ <tal:loop repeat="link settings.links.get_visible_items(request)">
+ <li role="presentation">
+ <a tal:define="info view.get_link_info(link);
+ href link.get_url(request);"
+ tal:condition="href"
+ tal:attributes="href href">${info.user_title}</a>
+ </li>
+ </tal:loop>
+ <li role="presentation"
+ tal:condition="settings.copyright">${settings.copyright}</li>
+ </ul>
+</div>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/features/footer/zmi/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,67 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_default_theme.features.footer.interfaces import ISimpleFooterRendererSettings, ISimpleFooterLinksMenu
+from pyams_form.interfaces.form import IInnerSubForm
+from pyams_portal.interfaces import MANAGE_TEMPLATE_PERMISSION
+from pyams_skin.layer import IPyAMSLayer
+
+# import packages
+from pyams_content.features.footer.zmi import FooterSettingsRendererSettingsEditForm
+from pyams_content.features.menu.zmi import LinksTable, IMenuLinksView, MenuLinksView
+from pyams_utils.adapter import adapter_config
+from pyams_zmi.form import InnerAdminEditForm
+from z3c.form import field
+
+from pyams_default_theme import _
+
+
+@adapter_config(name='simple-footer-properties',
+ context=(ISimpleFooterRendererSettings, IPyAMSLayer, FooterSettingsRendererSettingsEditForm),
+ provides=IInnerSubForm)
+class SimpleFooterPropertiesEditForm(InnerAdminEditForm):
+ """Simple footer properties edit form"""
+
+ legend = None
+ edit_permission = MANAGE_TEMPLATE_PERMISSION
+ weight = 1
+
+ fields = field.Fields(ISimpleFooterRendererSettings)
+
+
+#
+# Footer links table view
+#
+
+class LinksAssociationsTable(LinksTable):
+ """Simple footer links associations table"""
+
+ associations_name = 'links'
+
+
+@adapter_config(name='simple-footer-links',
+ context=(ISimpleFooterRendererSettings, IPyAMSLayer, FooterSettingsRendererSettingsEditForm),
+ provides=IInnerSubForm)
+@adapter_config(name='++ass++links', context=(ISimpleFooterLinksMenu, IPyAMSLayer), provides=IMenuLinksView)
+class SimpleFooterTabsView(MenuLinksView):
+ """Simple footer links view"""
+
+ title = _("Footer links")
+
+ table_class = LinksAssociationsTable
+ weight = 10
--- a/src/pyams_default_theme/features/header/__init__.py Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/header/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -31,7 +31,7 @@
from pyams_utils.traversing import get_parent
from pyams_viewlet.viewlet import contentprovider_config, ViewContentProvider
from zope.interface import implementer
-from zope.location import Location, locate
+from zope.location import Location
@contentprovider_config(name='pyams.header', layer=IPyAMSDefaultLayer)
--- a/src/pyams_default_theme/features/header/skin/__init__.py Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/header/skin/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -40,8 +40,10 @@
# Simple header renderer
#
-@adapter_config(name=SIMPLE_HEADER_RENDERER_NAME, context=(IHeaderTarget, IPyAMSLayer), provides=IHeaderRenderer)
-@adapter_config(name=SIMPLE_HEADER_RENDERER_NAME, context=(IHeaderSettings, IPyAMSLayer), provides=IHeaderRenderer)
+@adapter_config(name=SIMPLE_HEADER_RENDERER_NAME, context=(IHeaderTarget, IPyAMSLayer),
+ provides=IHeaderRenderer)
+@adapter_config(name=SIMPLE_HEADER_RENDERER_NAME, context=(IHeaderSettings, IPyAMSLayer),
+ provides=IHeaderRenderer)
@template_config(template='templates/simple-header.pt', layer=IPyAMSLayer)
class SimpleHeaderRenderer(BaseHeaderRenderer):
"""Simple header renderer"""
--- a/src/pyams_default_theme/features/header/skin/templates/simple-header.pt Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/header/skin/templates/simple-header.pt Wed Jul 18 18:50:14 2018 +0200
@@ -1,8 +1,8 @@
<div class="header header-simple"
tal:define="settings view.settings" i18n:domain="pyams_default_theme">
<tal:var replace="structure provider:pyams.banner" />
- <ul class="nav nav-tabs" role="tablist">
- <tal:loop repeat="link settings.tabs.get_visible_items()">
+ <ul class="nav nav-pills margin-bottom-20" role="tablist">
+ <tal:loop repeat="link settings.tabs.get_visible_items(request)">
<li role="presentation"
tal:attributes="class 'active' if view.is_active(link) else ''">
<a tal:define="info view.get_link_info(link);
--- a/src/pyams_default_theme/features/menu/__init__.py Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/menu/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -16,5 +16,23 @@
# import standard library
# import interfaces
+from pyams_content.component.illustration import IBasicIllustration
+from pyams_content.component.links.interfaces import IBaseLink, IInternalLink
+from pyams_default_theme.interfaces import IContentNavigationIllustration
+from pyams_skin.layer import IPyAMSLayer
# import packages
+from pyams_utils.adapter import adapter_config
+
+
+@adapter_config(context=(IBaseLink, IPyAMSLayer), provides=IContentNavigationIllustration)
+def base_link_navigation_illustration_adapter(context, request):
+ """Base link navigation illustration adapter"""
+ illustration = IBasicIllustration(context, None)
+ if not (illustration and illustration.has_data()):
+ if IInternalLink.providedBy(context):
+ target = context.get_target()
+ if target is not None:
+ illustration = request.registry.queryMultiAdapter((target, request),
+ IContentNavigationIllustration)
+ return illustration
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/interfaces/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
+from zope.interface import Interface
+
+
+class IContentNavigationTitle(Interface):
+ """Content navigation title"""
+
+
+class IContentTag(Interface):
+ """Content tag interface"""
+
+
+class IContentDate(Interface):
+ """Content date interface"""
+
+
+class IContentNavigationIllustration(Interface):
+ """Content navigation illustration"""
Binary file src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.mo has changed
--- a/src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.po Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.po Wed Jul 18 18:50:14 2018 +0200
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-07-03 09:32+0200\n"
+"POT-Creation-Date: 2018-07-18 14:48+0200\n"
"PO-Revision-Date: 2017-06-07 12:41+0200\n"
"Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
"Language-Team: French\n"
@@ -24,11 +24,11 @@
msgid "Default gallery renderer"
msgstr "Par défaut"
-#: src/pyams_default_theme/component/keynumber/portlet/__init__.py:37
+#: src/pyams_default_theme/component/keynumber/portlet/__init__.py:55
msgid "Horizontal list with carousel"
msgstr "Liste horizontale (par défaut)"
-#: src/pyams_default_theme/component/keynumber/portlet/__init__.py:46
+#: src/pyams_default_theme/component/keynumber/portlet/__init__.py:64
msgid "Vertical list"
msgstr "Liste verticale"
@@ -58,6 +58,10 @@
msgid "Default key points renderer"
msgstr "Par défaut"
+#: src/pyams_default_theme/component/paragraph/map.py:95
+msgid "Default map renderer"
+msgstr "Par défaut"
+
#: src/pyams_default_theme/component/paragraph/video.py:40
#: src/pyams_default_theme/component/video/__init__.py:41
msgid "Default video renderer"
@@ -97,6 +101,18 @@
msgid "Default header renderer"
msgstr "Par défaut"
+#: src/pyams_default_theme/component/paragraph/zmi/map.py:62
+msgid "Don't use default map configuration"
+msgstr "Ne pas utiliser la configuration de carte par défaut"
+
+#: src/pyams_default_theme/component/paragraph/interfaces/map.py:34
+msgid "Don't use default configuration?"
+msgstr "Ne pas utiliser la configuration par défaut ?"
+
+#: src/pyams_default_theme/component/paragraph/interfaces/map.py:38
+msgid "Use default configuration?"
+msgstr "Utiliser la configuration par défaut ?"
+
#: src/pyams_default_theme/component/paragraph/interfaces/frame.py:29
#: src/pyams_default_theme/component/paragraph/interfaces/verbatim.py:29
#: src/pyams_default_theme/component/paragraph/interfaces/contact.py:29
@@ -200,9 +216,9 @@
"ATTENTION : la sélection des éléments affichés dans cet aperçu ne tient pas "
"compte du contexte éventuellement paramétré dans la vue"
-#: src/pyams_default_theme/shared/view/portlet/__init__.py:37
-msgid "Simple list view"
-msgstr "Liste simple"
+#: src/pyams_default_theme/shared/view/portlet/__init__.py:38
+msgid "Simple vertical view"
+msgstr "Liste verticale simple"
#: src/pyams_default_theme/shared/imagemap/__init__.py:58
msgid "Default imagemap renderer"
@@ -216,6 +232,10 @@
msgid "Default logos renderer"
msgstr "Par défaut"
+#: src/pyams_default_theme/viewlet/logo/templates/logo.pt:5
+msgid "Back home"
+msgstr "Revenir à l'accueil"
+
#: src/pyams_default_theme/features/menu/portlet/navigation/__init__.py:49
msgid "Horizontal list with vertical illustrations"
msgstr "Liste horizontale avec illustrations verticales (par défaut)"
@@ -248,6 +268,22 @@
msgid "Label associated with second level options menu"
msgstr "Libellé associé au second niveau de sélection"
+#: src/pyams_default_theme/features/footer/interfaces.py:31
+msgid "Copyright"
+msgstr "Copyright"
+
+#: src/pyams_default_theme/features/footer/interfaces.py:32
+msgid "Copyright mention displayed in page footer"
+msgstr "Mention affichée dans le pied de page"
+
+#: src/pyams_default_theme/features/footer/zmi/__init__.py:64
+msgid "Footer links"
+msgstr "Liens du pied de page"
+
+#: src/pyams_default_theme/features/footer/skin/__init__.py:50
+msgid "PyAMS simple footer with links"
+msgstr "PyAMS: pied de page simple avec liens"
+
#: src/pyams_default_theme/features/header/interfaces.py:31
msgid "Banner image"
msgstr "Bandeau"
@@ -268,7 +304,7 @@
msgid "Top tabs"
msgstr "Onglets de navigation"
-#: src/pyams_default_theme/features/header/skin/__init__.py:48
+#: src/pyams_default_theme/features/header/skin/__init__.py:52
msgid "PyAMS simple header with banner and tabs"
msgstr "PyAMS: en-tête simple avec bandeau et onglets de navigation"
--- a/src/pyams_default_theme/locales/pyams_default_theme.pot Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/locales/pyams_default_theme.pot Wed Jul 18 18:50:14 2018 +0200
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-07-03 09:32+0200\n"
+"POT-Creation-Date: 2018-07-18 14:48+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,11 +24,11 @@
msgid "Default gallery renderer"
msgstr ""
-#: ./src/pyams_default_theme/component/keynumber/portlet/__init__.py:37
+#: ./src/pyams_default_theme/component/keynumber/portlet/__init__.py:55
msgid "Horizontal list with carousel"
msgstr ""
-#: ./src/pyams_default_theme/component/keynumber/portlet/__init__.py:46
+#: ./src/pyams_default_theme/component/keynumber/portlet/__init__.py:64
msgid "Vertical list"
msgstr ""
@@ -56,6 +56,10 @@
msgid "Default key points renderer"
msgstr ""
+#: ./src/pyams_default_theme/component/paragraph/map.py:95
+msgid "Default map renderer"
+msgstr ""
+
#: ./src/pyams_default_theme/component/paragraph/video.py:40
#: ./src/pyams_default_theme/component/video/__init__.py:41
msgid "Default video renderer"
@@ -95,6 +99,18 @@
msgid "Default header renderer"
msgstr ""
+#: ./src/pyams_default_theme/component/paragraph/zmi/map.py:62
+msgid "Don't use default map configuration"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/paragraph/interfaces/map.py:34
+msgid "Don't use default configuration?"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/paragraph/interfaces/map.py:38
+msgid "Use default configuration?"
+msgstr ""
+
#: ./src/pyams_default_theme/component/paragraph/interfaces/frame.py:29
#: ./src/pyams_default_theme/component/paragraph/interfaces/verbatim.py:29
#: ./src/pyams_default_theme/component/paragraph/interfaces/contact.py:29
@@ -183,8 +199,8 @@
msgid "WARNING: items displayed in this preview are out of context!!"
msgstr ""
-#: ./src/pyams_default_theme/shared/view/portlet/__init__.py:37
-msgid "Simple list view"
+#: ./src/pyams_default_theme/shared/view/portlet/__init__.py:38
+msgid "Simple vertical view"
msgstr ""
#: ./src/pyams_default_theme/shared/imagemap/__init__.py:58
@@ -199,6 +215,10 @@
msgid "Default logos renderer"
msgstr ""
+#: ./src/pyams_default_theme/viewlet/logo/templates/logo.pt:5
+msgid "Back home"
+msgstr ""
+
#: ./src/pyams_default_theme/features/menu/portlet/navigation/__init__.py:49
msgid "Horizontal list with vertical illustrations"
msgstr ""
@@ -231,6 +251,22 @@
msgid "Label associated with second level options menu"
msgstr ""
+#: ./src/pyams_default_theme/features/footer/interfaces.py:31
+msgid "Copyright"
+msgstr ""
+
+#: ./src/pyams_default_theme/features/footer/interfaces.py:32
+msgid "Copyright mention displayed in page footer"
+msgstr ""
+
+#: ./src/pyams_default_theme/features/footer/zmi/__init__.py:64
+msgid "Footer links"
+msgstr ""
+
+#: ./src/pyams_default_theme/features/footer/skin/__init__.py:50
+msgid "PyAMS simple footer with links"
+msgstr ""
+
#: ./src/pyams_default_theme/features/header/interfaces.py:31
msgid "Banner image"
msgstr ""
@@ -251,6 +287,6 @@
msgid "Top tabs"
msgstr ""
-#: ./src/pyams_default_theme/features/header/skin/__init__.py:48
+#: ./src/pyams_default_theme/features/header/skin/__init__.py:52
msgid "PyAMS simple header with banner and tabs"
msgstr ""
--- a/src/pyams_default_theme/resources/css/pyams-default.css Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/resources/css/pyams-default.css Wed Jul 18 18:50:14 2018 +0200
@@ -1,13 +1,14 @@
body {
- max-width: 950px;
margin: 0 auto;
}
body .header-simple .regularbanner {
position: relative;
}
+body .header-simple .regularbanner picture.regularbanner__media,
body .header-simple .regularbanner img.regularbanner__media {
width: 100%;
}
+body .header-simple .regularbanner picture.logo,
body .header-simple .regularbanner img.logo {
position: absolute;
top: 10px;
@@ -34,4 +35,10 @@
display: none;
}
}
+.margin-bottom-10 {
+ margin-bottom: 10px;
+}
+.margin-bottom-20 {
+ margin-bottom: 20px;
+}
/*# sourceMappingURL=pyams-default.css.map */
\ No newline at end of file
--- a/src/pyams_default_theme/resources/css/pyams-default.css.map Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/resources/css/pyams-default.css.map Wed Jul 18 18:50:14 2018 +0200
@@ -1,1 +1,1 @@
-{"version":3,"sources":["../../../../../../../../../home/tflorac/Dropbox/src/PyAMS/pyams_default_theme/src/pyams_default_theme/resources/less/pyams-default.less"],"names":[],"mappings":"AAAA;EACC,gBAAA;EACA,cAAA;;AAFD,IAIC,eACC;EACC,kBAAA;;AAGC,IALH,eACC,eAGC,IACE;EACA,WAAA;;AAED,IARH,eACC,eAGC,IAIE;EACA,kBAAA;EACA,SAAA;EACA,UAAA;EACA,YAAY,SAAZ;;AAUH,wBAA2C;EAC1C,YAFF,MAEG;IACA,aAAA;;;AAGF,wBAA0C,uBAAwB;EACjE,YAPF,MAOG;IACA,aAAA;;;AAGF,wBAA0C,uBAAuB;EAChE,YAZF,MAYG;IACA,aAAA;;;AAGF,wBAA0C;EACzC,YAjBF,MAiBG;IACA,aAAA","file":"pyams-default.css"}
\ No newline at end of file
+{"version":3,"sources":["../less/pyams-default.less"],"names":[],"mappings":"AAAA;EACC,cAAA;;AADD,IAGC,eACC;EACC,kBAAA;;AAIC,IANH,eACC,eAGC,QAEE;AAAD,IANH,eACC,eAIC,IACE;EACA,WAAA;;AAED,IATH,eACC,eAGC,QAKE;AAAD,IATH,eACC,eAIC,IAIE;EACA,kBAAA;EACA,SAAA;EACA,UAAA;EACA,YAAY,SAAZ;;AAUH,wBAA2C;EAC1C,YAFF,MAEG;IACA,aAAA;;;AAGF,wBAA0C,uBAAwB;EACjE,YAPF,MAOG;IACA,aAAA;;;AAGF,wBAA0C,uBAAuB;EAChE,YAZF,MAYG;IACA,aAAA;;;AAGF,wBAA0C;EACzC,YAjBF,MAiBG;IACA,aAAA;;;AAQH,cAAC;EACA,mBAAA;;AAED,cAAC;EACA,mBAAA","file":"pyams-default.css"}
\ No newline at end of file
--- a/src/pyams_default_theme/resources/css/pyams-default.min.css Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/resources/css/pyams-default.min.css Wed Jul 18 18:50:14 2018 +0200
@@ -1,1 +1,1 @@
-body{max-width:950px;margin:0 auto}body .header-simple .regularbanner{position:relative}body .header-simple .regularbanner img.regularbanner__media{width:100%}body .header-simple .regularbanner img.logo{position:absolute;top:10px;left:10px;max-height:calc(80%)}@media only screen and (min-width:1200px){.portal-page .slot.col-lg-0{display:none}}@media only screen and (min-width:992px) and (max-width:1199px){.portal-page .slot.col-md-0{display:none}}@media only screen and (min-width:768px) and (max-width:991px){.portal-page .slot.col-sm-0{display:none}}@media only screen and (max-width:767px){.portal-page .slot.col-xs-0{display:none}}
+body{margin:0 auto}body .header-simple .regularbanner{position:relative}body .header-simple .regularbanner img.regularbanner__media,body .header-simple .regularbanner picture.regularbanner__media{width:100%}body .header-simple .regularbanner img.logo,body .header-simple .regularbanner picture.logo{position:absolute;top:10px;left:10px;max-height:calc(80%)}@media only screen and (min-width:1200px){.portal-page .slot.col-lg-0{display:none}}@media only screen and (min-width:992px) and (max-width:1199px){.portal-page .slot.col-md-0{display:none}}@media only screen and (min-width:768px) and (max-width:991px){.portal-page .slot.col-sm-0{display:none}}@media only screen and (max-width:767px){.portal-page .slot.col-xs-0{display:none}}.margin-bottom-10{margin-bottom:10px}.margin-bottom-20{margin-bottom:20px}
--- a/src/pyams_default_theme/resources/less/pyams-default.less Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/resources/less/pyams-default.less Wed Jul 18 18:50:14 2018 +0200
@@ -1,11 +1,11 @@
body {
- max-width: 950px;
margin: 0 auto;
.header-simple {
.regularbanner {
position: relative;
+ picture,
img {
&.regularbanner__media {
width: 100%;
@@ -46,3 +46,13 @@
}
}
}
+
+
+.margin-bottom {
+ &-10 {
+ margin-bottom: 10px;
+ }
+ &-20 {
+ margin-bottom: 20px;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/shared/common/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,112 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.component.illustration import ILinkIllustration, IIllustration
+from pyams_content.interfaces import IBaseContent
+from pyams_content.shared.common.interfaces import IWfSharedContent
+from pyams_default_theme.interfaces import IContentNavigationTitle, IContentTag, IContentDate, \
+ IContentNavigationIllustration
+from pyams_i18n.interfaces import II18n
+from pyams_skin.layer import IPyAMSLayer
+from pyams_utils.interfaces.tales import ITALESExtension
+from pyams_workflow.interfaces import IWorkflowPublicationInfo
+
+# import packages
+from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
+from pyams_utils.date import format_date, SH_DATE_FORMAT
+from zope.interface import Interface
+
+
+@adapter_config(context=(IBaseContent, IPyAMSLayer), provides=IContentNavigationTitle)
+def shared_content_navigation_title(context, request):
+ """Default content navigation title adapter"""
+ return II18n(context).query_attribute('title', request=request)
+
+
+@adapter_config(name='pyams_title',
+ context=(Interface, Interface, Interface),
+ provides=ITALESExtension)
+class PyAMSContentTitleTALESExtension(ContextRequestViewAdapter):
+ """PyAMS content title TALES extension"""
+
+ def render(self, context=None):
+ if context is None:
+ context = self.context
+ return self.request.registry.queryMultiAdapter((context, self.request), IContentNavigationTitle)
+
+
+@adapter_config(context=(IWfSharedContent, IPyAMSLayer), provides=IContentTag)
+def shared_content_tag_adapter(context, request):
+ """Default shared content tag adapter"""
+ translate = request.localizer.translate
+ return translate(context.content_name)
+
+
+@adapter_config(name='pyams_tag',
+ context=(Interface, Interface, Interface),
+ provides=ITALESExtension)
+class PyAMSContentTagTALESExtension(ContextRequestViewAdapter):
+ """PyAMS content tag TALES extension"""
+
+ def render(self, context=None):
+ if context is None:
+ context = self.context
+ return self.request.registry.queryMultiAdapter((context, self.request), IContentTag)
+
+
+@adapter_config(context=(IWfSharedContent, IPyAMSLayer), provides=IContentDate)
+def shared_content_date_adapter(context, request):
+ """Default shared content date adapter"""
+ publication_info = IWorkflowPublicationInfo(context, None)
+ if publication_info is not None:
+ return format_date(publication_info.visible_publication_date,
+ format=SH_DATE_FORMAT, request=request)
+
+
+@adapter_config(name='pyams_date',
+ context=(Interface, Interface, Interface),
+ provides=ITALESExtension)
+class PyAMSContentDateTALESExtension(ContextRequestViewAdapter):
+ """PyAMS content date TALES extension"""
+
+ def render(self, context=None):
+ if context is None:
+ context = self.context
+ return self.request.registry.queryMultiAdapter((context, self.request), IContentDate)
+
+
+@adapter_config(context=(IBaseContent, IPyAMSLayer), provides=IContentNavigationIllustration)
+def base_content_navigation_illustration_adapter(context, request):
+ """Default content navigation illustration adapter"""
+ illustration = ILinkIllustration(context, None)
+ if not (illustration and illustration.has_data()):
+ illustration = IIllustration(context, None)
+ if illustration and illustration.has_data():
+ return illustration
+
+
+@adapter_config(name='pyams_illustration',
+ context=(Interface, Interface, Interface),
+ provides=ITALESExtension)
+class PyAMSContentIllustrationTALESExtension(ContextRequestViewAdapter):
+ """PyAMS content illustration TALES extension"""
+
+ def render(self, context=None):
+ if context is None:
+ context = self.context
+ return self.request.registry.queryMultiAdapter((context, self.request), IContentNavigationIllustration)
--- a/src/pyams_default_theme/shared/view/portlet/__init__.py Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/shared/view/portlet/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -29,9 +29,10 @@
from pyams_default_theme import _
-@adapter_config(context=(IPortalContext, IPyAMSLayer, Interface, IViewItemsPortletSettings), provides=IPortletRenderer)
+@adapter_config(context=(IPortalContext, IPyAMSLayer, Interface, IViewItemsPortletSettings),
+ provides=IPortletRenderer)
@template_config(template='templates/view-items-list.pt', layer=IPyAMSLayer)
-class ViewItemsPortletRenderer(PortletRenderer):
+class ViewItemsPortletVerticalRenderer(PortletRenderer):
"""View items portlet renderer"""
- label = _("Simple list view")
+ label = _("Simple vertical view")
--- a/src/pyams_default_theme/templates/layout.pt Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/templates/layout.pt Wed Jul 18 18:50:14 2018 +0200
@@ -26,7 +26,6 @@
<!-- Page header -->
<tal:var content="structure provider:pyams.header">Header</tal:var>
- <tal:var content="structure provider:pyams.banner">Banner</tal:var>
<!-- End page header -->
<!-- Main panel -->
--- a/src/pyams_default_theme/viewlet/banner/__init__.py Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/viewlet/banner/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -35,4 +35,7 @@
@property
def settings(self):
target = get_parent(self.context, IHeaderTarget)
- return ISimpleHeaderRendererSettings(IHeaderSettings(target).settings, None)
+ settings = IHeaderSettings(target)
+ while settings.inherit:
+ settings = IHeaderSettings(settings.parent)
+ return ISimpleHeaderRendererSettings(settings.settings, None)
--- a/src/pyams_default_theme/viewlet/logo/__init__.py Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/viewlet/logo/__init__.py Wed Jul 18 18:50:14 2018 +0200
@@ -12,6 +12,7 @@
__docformat__ = 'restructuredtext'
+
# import standard library
# import interfaces
@@ -34,4 +35,7 @@
@property
def settings(self):
target = get_parent(self.context, IHeaderTarget)
- return ISimpleHeaderRendererSettings(IHeaderSettings(target).settings, None)
+ settings = IHeaderSettings(target)
+ while settings.inherit:
+ settings = IHeaderSettings(settings.parent)
+ return ISimpleHeaderRendererSettings(settings.settings, None)