#!zopectl # Fileimporter for Zope by Tino Wildenhain import sys,time,os class ProgressFile(file): "Class renders progressbar on read" def __init__(self,filename): "this file is read only" file.__init__(self,filename,'rb') self.seek(0,2) self._size=self.tell() self._start=time.time() self.headers={'content-type':'application/octet_stream'} def read(self,chunksize=8192): "zope image.py reads in chunks but from end to start" b=file.read(self,chunksize) s=self.tell() t=time.time()-self._start sys.stdout.write("\r%5.1f%% (%8.1f kb/s) |%-80s" % (100-100*s/self._size,s/t/1024,"#"*int(80-80*s/self._size))) sys.stdout.flush() def close(self): file.close(self) t=time.time()-self._start sys.stdout.write("\n\n%d bytes in %d secs = %8.1f kb/s\n\n" % (self._size,t,self._size/t/1024)) sys.stdout.flush() def importfile(filesystempath,zopepath): """resulting ID in zope is either the file name of the target path or the filename of the source""" filedata=ProgressFile(filesystempath) zdir,zfile=os.path.split(zopepath) if not zfile: zfile=os.path.split(filesystempath)[1] target=app.restrictedTraverse(zdir) target.manage_addFile(zfile,file=filedata,content_type='application/octet-stream') import transaction transaction.get().commit() filedata.close() if __name__=='__main__': try: source,target=sys.argv[1:3] except IndexError: sys.stderr.write("%s uploadfile zopepath\n") sys.stderr.flush() importfile(source,target)