Maybe I can say it in other words:

(1) If I am normal user, I should only see "my" part of the table and I can
work with it.
This is perfectly assured by
db.auth_group._common_filter=**lambda query: (db.auth_group.org==session.**
org <http://session.org/>)

(2) If I am the admin and if I use the admin application I want to see all
whole tables and of course I want to have the right to edit all tables with
common filters, independent of the value of session.org.

Or, more simple: an admin (using the admin application) has access to all
tables and all fields.
ignore_rw does it for the readonly/writonly attribute and the same should
be done with ignore_common_filters

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

> I think you want:
>
> from gluon.fileutils import check_credentials
> if not *check_credentials(request):*
> *       if not session.org: redirect('some_error_page')
> *   db.auth_group._common_filter=**lambda query: (db.auth_group.org==
> session.**org <http://session.org/>)
>
>
>
> On Tuesday, 21 August 2012 01:04:38 UTC-5, mweissen wrote:
>
>> This is the new code:
>>
>> 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(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['**au**th_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=**l**ambda query:
>>>>   (db.auth_group.org==session.**or**g <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-**00fe62**
>>>> ef4a38
>>>> <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\**restricte**d.py", line 205, in restricted
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>     exec ccode in environment
>>>>   File "D:/.../web2py/applications/**se**cure/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