z3ext.skintool 1.1.0
Tool for merging skin layers at runtime
Latest Version: 1.2.0
Detailed Documentation
======================
=========
Skin tool
=========
Skin tool allow configure skin at runtime for each ISite object.
>>> from z3ext.skintool import interfaces, zcml
>>> from z3ext.skintool.tool import skinToolModified
>>> from zope import interface, component, schema
We need site object and request
>>> from zope.app.component.hooks import getSite
>>> site = getSite()
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
Now let's define layer and skin
>>> from zope import interface
>>> class IMySkin(interface.Interface):
... pass
>>> class IMyLayer(interface.Interface):
... pass
Before we can use IMySkin and IMyLayer we should register it in local registry
>>> zcml.skinDirective(IMySkin, u'myskin', u'My skin', '', ())
>>> zcml.layerDirective(IMyLayer, u'mylayer', u'My layer', '')
Now skin and layer should be listed in vocabulary.
>>> from z3ext.skintool.vocabulary import SkinsVocabulary
>>> voc = SkinsVocabulary()(site)
>>> term = voc.getTerm(IMySkin)
>>> term.value == u'myskin'
True
>>> term.title == 'My skin'
True
>>> term.token == u'myskin'
True
>>> from z3ext.skintool.vocabulary import LayersVocabulary
>>> voc = LayersVocabulary()(site)
>>> term = voc.getTerm(IMyLayer)
>>> term.value == u'mylayer'
True
>>> term.title == 'My layer'
True
>>> term.token == u'mylayer'
True
All layers applied in IBeforeTraverseEvent event for ISite object. We will
use handler directly.
>>> from z3ext.skintool.subscribers import threadServiceSubscriber
>>> from zope.app.publication.interfaces import BeforeTraverseEvent
Let's check layer for our request.
>>> threadServiceSubscriber(site, BeforeTraverseEvent(site, request))
>>> IMySkin.providedBy(request)
False
>>> IMyLayer.providedBy(request)
False
This is because we should configure skin tool to use our layer and
site object should implement ISkinable interface.
>>> interface.directlyProvides(site, interfaces.ISkinable)
Let's configure skin tool
>>> tool = component.getUtility(interfaces.ISkinTool)
>>> tool.skin = u'myskin'
>>> tool.layers = [u'mylayer']
>>> skinToolModified()
Let's try again
>>> threadServiceSubscriber(site, BeforeTraverseEvent(site, request))
>>> IMySkin.providedBy(request)
True
>>> IMyLayer.providedBy(request)
True
Change layers config
>>> tool.layers = []
>>> skinToolModified()
>>> threadServiceSubscriber(site, BeforeTraverseEvent(site, request))
>>> IMyLayer.providedBy(request)
False
Skin can depends on other layers
>>> class IMySkin2(interface.Interface):
... pass
>>> zcml.skinDirective(IMySkin2, u'myskin2', u'My skin2', '', (IMyLayer,))
>>> tool.skin = u'myskin2'
>>> skinToolModified()
>>> threadServiceSubscriber(site, BeforeTraverseEvent(site, request))
>>> IMySkin2.providedBy(request)
True
>>> IMyLayer.providedBy(request)
True
We can define default layer, that will added automaticly
>>> class IDefaultLayer(interface.Interface):
... pass
We have to register utility IDefaultLayer
>>> component.provideUtility(IDefaultLayer, interfaces.IDefaultLayer, 'default')
>>> tool.layers = [u'mylayer']
>>> skinToolModified()
>>> threadServiceSubscriber(site, BeforeTraverseEvent(site, request))
>>> IMyLayer.providedBy(request)
True
>>> IDefaultLayer.providedBy(request)
True
z3ext:layer directive
---------------------
We can do same with z3ext:layer directive. We need load zcml file:
>>> import z3ext.skintool
>>> from zope.configuration import xmlconfig
>>> context = xmlconfig.file('meta.zcml', z3ext.skintool)
>>> context = xmlconfig.string("""
...
...
... """, context)
>>> voc = LayersVocabulary()(site)
>>> term = voc.getTerm(IMyLayer)
>>> term.value == u'mylayer3'
True
>>> term.title == 'My zcml layer'
True
>>> term.token == u'mylayer3'
True
>>> tool.user_layers = ['mylayer3']
>>> skinToolModified()
>>> threadServiceSubscriber(site, BeforeTraverseEvent(site, request))
>>> IMyLayer.providedBy(request)
True
>>> context = xmlconfig.string("""
...
...
... """, context)
>>> tool.skin = u'myskin4'
>>> skinToolModified()
>>> threadServiceSubscriber(site, BeforeTraverseEvent(site, request))
>>> IMySkin2.providedBy(request)
True
>>> IMyLayer.providedBy(request)
True
=======
CHANGES
=======
1.1.0 (2008-11-21)
------------------
- Added z3ext:skin directive
- API refactored
- Added translations: nl, ru
1.0.2 (2008-08-07)
------------------
- Added INoSkinSwitching for skin that does not allow skin switching
1.0.1 (2008-05-16)
------------------
- Replace 'autoinclude' with 'includeDependendcies'
1.0.0 (2008-03-28)
------------------
- Code cleanup
- Added tests
- Code moved to svn.zope.org
0.13 (2008-02-28)
----------------
- Use z3c.autoinclude
- Do not generate InterfaceClass object, just apply list of layers
0.12 (2008-02-08)
-----------------
- Code cleanup
0.11 (2008-02-06)
------------------
- Added ISkinable marker interface.
Now object should implement ISkinable implicitly to support skintool
0.10 (2008-02-01)
------------------
- Initial release.
| File | Type | Py Version | Uploaded on | Size | # downloads |
|---|---|---|---|---|---|
| z3ext.skintool-1.1.0.tar.gz (md5) | Source | 2008-11-21 06:37:17 | 13KB | 91 | |
- Author: Nikolay Kim <fafhrd91 at gmail com>
- Home Page: http://z3ext.net/
- License: ZPL 2.1
- Categories
- Package Index Owner: fafhrd
- DOAP record: z3ext.skintool-1.1.0.xml
Log in to rate this package.
