# HG changeset patch # User Thierry Florac # Date 1531871870 -7200 # Node ID dd3a147af2d1fd2aee05b6c42990519e96d19c09 # Parent dbc36a846021f7ee00d2b73aaf023b7a854adf09 Added simple footer renderer diff -r dbc36a846021 -r dd3a147af2d1 src/pyams_default_theme/features/footer/__init__.py --- a/src/pyams_default_theme/features/footer/__init__.py Wed Jul 18 01:57:37 2018 +0200 +++ b/src/pyams_default_theme/features/footer/__init__.py Wed Jul 18 01:57:50 2018 +0200 @@ -16,12 +16,21 @@ # 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 @contentprovider_config(name='pyams.footer', layer=IPyAMSDefaultLayer) @@ -29,11 +38,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 +56,34 @@ 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""" + + @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() diff -r dbc36a846021 -r dd3a147af2d1 src/pyams_default_theme/features/footer/interfaces.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_default_theme/features/footer/interfaces.py Wed Jul 18 01:57:50 2018 +0200 @@ -0,0 +1,32 @@ +# +# Copyright (c) 2008-2018 Thierry Florac +# 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 + + +class ISimpleFooterRendererSettings(IFooterRendererSettings): + """Simple footer renderer settings""" + + links = Attribute("Footer links") + + +class ISimpleFooterLinksMenu(Interface): + """Simple footer links marker interface""" diff -r dbc36a846021 -r dd3a147af2d1 src/pyams_default_theme/features/footer/skin/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_default_theme/features/footer/skin/__init__.py Wed Jul 18 01:57:50 2018 +0200 @@ -0,0 +1,64 @@ +# +# Copyright (c) 2008-2018 Thierry Florac +# 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() diff -r dbc36a846021 -r dd3a147af2d1 src/pyams_default_theme/features/footer/skin/templates/simple-footer.pt --- /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 01:57:50 2018 +0200 @@ -0,0 +1,14 @@ + diff -r dbc36a846021 -r dd3a147af2d1 src/pyams_default_theme/features/footer/zmi/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_default_theme/features/footer/zmi/__init__.py Wed Jul 18 01:57:50 2018 +0200 @@ -0,0 +1,67 @@ +# +# Copyright (c) 2008-2018 Thierry Florac +# 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