|
|
| version 1.50, 2005/04/10 13:01:45 | version 1.57, 2005/04/29 18:24:04 |
|---|---|
| Line 14 import tempfile | Line 14 import tempfile |
| import shutil | import shutil |
| from types import * | from types import * |
| import time | import time |
| from threading import Thread | |
| import Queue | |
| try: | try: |
| from Products.ECHO_content.ECHO_collection import ECHO_basis | from Products.ECHO_content.ECHO_collection import ECHO_basis |
| Line 25 except: | Line 27 except: |
| manage_options=() | manage_options=() |
| tdir = "/mpiwg/temp/tmp/archivesImageServer/" | |
| #tdir="/tmp/archivesImageServer/" | |
| def splitPath(str): | def splitPath(str): |
| str2=str.replace("\\","/") | str2=str.replace("\\","/") |
| Line 47 def getTextFromNode(nodename): | Line 51 def getTextFromNode(nodename): |
| rc = rc + node.data | rc = rc + node.data |
| return rc | return rc |
| class generateSet: | |
| """generateSetThread""" | |
| def __init__(self,filenames,filenamesIds,ImageViewerPath,ids,url,local=None,version="working"): | |
| """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=tdir | |
| tmpPath=tempfile.mktemp() | |
| tmpZip=tempfile.mktemp()+".gtz" | |
| 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="<h3>1. step: getting the images</h3>" | |
| 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("<p>Get File: %s<br>\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("<p>Error in File: %s (possible missing)<br>\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.response+=str("<p>Error in File: %s (possible missing)<br>\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("<p>Get File: %s<br>\n"%filename) | |
| if self.local: | |
| sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+self.ids[nr+i] | |
| targetPath=tmpPath+"/"+filename | |
| try: | |
| shutil.copyfile(sourcePath,targetPath) | |
| except: | |
| self.response+=str("<p>Error in File: %s (missing?)<br>\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+="<h3>2. step: creating the downloadable file</h3>" | |
| self.response+="<p>Create gtar<br>" | |
| self.response+="<p>This can take a while....<br>\n" | |
| fh=os.popen2("gnutar zcvf %s %s/*"%(tmpZip,tmpPath),1)[1] | |
| self.response+="<br>" | |
| for c in fh.read(): | |
| self.response+=c | |
| if c==")": | |
| self.response+="<br>\n" | |
| shutil.rmtree(tmpPath) | |
| self.response+="<p>finished<br>\n" | |
| len=os.stat(tmpZip)[6] | |
| downloadUrl=self.url+"/downloadSet" | |
| self.response+="""<h1><a href="downloadSet?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len) | |
| self.response+="""<p>The file will be stored for a while, you can download it later, the URL is:</p> | |
| <p><a href="downloadSet?fn=%s">%s?fn=%s</a></h1>\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): | class metaData(SimpleItem): |
| """Klasse fuer metadaten""" | """Klasse fuer metadaten""" |
| meta_type="metaData" | meta_type="metaData" |
| Line 363 class ImageCollection(Folder, Persistent | Line 515 class ImageCollection(Folder, Persistent |
| meta_type="ImageCollection" | meta_type="ImageCollection" |
| zipThreads={} | |
| zipThreads2={} | |
| genericMetaDataType="leiden_meta" | genericMetaDataType="leiden_meta" |
| Line 372 class ImageCollection(Folder, Persistent | Line 526 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 | 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 refreshTxt(self): | |
| """txt fuer refresh""" | |
| tn=self.REQUEST.SESSION['threadName'] | |
| return """ 2;url=%s?repeat=%s """%(self.absolute_url()+"/createSet",tn) | |
| def createSet(self,RESPONSE=None,local=None,version="working"): | def createSet(self,RESPONSE=None,local=None,version="working",repeat=None): |
| """download aller gewaehlten files""" | """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): | threadName=repeat |
| os.mkdir(tmpPath) | |
| if RESPONSE: | if not threadName or threadName=="": |
| RESPONSE.setHeader("Content-Type","text/html") | threadStart=generateSet(self.REQUEST.SESSION['filenames'],self.REQUEST.SESSION['filenamesIds'],self.ImageViewerPath,self.show_thumbs(),self.absolute_url(),local=local,version=version) |
| RESPONSE.write("<h1>I am creating the download archive</h1>") | thread=Thread(target=threadStart) |
| RESPONSE.write("<h3>1. step: getting the images</h3>") | |
| if not self.REQUEST.SESSION.has_key('filenames'): | |
| RESPONSE.write("<h2>ERROR</h2>") | |
| RESPONSE.write("<p>I forgot, the selected files. Please reselect.\n") | |
| return 0 | |
| for id in self.REQUEST.SESSION['filenames']: | thread.start() |
| 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("<p>Get File: %s<br>\n"%filename)) | |
| if local: | self.zipThreads[thread.getName()[0:]]=threadStart |
| if version=="working": | self.zipThreads2[thread.getName()[0:]]=thread |
| sourcePath="/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+os.path.splitext(id[0])[0]+".jpg" | self.REQUEST.SESSION['threadName']=thread.getName()[0:] |
| else: | wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['zip_wait_template']) |
| sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+id[0] | if wait_template: |
| targetPath=tmpPath+"/"+filename | return wait_template[0][1]() |
| try: | pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self) |
| shutil.copyfile(sourcePath,targetPath) | return pt() |
| except: | #xmltrans.run() |
| if RESPONSE: | |
| RESPONSE.write(str("<p>Error in File: %s (possible missing)<br>\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: | 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" | self.REQUEST.SESSION['threadName']=threadName |
| image=urllib.urlopen(path).read() | |
| fh=file(tmpPath+"/"+filename,"w") | |
| if (self.zipThreads[threadName].getResult()==None): | |
| fh.write(image) | wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template']) |
| fh.close() | if wait_template: |
| return wait_template[0][1]() | |
| #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("<p>Error in File: %s (possible missing)<br>\n"%id[0])) | |
| else: | |
| """nothing""" | |
| nr=0 | |
| numberOfPages=self.REQUEST.SESSION['filenamesIds'][id[0]][1] | pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self) |
| for k in range(int(numberOfPages)-1): | return pt() |
| 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: | else: |
| filename=id[0] | if self.zipThreads[threadName].isDone(): |
| self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult() | |
| if RESPONSE: | self.zipThreads2[threadName].join() |
| RESPONSE.write(str("<p>Get File: %s<br>\n"%filename)) | del(self.zipThreads2[threadName]) |
| del(self.zipThreads[threadName]) | |
| pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_result.zpt')).__of__(self) | |
| return pt() | |
| if local: | |
| sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+ids[nr+1] | |
| targetPath=tmpPath+"/"+filename | |
| try: | |
| shutil.copyfile(sourcePath,targetPath) | |
| except: | |
| if RESPONSE: | |
| RESPONSE.write(str("<p>Error in File: %s (missing?)<br>\n"%filename)) | |
| else: | else: |
| """nothing""" | self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult() |
| else: | self.REQUEST.SESSION['threadName']=threadName |
| path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(ids[nr+i])[0]+"&mo=rawfile,hires" | pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait_result.zpt')).__of__(self) |
| return pt() | |
| image=urllib.urlopen(path).read() | |
| fh=file(tmpPath+"/"+filename,"w") | |
| fh.write(image) | |
| fh.close() | |
| if RESPONSE: | |
| RESPONSE.write("<h3>2. step: creating the downloadable file</h3>") | |
| RESPONSE.write("<p>Create Zip<br>") | |
| RESPONSE.write("<p>This can take a while....<br>\n") | |
| if RESPONSE: | |
| fh=os.popen2("zip -u %s %s/*"%(tmpZip,tmpPath),1)[1] | |
| RESPONSE.write("<br>") | |
| for c in fh.read(): | |
| RESPONSE.write(c) | |
| if c==")": | |
| RESPONSE.write("<br>\n") | |
| def checkThreads(self): | |
| """teste running threads""" | |
| ret="""<html> | |
| <head> | |
| <meta http-equiv="REFRESH" content="5;url=%s/checkThreads" | |
| <body><h2>Threads of %s</h2>"""%(self.absolute_url(),self.getId()) | |
| for threadName in self.zipThreads.keys(): | |
| if self.zipThreads2[threadName].isAlive(): | |
| ret+="<p>%s --> alive</p>"%threadName | |
| else: | else: |
| os.popen("zip -u %s %s/*"%(tmpZip,tmpPath)) | ret+="<p>%s --> dead</p>"%threadName |
| return ret+"</body></html>" | |
| shutil.rmtree(tmpPath) | |
| if RESPONSE: | |
| RESPONSE.write("<p>finished<br>\n") | |
| if RESPONSE: | |
| len=os.stat(tmpZip)[6] | |
| downloadUrl=self.absolute_url()+"/downloadSet" | |
| RESPONSE.write("""<h1><a href="downloadSet?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len)) | |
| RESPONSE.write("""<p>The file will be stored for a while, you can download it later, the URL is:</p> | |
| <p><a href="downloadSet?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn)) | |
| RESPONSE.close() | |
| def downloadSet(self,fn): | def downloadSet(self,fn): |
| """download prepared set""" | """download prepared set""" |
| filename="/tmp/archivesImageServer/"+fn | filename=os.path.join(tdir,fn) |
| self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%"image.zip") | self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%"image.tgz") |
| self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream") | self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream") |
| len=os.stat(filename)[6] | len=os.stat(filename)[6] |
| self.REQUEST.RESPONSE.setHeader("Content-Length",len) | self.REQUEST.RESPONSE.setHeader("Content-Length",len) |
| Line 805 class ImageCollection(Folder, Persistent | Line 889 class ImageCollection(Folder, Persistent |
| def importStructure(self,path): | def importStructure(self,path): |
| """import""" | """import""" |
| splitted=os.path.split(path) | 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) | manage_AddImageCollection(self,splitted[1],splitted[1],path,self.ImageViewerPath,self.defaultMetaString,RESPONSE=None) |
| obj=getattr(self,splitted[1]) | obj=getattr(self,splitted[1]) |
| Line 821 class ImageCollection(Folder, Persistent | Line 905 class ImageCollection(Folder, Persistent |
| for file in files: | for file in files: |
| if os.path.isdir(os.path.join(self.ImageStoragePath,file)): | if os.path.isdir(os.path.join(self.ImageStoragePath,file)): |
| manage_AddImageCollection(self,file,file,os.path.join(self.ImageStoragePath,file),self.ImageViewerPath,self.defaultMetaString) | imageStoragePath=os.path.join(self.ImageStoragePath,file) |
| imageViewerPath=os.path.join(self.ImageViewerPath,file) | |
| manage_AddImageCollection(self,file,file,imageStoragePath,imageViewerPath,self.defaultMetaString) | |
| obj=getattr(self,file) | obj=getattr(self,file) |
| obj.ImportStructure() | obj.ImportStructure() |
| Line 1018 class ImageCollection(Folder, Persistent | Line 1104 class ImageCollection(Folder, Persistent |
| ret+=link%(self.aq_parent.absolute_url(), "back ("+self.aq_parent.title+")") | ret+=link%(self.aq_parent.absolute_url(), "back ("+self.aq_parent.title+")") |
| ret+="<br>" | ret+="<br>" |
| iCs=self.ZopeFind(self,obj_metatypes="ImageCollection") | iCs=self.ZopeFind(self,obj_metatypes=["ImageCollection"]) |
| if not iCs: | if not iCs: |
| return ret | return ret |
| else: | else: |