This is the new code:

from gluon.fileutils import check_credentials
db.auth_group._common_filter=lambda query: \
  (db.auth_group.org==session.org) *or check_credentials(request)*

I have tested check_credentials(request): it returns True - good!
But - sorry! -  it did not solve the problem:

   - Let's say I have 100 auth_group rows with org==1 and 100 auth_group
   rows with org==2
   - The admin application tells me "100 selected", but I can *see all
200*rows.
   - I have tried to change one record. I can open this row, change any
   field and submit it.
   - I get the flash "*Done*" But nothing has happened - the old values are
   in the table.

About the message "value not in database": my fault - a wrong
db.auth_group.org.requires
somewhere in the model.

2012/8/21 Massimo Di Pierro <[email protected]>

> Apologies
>
> check_credentials(request)
>
> instead of
>
> check_credentials('admin')
>
>
> On Monday, 20 August 2012 14:33:55 UTC-5, mweissen wrote:
>
>> A little bit more code:
>>
>> db.define_table('org',
>>     Field('orgnr',
>>     Field(shortname',
>>         length=20,
>>         requires=IS_LENGTH(maxsize=20,**minsize=3)),
>>     ...
>>     )
>>
>>
>> auth.settings.extra_fields['**auth_group']=[
>>     Field('org','reference org',
>>         default=lambda: session.org,
>>         requires=IS_IN_DB(db, 'org.id', '%(shortname)s',
>>           error_message=T('Not allowed')),
>>       ),...
>>
>> from gluon.fileutils import check_credentials
>>
>> db.auth_group._common_filter=**lambda query:
>>   (db.auth_group.org==session.**org <http://session.org>) or
>> check_credentials('admin')
>>
>>
>>
>> Now I am using the admin interface and I try to change one row of
>> auth_group. The same result as before (without
>> check_credentials('admin'))
>>
>>    - The value of auth_group.org==1.
>>    - The error messae is "value not in database"
>>    - And, of course, there is a record in db.org with db.org.id==1
>>
>> To learn more about check_credentials I added:
>>
>> if check_credentials('admin'): print 'Admin'
>>
>> Only for the test.
>>
>> And I get a new error message:
>>
>> 127.0.0.1.2012-08-20.21-05-04.**43dc8360-a22d-408d-8889-**00fe62ef4a38
>> <type 'exceptions.AttributeError'> 'str' object has no attribute 'env'
>> Version  web2py™ (2, 0, 0, datetime.datetime(2012, 8, 9, 8, 57, 54),
>> 'dev')  Python Python 2.7.2: D:\Python27\python.exe  Traceback
>>
>>
>> 1.
>> 2.
>> 3.
>> 4.
>> 5.
>> 6.
>> 7.
>> 8.
>> 9.
>>
>>
>> Traceback (most recent call last):
>>   File "D:\...\web2py\gluon\**restricted.py", line 205, in restricted
>>
>>
>>
>>
>>     exec ccode in environment
>>   File "D:/.../web2py/applications/**secure/models/db.py" 
>> <http://127.0.0.1:8000/admin/default/edit/secure/models/db.py>, line 389, in 
>> <module>
>>
>>
>>
>>
>>     if check_credentials('admin'): print 'Admin'
>>
>>
>>
>>
>>   File "D:\...\web2py\gluon\**fileutils.py", line 328, in check_credentials
>>
>>
>>
>>
>>     if request.env.web2py_runtime_gae**:
>>
>>
>>
>> AttributeError: 'str' object has no attribute 'env'
>>
>>
>>
>> 2012/8/20 Massimo Di Pierro <[email protected]>
>>
>> You can do:
>>>
>>> db.define_table(...., common_filter = None if not session.org else
>>> (lambda query:(db.my_table.org==sessio**n.org <http://session.org/>)))
>>>
>>> you can also use the check:
>>>
>>> from gluon.fileutils import check_credentials
>>> check_credentials('admin') #returns true if you are logged as admin.
>>>
>>>
>>> On Monday, 20 August 2012 12:48:29 UTC-5, mweissen wrote:
>>>
>>>> (1) session.org will be set with the login. But I am an administrator:
>>>>  I think I should use the admin application without a login to the
>>>> application itself.
>>>>
>>>> (2) Lets say session.org==1: now it is not possible to change a record
>>>> with my_table.org==2 using the admin app.
>>>>
>>>> (3) Did you mean:
>>>>
>>>> common_filter = lambda query:
>>>>   (db.my_table.org==session.org)**** if session.org else True
>>>>
>>>>
>>>> Interesting idea!
>>>>
>>>> 2012/8/20 Massimo Di Pierro <[email protected]>
>>>>
>>>> How do you set the common filter? Seems to me if session.org is not
>>>>> set, the common filter should not be set. web2py cannot ignore it because
>>>>> it does the wrong thing.
>>>>>
>>>>>
>>>>> On Monday, 20 August 2012 11:41:41 UTC-5, mweissen wrote:
>>>>>>
>>>>>> I have an application which should be used by some organizations.
>>>>>> Therefore I have added
>>>>>>
>>>>>> Field('org','reference org', default=lambda:session.org),
>>>>>>
>>>>>> and
>>>>>>
>>>>>> common_filter = lambda query: db.my_table.org==session.org
>>>>>>
>>>>>> to my_table. session.org contails the id of the respective
>>>>>> organization.
>>>>>> Great feature,works fine! But using the database administration of
>>>>>> the admin-application the common filter is still active.
>>>>>> There is an "ignore_rw=True" in the admin application and I think I
>>>>>> have read somewhere that there is also an "ignore_common_filters=True
>>>>>> ".
>>>>>>
>>>>>> If session.org is not set, a "database db select" shows strange
>>>>>> effects:
>>>>>>
>>>>>>    - I can see the first 100 rows.
>>>>>>    - But the message is "0 selected"
>>>>>>    - It is not possible to Update a record
>>>>>>
>>>>>>
>>>>>> A simple "ignore_common_filters=True" at the appropriate location
>>>>>> should solve the problem. I have taken a quick look at the code, but I
>>>>>> think this statement has to be "very inside", therefore I have no 
>>>>>> concrete
>>>>>> proposal.
>>>>>>
>>>>>> Regards, Martin
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>  --
>>>>>
>>>>   --
>>>
>>>
>>>
>>  --
>
>
>

-- 



Reply via email to