1: from OFS.Folder import Folder
2: from OFS.SimpleItem import SimpleItem
3: from Globals import Persistent,package_home
4: from Acquisition import Implicit
5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
6: from Products.PageTemplates.PageTemplate import PageTemplate
7: import re
8: import os
9: import os.path
10: import urllib
11: import xml.dom.minidom
12: import operator
13: import tempfile
14: import shutil
15: from types import *
16:
17:
18: try:
19: from Products.ECHO_content.ECHO_collection import ECHO_basis
20: except:
21: print "ECHO Elements not imported"
22: class ECHO_basis:
23: """leer"""
24:
25: manage_options=()
26:
27:
28:
29: def splitPath(str):
30: str2=str.replace("\\","/")
31: return os.path.split(str2)[1]
32:
33: def getText(nodelist):
34:
35: rc = ""
36: for node in nodelist:
37:
38: if node.nodeType == node.TEXT_NODE:
39: rc = rc + node.data
40: return rc
41:
42: def getTextFromNode(nodename):
43: nodelist=nodename.childNodes
44: rc = ""
45: for node in nodelist:
46: if node.nodeType == node.TEXT_NODE:
47: rc = rc + node.data
48: return rc
49:
50: class metaData(SimpleItem):
51: """Klasse fuer metadaten"""
52: meta_type="metaData"
53:
54: def __init__(self,xmlurl,container=None):
55: """__init__"""
56: return self.update(xmlurl,container)
57:
58:
59: def update(self,xmlurl,container=None):
60: """update"""
61:
62: try:
63: xmlfh=urllib.urlopen(xmlurl)
64: dom=xml.dom.minidom.parse(xmlfh)
65: except:
66: return None
67:
68: md=dom.getElementsByTagName(container)
69: mlist=[]
70: if md:
71: for node in md[0].childNodes:
72: if node.nodeType==dom.ELEMENT_NODE:
73: name=node.tagName
74: content=getTextFromNode(node)
75: setattr(self,name,content)
76: mlist.append(name)
77: self.mlist=mlist[0:]
78: else:
79: self.mlist=[]
80:
81: def index_html(self):
82: """index"""
83: ret="<html><body>"
84: for tag in self.mlist:
85: ret+="<p>%s=%s</p>"%(tag,getattr(self,tag))
86: return ret+"</body></html>"
87:
88:
89: class ImageDigilib(Folder,Persistent,Implicit):
90: """Anzeige object fuer digilib"""
91: meta_type="ImageDigilib"
92:
93: leiden_meta_fields=['image_id','date','country','place','people','description','photographer']
94:
95: manage_options = Folder.manage_options+(
96:
97: {'label':'Add Metadata','action':'addMetaObjectForm'},
98:
99: )
100:
101: def addMetaObject(self,id,RESPONSE=None):
102: """Add an MetaObject"""
103: objectType=getattr(self.Control_Panel.Products.ImageMetaData,self.genericMetaDataType)
104:
105: request=self.REQUEST
106: objectCreate=objectType.createObjectManager(id,request)
107:
108: self._setObject(id,objectCreate)
109:
110: objectCreate.propertysheets.meta.manage_editProperties(request)
111:
112: if RESPONSE is not None:
113: RESPONSE.redirect('manage_main')
114:
115:
116:
117:
118: def addMetaObjectForm(self):
119: """Add Form"""
120: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMetaObject.zpt')).__of__(self)
121: return pt()
122:
123:
124: def __init__(self,id,filename,meta=None):
125: self.id=id
126: self.title=filename
127: self.filename=filename
128: self.meta=meta
129:
130: def getMeta(self):
131: """ausgabe der metadaten"""
132: return self.meta
133:
134: def manageMetaData(self,strict=None):
135: """create or updateMetadata"""
136:
137: md=self.ZopeFind(self,obj_metatypes=["metaData"])
138:
139: if not md:
140: self._setObject("metaData",metaData(self.meta,"ROW"))
141:
142: else:
143: if not strict:
144: md[0][1].update(self.meta,"ROW")
145: else:
146: print "strict"
147: if len(md[0][1].mlist)==0:
148: print " +++",self.getId()
149: md[0][1].update(self.meta,"ROW")
150: else:
151: print " ---",self.getId()
152:
153: def uploadImage(self,fileupload,path_name):
154: """upload an Image from an Requast"""
155: #path_name=self.ImageStoragePath
156: fn=splitPath(fileupload.filename)
157: filename=path_name+"/"+fn
158: filedata=fileupload.read()
159: f=open(filename,"w")
160: f.write(filedata)
161: f.close()
162: try:
163: os.chmod(filename,0664)
164: except:
165: """hack"""
166: #scale thumb
167:
168: self.scaleThumbs()
169:
170: #scale standard
171:
172: self.scaleWorkingVersions()
173:
174:
175:
176: def downloadWorkingVersion(self):
177: """download working version (2000 pixel)"""
178:
179: return self.download(fmt="&dw=2000&dh=2000",suffix=".jpg")
180:
181: def download(self,fmt="&mo=rawfile,hires",suffix=None):
182: """download"""
183: path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+fmt
184:
185: if self.REQUEST.SESSION.has_key('filenamesIds') and self.REQUEST.SESSION['filenamesIds'].has_key(self.filename):
186: filename=self.REQUEST.SESSION['filenamesIds'][self.filename][0]+"_"+self.filename
187: else:
188: filename=self.filename
189:
190: if suffix:
191: filename=os.path.splitext(filename)[0]+suffix
192:
193: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%filename)
194: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
195: #print path
196: imagefh=urllib.urlopen(path)
197:
198: self.REQUEST.RESPONSE.write(imagefh.read())
199: self.REQUEST.RESPONSE.close()
200: #return self.REQUEST.RESPONSE.redirect(path)
201:
202: def updateImageForm(self):
203: """form"""
204: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','upDateImageForm.zpt')).__of__(self)
205: return pt()
206:
207: def renameImageForm(self):
208: """form"""
209: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','renameImageForm.zpt')).__of__(self)
210: return pt()
211:
212: def renameImage(self,newname,RESPONSE=None):
213: """umbenennen"""
214: #umbennen des files im folder
215: oldname=self.getId()
216: self.aq_parent.manage_renameObjects(ids=[oldname],new_ids=[newname])
217: self.title=newname[0:]
218: self.filename=newname[0:]
219: #umbennen des files auf dem server
220: oldpath=os.path.join(self.ImageStoragePath,oldname)
221: newpath=os.path.join(self.ImageStoragePath,newname)
222: os.rename(oldpath,newpath)
223:
224: #umbenennen des versionsfolders
225: oldfolder=os.path.join(self.ImageStoragePath,"."+oldname+".dir")
226: if os.path.exists(oldfolder):
227: newfolder=os.path.join(self.ImageStoragePath,"."+newname+".dir")
228: os.rename(oldfolder,newfolder)
229:
230: #scale thumb
231:
232: self.scaleThumbs()
233:
234: #scale standard
235:
236: self.scaleWorkingVersions()
237:
238:
239: if RESPONSE:
240: RESPONSE.redirect(self.aq_parent.absolute_url()+"?filename="+self.filename)
241:
242:
243: def updateImage(self,file,rename=None,RESPONSE=None):
244: """lade neues Version des Bildes"""
245: #teste ob Dokumenten ordner schon vorhanden
246: imagePath=os.path.join(self.ImageStoragePath,self.getId())
247: path=os.path.join(self.ImageStoragePath,"."+self.getId()+".dir")
248:
249: if not os.path.exists(path):
250: os.mkdir(path,0775)
251: os.chmod(path,0775)
252:
253: versionNumber=getattr(self,'versionNumber',0)+1
254:
255: #teste ob version schon existiert
256:
257: while os.path.exists(os.path.join(path,"V%i_%s"%(versionNumber,self.getId()))):
258: versionNumber+=1
259:
260: #kopieren der bestehenden Version in den Versions ordner.
261: imageNewPath=os.path.join(path,"V%i_%s"%(versionNumber,self.getId()))
262: os.rename(imagePath,imageNewPath)
263:
264: #lesen des upload files und schreiben
265: filedata=file.read()
266: f=open(imagePath,"w")
267: f.write(filedata)
268: f.close()
269: try:
270: os.chmod(imagePath,0664)
271: except:
272: """hack"""
273: #scale thumb
274:
275: self.scaleThumbs()
276:
277: #scale standard
278:
279: self.scaleWorkingVersions()
280:
281: if rename:
282: self.renameImage(file.filename)
283:
284:
285: if RESPONSE:
286: RESPONSE.redirect(self.aq_parent.absolute_url()+"?filename="+self.filename)
287:
288:
289: return "done"
290:
291: def thumb(self,url=None):
292: """show thumb"""
293: thumbname=os.path.splitext(self.filename)[0]+".jpg"
294: ## if not os.path.exists("/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+thumbname):
295: ## image=urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:18080/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+self.filename+"&dw=150&mo=lores").read()
296: ## f=open("/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+thumbname,"w")
297: ## f.write(image)
298: ## f.close()
299: ## os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl %s /mpiwg/temp/online/scaled/small 150 &"% self.ImageViewerPath)
300:
301: #DEVEL:take nausikaa for server solution
302:
303: path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]+"&dw=100&dh=100&mo=lores"
304: #path="/mpiwg/online/"+self.ImageViewerPath+"/"+thumbname
305: self.REQUEST.SESSION['string']="<img border=\"0\" src=\"%s\">"% path
306: if url:
307: return "<img border=\"0\" src=\"%s\">"% path
308: else:
309: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumb.zpt')).__of__(self)
310: return pt()
311:
312: def index_html(self):
313: """show image"""
314: #DEVELOP: take first one for server
315:
316: path="http://content.mpiwg-berlin.mpg.de/zogilib_images?lv=2&fn="+self.ImageViewerPath+"/"+os.path.splitext(self.filename)[0]
317: return self.REQUEST.RESPONSE.redirect(path)
318:
319:
320: def manage_AddImageDigilibForm(self):
321: """Nothing yet"""
322: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddImageDigilibForm.zpt')).__of__(self)
323: return pt()
324:
325: def manage_AddImageDigilib(self,id,fileupload,meta=None,RESPONSE=None):
326: """Add ImageCollection"""
327:
328: #fileupload=self.REQUEST['fileupload']
329: fn=splitPath(fileupload.filename)
330: newObj=ImageDigilib(id,fn,meta)
331:
332: self._setObject(id,newObj)
333: getattr(self,id).uploadImage(fileupload,self.ImageStoragePath)
334:
335: if RESPONSE is not None:
336: RESPONSE.redirect('manage_main')
337:
338:
339:
340: class ImageCollection(Folder, Persistent, Implicit,ECHO_basis):
341:
342: """Sammelordner für Bilder"""
343: meta_type="ImageCollection"
344:
345:
346:
347: genericMetaDataType="leiden_meta"
348:
349: leiden_meta_fields=['image_id','date','country','place','people','description','photographer']
350:
351:
352: 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
353:
354:
355:
356: def createSet(self,RESPONSE=None,local=None,version="working"):
357: """download aller gewaehlten files"""
358: storeTempDir=tempfile.tempdir
359: tempfile.tempdir="/tmp/archivesImageServer"
360:
361: tmpPath=tempfile.mktemp()
362:
363:
364: tmpZip=tempfile.mktemp()+".zip"
365: tmpFn=os.path.split(tmpZip)[1]
366:
367:
368: if not os.path.exists(tempfile.tempdir):
369: os.mkdir(tempfile.tempdir)
370:
371: if not os.path.exists(tmpPath):
372: os.mkdir(tmpPath)
373:
374:
375: if RESPONSE:
376: RESPONSE.setHeader("Content-Type","text/html")
377: RESPONSE.write("<h1>I am creating the download archive</h1>")
378: RESPONSE.write("<h3>1. step: getting the images</h3>")
379:
380: if not self.REQUEST.SESSION.has_key('filenames'):
381: RESPONSE.write("<h2>ERROR</h2>")
382: RESPONSE.write("<p>I forgot, the selected files. Please reselect.\n")
383: return 0
384:
385: for id in self.REQUEST.SESSION['filenames']:
386:
387: if self.REQUEST.SESSION.has_key('filenamesIds') and self.REQUEST.SESSION['filenamesIds'].has_key(id[0]):
388: filename=self.REQUEST.SESSION['filenamesIds'][id[0]][0]+"_"+id[0]
389: else:
390: filename=id[0]
391:
392: if RESPONSE:
393: RESPONSE.write(str("<p>Get File: %s<br>\n"%filename))
394:
395: if local:
396: if version=="working":
397: sourcePath="/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+os.path.splitext(id[0])[0]+".jpg"
398: else:
399: sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+id[0]
400: targetPath=tmpPath+"/"+filename
401: try:
402: shutil.copyfile(sourcePath,targetPath)
403: except:
404: if RESPONSE:
405: RESPONSE.write(str("<p>Error in File: %s (possible missing)<br>\n"%filename))
406: else:
407: """nothing"""
408: else:
409: if version=="working":
410: path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(urllib.quote(id[0]))[0]+"&dh=2000&dw=2000"
411: else:
412: path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(urllib.quote(id[0]))[0]+"&mo=rawfile,hires"
413: image=urllib.urlopen(path).read()
414:
415:
416: fh=file(tmpPath+"/"+filename,"w")
417:
418:
419: fh.write(image)
420: fh.close()
421:
422: #folgeseiten
423: if int(self.REQUEST.SESSION['filenamesIds'][id[0]][1])>1:
424: ids=self.show_thumbs()
425: try:
426: nr=ids.index(id[0])
427: except:
428: if RESPONSE:
429: RESPONSE.write(str("<p>Error in File: %s (possible missing)<br>\n"%id[0]))
430: else:
431: """nothing"""
432:
433: nr=0
434:
435: numberOfPages=self.REQUEST.SESSION['filenamesIds'][id[0]][1]
436: for k in range(int(numberOfPages)-1):
437: i=k+1
438: if self.REQUEST.SESSION.has_key('filenamesIds') and self.REQUEST.SESSION['filenamesIds'].has_key(id[0]):
439: filename=self.REQUEST.SESSION['filenamesIds'][id[0]][0]+"_"+ids[nr+i]
440: else:
441: filename=id[0]
442:
443: if RESPONSE:
444: RESPONSE.write(str("<p>Get File: %s<br>\n"%filename))
445:
446: if local:
447: sourcePath="/mpiwg/online/"+self.ImageViewerPath+"/"+ids[nr+1]
448: targetPath=tmpPath+"/"+filename
449: try:
450: shutil.copyfile(sourcePath,targetPath)
451: except:
452: if RESPONSE:
453: RESPONSE.write(str("<p>Error in File: %s (missing?)<br>\n"%filename))
454: else:
455: """nothing"""
456: else:
457: path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+os.path.splitext(ids[nr+i])[0]+"&mo=rawfile,hires"
458:
459: image=urllib.urlopen(path).read()
460:
461:
462: fh=file(tmpPath+"/"+filename,"w")
463: fh.write(image)
464: fh.close()
465:
466: if RESPONSE:
467: RESPONSE.write("<h3>2. step: creating the downloadable file</h3>")
468: RESPONSE.write("<p>Create Zip<br>")
469: RESPONSE.write("<p>This can take a while....<br>\n")
470: if RESPONSE:
471: fh=os.popen2("zip -u %s %s/*"%(tmpZip,tmpPath),1)[1]
472: RESPONSE.write("<br>")
473: for c in fh.read():
474: RESPONSE.write(c)
475:
476: if c==")":
477: RESPONSE.write("<br>\n")
478:
479:
480: else:
481: os.popen("zip -u %s %s/*"%(tmpZip,tmpPath))
482:
483:
484: shutil.rmtree(tmpPath)
485:
486: if RESPONSE:
487: RESPONSE.write("<p>finished<br>\n")
488:
489: if RESPONSE:
490: len=os.stat(tmpZip)[6]
491: downloadUrl=self.absolute_url()+"/downloadSet"
492: RESPONSE.write("""<h1><a href="downloadSet?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len))
493: RESPONSE.write("""<p>The file will be stored for a while, you can download it later, the URL is:</p>
494: <p><a href="downloadSet?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn))
495: RESPONSE.close()
496:
497: def downloadSet(self,fn):
498: """download prepared set"""
499: filename="/tmp/archivesImageServer/"+fn
500:
501: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%"image.zip")
502: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
503: len=os.stat(filename)[6]
504: self.REQUEST.RESPONSE.setHeader("Content-Length",len)
505: images=file(filename).read()
506: self.REQUEST.RESPONSE.write(images)
507: self.REQUEST.RESPONSE.close()
508:
509:
510:
511: def scaleThumbs(self,RESPONSE=None):
512: """scale thumbs"""
513:
514: #scale thumbs
515: 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)
516: if RESPONSE:
517: RESPONSE.write(ret.read())
518: RESPONSE.write("\n")
519:
520: return "RESCALING STARTED"
521:
522: def scaleWorkingVersions(self,RESPONSE=None):
523: """scale working versions"""
524:
525: #scale standard
526:
527: 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)
528: if RESPONSE:
529: RESPONSE.write(ret.read())
530: RESPONSE.write("\n")
531: return "rescaling started"
532:
533:
534:
535: def __init__(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString):
536: self.id=id
537: self.title=title
538: self.ImageStoragePath=ImageStoragePath
539: self.ImageViewerPath=ImageViewerPath
540: self.defaultMetaString=defaultMetaString
541:
542: optTMP= Folder.manage_options
543:
544: manage_options = optTMP+(
545: {'label':'Main Config','action':'ImageCollection_config'},
546: {'label':'Import','action':'ImportFiles'},
547: {'label':'Recalculate MetadataLink','action':'recalculateMetaLink'},
548: {'label':'Import Metadata File','action':'importMetaFileForm'},
549: {'label':'Import Metadata','action':'importMetaData'},
550: {'label':'Rescale thumbs','action':'scaleThumbs'},
551: {'label':'Rescale working version','action':'scaleWorkingVersions'},
552: )
553:
554:
555:
556: def importMetaData(self,strict=None):
557: """import metadata, if strict ist not None then only metadata will be rebuild where metadata is empty"""
558:
559: for image in self.ZopeFind(self,obj_metatypes=["ImageDigilib"]):
560: print image[1].getId()
561: image[1].manageMetaData(strict)
562: return "ok"
563:
564:
565: def importMetaFileForm(self):
566: """import metadata"""
567: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','importMeta.zpt')).__of__(self)
568: return pt()
569:
570: def importMetaFile(self,fileupload,tag):
571: """import"""
572: filedata=fileupload.read()
573: dom=xml.dom.minidom.parseString(filedata)
574: rows=dom.getElementsByTagName(tag)
575: #print "ROWS",rows
576: request=self.REQUEST
577: for row in rows:
578:
579: for a in self.leiden_meta_fields:
580: self.REQUEST[a]=getText(row.getElementsByTagName(a)[0].childNodes)
581:
582: image_id=self.REQUEST['image_id']
583: if (not hasattr(self,image_id)) & (not image_id==""):
584: #print image_id
585: newObj=ImageCollection(str(image_id),image_id,'','','')
586: self._setObject(str(image_id),newObj)
587:
588: id="leiden_meta_data_file"
589: self.REQUEST['id']=id
590: #objectType=getattr(self.Control_Panel.Products.ImageMetaData,self.genericMetaDataType)
591: #objectCreate=objectType.createInObjectManager(id,request)
592: #href="http://localhost:8080/tests/testcollection/manage_addProduct/ImageMetaData/leiden_meta_factory/"
593: try:
594: addID=getattr(self,image_id)
595: objectCreate=addID.manage_addProduct['ImageMetaData'].leiden_meta_add(id)
596: #getattr(self,image_id)._setObject(id,objectCreate)
597: obj=getattr(addID,id)
598: obj.propertysheets.meta.manage_editProperties(request)
599: except:
600: """nothing"""
601: return "OK"
602:
603:
604: def nextImage(self,request,selected=None,returnFn=None):
605: """show nextimage"""
606: try:
607: ids=self.show_thumbs()
608: if request.SESSION.has_key("filename"):
609: filename=request.SESSION["filename"]
610: try:
611: nr=ids.index(filename)
612:
613: except:
614: nr=0
615: else:
616: nr=0
617:
618: if nr==len(ids)-1:
619: return ""
620: else:
621: if returnFn:
622: return ids[nr+1]
623:
624: if selected:
625: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr+1]+"\" target=\"_top\">next image</a>"
626: else:
627: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr+1]+"\" target=\"_top\">next image</a>"
628: except:
629: return ""
630:
631: def prevImage(self,request,selected=None):
632: """show nextimage"""
633: #return self.getId()
634: try:
635: ids=self.show_thumbs()
636: if request.SESSION.has_key("filename"):
637: filename=request.SESSION["filename"]
638: try:
639: nr=ids.index(filename)
640: except:
641: nr=0
642: else:
643: nr=0
644:
645: if nr==0:
646: return ""
647: else:
648: if selected:
649: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr-1]+"\" target=\"_top\">previous image</a>"
650: else:
651: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr-1]+"\" target=\"_top\">previous image</a>"
652: except:
653: return ""
654:
655: def meta_default(self,filename):
656: """url der metadaten"""
657: return self.defaultMetaString % urllib.quote(filename)
658:
659: def getThumbAttribute(self,id,attr):
660: if hasattr(self,id):
661: return getattr(getattr(self,id),attr)
662: else:
663: if attr=='title':
664: return "<b>Missing Image:%s</b>" % id
665:
666: def getThumbFunction(self,id,attr):
667: #return "DUMP"
668: if hasattr(self,id):
669: return getattr(getattr(self,id),attr)()
670:
671:
672: def xmlinput(self,url):
673: """Anzeige von ausgewaehlten thumbs"""
674: #return url
675:
676: url=urllib.unquote(url)
677: xmldoc=urllib.urlopen(url).read()
678: #return xmldoc
679: try:
680: dom=xml.dom.minidom.parseString(xmldoc)
681: except:
682: return xmldoc
683: images=dom.getElementsByTagName('image')
684:
685: rc=[]
686: fnIds={}
687: for image in images:
688: imagename=image.getElementsByTagName('imagename')[0]
689:
690:
691:
692: idnr=image.getElementsByTagName('idnr')[0]
693: id=getText(idnr.childNodes)
694: numberOfPages=image.getElementsByTagName('numberOfPages')[0]
695: nopT=getText(numberOfPages.childNodes)
696: try:
697: nop=int(nopT)
698: except:
699: nop=0
700: texts=getText(imagename.childNodes).split("\n") #mehrere bilder in return getrennter liste
701: for text in texts:
702: if not text=="":
703: try:
704: rc.append((str(text),id,nop))
705: fnIds[str(text)]=(id,nop)
706: except:
707: rc.append((repr(text),id,nop))
708: fnIds[repr(text)]=(id,nop)
709:
710:
711: rc.sort()
712: self.REQUEST.SESSION['filenames']=rc
713: self.REQUEST.SESSION['filenamesIds']=fnIds
714:
715: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected.zpt')).__of__(self)
716: return pt()
717:
718: def recalculateMetaLink(self):
719: """recalculate the metadata"""
720:
721: for entryid in self.__dict__:
722: entry=getattr(self,entryid)
723: if hasattr(entry,'meta_type'):
724:
725: if entry.meta_type=="ImageDigilib":
726: entry.meta=entry.meta_default(entry.getId())
727: return "OK"
728:
729: def addImage(self):
730: """Add an Image"""
731:
732: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addImage.zpt')).__of__(self)
733: return pt()
734:
735: def addImage2(self,fileupload,meta,use_default=None,RESPONSE=None):
736: """Add"""
737:
738: #print "FU",fileupload
739:
740: if use_default:
741: try:
742: meta=self.meta_default(fileupload.filename)
743: except:
744: meta=None
745: else:
746: meta=None
747: fn=splitPath(fileupload.filename)
748:
749: manage_AddImageDigilib(self,fn,fileupload,meta=meta)
750: return RESPONSE.redirect(self.REQUEST['URL1']+'/'+fn)
751: #return self.REQUEST['URL1']+'/'+fileupload.filename
752:
753: def ImportFiles2(self,RESPONSE=None):
754: """Import the existing files of a folder"""
755: files=os.listdir(self.ImageStoragePath)
756: ret=""
757: #print self.__dict__
758: for file in files:
759: if not file[0]==".":
760: if self.__dict__.has_key(file):
761:
762: ret=ret+"<br>"+file+" already exists!"
763: else:
764: ret=ret+"<br>"+file+" created!"
765: meta=self.meta_default(file)
766: newObj=ImageDigilib(file,file,meta)
767: #print newObj,file
768: #print newObj
769: self._setObject(file,newObj)
770: #print ret
771: #pt=PageTemplateFile('Products/ImageArchive/out.zpt')).__of__(self)
772: #print self.ImageStoragePath
773:
774: #scale thumb
775:
776: self.scaleThumbs()
777:
778: #scale standard
779:
780: self.scaleWorkingVersions()
781:
782:
783: RESPONSE.redirect('manage_main')
784:
785: def ImportFiles(self,RESPONSE=None):
786: """Import the existing files of a folder"""
787: files=os.listdir(self.ImageStoragePath)
788: ret=""
789: #print self.__dict__
790: for file in files:
791: if not file[0]==".":
792: if self.__dict__.has_key(file):
793:
794: ret=ret+"<br>"+file+" already exists!"
795: else:
796: ret=ret+"<br>"+file+" created!"
797: newObj=ImageDigilib(file,file)
798: #print newObj,file
799: #print newObj
800: try:
801: self._setObject(file,newObj)
802: except:
803: """nothing yet"""
804: #print ret
805: #pt=PageTemplateFile('Products/ImageArchive/out.zpt')).__of__(self)
806: #print self.ImageStoragePath
807:
808: #scale thumb
809:
810: self.scaleThumbs()
811:
812: #scale standard
813:
814: self.scaleWorkingVersions()
815:
816: if RESPONSE:
817: RESPONSE.redirect('manage_main')
818:
819: def ImageCollection_config(self):
820: """Nothing yet"""
821: if not hasattr(self,'defaultMetaString'):
822: self.defaultMetaString=""
823:
824: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeImageCollectionForm.zpt')).__of__(self)
825: return pt()
826:
827: def ChangeImageCollection(self,title,ImageStoragePath,ImageViewerPath,defaultMetaString,RESPONSE=None):
828: """Change"""
829: self.title=title
830: self.ImageStoragePath=ImageStoragePath
831: self.ImageViewerPath=ImageViewerPath
832: self.defaultMetaString=defaultMetaString
833:
834: if RESPONSE is not None:
835: RESPONSE.redirect('manage_main')
836:
837: def show_selected_thumbs(self):
838: #ids=[]
839:
840: return self.REQUEST.SESSION['filenames']
841:
842: def show_thumbs(self):
843: ids=[]
844: for entry in self.__dict__:
845: #print entry
846: if hasattr(getattr(self,entry),'thumb'):
847: ids.append(entry)
848:
849: #print ids
850: ids.sort()
851: return ids
852:
853: def firstSets(self,selected=None):
854: ids=self.show_thumbs()
855: if ids:
856: if selected:
857: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[0]+"\" target=\"_top\">first sets</a>"
858: else:
859: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[0]+"\" target=\"_top\">first sets</a>"
860:
861: def lastSets(self,selected=None):
862: ids=self.show_thumbs()
863: if ids:
864: colRows=self.getColTimesRow()
865:
866: if colRows[1]:
867: nr=len(ids)-colRows[0]*colRows[1]
868: else:
869: nr=0
870:
871: if nr<0:
872: nr=0
873:
874: if selected:
875: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr]+"\" target=\"_top\">last set</a>"
876: else:
877: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr]+"\" target=\"_top\">last sets</a>"
878:
879:
880:
881: def nextSets(self,selected=None):
882: """show nextimage"""
883: ids=self.show_thumbs()
884: colRows=self.getColTimesRow()
885: if ids:
886: if colRows[1]:
887:
888: if self.REQUEST.SESSION.has_key("filename"):
889: filename=self.REQUEST.SESSION["filename"]
890: try:
891: nr=ids.index(filename)+colRows[0]*colRows[1]
892: if nr>=len(ids):
893: nr=len(ids)-1
894: except:
895: nr=0
896: else:
897: nr=0
898:
899: if nr==len(ids)-1:
900: return ""
901: else:
902: if selected:
903: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr]+"\" target=\"_top\">next set</a>"
904: else:
905: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr]+"\" target=\"_top\">next set</a>"
906:
907: def prevSets(self,selected=None):
908:
909: """show nextimage"""
910: #return self.getId()
911: ids=self.show_thumbs()
912: colRows=self.getColTimesRow()
913: if ids:
914: if colRows[1]:
915: if self.REQUEST.SESSION.has_key("filename"):
916: filename=self.REQUEST.SESSION["filename"]
917: try:
918: nr=ids.index(filename)-colRows[0]*colRows[1]
919: if nr<0:
920: nr=0
921: except:
922: nr=0
923: else:
924: nr=0
925: try:
926: num=ids.index(filename)
927: except:
928: num=0
929:
930: if num==0:
931: return ""
932: else:
933: if selected:
934: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr]+"\" target=\"_top\">previous sets</a>"
935: else:
936: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr]+"\" target=\"_top\">previous sets</a>"
937: else:
938: return ""
939:
940: def showRuler(self,selected=None):
941: """show ruler"""
942: showall =self.REQUEST.SESSION.get('showall','no')
943: ids=self.show_thumbs()
944: if len(ids)==0:
945: return "<b>No entries</b>"
946:
947: if showall=='no':
948: ids=self.show_thumbs()
949: colRows=self.getColTimesRow()
950: num=int(len(ids)/(colRows[0]*colRows[1]))
951: if not (operator.mod(len(ids),colRows[0]*colRows[1])==0):
952: num+=1
953: a=colRows[0]*colRows[1]
954: #print num,num+1
955: if num>1:
956:
957: ret="<b>Show thumbnail group no:</b></br>"
958: for i in range(num):
959: if (operator.mod(i,10)==0) and i>0:
960: ret +="<br/>" #alle 10 linebreak einfuegen
961: k=i*a
962: if selected:
963: href=self.REQUEST['URL1']+"/selection?filename="+ids[k]
964: else:
965: href=self.REQUEST['URL1']+"?filename="+ids[int(k)]
966:
967: ret+="""<a href="%s" target="_top">%i</a> """%(href,i)
968:
969: else:
970: ret=""
971: ret+="""<a href="%s?showall=yes" target="_top">show all</a> """%self.REQUEST['URL1']
972: else:
973: ret="""<a href="%s?showall=no" target="_top">show groups</a> """%self.REQUEST['URL1']
974:
975: return ret
976:
977: def show_thumbs_selected_rows(self,numberOfColumns):
978: """Ausgabe anzahl"""
979: ids=self.show_selected_thumbs()
980: self.REQUEST.SESSION['ids']=ids
981: number=int(len(ids)/numberOfColumns)+1
982: self.REQUEST.SESSION['number']=range(number)
983: return range(number+1)
984:
985: def setColTimesRowForm(self):
986: """form for matrix setting"""
987: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','selectColTimesRow.zpt')).__of__(self)
988: return pt()
989:
990: def setDone(self):
991: """done"""
992:
993: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changedColTimesRow.zpt')).__of__(self)
994: return pt()
995:
996: def setColTimesRow(self,cols,rows):
997: """set coltimes row"""
998: RESPONSE=self.REQUEST.RESPONSE
999: if not rows:
1000: rows=None
1001: if rows=="":
1002: rows=None
1003:
1004: if rows:
1005: RESPONSE.setCookie("ImageViewerRows",rows)
1006: RESPONSE.setCookie("ImageViewerCols",cols)
1007:
1008: RESPONSE.redirect(self.REQUEST['URL1']+"/setDone")
1009:
1010: def getColTimesRow(self,showall='No'):
1011: """coltimesrow"""
1012:
1013: REQUEST=self.REQUEST
1014: """matrix"""
1015: if REQUEST.cookies.has_key("ImageViewerRows"):
1016:
1017: try:
1018: rows=int(REQUEST.cookies["ImageViewerRows"])
1019: except:
1020: rows=6
1021: else:
1022: rows=6
1023:
1024: if REQUEST.cookies.has_key("ImageViewerCols"):
1025: #print "COLS",REQUEST.cookies["ImageViewerCols"]
1026: cols=int(REQUEST.cookies["ImageViewerCols"])
1027: else:
1028: cols=2
1029:
1030: idsnumber=len(self.show_thumbs())
1031: if rows:
1032: if cols*rows >idsnumber:
1033: rows=int(idsnumber/cols)+1
1034:
1035: #print cols,rows
1036: if showall=='yes':
1037: rows=int(idsnumber/cols)+1
1038:
1039: return (cols,rows)
1040:
1041:
1042: def show_thumbs_rows(self,numberOfColumns,numberOfRows=None,startId=None):
1043: """Ausgabe anzahl"""
1044:
1045: idsAll=self.show_thumbs()
1046: if len(idsAll)==0: #keine Einträge
1047: return 0
1048: if self.REQUEST.SESSION.has_key("filename"):
1049: filename=self.REQUEST.SESSION["filename"]
1050:
1051:
1052: try:
1053: startId=filename
1054: if startId=="":
1055: startId=idsAll[0][0:]
1056: except:
1057: startId=idsAll[0][0:]
1058: else:
1059: startId=idsAll[0][0:]
1060:
1061:
1062:
1063:
1064: if numberOfRows:
1065:
1066: startPic=idsAll.index(startId)
1067: try:
1068:
1069: startPic=idsAll.index(startId)
1070: endPic=startPic+numberOfColumns*numberOfRows
1071: ids=idsAll[startPic:endPic]
1072: except:
1073: ids=idsAll
1074: else:
1075:
1076: ids=idsAll
1077:
1078:
1079: self.REQUEST.SESSION['ids']=ids
1080: number=int(len(ids)/numberOfColumns)+1
1081:
1082: return range(number+1)
1083:
1084: def show_thumbs_columns(self,row,numberOfColumns):
1085: """Ausgabe einer Liste der Reihe"""
1086: ids=self.REQUEST.SESSION['ids']
1087: max=len(ids)
1088: if (row*numberOfColumns)<max:
1089: return ids[(row-1)*numberOfColumns:row*numberOfColumns]
1090: else:
1091: return ids[(row-1)*numberOfColumns:]
1092:
1093: def thumblistSelected_old(self):
1094: """main template collection"""
1095: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbselected.zpt')).__of__(self)
1096: return pt()
1097:
1098: def thumblistSelected(self):
1099: """main template collection"""
1100: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbselected2.zpt')).__of__(self)
1101: return pt()
1102:
1103: def thumblist_old(self):
1104: """main template collection"""
1105: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbs.zpt')).__of__(self)
1106: return pt()
1107:
1108: def thumblist(self):
1109: """main template collection"""
1110: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumb2.zpt')).__of__(self)
1111: return pt()
1112:
1113: def thumblistNewWindow(self):
1114: """Thumbs mit clik neues Fenster oeffnen"""
1115: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbNewWindow.zpt')).__of__(self)
1116: return pt()
1117:
1118:
1119: def navig_selected_html(self):
1120: """navigation"""
1121: #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
1122: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigation_selected.zpt')).__of__(self)
1123: return pt()
1124:
1125: def navig_html(self):
1126: """navigation"""
1127: #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
1128:
1129: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigation.zpt')).__of__(self)
1130: return pt()
1131:
1132:
1133: def selection(self):
1134: """show only selected"""
1135: if self.REQUEST.has_key('filename'):
1136: filen=self.REQUEST['filename']
1137: else:
1138: filen=""
1139: self.REQUEST.SESSION['filename']=filen
1140: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected2.zpt')).__of__(self)
1141: return pt()
1142:
1143: def index_html(self):
1144: """main template collection"""
1145: if self.REQUEST.has_key('filename'):
1146: filen=self.REQUEST['filename']
1147: else:
1148: filen=""
1149:
1150: self.REQUEST.SESSION['filename']=filen[0:]
1151:
1152: if self.REQUEST.has_key('showall'):
1153:
1154: self.REQUEST.SESSION['showall']=self.REQUEST.get('showall')
1155: else:
1156: self.REQUEST.SESSION['showall']=self.REQUEST.SESSION.get('showall','no')
1157:
1158:
1159: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview.zpt')).__of__(self)
1160: return pt()
1161:
1162: def manage_AddImageCollectionForm(self):
1163: """Nothing yet"""
1164: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddImageCollectionForm.zpt')).__of__(self)
1165: return pt()
1166:
1167: def manage_AddImageCollection(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString,RESPONSE=None):
1168: """Add ImageCollection"""
1169: newObj=ImageCollection(id,title,ImageStoragePath,ImageViewerPath,defaultMetaString)
1170: self._setObject(id,newObj)
1171:
1172: if RESPONSE is not None:
1173: RESPONSE.redirect('manage_main')
1174:
1175:
1176: class ImageCollectionIFrame(ImageCollection):
1177: """Class fuer Collection set als IFrame"""
1178:
1179: meta_type="ImageCollectionIFrame"
1180: label=ImageCollection.title
1181:
1182: def getImageTag(self):
1183: """ hack : method needed by echo_content"""
1184: return ""
1185:
1186: def rotate(self,angle,url,RESPONSE):
1187: """rotate"""
1188:
1189: RESPONSE.redirect("javascript:document.domain='mpg.de';parent.iframe.right.rotation(%i)"%int(angle))
1190: RESPONSE.redirect(url)
1191: def request(self):
1192: """request"""
1193: return self.REQUEST
1194:
1195: def index_html(self):
1196: """index"""
1197: if self.REQUEST.has_key('filename'):
1198: filen=self.REQUEST['filename']
1199: else:
1200: filen=""
1201: self.REQUEST.SESSION['filename']=filen
1202:
1203:
1204: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','IFrameMain.zpt')).__of__(self)
1205: return pt()
1206:
1207: def iframe_html(self):
1208: """iframe"""
1209: if self.REQUEST.has_key('filename'):
1210: filen=self.REQUEST['filename']
1211: else:
1212: filen=""
1213: self.REQUEST.response.setCookie('filename',filen)
1214: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','IFrameOverview.zpt')).__of__(self)
1215: return pt()
1216:
1217:
1218: def manage_AddImageCollectionIFrameForm(self):
1219: """Nothing yet"""
1220: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddImageCollectionIFrameForm.zpt')).__of__(self)
1221: return pt()
1222:
1223: def manage_AddImageCollectionIFrame(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString,RESPONSE=None):
1224: """Add ImageCollection"""
1225: newObj=ImageCollectionIFrame(id,title,ImageStoragePath,ImageViewerPath,defaultMetaString)
1226: self._setObject(id,newObj)
1227:
1228: if RESPONSE is not None:
1229: RESPONSE.redirect('manage_main')
1230:
1231:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>