--- ImageArchive/ImageArchive.py 2005/03/18 13:16:10 1.47 +++ 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 @@ -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') @@ -966,6 +1094,7 @@ class ImageCollection(Folder, Persistent return "No entries" if showall=='no': + actualNr=0 ids=self.show_thumbs() colRows=self.getColTimesRow() num=int(len(ids)/(colRows[0]*colRows[1])) @@ -973,19 +1102,63 @@ class ImageCollection(Folder, Persistent num+=1 a=colRows[0]*colRows[1] #print num,num+1 + if num>1: - ret="Show thumbnail group no:
" - for i in range(num): - if (operator.mod(i,10)==0) and i>0: - ret +="
" #alle 10 linebreak einfuegen - k=i*a - if selected: - href=self.REQUEST['URL1']+"/selection?filename="+ids[k] - else: - href=self.REQUEST['URL1']+"?filename="+ids[int(k)] + ret="" + if selected: + ret+="""" + anf="Show thumbnail group no:
" + + + try: + if selected: + href=self.REQUEST['URL1']+"/selection?filename="+ids[(actualNr-1)*a] + else: + href=self.REQUEST['URL1']+"?filename="+ids[int((actualNr-1)*a)] + + anf+="""%s  """%(href,"prev") + except: + pass + ret=anf+ret + + try: + + if selected: + href=self.REQUEST['URL1']+"/selection?filename="+ids[(actualNr+1)*a] + else: + href=self.REQUEST['URL1']+"?filename="+ids[int((actualNr+1)*a)] + + end="""%s  """%(href,"next") + except: + end="" + ret=ret+end + - ret+="""%i  """%(href,i) + #for i in range(num): + # + # ret +="
" #alle 10 linebreak einfuegen + # k=i*a + # if selected: + # href=self.REQUEST['URL1']+"/selection?filename="+ids[k] + # else: + # href=self.REQUEST['URL1']+"?filename="+ids[int(k)] + # + # ret+="""%i  """%(href,i) else: ret="" @@ -998,6 +1171,7 @@ class ImageCollection(Folder, Persistent def show_thumbs_selected_rows(self,numberOfColumns): """Ausgabe anzahl""" ids=self.show_selected_thumbs() + if not ids: return None self.REQUEST.SESSION['ids']=ids