diff --git a/composer/schema/factory.py b/composer/schema/factory.py index b7b9318..183def5 100644 --- a/composer/schema/factory.py +++ b/composer/schema/factory.py @@ -99,3 +99,25 @@ class SchemaFactory(object): baseField=field,) fields.append(f) return Schema(name=interface.__name__, *fields, **kw) + + +def createField(field, info=None): + if info is None: + info = getattr(field, '__typeInfo__', ('textline',)) + voc = (getattr(field, 'vocabulary', ()) or + getattr(field, 'vocabularyName', None)) + f = Field(field.getName(), + fieldType=info[0], + fieldTypeInfo=len(info) > 1 and info[1] or None, + required=field.required, + default=field.default, + default_method=getattr(field, 'default_method', None), + vocabulary=voc, + title=field.title, + description=field.description, + readonly=field.readonly, + #value_type=getattr(field, 'value_type', None), + nostore=getattr(field, 'nostore', False), + multiple=getattr(field, 'multiple', False), + baseField=field,) + return f diff --git a/composer/schema/grid/field.py b/composer/schema/grid/field.py index 7f88ccc..aca06b6 100644 --- a/composer/schema/grid/field.py +++ b/composer/schema/grid/field.py @@ -28,8 +28,63 @@ from zope.cachedescriptors.property import Lazy from zope.component import adapts import zope.schema +from cybertools.composer.schema.factory import createField +from cybertools.composer.schema.field import ListFieldInstance from cybertools.composer.schema.interfaces import IField, IFieldInstance from cybertools.composer.schema.interfaces import fieldTypes, undefined from cybertools.util.format import toStr, toUnicode +from cybertools.util import json +class GridFieldInstance(ListFieldInstance): + + @Lazy + def columnTypes(self): + return [createField(t) for t in self.context.baseField.column_types] + + @Lazy + def columnFieldInstances(self): + result = [] + for f in self.columnTypes: + instanceName = (f.instance_name or + f.getFieldTypeInfo().instanceName) + result.append(component.getAdapter(f, IFieldInstance, + name=instanceName)) + return result + + def marshall(self, value): + if isinstance(value, basestring): + return value + # TODO: marshall values! + v = value or [] + empty = {} + for fi in self.columnFieldInstances: + default = fi.default + if default is None: + default = '' + empty[fi.name] = str(default) + for i in range(3): + v.append(empty) + return json.dumps(dict(items=v)) + + def display(self, value): + headers = [fi.context.title for fi in self.columnFieldInstances] + rows = [] + for item in value or []: + row = [] + for fi in self.columnFieldInstances: + row.append(fi.display(item[fi.name])) + rows.append(row) + return dict(headers=headers, rows=rows) + + def unmarshall(self, value): + if not value: + return [] + result = [] + rows = json.loads(value)['items'] + for row in rows: + item = {} + for fi in self.columnFieldInstances: + item[fi.name] = fi.unmarshall(row[fi.name]) + result.append(item) + return result diff --git a/composer/schema/grid/grid_macros.pt b/composer/schema/grid/grid_macros.pt index 0bc2f49..b7db2da 100755 --- a/composer/schema/grid/grid_macros.pt +++ b/composer/schema/grid/grid_macros.pt @@ -3,7 +3,9 @@
-