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