diff --git a/composer/report/result.py b/composer/report/result.py index 0bf3901..95db82b 100644 --- a/composer/report/result.py +++ b/composer/report/result.py @@ -42,9 +42,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..dcf169c 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', 'display', 'dropdown', 'email', + 'explanation', 'fileupload', 'float', '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..ed168c6 100644 --- a/composer/schema/factory.py +++ b/composer/schema/factory.py @@ -41,7 +41,7 @@ class Email(schema.TextLine): schema.Field.__typeInfo__ = ('textline',) schema.Password.__typeInfo__ = ('password',) schema.Int.__typeInfo__ = ('number',) -schema.Float.__typeInfo__ = ('number',) +schema.Float.__typeInfo__ = ('float',) schema.Choice.__typeInfo__ = ('dropdown',) @@ -56,13 +56,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: ('float',), schema.Bool: ('checkbox',), schema.List: ('list',), #schema.Choice: ('dropdown',), diff --git a/composer/schema/field.py b/composer/schema/field.py index 18d6243..d96b63d 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 FloatFieldInstance(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/interfaces.py b/composer/schema/interfaces.py index 9e3f809..04749cb 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('float', 'float', u'Float', + inputRenderer='input_textline', instanceName='float'), FieldType('date', 'date', u'Date', instanceName='date'), FieldType('email', 'email', u'E-Mail Address', displayRenderer='display_email', inputRenderer='input_textline',