--- ImageArchive/ImageArchive.py 2005/04/28 22:03:44 1.53 +++ ImageArchive/ImageArchive.py 2005/08/09 16:48:29 1.63 @@ -4,6 +4,7 @@ from Globals import Persistent,package_h from Acquisition import Implicit from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PageTemplates.PageTemplate import PageTemplate +from xmlrpclib import ServerProxy import re import os import os.path @@ -16,7 +17,15 @@ from types import * import time from threading import Thread import Queue - +import cgi +from AccessControl import ClassSecurityInfo +try: + from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder +except: + print "ZSQL Extend Folder nicht importiert" + print "Metadatendfolder funktioniert nicht!!!" + class ZSQLExtendFolder: + """leer""" try: from Products.ECHO_content.ECHO_collection import ECHO_basis except: @@ -27,6 +36,8 @@ except: manage_options=() +tdir = "/mpiwg/temp/tmp/archivesImageServer/" +#tdir="/tmp/archivesImageServer/" def splitPath(str): str2=str.replace("\\","/") @@ -52,7 +63,8 @@ def getTextFromNode(nodename): class generateSet: """generateSetThread""" - def __init__(self,filenames,filenamesIds,ImageViewerPath,ids,url,local=None,version="full"): + + def __init__(self,filenames,filenamesIds,ImageViewerPath,ids,url,local=None,version="working"): """init generateSet""" self.filenames=filenames self.filenamesIds=filenamesIds @@ -62,14 +74,16 @@ class generateSet: self.url=url self.version=version self.done=None + def __call__(self): """call generate Set""" storeTempDir=tempfile.tempdir - tempfile.tempdir="/tmp/archivesImageServer" + tempfile.tempdir=tdir + tmpPath=tempfile.mktemp() - tmpZip=tempfile.mktemp()+".zip" + tmpZip=tempfile.mktemp()+".gtz" tmpFn=os.path.split(tmpZip)[1] if not os.path.exists(tempfile.tempdir): @@ -93,20 +107,23 @@ class generateSet: 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" + path=self.scalerPath+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" + path=self.scalerPath+self.ImageViewerPath+"/"+os.path.splitext(urllib.quote(id[0]))[0]+"&mo=rawfile,hires" image=urllib.urlopen(path).read() @@ -119,11 +136,11 @@ class generateSet: #folgeseiten if int(self.filenamesIds[id[0]][1])>1: #ids=self.show_thumbs() - + nr=self.ids.index(id[0]) try: nr=self.ids.index(id[0]) except: - self.reponse+=str("

Error in File: %s (possible missing)
\n"%id[0]) + self.response+=str("

Error in File: %s (possible missing)
\n"%id[0]) nr=0 @@ -139,15 +156,16 @@ class generateSet: self.response+=str("

Get File: %s
\n"%filename) if self.local: - sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+self.ids[nr+1] + sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+self.ids[nr+i] 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" + path=self.scalerPath+self.ImageViewerPath+"/"+os.path.splitext(ids[nr+i])[0]+"&mo=rawfile,hires" image=urllib.urlopen(path).read() @@ -157,10 +175,10 @@ class generateSet: fh.close() self.response+="

2. step: creating the downloadable file

" - self.response+="

Create Zip
" + self.response+="

Create gtar
" self.response+="

This can take a while....
\n" - fh=os.popen2("zip -u %s %s/*"%(tmpZip,tmpPath),1)[1] + fh=os.popen2("gnutar zcvf %s %s/*"%(tmpZip,tmpPath),1)[1] self.response+="
" for c in fh.read(): self.response+=c @@ -229,11 +247,13 @@ class metaData(SimpleItem): ret+="

%s=%s

"%(tag,getattr(self,tag)) return ret+"" - + + + class ImageDigilib(Folder,Persistent,Implicit): """Anzeige object fuer digilib""" meta_type="ImageDigilib" - + security=ClassSecurityInfo() leiden_meta_fields=['image_id','date','country','place','people','description','photographer'] manage_options = Folder.manage_options+( @@ -324,7 +344,7 @@ class ImageDigilib(Folder,Persistent,Imp def download(self,fmt="&mo=rawfile,hires",suffix=None): """download""" - path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+fmt + path=self.scalerPath+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+fmt if self.REQUEST.SESSION.has_key('filenamesIds') and self.REQUEST.SESSION['filenamesIds'].has_key(self.filename): filename=self.REQUEST.SESSION['filenamesIds'][self.filename][0]+"_"+self.filename @@ -347,12 +367,13 @@ class ImageDigilib(Folder,Persistent,Imp """form""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','upDateImageForm.zpt')).__of__(self) return pt() - + security.declareProtected('View management screens','renameImageForm') def renameImageForm(self): """form""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','renameImageForm.zpt')).__of__(self) return pt() - + + security.declareProtected('View management screens','renameImage') def renameImage(self,newname,RESPONSE=None): """umbenennen""" #umbennen des files im folder @@ -455,28 +476,42 @@ class ImageDigilib(Folder,Persistent,Imp def thumb(self,url=None): """show thumb""" thumbname=os.path.splitext(self.filename)[0]+".jpg" - ## if not os.path.exists("/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+thumbname): -## image=urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:18080/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+self.filename+"&dw=150&mo=lores").read() -## f=open("/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+thumbname,"w") -## f.write(image) -## f.close() -## os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl %s /mpiwg/temp/online/scaled/small 150 &"% self.ImageViewerPath) - - #DEVEL:take nausikaa for server solution - - path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+"&dw=100&dh=100&mo=lores" - #path="/mpiwg/online/"+self.ImageViewerPath+"/"+thumbname + + path=self.scalerPath+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+"&dw=100&dh=100&mo=lores" + self.REQUEST.SESSION['string']=""% path if url: return ""% path else: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumb.zpt')).__of__(self) return pt() + + + def thumbMD(self,url=None): + """show thumb mit Metadaten erwarten image in ImageCollectionMD + """ + thumbname=os.path.splitext(self.filename)[0]+".jpg" + path=self.scalerPath+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+"&dw=100&dh=100&mo=lores" + + self.REQUEST.SESSION['string']=""% path + if url: + return ""% path + else: + + overview=self.ZopeFind(self.aq_parent,obj_ids=['thumb.html']) + if overview: + return getattr(self,overview[0][0])() + else: + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbMD.zpt')).__of__(self) + return pt() + + + def index_html(self): """show image""" #DEVELOP: take first one for server - + #path="http://127.0.0.1:8080/zogilib_images?lv=2&fn="+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0] path="http://content.mpiwg-berlin.mpg.de/zogilib_images?lv=2&fn="+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0] return self.REQUEST.RESPONSE.redirect(path) @@ -506,8 +541,12 @@ class ImageCollection(Folder, Persistent """Sammelordner für Bilder""" meta_type="ImageCollection" - + #scalerPath="http://127.0.0.1:18080/digitallibrary/servlet/Scaler/?fn=" + scalerPath="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn=" + zipThreads={} + zipThreads2={} + genericMetaDataType="leiden_meta" leiden_meta_fields=['image_id','date','country','place','people','description','photographer'] @@ -515,7 +554,18 @@ 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 getScalerPath(self): + """get ScalerPath""" + return self.scalerPath + + def getImageViewerPath(self): + """get ImageViewerPath""" + return self.ImageViewerPath + + def getImageStoragePath(self): + """get ImageStoragePath""" + return self.ImageStoragePath + def refreshTxt(self): """txt fuer refresh""" tn=self.REQUEST.SESSION['threadName'] @@ -535,11 +585,12 @@ class ImageCollection(Folder, Persistent self.zipThreads[thread.getName()[0:]]=threadStart + self.zipThreads2[thread.getName()[0:]]=thread 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) + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self) return pt() #xmltrans.run() else: @@ -551,30 +602,47 @@ class ImageCollection(Folder, Persistent if wait_template: return wait_template[0][1]() - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_Wait.zpt')).__of__(self) + 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() + self.zipThreads2[threadName].join() + del(self.zipThreads2[threadName]) + del(self.zipThreads[threadName]) 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) + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait_result.zpt')).__of__(self) return pt() + + def checkThreads(self): + """teste running threads""" + ret=""" + +

Threads of %s

"""%(self.absolute_url(),self.getId()) + + for threadName in self.zipThreads.keys(): + if self.zipThreads2[threadName].isAlive(): + ret+="

%s --> alive

"%threadName + else: + ret+="

%s --> dead

"%threadName + return ret+"" - def downloadSet(self,fn): """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") len=os.stat(filename)[6] self.REQUEST.RESPONSE.setHeader("Content-Length",len) @@ -858,14 +926,14 @@ 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) + ## 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() +## obj=getattr(self,splitted[1]) +## obj.ImportFiles() def ImportStructure(self,RESPONSE=None): """Import the existing files of a folder""" @@ -1236,13 +1304,13 @@ class ImageCollection(Folder, Persistent return (cols,rows) - def show_thumbs_rows(self,numberOfColumns,numberOfRows=None,startId=None): + def show_thumbs_rows(self,numberOfColumns,numberOfRows=None,startId=None,showall="No"): """Ausgabe anzahl""" idsAll=self.show_thumbs() if len(idsAll)==0: #keine Einträge return 0 - if self.REQUEST.SESSION.has_key("filename"): + if self.REQUEST.SESSION.has_key("filename") and not (showall=="yes"): filename=self.REQUEST.SESSION["filename"] filename=self.getImageByName(filename,onlyName="yes") @@ -1355,8 +1423,26 @@ class ImageCollection(Folder, Persistent return filename else: return fn - def index_html(self): + def index_html(self,fn=None): """main template collection""" + + if fn: + ret=[] + + if type(fn) is ListType: + """experimentell mehr als ein filename""" + for filename in fn: + if not (filename == ""): + ret.append((filename,'',1)) + else: + ret.append((fn,'',1)) + + self.REQUEST.SESSION['filenames']=ret + #self.REQUEST.SESSION['filenamesIds']=fnIds + + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected.zpt')).__of__(self) + return pt() + if self.REQUEST.has_key('filename'): filen=self.REQUEST['filename'] else: @@ -1370,9 +1456,13 @@ class ImageCollection(Folder, Persistent else: self.REQUEST.SESSION['showall']=self.REQUEST.SESSION.get('showall','no') - - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview.zpt')).__of__(self) - return pt() + + overview=self.ZopeFind(self,obj_ids=['overview.html']) + if overview: + return overview[0][1]() + else: + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview.zpt')).__of__(self) + return pt() def manage_AddImageCollectionForm(self): """Nothing yet""" @@ -1388,6 +1478,52 @@ def manage_AddImageCollection(self,id,ti RESPONSE.redirect('manage_main') + +class ImageCollectionMD(ImageCollection,ZSQLExtendFolder): + """Imageviewer and Metadata""" + meta_type="ImageCollection MD" + #scalerPath="http://127.0.0.1:18080/digitallibrary/servlet/Scaler/?fn=" + scalerPath="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn=" + manage_options=ImageCollection.manage_options+( + {'label':'ZSQLExtend','action':'changeZSQLExtendForm'}, + ) + + try: + changeZSQLExtendForm=ZSQLExtendFolder.changeZSQLExtendForm + except: + pass + + def setGenericSearchStringForm(self): + """form setze generischen search string fuer MD""" + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','setGenericSearchStringForm.zpt')).__of__(self) + return pt() + + def setGenericSearchString(self,searchString): + """setze generischen search string""" + self.searchString=searchString + + def thumblistMD(self): + """main template collection""" + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbListMD.zpt')).__of__(self) + return pt() + + +def manage_AddImageCollectionMDForm(self): + """Nothing yet""" + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddImageCollectionFormMD.zpt')).__of__(self) + return pt() + +def manage_AddImageCollectionMD(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString,RESPONSE=None): + """Add ImageCollection""" + newObj=ImageCollectionMD(id,title,ImageStoragePath,ImageViewerPath,defaultMetaString) + self._setObject(id,newObj) + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + + class ImageCollectionIFrame(ImageCollection): """Class fuer Collection set als IFrame""" @@ -1444,3 +1580,85 @@ def manage_AddImageCollectionIFrame(self RESPONSE.redirect('manage_main') +class ImageZogiLib(ImageDigilib): + """Anzeige Object fuer Bilder ausserhalb von collections + ImageViewerPath und ImageStoragePath und wenn vorhanden Pfad zur Collection + werden zusaetzlich abgespeichert + """ + + meta_type="ImageZogiLib" + + manage_options=ImageDigilib.manage_options+( + {'label':'Main Config','action':'changeImageZogiLibForm'}, + ) + + def __init__(self,id,fn,ImageViewerPath,ImageStoragePath,scalerPath,ImageCollectionPath=None,REQUEST=None): + ImageDigilib.__init__(self,id,fn) + self.ImageViewerPath=ImageViewerPath + self.ImageStoragePath=ImageStoragePath + self.ImageCollectionPath=ImageCollectionPath + self.scalerPath=scalerPath + + def changeImageZogiLibForm(self): + """change zogilib Form""" + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeImageZogiLib.zpt')).__of__(self) + return pt() + + + def changeImageZogilib(fn,ImageViewerPath,ImageStoragePath,scalerPath,ImageCollectionPath,REQUEST=None): + """Change it""" + self.ImageViewerPath=ImageViewerPath + self.ImageStoragePath=ImageStoragePath + self.ImageCollectionPath=ImageColectionPath + self.scalerPath=scalerPath + +def manage_AddImageZogiLib(self,id=None,ImageViewerPath=None,ImageStoragePath=None,fileUpload=None,ImageCollectionPath=None,scalerPath=None,libPath=None,caption=None,RESPONSE=None): + """hinzufuegen eineis zogilibImage""" + + if libPath: + splitted=libPath.split("?") + urlSplit=splitted[0].split("/") + params=cgi.parse_qs(splitted[1]) + #is LibPath a digilib path? + if urlSplit[-1]=="Scaler": + if type(params['fn']) is ListType: + fnParam=params['fn'][0] + else: + fnParam=params['fn'] + fileNameSplit=os.path.split(fnParam) + ImageViewerPath=fileNameSplit[0] + id=fileNameSplit[1] + scalerPath=splitted[0]+"?fn=" + else: #assume if not the path is a path to an ImageCollection + if type(params['filename']) is ListType: + id=params['filename'][0] + else: + id=params['filename'] + + server=ServerProxy(splitted[0]) + ImageCollectionPath=libPath + ImageViewerPath=server.getImageViewerPath() + ImageStoragePath=server.getImageStoragePath() + scalerPath=server.getScalerPath() + + + + if fileUpload: + fn=splitPath(fileUpload.filename) + else: + fn=id + + newObj=ImageZogiLib(id,fn,ImageViewerPath,ImageStoragePath,scalerPath,ImageCollectionPath) + + self._setObject(id,newObj) + getattr(self,id).caption=caption[0:] + if fileUpload: + getattr(self,id).uploadImage(fileupload,self.ImageStoragePath) + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + +def manage_AddImageZogiLibForm(self): + """to be done""" +