diff --git a/composer/report/result.py b/composer/report/result.py index 34db04e..1c15e94 100644 --- a/composer/report/result.py +++ b/composer/report/result.py @@ -43,9 +43,11 @@ class BaseRow(object): class Row(BaseRow): attributeHandlers = {} + cssClass = u'' def getRawValue(self, attr): - return self.attributeHandlers.get(attr, self.getContextAttr)(self, attr) + return self.attributeHandlers.get( + attr, self.getContextAttr)(self, attr) @staticmethod def getContextAttr(obj, attr): diff --git a/composer/schema/README.txt b/composer/schema/README.txt index a5579c6..96b84cd 100644 --- a/composer/schema/README.txt +++ b/composer/schema/README.txt @@ -49,9 +49,9 @@ Field types >>> from cybertools.composer.schema.interfaces import fieldTypes >>> sorted(t.token for t in fieldTypes) - ['checkbox', 'checkboxes', 'date', 'display', 'dropdown', 'email', 'explanation', - 'fileupload', 'heading', 'html', 'list', 'number', 'password', 'radiobuttons', - 'spacer', 'textarea', 'textline'] + ['checkbox', 'checkboxes', 'date', 'decimal', 'display', 'dropdown', + 'email', 'explanation', 'fileupload', 'heading', 'html', 'list', 'number', + 'password', 'radiobuttons', 'spacer', 'textarea', 'textline'] >>> from zope.schema.vocabulary import SimpleVocabulary >>> textFieldTypes = SimpleVocabulary([t for t in fieldTypes if t.token in diff --git a/composer/schema/factory.py b/composer/schema/factory.py index 465b147..31a231d 100644 --- a/composer/schema/factory.py +++ b/composer/schema/factory.py @@ -18,8 +18,6 @@ """ Schema factory stuff. - -$Id$ """ from zope.component import adapts @@ -41,7 +39,7 @@ class Email(schema.TextLine): schema.Field.__typeInfo__ = ('textline',) schema.Password.__typeInfo__ = ('password',) schema.Int.__typeInfo__ = ('number',) -schema.Float.__typeInfo__ = ('number',) +schema.Float.__typeInfo__ = ('decimal',) schema.Choice.__typeInfo__ = ('dropdown',) @@ -56,13 +54,13 @@ class SchemaFactory(object): fieldMapping = { #schema.TextLine: ('textline',), #schema.ASCIILine: ('textline',), - schema.Password: ('password',), + #schema.Password: ('password',), schema.Text: ('textarea',), schema.ASCII: ('textarea',), schema.Date: ('date',), schema.Datetime: ('date',), - schema.Int: ('number',), - schema.Float: ('number',), + #schema.Int: ('number',), + #schema.Float: ('decimal',), schema.Bool: ('checkbox',), schema.List: ('list',), #schema.Choice: ('dropdown',), diff --git a/composer/schema/field.py b/composer/schema/field.py index 18d6243..2d51988 100644 --- a/composer/schema/field.py +++ b/composer/schema/field.py @@ -24,6 +24,7 @@ from datetime import datetime from logging import getLogger from time import strptime, strftime from zope.app.form.browser.interfaces import ITerms +from zope.i18n.locales import locales from zope.interface import implements from zope.cachedescriptors.property import Lazy from zope.component import adapts @@ -262,6 +263,32 @@ class NumberFieldInstance(FieldInstance): self.setError('invalid_number') +class DecimalFieldInstance(NumberFieldInstance): + + format = 'decimal' + + def marshall(self, value): + return self.display(value, pattern=u'0.00;-0.00') + + def display(self, value, pattern=u'#,##0.00;-#,##0.00'): + if value is None: + return '' + view = self.clientInstance.view + langInfo = view and getattr(view, 'languageInfo', None) or None + if langInfo: + locale = locales.getLocale(langInfo.language) + fmt = locale.numbers.getFormatter(self.format) + return fmt.format(value, pattern=pattern) + return '%.2f' % value + + def unmarshall(self, value): + if not value: + return None + if ',' in value: + value = value.replace(',', '.') + return float(value) + + class DateFieldInstance(NumberFieldInstance): def marshall(self, value): diff --git a/composer/schema/grid/field.py b/composer/schema/grid/field.py index 9c93d7a..dd69c90 100644 --- a/composer/schema/grid/field.py +++ b/composer/schema/grid/field.py @@ -114,7 +114,7 @@ class GridFieldInstance(ListFieldInstance): def unmarshallRow(self, row): item = {} for fi in self.columnFieldInstances: - value = fi.unmarshall(row[fi.name]) + value = fi.unmarshall(row.get(fi.name) or u'') if isinstance(value, basestring): value = value.strip() if fi.default is not None: diff --git a/composer/schema/interfaces.py b/composer/schema/interfaces.py index 9e3f809..c55ad98 100644 --- a/composer/schema/interfaces.py +++ b/composer/schema/interfaces.py @@ -98,6 +98,8 @@ fieldTypes = SimpleVocabulary(( FieldType('html', 'html', u'HTML Text'), FieldType('number', 'number', u'Number', inputRenderer='input_textline', instanceName='number'), + FieldType('decimal', 'decimal', u'Decimal', + inputRenderer='input_textline', instanceName='decimal'), FieldType('date', 'date', u'Date', instanceName='date'), FieldType('email', 'email', u'E-Mail Address', displayRenderer='display_email', inputRenderer='input_textline',