diff --git a/gluon/tests/test_validators.py b/gluon/tests/test_validators.py index 34e8b09d..96123ea8 100644 --- a/gluon/tests/test_validators.py +++ b/gluon/tests/test_validators.py @@ -232,7 +232,19 @@ class TestValidators(unittest.TestCase): 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) 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.category.drop() def test_IS_NOT_IN_DB(self): from gluon.dal import DAL, Field diff --git a/gluon/validators.py b/gluon/validators.py index 050c3a9c..21a60e23 100644 --- a/gluon/validators.py +++ b/gluon/validators.py @@ -523,8 +523,8 @@ class IS_IN_DB(Validator): field = field._id elif isinstance(field, str): items = field.split('.') - if len(items)==1: items+=['id'] - field = self.dbset.db[items[0]][items[1]] + if len(items)==1: + field = items[0] + '.id' (ktable, kfield) = str(field).split('.') if not label: @@ -542,7 +542,7 @@ class IS_IN_DB(Validator): fieldnames = '*' else: raise NotImplementedError - self.field = field # the lookup field + self.fieldnames = fieldnames # fields requires to build the formatting self.label = label self.ktable = ktable @@ -627,7 +627,7 @@ class IS_IN_DB(Validator): else: values = [] - if self.field.type in ('id','integer'): + if field.type in ('id','integer'): new_values = [] for value in values: if not (isinstance(value,(int,long)) or value.isdigit()): @@ -657,7 +657,7 @@ class IS_IN_DB(Validator): elif count(values) == len(values): return (values, None) else: - if self.field.type in ('id','integer'): + if field.type in ('id','integer'): if isinstance(value,(int,long)) or value.isdigit(): value = int(value) elif self.auto_add: