I've made a mistake in my tip, please replace: db.comment._common_filter = inherit_common_filter(db, db.comment) with: db.comment._common_filter = inherit_common_filter(db, db.comment.post)
Sorry for this one. On Jan 29, 10:46 am, guruyaya <guruy...@gmail.com> wrote: > 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