--- ImageArchive/ImageArchive.py 2005/04/10 13:47:25 1.52 +++ ImageArchive/ImageArchive.py 2005/04/28 22:03:44 1.53 @@ -14,6 +14,8 @@ import tempfile import shutil from types import * import time +from threading import Thread +import Queue try: from Products.ECHO_content.ECHO_collection import ECHO_basis @@ -47,6 +49,148 @@ def getTextFromNode(nodename): rc = rc + node.data return rc +class generateSet: + """generateSetThread""" + + def __init__(self,filenames,filenamesIds,ImageViewerPath,ids,url,local=None,version="full"): + """init generateSet""" + self.filenames=filenames + self.filenamesIds=filenamesIds + self.ImageViewerPath=ImageViewerPath + self.ids=ids + self.local=local + self.url=url + self.version=version + self.done=None + + def __call__(self): + """call generate Set""" + + storeTempDir=tempfile.tempdir + tempfile.tempdir="/tmp/archivesImageServer" + tmpPath=tempfile.mktemp() + tmpZip=tempfile.mktemp()+".zip" + tmpFn=os.path.split(tmpZip)[1] + + if not os.path.exists(tempfile.tempdir): + os.mkdir(tempfile.tempdir) + + if not os.path.exists(tmpPath): + os.mkdir(tmpPath) + + self.response="" + + + self.response="

1. step: getting the images

" + + for id in self.filenames: + + if self.filenamesIds.has_key(id[0]): + filename=self.filenamesIds[id[0]][0]+"_"+id[0] + else: + filename=id[0] + + self.response+=str("

Get File: %s
\n"%filename) + + if self.local: + if self.version=="working": + sourcePath="/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+os.path.splitext(id[0])[0]+".jpg" + else: + sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+id[0] + targetPath=tmpPath+"/"+filename + try: + shutil.copyfile(sourcePath,targetPath) + except: + self.response+=(str("

Error in File: %s (possible missing)
\n"%filename)) + else: + if self.version=="working": + path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(urllib.quote(id[0]))[0]+"&dh=2000&dw=2000" + else: + path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(urllib.quote(id[0]))[0]+"&mo=rawfile,hires" + image=urllib.urlopen(path).read() + + + fh=file(tmpPath+"/"+filename,"w") + + + fh.write(image) + fh.close() + + #folgeseiten + if int(self.filenamesIds[id[0]][1])>1: + #ids=self.show_thumbs() + + try: + nr=self.ids.index(id[0]) + except: + self.reponse+=str("

Error in File: %s (possible missing)
\n"%id[0]) + + + nr=0 + + numberOfPages=self.filenamesIds[id[0]][1] + for k in range(int(numberOfPages)-1): + i=k+1 + if self.filenamesIds.has_key(id[0]): + filename=self.filenamesIds[id[0]][0]+"_"+self.ids[nr+i] + else: + filename=id[0] + + self.response+=str("

Get File: %s
\n"%filename) + + if self.local: + sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+self.ids[nr+1] + targetPath=tmpPath+"/"+filename + try: + shutil.copyfile(sourcePath,targetPath) + except: + self.response+=str("

Error in File: %s (missing?)
\n"%filename) + + else: + path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(ids[nr+i])[0]+"&mo=rawfile,hires" + + image=urllib.urlopen(path).read() + + + fh=file(tmpPath+"/"+filename,"w") + fh.write(image) + fh.close() + + self.response+="

2. step: creating the downloadable file

" + self.response+="

Create Zip
" + self.response+="

This can take a while....
\n" + + fh=os.popen2("zip -u %s %s/*"%(tmpZip,tmpPath),1)[1] + self.response+="
" + for c in fh.read(): + self.response+=c + if c==")": + self.response+="
\n" + + + + + shutil.rmtree(tmpPath) + + self.response+="

finished
\n" + + len=os.stat(tmpZip)[6] + downloadUrl=self.url+"/downloadSet" + self.response+="""

Click here for download ( %i Byte)

\n"""%(tmpFn,len) + self.response+="""

The file will be stored for a while, you can download it later, the URL is:

+

%s?fn=%s\n"""%(tmpFn,downloadUrl,tmpFn) + + self.done=True + def getResult(self): + """get result""" + return self.response + + def isDone(self): + if self.done: + return True + else: + return False + class metaData(SimpleItem): """Klasse fuer metadaten""" meta_type="metaData" @@ -363,7 +507,7 @@ class ImageCollection(Folder, Persistent meta_type="ImageCollection" - + zipThreads={} genericMetaDataType="leiden_meta" leiden_meta_fields=['image_id','date','country','place','people','description','photographer'] @@ -372,148 +516,60 @@ class ImageCollection(Folder, Persistent defaultMetaString="http://fm-web.mpiwg-berlin.mpg.de:8050/FMRes/FMPJS?-db=Wissenschaftlerportraits.fp5&-layID=69&-token=25&-max=1&-format=formvwcss.htm&-mode=browse&images::filename=%s&-find" ## TEST FUER IMAGEDATENBANK WP - - def createSet(self,RESPONSE=None,local=None,version="working"): - """download aller gewaehlten files""" - storeTempDir=tempfile.tempdir - tempfile.tempdir="/tmp/archivesImageServer" - - tmpPath=tempfile.mktemp() - - - tmpZip=tempfile.mktemp()+".zip" - tmpFn=os.path.split(tmpZip)[1] - - - if not os.path.exists(tempfile.tempdir): - os.mkdir(tempfile.tempdir) - - if not os.path.exists(tmpPath): - os.mkdir(tmpPath) - - - if RESPONSE: - RESPONSE.setHeader("Content-Type","text/html") - RESPONSE.write("

I am creating the download archive

") - RESPONSE.write("

1. step: getting the images

") - - if not self.REQUEST.SESSION.has_key('filenames'): - RESPONSE.write("

ERROR

") - RESPONSE.write("

I forgot, the selected files. Please reselect.\n") - return 0 - - for id in self.REQUEST.SESSION['filenames']: - - if self.REQUEST.SESSION.has_key('filenamesIds') and self.REQUEST.SESSION['filenamesIds'].has_key(id[0]): - filename=self.REQUEST.SESSION['filenamesIds'][id[0]][0]+"_"+id[0] - else: - filename=id[0] - - if RESPONSE: - RESPONSE.write(str("

Get File: %s
\n"%filename)) - - if local: - if version=="working": - sourcePath="/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+os.path.splitext(id[0])[0]+".jpg" - else: - sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+id[0] - targetPath=tmpPath+"/"+filename - try: - shutil.copyfile(sourcePath,targetPath) - except: - if RESPONSE: - RESPONSE.write(str("

Error in File: %s (possible missing)
\n"%filename)) - else: - """nothing""" - else: - if version=="working": - path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(urllib.quote(id[0]))[0]+"&dh=2000&dw=2000" - else: - path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(urllib.quote(id[0]))[0]+"&mo=rawfile,hires" - image=urllib.urlopen(path).read() - - - fh=file(tmpPath+"/"+filename,"w") - - - fh.write(image) - fh.close() - - #folgeseiten - if int(self.REQUEST.SESSION['filenamesIds'][id[0]][1])>1: - ids=self.show_thumbs() - try: - nr=ids.index(id[0]) - except: - if RESPONSE: - RESPONSE.write(str("

Error in File: %s (possible missing)
\n"%id[0])) - else: - """nothing""" - - nr=0 + def refreshTxt(self): + """txt fuer refresh""" + tn=self.REQUEST.SESSION['threadName'] + return """ 2;url=%s?repeat=%s """%(self.absolute_url()+"/createSet",tn) - numberOfPages=self.REQUEST.SESSION['filenamesIds'][id[0]][1] - for k in range(int(numberOfPages)-1): - i=k+1 - if self.REQUEST.SESSION.has_key('filenamesIds') and self.REQUEST.SESSION['filenamesIds'].has_key(id[0]): - filename=self.REQUEST.SESSION['filenamesIds'][id[0]][0]+"_"+ids[nr+i] - else: - filename=id[0] - - if RESPONSE: - RESPONSE.write(str("

Get File: %s
\n"%filename)) + def createSet(self,RESPONSE=None,local=None,version="working",repeat=None): + """download aller gewaehlten files""" - if local: - sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+ids[nr+1] - targetPath=tmpPath+"/"+filename - try: - shutil.copyfile(sourcePath,targetPath) - except: - if RESPONSE: - RESPONSE.write(str("

Error in File: %s (missing?)
\n"%filename)) - else: - """nothing""" - else: - path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(ids[nr+i])[0]+"&mo=rawfile,hires" + threadName=repeat + + + if not threadName or threadName=="": + threadStart=generateSet(self.REQUEST.SESSION['filenames'],self.REQUEST.SESSION['filenamesIds'],self.ImageViewerPath,self.show_thumbs(),self.absolute_url(),local=local,version=version) + thread=Thread(target=threadStart) + + thread.start() - image=urllib.urlopen(path).read() - + + self.zipThreads[thread.getName()[0:]]=threadStart + self.REQUEST.SESSION['threadName']=thread.getName()[0:] + wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['zip_wait_template']) + if wait_template: + return wait_template[0][1]() + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_Wait.zpt')).__of__(self) + return pt() + #xmltrans.run() + else: + self.REQUEST.SESSION['threadName']=threadName - fh=file(tmpPath+"/"+filename,"w") - fh.write(image) - fh.close() + if (self.zipThreads[threadName].getResult()==None): - if RESPONSE: - RESPONSE.write("

2. step: creating the downloadable file

") - RESPONSE.write("

Create Zip
") - RESPONSE.write("

This can take a while....
\n") - if RESPONSE: - fh=os.popen2("zip -u %s %s/*"%(tmpZip,tmpPath),1)[1] - RESPONSE.write("
") - for c in fh.read(): - RESPONSE.write(c) + wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template']) + if wait_template: + return wait_template[0][1]() + + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_Wait.zpt')).__of__(self) + return pt() + else: + if self.zipThreads[threadName].isDone(): + self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult() + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_result.zpt')).__of__(self) + return pt() + + else: + self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult() + self.REQUEST.SESSION['threadName']=threadName + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_Wait_result.zpt')).__of__(self) + return pt() - if c==")": - RESPONSE.write("
\n") - - - else: - os.popen("zip -u %s %s/*"%(tmpZip,tmpPath)) - - shutil.rmtree(tmpPath) - if RESPONSE: - RESPONSE.write("

finished
\n") - if RESPONSE: - len=os.stat(tmpZip)[6] - downloadUrl=self.absolute_url()+"/downloadSet" - RESPONSE.write("""

Click here for download ( %i Byte)

\n"""%(tmpFn,len)) - RESPONSE.write("""

The file will be stored for a while, you can download it later, the URL is:

-

%s?fn=%s\n"""%(tmpFn,downloadUrl,tmpFn)) - RESPONSE.close() - + + def downloadSet(self,fn): """download prepared set""" filename="/tmp/archivesImageServer/"+fn @@ -805,7 +861,7 @@ class ImageCollection(Folder, Persistent def importStructure(self,path): """import""" splitted=os.path.split(path) - if os.path.isDir(path): + if os.path.isDir(path) and (len(splitted[1])>0) and (splitted[1][0]=="."): manage_AddImageCollection(self,splitted[1],splitted[1],path,self.ImageViewerPath,self.defaultMetaString,RESPONSE=None) obj=getattr(self,splitted[1])