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