Merge pull request #1293 from leonelcamara/fix_1266

fixes #1266 and adds tests to make sure it doesn't happen again
This commit is contained in:
mdipierro
2016-04-13 22:15:53 -05:00
2 changed files with 42 additions and 26 deletions
+12
View File
@@ -232,7 +232,19 @@ class TestValidators(unittest.TestCase):
self.assertEqual(sorted(rtn), [('%d' % george_id, 'george'), ('%d' % costanza_id, 'costanza')]) self.assertEqual(sorted(rtn), [('%d' % george_id, 'george'), ('%d' % costanza_id, 'costanza')])
rtn = IS_IN_DB(db, db.person.id, db.person.name, error_message='oops', sort=True).options(zero=True) rtn = IS_IN_DB(db, db.person.id, db.person.name, error_message='oops', sort=True).options(zero=True)
self.assertEqual(rtn, [('', ''), ('%d' % costanza_id, 'costanza'), ('%d' % george_id, 'george')]) self.assertEqual(rtn, [('', ''), ('%d' % costanza_id, 'costanza'), ('%d' % george_id, 'george')])
# Test it works with self reference
db.define_table('category',
Field('parent_id', 'reference category', requires=IS_EMPTY_OR(IS_IN_DB(db, 'category.id', '%(name)s'))),
Field('name')
)
ret = db.category.validate_and_insert(name='seinfeld')
self.assertFalse(list(ret.errors))
ret = db.category.validate_and_insert(name='characters', parent_id=ret.id)
self.assertFalse(list(ret.errors))
rtn = IS_IN_DB(db, 'category.id', '%(name)s')(ret.id)
self.assertEqual(rtn, (ret.id, None))
db.person.drop() db.person.drop()
db.category.drop()
def test_IS_NOT_IN_DB(self): def test_IS_NOT_IN_DB(self):
from gluon.dal import DAL, Field from gluon.dal import DAL, Field
+10 -6
View File
@@ -459,7 +459,7 @@ class IS_IN_SET(Validator):
def __call__(self, value): def __call__(self, value):
if self.multiple: if self.multiple:
### if below was values = re.compile("[\w\-:]+").findall(str(value)) # if below was values = re.compile("[\w\-:]+").findall(str(value))
if not value: if not value:
values = [] values = []
elif isinstance(value, (tuple, list)): elif isinstance(value, (tuple, list)):
@@ -523,8 +523,8 @@ class IS_IN_DB(Validator):
field = field._id field = field._id
elif isinstance(field, str): elif isinstance(field, str):
items = field.split('.') items = field.split('.')
if len(items)==1: items+=['id'] if len(items) == 1:
field = self.dbset.db[items[0]][items[1]] field = items[0] + '.id'
(ktable, kfield) = str(field).split('.') (ktable, kfield) = str(field).split('.')
if not label: if not label:
@@ -542,7 +542,7 @@ class IS_IN_DB(Validator):
fieldnames = '*' fieldnames = '*'
else: else:
raise NotImplementedError raise NotImplementedError
self.field = field # the lookup field
self.fieldnames = fieldnames # fields requires to build the formatting self.fieldnames = fieldnames # fields requires to build the formatting
self.label = label self.label = label
self.ktable = ktable self.ktable = ktable
@@ -627,7 +627,7 @@ class IS_IN_DB(Validator):
else: else:
values = [] values = []
if self.field.type in ('id','integer'): if field.type in ('id', 'integer'):
new_values = [] new_values = []
for value in values: for value in values:
if not (isinstance(value, (int, long)) or value.isdigit()): if not (isinstance(value, (int, long)) or value.isdigit()):
@@ -657,7 +657,7 @@ class IS_IN_DB(Validator):
elif count(values) == len(values): elif count(values) == len(values):
return (values, None) return (values, None)
else: else:
if self.field.type in ('id','integer'): if field.type in ('id', 'integer'):
if isinstance(value, (int, long)) or value.isdigit(): if isinstance(value, (int, long)) or value.isdigit():
value = int(value) value = int(value)
elif self.auto_add: elif self.auto_add:
@@ -2347,6 +2347,7 @@ class IS_DATE_IN_RANGE(IS_DATE):
(datetime.date(2010, 3, 3), 'oops') (datetime.date(2010, 3, 3), 'oops')
""" """
def __init__(self, def __init__(self,
minimum=None, minimum=None,
maximum=None, maximum=None,
@@ -2400,6 +2401,7 @@ class IS_DATETIME_IN_RANGE(IS_DATETIME):
(datetime.datetime(2010, 3, 3, 0, 0), 'oops') (datetime.datetime(2010, 3, 3, 0, 0), 'oops')
""" """
def __init__(self, def __init__(self,
minimum=None, minimum=None,
maximum=None, maximum=None,
@@ -2705,6 +2707,7 @@ class LazyCrypt(object):
""" """
Stores a lazy password hash Stores a lazy password hash
""" """
def __init__(self, crypt, password): def __init__(self, crypt, password):
""" """
crypt is an instance of the CRYPT validator, crypt is an instance of the CRYPT validator,
@@ -3695,6 +3698,7 @@ class IS_IPADDRESS(Validator):
>>> IS_IPADDRESS(subnets='invalidsubnet')('2001::8ffa:fe22:b3af') >>> IS_IPADDRESS(subnets='invalidsubnet')('2001::8ffa:fe22:b3af')
('2001::8ffa:fe22:b3af', 'invalid subnet provided') ('2001::8ffa:fe22:b3af', 'invalid subnet provided')
""" """
def __init__( def __init__(
self, self,
minip='0.0.0.0', minip='0.0.0.0',