#
# Copyright (c) 2008-2015 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 zope.component.interfaces import IObjectEvent, ObjectEvent
from zope.configuration.fields import GlobalInterface
from zope.interface import implementer, invariant, Interface, Attribute, Invalid
from zope.schema import Text, TextLine, Choice, Int, Bool
from pyams_file.schema import FileField
from pyams_skin.layer import IPyAMSLayer
from pyams_template.template import layout_config
from pyams_skin import _
[docs]class ISkin(Interface):
"""Skin interface
Skins are registered as utilities implementing this interface
and defining request layer as attribute
"""
label = TextLine(title="Skin name")
layer = GlobalInterface(title="Request layer",
description="This interface will be used to tag request layer",
required=True)
[docs]class ISkinChangedEvent(IObjectEvent):
"""Skin changed event"""
[docs]@implementer(ISkinChangedEvent)
class SkinChangedEvent(ObjectEvent):
"""Request skin changed event"""
[docs]class ISkinnable(Interface):
"""Skinnable content interface"""
can_inherit_skin = Attribute("Check if skin can be inherited")
inherit_skin = Bool(title=_("Inherit parent skin?"),
description=_("Should we reuse parent skin?"),
required=True,
default=False)
no_inherit_skin = Bool(title=_("Don't inherit parent skin?"),
description=_("Should we override parent skin?"),
required=True,
default=True)
skin_parent = Attribute("Skin parent (local or inherited)")
skin = Choice(title=_("Custom graphic theme"),
description=_("This theme will be used to handle graphic design (colors and images)"),
vocabulary='PyAMS user skins',
required=False)
@invariant
def check_skin(self):
if self.no_inherit_skin and not self.skin:
raise Invalid(_("You must select a custom skin or inherit from parent!"))
def get_skin(self, request=None):
"""Get skin matching this content"""
custom_stylesheet = FileField(title=_("Custom stylesheet"),
description=_("This custom stylesheet will be used to override selected theme styles"),
required=False)
editor_stylesheet = FileField(title=_("Editor stylesheet"),
description=_("Styles defined into this stylesheet will be available into HTML editor"),
required=False)
custom_script = FileField(title=_("Custom script"),
description=_("This custom javascript file will be used to add dynamic features to "
"selected theme"),
required=False)
[docs]class IUserSkinnable(ISkinnable):
"""User skinnable content interface"""
[docs]@layout_config(template='templates/fullpage-layout.pt', layer=IPyAMSLayer)
class IFullPage(Interface):
"""Full page marker interface"""
[docs]@layout_config(template='templates/fullpage-modal-layout.pt', layer=IPyAMSLayer)
class IModalFullPage(IFullPage):
"""Full page modal dialog marker interface"""
dialog_class = Attribute("Default dialog CSS class")
[docs]@layout_config(template='templates/inner-layout.pt', layer=IPyAMSLayer)
class IInnerPage(Interface):
"""Inner page marker interface"""
[docs]@layout_config(template='templates/widget-layout.pt', layer=IPyAMSLayer)
class IWidgetInnerPage(IInnerPage):
"""Inner page with widget marker interface"""
[docs]@layout_config(template='templates/modal-layout.pt', layer=IPyAMSLayer)
class IModalPage(Interface):
"""Modal page marker interface"""
[docs]class IDialog(IModalPage):
"""Modal dialog interface"""
modal_class = TextLine(title="Modal dialog CSS class",
default='modal-medium')
[docs]class IContentHelp(Interface):
"""Content help block"""
outer_margin = Int(title='Outer margin size',
default=0)
status = TextLine(title='Help status',
default='info')
header = TextLine(title='Help header')
message = Text(title='Help message')
message_format = Choice(title='Help message format',
vocabulary='PyAMS HTML renderers')
[docs]class IContentTitle(Interface):
"""Content title interface"""
title = Attribute("Content title")
[docs]class IContextTitlePrefix(Interface):
"""Context title prefix interface"""
prefix = Attribute("Context title prefix")
[docs]class IContentSearch(Interface):
"""Content search interface"""
def get_search_results(self, data):
"""Extract search results from given data
`data` is a dictionary containing search fields
"""
[docs]class ISearchPage(Interface):
"""Search page marker interface"""