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