After further testing, it looks this proposed fix incorrectly removes the 
file from the upload field in the record being edited ... not sure yet.

Can something be done along these lines to make onvalidation work properly?.


On Monday, April 30, 2012 2:21:37 PM UTC-5, Carlos wrote:
>
> 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
>

Reply via email to