I just save the grid rows to session using this
if grid.rows:
session.grid_rows = grid.rows.as_dict()
And then in onvalidation function I compare the grid's row modified_on
(selecting the correct row that was in the edit form), with the db record
modified_on using this
if request.args and request.args[0] == 'new':
...
elif (session.grid_rows[int(request.vars.id)]['modified_on']
!= db.manual_lang(request.vars.id).modified_on):
form.errors.name = T('The record was changed while you were
editing. '
'Go back to the grid to see the updated
record.')
else: # Edit/delete from edit form, after checking the record was not
modified while editing.
...
What do you think of this solution?
terça-feira, 26 de Março de 2019 às 13:42:53 UTC, Anthony escreveu:
>
> On Monday, March 25, 2019 at 7:58:56 PM UTC-4, João Matos wrote:
>>
>> I need the records from the grid itself.
>> The objective is to be able to compare the modified_on field from the
>> record of the grid with the same record on the db at the moment of the save
>> (onvalidation) to detect if there was a record change between those 2
>> moments.
>> Like the detect_record_change of the form, but for the grid.
>> I found that the grid has a attribute rows which are the records and was
>> able to make it work.
>>
>
> The grid.rows object is None during requests that create and process the
> forms, so not sure how you could be accessing grid.rows from onvalidation
> during the processing of an edit form. In any case, you want to compare the
> submitted record with the version that was presented in the edit form (not
> the version that was presented in the grid, which could possibly differ).
> My original means of accessing the current record is not necessary, as you
> can actually get it via form.record within the onvalidation function. If
> you want to compare the modified_on field, you also need to pass that to
> the edit form (as a hidden field) when it is first created so the original
> value gets submitted back with the form. To do that, you can take Val K's
> approach, or to save an extra fetch of the record from the database, you
> can do the following:
>
> def my_grid():
> def onvalidation(form):
> if request.post_vars.modified_on != str(form.record.modified_on):
> form.errors['modified_on'] = True
> response.flash = 'Record change detected.'
>
> grid = SQLFORM.grid(db.mytable, ...)
>
> if 'edit' in request.args:
> form = grid.update_form
> form['hidden'].update(modified_on=form.record.modified_on)
>
> return dict(grid=grid)
>
> Anthony
>
>>
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.