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