If I take out common_filter=lambda query: db.bank.company_id == get_default_company_id() from the table definition, everthing works just fine.
On Saturday, 23 January 2016 18:10:54 UTC, Seraaj Muneer wrote: > > To be clear, I didn't insert the last line > > response <http://127.0.0.1:8000/examples/global/vars/response>._vars=response > <http://127.0.0.1:8000/examples/global/vars/response>._caller(banks) > > > in the controller. Web2py did that. > > > On Saturday, 23 January 2016 18:06:23 UTC, Seraaj Muneer wrote: >> >> Unfortunately refactoring to >> >> db.define_table('company', >> Field('name', 'string', length=20, represent=lambda name, >> row: name.upper(), >> required=True, >> unique=True, notnull=True, >> >> ), >> >> Field('is_default', 'boolean', label=T('Default Company'), >> default=False), >> address, >> auth.signature, common_filter=lambda query: >> db.company.created_by == auth.user_id, >> format=lambda r: r.name.upper() or 'No name company') >> db.company.name.requires = [IS_NOT_EMPTY(error_message='You must enter a >> company name'), >> IS_MATCH('^[a-zA-Z0-9][a-zA-Z0-9 ,-.]*$'), >> IS_NOT_IN_DB(db, db.company.name, >> error_message='This company name is in use')] >> >> def set_all_default_company_to_false(fields): >> if fields.get('is_default'): >> rows = db(db.auth_user.id == auth.user_id).select(db.auth_user.ALL) >> for row in rows: >> for company in row.company.select(db.company.id, >> db.company.is_default): >> if company.is_default: >> db(db.company.id == company.id).update(is_default=False) >> >> >> db.company._before_insert.append(lambda f: >> set_all_default_company_to_false(f)) >> db.company._before_update.append(lambda s, f: >> set_all_default_company_to_false(f)) >> >> >> def get_default_company_id(): >> rows = db(db.auth_user.id == auth.user_id).select(db.auth_user.ALL) >> for row in rows: >> for company in row.company.select(db.company.id, >> db.company.is_default): >> if company.is_default: >> return company.id >> >> >> db.define_table('bank', Field('bank_name', 'string', length=25, >> represent=lambda bank_name, row: bank_name.upper(), >> required=True, >> unique=True, notnull=True, >> ), >> Field('default_branch', 'string', default='', length=25, >> requires=[IS_EMPTY_OR(IS_MATCH('^[a-zA-Z][a-zA-Z >> ]*$'))]), >> Field(company_id_field, 'reference company', notnull=True, >> default=get_default_company_id(), >> ondelete=on_delete_cascade, >> writable=False, readable=False), >> >> auth.signature, common_filter=lambda query: >> db.bank.company_id == get_default_company_id(), >> format=lambda r: r.bank_name or 'No bank name!') >> db.bank.bank_name.requires = [IS_NOT_EMPTY(error_message='You must enter a >> bank name'), >> IS_MATCH('^[a-zA-Z][a-zA-Z ]*$', >> error_message='Bank name can only >> contain alphabets (A-Z)'), >> IS_NOT_IN_DB(db, db.bank.bank_name, >> error_message='Bank name must be unique.')] >> >> >> returns me back to the mysterious >> >> <type 'exceptions.KeyError'>Version >> >> with this traceback >> >> 1. >> 2. >> 3. >> 4. >> 5. >> 6. >> 7. >> 8. >> 9. >> 10. >> 11. >> 12. >> 13. >> 14. >> 15. >> 16. >> 17. >> 18. >> >> Traceback (most recent call last): >> File "/home/seeraj/PycharmProjects/payroll/web2py/gluon/restricted.py", >> line 227, in restricted >> exec ccode in environment >> File >> "/home/seeraj/PycharmProjects/payroll/web2py/applications/payroll/controllers/bank.py" >> <http://127.0.0.1:8000/admin/default/edit/payroll/controllers/bank.py>, >> line 18, in <module> >> File "/home/seeraj/PycharmProjects/payroll/web2py/gluon/globals.py", line >> 412, in <lambda> >> self._caller = lambda f: f() >> File "/home/seeraj/PycharmProjects/payroll/web2py/gluon/tools.py", line >> 4236, in f >> return action(*a, **b) >> File >> "/home/seeraj/PycharmProjects/payroll/web2py/applications/payroll/controllers/bank.py" >> <http://127.0.0.1:8000/admin/default/edit/payroll/controllers/bank.py>, >> line 4, in banks >> grid = SQLFORM.smartgrid(db.bank) >> File "/home/seeraj/PycharmProjects/payroll/web2py/gluon/sqlhtml.py", line >> 3056, in smartgrid >> user_signature=user_signature, **kwargs) >> File "/home/seeraj/PycharmProjects/payroll/web2py/gluon/sqlhtml.py", line >> 2721, in grid >> value = row[str(field)] >> File >> "/home/seeraj/PycharmProjects/payroll/web2py/gluon/packages/dal/pydal/objects.py", >> line 76, in __getitem__ >> raise KeyError >> KeyError >> >> >> 1. >> 2. >> 3. >> 4. >> 5. >> 6. >> 7. >> 8. >> 9. >> 10. >> 11. >> 12. >> 13. >> 14. >> 15. >> 16. >> 17. >> 18. >> 19. >> >> @auth.requires_login() >> def banks(): >> not db(db.company.created_by == auth.user_id).isempty() or redirect >> <http://127.0.0.1:8000/examples/global/vars/redirect>(URL >> <http://127.0.0.1:8000/examples/global/vars/URL>('company', 'create')) >> grid = SQLFORM >> <http://127.0.0.1:8000/examples/global/vars/SQLFORM>.smartgrid(db.bank) >> return dict(grid=grid) >> >> >> @auth.requires_login() >> def create(): >> not db(db.company.created_by == auth.user_id).isempty() or redirect >> <http://127.0.0.1:8000/examples/global/vars/redirect>(URL >> <http://127.0.0.1:8000/examples/global/vars/URL>('company', 'create')) >> form = SQLFORM >> <http://127.0.0.1:8000/examples/global/vars/SQLFORM>(db.bank) >> if form.process().accepted: >> response <http://127.0.0.1:8000/examples/global/vars/response>.flash >> = 'Bank saved successfully' >> else: >> response <http://127.0.0.1:8000/examples/global/vars/response>.flash >> = 'Use the form to create a new bank' >> return dict(form=form) >> >> response >> <http://127.0.0.1:8000/examples/global/vars/response>._vars=response >> <http://127.0.0.1:8000/examples/global/vars/response>._caller(banks) >> >> web2py™ Version 2.13.4-stable+timestamp.2015.12.26.04.59.39On Saturday, >> 23 January 2016 16:11:57 UTC, Anthony wrote: >>> >>> On Saturday, January 23, 2016 at 1:22:52 AM UTC-5, Seraaj Muneer wrote: >>>> >>>> It appears that placing the 'common_filter' in the table definition >>>> together with the speical field 'request_tenant' is problematic. However, >>>> doing >>>> >>>> >>>> db.bank.common_filter = lambda query: db.bank.company_id == >>>> get_default_company_id() >>>> >>>> >>>> >>>> >>>> >>> This shouldn't make a difference, nor do I think it should be a problem >>> to use both request_tentant and common_filter together. Above, you have >>> specified db.bank.common_filter rather than db.bank._common_filter, so your >>> above code isn't actually implementing a filter at all. >>> >>> Note, your combination of request_tenant and common_filter requires that >>> there are records where request_tentant matches auth.user_id *and* >>> company_id >>> matches the value returned by get_default_company_id. Is it possible that >>> there are simply no records that meet those two conditions? >>> >>> Also, why bother with request_tenant here at all? You've already got >>> auth.signature in the table definition, and setting request_tenant equal to >>> auth.user_id is equivalent to applying a filter where created_by (or >>> modified_by) is equal to auth.user_id. So you could just add that to your >>> common filter. >>> >>> Finally, you can get rid of your _before_insert callback and instead >>> simply set the default value of the company_id field directly: >>> >>> Field(company_id_field, 'reference company', default= >>> get_default_company_id()) >>> >>> Anthony >>> >> -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.