Add custom widget for "percent" field

so that storage can use "traditional" (0.3612) format but UI can use
"human-friendly" format (36.12 %)
This commit is contained in:
Lance Edgar 2019-01-08 12:18:48 -06:00
parent 7bf509097f
commit d659e62fda
2 changed files with 57 additions and 2 deletions

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2018 Lance Edgar
# Copyright © 2010-2019 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,10 +24,11 @@
Form Widgets
"""
from __future__ import unicode_literals, absolute_import
from __future__ import unicode_literals, absolute_import, division
import json
import datetime
import decimal
import six
@ -55,6 +56,35 @@ class NumberInputWidget(dfwidget.TextInputWidget):
autocomplete = 'off'
class PercentInputWidget(dfwidget.TextInputWidget):
"""
Custom text input widget, used for "percent" type fields. This widget
assumes that the underlying storage for the value is a "traditional"
percent value, e.g. ``0.36135`` - but the UI should represent this as a
"human-friendly" value, e.g. ``36.135 %``.
"""
template = 'percentinput'
autocomplete = 'off'
def serialize(self, field, cstruct, **kw):
if cstruct not in (colander.null, None):
# convert "traditional" value to "human-friendly"
value = decimal.Decimal(cstruct) * 100
value = value.quantize(decimal.Decimal('0.001'))
cstruct = six.text_type(value)
return super(PercentInputWidget, self).serialize(field, cstruct, **kw)
def deserialize(self, field, pstruct):
pstruct = super(PercentInputWidget, self).deserialize(field, pstruct)
if pstruct is colander.null:
return colander.null
# convert "human-friendly" value to "traditional"
value = decimal.Decimal(pstruct)
value = value.quantize(decimal.Decimal('0.00001'))
value /= 100
return six.text_type(value)
class PlainSelectWidget(dfwidget.SelectWidget):
template = 'select_plain'