http://code.google.com/p/web2py/issues/detail?id=778
On Monday, April 30, 2012 3:40:29 PM UTC-5, Massimo Di Pierro wrote: > > Please open a ticket with the problem description. > > On Monday, 30 April 2012 14:29:01 UTC-5, Carlos wrote: >> >> 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 >>> >>

