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