provide dynamic default value (via TAL expression)
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3721 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
4157c0af04
commit
a1013b63b2
4 changed files with 33 additions and 5 deletions
|
@ -61,6 +61,13 @@ Field types
|
||||||
>>> sorted(t.token for t in textFieldTypes)
|
>>> sorted(t.token for t in textFieldTypes)
|
||||||
['textarea', 'textline']
|
['textarea', 'textline']
|
||||||
|
|
||||||
|
Dynamic default values
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
>>> idField = Field(u'id', default='user/title|string:???', defaultValueType='tales')
|
||||||
|
>>> idField.getDefaultValue()
|
||||||
|
'???'
|
||||||
|
|
||||||
|
|
||||||
Creating a schema from an interface
|
Creating a schema from an interface
|
||||||
===================================
|
===================================
|
||||||
|
@ -164,6 +171,7 @@ Create a new object using a schema-based form
|
||||||
>>> form = CreateForm(container, TestRequest(form=input))
|
>>> form = CreateForm(container, TestRequest(form=input))
|
||||||
>>> form.interface = IPerson
|
>>> form.interface = IPerson
|
||||||
>>> form.factory = Person
|
>>> form.factory = Person
|
||||||
|
|
||||||
>>> form.nextUrl = 'dummy_url' # avoid hassle with IAbsoluteURL view...
|
>>> form.nextUrl = 'dummy_url' # avoid hassle with IAbsoluteURL view...
|
||||||
>>> form.getName = lambda x: x.lastName.lower()
|
>>> form.getName = lambda x: x.lastName.lower()
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,8 @@ from zope.component import adapts
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.i18n.format import DateTimeParseError
|
from zope.i18n.format import DateTimeParseError
|
||||||
from zope.i18n.locales import locales
|
from zope.i18n.locales import locales
|
||||||
|
from zope.tales.engine import Engine
|
||||||
|
from zope.tales.tales import Context
|
||||||
|
|
||||||
from cybertools.composer.base import Component
|
from cybertools.composer.base import Component
|
||||||
from cybertools.composer.schema.interfaces import IField, IFieldInstance
|
from cybertools.composer.schema.interfaces import IField, IFieldInstance
|
||||||
|
@ -51,6 +53,8 @@ class Field(Component):
|
||||||
renderFactory = None
|
renderFactory = None
|
||||||
default = None
|
default = None
|
||||||
default_method = None
|
default_method = None
|
||||||
|
defaultValueType = 'static'
|
||||||
|
|
||||||
value_type = None
|
value_type = None
|
||||||
|
|
||||||
fieldTypeInfo = None
|
fieldTypeInfo = None
|
||||||
|
@ -84,11 +88,21 @@ class Field(Component):
|
||||||
def getDefaultValue(self):
|
def getDefaultValue(self):
|
||||||
if callable(self.default_method):
|
if callable(self.default_method):
|
||||||
return self.default_method()
|
return self.default_method()
|
||||||
|
if self.defaultValueType == 'tales':
|
||||||
|
expr = Engine.compile(self.default)
|
||||||
|
ctx = Context(Engine, self.getContextProperties())
|
||||||
|
return expr(ctx)
|
||||||
return self.default
|
return self.default
|
||||||
def setDefaultValue(self, value):
|
def setDefaultValue(self, value):
|
||||||
self.default = value
|
self.default = value
|
||||||
defaultValue = property(getDefaultValue, setDefaultValue)
|
defaultValue = property(getDefaultValue, setDefaultValue)
|
||||||
|
|
||||||
|
def getDefaultValueExpr(self):
|
||||||
|
return self.default
|
||||||
|
def setDefaultValueExpr(self, value):
|
||||||
|
self.default = value
|
||||||
|
defaultValueExpr = property(getDefaultValueExpr, setDefaultValueExpr)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def fieldRenderer(self):
|
def fieldRenderer(self):
|
||||||
return self.getFieldTypeInfo().fieldRenderer
|
return self.getFieldTypeInfo().fieldRenderer
|
||||||
|
@ -129,6 +143,9 @@ class Field(Component):
|
||||||
fi.clientInstance = clientInstance
|
fi.clientInstance = clientInstance
|
||||||
return fi
|
return fi
|
||||||
|
|
||||||
|
def getContextProperties(self):
|
||||||
|
return dict(context=self, user=None)
|
||||||
|
|
||||||
|
|
||||||
class FieldInstance(object):
|
class FieldInstance(object):
|
||||||
|
|
||||||
|
@ -152,7 +169,7 @@ class FieldInstance(object):
|
||||||
method = getattr(self.clientInstance.context, dm, None)
|
method = getattr(self.clientInstance.context, dm, None)
|
||||||
if method:
|
if method:
|
||||||
return method()
|
return method()
|
||||||
return self.context.defaultValue
|
return self.context.getDefaultValue()
|
||||||
|
|
||||||
def getRawValue(self, data, key, default=None):
|
def getRawValue(self, data, key, default=None):
|
||||||
return data.get(key, default)
|
return data.get(key, default)
|
||||||
|
|
|
@ -133,7 +133,7 @@ standardFieldNames = SimpleVocabulary((
|
||||||
))
|
))
|
||||||
|
|
||||||
defaultValueTypes = SimpleVocabulary((
|
defaultValueTypes = SimpleVocabulary((
|
||||||
SimpleTerm('string', 'string', 'String'),
|
SimpleTerm('static', 'static', 'Static data'),
|
||||||
SimpleTerm('tales', 'tales', 'TAL expression'),
|
SimpleTerm('tales', 'tales', 'TAL expression'),
|
||||||
))
|
))
|
||||||
|
|
||||||
|
@ -167,17 +167,17 @@ class IField(IComponent):
|
||||||
required=False,
|
required=False,
|
||||||
default='',
|
default='',
|
||||||
vocabulary=standardFieldNames,)
|
vocabulary=standardFieldNames,)
|
||||||
defaultValue = schema.TextLine(
|
defaultValueExpr = schema.TextLine(
|
||||||
title=_(u'Default'),
|
title=_(u'Default'),
|
||||||
description=_(u'Value with which to pre-set the field contents. '
|
description=_(u'Value with which to pre-set the field contents. '
|
||||||
'Use this also for populating a calculated field.'),
|
'Use this also for populating a calculated field.'),
|
||||||
required=False,)
|
required=False,)
|
||||||
defaultValueType = schema.Choice(
|
defaultValueType = schema.Choice(
|
||||||
title=_(u'Default type'),
|
title=_(u'Default type'),
|
||||||
description=_(u'The type of the default, i.e. a fixed string '
|
description=_(u'The type of the default, i.e. a static value '
|
||||||
u'or an expression that is used to calculate the value.'),
|
u'or an expression that is used to calculate the value.'),
|
||||||
required=False,
|
required=False,
|
||||||
default='string',
|
default='static',
|
||||||
vocabulary=defaultValueTypes)
|
vocabulary=defaultValueTypes)
|
||||||
required = schema.Bool(
|
required = schema.Bool(
|
||||||
title=_(u'Required'),
|
title=_(u'Required'),
|
||||||
|
|
|
@ -52,6 +52,9 @@ class Schema(Template):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def fields(self):
|
def fields(self):
|
||||||
|
return self.getFields()
|
||||||
|
|
||||||
|
def getFields(self):
|
||||||
return self.components
|
return self.components
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
Loading…
Add table
Reference in a new issue