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:
@@ -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
@@ -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',
|
||||||
|
|||||||
Reference in New Issue
Block a user