Try to search your question here, if you can't find : Ask Any Question Now ?

How to redirect ondelete function to a page to ask for a password and then return to the SQLFORM.grid page?

HomeCategory: stackoverflowHow to redirect ondelete function to a page to ask for a password and then return to the SQLFORM.grid page?
gaurav asked 3 weeks ago

Does anyone know how to redirect ondelete to a page to ask for a password and then return to the SQLFORM.grid page?

In my code below (for non-manager and non-supervisor) you can see that I’ve configured ondelete to call the on_delete function. This works.

The on_delete function also executes the redirection to get_approval, and the get_approval code runs, but it returns to the grid page without showing the get_approval form page.

If I comment ondelete and uncomment the links and deletable everything works.

@auth.requires(lambda: (auth.requires_login() and request.env.http_referer
                        and ('/client' in request.env.http_referer
                             or '/client/get_approval' in request.env.http_referer)))
def get_approval():
    rec_id = request.args[0]

    rows_dic = {**general.get_members(db, SUPERVISOR_ROLE),
                **general.get_members(db, MANAGER_ROLE)}

    form = SQLFORM.factory(
        Field('user_id', label=T('Supervisor/Manager'),
              requires=IS_IN_SET(rows_dic, zero=T('Choose one...'))),
        Field('password', 'password', label=T('Password'), requires=IS_NOT_EMPTY()),
              buttons=[BUTTON(T('Submit'), _type='submit', _class='btn btn-primary')],

    if form.process(keepvalues=True).accepted:
        # If passwords match it is approved.
        if (db.auth_user.password.validate(form.vars.password)[0]
                == db.auth_user(form.vars.user_id).password):
            row = db.client[rec_id]
            redirect(URL('index', user_signature=True))
            response.flash = T('Wrong password')

    return dict(form=form)

def index():
    # DON'T uncomment without testing.
    # session.forget(response)  # Recommended in Efficiency tricks.

    # Hidden fields in grid/view form. = False
    db.client.canceled_on.readable = False
    db.client.canceled_by.readable = False
    db.client.cancel_approved_by.readable = False
    # Hidden fields in create/edit form.
    db.client.canceled_on.writable = False
    db.client.canceled_by.writable = False
    db.client.cancel_approved_by.writable = False

    # ondelete is used in the grid and on_validation/on_update are used
    # in the edit form.
    if auth.has_membership(SUPERVISOR_ROLE) or auth.has_membership(MANAGER_ROLE):
        grid = SQLFORM.grid(db.client, csv=False, details=False,
                            # noconfirm=True,  # Grid only.
                            ondelete=on_delete,  # Grid only.
                            onvalidation=on_validation,  # Form only.
                            represent_none='',  # Grid/view form only.
        grid = SQLFORM.grid(
            db.client, create=False, csv=False, # deletable=False,
            # links=[lambda row: A(
                # SPAN(_class='icon trash icon-trash glyphicon glyphicon-trash') + ' '
                # + SPAN(T('Delete'), _class='buttontext button', _title='Delete'),
                # _href=URL('get_approval', args=[], user_signature=True),
                # _class='button btn btn-default btn-secondary')],
            ondelete=on_delete,  # Grid only.
            represent_none='',  # Grid/view form only.

    return dict(grid=grid)

@auth.requires(lambda: (auth.requires_login() and request.env.http_referer
                        and '/client' in request.env.http_referer))
def on_delete(table, rec_id):
    """Used in the grid."""
    if auth.has_membership(SUPERVISOR_ROLE) or auth.has_membership(MANAGER_ROLE):
        row = table[rec_id]
        redirect(URL('get_approval', args=[rec_id], user_signature=True))

Thanks in advance,


1 Answers
Best Answer
naveen answered 3 weeks ago
Your Answer

5 + 17 =

Popular Tags

WP Facebook Auto Publish Powered By :