async def finish(self, values=None): # create file object with new data from finished upload try: file = self.field.get(self.real_context) except AttributeError: file = None if file is None: file = self.file_storage_manager.file_class() else: if getattr(file, '_blob', None): cleanup = IFileCleanup(self.context, None) if cleanup is None or cleanup.should_clean(file=file): bfile = file._blob.open('r') await bfile.async_del() else: file._previous_blob = getattr(file, '_blob', None) await notify( FileBeforeUploadFinishedEvent(self.context, field=self.field, file=file, dm=self)) # save previous data on file. # we do this instead of creating a new file object on every # save just in case other implementations want to use the file # object to store different data file._old_uri = file.uri file._old_size = file.size file._old_filename = file.filename file._old_md5 = file.md5 file._old_content_type = file.guess_content_type() if values is None: values = self._data self.field.set(self.real_context, file) for key, value in values.items(): setattr(file, key, value) if self.field.__name__ in getattr(self.context, '__uploads__', {}): del self.context.__uploads__[self.field.__name__] self.context._p_register() try: self.field.context.data._p_register() except AttributeError: self.field.context._p_register() await notify( FileUploadFinishedEvent(self.context, field=self.field, file=file, dm=self)) return file
def should_clean(self, file): cleanup = IFileCleanup(self.context, None) return cleanup is None or cleanup.should_clean(file=file, field=self.field)