--- ImageArchive/ImageArchive.py 2005/03/18 16:57:21 1.49 +++ 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="
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+="
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+="""
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] + 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",repeat=None): + """download aller gewaehlten files""" - 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 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
-
- 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))
-
- 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("
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("""
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
@@ -801,6 +857,60 @@ class ImageCollection(Folder, Persistent
RESPONSE.redirect('manage_main')
+
+ def importStructure(self,path):
+ """import"""
+ splitted=os.path.split(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])
+ obj.ImportFiles()
+
+ def ImportStructure(self,RESPONSE=None):
+ """Import the existing files of a folder"""
+ files=os.listdir(self.ImageStoragePath)
+ ret=""
+ #print self.__dict__
+
+
+ for file in files:
+
+ if os.path.isdir(os.path.join(self.ImageStoragePath,file)):
+ 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.ImportStructure()
+ else:
+ if not file[0]==".":
+ if self.__dict__.has_key(file):
+
+ ret=ret+"
"+file+" already exists!"
+ else:
+ ret=ret+"
"+file+" created!"
+ newObj=ImageDigilib(file,file)
+ #print newObj,file
+ #print newObj
+ try:
+ self._setObject(file,newObj)
+ except:
+ """nothing yet"""
+ #print ret
+ #pt=PageTemplateFile('Products/ImageArchive/out.zpt')).__of__(self)
+ #print self.ImageStoragePath
+
+ #scale thumb
+
+ #self.scaleThumbs()
+
+ #scale standard
+
+ #self.scaleWorkingVersions()
+
+ if RESPONSE:
+ RESPONSE.redirect('manage_main')
def ImportFiles(self,RESPONSE=None):
"""Import the existing files of a folder"""
@@ -957,7 +1067,25 @@ class ImageCollection(Folder, Persistent
return "previous sets"
else:
return ""
+ def showFolders(self):
+ """show subfolders"""
+ ret=""
+ link=""" %s
"""
+ if self.aq_parent.meta_type=="ImageCollection":
+ ret+=link%(self.aq_parent.absolute_url(), "back ("+self.aq_parent.title+")")
+ ret+="
"
+
+ iCs=self.ZopeFind(self,obj_metatypes=["ImageCollection"])
+ if not iCs:
+ return ret
+ else:
+
+ link=""" %s
"""
+ for iC in iCs:
+ ret+=link%(iC[1].absolute_url(),iC[0])
+ ret+="
"
+ return ret
def showRuler(self,selected=None):
"""show ruler"""
showall =self.REQUEST.SESSION.get('showall','no')