I wrote this function, to help out with a project I'm working on, that
has an extensive use of the common filter functionality (describes in
chapter 6 of the web2py book).
Say you have a blog, containing active, and inactive posts:
db.define_table('post',
Field('subject'),
Field('post','text'),
Field('is_active','boolean'),
common_filter = lambda query: db.post.is_active == True
)
And we have comments on posts:
db.define_table('comment',
Field('post',db.post),
Field('comment','text')
)
Running db(db.comment.id > 0).select(), will select all comments,
including those posts where is_active is False.
Solution:
use this function in a model, module, whatever:
def inherit_common_filter(db, col):
''' gets the common filter of a field refrenced
'''
ref_table_name = col.type.replace('reference ', '')
ref_table = db[ref_table_name]
ref_table_filter = ref_table._common_filter
return lambda query:
col.belongs(db(ref_table_filter(query))._select(ref_table.id))
Now, the new model looks like:
db.define_table('comment',
Field('post',db.post),
Field('comment','text')
)
db.comment._common_filter = inherit_common_filter(db, db.comment)
Now Running db(db.comment.id > 0).select(), will select all comments
that are set to is_active == True.
Hope you'll find this useful