diff --git a/composer/schema/README.txt b/composer/schema/README.txt
index 1dbcc15..3000669 100644
--- a/composer/schema/README.txt
+++ b/composer/schema/README.txt
@@ -52,7 +52,7 @@ Field types
>>> from cybertools.composer.schema.interfaces import fieldTypes
>>> sorted(t.token for t in fieldTypes)
['checkbox', 'date', 'display', 'dropdown', 'email', 'fileupload', 'html',
- 'number', 'password', 'spacer', 'textarea', 'textline']
+ 'list', 'number', 'password', 'spacer', 'textarea', 'textline']
>>> from zope.schema.vocabulary import SimpleVocabulary
>>> textFieldTypes = SimpleVocabulary([t for t in fieldTypes if t.token in
@@ -183,4 +183,4 @@ Macros / renderers
>>> sorted(fieldRenderers.keys())
[u'field', u'field_spacer', u'fields', u'form', u'input_checkbox',
u'input_date', u'input_dropdown', u'input_fileupload', u'input_html',
- u'input_password', u'input_textarea', u'input_textline']
+ u'input_list', u'input_password', u'input_textarea', u'input_textline']
diff --git a/composer/schema/browser/form.py b/composer/schema/browser/form.py
index b915e8c..db9c337 100644
--- a/composer/schema/browser/form.py
+++ b/composer/schema/browser/form.py
@@ -51,7 +51,7 @@ class Form(object):
@Lazy
def fieldRenderers(self):
""" proof-of-concept - get a dictionary of renderers (macros) via
- adaptatation.
+ adaptation.
"""
return IRenderers(self)
diff --git a/composer/schema/browser/schema_macros.pt b/composer/schema/browser/schema_macros.pt
index ff56d58..f882346 100755
--- a/composer/schema/browser/schema_macros.pt
+++ b/composer/schema/browser/schema_macros.pt
@@ -161,6 +161,18 @@
+
+
+
+
+
|
diff --git a/composer/schema/factory.py b/composer/schema/factory.py
index f9f1275..2ffcdda 100644
--- a/composer/schema/factory.py
+++ b/composer/schema/factory.py
@@ -54,6 +54,7 @@ class SchemaFactory(object):
schema.Datetime: ('date',),
schema.Int: ('number',),
schema.Bool: ('checkbox',),
+ schema.List: ('list',),
schema.Choice: ('dropdown',),
schema.Bytes: ('fileupload',),
Email: ('email',),
diff --git a/composer/schema/field.py b/composer/schema/field.py
index f3f24ff..6bdc9ee 100644
--- a/composer/schema/field.py
+++ b/composer/schema/field.py
@@ -216,10 +216,12 @@ class DateFieldInstance(NumberFieldInstance):
if not value:
return None
value = ''.join(value)
- return datetime(*(strptime(value, '%Y-%m-%dT%H:%M:%S')[:6]))
+ if value:
+ return datetime(*(strptime(value, '%Y-%m-%dT%H:%M:%S')[:6]))
+ return None
def validate(self, value, data=None):
- if value in ('', None):
+ if value in ('', ['', ''], None):
if self.context.required:
self.setError('required_missing')
else:
@@ -273,16 +275,27 @@ class ListFieldInstance(FieldInstance):
@Lazy
def valueFieldInstance(self):
- instanceName = (self.valueType.instance_name or
- self.valueType.getFieldTypeInfo().instanceName)
+ if self.valueType is None:
+ return FieldInstance(self.context)
+ else:
+ instanceName = (self.valueType.instance_name or
+ self.valueType.getFieldTypeInfo().instanceName)
return component.getAdapter(self.valueType, IFieldInstance, name=instanceName)
def marshall(self, value):
- return [self.valueFieldInstance.marshall(v) for v in value]
+ if isinstance(value, basestring):
+ return value
+ return u'\n'.join(self.valueFieldInstance.marshall(v) for v in value)
+ #return [self.valueFieldInstance.marshall(v) for v in value]
def display(self, value):
+ if isinstance(value, basestring):
+ return value
return u' | '.join(self.valueFieldInstance.display(v) for v in value)
def unmarshall(self, value):
- return [self.valueFieldInstance.unmarshall(v) for v in value]
+ if isinstance(value, basestring):
+ value = value.split('\n')
+ return [self.valueFieldInstance.unmarshall(v)
+ for v in value if v.strip()]
diff --git a/composer/schema/interfaces.py b/composer/schema/interfaces.py
index 499b508..9d7106e 100644
--- a/composer/schema/interfaces.py
+++ b/composer/schema/interfaces.py
@@ -97,6 +97,7 @@ fieldTypes = SimpleVocabulary((
FieldType('checkbox', 'checkbox', u'Checkbox', instanceName='boolean'),
FieldType('dropdown', 'dropdown', u'Drop-down selection'),
#FieldType('listbox', 'listbox', u'List box (multiple selection)'),
+ FieldType('list', 'list', u'List', instanceName='list'),
FieldType('calculated', 'display', u'Calculated Value',
instanceName='calculated'),
FieldType('spacer', 'spacer', u'Spacer',
diff --git a/organize/interfaces.py b/organize/interfaces.py
index 6b3742f..9b66042 100644
--- a/organize/interfaces.py
+++ b/organize/interfaces.py
@@ -56,7 +56,8 @@ class IPerson(Interface):
description=_(u'The last name or surname'),)
email = Email(title=_(u'E-Mail address'),
description=_(u'The standard email address of the person'),)
- phoneNumbers = SimpleList(
+ #phoneNumbers = SimpleList(
+ phoneNumbers = schema.List(
value_type=schema.TextLine(),
default=[],
title=_(u'Phone numbers'),
@@ -97,7 +98,7 @@ class IAddress(Interface):
title=_(u'Country code'),
description=_(u'International two-letter country code'),
required=False,)
- lines = LinesList(
+ lines = schema.List(
value_type=schema.TextLine(),
default=[],
title=_(u'Additional lines'),