add format interchange functions, add tests, fix stuff
This commit is contained in:
parent
6af5067fca
commit
8f86f76167
7 changed files with 298 additions and 146 deletions
|
@ -1,7 +1,10 @@
|
|||
import decimal, datetime
|
||||
import inspect
|
||||
from six import string_types
|
||||
from . import enums
|
||||
|
||||
def is_blank_space(val):
|
||||
return len(val.strip()) == 0
|
||||
|
||||
class ValidationError(Exception):
|
||||
def __init__(self, msg, field=None):
|
||||
|
@ -17,6 +20,7 @@ class ValidationError(Exception):
|
|||
|
||||
class Field(object):
|
||||
creation_counter = 0
|
||||
is_read_only = False
|
||||
|
||||
def __init__(self, name=None, max_length=0, required=True, uppercase=True, creation_counter=None):
|
||||
self.name = name
|
||||
|
@ -29,10 +33,10 @@ class Field(object):
|
|||
Field.creation_counter += 1
|
||||
|
||||
def validate(self):
|
||||
raise NotImplemented
|
||||
raise NotImplementedError
|
||||
|
||||
def get_data(self):
|
||||
raise NotImplemented
|
||||
raise NotImplementedError
|
||||
|
||||
def __setvalue(self, value):
|
||||
self._value = value
|
||||
|
@ -77,7 +81,7 @@ class Field(object):
|
|||
required=o['required'],
|
||||
)
|
||||
|
||||
if isinstance(o['value'], str) and re.match('^\d*\.\d*$', o['value']):
|
||||
if isinstance(o['value'], str) and re.match(r'^\d*\.\d*$', o['value']):
|
||||
o['value'] = decimal.Decimal(o['value'])
|
||||
|
||||
self.value = o['value']
|
||||
|
@ -164,9 +168,10 @@ class StateField(TextField):
|
|||
else:
|
||||
self.value = s
|
||||
|
||||
|
||||
class EmailField(TextField):
|
||||
def __init__(self, name=None, required=True, max_length=None):
|
||||
return super(EmailField, self).__init__(name=name, max_length=max_length,
|
||||
super(EmailField, self).__init__(name=name, max_length=max_length,
|
||||
required=required, uppercase=False)
|
||||
|
||||
class IntegerField(TextField):
|
||||
|
@ -183,7 +188,10 @@ class IntegerField(TextField):
|
|||
return value.zfill(self.max_length)[:self.max_length]
|
||||
|
||||
def parse(self, s):
|
||||
self.value = int(s)
|
||||
if not is_blank_space(s):
|
||||
self.value = int(s)
|
||||
else:
|
||||
self.value = 0
|
||||
|
||||
|
||||
class StaticField(TextField):
|
||||
|
@ -197,8 +205,10 @@ class StaticField(TextField):
|
|||
|
||||
|
||||
class BlankField(TextField):
|
||||
is_read_only = True
|
||||
|
||||
def __init__(self, name=None, max_length=0, required=False):
|
||||
super(TextField, self).__init__(name=name, max_length=max_length, required=required, uppercase=False)
|
||||
super(BlankField, self).__init__(name=name, max_length=max_length, required=required, uppercase=False)
|
||||
|
||||
def get_data(self):
|
||||
return b' ' * self.max_length
|
||||
|
@ -208,13 +218,17 @@ class BlankField(TextField):
|
|||
|
||||
|
||||
class ZeroField(BlankField):
|
||||
is_read_only = True
|
||||
|
||||
def get_data(self):
|
||||
return b'0' * self.max_length
|
||||
|
||||
|
||||
class CRLFField(TextField):
|
||||
is_read_only = True
|
||||
|
||||
def __init__(self, name=None, required=False):
|
||||
super(TextField, self).__init__(name=name, max_length=2, required=required, uppercase=False)
|
||||
super(CRLFField, self).__init__(name=name, max_length=2, required=required, uppercase=False)
|
||||
|
||||
def __setvalue(self, value):
|
||||
self._value = value
|
||||
|
@ -262,12 +276,27 @@ class MoneyField(Field):
|
|||
return formatted[:self.max_length]
|
||||
|
||||
def parse(self, s):
|
||||
self.value = decimal.Decimal(s) * decimal.Decimal('0.01')
|
||||
if not is_blank_space(s):
|
||||
self.value = decimal.Decimal(s) * decimal.Decimal('0.01')
|
||||
else:
|
||||
self.value = decimal.Decimal(0.0)
|
||||
|
||||
def __setvalue(self, value):
|
||||
new_value = value
|
||||
if isinstance(new_value, string_types):
|
||||
new_value = decimal.Decimal(new_value or '0')
|
||||
if '.' not in value: # must be cents?
|
||||
new_value *= decimal.Decimal('100.')
|
||||
self._value = new_value
|
||||
|
||||
def __getvalue(self):
|
||||
return self._value
|
||||
|
||||
value = property(__getvalue, __setvalue)
|
||||
|
||||
class DateField(TextField):
|
||||
def __init__(self, name=None, required=True, value=None):
|
||||
super(TextField, self).__init__(name=name, required=required, max_length=8)
|
||||
super(DateField, self).__init__(name=name, required=required, max_length=8)
|
||||
if value:
|
||||
self.value = value
|
||||
|
||||
|
@ -298,7 +327,7 @@ class DateField(TextField):
|
|||
|
||||
class MonthYearField(TextField):
|
||||
def __init__(self, name=None, required=True, value=None):
|
||||
super(TextField, self).__init__(name=name, required=required, max_length=6)
|
||||
super(MonthYearField, self).__init__(name=name, required=required, max_length=6)
|
||||
if value:
|
||||
self.value = value
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue