1: from OFS.Folder import Folder
2: from OFS.SimpleItem import SimpleItem
3: from Globals import Persistent
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:
13: def getText(nodelist):
14:
15: rc = ""
16: for node in nodelist:
17:
18: if node.nodeType == node.TEXT_NODE:
19: rc = rc + node.data
20: return rc
21:
22:
23: class ImageDigilib(Folder,Persistent,Implicit):
24: """Anzeige object fuer digilib"""
25: meta_type="ImageDigilib"
26:
27: leiden_meta_fields=['image_id','date','country','place','people','description','photographer']
28:
29: manage_options = Folder.manage_options+(
30:
31: {'label':'Add Metadata','action':'addMetaObjectForm'},
32:
33: )
34:
35: def addMetaObject(self,id,RESPONSE=None):
36: """Add an MetaObject"""
37: objectType=getattr(self.Control_Panel.Products.ImageMetaData,self.genericMetaDataType)
38:
39: request=self.REQUEST
40: objectCreate=objectType.createObjectManager(id,request)
41: #for field in self.leiden_meta_fields:
42: # self.REQUEST[field]=argv[field]
43: self._setObject(id,objectCreate)
44:
45: objectCreate.propertysheets.meta.manage_editProperties(request)
46:
47: if RESPONSE is not None:
48: RESPONSE.redirect('manage_main')
49:
50:
51:
52:
53: def addMetaObjectForm(self):
54: """Add Form"""
55: pt=PageTemplateFile('Products/ImageArchive/addMetaObject.zpt').__of__(self)
56: return pt()
57:
58:
59: def __init__(self,id,filename,meta=None):
60: self.id=id
61: self.title=filename
62: self.filename=filename
63: self.meta=meta
64:
65:
66:
67: def getMeta(self):
68: """ausgabe der metadaten"""
69: return self.meta
70:
71: def uploadImage(self,fileupload,path_name):
72: """upload an Image from an Requast"""
73: #path_name=self.ImageStoragePath
74: filename=path_name+"/"+fileupload.filename
75: filedata=fileupload.read()
76: f=open(filename,"w")
77: f.write(filedata)
78: f.close()
79: os.chmod(filename,0644)
80: os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl %s /mpiwg/temp/online/scaled/small 100 &"% self.ImageViewerPath)
81:
82:
83:
84:
85:
86: def download(self):
87: """download"""
88: path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+self.filename+"&mo=rawfile,highres"
89: #self.REQUEST.SESSION['string']="<img src=\"%s\">"% path
90: #pt=PageTemplateFile('Products/ImageArchive/thumb.zpt').__of__(self)
91: return self.REQUEST.RESPONSE.redirect(path)
92:
93: def thumb(self):
94: """show thumb"""
95: thumbname=os.path.splitext(self.filename)[0]+".jpg"
96: ## if not os.path.exists("/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+thumbname):
97: ## image=urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:18080/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+self.filename+"&dw=150&mo=lores").read()
98: ## f=open("/mpiwg/temp/online/scaled/small/"+self.ImageViewerPath+"/"+thumbname,"w")
99: ## f.write(image)
100: ## f.close()
101: ## os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl %s /mpiwg/temp/online/scaled/small 150 &"% self.ImageViewerPath)
102:
103: #DEVEL:take nausikaa for server solution
104:
105: path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?fn="+self.ImageViewerPath+"/"+self.filename+"&dw=100&dh=100&mo=lores"
106: #path="/mpiwg/online/"+self.ImageViewerPath+"/"+thumbname
107: self.REQUEST.SESSION['string']="<img border=\"0\" src=\"%s\">"% path
108: pt=PageTemplateFile('Products/ImageArchive/thumb.zpt').__of__(self)
109: return pt()
110:
111: def index_html(self):
112: """show image"""
113: #DEVELOP: take first one for server
114:
115: path="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/digilib.jsp?fn="+self.ImageViewerPath+"/"+self.filename
116:
117: #path="http://localhost:8080/mpiwg/online/"+self.ImageViewerPath+"/"+self.filename
118: #self.REQUEST.SESSION['string']="<img src=\"%s\">"% path
119: #pt=PageTemplateFile('Products/ImageArchive/thumb.zpt').__of__(self)
120: return self.REQUEST.RESPONSE.redirect(path)
121:
122:
123: def manage_AddImageDigilibForm(self):
124: """Nothing yet"""
125: pt=PageTemplateFile('Products/ImageArchive/AddImageDigilibForm.zpt').__of__(self)
126: return pt()
127:
128: def manage_AddImageDigilib(self,id,fileupload,meta=None,RESPONSE=None):
129: """Add ImageCollection"""
130: #fileupload=self.REQUEST['fileupload']
131: newObj=ImageDigilib(id,fileupload.filename,meta)
132:
133: self._setObject(id,newObj)
134: getattr(self,id).uploadImage(fileupload,self.ImageStoragePath)
135:
136: if RESPONSE is not None:
137: RESPONSE.redirect('manage_main')
138:
139:
140: class ImageCollection(Folder, Persistent, Implicit):
141: """Sammelordner für Bilder"""
142: meta_type="ImageCollection"
143:
144: genericMetaDataType="leiden_meta"
145:
146: leiden_meta_fields=['image_id','date','country','place','people','description','photographer']
147:
148:
149: 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
150:
151: def scaleThumbs(self):
152: """scale thumbs"""
153: os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl %s /mpiwg/temp/online/scaled/small 100 &"% self.ImageViewerPath)
154: return "RESCALING STARTED"
155:
156: def __init__(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString):
157: self.id=id
158: self.title=title
159: self.ImageStoragePath=ImageStoragePath
160: self.ImageViewerPath=ImageViewerPath
161: self.defaultMetaString=defaultMetaString
162:
163: manage_options = Folder.manage_options+(
164: {'label':'Main Config','action':'ImageCollection_config'},
165: {'label':'Import','action':'ImportFiles'},
166: {'label':'Recalculate Metadata','action':'recalculateMeta'},
167: {'label':'Import Metadata','action':'importMetaForm'},
168: {'label':'Rescale thumbs','action':'scaleThumbs'},
169: )
170:
171:
172: def importMetaForm(self):
173: """import metadata"""
174: pt=PageTemplateFile('Products/ImageArchive/importMeta.zpt').__of__(self)
175: return pt()
176:
177: def importMeta(self,fileupload,tag):
178: """import"""
179: filedata=fileupload.read()
180: dom=xml.dom.minidom.parseString(filedata)
181: rows=dom.getElementsByTagName(tag)
182: #print "ROWS",rows
183: request=self.REQUEST
184: for row in rows:
185:
186: for a in self.leiden_meta_fields:
187: self.REQUEST[a]=getText(row.getElementsByTagName(a)[0].childNodes)
188:
189: image_id=self.REQUEST['image_id']
190: if (not hasattr(self,image_id)) & (not image_id==""):
191: #print image_id
192: newObj=ImageCollection(str(image_id),image_id,'','','')
193: self._setObject(str(image_id),newObj)
194:
195: id="leiden_meta_data_file"
196: self.REQUEST['id']=id
197: #objectType=getattr(self.Control_Panel.Products.ImageMetaData,self.genericMetaDataType)
198: #objectCreate=objectType.createInObjectManager(id,request)
199: #href="http://localhost:8080/tests/testcollection/manage_addProduct/ImageMetaData/leiden_meta_factory/"
200: try:
201: addID=getattr(self,image_id)
202: objectCreate=addID.manage_addProduct['ImageMetaData'].leiden_meta_add(id)
203: #getattr(self,image_id)._setObject(id,objectCreate)
204: obj=getattr(addID,id)
205: obj.propertysheets.meta.manage_editProperties(request)
206: except:
207: """nothing"""
208: return "OK"
209:
210:
211: def nextImage(self,request,selected=None):
212: """show nextimage"""
213: try:
214: ids=self.show_thumbs()
215: if request.SESSION.has_key("filename"):
216: filename=request.SESSION["filename"]
217: try:
218: nr=ids.index(filename)
219: except:
220: nr=0
221: else:
222: nr=0
223:
224: if nr==len(ids)-1:
225: return ""
226: else:
227: if selected:
228: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr+1]+"\" target=\"_top\">next image</a>"
229: else:
230: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr+1]+"\" target=\"_top\">next image</a>"
231: except:
232: return ""
233:
234: def prevImage(self,request,selected=None):
235: """show nextimage"""
236: #return self.getId()
237: try:
238: ids=self.show_thumbs()
239: if request.SESSION.has_key("filename"):
240: filename=request.SESSION["filename"]
241: try:
242: nr=ids.index(filename)
243: except:
244: nr=0
245: else:
246: nr=0
247:
248: if nr==0:
249: return ""
250: else:
251: if selected:
252: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr-1]+"\" target=\"_top\">previous image</a>"
253: else:
254: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr-1]+"\" target=\"_top\">previous image</a>"
255: except:
256: return ""
257:
258: def meta_default(self,filename):
259: """url der metadaten"""
260: return self.defaultMetaString % filename
261:
262: def getThumbAttribute(self,id,attr):
263: if hasattr(self,id):
264: return getattr(getattr(self,id),attr)
265: else:
266: if attr=='title':
267: return "<b>Missing Image:%s</b>" % id
268:
269: def getThumbFunction(self,id,attr):
270: #return "DUMP"
271: if hasattr(self,id):
272: return getattr(getattr(self,id),attr)()
273:
274:
275: def xmlinput(self,url):
276: """Anzeige von ausgewaehlten thumbs"""
277: #return url
278:
279: url=urllib.unquote(url)
280: xmldoc=urllib.urlopen(url).read()
281: #print url
282: dom=xml.dom.minidom.parseString(xmldoc)
283:
284: images=dom.getElementsByTagName('imagename')
285: rc=[]
286: for image in images:
287: text=getText(image.childNodes)
288: if not text=="":
289: rc.append(str(text))
290: rc.sort()
291: self.REQUEST.SESSION['filenames']=rc
292: pt=PageTemplateFile('Products/ImageArchive/overview_selected.zpt').__of__(self)
293: return pt()
294:
295: def recalculateMeta(self):
296: """recalculate the metadata"""
297:
298: for entryid in self.__dict__:
299: entry=getattr(self,entryid)
300: if hasattr(entry,'meta_type'):
301:
302: if entry.meta_type=="ImageDigilib":
303: entry.meta=entry.meta_default(entry.getId())
304: return "OK"
305:
306: def addImage(self):
307: """Add an Image"""
308: pt=PageTemplateFile('Products/ImageArchive/addImage.zpt').__of__(self)
309: return pt()
310:
311: def addImage2(self,fileupload,meta,use_default=None,RESPONSE=None):
312: """Add"""
313: #print "FU",fileupload
314:
315: if use_default:
316: try:
317: meta=self.meta_default(fileupload.filename)
318: except:
319: meta=None
320: else:
321: meta=None
322:
323: manage_AddImageDigilib(self,fileupload.filename,fileupload,meta=meta)
324: return RESPONSE.redirect(self.REQUEST['URL1']+'/'+fileupload.filename)
325: #return self.REQUEST['URL1']+'/'+fileupload.filename
326:
327: def ImportFiles2(self,RESPONSE=None):
328: """Import the existing files of a folder"""
329: files=os.listdir(self.ImageStoragePath)
330: ret=""
331: #print self.__dict__
332: for file in files:
333: if not file[0]==".":
334: if self.__dict__.has_key(file):
335:
336: ret=ret+"<br>"+file+" already exists!"
337: else:
338: ret=ret+"<br>"+file+" created!"
339: meta=self.meta_default(file)
340: newObj=ImageDigilib(file,file,meta)
341: #print newObj,file
342: #print newObj
343: self._setObject(file,newObj)
344: #print ret
345: #pt=PageTemplateFile('Products/ImageArchive/out.zpt').__of__(self)
346: #print self.ImageStoragePath
347: os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl %s /mpiwg/temp/online/scaled/small 100 &"% self.ImageViewerPath)
348: RESPONSE.redirect('manage_main')
349:
350: def ImportFiles(self,RESPONSE=None):
351: """Import the existing files of a folder"""
352: files=os.listdir(self.ImageStoragePath)
353: ret=""
354: #print self.__dict__
355: for file in files:
356: if not file[0]==".":
357: if self.__dict__.has_key(file):
358:
359: ret=ret+"<br>"+file+" already exists!"
360: else:
361: ret=ret+"<br>"+file+" created!"
362: newObj=ImageDigilib(file,file)
363: #print newObj,file
364: #print newObj
365: try:
366: self._setObject(file,newObj)
367: except:
368: """nothing yet"""
369: #print ret
370: #pt=PageTemplateFile('Products/ImageArchive/out.zpt').__of__(self)
371: #print self.ImageStoragePath
372: os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl %s /mpiwg/temp/online/scaled/small 100 &"% self.ImageViewerPath)
373: RESPONSE.redirect('manage_main')
374:
375: def ImageCollection_config(self):
376: """Nothing yet"""
377: if not hasattr(self,'defaultMetaString'):
378: self.defaultMetaString=""
379:
380: pt=PageTemplateFile('Products/ImageArchive/ChangeImageCollectionForm.zpt').__of__(self)
381: return pt()
382:
383: def ChangeImageCollection(self,title,ImageStoragePath,ImageViewerPath,defaultMetaString,RESPONSE=None):
384: """Change"""
385: self.title=title
386: self.ImageStoragePath=ImageStoragePath
387: self.ImageViewerPath=ImageViewerPath
388: self.defaultMetaString=defaultMetaString
389:
390: if RESPONSE is not None:
391: RESPONSE.redirect('manage_main')
392:
393: def show_selected_thumbs(self):
394: #ids=[]
395:
396: return self.REQUEST.SESSION['filenames']
397:
398: def show_thumbs(self):
399: ids=[]
400: for entry in self.__dict__:
401: #print entry
402: if hasattr(getattr(self,entry),'thumb'):
403: ids.append(entry)
404:
405: #print ids
406: ids.sort()
407: return ids
408:
409: def firstSets(self,selected=None):
410: ids=self.show_thumbs()
411: if ids:
412: if selected:
413: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[0]+"\" target=\"_top\">first sets</a>"
414: else:
415: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[0]+"\" target=\"_top\">first sets</a>"
416:
417: def lastSets(self,selected=None):
418: ids=self.show_thumbs()
419: if ids:
420: colRows=self.getColTimesRow()
421:
422: if colRows[1]:
423: nr=len(ids)-colRows[0]*colRows[1]
424: else:
425: nr=0
426:
427: if nr<0:
428: nr=0
429:
430: if selected:
431: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr]+"\" target=\"_top\">last set</a>"
432: else:
433: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr]+"\" target=\"_top\">last sets</a>"
434:
435:
436:
437: def nextSets(self,selected=None):
438: """show nextimage"""
439: ids=self.show_thumbs()
440: colRows=self.getColTimesRow()
441: if ids:
442: if colRows[1]:
443:
444: if self.REQUEST.SESSION.has_key("filename"):
445: filename=self.REQUEST.SESSION["filename"]
446: try:
447: nr=ids.index(filename)+colRows[0]*colRows[1]
448: if nr>=len(ids):
449: nr=len(ids)-1
450: except:
451: nr=0
452: else:
453: nr=0
454:
455: if nr==len(ids)-1:
456: return ""
457: else:
458: if selected:
459: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr]+"\" target=\"_top\">next set</a>"
460: else:
461: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr]+"\" target=\"_top\">next set</a>"
462:
463: def prevSets(self,selected=None):
464:
465: """show nextimage"""
466: #return self.getId()
467: ids=self.show_thumbs()
468: colRows=self.getColTimesRow()
469: if ids:
470: if colRows[1]:
471: if self.REQUEST.SESSION.has_key("filename"):
472: filename=self.REQUEST.SESSION["filename"]
473: try:
474: nr=ids.index(filename)-colRows[0]*colRows[1]
475: if nr<0:
476: nr=0
477: except:
478: nr=0
479: else:
480: nr=0
481: try:
482: num=ids.index(filename)
483: except:
484: num=0
485:
486: if num==0:
487: return ""
488: else:
489: if selected:
490: return "<a href=\""+self.REQUEST['URL1']+"/selection?filename="+ids[nr]+"\" target=\"_top\">previous sets</a>"
491: else:
492: return "<a href=\""+self.REQUEST['URL1']+"?filename="+ids[nr]+"\" target=\"_top\">previous sets</a>"
493: else:
494: return ""
495:
496: def show_thumbs_selected_rows(self,numberOfColumns):
497: """Ausgabe anzahl"""
498: ids=self.show_selected_thumbs()
499: self.REQUEST.SESSION['ids']=ids
500: number=int(len(ids)/numberOfColumns)+1
501: self.REQUEST.SESSION['number']=range(number)
502: return range(number+1)
503:
504: def setColTimesRowForm(self):
505: """form for matrix setting"""
506: pt=PageTemplateFile('Products/ImageArchive/selectColTimesRow.zpt').__of__(self)
507: return pt()
508:
509: def setDone(self):
510: """done"""
511:
512: pt=PageTemplateFile('Products/ImageArchive/changedColTimesRow.zpt').__of__(self)
513: return pt()
514:
515: def setColTimesRow(self,cols,rows):
516: """set coltimes row"""
517: RESPONSE=self.REQUEST.RESPONSE
518: if not rows:
519: rows=None
520: if rows=="":
521: rows=None
522:
523: if rows=="all":
524: rows=None
525:
526:
527: if rows:
528: RESPONSE.setCookie("ImageViewerRows",rows)
529: else:
530: RESPONSE.expireCookie("ImageViewerRows")
531: RESPONSE.setCookie("ImageViewerCols",cols)
532:
533: RESPONSE.redirect(self.REQUEST['URL1']+"/setDone")
534:
535: def getColTimesRow(self):
536: """coltimesrow"""
537:
538: REQUEST=self.REQUEST
539: """matrix"""
540: if REQUEST.cookies.has_key("ImageViewerRows"):
541:
542: try:
543: rows=int(REQUEST.cookies["ImageViewerRows"])
544: except:
545: rows=None
546: else:
547: rows=None
548:
549: if REQUEST.cookies.has_key("ImageViewerCols"):
550: #print "COLS",REQUEST.cookies["ImageViewerCols"]
551: cols=int(REQUEST.cookies["ImageViewerCols"])
552: else:
553: cols=3
554:
555: idsnumber=len(self.show_thumbs())
556: if rows:
557: if cols*rows >idsnumber:
558: rows=int(idsnumber/cols)+1
559: return (cols,rows)
560:
561:
562: def show_thumbs_rows(self,numberOfColumns,numberOfRows=None,startId=None):
563: """Ausgabe anzahl"""
564:
565: idsAll=self.show_thumbs()
566:
567: if self.REQUEST.SESSION.has_key("filename"):
568: filename=self.REQUEST.SESSION["filename"]
569: try:
570: startId=filename
571: except:
572: startId=idsAll[0]
573: else:
574: startId=idsAll[0]
575:
576:
577: print "NOR:",numberOfRows
578:
579: if numberOfRows:
580: try:
581: startPic=idsAll.index(startId)
582: endPic=startPic+numberOfColumns*numberOfRows
583: ids=idsAll[startPic:endPic]
584: except:
585: ids=idsAll
586: else:
587: ids=idsAll
588:
589:
590: self.REQUEST.SESSION['ids']=ids
591: number=int(len(ids)/numberOfColumns)+1
592:
593: return range(number+1)
594:
595: def show_thumbs_columns(self,row,numberOfColumns):
596: """Ausgabe einer Liste der Reihe"""
597: ids=self.REQUEST.SESSION['ids']
598: max=len(ids)
599: if (row*numberOfColumns)<max:
600: return ids[(row-1)*numberOfColumns:row*numberOfColumns]
601: else:
602: return ids[(row-1)*numberOfColumns:]
603:
604: def thumblistSelected_old(self):
605: """main template collection"""
606: pt=PageTemplateFile('Products/ImageArchive/thumbselected.zpt').__of__(self)
607: return pt()
608:
609: def thumblistSelected(self):
610: """main template collection"""
611: pt=PageTemplateFile('Products/ImageArchive/thumbselected2.zpt').__of__(self)
612: return pt()
613:
614: def thumblist_old(self):
615: """main template collection"""
616: pt=PageTemplateFile('Products/ImageArchive/thumbs.zpt').__of__(self)
617: return pt()
618:
619: def thumblist(self):
620: """main template collection"""
621: pt=PageTemplateFile('Products/ImageArchive/thumb2.zpt').__of__(self)
622: return pt()
623:
624: def navig_selected_html(self):
625: """navigation"""
626: #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
627: pt=PageTemplateFile('Products/ImageArchive/navigation_selected.zpt').__of__(self)
628: return pt()
629:
630: def navig_html(self):
631: """navigation"""
632: #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
633: pt=PageTemplateFile('Products/ImageArchive/navigation.zpt').__of__(self)
634: return pt()
635:
636:
637: def selection(self):
638: """show only selected"""
639: if self.REQUEST.has_key('filename'):
640: filen=self.REQUEST['filename']
641: else:
642: filen=""
643: self.REQUEST.SESSION['filename']=filen
644: pt=PageTemplateFile('Products/ImageArchive/overview_selected2.zpt').__of__(self)
645: return pt()
646:
647: def index_html(self):
648: """main template collection"""
649: if self.REQUEST.has_key('filename'):
650: filen=self.REQUEST['filename']
651: else:
652: filen=""
653: self.REQUEST.SESSION['filename']=filen
654: pt=PageTemplateFile('Products/ImageArchive/overview.zpt').__of__(self)
655: return pt()
656:
657: def manage_AddImageCollectionForm(self):
658: """Nothing yet"""
659: pt=PageTemplateFile('Products/ImageArchive/AddImageCollectionForm.zpt').__of__(self)
660: return pt()
661:
662: def manage_AddImageCollection(self,id,title,ImageStoragePath,ImageViewerPath,defaultMetaString,RESPONSE=None):
663: """Add ImageCollection"""
664: newObj=ImageCollection(id,title,ImageStoragePath,ImageViewerPath,defaultMetaString)
665: self._setObject(id,newObj)
666:
667: if RESPONSE is not None:
668: RESPONSE.redirect('manage_main')
669:
670:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>