handle reference fields for keyed tables

This commit is contained in:
geomapdev
2017-04-20 10:21:16 -07:00
committed by GitHub
parent ad43249f61
commit 3292f760ca
+40 -5
View File
@@ -51,11 +51,29 @@ def _default_validators(db, field):
if hasattr(referenced, '_format') and referenced._format:
requires = validators.IS_IN_DB(db, referenced._id,
referenced._format)
if field.unique:
requires._and = validators.IS_NOT_IN_DB(db, field)
if field.tablename == field_type[10:]:
return validators.IS_EMPTY_OR(requires)
return requires
else:
requires = validators.IS_IN_DB(db, referenced._id)
if field.unique:
requires._and = validators.IS_NOT_IN_DB(db, field)
if field.tablename == field_type[10:]:
return validators.IS_EMPTY_OR(requires)
return requires
elif db and field_type.startswith('reference') and \
field_type.find('.') > 0 and \
field_type[10:].split('.')[0] in db.tables:
table_name=field_type[10:].split('.')[0]
field_name=field_type[10:].split('.')[1]
referenced = db[table_name]
if hasattr(referenced, '_format') and referenced._format:
requires = validators.IS_IN_DB(db, referenced[field_name],
referenced._format)
else:
requires = validators.IS_IN_DB(db, referenced[field_name])
if field.unique:
requires._and = validators.IS_NOT_IN_DB(db, field)
if field.tablename == table_name:
return validators.IS_EMPTY_OR(requires)
return requires
elif db and field_type.startswith('list:reference') and \
field_type.find('.') < 0 and \
field_type[15:] in db.tables:
@@ -71,6 +89,23 @@ def _default_validators(db, field):
if not field.notnull:
requires = validators.IS_EMPTY_OR(requires)
return requires
elif db and field_type.startswith('list:reference') and \
field_type.find('.') > 0 and \
field_type[15:].split('.')[0] in db.tables:
table_name=field_type[15:].split('.')[0]
field_name=field_type[15:].split('.')[1]
referenced = db[table_name]
if hasattr(referenced, '_format') and referenced._format:
requires = validators.IS_IN_DB(db, referenced[field_name],
referenced._format, multiple=True)
else:
requires = validators.IS_IN_DB(db, referenced[field_name],
multiple=True)
if field.unique:
requires._and = validators.IS_NOT_IN_DB(db, field)
if not field.notnull:
requires = validators.IS_EMPTY_OR(requires)
return requires
# does not get here for reference and list:reference
if field.unique:
requires.insert(0, validators.IS_NOT_IN_DB(db, field))