Hi Massimo,
The onvalidation function is not getting properly executed when editing an
existing record with an upload field with an already uploaded file, as
stated in the following current fix (just after FORM.accepts call in
SQLFORM.accepts @ sqlhtml.py):
if not ret and self.record and self.errors:
### if there are errors in update mode
# and some errors refers to an already uploaded file
# delete error if
# - user not trying to upload a new file
# - there is existing file and user is not trying to delete it
# this is because removing the file may not pass validation
for key in self.errors.keys():
if key in self.table \
and self.table[key].type == 'upload' \
and request_vars.get(key, None) in (None, '') \
and self.record[key] \
and not key + UploadWidget.ID_DELETE_SUFFIX in
request_vars:
del self.errors[key]
if not self.errors:
ret = True
Unfortunately the above does not fix the onvalidation problem, which is not
being called in these situations (editing an existing record with an upload
field with an already uploaded file).
My proposal to fix the above (with polymorphism):
+ remove the above code for the existing fix.
+ in FORM.accepts @ html.py, call the following after [ status =
self._traverse(status,hideerror) ]:
status = self.assert_status(status, request_vars)
+ in FORM @ html.py, create the following method (polymorphism # 1):
def assert_status(self, status, request_vars):
return status
+ in SQLFORM @ sqlhtml.py, create the following method (polymorphism # 2):
def assert_status(self, status, request_vars):
if not status and self.record and self.errors:
### if there are errors in update mode
# and some errors refers to an already uploaded file
# delete error if
# - user not trying to upload a new file
# - there is existing file and user is not trying to delete it
# this is because removing the file may not pass validation
for key in self.errors.keys():
if key in self.table \
and self.table[key].type == 'upload' \
and request_vars.get(key, None) in (None, '') \
and self.record[key] \
and not key + UploadWidget.ID_DELETE_SUFFIX in
request_vars:
del self.errors[key]
if not self.errors:
status = True
return status
Now the new fix is executed in FORM.accepts, which causes onvalidation to
be called based on the proper value for status.
If you agree and if this does not break anything, can you please include it
in trunk?.
Thanks,
Carlos