nice tip. thanks for sharing!
On Jan 29, 1:51 pm, guruyaya <[email protected]> wrote: > 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 <[email protected]> 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

