I believe this is the correct behavior. You are declaring that the Grid urls must contain args=[id] so if it is does not you have no access. your grid is readonly mode so it is always visible (when it properly parse the arguments).
I am missing something? On Monday, 10 December 2012 21:48:09 UTC-6, tomt wrote: > > I simplified the controller to better understand the problem I'm seeing. > > def test(): > id = 2 > query = (db.staffnotes.staffid == id) > fields=[db.staffnotes.staffid,db.staffnotes.date,db.staffnotes.comment] > orderby = [~db.staffnotes.date,~db.staffnotes.modified_on] > grid = SQLFORM.grid(query=query, > > details=False,csv=False,editable=False,deletable=False,create=False,searchable=True, > paginate=10,fields=fields,orderby=orderby, > args=[id], > ) > return dict(grid=grid) > > - When I call this routine with: > http://localhost:8000/myapp/default/test > - I receive the 'not authorized' flash and the grid doesn't display > > - If I call it with: > http://localhost:8000/myapp/default/test/2 > - the grid displays with no error. > (this appears to be because request.args(0) matchs args=[id] where id=2) > > - If I call it with: > http://localhost:8000/myapp/default/test/garbage/view > - I receive the 'not authorized' flash and the grid doesn't display > - If I signoff and repeat the url > http://localhost:8000/myapp/default/test/garbage/view > - the grid displays with no error. > - I don't intend to pass phony urls to get past the error. I just listed > them to try to understand what I'm doing wrong. > > - If I get rid of the args=[id] parameter on SQLFORM.grid call > the grid displays no matter what the url is, and whether or not I'm > logged in, > but I need the args=[id] because I use it with links. > > Does this clarify anything? > > On Monday, December 10, 2012 12:44:30 PM UTC-6, tomt wrote: >> >> Yes, I am logged in. >> >> On the initial call of the controller the grid is displayed without and >> error. When I select a new value from the dropdown form, a new query is >> used and passed to SQLFORM.grid, and this is when the 'not authorized' >> flash is generated. >> >> >> On Monday, December 10, 2012 9:21:29 AM UTC-6, Massimo Di Pierro wrote: >> >>> Are you logged in when you try accessing the grid? Do you get a not >>> authorized when trying to visualize the grid or when searching or when >>> visualizing a record? >>> >>> Massimo >>> >>> On Sunday, 9 December 2012 19:23:20 UTC-6, tomt wrote: >>>> >>>> Hi, >>>> >>>> Recent changes in trunk are causing my use of SQLFORM.grid to issue a >>>> 'not authorized' flash. >>>> It appears to be because of the following change in sqlhtml.py: >>>> >>>> - stable: >>>> # if not user_signature every action is accessible >>>> # else forbid access unless >>>> # - url is based url >>>> # - url has valid signature (vars are not signed, only >>>> path_info) >>>> # = url does not contain 'create','delete','edit' (readonly) >>>> if user_signature: >>>> if not( >>>> '/'.join(str(a) for a in args) == >>>> '/'.join(request.args) or >>>> URL.verify(request, user_signature=user_signature, >>>> hash_vars=False) or not ( >>>> 'create' in request.args or >>>> 'delete' in request.args or >>>> 'edit' in request.args)): >>>> session.flash = T('not authorized') >>>> redirect(referrer) >>>> - trunk >>>> # if not user_signature every action is accessible >>>> # else forbid access unless >>>> # - url is based url >>>> # - url has valid signature (vars are not signed, only >>>> path_info) >>>> # = url does not contain 'create','delete','edit' (readonly) >>>> if user_signature: >>>> if not ( >>>> '/'.join(str(a) for a in args) == >>>> '/'.join(request.args) or >>>> URL.verify(request,user_signature=user_signature, >>>> hash_vars=False) or >>>> (request.args(len(args))=='view' and not logged)): >>>> session.flash = T('not authorized') >>>> redirect(referrer) >>>> >>>> I normally call my routine with no parameter after having signed on >>>> and then I select a specific user from the dropdown list. >>>> With the latest trunk the selection is ignored and the flash 'not >>>> authorized' >>>> is generated. My controller doesn't call create, delete, or edit. It >>>> uses javascript to >>>> to select and pass on the staffid to the grid. >>>> >>>> Restoring this piece of code in sqlhtml.py to the previous version >>>> eliminates my problem. >>>> I'm not sure what change was meant to do differently. Perhaps it was a >>>> mistake, or it could be that I was using SQLFORM.grid incorrectly. >>>> >>>> ... my controller .................................................... >>>> def note_list(): >>>> script = SCRIPT(""" >>>> $('document').ready(function(){ >>>> $('#mycombo').change(function(){ >>>> $('#myform').submit(); >>>> }); >>>> }); >>>> """) >>>> >>>> form = SQLFORM(db.staffnotes,fields=['staffid']) >>>> del form[0][1] # delete the submit_record__row from the form >>>> staffid = request.args(0) >>>> # Modify form elements for use by script >>>> form.attributes['_id'] = 'myform' >>>> form.element('select').attributes['_id'] = 'mycombo' >>>> >>>> # Build table of all notes if staffid isn't set >>>> if staffid: >>>> query = ((db.staffnotes.staffid == db.staff.id) & >>>> (db.staffnotes.staffid == staffid)) >>>> else: >>>> query = ((db.staffnotes.staffid == db.staff.id)) >>>> >>>> if form.accepts(request.vars,session,dbio=False): >>>> staffid = form.vars.staffid >>>> query = ((db.staffnotes.staffid == db.staff.id) & >>>> (db.staffnotes.staffid == staffid)) >>>> >>>> >>>> fields=[db.staffnotes.staffid,db.staffnotes.date,db.staffnotes.comment] >>>> orderby = [~db.staffnotes.date,~db.staffnotes.modified_on] >>>> maxtextlengths = { >>>> 'staffnotes.staffid': 20, >>>> 'staffnotes.comment': 200, >>>> } >>>> >>>> links=[dict(header='Link',body=mybody )] >>>> >>>> if staffid: >>>> print "grid D: form.vars.staffid %s, staffid %s " % >>>> (form.vars.staffid,staffid) >>>> grid = SQLFORM.grid(query=query, >>>> >>>> details=True,csv=False,editable=False,deletable=False,create=False,searchable=True, >>>> >>>> paginate=10,fields=fields,orderby=orderby,maxtextlengths=maxtextlengths, >>>> args=[staffid],links=links, >>>> ) >>>> else: >>>> print "grid E: form.vars.staffid %s, staffid %s " % >>>> (form.vars.staffid,staffid) >>>> grid = SQLFORM.grid(query=query, >>>> >>>> details=True,csv=False,editable=False,deletable=False,create=False,searchable=True, >>>> >>>> paginate=10,fields=fields,orderby=orderby,maxtextlengths=maxtextlengths, >>>> links=links, >>>> ) >>>> >>>> >>>> response.title='Notes' >>>> print "" >>>> return dict(form=form, script=script, grid=grid) >>>> ...................................................................... >>>> >>>> - any suggestions? >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> --

