Skip to content

Commit

Permalink
Merge pull request #83 from Relrin/hotfix-field-mapping-for-decimal-f…
Browse files Browse the repository at this point in the history
…ield

Fixed bug for extracting field kwargs for Decimal fields
  • Loading branch information
Relrin committed May 2, 2017
2 parents 8f390aa + 899c55c commit 83f2a45
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 8 deletions.
8 changes: 8 additions & 0 deletions aiorest_ws/db/orm/sqlalchemy/field_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ def get_field_kwargs(field_name, model_field, model_class):
# Gets removed for everything else
kwargs['model_field'] = model_field

max_digits = getattr(model_field.type, 'precision', None)
if max_digits is not None:
kwargs['max_digits'] = max_digits

decimal_places = getattr(model_field.type, 'scale', None)
if decimal_places is not None:
kwargs['decimal_places'] = decimal_places

if model_field.primary_key:
# If this field is read-only, then return early.
# Further keyword arguments are not valid
Expand Down
54 changes: 46 additions & 8 deletions tests/db/orm/sqlalchemy/test_field_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from tests.db.orm.sqlalchemy.base import Base, SQLAlchemyUnitTest
from tests.fixtures.sqlalchemy import SESSION

from sqlalchemy import Column, Integer, String, Enum, ForeignKey
from sqlalchemy import Column, Integer, String, Enum, ForeignKey, Numeric
from sqlalchemy.orm import validates


Expand Down Expand Up @@ -50,6 +50,7 @@ class TestGetFieldKwargsModel(Base):
address = Column(String(50), nullable=True)
email = Column(String(50), unique=True)
gender = Column(Enum(*('male', 'female')))
salary = Column(Numeric(5, 2), default=0)

@validates('email')
def validate_email(self, key, address):
Expand All @@ -67,26 +68,31 @@ def setUpClass(cls):
username='Adam',
address='UK, London',
email='adam@mail.com',
gender='male'
gender='male',
salary=100.00
),
cls.TestGetFieldKwargsModel(
username='Bob',
address='USA, CA, San Francisco',
email='bob@mail.com',
gender='male'
gender='male',
salary=123.56
),
cls.TestGetFieldKwargsModel(
username='Alexandra',
address=None,
email='alexandra@mail.com',
gender='female'
gender='female',
salary=999.99
),
])
session.commit()

def test_get_field_kwargs_for_primary_key_field(self):
field_kwargs = get_field_kwargs(
'id', self.TestGetFieldKwargsModel.id, self.TestGetFieldKwargsModel
'id',
self.TestGetFieldKwargsModel.id,
self.TestGetFieldKwargsModel
)

self.assertEqual(
Expand All @@ -101,7 +107,8 @@ def test_get_field_kwargs_for_primary_key_field(self):

def test_get_field_kwargs_for_nullable_field(self):
field_kwargs = get_field_kwargs(
'address', self.TestGetFieldKwargsModel.address,
'address',
self.TestGetFieldKwargsModel.address,
self.TestGetFieldKwargsModel
)

Expand All @@ -123,7 +130,8 @@ def test_get_field_kwargs_for_nullable_field(self):

def test_get_field_kwargs_for_unique_and_validated_field(self):
field_kwargs = get_field_kwargs(
'email', self.TestGetFieldKwargsModel.email,
'email',
self.TestGetFieldKwargsModel.email,
self.TestGetFieldKwargsModel
)

Expand All @@ -146,7 +154,8 @@ def test_get_field_kwargs_for_unique_and_validated_field(self):

def test_get_field_kwargs_for_enum_field(self):
field_kwargs = get_field_kwargs(
'gender', self.TestGetFieldKwargsModel.gender,
'gender',
self.TestGetFieldKwargsModel.gender,
self.TestGetFieldKwargsModel
)

Expand All @@ -166,6 +175,35 @@ def test_get_field_kwargs_for_enum_field(self):
)
self.assertEqual(set(field_kwargs['choices']), {'male', 'female'})

def test_get_field_kwargs_for_decimal_field(self):
field_kwargs = get_field_kwargs(
'salary',
self.TestGetFieldKwargsModel.salary,
self.TestGetFieldKwargsModel
)

self.assertEqual(
set(field_kwargs.keys()),
set([
'model_field', 'max_digits', 'decimal_places',
'required', 'allow_null'
])
)
self.assertTrue(field_kwargs['allow_null'])
self.assertFalse(field_kwargs['required'])
self.assertEqual(
field_kwargs['max_digits'],
self.TestGetFieldKwargsModel.salary.type.precision
)
self.assertEqual(
field_kwargs['decimal_places'],
self.TestGetFieldKwargsModel.salary.type.scale,
)
self.assertEqual(
field_kwargs['model_field'],
self.TestGetFieldKwargsModel.salary
)


class TestGetRelationKwargs(unittest.TestCase):

Expand Down

0 comments on commit 83f2a45

Please sign in to comment.