
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2079 fd906abe-77d9-0310-91a1-e0d9ade77398
92 lines
2.8 KiB
Text
92 lines
2.8 KiB
Text
===========================
|
|
Schema and Field Management
|
|
===========================
|
|
|
|
($Id$)
|
|
|
|
>>> from cybertools.composer.schema import Schema
|
|
>>> from cybertools.composer.schema import Field
|
|
|
|
|
|
Working with predefined schemas
|
|
===============================
|
|
|
|
We start with setting up a schema with fields.
|
|
|
|
>>> serviceSchema = Schema(
|
|
... Field(u'title', renderFactory=None),
|
|
... Field(u'description'),
|
|
... Field(u'start'),
|
|
... Field(u'end'),
|
|
... Field(u'capacity'),
|
|
... )
|
|
|
|
For using a schema we need some class that we can use for creating
|
|
objects.
|
|
|
|
>>> class Service(object):
|
|
... pass
|
|
|
|
The schema will be connected with an object via an instance adapter.
|
|
In addition, we need a field instance adapter that cares for the
|
|
correct conversion of input data to context attributes.
|
|
|
|
>>> from cybertools.composer.schema.instance import Editor
|
|
>>> from cybertools.composer.schema.field import FieldInstance
|
|
>>> from zope import component
|
|
>>> component.provideAdapter(Editor, (Service,), name="service.edit")
|
|
>>> component.provideAdapter(FieldInstance)
|
|
|
|
>>> srv = Service()
|
|
>>> inst = component.getAdapter(srv, name='service.edit')
|
|
>>> inst.template = serviceSchema
|
|
>>> inst.applyTemplate(data=dict(title='Service', capacity='30'))
|
|
<...FormState object ...>
|
|
|
|
>>> srv.title, srv.description, srv.capacity
|
|
(u'Service', u'', u'30')
|
|
|
|
|
|
Creating a schema from an interface
|
|
===================================
|
|
|
|
>>> from zope.interface import Interface, implements
|
|
>>> import zope.schema
|
|
>>> from cybertools.composer.schema.factory import SchemaFactory
|
|
>>> component.provideAdapter(SchemaFactory)
|
|
|
|
>>> class IPerson(Interface):
|
|
... firstName = zope.schema.TextLine(title=u'First name')
|
|
... lastName = zope.schema.TextLine(title=u'Last name')
|
|
... age = zope.schema.Int(title=u'Age')
|
|
|
|
>>> class Person(object):
|
|
... implements(IPerson)
|
|
|
|
>>> from cybertools.composer.schema.interfaces import ISchemaFactory
|
|
>>> factory = ISchemaFactory(Person())
|
|
|
|
>>> schema = factory(IPerson)
|
|
>>> for f in schema.fields:
|
|
... print f.name, f.title, f.fieldType
|
|
firstName First name textline
|
|
lastName Last name textline
|
|
age Age number
|
|
|
|
Using a more specialized schema factory
|
|
---------------------------------------
|
|
|
|
>>> class PersonSchemaFactory(SchemaFactory):
|
|
... def __call__(self, manager=None):
|
|
... schema = super(PersonSchemaFactory, self).__call__(manager)
|
|
... del schema.fields['firstName'] # don't show first name
|
|
... return schema
|
|
>>> component.provideAdapter(PersonSchemaFactory, (IPerson,))
|
|
|
|
>>> factory = ISchemaFactory(Person())
|
|
>>> schema = factory(IPerson)
|
|
>>> for f in schema.fields:
|
|
... print f.name, f.title, f.fieldType
|
|
lastName Last name textline
|
|
age Age number
|
|
|