Hello,

I'm trying to use a variable from a form in an onupdate function, but 
because I've set it to writeable=False in the controller, it doesn't get 
passed in form.vars. In more depth:

I've got a table for volunteers to post offers of help on a project. Those 
have to be approved by an admin before becoming visible, but I don't want 
the admin to be able to change the original data. So, I have this as my 
table:

db.define_table('help_offered',
    Field('volunteer_id', 'reference auth_user'),
    Field('volunteer_type', requires=IS_IN_SET(volunteer_type), notnull=True
),
    Field('available_from','date', notnull=True),
    Field('admin_status','string', requires=IS_IN_SET(['Pending', 'Approved'
,'Rejected']),
    Field('approval_notes','text'),

For users, I just have a SQLFORM, which just doesn't show the two admin 
fields (admin_status and approval_notes):

def volunteer():
        
    form = SQLFORM(db.help_offered,
                   fields =['volunteer_type', 'research_statement', 
'available_from'])

Now for admin users, I want a table of pending offer, where they can view 
records but only edit those two admin fields. So, SQLFORM.grid fits 
perfectly:

def administer_volunteers():
        
    # lock down which fields can be changed
    db.help_offered.volunteer_id.writable = False
    db.help_offered.volunteer_type.writable = False
    db.help_offered.available_from.writable = False
    
    # get a query of pending requests with user_id
    form = SQLFORM.grid(query=(db.help_offered.admin_status == 'Pending'), 
csv=False,
                        fields=[db.help_offered.volunteer_id,
                                db.help_offered.volunteer_type,
                                db.help_offered.available_from],
                         deletable=False, editable=True, create=False, 
details=False,
                         onupdate = update_administer_volunteers)

However, now I want to email the volunteers the decision, so onupdate does 
this:

def update_administer_volunteers(form):
    
    # Email the decision to the proposer
    row = db(db.auth_user.id == form.vars.volunteer_id).select().first()
    volunteer_email = row.email
    volunteer_fn = row.first_name

    # alternatives
    if form.vars.admin_status == 'Approved':
        mail.send(to=volunteer_email,
                  subject='Decision',
                  message='Approved'
    elif form.vars.admin_status == 'Rejected':
        mail.send(to=volunteer_email,
                  subject='Decision',
                  message='Rejected')
    else:
        pass

But, form.vars only contains the writable fields and the row id:

admin_status : Approved
approval_decision_date : 2016-03-10
approval_notes : Sounds good
approver_id : 1L
id : 3L

I've seen solutions using hidden but I don't want to hide the field, just 
make it read only, and I can't work out how to insert volunteer_id back 
into my form. I could look up id in help_offered and then get the 
volunteer_id that way but that seems like an unnecessary extra step!

A long post for a simple question!


-- 
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