add format interchange functions, add tests, fix stuff

This commit is contained in:
Mark Riedesel 2020-06-12 13:07:41 -05:00
parent 6af5067fca
commit 8f86f76167
7 changed files with 298 additions and 146 deletions

View file

@ -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