Commit 67e1da5a authored by Serge S. Koval's avatar Serge S. Koval

Merge pull request #1155 from pawl/fix_1141

SQLA - Use database defaults for number of decimal places in DecimalFields
parents f6a0348b b3db9b7d
...@@ -270,7 +270,7 @@ class AdminModelConverter(ModelConverterBase): ...@@ -270,7 +270,7 @@ class AdminModelConverter(ModelConverterBase):
if column.type.length: if column.type.length:
field_args['validators'].append(validators.Length(max=column.type.length)) field_args['validators'].append(validators.Length(max=column.type.length))
@converts('String', 'Unicode') @converts('String') # includes VARCHAR, CHAR, and Unicode
def conv_String(self, column, field_args, **extra): def conv_String(self, column, field_args, **extra):
if hasattr(column.type, 'enums'): if hasattr(column.type, 'enums'):
accepted_values = list(column.type.enums) accepted_values = list(column.type.enums)
...@@ -293,8 +293,7 @@ class AdminModelConverter(ModelConverterBase): ...@@ -293,8 +293,7 @@ class AdminModelConverter(ModelConverterBase):
self._string_common(column=column, field_args=field_args, **extra) self._string_common(column=column, field_args=field_args, **extra)
return fields.StringField(**field_args) return fields.StringField(**field_args)
@converts('Text', 'UnicodeText', @converts('Text', 'LargeBinary', 'Binary') # includes UnicodeText
'sqlalchemy.types.LargeBinary', 'sqlalchemy.types.Binary')
def conv_Text(self, field_args, **extra): def conv_Text(self, field_args, **extra):
self._string_common(field_args=field_args, **extra) self._string_common(field_args=field_args, **extra)
return fields.TextAreaField(**field_args) return fields.TextAreaField(**field_args)
...@@ -308,7 +307,7 @@ class AdminModelConverter(ModelConverterBase): ...@@ -308,7 +307,7 @@ class AdminModelConverter(ModelConverterBase):
field_args['widget'] = form.DatePickerWidget() field_args['widget'] = form.DatePickerWidget()
return fields.DateField(**field_args) return fields.DateField(**field_args)
@converts('DateTime') @converts('DateTime') # includes TIMESTAMP
def convert_datetime(self, field_args, **extra): def convert_datetime(self, field_args, **extra):
return form.DateTimeField(**field_args) return form.DateTimeField(**field_args)
...@@ -316,40 +315,32 @@ class AdminModelConverter(ModelConverterBase): ...@@ -316,40 +315,32 @@ class AdminModelConverter(ModelConverterBase):
def convert_time(self, field_args, **extra): def convert_time(self, field_args, **extra):
return form.TimeField(**field_args) return form.TimeField(**field_args)
@converts('Integer', 'SmallInteger') @converts('Integer') # includes BigInteger and SmallInteger
def handle_integer_types(self, column, field_args, **extra): def handle_integer_types(self, column, field_args, **extra):
unsigned = getattr(column.type, 'unsigned', False) unsigned = getattr(column.type, 'unsigned', False)
if unsigned: if unsigned:
field_args['validators'].append(validators.NumberRange(min=0)) field_args['validators'].append(validators.NumberRange(min=0))
return fields.IntegerField(**field_args) return fields.IntegerField(**field_args)
@converts('Numeric', 'Float') @converts('Numeric') # includes DECIMAL, Float/FLOAT, REAL, and DOUBLE
def handle_decimal_types(self, column, field_args, **extra): def handle_decimal_types(self, column, field_args, **extra):
places = getattr(column.type, 'scale', 2) # override default decimal places limit, use database defaults instead
if places is not None: field_args.setdefault('places', None)
field_args['places'] = places
return fields.DecimalField(**field_args) return fields.DecimalField(**field_args)
@converts('databases.mysql.MSYear') @converts('sqlalchemy.dialects.postgresql.base.INET')
def conv_MSYear(self, field_args, **extra):
field_args['validators'].append(validators.NumberRange(min=1901, max=2155))
return fields.StringField(**field_args)
@converts('sqlalchemy.dialects.postgresql.base.INET',
'databases.postgres.PGInet', 'dialects.postgresql.base.INET')
def conv_PGInet(self, field_args, **extra): def conv_PGInet(self, field_args, **extra):
field_args.setdefault('label', u'IP Address') field_args.setdefault('label', u'IP Address')
field_args['validators'].append(validators.IPAddress()) field_args['validators'].append(validators.IPAddress())
return fields.StringField(**field_args) return fields.StringField(**field_args)
@converts('sqlalchemy.dialects.postgresql.base.MACADDR', @converts('sqlalchemy.dialects.postgresql.base.MACADDR')
'dialects.postgresql.base.MACADDR')
def conv_PGMacaddr(self, field_args, **extra): def conv_PGMacaddr(self, field_args, **extra):
field_args.setdefault('label', u'MAC Address') field_args.setdefault('label', u'MAC Address')
field_args['validators'].append(validators.MacAddress()) field_args['validators'].append(validators.MacAddress())
return fields.StringField(**field_args) return fields.StringField(**field_args)
@converts('dialects.postgresql.base.UUID') @converts('sqlalchemy.dialects.postgresql.base.UUID')
def conv_PGUuid(self, field_args, **extra): def conv_PGUuid(self, field_args, **extra):
field_args.setdefault('label', u'UUID') field_args.setdefault('label', u'UUID')
field_args['validators'].append(validators.UUID()) field_args['validators'].append(validators.UUID())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment