Annotation of ImageArchive/ImageArchive.py, revision 1.80
1.69 dwinter 1: genericServerPath="http://www.mpiwg-berlin.mpg.de/zogilib_images" #can be changed with main config
1.65 dwinter 2:
3:
4:
1.1 dwinter 5: from OFS.Folder import Folder
1.77 dwinter 6: from OFS.OrderedFolder import OrderedFolder
1.1 dwinter 7: from OFS.SimpleItem import SimpleItem
1.36 dwinter 8: from Globals import Persistent,package_home
1.1 dwinter 9: from Acquisition import Implicit
10: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
11: from Products.PageTemplates.PageTemplate import PageTemplate
1.61 dwinter 12: from xmlrpclib import ServerProxy
1.1 dwinter 13: import re
14: import os
15: import os.path
16: import urllib
17: import xml.dom.minidom
1.27 dwinter 18: import operator
1.31 dwinter 19: import tempfile
20: import shutil
1.41 dwinter 21: from types import *
1.46 dwinter 22: import time
1.53 dwinter 23: from threading import Thread
24: import Queue
1.61 dwinter 25: import cgi
1.77 dwinter 26: import sys
1.75 casties 27: import zLOG
1.64 dwinter 28:
1.77 dwinter 29:
1.68 dwinter 30: from AccessControl import ClassSecurityInfo, getSecurityManager
1.64 dwinter 31:
1.60 dwinter 32: try:
33: from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
34: except:
35: print "ZSQL Extend Folder nicht importiert"
36: print "Metadatendfolder funktioniert nicht!!!"
1.70 casties 37: class ZSQLExtendFolder:
38: """leer"""
39: manage_options=()
1.64 dwinter 40:
41:
42:
1.38 dwinter 43: try:
44: from Products.ECHO_content.ECHO_collection import ECHO_basis
45: except:
46: print "ECHO Elements not imported"
1.40 dwinter 47: class ECHO_basis:
48: """leer"""
1.44 dwinter 49:
1.40 dwinter 50: manage_options=()
51:
52:
1.55 dwinter 53: tdir = "/mpiwg/temp/tmp/archivesImageServer/"
54: #tdir="/tmp/archivesImageServer/"
1.41 dwinter 55:
1.77 dwinter 56: imageExtensions=['jpg','jpeg','tif','tiff','png']
57:
1.30 dwinter 58: def splitPath(str):
1.64 dwinter 59: str2=str.replace("\\","/")
60: return os.path.split(str2)[1]
1.30 dwinter 61:
1.1 dwinter 62: def getText(nodelist):
63:
64: rc = ""
65: for node in nodelist:
66:
1.64 dwinter 67: if node.nodeType == node.TEXT_NODE:
1.1 dwinter 68: rc = rc + node.data
69: return rc
70:
1.44 dwinter 71: def getTextFromNode(nodename):
72: nodelist=nodename.childNodes
73: rc = ""
74: for node in nodelist:
1.64 dwinter 75: if node.nodeType == node.TEXT_NODE:
1.44 dwinter 76: rc = rc + node.data
77: return rc
78:
1.53 dwinter 79: class generateSet:
80: """generateSetThread"""
81:
1.55 dwinter 82:
1.56 dwinter 83: def __init__(self,filenames,filenamesIds,ImageViewerPath,ids,url,local=None,version="working"):
1.53 dwinter 84: """init generateSet"""
85: self.filenames=filenames
86: self.filenamesIds=filenamesIds
87: self.ImageViewerPath=ImageViewerPath
88: self.ids=ids
89: self.local=local
90: self.url=url
91: self.version=version
92: self.done=None
1.60 dwinter 93:
1.55 dwinter 94:
1.53 dwinter 95: def __call__(self):
96: """call generate Set"""
97:
98: storeTempDir=tempfile.tempdir
1.64 dwinter 99: tempfile.tempdir=tdir
1.54 dwinter 100:
1.53 dwinter 101: tmpPath=tempfile.mktemp()
1.56 dwinter 102: tmpZip=tempfile.mktemp()+".gtz"
1.53 dwinter 103: tmpFn=os.path.split(tmpZip)[1]
104:
105: if not os.path.exists(tempfile.tempdir):
106: os.mkdir(tempfile.tempdir)
107:
108: if not os.path.exists(tmpPath):
1.64 dwinter 109: os.mkdir(tmpPath)
110:
111: self.response=""
1.53 dwinter 112:
113:
114: self.response="<h3>1. step: getting the images</h3>"
115:
116: for id in self.filenames:
117:
1.64 dwinter 118: if self.filenamesIds.has_key(id[0]):
119: filename=self.filenamesIds[id[0]][0]+"_"+id[0]
120: else:
121: filename=id[0]
1.53 dwinter 122:
123: self.response+=str("<p>Get File: %s<br>\n"%filename)
124:
1.63 dwinter 125:
1.64 dwinter 126: if self.local:
127:
128: if self.version=="working":
129:
130: sourcePath="/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+os.path.splitext(id[0])[0]+".jpg"
131: else:
132: sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+id[0]
133: targetPath=tmpPath+"/"+filename
134: try:
1.53 dwinter 135: shutil.copyfile(sourcePath,targetPath)
1.64 dwinter 136: except:
1.53 dwinter 137: self.response+=(str("<p>Error in File: %s (possible missing)<br>\n"%filename))
1.64 dwinter 138: else:
139: if self.version=="working":
1.65 dwinter 140: requestString=self.ImageViewerPath+"/"+os.path.splitext(urllib.quote(id[0]))[0]+"&dh=2000&dw=2000"
141: path=getattr(self,'serverPath',genericServerPath)+"/scaledImage?fn="+requestString
142:
1.64 dwinter 143: else:
1.65 dwinter 144: requestString=self.ImageViewerPath+"/"+os.path.splitext(urllib.quote(id[0]))[0]+"&mo=rawfile,hires"
145: path=getattr(self,'serverPath',genericServerPath)+"/scaledImage?fn="+requestString
146:
147:
1.64 dwinter 148: image=urllib.urlopen(path).read()
149:
150:
151: fh=file(tmpPath+"/"+filename,"w")
152:
153:
154: fh.write(image)
155: fh.close()
1.53 dwinter 156:
157: #folgeseiten
1.64 dwinter 158:
159: if int(self.filenamesIds[id[0]][1])>1:
160: #ids=self.show_thumbs()
161:
162: try:
1.53 dwinter 163: nr=self.ids.index(id[0])
1.64 dwinter 164: except:
1.56 dwinter 165: self.response+=str("<p>Error in File: %s (possible missing)<br>\n"%id[0])
1.53 dwinter 166:
167:
168: nr=0
169:
1.64 dwinter 170: numberOfPages=self.filenamesIds[id[0]][1]
171: for k in range(int(numberOfPages)-1):
172: i=k+1
173: if self.filenamesIds.has_key(id[0]):
174: filename=self.filenamesIds[id[0]][0]+"_"+self.ids[nr+i]
175: else:
176: filename=id[0]
1.53 dwinter 177:
178: self.response+=str("<p>Get File: %s<br>\n"%filename)
179:
1.64 dwinter 180: if self.local:
181: sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+self.ids[nr+i]
182: targetPath=tmpPath+"/"+filename
183: try:
184: shutil.copyfile(sourcePath,targetPath)
185:
186: except:
1.53 dwinter 187: self.response+=str("<p>Error in File: %s (missing?)<br>\n"%filename)
1.64 dwinter 188:
189: else:
1.65 dwinter 190:
191: requestString=self.ImageViewerPath+"/"+os.path.splitext(ids[nr+i])[0]+"&mo=rawfile,hires"
192: path=getattr(self,'serverPath',genericServerPath)+"/scaledImage?fn="+requestString
1.64 dwinter 193:
194: image=urllib.urlopen(path).read()
195:
196:
197: fh=file(tmpPath+"/"+filename,"w")
198: fh.write(image)
199: fh.close()
1.53 dwinter 200:
201: self.response+="<h3>2. step: creating the downloadable file</h3>"
1.64 dwinter 202: self.response+="<p>Create gtar<br>"
1.53 dwinter 203: self.response+="<p>This can take a while....<br>\n"
204:
1.56 dwinter 205: fh=os.popen2("gnutar zcvf %s %s/*"%(tmpZip,tmpPath),1)[1]
1.53 dwinter 206: self.response+="<br>"
207: for c in fh.read():
208: self.response+=c
209: if c==")":
210: self.response+="<br>\n"
1.64 dwinter 211:
212:
1.53 dwinter 213:
214:
215: shutil.rmtree(tmpPath)
216:
217: self.response+="<p>finished<br>\n"
218:
219: len=os.stat(tmpZip)[6]
220: downloadUrl=self.url+"/downloadSet"
221: self.response+="""<h1><a href="downloadSet?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len)
222: self.response+="""<p>The file will be stored for a while, you can download it later, the URL is:</p>
1.64 dwinter 223: <p><a href="downloadSet?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn)
1.53 dwinter 224:
225: self.done=True
226: def getResult(self):
227: """get result"""
228: return self.response
229:
230: def isDone(self):
231: if self.done:
232: return True
233: else:
234: return False
235:
1.44 dwinter 236: class metaData(SimpleItem):
237: """Klasse fuer metadaten"""
238: meta_type="metaData"
239:
240: def __init__(self,xmlurl,container=None):
241: """__init__"""
242: return self.update(xmlurl,container)
1.1 dwinter 243:
1.44 dwinter 244:
245: def update(self,xmlurl,container=None):
246: """update"""
247:
248: try:
249: xmlfh=urllib.urlopen(xmlurl)
250: dom=xml.dom.minidom.parse(xmlfh)
251: except:
252: return None
253:
254: md=dom.getElementsByTagName(container)
255: mlist=[]
256: if md:
257: for node in md[0].childNodes:
258: if node.nodeType==dom.ELEMENT_NODE:
259: name=node.tagName
260: content=getTextFromNode(node)
261: setattr(self,name,content)
262: mlist.append(name)
263: self.mlist=mlist[0:]
264: else:
265: self.mlist=[]
266:
267: def index_html(self):
268: """index"""
269: ret="<html><body>"
270: for tag in self.mlist:
271: ret+="<p>%s=%s</p>"%(tag,getattr(self,tag))
272: return ret+"</body></html>"
273:
1.61 dwinter 274:
275:
276:
1.6 dwinter 277: class ImageDigilib(Folder,Persistent,Implicit):
1.1 dwinter 278: """Anzeige object fuer digilib"""
279: meta_type="ImageDigilib"
1.63 dwinter 280: security=ClassSecurityInfo()
1.6 dwinter 281: leiden_meta_fields=['image_id','date','country','place','people','description','photographer']
282:
283: manage_options = Folder.manage_options+(
284:
285: {'label':'Add Metadata','action':'addMetaObjectForm'},
286:
287: )
288:
1.68 dwinter 289: def getAccessRight(self):
290: """get the accessright, return is string "extern" or "intern" """
291: return self.getRights(self.filename.split('.')[0])
292:
1.72 dwinter 293: security.declarePublic('isAccessible')
294:
1.68 dwinter 295: def isAccessible(self):
296: """gives true if obejct is accessible taking the rights of the user into account"""
297:
298: #TODO: implement rights, currently true if external and false if internal, and true if user has role authenticated
299:
300: username=self.REQUEST['AUTHENTICATED_USER']
301: #print username
302: #print self.acl_users.getUserNames()
303: user=getSecurityManager().getUser()
304:
305: roles=user.getRoles()
1.76 dwinter 306:
1.77 dwinter 307:
308: if self.getRightsQuery()=="":
1.76 dwinter 309: #query empty then always true
310: return True
311:
1.77 dwinter 312:
1.68 dwinter 313: if 'Authenticated' in roles:
314: return True
315:
316: if self.getAccessRight()=="extern":
317: return True
318: else:
319: return False
320:
1.6 dwinter 321: def addMetaObject(self,id,RESPONSE=None):
322: """Add an MetaObject"""
323: objectType=getattr(self.Control_Panel.Products.ImageMetaData,self.genericMetaDataType)
324:
325: request=self.REQUEST
326: objectCreate=objectType.createObjectManager(id,request)
1.24 dwinter 327:
1.6 dwinter 328: self._setObject(id,objectCreate)
329:
330: objectCreate.propertysheets.meta.manage_editProperties(request)
331:
332: if RESPONSE is not None:
333: RESPONSE.redirect('manage_main')
334:
335:
336:
337:
338: def addMetaObjectForm(self):
339: """Add Form"""
1.36 dwinter 340: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMetaObject.zpt')).__of__(self)
1.6 dwinter 341: return pt()
342:
343:
1.3 dwinter 344: def __init__(self,id,filename,meta=None):
1.1 dwinter 345: self.id=id
346: self.title=filename
347: self.filename=filename
1.3 dwinter 348: self.meta=meta
1.1 dwinter 349:
1.70 casties 350: def getBasename(self):
351: """returns base filename (sans extension)"""
352: return os.path.splitext(self.filename)[0]
1.65 dwinter 353:
1.3 dwinter 354: def getMeta(self):
355: """ausgabe der metadaten"""
356: return self.meta
1.44 dwinter 357:
358: def manageMetaData(self,strict=None):
359: """create or updateMetadata"""
360:
361: md=self.ZopeFind(self,obj_metatypes=["metaData"])
362:
363: if not md:
364: self._setObject("metaData",metaData(self.meta,"ROW"))
365:
366: else:
367: if not strict:
368: md[0][1].update(self.meta,"ROW")
369: else:
370: print "strict"
371: if len(md[0][1].mlist)==0:
372: print " +++",self.getId()
373: md[0][1].update(self.meta,"ROW")
374: else:
375: print " ---",self.getId()
376:
1.1 dwinter 377: def uploadImage(self,fileupload,path_name):
378: """upload an Image from an Requast"""
379: #path_name=self.ImageStoragePath
1.74 casties 380: fn = self.filename or splitPath(fileupload.filename)
1.29 dwinter 381: filename=path_name+"/"+fn
1.1 dwinter 382: filedata=fileupload.read()
383: f=open(filename,"w")
384: f.write(filedata)
385: f.close()
1.74 casties 386: self.filename = fn
1.23 dwinter 387: try:
1.41 dwinter 388: os.chmod(filename,0664)
1.23 dwinter 389: except:
390: """hack"""
1.64 dwinter 391: #scale thumb
392:
1.35 dwinter 393: self.scaleThumbs()
394:
1.64 dwinter 395: #scale standard
1.23 dwinter 396:
1.64 dwinter 397: self.scaleWorkingVersions()
1.3 dwinter 398:
1.64 dwinter 399:
400:
1.35 dwinter 401: def downloadWorkingVersion(self):
1.64 dwinter 402: """download working version (2000 pixel)"""
403:
404: return self.download(fmt="&dw=2000&dh=2000",suffix=".jpg")
1.7 dwinter 405:
1.35 dwinter 406: def download(self,fmt="&mo=rawfile,hires",suffix=None):
1.1 dwinter 407: """download"""
1.65 dwinter 408:
409: requestString=self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+fmt
410: path=getattr(self,'serverPath',genericServerPath)+"/scaledImage?fn="+requestString
411:
1.64 dwinter 412:
413: if self.REQUEST.SESSION.has_key('filenamesIds') and self.REQUEST.SESSION['filenamesIds'].has_key(self.filename):
414: filename=self.REQUEST.SESSION['filenamesIds'][self.filename][0]+"_"+self.filename
415: else:
416: filename=self.filename
417:
418: if suffix:
419: filename=os.path.splitext(filename)[0]+suffix
420:
421: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%filename)
422: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
1.44 dwinter 423: #print path
1.64 dwinter 424: imagefh=urllib.urlopen(path,'rb')
1.44 dwinter 425:
1.64 dwinter 426: self.REQUEST.RESPONSE.write(imagefh.read())
427: self.REQUEST.RESPONSE.close()
1.31 dwinter 428: #return self.REQUEST.RESPONSE.redirect(path)
1.36 dwinter 429:
430: def updateImageForm(self):
1.65 dwinter 431: """form"""
432: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','upDateImageForm.zpt')).__of__(self)
433: return pt()
1.64 dwinter 434:
435:
1.63 dwinter 436: security.declareProtected('View management screens','renameImageForm')
1.43 dwinter 437: def renameImageForm(self):
1.65 dwinter 438: """form"""
439: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','renameImageForm.zpt')).__of__(self)
440: return pt()
1.63 dwinter 441:
442: security.declareProtected('View management screens','renameImage')
1.43 dwinter 443: def renameImage(self,newname,RESPONSE=None):
1.64 dwinter 444: """umbenennen"""
445: #umbennen des files im folder
446: oldname=self.getId()
447: self.aq_parent.manage_renameObjects(ids=[oldname],new_ids=[newname])
448: self.title=newname[0:]
449: self.filename=newname[0:]
1.43 dwinter 450: #umbennen des files auf dem server
1.64 dwinter 451: oldpath=os.path.join(self.ImageStoragePath,oldname)
452: newpath=os.path.join(self.ImageStoragePath,newname)
1.43 dwinter 453: os.rename(oldpath,newpath)
1.64 dwinter 454:
455: #umbenennen des versionsfolders
456: oldfolder=os.path.join(self.ImageStoragePath,"."+oldname+".dir")
1.46 dwinter 457: newfolder=os.path.join(self.ImageStoragePath,"."+newname+".dir")
1.64 dwinter 458: if os.path.exists(oldfolder):
1.46 dwinter 459: os.rename(oldfolder,newfolder)
460: else:
461: os.mkdir(newfolder)
462:
1.64 dwinter 463: #schreibe info uber umbennenung
1.46 dwinter 464:
465: renameName=os.path.join(newfolder,"renamed")
466: if os.path.exists(renameName):
467: fh=file(renameName,'a')
468: else:
469: fh=file(renameName,'w')
470:
471: tm=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
472: try:
473: user=self.REQUEST['AUTHENTICATED_USER']
474: except:
475: user="unknown"
476:
477: str="""%s %s %s %s\n"""%(tm,user,oldname,newname)
478: fh.write(str)
479: fh.close()
480:
1.43 dwinter 481: #scale thumb
1.64 dwinter 482:
483: self.scaleThumbs()
484:
485: #scale standard
1.43 dwinter 486:
1.64 dwinter 487: self.scaleWorkingVersions()
1.43 dwinter 488:
489:
490: if RESPONSE:
1.64 dwinter 491: RESPONSE.redirect(self.aq_parent.absolute_url()+"?filename="+self.filename)
492:
1.43 dwinter 493:
494: def updateImage(self,file,rename=None,RESPONSE=None):
1.64 dwinter 495: """lade neues Version des Bildes"""
496: #teste ob Dokumenten ordner schon vorhanden
1.75 casties 497: #imagePath=os.path.join(self.ImageStoragePath,self.getId())
498: imagePath=os.path.join(self.ImageStoragePath,self.filename)
1.64 dwinter 499: path=os.path.join(self.ImageStoragePath,"."+self.getId()+".dir")
500:
501: if not os.path.exists(path):
502: os.mkdir(path,0775)
503: os.chmod(path,0775)
504:
505: versionNumber=getattr(self,'versionNumber',0)+1
506:
507: #teste ob version schon existiert
508:
1.75 casties 509: while os.path.exists(os.path.join(path,"V%i_%s"%(versionNumber,self.filename))):
1.64 dwinter 510: versionNumber+=1
511:
512: #kopieren der bestehenden Version in den Versions ordner.
1.75 casties 513: imageNewPath=os.path.join(path,"V%i_%s"%(versionNumber,self.filename))
514: try:
515: #zLOG.LOG("ImageArchive:updateImage", zLOG.INFO, "rename: %s -> %s"%(imagePath,imageNewPath))
516: os.rename(imagePath,imageNewPath)
517: except:
518: zLOG.LOG("ImageArchive:updateImage", zLOG.ERROR, "rename: %s -> %s didn't work!"%(imagePath,imageNewPath))
1.64 dwinter 519:
520: #lesen des upload files und schreiben
521: filedata=file.read()
1.75 casties 522: f=open(imagePath,"w") # if we wanted to have filename=id we should do it here!
1.64 dwinter 523: f.write(filedata)
524: f.close()
525: try:
526: os.chmod(imagePath,0664)
527: except:
528: """hack"""
529: #scale thumb
530:
531: self.scaleThumbs()
532:
533: #scale standard
534:
535: self.scaleWorkingVersions()
536:
537: if rename:
538: self.renameImage(file.filename)
539:
540:
541: if RESPONSE:
542: RESPONSE.redirect(self.aq_parent.absolute_url()+"?filename="+self.filename)
543:
1.43 dwinter 544:
1.64 dwinter 545: return "done"
1.72 dwinter 546:
547: security.declarePublic('thumb')
1.45 dwinter 548: def thumb(self,url=None):
1.1 dwinter 549: """show thumb"""
1.3 dwinter 550: thumbname=os.path.splitext(self.filename)[0]+".jpg"
1.65 dwinter 551: requestString=self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+"&dw=100&dh=100&mo=lores"
552: path=getattr(self,'serverPath',genericServerPath)+"/scaledImage?fn="+requestString
1.60 dwinter 553:
554:
1.14 dwinter 555: self.REQUEST.SESSION['string']="<img border=\"0\" src=\"%s\">"% path
1.45 dwinter 556: if url:
557: return "<img border=\"0\" src=\"%s\">"% path
558: else:
559: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumb.zpt')).__of__(self)
560: return pt()
1.60 dwinter 561:
562:
563: def thumbMD(self,url=None):
564: """show thumb mit Metadaten erwarten image in ImageCollectionMD
565: """
566: thumbname=os.path.splitext(self.filename)[0]+".jpg"
1.65 dwinter 567:
568: requestString=self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+"&dw=100&dh=100&mo=lores"
569: path=getattr(self,'serverPath',genericServerPath)+"/scaledImage?fn="+requestString
570:
571:
1.60 dwinter 572:
573: self.REQUEST.SESSION['string']="<img border=\"0\" src=\"%s\">"% path
574: if url:
575: return "<img border=\"0\" src=\"%s\">"% path
576: else:
577:
578: overview=self.ZopeFind(self.aq_parent,obj_ids=['thumb.html'])
579: if overview:
580: return getattr(self,overview[0][0])()
581: else:
582: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbMD.zpt')).__of__(self)
583: return pt()
584:
585:
1.65 dwinter 586: def image(self,dw=None,dh=None):
587: """show image only with scaler"""
588: str=[]
589: if (not dw) and (not dh):
590: str.append("mo=file")
591: if dw:
592: str.append("dw=%s"%dw)
1.60 dwinter 593:
1.65 dwinter 594: if dh:
595: str.append("dw=%s"%dh)
596:
597: str.append("lv=2&fn=%s"%self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0])
598:
599:
600: requestString="&".join(str)
601:
602: self.REQUEST.RESPONSE.redirect(getattr(self,'serverPath',genericServerPath)+"/scaledImage?"+requestString)
603:
1.1 dwinter 604: def index_html(self):
1.65 dwinter 605: """show image with zogilib"""
1.8 dwinter 606: #DEVELOP: take first one for server
1.61 dwinter 607: #path="http://127.0.0.1:8080/zogilib_images?lv=2&fn="+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]
1.65 dwinter 608: path=getattr(self,'serverPath',genericServerPath)+"?lv=2&fn="+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]
1.1 dwinter 609: return self.REQUEST.RESPONSE.redirect(path)
610:
611:
612: def manage_AddImageDigilibForm(self):
613: """Nothing yet"""
1.36 dwinter 614: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddImageDigilibForm.zpt')).__of__(self)
1.1 dwinter 615: return pt()
616:
1.3 dwinter 617: def manage_AddImageDigilib(self,id,fileupload,meta=None,RESPONSE=None):
1.1 dwinter 618: """Add ImageCollection"""
1.41 dwinter 619:
1.1 dwinter 620: #fileupload=self.REQUEST['fileupload']
1.74 casties 621: #fn=splitPath(fileupload.filename)
622: fn = id # filename is the same as id
1.29 dwinter 623: newObj=ImageDigilib(id,fn,meta)
1.1 dwinter 624:
625: self._setObject(id,newObj)
626: getattr(self,id).uploadImage(fileupload,self.ImageStoragePath)
627:
628: if RESPONSE is not None:
629: RESPONSE.redirect('manage_main')
630:
631:
1.41 dwinter 632:
1.77 dwinter 633: class ImageCollection(OrderedFolder, Persistent, Implicit,ECHO_basis):
1.64 dwinter 634: """Sammelordner fuer Bilder"""
635: meta_type="ImageCollection"
1.41 dwinter 636:
1.6 dwinter 637:
1.64 dwinter 638: security=ClassSecurityInfo()
639:
1.61 dwinter 640: #scalerPath="http://127.0.0.1:18080/digitallibrary/servlet/Scaler/?fn="
1.65 dwinter 641: #scalerPath="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="
1.60 dwinter 642:
1.53 dwinter 643: zipThreads={}
1.55 dwinter 644: zipThreads2={}
645:
1.6 dwinter 646: genericMetaDataType="leiden_meta"
647:
648: leiden_meta_fields=['image_id','date','country','place','people','description','photographer']
649:
1.3 dwinter 650:
651: 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
1.7 dwinter 652:
1.70 casties 653: imgcoll_main = PageTemplateFile('zpt/overview', globals())
1.77 dwinter 654: imgcoll_mainMD = PageTemplateFile('zpt/overviewMD', globals())
1.70 casties 655: imgcoll_thumb = PageTemplateFile('zpt/thumb', globals())
1.77 dwinter 656: imgcoll_thumbMD = PageTemplateFile('zpt/thumbMD', globals())
1.70 casties 657:
1.77 dwinter 658: def getImageObject(self,name):
659: """gibt objeckt name zurueck"""
660: if hasattr(self,name):
661: return getattr(self,name)
662:
663: name=os.path.splitext(name)[0]
664: for extension in imageExtensions:
665: nameExt=name+"."+extension
666:
667: if hasattr(self,nameExt):
668: return getattr(self,nameExt)
669:
670: nameExt=name+"_."+extension
671: if hasattr(self,nameExt):
672: return getattr(self,nameExt)
673:
674: return getattr(self,"defaultImg")
675:
1.69 dwinter 676: def getServerPath(self):
677: """get Server path"""
678: return getattr(self,'serverPath',genericServerPath)
679:
1.61 dwinter 680: def getScalerPath(self):
681: """get ScalerPath"""
1.65 dwinter 682: path=getattr(self,'serverPath',genericServerPath)+"/scaledImage?fn="
1.61 dwinter 683:
684: def getImageViewerPath(self):
685: """get ImageViewerPath"""
686: return self.ImageViewerPath
687:
688: def getImageStoragePath(self):
689: """get ImageStoragePath"""
690: return self.ImageStoragePath
691:
1.53 dwinter 692: def refreshTxt(self):
693: """txt fuer refresh"""
694: tn=self.REQUEST.SESSION['threadName']
695: return """ 2;url=%s?repeat=%s """%(self.absolute_url()+"/createSet",tn)
696:
697: def createSet(self,RESPONSE=None,local=None,version="working",repeat=None):
1.64 dwinter 698: """download aller gewaehlten files"""
1.31 dwinter 699:
1.53 dwinter 700: threadName=repeat
701:
702:
703: if not threadName or threadName=="":
704: threadStart=generateSet(self.REQUEST.SESSION['filenames'],self.REQUEST.SESSION['filenamesIds'],self.ImageViewerPath,self.show_thumbs(),self.absolute_url(),local=local,version=version)
705: thread=Thread(target=threadStart)
706:
707: thread.start()
1.31 dwinter 708:
1.53 dwinter 709:
710: self.zipThreads[thread.getName()[0:]]=threadStart
1.55 dwinter 711: self.zipThreads2[thread.getName()[0:]]=thread
1.53 dwinter 712: self.REQUEST.SESSION['threadName']=thread.getName()[0:]
713: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['zip_wait_template'])
714: if wait_template:
715: return wait_template[0][1]()
1.54 dwinter 716: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
1.53 dwinter 717: return pt()
718: #xmltrans.run()
719: else:
720: self.REQUEST.SESSION['threadName']=threadName
1.31 dwinter 721:
1.53 dwinter 722: if (self.zipThreads[threadName].getResult()==None):
1.31 dwinter 723:
1.53 dwinter 724: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
725: if wait_template:
1.64 dwinter 726: return wait_template[0][1]()
1.53 dwinter 727:
1.54 dwinter 728: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
1.53 dwinter 729: return pt()
730: else:
731: if self.zipThreads[threadName].isDone():
732: self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
1.55 dwinter 733: self.zipThreads2[threadName].join()
734: del(self.zipThreads2[threadName])
735: del(self.zipThreads[threadName])
1.53 dwinter 736: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_result.zpt')).__of__(self)
737: return pt()
738:
739: else:
740: self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
741: self.REQUEST.SESSION['threadName']=threadName
1.54 dwinter 742: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait_result.zpt')).__of__(self)
1.53 dwinter 743: return pt()
1.31 dwinter 744:
745:
746:
1.33 dwinter 747:
1.55 dwinter 748:
749: def checkThreads(self):
750: """teste running threads"""
751: ret="""<html>
752: <head>
753: <meta http-equiv="REFRESH" content="5;url=%s/checkThreads"
754: <body><h2>Threads of %s</h2>"""%(self.absolute_url(),self.getId())
755:
756: for threadName in self.zipThreads.keys():
757: if self.zipThreads2[threadName].isAlive():
758: ret+="<p>%s --> alive</p>"%threadName
759: else:
760: ret+="<p>%s --> dead</p>"%threadName
761: return ret+"</body></html>"
1.53 dwinter 762:
1.31 dwinter 763: def downloadSet(self,fn):
1.64 dwinter 764: """download prepared set"""
765: filename=os.path.join(tdir,fn)
1.54 dwinter 766:
1.64 dwinter 767:
768: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%"image.tgz")
769: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
770: len=os.stat(filename)[6]
771: self.REQUEST.RESPONSE.setHeader("Content-Length",len)
772: images=file(filename).read()
773: self.REQUEST.RESPONSE.write(images)
774: self.REQUEST.RESPONSE.close()
1.31 dwinter 775:
1.64 dwinter 776:
777:
1.31 dwinter 778: def scaleThumbs(self,RESPONSE=None):
1.7 dwinter 779: """scale thumbs"""
1.64 dwinter 780:
781: #scale thumbs
1.35 dwinter 782: ret=os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl -src=/mpiwg/online/ -dir=%s -dest=/mpiwg/temp/online/scaled/thumb -scaleto=100 &"% self.ImageViewerPath)
1.64 dwinter 783: if RESPONSE:
784: RESPONSE.write(ret.read())
785: RESPONSE.write("\n")
786:
1.35 dwinter 787: return "RESCALING STARTED"
788:
789: def scaleWorkingVersions(self,RESPONSE=None):
790: """scale working versions"""
1.64 dwinter 791:
792: #scale standard
1.35 dwinter 793:
1.64 dwinter 794: ret=os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl -src=/mpiwg/online/ -dir=%s -dest=/mpiwg/temp/online/scaled/small -scaleto=2000 &"% self.ImageViewerPath)
795: if RESPONSE:
796: RESPONSE.write(ret.read())
797: RESPONSE.write("\n")
798: return "rescaling started"
1.35 dwinter 799:
800:
1.3 dwinter 801:
1.65 dwinter 802: def __init__(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString,serverPath=genericServerPath):
1.1 dwinter 803: self.id=id
804: self.title=title
805: self.ImageStoragePath=ImageStoragePath
806: self.ImageViewerPath=ImageViewerPath
1.3 dwinter 807: self.defaultMetaString=defaultMetaString
1.65 dwinter 808: self.serverPath=serverPath
1.70 casties 809: self.defaultrows = 6
810: self.defaultcols = 2
1.1 dwinter 811:
1.41 dwinter 812: optTMP= Folder.manage_options
1.38 dwinter 813:
814: manage_options = optTMP+(
1.1 dwinter 815: {'label':'Main Config','action':'ImageCollection_config'},
816: {'label':'Import','action':'ImportFiles'},
1.44 dwinter 817: {'label':'Recalculate MetadataLink','action':'recalculateMetaLink'},
818: {'label':'Import Metadata File','action':'importMetaFileForm'},
819: {'label':'Import Metadata','action':'importMetaData'},
1.7 dwinter 820: {'label':'Rescale thumbs','action':'scaleThumbs'},
1.64 dwinter 821: {'label':'Rescale working version','action':'scaleWorkingVersions'},
1.6 dwinter 822: )
823:
1.38 dwinter 824:
1.44 dwinter 825:
826: def importMetaData(self,strict=None):
827: """import metadata, if strict ist not None then only metadata will be rebuild where metadata is empty"""
828:
829: for image in self.ZopeFind(self,obj_metatypes=["ImageDigilib"]):
1.72 dwinter 830:
1.44 dwinter 831: image[1].manageMetaData(strict)
832: return "ok"
1.23 dwinter 833:
1.44 dwinter 834:
835: def importMetaFileForm(self):
1.6 dwinter 836: """import metadata"""
1.36 dwinter 837: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','importMeta.zpt')).__of__(self)
1.6 dwinter 838: return pt()
1.3 dwinter 839:
1.44 dwinter 840: def importMetaFile(self,fileupload,tag):
1.6 dwinter 841: """import"""
842: filedata=fileupload.read()
843: dom=xml.dom.minidom.parseString(filedata)
844: rows=dom.getElementsByTagName(tag)
845: #print "ROWS",rows
846: request=self.REQUEST
847: for row in rows:
848:
849: for a in self.leiden_meta_fields:
850: self.REQUEST[a]=getText(row.getElementsByTagName(a)[0].childNodes)
851:
852: image_id=self.REQUEST['image_id']
853: if (not hasattr(self,image_id)) & (not image_id==""):
1.8 dwinter 854: #print image_id
1.6 dwinter 855: newObj=ImageCollection(str(image_id),image_id,'','','')
856: self._setObject(str(image_id),newObj)
857:
858: id="leiden_meta_data_file"
859: self.REQUEST['id']=id
860: #objectType=getattr(self.Control_Panel.Products.ImageMetaData,self.genericMetaDataType)
861: #objectCreate=objectType.createInObjectManager(id,request)
862: #href="http://localhost:8080/tests/testcollection/manage_addProduct/ImageMetaData/leiden_meta_factory/"
863: try:
864: addID=getattr(self,image_id)
865: objectCreate=addID.manage_addProduct['ImageMetaData'].leiden_meta_add(id)
866: #getattr(self,image_id)._setObject(id,objectCreate)
867: obj=getattr(addID,id)
868: obj.propertysheets.meta.manage_editProperties(request)
869: except:
870: """nothing"""
871: return "OK"
872:
1.1 dwinter 873:
1.31 dwinter 874: def nextImage(self,request,selected=None,returnFn=None):
1.7 dwinter 875: """show nextimage"""
1.13 dwinter 876: try:
877: ids=self.show_thumbs()
878: if request.SESSION.has_key("filename"):
879: filename=request.SESSION["filename"]
880: try:
881: nr=ids.index(filename)
1.64 dwinter 882:
1.13 dwinter 883: except:
884: nr=0
885: else:
1.7 dwinter 886: nr=0
887:
1.13 dwinter 888: if nr==len(ids)-1:
1.64 dwinter 889: return ""
1.13 dwinter 890: else:
1.64 dwinter 891: if returnFn:
892: return ids[nr+1]
893:
1.13 dwinter 894: if selected:
895: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr+1]+"\" target=\"_top\">next image</a>"
896: else:
897: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr+1]+"\" target=\"_top\">next image</a>"
898: except:
1.7 dwinter 899: return ""
1.13 dwinter 900:
1.7 dwinter 901: def prevImage(self,request,selected=None):
902: """show nextimage"""
903: #return self.getId()
1.13 dwinter 904: try:
905: ids=self.show_thumbs()
906: if request.SESSION.has_key("filename"):
907: filename=request.SESSION["filename"]
908: try:
909: nr=ids.index(filename)
910: except:
911: nr=0
912: else:
1.7 dwinter 913: nr=0
1.3 dwinter 914:
1.13 dwinter 915: if nr==0:
916: return ""
917: else:
918: if selected:
919: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr-1]+"\" target=\"_top\">previous image</a>"
920: else:
921: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr-1]+"\" target=\"_top\">previous image</a>"
922: except:
1.7 dwinter 923: return ""
1.6 dwinter 924:
1.3 dwinter 925: def meta_default(self,filename):
926: """url der metadaten"""
1.44 dwinter 927: return self.defaultMetaString % urllib.quote(filename)
1.3 dwinter 928:
1.2 dwinter 929: def getThumbAttribute(self,id,attr):
930: if hasattr(self,id):
931: return getattr(getattr(self,id),attr)
932: else:
933: if attr=='title':
934: return "<b>Missing Image:%s</b>" % id
935:
936: def getThumbFunction(self,id,attr):
937: #return "DUMP"
938: if hasattr(self,id):
939: return getattr(getattr(self,id),attr)()
940:
941:
1.1 dwinter 942: def xmlinput(self,url):
1.70 casties 943: """Anzeige von ausgewaehlten thumbs"""
1.1 dwinter 944: #return url
1.5 dwinter 945:
946: url=urllib.unquote(url)
1.1 dwinter 947: xmldoc=urllib.urlopen(url).read()
1.39 dwinter 948: #return xmldoc
1.64 dwinter 949: try:
950: dom=xml.dom.minidom.parseString(xmldoc)
1.31 dwinter 951: except:
1.77 dwinter 952: return "ERROR: (%s %s) %s"%(sys.exc_info()[0],sys.exc_info()[1],xmldoc)
953:
1.64 dwinter 954: images=dom.getElementsByTagName('image')
1.31 dwinter 955:
1.1 dwinter 956: rc=[]
1.64 dwinter 957: fnIds={}
1.1 dwinter 958: for image in images:
1.64 dwinter 959: imagename=image.getElementsByTagName('imagename')[0]
1.77 dwinter 960:
1.39 dwinter 961:
962:
1.64 dwinter 963:
964: idnr=image.getElementsByTagName('idnr')[0]
965: id=getText(idnr.childNodes)
966: try:
1.72 dwinter 967: numberOfPages=image.getElementsByTagName('numberOfPages')[0]
1.64 dwinter 968: except:
1.72 dwinter 969: numberOfPages=None
970:
971: if numberOfPages:
972: nopT=getText(numberOfPages.childNodes)
973: try:
974: nop=int(nopT)
975: except:
976: nop=0
977: else:
978: nop=0
979:
1.39 dwinter 980: texts=getText(imagename.childNodes).split("\n") #mehrere bilder in return getrennter liste
981: for text in texts:
982: if not text=="":
1.77 dwinter 983: text=self.getImageByName(text,onlyName="yes")
1.64 dwinter 984: try:
985: rc.append((str(text),id,nop))
986: fnIds[str(text)]=(id,nop)
987: except:
988: rc.append((repr(text),id,nop))
989: fnIds[repr(text)]=(id,nop)
1.39 dwinter 990:
1.37 dwinter 991:
1.2 dwinter 992: rc.sort()
1.1 dwinter 993: self.REQUEST.SESSION['filenames']=rc
1.64 dwinter 994: self.REQUEST.SESSION['filenamesIds']=fnIds
995:
1.72 dwinter 996: overview=self.ZopeFind(self,obj_ids=['overview_selected.html'])
997:
998: if overview:
999: return overview[0][1]()
1000: else:
1001: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected.zpt')).__of__(self)
1002: return pt()
1003:
1.36 dwinter 1004: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected.zpt')).__of__(self)
1.1 dwinter 1005: return pt()
1006:
1.44 dwinter 1007: def recalculateMetaLink(self):
1.3 dwinter 1008: """recalculate the metadata"""
1009:
1010: for entryid in self.__dict__:
1011: entry=getattr(self,entryid)
1012: if hasattr(entry,'meta_type'):
1013:
1014: if entry.meta_type=="ImageDigilib":
1015: entry.meta=entry.meta_default(entry.getId())
1016: return "OK"
1.1 dwinter 1017:
1018: def addImage(self):
1019: """Add an Image"""
1.64 dwinter 1020:
1.36 dwinter 1021: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addImage.zpt')).__of__(self)
1.1 dwinter 1022: return pt()
1023:
1.66 dwinter 1024: def addImage2(self,fileupload,fileName=None,meta=None,use_default=None,RESPONSE=None):
1.1 dwinter 1025: """Add"""
1.41 dwinter 1026:
1.1 dwinter 1027: #print "FU",fileupload
1.3 dwinter 1028:
1029: if use_default:
1030: try:
1031: meta=self.meta_default(fileupload.filename)
1032: except:
1033: meta=None
1.7 dwinter 1034: else:
1035: meta=None
1.66 dwinter 1036:
1.74 casties 1037: fn=fileName or splitPath(fileupload.filename)
1.64 dwinter 1038:
1.30 dwinter 1039: manage_AddImageDigilib(self,fn,fileupload,meta=meta)
1.66 dwinter 1040:
1041: if RESPONSE:
1042: return RESPONSE.redirect(self.REQUEST['URL1']+'/'+fn)
1.1 dwinter 1043: #return self.REQUEST['URL1']+'/'+fileupload.filename
1.3 dwinter 1044:
1045: def ImportFiles2(self,RESPONSE=None):
1046: """Import the existing files of a folder"""
1047: files=os.listdir(self.ImageStoragePath)
1048: ret=""
1049: #print self.__dict__
1050: for file in files:
1051: if not file[0]==".":
1052: if self.__dict__.has_key(file):
1053:
1054: ret=ret+"<br>"+file+" already exists!"
1055: else:
1056: ret=ret+"<br>"+file+" created!"
1057: meta=self.meta_default(file)
1058: newObj=ImageDigilib(file,file,meta)
1059: #print newObj,file
1060: #print newObj
1061: self._setObject(file,newObj)
1062: #print ret
1.36 dwinter 1063: #pt=PageTemplateFile('Products/ImageArchive/out.zpt')).__of__(self)
1.3 dwinter 1064: #print self.ImageStoragePath
1.35 dwinter 1065:
1.64 dwinter 1066: #scale thumb
1067:
1.35 dwinter 1068: self.scaleThumbs()
1069:
1.64 dwinter 1070: #scale standard
1.35 dwinter 1071:
1.64 dwinter 1072: self.scaleWorkingVersions()
1073:
1.31 dwinter 1074:
1.3 dwinter 1075: RESPONSE.redirect('manage_main')
1.50 dwinter 1076:
1.60 dwinter 1077: ## def importStructure(self,path):
1078: ## """import"""
1079: ## splitted=os.path.split(path)
1080: ## if os.path.isDir(path) and (len(splitted[1])>0) and (splitted[1][0]=="."):
1081: ## manage_AddImageCollection(self,splitted[1],splitted[1],path,self.ImageViewerPath,self.defaultMetaString,RESPONSE=None)
1.50 dwinter 1082:
1.60 dwinter 1083: ## obj=getattr(self,splitted[1])
1084: ## obj.ImportFiles()
1.50 dwinter 1085:
1086: def ImportStructure(self,RESPONSE=None):
1087: """Import the existing files of a folder"""
1088: files=os.listdir(self.ImageStoragePath)
1089: ret=""
1090: #print self.__dict__
1091:
1092:
1093: for file in files:
1.51 dwinter 1094:
1.50 dwinter 1095: if os.path.isdir(os.path.join(self.ImageStoragePath,file)):
1.51 dwinter 1096: imageStoragePath=os.path.join(self.ImageStoragePath,file)
1097: imageViewerPath=os.path.join(self.ImageViewerPath,file)
1098: manage_AddImageCollection(self,file,file,imageStoragePath,imageViewerPath,self.defaultMetaString)
1.50 dwinter 1099:
1100: obj=getattr(self,file)
1101: obj.ImportStructure()
1102: else:
1103: if not file[0]==".":
1104: if self.__dict__.has_key(file):
1105:
1106: ret=ret+"<br>"+file+" already exists!"
1107: else:
1108: ret=ret+"<br>"+file+" created!"
1109: newObj=ImageDigilib(file,file)
1110: #print newObj,file
1111: #print newObj
1112: try:
1113: self._setObject(file,newObj)
1114: except:
1115: """nothing yet"""
1116: #print ret
1117: #pt=PageTemplateFile('Products/ImageArchive/out.zpt')).__of__(self)
1118: #print self.ImageStoragePath
1119:
1.64 dwinter 1120: #scale thumb
1121:
1.50 dwinter 1122: #self.scaleThumbs()
1123:
1.64 dwinter 1124: #scale standard
1.50 dwinter 1125:
1.64 dwinter 1126: #self.scaleWorkingVersions()
1127:
1128: if RESPONSE:
1129: RESPONSE.redirect('manage_main')
1.1 dwinter 1130:
1131: def ImportFiles(self,RESPONSE=None):
1132: """Import the existing files of a folder"""
1133: files=os.listdir(self.ImageStoragePath)
1134: ret=""
1135: #print self.__dict__
1136: for file in files:
1.2 dwinter 1137: if not file[0]==".":
1138: if self.__dict__.has_key(file):
1139:
1140: ret=ret+"<br>"+file+" already exists!"
1141: else:
1142: ret=ret+"<br>"+file+" created!"
1143: newObj=ImageDigilib(file,file)
1144: #print newObj,file
1145: #print newObj
1.4 dwinter 1146: try:
1147: self._setObject(file,newObj)
1148: except:
1149: """nothing yet"""
1.1 dwinter 1150: #print ret
1.36 dwinter 1151: #pt=PageTemplateFile('Products/ImageArchive/out.zpt')).__of__(self)
1.3 dwinter 1152: #print self.ImageStoragePath
1.35 dwinter 1153:
1.64 dwinter 1154: #scale thumb
1155:
1.35 dwinter 1156: self.scaleThumbs()
1157:
1.64 dwinter 1158: #scale standard
1.35 dwinter 1159:
1.64 dwinter 1160: self.scaleWorkingVersions()
1161:
1162: if RESPONSE:
1163: RESPONSE.redirect('manage_main')
1.1 dwinter 1164:
1165: def ImageCollection_config(self):
1166: """Nothing yet"""
1.3 dwinter 1167: if not hasattr(self,'defaultMetaString'):
1168: self.defaultMetaString=""
1169:
1.36 dwinter 1170: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeImageCollectionForm.zpt')).__of__(self)
1.1 dwinter 1171: return pt()
1172:
1.69 dwinter 1173: def ChangeImageCollection(self,title,ImageStoragePath,ImageViewerPath,defaultMetaString,serverPath,RESPONSE=None):
1.1 dwinter 1174: """Change"""
1175: self.title=title
1176: self.ImageStoragePath=ImageStoragePath
1177: self.ImageViewerPath=ImageViewerPath
1.3 dwinter 1178: self.defaultMetaString=defaultMetaString
1.69 dwinter 1179: self.serverPath=serverPath
1.3 dwinter 1180:
1.1 dwinter 1181: if RESPONSE is not None:
1182: RESPONSE.redirect('manage_main')
1183:
1184: def show_selected_thumbs(self):
1185: #ids=[]
1.47 dwinter 1186: try:
1187: return self.REQUEST.SESSION['filenames']
1.64 dwinter 1188: except:
1189: return None
1.1 dwinter 1190: def show_thumbs(self):
1191: ids=[]
1192: for entry in self.__dict__:
1193: #print entry
1194: if hasattr(getattr(self,entry),'thumb'):
1195: ids.append(entry)
1.2 dwinter 1196:
1.1 dwinter 1197: #print ids
1.2 dwinter 1198: ids.sort()
1.1 dwinter 1199: return ids
1200:
1.70 casties 1201: def firstSets(self,selected=None,text='first set'):
1.8 dwinter 1202: ids=self.show_thumbs()
1.13 dwinter 1203: if ids:
1204: if selected:
1.70 casties 1205: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[0]+"\" target=\"_top\">"+text+"</a>"
1.13 dwinter 1206: else:
1.70 casties 1207: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[0]+"\" target=\"_top\">"+text+"</a>"
1.8 dwinter 1208:
1.70 casties 1209: def lastSets(self,selected=None,text='last set'):
1.8 dwinter 1210: ids=self.show_thumbs()
1.13 dwinter 1211: if ids:
1212: colRows=self.getColTimesRow()
1213:
1214: if colRows[1]:
1215: nr=len(ids)-colRows[0]*colRows[1]
1216: else:
1217: nr=0
1218:
1219: if nr<0:
1220: nr=0
1221:
1222: if selected:
1.70 casties 1223: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr]+"\" target=\"_top\">"+text+"</a>"
1.13 dwinter 1224: else:
1.70 casties 1225: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr]+"\" target=\"_top\">"+text+"</a>"
1.8 dwinter 1226:
1227:
1228:
1.70 casties 1229: def nextSets(self,selected=None,text='next set'):
1.8 dwinter 1230: """show nextimage"""
1231: ids=self.show_thumbs()
1232: colRows=self.getColTimesRow()
1.70 casties 1233: pagesize = colRows[0] * colRows[1]
1.13 dwinter 1234: if ids:
1235: if colRows[1]:
1236: if self.REQUEST.SESSION.has_key("filename"):
1237: filename=self.REQUEST.SESSION["filename"]
1238: try:
1.70 casties 1239: nr=ids.index(filename)+pagesize
1.13 dwinter 1240: if nr>=len(ids):
1.70 casties 1241: return ""
1.13 dwinter 1242: except:
1.70 casties 1243: nr=pagesize
1.13 dwinter 1244: else:
1.70 casties 1245: nr = pagesize
1.8 dwinter 1246:
1.70 casties 1247: if nr>=len(ids)-1:
1.13 dwinter 1248: return ""
1.8 dwinter 1249: else:
1.13 dwinter 1250: if selected:
1.70 casties 1251: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr]+"\" target=\"_top\">"+text+"</a>"
1.13 dwinter 1252: else:
1.70 casties 1253: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr]+"\" target=\"_top\">"+text+"</a>"
1.8 dwinter 1254:
1.70 casties 1255: def prevSets(self,selected=None,text='previous sets'):
1.8 dwinter 1256:
1257: """show nextimage"""
1258: #return self.getId()
1259: ids=self.show_thumbs()
1260: colRows=self.getColTimesRow()
1.13 dwinter 1261: if ids:
1262: if colRows[1]:
1263: if self.REQUEST.SESSION.has_key("filename"):
1264: filename=self.REQUEST.SESSION["filename"]
1265: try:
1266: nr=ids.index(filename)-colRows[0]*colRows[1]
1267: if nr<0:
1268: nr=0
1269: except:
1270: nr=0
1271: else:
1272: nr=0
1.8 dwinter 1273: try:
1.13 dwinter 1274: num=ids.index(filename)
1.8 dwinter 1275: except:
1.13 dwinter 1276: num=0
1277:
1278: if num==0:
1279: return ""
1280: else:
1281: if selected:
1.70 casties 1282: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr]+"\" target=\"_top\">"+text+"</a>"
1.13 dwinter 1283: else:
1.70 casties 1284: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr]+"\" target=\"_top\">"+text+"</a>"
1.8 dwinter 1285: else:
1286: return ""
1.70 casties 1287:
1288:
1.50 dwinter 1289: def showFolders(self):
1290: """show subfolders"""
1291: ret=""
1292: link=""" <a target="_top" href="%s">%s</a><br>"""
1.24 dwinter 1293:
1.50 dwinter 1294: if self.aq_parent.meta_type=="ImageCollection":
1295: ret+=link%(self.aq_parent.absolute_url(), "back ("+self.aq_parent.title+")")
1296: ret+="<br>"
1297:
1.52 dwinter 1298: iCs=self.ZopeFind(self,obj_metatypes=["ImageCollection"])
1.50 dwinter 1299: if not iCs:
1300: return ret
1301: else:
1302:
1303: link=""" <a target="_top" href="%s">%s</a><br>"""
1304: for iC in iCs:
1305: ret+=link%(iC[1].absolute_url(),iC[0])
1306: ret+="<br>"
1307: return ret
1.70 casties 1308:
1309:
1310: def getSetSelector(self, selected=None):
1311: """returns the HTML select element for the sets"""
1312: actualNr=0
1313: ids=self.show_thumbs()
1314: colRows=self.getColTimesRow()
1315: pagesize = colRows[0]*colRows[1]
1316: numpages = int(len(ids)/pagesize)
1317: if not ((len(ids) % pagesize)==0):
1318: numpages+=1
1319:
1320: ret=""
1321: if numpages>1:
1322: if selected:
1323: ret+="""<select onChange="parent.location.href='"""+self.REQUEST['URL1']+"""/selection?filename='+this.options[this.selectedIndex].value">"""
1324: else:
1325: ret+="""<select onChange="parent.location.href='"""+self.REQUEST['URL1']+"""?filename='+this.options[this.selectedIndex].value">"""
1326:
1327: for i in range(numpages):
1328: try:
1329: nr=ids.index(self.REQUEST.SESSION['filename'])
1330: except:
1331: nr=0
1332: k=i * pagesize
1333: if (k <= nr) and (nr < i*(pagesize+1)):
1334: actualNr=i
1335: ret+="""<option value="%s" selected>%i</option>"""%(ids[k], i + 1)
1336: else:
1337: ret+="""<option value="%s">%i</option>"""%(ids[k], i + 1)
1338:
1339: ret+="</select>"
1340:
1341: return ret
1342:
1343: def isAllSets(self, showall=None):
1344: """returns if there are any sets"""
1345: ids=self.show_thumbs()
1346: colRows=self.getColTimesRow(showall=showall)
1347: pagesize = colRows[0]*colRows[1]
1348: return (len(ids) <= pagesize)
1349:
1350:
1351: def allSets(self, texton='show all', textoff='show groups'):
1352: """returns HTML to toggle 'show all'"""
1353: if self.isAllSets(showall='No'):
1354: return ""
1355: showall=self.REQUEST.SESSION.get('showall','no')
1356: if showall=='no':
1357: ret='<a href="'+self.REQUEST['URL1']+'?showall=yes" target="_top">'+texton+'</a>'
1358: else:
1359: ret='<a href="'+self.REQUEST['URL1']+'?showall=no" target="_top">'+textoff+'</a>'
1360: return ret
1361:
1362:
1.24 dwinter 1363: def showRuler(self,selected=None):
1364: """show ruler"""
1.70 casties 1365: showall=self.REQUEST.SESSION.get('showall','no')
1.28 dwinter 1366: ids=self.show_thumbs()
1367: if len(ids)==0:
1368: return "<b>No entries</b>"
1369:
1.24 dwinter 1370: if showall=='no':
1.64 dwinter 1371: actualNr=0
1.24 dwinter 1372: ids=self.show_thumbs()
1373: colRows=self.getColTimesRow()
1374: num=int(len(ids)/(colRows[0]*colRows[1]))
1.28 dwinter 1375: if not (operator.mod(len(ids),colRows[0]*colRows[1])==0):
1376: num+=1
1.24 dwinter 1377: a=colRows[0]*colRows[1]
1.26 dwinter 1378: #print num,num+1
1.64 dwinter 1379:
1.28 dwinter 1380: if num>1:
1.24 dwinter 1381:
1.49 dwinter 1382: ret=""
1383: if selected:
1.64 dwinter 1384: ret+="""<select onChange="parent.location.href='"""+self.REQUEST['URL1']+"""/selection?filename='+this.options[this.selectedIndex].value">"""
1.49 dwinter 1385: else:
1.64 dwinter 1386: ret+="""<select onChange="parent.location.href='"""+self.REQUEST['URL1']+"""?filename='+this.options[this.selectedIndex].value">"""
1387: for i in range(num):
1388: try:
1389: nr=ids.index(self.REQUEST.SESSION['filename'])
1390: except:
1391: nr=0
1392: k=i*a
1393: if (k <= nr) and (nr < i*(a+1)):
1394: actualNr=i
1395: ret+="""<option value="%s" selected>%i</option>"""%(ids[k],i)
1396: else:
1397: ret+="""<option value="%s">%i</option>"""%(ids[k],i)
1398: ret+="</select>"
1.70 casties 1399: anf="<b>Show thumbnail group no: </b></br>"
1.64 dwinter 1400:
1401:
1402: try:
1403: if selected:
1.49 dwinter 1404: href=self.REQUEST['URL1']+"/selection?filename="+ids[(actualNr-1)*a]
1405: else:
1406: href=self.REQUEST['URL1']+"?filename="+ids[int((actualNr-1)*a)]
1.64 dwinter 1407:
1408: anf+="""<a href="%s" target="_top">%s</a> """%(href,"prev")
1409: except:
1410: pass
1411: ret=anf+ret
1412:
1413: try:
1414:
1415: if selected:
1.49 dwinter 1416: href=self.REQUEST['URL1']+"/selection?filename="+ids[(actualNr+1)*a]
1417: else:
1418: href=self.REQUEST['URL1']+"?filename="+ids[int((actualNr+1)*a)]
1.64 dwinter 1419:
1420: end="""<a href="%s" target="_top">%s</a> """%(href,"next")
1421: except:
1422: end=""
1423: ret=ret+end
1.24 dwinter 1424:
1.49 dwinter 1425:
1426: #for i in range(num):
1427: #
1428: # ret +="<br/>" #alle 10 linebreak einfuegen
1429: # k=i*a
1430: # if selected:
1431: # href=self.REQUEST['URL1']+"/selection?filename="+ids[k]
1432: # else:
1433: # href=self.REQUEST['URL1']+"?filename="+ids[int(k)]
1.64 dwinter 1434: #
1.49 dwinter 1435: # ret+="""<a href="%s" target="_top">%i</a> """%(href,i)
1.24 dwinter 1436:
1437: else:
1438: ret=""
1439: ret+="""<a href="%s?showall=yes" target="_top">show all</a> """%self.REQUEST['URL1']
1440: else:
1441: ret="""<a href="%s?showall=no" target="_top">show groups</a> """%self.REQUEST['URL1']
1442:
1443: return ret
1.70 casties 1444:
1.24 dwinter 1445:
1.2 dwinter 1446: def show_thumbs_selected_rows(self,numberOfColumns):
1447: """Ausgabe anzahl"""
1448: ids=self.show_selected_thumbs()
1.48 dwinter 1449:
1.47 dwinter 1450: if not ids:
1.64 dwinter 1451: return None
1.2 dwinter 1452: self.REQUEST.SESSION['ids']=ids
1453: number=int(len(ids)/numberOfColumns)+1
1454: self.REQUEST.SESSION['number']=range(number)
1455: return range(number+1)
1456:
1.8 dwinter 1457: def setColTimesRowForm(self):
1458: """form for matrix setting"""
1.36 dwinter 1459: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','selectColTimesRow.zpt')).__of__(self)
1.8 dwinter 1460: return pt()
1461:
1462: def setDone(self):
1463: """done"""
1464:
1.36 dwinter 1465: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changedColTimesRow.zpt')).__of__(self)
1.8 dwinter 1466: return pt()
1467:
1468: def setColTimesRow(self,cols,rows):
1469: """set coltimes row"""
1470: RESPONSE=self.REQUEST.RESPONSE
1.10 dwinter 1471: if not rows:
1.12 dwinter 1472: rows=None
1.11 dwinter 1473: if rows=="":
1.12 dwinter 1474: rows=None
1475:
1476: if rows:
1477: RESPONSE.setCookie("ImageViewerRows",rows)
1.8 dwinter 1478: RESPONSE.setCookie("ImageViewerCols",cols)
1479:
1480: RESPONSE.redirect(self.REQUEST['URL1']+"/setDone")
1.70 casties 1481:
1482: def setDefaultColTimesRow(self, cols, rows):
1483: """sets default columns and rows"""
1484: self.defaultcols = cols
1485: self.defaultrows = rows
1.71 dwinter 1486:
1.24 dwinter 1487: def getColTimesRow(self,showall='No'):
1.12 dwinter 1488: """coltimesrow"""
1.8 dwinter 1489:
1490: REQUEST=self.REQUEST
1491: """matrix"""
1492: if REQUEST.cookies.has_key("ImageViewerRows"):
1493: try:
1494: rows=int(REQUEST.cookies["ImageViewerRows"])
1495: except:
1.71 dwinter 1496: rows=getattr(self,'defaultrows',6)
1.8 dwinter 1497: else:
1.71 dwinter 1498: rows=getattr(self,'defaultrows',6)
1.8 dwinter 1499:
1500: if REQUEST.cookies.has_key("ImageViewerCols"):
1.12 dwinter 1501: #print "COLS",REQUEST.cookies["ImageViewerCols"]
1.8 dwinter 1502: cols=int(REQUEST.cookies["ImageViewerCols"])
1503: else:
1.71 dwinter 1504: cols=getattr(self,'defaultcols',3)
1505:
1.12 dwinter 1506:
1507: idsnumber=len(self.show_thumbs())
1508: if rows:
1509: if cols*rows >idsnumber:
1510: rows=int(idsnumber/cols)+1
1.23 dwinter 1511:
1.70 casties 1512: if showall is None:
1513: showall=self.REQUEST.SESSION.get('showall', 'No')
1.24 dwinter 1514: if showall=='yes':
1515: rows=int(idsnumber/cols)+1
1516:
1.8 dwinter 1517: return (cols,rows)
1518:
1519:
1.62 dwinter 1520: def show_thumbs_rows(self,numberOfColumns,numberOfRows=None,startId=None,showall="No"):
1.2 dwinter 1521: """Ausgabe anzahl"""
1.8 dwinter 1522:
1523: idsAll=self.show_thumbs()
1.70 casties 1524: if len(idsAll)==0: #keine Eintraege
1.28 dwinter 1525: return 0
1.62 dwinter 1526: if self.REQUEST.SESSION.has_key("filename") and not (showall=="yes"):
1.8 dwinter 1527: filename=self.REQUEST.SESSION["filename"]
1.46 dwinter 1528: filename=self.getImageByName(filename,onlyName="yes")
1.23 dwinter 1529:
1.8 dwinter 1530: try:
1531: startId=filename
1.23 dwinter 1532: if startId=="":
1533: startId=idsAll[0][0:]
1.8 dwinter 1534: except:
1.23 dwinter 1535: startId=idsAll[0][0:]
1.8 dwinter 1536: else:
1.23 dwinter 1537: startId=idsAll[0][0:]
1.8 dwinter 1538:
1539:
1.23 dwinter 1540:
1.8 dwinter 1541:
1542: if numberOfRows:
1.23 dwinter 1543:
1544: startPic=idsAll.index(startId)
1.12 dwinter 1545: try:
1.23 dwinter 1546:
1.12 dwinter 1547: startPic=idsAll.index(startId)
1548: endPic=startPic+numberOfColumns*numberOfRows
1549: ids=idsAll[startPic:endPic]
1550: except:
1551: ids=idsAll
1.8 dwinter 1552: else:
1.23 dwinter 1553:
1.8 dwinter 1554: ids=idsAll
1555:
1.23 dwinter 1556:
1.2 dwinter 1557: self.REQUEST.SESSION['ids']=ids
1558: number=int(len(ids)/numberOfColumns)+1
1.23 dwinter 1559:
1.2 dwinter 1560: return range(number+1)
1561:
1562: def show_thumbs_columns(self,row,numberOfColumns):
1563: """Ausgabe einer Liste der Reihe"""
1564: ids=self.REQUEST.SESSION['ids']
1565: max=len(ids)
1566: if (row*numberOfColumns)<max:
1567: return ids[(row-1)*numberOfColumns:row*numberOfColumns]
1568: else:
1569: return ids[(row-1)*numberOfColumns:]
1.8 dwinter 1570:
1.2 dwinter 1571: def thumblistSelected_old(self):
1572: """main template collection"""
1.36 dwinter 1573: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbselected.zpt')).__of__(self)
1.2 dwinter 1574: return pt()
1575:
1.1 dwinter 1576: def thumblistSelected(self):
1577: """main template collection"""
1.36 dwinter 1578: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbselected2.zpt')).__of__(self)
1.2 dwinter 1579: return pt()
1580:
1581: def thumblist_old(self):
1582: """main template collection"""
1.36 dwinter 1583: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbs.zpt')).__of__(self)
1.1 dwinter 1584: return pt()
1585:
1586: def thumblist(self):
1587: """main template collection"""
1.36 dwinter 1588: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumb2.zpt')).__of__(self)
1.1 dwinter 1589: return pt()
1590:
1.23 dwinter 1591: def thumblistNewWindow(self):
1592: """Thumbs mit clik neues Fenster oeffnen"""
1.36 dwinter 1593: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbNewWindow.zpt')).__of__(self)
1.23 dwinter 1594: return pt()
1595:
1596:
1.7 dwinter 1597: def navig_selected_html(self):
1598: """navigation"""
1599: #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
1.36 dwinter 1600: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigation_selected.zpt')).__of__(self)
1.77 dwinter 1601:
1602: return pt().data
1.7 dwinter 1603:
1.1 dwinter 1604: def navig_html(self):
1605: """navigation"""
1.7 dwinter 1606: #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
1.38 dwinter 1607:
1.36 dwinter 1608: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigation.zpt')).__of__(self)
1.1 dwinter 1609: return pt()
1610:
1611:
1.7 dwinter 1612: def selection(self):
1613: """show only selected"""
1614: if self.REQUEST.has_key('filename'):
1615: filen=self.REQUEST['filename']
1616: else:
1617: filen=""
1618: self.REQUEST.SESSION['filename']=filen
1.36 dwinter 1619: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected2.zpt')).__of__(self)
1.7 dwinter 1620: return pt()
1.46 dwinter 1621:
1622: def getImageByName(self,filename,onlyName=None):
1623: """get filename"""
1.77 dwinter 1624: print repr(filename)
1625: #FIXME: umlaute in filename
1626: fn=getattr(self,repr(filename),None)
1.46 dwinter 1627: if not fn:
1628: filenameM=filename.split(".")[0]
1.80 ! dwinter 1629:
1.46 dwinter 1630: founds=self.ZopeFind(self,obj_metatypes=['ImageDigilib'])
1.80 ! dwinter 1631:
! 1632:
1.46 dwinter 1633: for found in founds:
1634: foundM=found[0].split(".")[0]
1.80 ! dwinter 1635:
1.46 dwinter 1636: if filenameM.lower()==foundM.lower():
1637: if onlyName:
1638: return found[0]
1639: else:
1.80 ! dwinter 1640: return found[1]
! 1641: #HACK teste noch ob am ende des filenames eventuell ein "_" und loesche das.
! 1642: if foundM[-1]=="_":
! 1643: foundM=foundM[0:-1]
! 1644:
! 1645: if filenameM.lower()==foundM.lower():
! 1646: if onlyName:
! 1647: return found[0]
! 1648: else:
! 1649: return found[1]
! 1650:
1.46 dwinter 1651: if onlyName:
1652: return filename
1653: else:
1654: return fn
1.64 dwinter 1655:
1656:
1657: security.declareProtected('View','index_html')
1.76 dwinter 1658: def index_html(self,fn=None,generic='No'):
1.1 dwinter 1659: """main template collection"""
1.77 dwinter 1660:
1.58 dwinter 1661: if fn:
1662: ret=[]
1663:
1664: if type(fn) is ListType:
1665: """experimentell mehr als ein filename"""
1666: for filename in fn:
1.59 dwinter 1667: if not (filename == ""):
1668: ret.append((filename,'',1))
1.58 dwinter 1669: else:
1670: ret.append((fn,'',1))
1671:
1672: self.REQUEST.SESSION['filenames']=ret
1673: #self.REQUEST.SESSION['filenamesIds']=fnIds
1.72 dwinter 1674:
1675: overview=self.ZopeFind(self,obj_ids=['overview_selected.html'])
1676:
1.76 dwinter 1677:
1678: if overview and (generic =='No'):
1.72 dwinter 1679: return overview[0][1]()
1680: else:
1681: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected.zpt')).__of__(self)
1682: return pt()
1.58 dwinter 1683:
1.1 dwinter 1684: if self.REQUEST.has_key('filename'):
1685: filen=self.REQUEST['filename']
1686: else:
1687: filen=""
1.24 dwinter 1688:
1.38 dwinter 1689: self.REQUEST.SESSION['filename']=filen[0:]
1690:
1.25 dwinter 1691: if self.REQUEST.has_key('showall'):
1692:
1693: self.REQUEST.SESSION['showall']=self.REQUEST.get('showall')
1694: else:
1695: self.REQUEST.SESSION['showall']=self.REQUEST.SESSION.get('showall','no')
1696:
1.60 dwinter 1697:
1698: overview=self.ZopeFind(self,obj_ids=['overview.html'])
1.76 dwinter 1699: if overview and (generic == 'No'):
1.60 dwinter 1700: return overview[0][1]()
1.70 casties 1701: elif hasattr(self,'templates'):
1702: pt=self.templates.imgcoll_main.__of__(self)
1703: return pt()
1.60 dwinter 1704: else:
1705: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview.zpt')).__of__(self)
1706: return pt()
1.70 casties 1707:
1.77 dwinter 1708: def navigation(self):
1709: """generate navigation bar"""
1710:
1711: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigation_fragment')).__of__(self)
1712: return pt()
1.1 dwinter 1713:
1714: def manage_AddImageCollectionForm(self):
1715: """Nothing yet"""
1.36 dwinter 1716: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddImageCollectionForm.zpt')).__of__(self)
1.1 dwinter 1717: return pt()
1718:
1.3 dwinter 1719: def manage_AddImageCollection(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString,RESPONSE=None):
1.1 dwinter 1720: """Add ImageCollection"""
1.3 dwinter 1721: newObj=ImageCollection(id,title,ImageStoragePath,ImageViewerPath,defaultMetaString)
1.19 dwinter 1722: self._setObject(id,newObj)
1723:
1724: if RESPONSE is not None:
1725: RESPONSE.redirect('manage_main')
1726:
1727:
1.77 dwinter 1728:
1.60 dwinter 1729: class ImageCollectionMD(ImageCollection,ZSQLExtendFolder):
1730: """Imageviewer and Metadata"""
1731: meta_type="ImageCollection MD"
1.61 dwinter 1732: #scalerPath="http://127.0.0.1:18080/digitallibrary/servlet/Scaler/?fn="
1733: scalerPath="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="
1.68 dwinter 1734: rightsQueryDefault="SELECT accessibility from vision_main where id_image=(SELECT id from vision_images where filename ~ '%s*' )"
1735: rightsQueryFieldDefault="accessibility"
1736:
1.60 dwinter 1737: manage_options=ImageCollection.manage_options+(
1738: {'label':'ZSQLExtend','action':'changeZSQLExtendForm'},
1.68 dwinter 1739: {'label':'Change Rights Query','action':'changeRightsQueryForm'},
1.60 dwinter 1740: )
1741:
1.65 dwinter 1742: try:
1.77 dwinter 1743: changeZSQLExtendForm=ZSQLExtendFolder.changeZSQLExtendForm
1.63 dwinter 1744: except:
1.77 dwinter 1745: pass
1746:
1747:
1748: def addImage(self):
1749: """Add an Image"""
1750:
1751: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addImageMD.zpt')).__of__(self)
1752: return pt()
1753:
1754: def addImage2(self,_fileupload,_fileName=None,_meta=None,_use_default=None,RESPONSE=None,**argv):
1755: """Add"""
1756:
1757: filenameKey="filename"
1758: #print "FU",fileupload
1759:
1760: if _use_default:
1761: try:
1762: meta=self.meta_default(_fileupload.filename)
1763: except:
1764: meta=None
1765: else:
1766: meta=None
1767:
1768: fn=_fileName or splitPath(_fileupload.filename)
1769:
1770: manage_AddImageDigilib(self,fn,_fileupload,meta=meta)
1771:
1772: args[key]=_filename
1773:
1774: self.ZSQLAdd(args=argv)
1775:
1776: if RESPONSE:
1777: return RESPONSE.redirect(self.REQUEST['URL1']+'/'+fn)
1778: #return self.REQUEST['URL1']+'/'+fileupload.filename
1779:
1780: def navig_html(self):
1781: """navigation"""
1782: #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
1783:
1784: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigationMD.zpt')).__of__(self)
1785: return pt()
1786:
1787: def navig_selected_html(self):
1788: """navigation"""
1789: #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
1790: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigation_selectedMD.zpt')).__of__(self)
1791:
1792: return pt()
1793:
1794: def decode(self,str):
1795: """decoder"""
1796: if not str:
1797: return ""
1798: if type(str) is StringType:
1799: try:
1800: return str.decode('utf-8')
1801: except:
1802: return str.decode('latin-1')
1803: else:
1804:
1805: return str
1806:
1807: def standardSearch(self):
1808: """standard search page"""
1809: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','standardSearchPage.zpt')).__of__(self)
1810: return pt()
1811:
1812: def searchResultXML(self):
1813: """xmlformat"""
1814: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','searchResultXML.zpt')).__of__(self)
1815: return pt()
1.63 dwinter 1816:
1.77 dwinter 1817: def searchDB(self,REQUEST=None,RESPONSE=None,xml=None):
1818: """search"""
1819: #context.ZSQLFind(_table='vision_main')
1820: urlTmp=REQUEST['URL1']
1821:
1822: url=urlTmp+'/searchResultXML?-table=vision_main&'+REQUEST['QUERY_STRING']
1823:
1824: if xml is None:
1825: RESPONSE.redirect('xmlinput?url='+urllib.quote(url))
1826: else:
1827: RESPONSE.redirect(url)
1828:
1829: def index_html(self,fn=None,selection=None,generic='No',REQUEST=None,RESPONSE=None):
1830: """main template collection"""
1831:
1832:
1833: mode=self.REQUEST.get('mode','view')
1834: if fn:
1835: ret=[]
1836:
1837: if type(fn) is ListType:
1838: """experimentell mehr als ein filename"""
1839: for filename in fn:
1840: if not (filename == ""):
1841: ret.append((filename,'',1))
1842: else:
1843: ret.append((fn,'',1))
1844:
1845: self.REQUEST.SESSION['filenames']=ret
1846: #self.REQUEST.SESSION['filenamesIds']=fnIds
1847:
1.79 dwinter 1848: overview=self.ZopeFind(self,obj_ids=['overview_selected.html'])
1.77 dwinter 1849:
1850:
1851: if overview and (generic =='No'):
1852: return overview[0][1]()
1853: else:
1854: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
1855: return pt()
1856:
1857:
1858: # filename given, then only display this file
1859: if self.REQUEST.has_key('filename'):
1860:
1861: filen=self.REQUEST['filename']
1862: else:
1863: filen=""
1864:
1865:
1866: self.REQUEST.SESSION['filename']=filen[0:]
1867:
1868: if not self.REQUEST.SESSION['filename']=="":
1869: url=getattr(self.getImageByName(self.REQUEST.SESSION['filename']),'absolute_url')()
1870: if mode=="view":
1871: self.REQUEST.RESPONSE.redirect(url)
1872: elif mode=="download":
1873: self.REQUEST.RESPONSE.redirect(url+"/download")
1874:
1875: if self.REQUEST.has_key('showall'):
1876:
1877: self.REQUEST.SESSION['showall']=self.REQUEST.get('showall')
1878: else:
1879: self.REQUEST.SESSION['showall']=self.REQUEST.SESSION.get('showall','no')
1880:
1881:
1882: if selection:
1883: #selection i.e. selection already stored at self.REQUEST.SESSION['filenames']
1.79 dwinter 1884: overview=self.ZopeFind(self,obj_ids=['overview_selected.html'])
1.77 dwinter 1885:
1886:
1887: if overview and (generic =='No'):#
1888: print "selected"
1889: print repr(overview[0][1])
1890: return overview[0][1]()
1891: else:
1892: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
1893: return pt()
1894:
1895:
1896: #no filename then show overview
1897:
1.79 dwinter 1898: overview=self.ZopeFind(self,obj_ids=['overview.html'])
1.77 dwinter 1899: if overview and (generic == 'No'):
1900:
1901:
1902: return overview[0][1]()
1903: elif hasattr(self,'templates'):
1904:
1905: pt=self.templates.imgcoll_mainMD.__of__(self)
1906: return pt()
1907: else:
1908:
1909: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overviewMD.zpt')).__of__(self)
1910: return pt()
1911:
1912: def nextImage(self,request,selected=None,returnFn=None):
1913: """show nextimage"""
1914:
1915: if not selected and self.REQUEST.has_key('fn'):
1916: imagename=self.REQUEST['fn'].split('/')[-1]
1.80 ! dwinter 1917:
! 1918: imagename=self.getImageByName(imagename,onlyName=True)
! 1919:
1.77 dwinter 1920: nr=self.getObjectPosition(imagename)
1921:
1922: objects=self.objectIds()
1923: if len(objects)==nr+1:
1924: return ""
1925: else:
1926: fn="/".join(self.REQUEST['fn'].split('/')[0:-1])+"/"+objects[nr+1]
1927: return "<a href=\""+self.REQUEST['URL0']+"?fn="+fn+"\" target=\"_top\">next image</a>"
1928:
1929: def prevImage(self,request,selected=None,returnFn=None):
1930: """show nextimage"""
1931:
1932: if not selected and self.REQUEST.has_key('fn'):
1933: imagename=self.REQUEST['fn'].split('/')[-1]
1.80 ! dwinter 1934:
! 1935: imagename=self.getImageByName(imagename,onlyName=True)
! 1936:
1.77 dwinter 1937: nr=self.getObjectPosition(imagename)
1938:
1939: objects=self.objectIds()
1940: if nr==0:
1941: return ""
1942: else:
1943: fn="/".join(self.REQUEST['fn'].split('/')[0:-1])+"/"+objects[nr-1]
1944: return "<a href=\""+self.REQUEST['URL0']+"?fn="+fn+"\" target=\"_top\">prev image</a>"
1945:
1946:
1.68 dwinter 1947: def changeRightsQueryForm(self):
1948: """change Rights Query"""
1949: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeRightsQueryForm.zpt')).__of__(self)
1950: return pt()
1951:
1952: def changeRightsQuery(self,rightsQuery,rightsQueryField,RESPONSE=None):
1953: """change Rightsquery"""
1954:
1955: self.rightsQuery=rightsQuery
1956: self.rightsQueryField=rightsQueryField
1957:
1958: if RESPONSE is not None:
1959: RESPONSE.redirect('manage_main')
1960:
1961:
1962:
1963: def getRightsQuery(self):
1964: """get Query"""
1965: return getattr(self,'rightsQuery',self.rightsQueryDefault)
1966:
1967: def getRightsQueryField(self):
1968: """get Query Fiueld"""
1969: return getattr(self,'rightsQueryField',self.rightsQueryFieldDefault)
1970:
1971:
1972:
1.60 dwinter 1973: def setGenericSearchStringForm(self):
1974: """form setze generischen search string fuer MD"""
1975: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','setGenericSearchStringForm.zpt')).__of__(self)
1976: return pt()
1977:
1978: def setGenericSearchString(self,searchString):
1979: """setze generischen search string"""
1980: self.searchString=searchString
1981:
1982: def thumblistMD(self):
1983: """main template collection"""
1984: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbListMD.zpt')).__of__(self)
1985: return pt()
1.68 dwinter 1986:
1987: def getRights(self,id):
1988: """get the rights from a database"""
1989: #print self.rightsQuery%id
1990: results=self.ZSQLSimpleSearch(self.getRightsQuery()%id)
1991: if results:
1992: result = getattr(results[0],self.getRightsQueryField())
1993: else:
1994: result = ''
1995: return result
1.77 dwinter 1996:
1997: def xmlinput(self,url):
1998: """Anzeige von ausgewaehlten thumbs"""
1999: #return url
1.68 dwinter 2000:
1.77 dwinter 2001: url=urllib.unquote(url)
2002: xmldoc=urllib.urlopen(url).read()
2003: #return xmldoc
2004: try:
2005: dom=xml.dom.minidom.parseString(xmldoc)
2006: except:
2007: return "ERROR: (%s %s) %s"%(sys.exc_info()[0],sys.exc_info()[1],xmldoc)
2008:
2009: images=dom.getElementsByTagName('image')
1.60 dwinter 2010:
1.77 dwinter 2011: rc=[]
2012: fnIds={}
2013: for image in images:
2014: imagename=image.getElementsByTagName('imagename')[0]
2015:
2016:
2017:
2018:
2019: idnr=image.getElementsByTagName('idnr')[0]
2020: id=getText(idnr.childNodes)
2021: try:
2022: numberOfPages=image.getElementsByTagName('numberOfPages')[0]
2023: except:
2024: numberOfPages=None
2025:
2026: if numberOfPages:
2027: nopT=getText(numberOfPages.childNodes)
2028: try:
2029: nop=int(nopT)
2030: except:
2031: nop=0
2032: else:
2033: nop=0
2034:
2035: texts=getText(imagename.childNodes).split("\n") #mehrere bilder in return getrennter liste
2036: for text in texts:
2037: if not text=="":
2038: text=self.getImageByName(text,onlyName="yes")
2039: try:
2040: rc.append((str(text),id,nop))
2041: fnIds[str(text)]=(id,nop)
2042: except:
2043: rc.append((repr(text),id,nop))
2044: fnIds[repr(text)]=(id,nop)
2045:
2046:
2047: rc.sort()
2048: self.REQUEST.SESSION['filenames']=rc
2049: self.REQUEST.SESSION['filenamesIds']=fnIds
2050:
2051: overview=self.ZopeFind(self,obj_ids=['overview_selectedMD.html'])
2052:
2053: if overview:
2054: return overview[0][1]()
2055: else:
2056: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
2057: return pt()
2058:
2059: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
2060: return pt()
2061:
2062: def selection(self):
2063: """show only selected"""
2064: if self.REQUEST.has_key('filename'):
2065: filen=self.REQUEST['filename']
2066: else:
2067: filen=""
2068: self.REQUEST.SESSION['filename']=filen
2069: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
2070: return pt()
2071:
2072: def thumblistSelectedMD(self):
2073: """main template collection"""
2074: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbselectedMD.zpt')).__of__(self)
2075: return pt()
2076:
1.60 dwinter 2077: def manage_AddImageCollectionMDForm(self):
2078: """Nothing yet"""
2079: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddImageCollectionFormMD.zpt')).__of__(self)
2080: return pt()
2081:
2082: def manage_AddImageCollectionMD(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString,RESPONSE=None):
2083: """Add ImageCollection"""
2084: newObj=ImageCollectionMD(id,title,ImageStoragePath,ImageViewerPath,defaultMetaString)
2085: self._setObject(id,newObj)
2086:
2087: if RESPONSE is not None:
2088: RESPONSE.redirect('manage_main')
2089:
2090:
2091:
2092:
1.19 dwinter 2093: class ImageCollectionIFrame(ImageCollection):
1.20 dwinter 2094: """Class fuer Collection set als IFrame"""
1.19 dwinter 2095:
2096: meta_type="ImageCollectionIFrame"
2097: label=ImageCollection.title
2098:
1.23 dwinter 2099: def getImageTag(self):
2100: """ hack : method needed by echo_content"""
2101: return ""
2102:
1.20 dwinter 2103: def rotate(self,angle,url,RESPONSE):
1.64 dwinter 2104: """rotate"""
2105:
2106: RESPONSE.redirect("javascript:document.domain='mpg.de';parent.iframe.right.rotation(%i)"%int(angle))
2107: RESPONSE.redirect(url)
1.19 dwinter 2108: def request(self):
2109: """request"""
2110: return self.REQUEST
2111:
2112: def index_html(self):
2113: """index"""
2114: if self.REQUEST.has_key('filename'):
2115: filen=self.REQUEST['filename']
2116: else:
2117: filen=""
2118: self.REQUEST.SESSION['filename']=filen
2119:
2120:
1.36 dwinter 2121: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','IFrameMain.zpt')).__of__(self)
1.19 dwinter 2122: return pt()
2123:
2124: def iframe_html(self):
2125: """iframe"""
2126: if self.REQUEST.has_key('filename'):
2127: filen=self.REQUEST['filename']
2128: else:
2129: filen=""
2130: self.REQUEST.response.setCookie('filename',filen)
1.36 dwinter 2131: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','IFrameOverview.zpt')).__of__(self)
1.19 dwinter 2132: return pt()
2133:
2134:
2135: def manage_AddImageCollectionIFrameForm(self):
2136: """Nothing yet"""
1.36 dwinter 2137: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddImageCollectionIFrameForm.zpt')).__of__(self)
1.19 dwinter 2138: return pt()
2139:
2140: def manage_AddImageCollectionIFrame(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString,RESPONSE=None):
2141: """Add ImageCollection"""
2142: newObj=ImageCollectionIFrame(id,title,ImageStoragePath,ImageViewerPath,defaultMetaString)
1.1 dwinter 2143: self._setObject(id,newObj)
2144:
2145: if RESPONSE is not None:
2146: RESPONSE.redirect('manage_main')
2147:
2148:
1.61 dwinter 2149: class ImageZogiLib(ImageDigilib):
2150: """Anzeige Object fuer Bilder ausserhalb von collections
2151: ImageViewerPath und ImageStoragePath und wenn vorhanden Pfad zur Collection
2152: werden zusaetzlich abgespeichert
2153: """
1.65 dwinter 2154: #TODO: scaler path notwendig?
1.61 dwinter 2155: meta_type="ImageZogiLib"
2156:
2157: manage_options=ImageDigilib.manage_options+(
2158: {'label':'Main Config','action':'changeImageZogiLibForm'},
2159: )
2160:
2161: def __init__(self,id,fn,ImageViewerPath,ImageStoragePath,scalerPath,ImageCollectionPath=None,REQUEST=None):
2162: ImageDigilib.__init__(self,id,fn)
2163: self.ImageViewerPath=ImageViewerPath
2164: self.ImageStoragePath=ImageStoragePath
2165: self.ImageCollectionPath=ImageCollectionPath
2166: self.scalerPath=scalerPath
2167:
2168: def changeImageZogiLibForm(self):
2169: """change zogilib Form"""
2170: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeImageZogiLib.zpt')).__of__(self)
2171: return pt()
2172:
2173:
2174: def changeImageZogilib(fn,ImageViewerPath,ImageStoragePath,scalerPath,ImageCollectionPath,REQUEST=None):
2175: """Change it"""
2176: self.ImageViewerPath=ImageViewerPath
2177: self.ImageStoragePath=ImageStoragePath
2178: self.ImageCollectionPath=ImageColectionPath
2179: self.scalerPath=scalerPath
2180:
2181: def manage_AddImageZogiLib(self,id=None,ImageViewerPath=None,ImageStoragePath=None,fileUpload=None,ImageCollectionPath=None,scalerPath=None,libPath=None,caption=None,RESPONSE=None):
2182: """hinzufuegen eineis zogilibImage"""
2183:
2184: if libPath:
2185: splitted=libPath.split("?")
2186: urlSplit=splitted[0].split("/")
2187: params=cgi.parse_qs(splitted[1])
2188: #is LibPath a digilib path?
2189: if urlSplit[-1]=="Scaler":
2190: if type(params['fn']) is ListType:
2191: fnParam=params['fn'][0]
2192: else:
2193: fnParam=params['fn']
2194: fileNameSplit=os.path.split(fnParam)
2195: ImageViewerPath=fileNameSplit[0]
2196: id=fileNameSplit[1]
2197: scalerPath=splitted[0]+"?fn="
2198: else: #assume if not the path is a path to an ImageCollection
2199: if type(params['filename']) is ListType:
2200: id=params['filename'][0]
2201: else:
2202: id=params['filename']
2203:
2204: server=ServerProxy(splitted[0])
2205: ImageCollectionPath=libPath
2206: ImageViewerPath=server.getImageViewerPath()
2207: ImageStoragePath=server.getImageStoragePath()
2208: scalerPath=server.getScalerPath()
2209:
2210:
2211:
2212: if fileUpload:
2213: fn=splitPath(fileUpload.filename)
2214: else:
2215: fn=id
2216:
2217: newObj=ImageZogiLib(id,fn,ImageViewerPath,ImageStoragePath,scalerPath,ImageCollectionPath)
2218:
2219: self._setObject(id,newObj)
2220: getattr(self,id).caption=caption[0:]
2221: if fileUpload:
2222: getattr(self,id).uploadImage(fileupload,self.ImageStoragePath)
2223:
2224: if RESPONSE is not None:
2225: RESPONSE.redirect('manage_main')
2226:
2227:
2228: def manage_AddImageZogiLibForm(self):
2229: """to be done"""
1.78 dwinter 2230:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>