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.

Reply via email to