1: """New version of the product started February, 8th. Without scientific classification, use content-type for further classification."""
2: """Echo collection provides the classes for the ECHO content web-site.
3:
4: class ECHO_collection is the basis class for an ECHO collection.
5:
6: class ECHO_resource contains information on ECHO resources (e.g. an Display environment for Metadata
7:
8: class ECHO_externalLink contains information on externalLinks
9:
10:
11: """
12: try:
13: from reportlab.pdfgen import canvas
14: from reportlab.lib.pagesizes import A4
15: except:
16: print "PDF generation will not work"
17:
18:
19: import string
20: import tempfile
21: import re
22: import os
23: import OFS.Image
24: from types import *
25: from OFS.Cache import Cacheable
26: from OFS.Image import Image
27: from Globals import DTMLFile
28: from OFS.Folder import Folder
29: from OFS.SimpleItem import SimpleItem
30: from AccessControl import ClassSecurityInfo
31: from AccessControl.User import UserFolder
32: from Globals import InitializeClass
33: from Globals import DTMLFile
34: import Globals
35: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
36: from Products.PageTemplates.PageTemplate import PageTemplate
37: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
38: from Globals import Persistent, package_home
39: from Acquisition import Implicit
40: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
41:
42: import urllib
43: import cgi
44: import smtplib
45: import time
46: from Ft.Xml.Domlette import NonvalidatingReader
47: from Ft.Xml.Domlette import PrettyPrint, Print
48: from Ft.Xml import EMPTY_NAMESPACE
49:
50: import Ft.Xml.XPath
51: import cStringIO
52: import zLOG
53:
54: try:
55: from psycopg import libpq
56: except:
57: try:
58: from pyPgSQL import libpq
59: except:
60: print "ECHO_collection: Warning - No libpq imported!"
61:
62: import xml.dom.minidom
63:
64: import urllib
65: import xml.dom.minidom
66: import ECHO_helpers
67: from ECHO_helpers import *
68: from ECHO_language import *
69: from ECHO_movie import *
70:
71: #regexp for extracting elements from xml
72: patternTXT=r"<\s*txt.*?>(.*?)</txt>"
73: regexpTXT = re.compile(patternTXT, re.IGNORECASE + re.DOTALL)
74: patternPage=r"<\s*page.*?>(.*?)</page>"
75: regexpPage = re.compile(patternPage, re.IGNORECASE + re.DOTALL)
76:
77:
78:
79: def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs=""):
80:
81: """Allegemeine Informationen zu einer ECHO Collection"""
82:
83: self.label = label
84: self.title=title
85: self.description=description
86: self.contentType=contentType
87: self.responsible=responsible
88: self.credits=toList(credits)
89: self.weight=weight
90:
91: class ECHO_locale(ZopePageTemplate):
92: """localisierung"""
93:
94: meta_type="ECHO_locale"
95:
96: def __init__(self,id,lang,title,label,text=None,content_type=None):
97: self.lang=lang
98: self.title=title
99: self.label=label
100: if text:
101: self.pt_edit(text, content_type)
102: self.id=id
103:
104: manage_options = ZopePageTemplate.manage_options+(
105: {'label':'Main Config','action':'change_ECHO_localeForm'},
106: )
107:
108: def change_ECHO_localeForm(self):
109: """change form"""
110: pt=zptFile(self, 'zpt/ChangeECHO_localeForm.zpt')
111: return pt()
112:
113: def change_ECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
114: """change echo locale"""
115: self.lang=lang
116: self.title=title
117: self.label=label
118: if not text is None:
119: self.pt_edit(text, content_type)
120:
121: if RESPONSE is not None:
122: RESPONSE.redirect('manage_main')
123:
124:
125: def manage_addECHO_localeForm(self):
126: """Form for adding"""
127: pt=zptFile(self, 'zpt/AddECHO_localeForm.zpt')
128: return pt()
129:
130: def manage_addECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
131: """add echo locale"""
132:
133: id="locale_"+lang
134:
135: self._setObject(id, ECHO_locale(id,lang,title,label,text,content_type))
136: if RESPONSE is not None:
137: RESPONSE.redirect('manage_main')
138:
139:
140: class ECHO_copyright(Folder,ECHO_basis):
141: """Copyright informationen"""
142: meta_type="ECHO_copyright"
143:
144:
145:
146: def __init__(self,id,title,copyrights):
147: """init"""
148: self.title=title
149: self.id=id
150: self.copyrights=copyrights[0:]
151:
152: def getCopyrights(self):
153: """return coyprights"""
154: return self.copyrights
155:
156: manage_options = Folder.manage_options+(
157: {'label':'Main Config','action':'ECHO_copyright_configForm'},
158: )
159:
160:
161: def ECHO_copyright_configForm(self):
162: """change form"""
163: pt=zptFile(self, 'zpt/ChangeECHO_copyright')
164: pt.content_type="text/html"
165: return pt()
166:
167: def ECHO_copyright_config(self,title,RESPONSE=None):
168: """change"""
169: self.title=title
170: self.copyrights=[]
171: self.copyrights=getCopyrightsFromForm(self,self.REQUEST.form)[0:]
172:
173: if RESPONSE is not None:
174: RESPONSE.redirect('manage_main')
175:
176:
177: def manage_addECHO_copyrightForm(self):
178: """Form for adding"""
179: pt=zptFile(self, 'zpt/AddECHO_copyright.zpt')
180: return pt()
181:
182: def manage_addECHO_copyright(self, id,title,RESPONSE=None):
183: """add the copyright"""
184:
185: meta_type="ECHO_copyright"
186:
187: #first generate copyrights as list of tripels (mediaType,partner,copyrightType)
188:
189:
190:
191: self._setObject(id, ECHO_copyright(id, title,getCopyrightsFromForm(self,self.REQUEST.form)))
192:
193: if RESPONSE is not None:
194: RESPONSE.redirect('manage_main')
195:
196: class ECHO_layoutTemplate(ZopePageTemplate,ECHO_basis):
197: """Create a layout Template for different purposes"""
198:
199: meta_type="ECHO_layoutTemplate"
200:
201: def __init__(self, id, text=None, content_type=None,EchoType=None):
202: self.id = str(id)
203:
204: self.ZBindings_edit(self._default_bindings)
205: if text is None:
206: self._default_content_fn = os.path.join(package_home(globals()),'zpt','ECHO_%s_template_standard.zpt'%EchoType)
207: text = open(self._default_content_fn).read()
208: self.pt_edit(text, content_type)
209:
210:
211: def manage_addECHO_layoutTemplateForm(self):
212: """Form for adding"""
213: pt=zptFile(self, 'zpt/AddECHO_layoutTemplate.zpt')
214: return pt()
215:
216:
217: def manage_addECHO_layoutTemplate(self, EchoType,title=None,REQUEST=None):
218: "Add a Page Template with optional file content."
219: if type(EchoType)==StringType:
220: EchoTypes=[EchoType]
221: else:
222: EchoTypes=EchoType
223:
224: for singleType in EchoTypes:
225:
226: id = str(singleType)+"_template"
227: if REQUEST is None:
228: self._setObject(id, ECHO_layoutTemplate(id, text,EchoType=singleType))
229: ob = getattr(self, id)
230:
231: if title:
232: ob.pt_setTitle(title)
233: return ob
234: else:
235: file = REQUEST.form.get('file')
236: headers = getattr(file, 'headers', None)
237: if headers is None or not file.filename:
238: zpt = ECHO_layoutTemplate(id,EchoType=singleType)
239: else:
240: zpt = ECHO_layoutTemplate(id, file, headers.get('content_type'))
241:
242: self._setObject(id, zpt)
243: ob = getattr(self, id)
244: if title:
245: ob.pt_setTitle(title)
246:
247: try:
248: u = self.DestinationURL()
249: except AttributeError:
250: u = REQUEST['URL1']
251:
252:
253: REQUEST.RESPONSE.redirect(u+'/manage_main')
254: return ''
255:
256: class ECHO_fullText(ZopePageTemplate,ECHO_basis,ECHO_language):
257: """echo fulltext in xml"""
258:
259: meta_type="ECHO_fullText"
260:
261:
262: def getPage(self,nr='1'):
263: """get page n"""
264: #return self().encode('latin-1','ignore')
265: dom=xml.dom.minidom.parseString(self().encode('utf-8','ignore'))
266: pages=dom.getElementsByTagName('page')
267:
268: return pages[int(nr)-1].toxml()
269:
270: # Product registration and Add support
271: manage_addECHO_fullTextForm = PageTemplateFile(
272: 'zpt/AddECHO_fullText.zpt', globals())
273:
274: def manage_addECHO_fullText(self, id, title=None, text=None,
275: REQUEST=None, submit=None):
276: "Add a Page Template with optional file content."
277:
278: id = str(id)
279: if REQUEST is None:
280: self._setObject(id, ECHO_fullText(id, text))
281: ob = getattr(self, id)
282: if title:
283: ob.pt_setTitle(title)
284: return ob
285: else:
286: file = REQUEST.form.get('file')
287: headers = getattr(file, 'headers', None)
288: if headers is None or not file.filename:
289: zpt = ECHO_fullText(id)
290: else:
291: zpt = ECHO_fullText(id, file, headers.get('content_type'))
292:
293: self._setObject(id, zpt)
294:
295: try:
296: u = self.DestinationURL()
297: except AttributeError:
298: u = REQUEST['URL1']
299:
300: if submit == " Add and Edit ":
301: u = "%s/%s" % (u, urllib.quote(id))
302: REQUEST.RESPONSE.redirect(u+'/manage_main')
303: return ''
304:
305:
306: class ECHO_resource(CatalogAware,Folder,Persistent,ECHO_basis):
307: """ECHO Ressource"""
308: security=ClassSecurityInfo()
309: meta_type='ECHO_resource'
310: default_catalog='resourceCatalog'
311:
312: # viewClassificationList=viewClassificationListMaster
313:
314: def PrincipiaSearchSource(self):
315: """Return cataloguable key for ourselves."""
316: return str(self)
317:
318: getSubCols = ECHO_helpers.getSubCols
319:
320: def reindex(self):
321: """generate fields for indexing and reindex"""
322: import urlparse
323: #TODO: korrigieren des metalink pfades konfigurierbar machen
324: splitted= [x for x in urlparse.urlparse(self.metalink)]
325: splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]
326:
327: if splitted[0]=="http":
328: self.metalink=urlparse.urlunparse(splitted)
329:
330:
331: self.fullTextUrl=self.getFullTextXML(noredirect="yes")
332:
333: #TODO: korrigieren relative url to absoluter url volltexten, konfigurierbar?
334: splitted= [x for x in urlparse.urlparse(self.fullTextUrl)]
335: if splitted[0]=="":
336: splitted[0]="http"
337: splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]
338:
339: self.fullTextUrl=urlparse.urlunparse(splitted)
340:
341: self.imagePath=self.getImagePath()
342:
343: self.reindex_object()
344:
345:
346: security.declareProtected('View','createPDF')
347: def createPDF(self,RESPONSE=None,local=None,dpi=150):
348: """erzeuge pdf file"""
349: pages=1
350: dpi=float(dpi)
351: imagePath=self.getImagePath().replace("/mpiwg/online","")
352:
353:
354: image="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler?fn="+imagePath+"&dw=%i&dh=%i&pn=%i"
355: xmlInfo="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/dlInfo-xml.jsp?fn="+imagePath
356:
357: dom=xml.dom.minidom.parse(urllib.urlopen(xmlInfo))
358: for parameter in dom.getElementsByTagName('parameter'):
359: if parameter.getAttribute('name')=="pt":
360: pages=int(parameter.getAttribute('value'))
361: break
362:
363:
364: tempdir="/tmp/archivesImageServer"
365: if not os.path.exists(tempdir):
366: os.mkdir(tempdir)
367:
368: tmpPath=tempfile.mkdtemp(dir=tempdir)
369:
370:
371: tmpZip=tempfile.mktemp(dir=tempdir)
372:
373: tmpFn=os.path.split(tmpZip)[1]
374:
375:
376:
377:
378: if RESPONSE:
379: RESPONSE.setHeader("Content-Type","text/html")
380: RESPONSE.write("<h1>I am creating the pdf</h1>")
381: txt="<h3>1. step: getting the images( %i pages)</h3>"%pages
382: RESPONSE.write(txt)
383:
384: c=canvas.Canvas(tmpZip)
385: for i in range(1,pages+1):
386: if RESPONSE:
387: RESPONSE.write(str("<p>Get Page: %i<br>\n"%i))
388: faktor=dpi/72.0
389:
390: fn=tmpPath+"/%i"%i
391:
392: width,height=A4
393: #print image%(width*faktor,height*faktor,i)
394: url=urllib.urlopen(image%(width*faktor,height*faktor,i)).read()
395: fh=file(fn,"w")
396: fh.write(url)
397: fh.close()
398:
399:
400:
401: c.drawImage(fn,0,0,width=width,height=height)
402: c.showPage()
403: c.save()
404: if RESPONSE:
405: RESPONSE.write("<p>finished<br>\n")
406:
407: if RESPONSE:
408: len=os.stat(tmpZip)[6]
409: downloadUrl=self.absolute_url()+"/downloadPDF"
410: RESPONSE.write("""<h1><a href="downloadPDF?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len))
411: RESPONSE.write("""<p>The file will be stored for a while, you can download it later, the URL is:</p>
412: <p><a href="downloadPDF?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn))
413: RESPONSE.close()
414:
415:
416: def downloadPDF(self,fn):
417: """download prepared set"""
418: filename="/tmp/archivesImageServer/"+fn
419: namePDF=self.getId()+".pdf"
420: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%namePDF)
421: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
422: len=os.stat(filename)[6]
423: self.REQUEST.RESPONSE.setHeader("Content-Length",len)
424: images=file(filename).read()
425: self.REQUEST.RESPONSE.write(images)
426: self.REQUEST.RESPONSE.close()
427:
428:
429: def getRDF(self,urn=None):
430: """rdf"""
431: ret=getRDFDescription(self,self.link,urn=urn)
432: return ret+self.createSubElementRDF(urn=urn)
433:
434:
435: def getAccessRightSelectorHTML(self,outlook="select"):
436: """htmlselector"""
437: values=['free','mpiwg']
438:
439: if outlook=="select":
440: ret="""<select name="%s">"""%self.getId()
441:
442: for value in values:
443: if value==self.getAccessRightMD():
444: ret+="<option selected>%s</option>"%value
445: else:
446: ret+="<option>%s</option>"%value
447: return ret+"</select>"
448:
449: else:
450: ret=""
451: for value in values:
452:
453: if value==self.getAccessRightMD():
454: ret+="""<input type="radio" name="%s" value="%s" checked>%s"""%(self.getId(),value,value)
455: else:
456: ret+="""<input type="radio" name="%s" value="%s">%s"""%(self.getId(),value,value)
457: return ret
458:
459:
460:
461: def getAccessRightMD(self):
462: """set accessright"""
463: url=self.metalink
464:
465: try:
466: geturl=""
467: for line in ECHO_helpers.urlopen(url).readlines():
468: geturl=geturl+line
469:
470:
471: except:
472: return (None,"Cannot open: "+url)
473:
474: try:
475: dom=xml.dom.minidom.parseString(geturl)
476: root=dom.getElementsByTagName('resource')[0]
477: except:
478: return (None,"Cannot parse: "+url+"<br>"+geturl)
479:
480: internal=dom.getElementsByTagName('internal')
481: if internal:
482: institution=dom.getElementsByTagName('institution')
483: return getText(institution[0].childNodes)
484:
485: free=dom.getElementsByTagName('free')
486: if free:
487: return "free"
488:
489: return "free" #default free
490:
491: def changeAccessRightMD(self,accessright,RESPONSE=None):
492: """change the rights"""
493:
494: params="accessright=%s"%accessright
495:
496:
497: #print ECHO_helpers.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read()
498:
499:
500: ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/setAccessRightXML'+urllib.quote('?'+params))).read()
501:
502:
503: if RESPONSE is not None:
504: RESPONSE.redirect('manage_main')
505:
506:
507: def setAccessRightXML(self,accessright):
508: """set accessright"""
509: url=self.metalink
510:
511: try:
512: geturl=""
513: for line in ECHO_helpers.urlopen(url).readlines():
514: geturl=geturl+line
515:
516:
517: except:
518: return (None,"Cannot open: "+url)
519:
520: try:
521: dom=xml.dom.minidom.parseString(geturl)
522: root=dom.getElementsByTagName('resource')[0]
523: except:
524: return (None,"Cannot parse: "+url+"<br>"+geturl)
525:
526: metanodes=dom.getElementsByTagName('access-conditions')
527:
528: if not metanodes:
529: nodenew=dom.createElement('access-conditions')
530: root.appendChild(nodenew)
531: metanode=nodenew
532: else:
533: metanode=metanodes[0]
534:
535: accesses=metanode.getElementsByTagName('access')
536:
537: if not accesses:
538: nodenew2=dom.createElement('access')
539: metanode.appendChild(nodenew2)
540: metanode2=nodenew2
541: else:
542: metanode2=accesses[0]
543:
544: internal=metanode.getElementsByTagName('internal')
545:
546: if internal:
547: metanode2.removeChild(internal[0]).unlink()
548:
549: free=metanode.getElementsByTagName('free')
550:
551: if free:
552: metanode2.removeChild(internal[0]).unlink()
553:
554:
555: if accessright=='free':
556: nodenew3=dom.createElement('free')
557: metanode2.appendChild(nodenew3)
558: elif accessright=='mpiwg':
559: nodenew3=dom.createElement('internal')
560: nodenew4=dom.createElement('institution')
561: metanodetext=dom.createTextNode('mpiwg')
562: nodenew4.appendChild(metanodetext)
563: nodenew3.appendChild(nodenew4)
564: metanode2.appendChild(nodenew3)
565:
566: return dom.toxml().encode('utf-8')
567:
568: def setStartPageForm(self):
569: """Form for changing the startpage"""
570:
571:
572: pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPage.zpt')
573: pt.content_type="text/html"
574: return pt()
575:
576:
577: def createImageUrl(self,pn=1):
578: """create ImageUrl"""
579:
580:
581: resourcepath=readFieldFromXML(self.metalink,'resource','archive-path')
582:
583: digiliburlprefix=readFieldFromXML(self.metalink,'texttool','digiliburlprefix')
584: images=readFieldFromXML(self.metalink,'texttool','image')
585:
586:
587: if (not resourcepath) or (not digiliburlprefix) or (not images):
588: zLOG.LOG("ECHO (createImageUrl)",zLOG.ERROR,"Cannot create ImageUrl for %s"%self.absolute_url())
589: return None
590: resourcepath=resourcepath.replace('/mpiwg/online','')
591: if not digiliburlprefix: digiliburlprefix="http://echo.mpiwg-berlin.mpg.de/zogilib?"
592:
593: if (not images) or (not resourcepath): return None
594:
595: return "%sfn=%s&pn=%i"%(digiliburlprefix,resourcepath+"/"+images,pn)
596:
597: def copyTitleToInfoXML(self,RESPONSE=None):
598: """copy title from the resource"""
599: presentationXML=readFieldFromXML(self.metalink,'texttool','presentation')
600: resourcepath=readFieldFromXML(self.metalink,'resource','archive-path')
601: if (not presentationXML) or (not resourcepath):
602: if RESPONSE:
603: RESPONSE.write("Error: %s\n"%self.getId())
604: else:
605: return None,self.absolute_url()
606:
607: try:
608: fh=file(os.path.join(resourcepath,presentationXML),'w')
609: fh.write("""<info>
610: <author></author>
611: <title>%s</title>
612: <date></date>
613: <display>yes</display>
614: </info>"""%self.title)
615: fh.close()
616: return 1,self.getId()
617: except:
618: if RESPONSE:
619: RESPONSE.write("Error: %s\n"%self.getId())
620: else:
621: return None,self.absolute_url()
622:
623:
624: def setStartPage(self,startpage=None,RESPONSE=None):
625: """set start page, if no startpage defined use the generic one of the resource"""
626:
627: if (not (type(startpage)==StringType)):
628: if ("__generic" in startpage): # checke ob generic in der liste
629: startpage=self.absolute_url()+"/startpage_html"
630: elif ("__firstPage" in startpage): # checke ob generic in der liste
631: startpage=self.createImageUrl()
632:
633: if (not startpage):
634: startpage=self.absolute_url()+"/startpage_html"
635: elif (startpage=="__generic"):
636: startpage=self.absolute_url()+"/startpage_html"
637: elif (startpage=="__firstPage"):
638: startpage=self.createImageUrl()
639:
640: params="startpage=%s"%startpage
641: #print 'http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))
642:
643: ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))).read()
644:
645:
646: path=self.metalink
647:
648: path=re.sub(self.REQUEST['SERVER_URL'],'',path)
649: path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path)
650:
651: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
652: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server
653: path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server
654: path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server
655: path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server
656: path=re.sub('http://vision.mpiwg-berlin.mpg.de','',path) # falls vision als server
657: path=re.sub('http://xserve02.mpiwg-berlin.mpg.de:18880','',path) # falls vision als server
658: path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo
659: path=re.sub('/index.meta','',path)
660:
661:
662: ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
663:
664: if RESPONSE is not None:
665: RESPONSE.redirect('manage_main')
666:
667: def changeViewerTemplateSetForm(self):
668: """change the viewer template set"""
669: pt=zptFile(self, 'zpt/changeResourceViewerTemplateSet')
670: return pt()
671:
672:
673:
674: def getTextToolsField(self,name,default=''):
675: """Lese Textoolsfelder aus index.meta im path aus"""
676:
677: try:
678: dom=xml.dom.minidom.parse(self.metalink)
679: node=dom.getElementsByTagName('texttool')[0] #getNode
680: subnode=node.getElementsByTagName(name)[0]
681:
682: # bei text wird nur der Folder gebraucht
683: if name=="text":
684: splitted=getText(subnode.childNodes).split("/")
685: return splitted[len(splitted)-2]
686: else:
687: return getText(subnode.childNodes)
688: except:
689: return default
690:
691:
692: def changeViewerTemplateSet(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None):
693: """changeit"""
694:
695: paramList=['project','startpage','xslt','thumbtemplate','topbar','digiLibTemplate','digiliburlprefix']
696:
697:
698: #writeMetadata(self.metalink,self.metaDataHash,project,None,xslt,thumbtemplate,topbar,digiLibTemplate)
699:
700: params="project=%s&xslt=%s&thumbtemplate=%s&topbar=%s&digiLibTemplate=%s&digiliburlprefix=%s"%(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix)
701:
702:
703: ECHO_helpers.urlopen('http://echo.mpiwg-berlin.mpg.de/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))).read()
704:
705: #print self.absolute_url()+'/newMetaXML'+urllib.quote'?'+params)
706: # hack Pfad auf die Dokumente
707: path=self.metalink
708:
709:
710:
711: path=re.sub('/index.meta','',path)
712:
713: path=re.sub(self.REQUEST['SERVER_URL'],'',path)
714: path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path)
715:
716: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
717: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
718: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server
719:
720: path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server
721: path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server
722: path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server
723: path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo
724:
725: path=re.sub('http://vision.rz-berlin.mpg.de','',path) # falls vision als server
726:
727: return ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
728:
729:
730: if RESPONSE is not None:
731: RESPONSE.redirect('manage_main')
732:
733:
734:
735: security.declarePublic('content_html')
736: def content_html(self):
737: """template fuer content"""
738: return ECHO_basis.content_html(self,'resource')
739:
740: # def getViewClassification(self):
741: # if hasattr(self,'viewClassification'):
742: # return self.viewClassification
743: # else:
744: # return ""
745:
746: def getFullTextXML(self,noredirect=None):
747: """getFullTextXML; gives the FullText as an XML Document, and <error></error> if somthing goes wrong."""
748:
749: try:
750: #zLOG.LOG("ECHO Fulltext",zLOG.INFO,"open %s"%self.metalink)
751: fh=ECHO_helpers.urlopen(self.metalink)
752: #zLOG.LOG("ECHO Fulltext",zLOG.INFO,"opened %s"%self.metalink)
753: dom=xml.dom.minidom.parse(fh)
754: texttools=dom.getElementsByTagName('texttool')
755: text=texttools[0].getElementsByTagName('text')
756: texturl=getText(text[0].childNodes)
757:
758: #zLOG.LOG("ECHO Fulltext",zLOG.INFO,"found %s"%texturl)
759: fh.close()
760: #zLOG.LOG("ECHO Fulltext",zLOG.INFO,"closed fh")
761: #keine url
762: if not (texturl.split(":")[0] in ['http','ftp','file']):
763: if not noredirect:
764: return file(texturl).read()
765: else:
766: return texturl
767:
768: if not noredirect:
769: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
770: zLOG.LOG("ECHO Fulltext",zLOG.INFO,"redirect to:%s"%texturl)
771: self.REQUEST.RESPONSE.redirect(texturl)
772: else:
773: return texturl
774: except:
775:
776: if not noredirect:
777: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
778: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
779: else:
780: return "<error>no fulltext available</error>"
781:
782: def getImagePath(self):
783: """gibt pfad zum image aus"""
784: return self.getImageView(noredirect="yes",onlyPath="yes")
785:
786: def getImageView(self,noredirect=None,onlyPath=None):
787: """getImages; give Imageviewr and <error></error> if somthing goes wrong."""
788: try:
789: fh=ECHO_helpers.urlopen(self.metalink)
790: dom=xml.dom.minidom.parse(fh)
791: texttools=dom.getElementsByTagName('texttool')
792: text=texttools[0].getElementsByTagName('image')
793: imagetemp=getText(text[0].childNodes)
794:
795: text=dom.getElementsByTagName('archive-path')
796: archivepath=getText(text[0].childNodes)
797: archivepath=re.sub('/mpiwg/online/','',archivepath)
798: imageurl="http://echo.mpiwg-berlin.mpg.de/zogilib?fn="+archivepath+"/"+imagetemp
799: fh.close()
800:
801: if not noredirect:
802: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
803: self.REQUEST.RESPONSE.redirect(imageurl)
804: else:
805: if not onlyPath:
806: return imageurl
807: else:
808: return archivepath+"/"+imagetemp
809: except:
810:
811: if not noredirect:
812: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
813: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
814: else:
815: return "<error>no images available</error>"
816:
817:
818: def getCopyrightsHTML(self):
819: """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus"""
820:
821: if hasattr(self,'copyrightModel'):
822: obj=self.copyrightModel
823:
824: else:
825: return "ERROR"
826: ret=[]
827:
828: for copyright in obj.getCopyrights(): #copyright - media / partner / copyrightID
829:
830:
831: try:
832: if hasattr(self.copyrightTypes,copyright[2]):
833: copyrightTypeObj=getattr(self.copyrightTypes,copyright[2])
834: link="copyrightTypes/"+copyright[2]+'/copyright.html'
835: else:
836: copyrightTypeObj=getattr(obj,copyright[2])
837: link="copyrightModel/"+copyright[2]+'/copyright.html'
838:
839: label=copyrightTypeObj.label
840: url=getattr(copyrightTypeObj, 'url', '')
841:
842: if url!='':
843: ret.append((url,copyright[0],copyright[1],copyright[2],label))
844: else:
845: if hasattr(copyrightTypeObj, 'copyright.html'):
846: ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label))
847: else:
848: ret.append(('empty',copyright[0],copyright[1],copyright[2],label))
849: except:
850: """nothing"""
851:
852: return ret
853:
854: def getInstitutionsHTML(self):
855: """gibt Liste der foerdernden Institutionen aus"""
856:
857: if hasattr(self,'support'):
858: obj=self.support
859: ret=obj.getSupporter()
860: return ret
861: else:
862: return ''
863:
864:
865: def getCredits(self):
866: """Ausgabe der credits"""
867: if self.credits:
868: return self.credits
869: else:
870: return []
871:
872:
873:
874: def __init__(self,id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords):
875:
876: self.id = id
877: """Festlegen der ID"""
878:
879: self.label = label
880: self.link= link
881: self.metalink=metalink
882: self.title=title
883: self.weight=weight
884: self.credits=toList(credits)
885: self.description=description
886: self.contentType=contentType
887: self.copyrightType=copyrightType
888: self.renderingType=renderingType
889: self.responsible=responsible
890: self.resourceID=resourceID
891:
892: if coords:
893: coordsnew=[ string.split(x,",") for x in coords]
894: else:
895: coordsnew=[]
896:
897: self.coords=coordsnew
898: # self.viewClassification=""
899:
900:
901:
902: def getContentType(self):
903: try:
904: return self.contentType
905: except:
906: return ""
907:
908: def getCopyrightType(self):
909: try:
910: return self.copyrightType
911: except:
912: return ""
913:
914: def getRenderingType(self):
915: try:
916: return self.renderingType
917: except:
918: return ""
919:
920: def ECHO_resource_config(self):
921: """Main configuration"""
922:
923: if not hasattr(self,'weight'):
924: self.weight=""
925:
926: pt=zptFile(self, 'zpt/ChangeECHO_resource.zpt')
927: return pt()
928:
929:
930: def ECHO_resource_config_main(self):
931: """Main configuration"""
932: if not hasattr(self,'weight'):
933: self.weight=""
934: pt=zptFile(self, 'zpt/ChangeECHO_resource_main.zpt')
935: return pt()
936:
937: def ECHO_resource_config_coords(self):
938: """Coords configuration """
939: pt=zptFile(self, 'zpt/ChangeECHO_resource_coords.zpt')
940: return pt()
941:
942: def ECHO_resource_config_credits(self):
943: """Main configuration"""
944: pt=zptFile(self, 'zpt/ChangeECHO_resource_credits.zpt')
945: return pt()
946:
947: def ECHO_resource_config_metadata(self):
948: """Main configuration"""
949: if (hasattr(self,'metadata')) and not (hasattr(self,'metaDataHash')):
950: self.metaDataHash={}
951: self.contentType=self.bib_type
952: for data in self.metadata:
953: data_neu=re.sub('-','_',data)
954: self.meta
955: DataHash[data_neu]=getattr(self,data)[0:]
956:
957:
958: pt=zptFile(self, 'zpt/ChangeECHO_resource_metadata.zpt')
959: return pt()
960:
961:
962:
963:
964: def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,RESPONSE=None):
965: """Aenderung der Properties"""
966: self.resourceID=resourceID
967: self.title=title
968: self.label=label
969: self.description=description
970:
971: self.contentType=contentType
972: self.renderingType=renderingType
973: self.weight=weight
974:
975: self.link=link
976: self.metalink=metalink
977:
978: if RESPONSE is not None:
979: RESPONSE.redirect('manage_main')
980:
981:
982: def changeECHO_resource_coords(self,RESPONSE=None):
983: """Aenderung der Properties - coords"""
984: #return self.REQUEST
985: for area in self.getMapAreas():
986: id = area.getId()
987: if self.REQUEST.has_key('del.'+id):
988: # delete this area
989: self._delObject(id)
990: # return to same menu
991: if RESPONSE is not None:
992: RESPONSE.redirect('ECHO_resource_config_coords')
993: return
994: # modify this area
995: coordstring = self.REQUEST.get('coords.'+id, '')
996: coords = string.split(coordstring, ',')
997: angle = self.REQUEST.get('angle.'+id, '0')
998: type = self.REQUEST.get('type.'+id, 'area')
999: if len(coords) == 4:
1000: area.setCoordString(coordstring)
1001: area.setAngle(angle)
1002: area.setType(type)
1003: # return to main menu
1004: if RESPONSE is not None:
1005: RESPONSE.redirect('manage_main')
1006:
1007:
1008: def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None):
1009: """Aenderung der Properties"""
1010: self.credits=credits
1011: self.responsible=responsible
1012: self.copyrightType=copyrightType
1013:
1014: if RESPONSE is not None:
1015: RESPONSE.redirect('manage_main')
1016:
1017:
1018: def changeECHO_resource_metadata_local(self,RESPONSE=None):
1019: """change metadata"""
1020: tags=self.findTagsFromMapping(self.contentType)
1021: for field in tags[1]:
1022: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)][0:]
1023:
1024:
1025:
1026: if RESPONSE is not None:
1027: RESPONSE.redirect('manage_main')
1028:
1029: def changeECHO_resource_metadata(self,RESPONSE=None):
1030: """change metadata"""
1031: tags=self.findTagsFromMapping(self.contentType)
1032: self.OSAS_meta={}
1033: for field in tags[1]:
1034: try:
1035: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]
1036: self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)]
1037: except:
1038: """nothing"""
1039:
1040: ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML')).read()
1041:
1042:
1043: if RESPONSE is not None:
1044: RESPONSE.redirect('manage_main')
1045:
1046:
1047: def getMDValue(self,fieldName,empty=None):
1048: if not empty:
1049: return self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%self.contentType)
1050:
1051: else:
1052: return self.metaDataHash.get(fieldName,empty)
1053:
1054: def newMetaXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,digiliburlprefix=None):
1055: """new index.meta"""
1056: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1057:
1058: if not hasattr(self,'metaDataHash'):
1059:
1060: self.copyIndex_meta2echo_resource()
1061: try:
1062: return writeMetadata(self.metalink,self.OSAS_meta,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)
1063: except:
1064: return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)
1065:
1066: def showMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
1067: """return bibliographical metadata as stored in the object"""
1068:
1069: try:
1070:
1071: return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,xmlfrag="yes")
1072: except:
1073: return "<error> no metadata stored</error>"
1074:
1075: def getXQueryMetaData(self,xquery):
1076: '''
1077: execute an xquery on the metadata and returns a list of tuples,
1078: each tuple represent the content of the node as text and the whole node as xml-fragment
1079: @param xquery: xquery auf den metadaten
1080: '''
1081:
1082: try:
1083: md=writeMetadata(self.metalink,self.metaDataHash,xmlfrag="yes")
1084: except:
1085: return None
1086:
1087: dom = NonvalidatingReader.parseString(md,"http://www.mpiwg-berlin.mpg.de/")
1088:
1089: results=Ft.Xml.XPath.Evaluate(xquery, contextNode=dom)
1090:
1091: ret=[]
1092: for result in results:
1093:
1094: buf = cStringIO.StringIO()
1095: PrettyPrint(result, stream=buf)
1096: str = buf.getvalue()[0:]
1097: buf.close()
1098: ret.append((getTextFromNode(result),str))
1099:
1100: return ret
1101:
1102: def getMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
1103: """prints out metadata as stored in the echo environment, format is the index.meta format"""
1104: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1105: return writeMetadata(self.metalink,self.metaDataHash)
1106:
1107: def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None):
1108: """Aenderung der Properties"""
1109:
1110: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
1111: self.link=link
1112: self.metalink=metalink
1113:
1114: if RESPONSE is not None:
1115: RESPONSE.redirect('manage_main')
1116:
1117:
1118: manage_options = Folder.manage_options+(
1119: {'label':'Main Config','action':'ECHO_resource_config_main'},
1120: {'label':'Change Metadata','action':'ECHO_resource_config_metadata'},
1121: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
1122: {'label':'Sync Metadata','action':'ECHO_getResourceMD'},
1123: {'label':'Change TemplateSets and Image Viewer','action':'changeViewerTemplateSetForm'},
1124: {'label':'set/change startpage','action':'setStartPageForm'},
1125: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
1126: )
1127:
1128:
1129: def isDefinedInThisSet(self,fields,field):
1130: """checks if field is defined in fields"""
1131: if (fields[0].has_key(field)) and not (fields[0][field]==""):
1132: return 1
1133: else:
1134:
1135: return 0
1136:
1137: def getFieldLabel(self,fields,field):
1138: """get labels"""
1139: try:
1140: ret =fields[0][field]
1141: if ret == "":
1142: return field
1143: else:
1144: return ret
1145: except:
1146: return field
1147:
1148:
1149:
1150: def getFieldTag(self,fields,field):
1151: """get labels"""
1152: try:
1153: ret =fields[0][field]
1154: if ret == "":
1155: return field
1156: else:
1157: return ret
1158: except:
1159: return field
1160:
1161:
1162:
1163: def getFieldValue(self,field):
1164: """get value"""
1165:
1166: try:
1167:
1168: ret=self.metaDataHash[field]
1169: if ret == "":
1170: return None
1171: else:
1172:
1173: return ret
1174: except:
1175: return None
1176:
1177: def getMetaDataHash(self):
1178: """md hash"""
1179: return self.metaDataHash
1180:
1181: def setFieldValue(self,field,value):
1182: """get value"""
1183:
1184: if not hasattr(self,'metaDataHash'):
1185: setattr(self,'metaDataHash',{})
1186: self.metaDataHash[field]=value[0:]
1187:
1188:
1189: def copySearchFields(self):
1190: """copys metadatafields to the object"""
1191: fields=['author','title','year']
1192: for field in fields:
1193: setattr(self,'MD_'+field,self.getFieldValue(field))
1194:
1195:
1196: def findLabelsFromMapping(self,referenceType):
1197: """gib hash mit label -> generic zurueck"""
1198: #return {},[]
1199:
1200: temp=self.ZopeFind(self.standardMD)
1201:
1202: if referenceType=="":
1203: referenceType="book"
1204:
1205:
1206: bibdata={}
1207: retdata={}
1208: fields=[]
1209: fieldlist=self.standardMD.fieldList
1210:
1211: tags=self.findTagsFromMapping(self.contentType)
1212: self.referencetypes=tags[2]
1213: for referenceTypeF in self.referencetypes:
1214:
1215: if referenceTypeF[1].title.lower() == referenceType.lower():
1216:
1217: try:
1218: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
1219: referenceType=referenceTypeF[1].title
1220: except:
1221: bibdata[referenceType]=referenceTypeF[1].fields
1222:
1223:
1224: bibdata['data']=referenceTypeF[1]
1225: fields=bibdata[referenceType]
1226: for field in fieldlist:
1227: retdata[field]=referenceTypeF[1].getValue(field)[1]
1228:
1229: return retdata,fieldlist,temp,fields
1230:
1231: def findTagsFromMapping(self,referenceType):
1232: """gib hash mit label -> generic zurueck"""
1233:
1234:
1235: if referenceType=="":
1236: referenceType="book"
1237:
1238: temp = self.ZopeFind(self.standardMD)[0:]
1239:
1240:
1241: #self.referencetypes=temp[0:]
1242:
1243:
1244:
1245:
1246:
1247:
1248: bibdata={}
1249: retdata={}
1250: fieldlist=self.standardMD.fieldList
1251: fields=[]
1252: for referenceTypeF in temp:
1253: #print referenceType
1254:
1255: if referenceTypeF[1].title.lower() == referenceType.lower():
1256: try:
1257: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
1258: referenceType=referenceTypeF[1].title
1259: except:
1260: bibdata[referenceType]=referenceTypeF[1].fields
1261: bibdata['data']=referenceTypeF[1]
1262: fields=bibdata[referenceType]
1263: for field in fieldlist:
1264: retdata[field]=referenceTypeF[1].getValue(field)[0]
1265:
1266: return retdata,fieldlist,temp,fields
1267:
1268:
1269: security.declarePublic('copyIndex_meta2echo_resource') # has to be change, presentlyset because of OSAS koordination
1270: def copyIndex_meta2echo_resource(self,RESPONSE=None):
1271: """copy MD von Index_meta to the echo_resource"""
1272:
1273: (metadict, error)=readMetadata(self.metalink)
1274:
1275:
1276:
1277: self.metaDataHash={}
1278: if not error=="": #Fehler beim Auslesen des Metafiles
1279:
1280: return "ERROR:",error,self.absolute_url()
1281:
1282: self.contentType=metadict['bib_type'][0:]
1283: fields=self.findTagsFromMapping(self.contentType)
1284:
1285: #fields=self.findLabelsFromMapping(self.contentType)
1286: for field in fields[1]:
1287:
1288: if self.isDefinedInThisSet(fields,field):
1289: #print urllib.unquote(metadict.get(self.getFieldTag(fields,field),''))
1290: self.setFieldValue(self.getFieldTag(fields,field),metadict.get(self.getFieldTag(fields,field),''))
1291:
1292:
1293:
1294: if RESPONSE:
1295: return RESPONSE.redirect('manage_main')
1296:
1297: def ECHO_getResourceMD(self,template="yes",back=None):
1298: """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""
1299: (metadict, error)=readMetadata(self.metalink)
1300:
1301: if back:
1302: self.REQUEST.SESSION['back']=back
1303:
1304: if not error=="": #Fehler beim Auslesen des Metafiles
1305: return "ERROR:",error
1306:
1307: if not self.contentType:
1308: self.contentType=metadict['bib_type'].lower()
1309:
1310: if not (metadict['bib_type'].lower()==self.contentType.lower()):
1311: self.REQUEST.SESSION['contentStorage']=metadict['bib_type']
1312: self.REQUEST.SESSION['contentZope']=self.contentType
1313:
1314: return zptFile(self, 'zpt/ECHO_getResourceMDErrorContentType.zpt')()
1315:
1316: self.REQUEST.SESSION['metadict']=metadict
1317:
1318:
1319:
1320: self.REQUEST.SESSION['diffs']=checkDiffs(self,self.REQUEST.SESSION['metadict'])
1321:
1322:
1323:
1324: if template=="yes":
1325: pt=zptFile(self, 'zpt/ECHO_resourceMD.zpt')
1326: return pt()
1327:
1328:
1329:
1330:
1331:
1332: def ECHO_getMD(self,item):
1333: """Ausgabe der MD"""
1334: return getattr(self,item)
1335:
1336: def checkRDF(self,path):
1337: """check if pdf in the path"""
1338: try:
1339: for fileName in os.listdir(path):
1340: if os.path.splitext(fileName)[1]==".pdf":
1341: return os.path.join(path,fileName)
1342: return None
1343: except:
1344: return None
1345:
1346:
1347: security.declareProtected('View','index_html')
1348: def index_html(self):
1349: """standard page"""
1350: pdf=self.checkRDF(self.link)
1351: if pdf:
1352: fh=file(pdf,'r').read()
1353: self.REQUEST.RESPONSE.setHeader('Content-Type','application/pdf')
1354: self.REQUEST.RESPONSE.write(fh)
1355: self.REQUEST.RESPONSE.close()
1356: return
1357: return self.REQUEST.RESPONSE.redirect(self.link)
1358:
1359: def startpage_html(self):
1360: """prints out a startpage for a resource for use e.g. in the BVE"""
1361:
1362: # suche ob startpage.html in dem Ordner vorhanden ist, dann wir diese angezeigt
1363:
1364: sp=self.ZopeFind(self,obj_ids=['startpage.html'])
1365:
1366: if sp:
1367: return sp[1]()
1368:
1369: #pruefen ob irgendwo ein template
1370: if hasattr(self,'startpage_index_template'):
1371: return self.startpage_index_template()
1372:
1373: #generisches template ausgeben
1374:
1375: pt=zptFile(self, 'zpt/ECHO_startpage_index_template_standard.zpt')
1376: pt.content_type="text/html"
1377: return pt()
1378:
1379: def toc_html(self):
1380:
1381: sp=self.ZopeFind(self,obj_ids=['toc.html'])
1382:
1383: if sp:
1384: return sp[0][1]()
1385:
1386:
1387: security.declarePublic('generate_label') # has to be change, presentlyset because of OSAS koordination
1388:
1389: def generate_label(self):
1390: """Erzeugt_standard_Label aus Template"""
1391: pt=getattr(self,"label_template_"+self.contentType.lower())
1392:
1393: self.label=pt()[0:]
1394: return pt()
1395:
1396: security.declarePublic('generate_title') # has to be change, presentlyset because of OSAS koordination
1397:
1398: def generate_title(self,RESPONSE=None):
1399: """Erzeugt_standard_Label aus Template"""
1400: pt=getattr(self,"label_template_"+self.contentType.lower())
1401:
1402: self.title=pt()[0:]
1403:
1404: return pt()
1405:
1406: Globals.InitializeClass(ECHO_resource)
1407:
1408: def manage_addECHO_resourceForm(self):
1409: """Form for adding a ressource"""
1410: pt=zptFile(self, 'zpt/AddECHO_resourceForm.zpt')
1411: return pt()
1412:
1413:
1414:
1415: def manage_addECHO_resource(self,id,title,label,description="",responsible="",link="",metalink="",weight="",copyrightType=None,resourceID=None,contentType=None,renderingType=None,credits=None,coords=None,RESPONSE=None):
1416: """addresource"""
1417:
1418: newObj=ECHO_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords)
1419:
1420: self._setObject(id,newObj)
1421:
1422: if RESPONSE is not None:
1423: RESPONSE.redirect('manage_main')
1424:
1425:
1426: class ECHO_externalLink(Folder,ECHO_basis):
1427: """Link zu einer externen Ressource"""
1428: security=ClassSecurityInfo()
1429: meta_type='ECHO_externalLink'
1430:
1431: security.declarePublic('content_html')
1432: def content_html(self):
1433: """template fuer content"""
1434: return ECHO_basis.content_html(self,'externalLink')
1435:
1436: def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords):
1437:
1438: self.id = id
1439: """Festlegen der ID"""
1440:
1441: self.credits=toList(credits)
1442: self.label = label
1443: self.link= link
1444: self.title=title
1445: self.weight=weight
1446: self.description=description
1447: self.contentType=contentType
1448: self.responsible=responsible
1449: coordsnew=[ string.split(x,",") for x in coords]
1450: self.coords=coordsnew
1451:
1452: def ECHO_externalLink_config(self):
1453: """Main configuration"""
1454:
1455: if not hasattr(self,'weight'):
1456: self.weight=""
1457: if not hasattr(self,'coords'):
1458:
1459: self.coords=['']
1460:
1461:
1462: pt=zptFile(self, 'zpt/ChangeECHO_externalLink.zpt')
1463: return pt()
1464:
1465:
1466: def changeECHO_externalLink(self,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None):
1467: """Aenderung der Properties"""
1468: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
1469:
1470: self.link=link
1471: if RESPONSE is not None:
1472: RESPONSE.redirect('manage_main')
1473:
1474:
1475: manage_options = Folder.manage_options+(
1476: {'label':'Main Config','action':'ECHO_externalLink_config'},
1477: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
1478: )
1479:
1480:
1481: def index_html(self):
1482: """standard page"""
1483:
1484: return self.REQUEST.RESPONSE.redirect(self.link)
1485:
1486: def manage_addECHO_externalLinkForm(self):
1487: """Form for external Links"""
1488: pt=zptFile(self, 'zpt/AddECHO_externalLinkForm.zpt')
1489: return pt()
1490:
1491:
1492: def manage_addECHO_externalLink(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None):
1493: """Add an external Link"""
1494:
1495: newObj=ECHO_externalLink(id,link,title,label,description,contentType,responsible,credits,weight,coords)
1496:
1497: self._setObject(id,newObj)
1498:
1499: if RESPONSE is not None:
1500: RESPONSE.redirect('manage_main')
1501:
1502:
1503: class ECHO_link(ECHO_externalLink):
1504: """external_link"""
1505:
1506: meta_type="ECHO_link"
1507:
1508:
1509: def content_html(self):
1510: """template fuer link"""
1511: if hasattr(self,"link_template"):
1512: return ECHO_basis.content_html(self,'link')
1513: else:
1514: return ECHO_basis.content_html(self,'collection')
1515:
1516: def index_html(self):
1517: """standard link"""
1518: if self.link:
1519: splitted=self.link.split("?")
1520: if len(splitted)>1:
1521: params=cgi.parse_qs(splitted[1])
1522:
1523: for x in params.keys():
1524: if type(params[x]) is ListType:
1525: params[x]=params[x][0]
1526:
1527:
1528: else:
1529: params={}
1530:
1531: params['backLink']=self.aq_parent.absolute_url()
1532: params['startLink']=splitted[0]+"?"+urllib.urlencode(params)
1533:
1534:
1535: return self.REQUEST.RESPONSE.redirect(splitted[0]+"?"+urllib.urlencode(params))
1536: else:
1537: return ""
1538:
1539: def manage_addECHO_linkForm(self):
1540: """Form for external Links"""
1541: pt=zptFile(self, 'zpt/AddECHO_linkForm.zpt')
1542: return pt()
1543:
1544:
1545: def manage_addECHO_link(self,id,title,label,description="",contentType="",responsible="",link="",weight="",coords=[],credits=None,RESPONSE=None):
1546: """Add an external Link"""
1547:
1548: newObj=ECHO_link(id,link,title,label,description,contentType,responsible,credits,weight,coords)
1549:
1550: self._setObject(id,newObj)
1551:
1552: if RESPONSE is not None:
1553: RESPONSE.redirect('manage_main')
1554:
1555:
1556: class ECHO_collection(Folder, Persistent, Implicit, Cacheable,ECHO_basis):
1557: """ECHO Collection"""
1558:
1559: security=ClassSecurityInfo()
1560: meta_type='ECHO_collection'
1561: # viewClassificationList=viewClassificationListMaster
1562: displayTypes=displayTypes
1563:
1564: path="/mpiwg/online/permanent/shipbuilding"
1565:
1566: def localizeObjects(self):
1567: """localize all objects"""
1568: contents=self.ZopeFind(self,obj_metatypes=['ECHO_externalLink','ECHO_link','ECHO_mapText'])
1569:
1570: find=self.ZopeFind(self,obj_ids=('locale_en'))
1571: if not find:
1572: self.manage_addECHO_locale("en",'','')
1573: for content in contents:
1574:
1575: if content[1].meta_type in ['ECHO_link','ECHO_externalLink']:
1576:
1577: find=content[1].ZopeFind(content[1],obj_metatypes=('ECHO_mapText'))
1578: if find:
1579: root=find[0][1]
1580:
1581: locale=find[0][1].ZopeFind(find[0][1],obj_ids=('locale_en'))
1582: else:
1583: root=None
1584: else:
1585: root=content[1]
1586: locale=content[1].ZopeFind(content[1],obj_ids=('locale_en'))
1587: if root and not locale:
1588: root.manage_addECHO_locale("en",'','')
1589:
1590: pt=zptFile(self, 'zpt/localizeObjects.zpt')
1591: return pt()
1592:
1593:
1594: def localize(self,REQUEST,RESPONSE):
1595: """localize"""
1596: for key in REQUEST.form.keys():
1597: splitted=key.split("!")
1598:
1599: if splitted[0]=="" or splitted[0]=="en" or splitted[0]=="title" or splitted[0]=="label":
1600: if splitted[0]=="en":
1601: setattr(self.locale_en,splitted[1],REQUEST.form[key])
1602: else:
1603: setattr(self,splitted[0],REQUEST.form[key])
1604: else:
1605: obj=getattr(self,splitted[0])
1606:
1607: if obj.meta_type=="ECHO_mapText":
1608: if splitted[1]=="en":
1609: obj.locale_en.pt_edit(REQUEST.form[key],None)
1610: else:
1611: obj.pt_edit(REQUEST.form[key],None)
1612: else:
1613: text=obj.ZopeFind(obj,obj_metatypes=['ECHO_mapText'])
1614: if splitted[1]=="en":
1615:
1616: text[0][1].locale_en.pt_edit(REQUEST.form[key],None)
1617: else:
1618: text[0][1].pt_edit(REQUEST.form[key],None)
1619: if RESPONSE is not None:
1620: RESPONSE.redirect('manage_main')
1621:
1622:
1623: def getRDF(self,urn=None):
1624: """rdf of the collection"""
1625:
1626: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
1627:
1628: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
1629:
1630: if not urn:
1631: urn=self.absolute_url()
1632:
1633: li="""<RDF:li RDF:resource="%s" />\n"""
1634:
1635:
1636: for content in contents:
1637: ret+=content[1].getRDF()+"\n"
1638:
1639: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn
1640: for content in contents:
1641: nurn=content[1].absolute_url()
1642: ret+=li%nurn
1643: return ret+"</RDF:Seq>"
1644:
1645:
1646:
1647: def changeLabels(self):
1648: """change form"""
1649: pt=zptFile(self, 'zpt/changeLabelsForm')
1650: pt.content_type="text/html"
1651: return pt()
1652:
1653: def changeTitles(self):
1654: """change form"""
1655: pt=zptFile(self, 'zpt/changeTitleForm')
1656: pt.content_type="text/html"
1657: return pt()
1658:
1659: def changeWeights(self):
1660: """change form"""
1661: pt=zptFile(self, 'zpt/changeWeightForm')
1662: pt.content_type="text/html"
1663: return pt()
1664:
1665: def changeMetaDataLinks(self):
1666: """change form"""
1667: pt=zptFile(self, 'zpt/changeMetaDataLinkForm')
1668: pt.content_type="text/html"
1669: return pt()
1670: def changeAccessRightsCollection(self):
1671: """change"""
1672: ret=""
1673: argv=self.REQUEST.form
1674:
1675: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1676: for resource in resources:
1677:
1678: try:
1679: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1680: resource[1].changeAccessRightMD(argv[resource[1].getId()])
1681: except:
1682: pass
1683: return ret
1684:
1685: def changeMetaDataLinkInCollection(self):
1686: """change all lables of a collection"""
1687: ret=""
1688: argv=self.REQUEST.form
1689:
1690: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1691: for resource in resources:
1692:
1693: try:
1694: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1695: resource[1].metalink=argv[resource[1].getId()][0:]
1696: except:
1697: pass
1698: return ret
1699:
1700: def changeMetaDataLinkInCollection(self):
1701: """change all lables of a collection"""
1702: ret=""
1703: argv=self.REQUEST.form
1704:
1705: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1706: for resource in resources:
1707:
1708: try:
1709: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1710: resource[1].metalink=argv[resource[1].getId()][0:]
1711: except:
1712: pass
1713: return ret
1714:
1715: def changeWeightsInCollection(self):
1716: """change all lables of a collection"""
1717: ret=""
1718: argv=self.REQUEST.form
1719:
1720: resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
1721: for resource in resources:
1722:
1723: try:
1724: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1725: resource[1].weight=argv[resource[1].getId()][0:]
1726: except:
1727: pass
1728: return ret
1729:
1730: def changeTitlesInCollection(self):
1731: """change all lables of a collection"""
1732: ret=""
1733: argv=self.REQUEST.form
1734:
1735: resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
1736: for resource in resources:
1737:
1738: try:
1739: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1740: resource[1].title=argv[resource[1].getId()][0:]
1741: except:
1742: pass
1743: return ret
1744:
1745: def changeLabelsInCollection(self):
1746: """change all lables of a collection"""
1747: ret=""
1748: argv=self.REQUEST.form
1749:
1750: resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
1751: for resource in resources:
1752:
1753: try:
1754: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1755: resource[1].label=argv[resource[1].getId()][0:]
1756: except:
1757: pass
1758: return ret
1759:
1760: def updateCollection(self,RESPONSE=None):
1761: """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""
1762: files=os.listdir(self.path)
1763: ret=""
1764: for fileName in files:
1765:
1766: if fileName:
1767:
1768: tempPath=re.sub("/mpiwg/online","",self.path)
1769: link="http://echo.mpiwg-berlin.mpg.de/zogilib_book?fn="+tempPath+"/"+fileName+"/pageimg"
1770:
1771: metalink=self.path+"/"+fileName+"/index.meta"
1772: try:
1773:
1774: #link="http://nausikaa2.mpiwg-berlin.mpg.de/cgi-bin/toc/toc.x.cgi?dir="+fileName+"&step=thumb"
1775:
1776: newObj=ECHO_resource(fileName,link,metalink,fileName,fileName,fileName,'generated','book','','','','','','')
1777: self._setObject(fileName,newObj)
1778:
1779: genObj=getattr(self,fileName)
1780: #genObj.createIndexFile()
1781: ret+="OK:"+fileName+"<br/>"
1782: except:
1783: print "ERROR"
1784: ret+="ERROR:"+fileName+"<br/>"
1785:
1786: return ret
1787:
1788: if RESPONSE is not None:
1789: RESPONSE.redirect('manage_main')
1790:
1791: def updateCollectionMD(self,RESPONSE=None):
1792: """updateMD"""
1793: files=os.listdir(self.path)
1794: for fileName in files:
1795: if fileName:
1796: genObj=getattr(self,fileName)
1797: genObj.copyIndex_meta2echo_resource()
1798: genObj.generate_title()
1799:
1800: if RESPONSE is not None:
1801: RESPONSE.redirect('manage_main')
1802:
1803:
1804:
1805: def changeViewerTemplateSetsForm(self):
1806: """change the viewer template set"""
1807: pt=zptFile(self, 'zpt/changeViewerTemplateSet')
1808: return pt()
1809:
1810: def getViewerTemplateSets(self,obj_ids=None,RESPONSE=None):
1811: """Get the ViewerTemplateSet title for configuration"""
1812: ret=[]
1813:
1814: try:
1815: viewerTemplateSets=self.ZopeFind(self.viewerTemplateSets,obj_metatypes=['OSAS_viewerTemplateSet'],obj_ids=obj_ids)#assumes viewerTemplateSets folder somewhere in the hierarchie.
1816:
1817: for viewerTemplateSet in viewerTemplateSets:
1818: ret.append((viewerTemplateSet[1].title,viewerTemplateSet[0],viewerTemplateSet[1]))
1819:
1820: return ret
1821:
1822: except:
1823: return [('no ViewerTemplateSetfolders','')]
1824:
1825: def getTextToolsField(self,name,default=''):
1826: """Lese viewerTemplateSet der Collection not implemented yet!"""
1827:
1828: return default
1829:
1830:
1831: def isSelectedViewerTemplateSet(self,obj,id):
1832: """is ausgewaehlt"""
1833:
1834: if self.REQUEST['viewerTemplateSet']==id:
1835: return 1
1836: else:
1837: return None
1838:
1839: def changeViewerTemplateSets(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None):
1840: """change the templates"""
1841:
1842: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
1843:
1844: for resource in resources:
1845:
1846: resource[1].changeViewerTemplateSet(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix)
1847:
1848: if RESPONSE is not None:
1849: RESPONSE.redirect('manage_main')
1850:
1851:
1852: def setStartpageFolderForm(self):
1853: """Form for changing the startpage"""
1854:
1855:
1856: pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPageFolder.zpt')
1857: pt.content_type="text/html"
1858: return pt()
1859:
1860: def setStartpageFolder(self,startpage=None,RESPONSE=None):
1861: """change the templates"""
1862:
1863: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
1864:
1865: for resource in resources:
1866:
1867: resource[1].setStartPage(startpage)
1868:
1869: if RESPONSE is not None:
1870: RESPONSE.redirect('manage_main')
1871:
1872: def copyTitleToInfoXMLFolder(self,RESPONSE=None):
1873: """copy title into the title field of info.xml
1874: author and date werden leer!!!
1875: """
1876:
1877:
1878: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
1879:
1880:
1881: for resource in resources:
1882: ret,txt=resource[1].copyTitleToInfoXML()
1883: if (not ret) and RESPONSE:
1884: RESPONSE.write("error: %s\n"%txt)
1885: if ret and RESPONSE:
1886: RESPONSE.write("ok: %s\n"%txt)
1887:
1888: #zLOG.LOG("ECHO (copyTitleToInfoXMLFolder)",zLOG.INFO,txt)
1889: if RESPONSE is not None:
1890: RESPONSE.write("done!\n")
1891: RESPONSE.close()
1892: RESPONSE.redirect('manage_main')
1893:
1894: def copySearchFields(self,RESPONSE=None):
1895: """copys import metadatafields to the object"""
1896: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1897:
1898: for resource in resources:
1899:
1900: resource[1].copySearchFields()
1901:
1902: if RESPONSE is not None:
1903: RESPONSE.redirect('manage_main')
1904:
1905: def reloadMetaDataFromStorageWarning(self,RESPONSE=None):
1906: """warning"""
1907: pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt')
1908: pt.content_type="text/html"
1909: return pt()
1910:
1911: def reloadMetaDataFromStorage(self,RESPONSE=None):
1912: """copy metadata from the storage to ECHO"""
1913:
1914: return reloadMetaDataFromStorage(self,RESPONSE=None)
1915:
1916:
1917: def getPartnerCopyright(self,name,sonst="generic"):
1918: """gibt generisches copyright eines partners aus, sonst behalte jetzige einsteillung"""
1919: #print "hi",name,sonst
1920: #print getattr(self.partners,name).copyrightType
1921: try:
1922: partner=getattr(self.partners,name)
1923: return partner.copyrightType
1924: except:
1925: print "error"
1926: return sonst
1927:
1928: def partnerSelector_HTML(self,selected=None):
1929: """give type selector"""
1930: if not selected:
1931: retStr="<option selected>\n"
1932: else:
1933: retStr="<option>\n"
1934:
1935: try: # erste version copyrightTypes exists
1936: for partner in self.credits:
1937: if selected and (partner==selected):
1938: retStr+="""<option selected value="%s">%s\n"""%(partner,partner)
1939: else:
1940: retStr+="""<option value="%s">%s\n"""%(partner,partner)
1941: except:
1942: """nothing"""
1943: return retStr
1944:
1945: # def getViewClassification(self):
1946: # if hasattr(self,'viewClassification'):
1947: # return self.viewClassification
1948: # else:
1949: # return ""
1950:
1951:
1952: def createRessourcesFromXMLForm(self):
1953: """form"""
1954: pt=zptFile(self, 'zpt/createRessourcesFromXMLForm.zpt')
1955: return pt()
1956:
1957: def createRessourcesFromXML(self,fileupload):
1958: """read an XML file for generating resources"""
1959: dom=xml.dom.minidom.parse(fileupload)
1960: ret="<h2>Added</h2>"
1961: for resource in dom.getElementsByTagName('resource'):
1962: link=getText(resource.getElementsByTagName('link')[0].childNodes)
1963: label=getText(resource.getElementsByTagName('label')[0].childNodes)
1964: #splitted=link.split("?")[0].split("/")
1965: #id=splitted[len(splitted)-1].encode('ascii')
1966: id=re.sub(" ","_",label).encode('ascii')
1967:
1968: ret+="<p>"+label+"</p>"
1969: manage_addECHO_resource(self,id,label.encode('ascii'),label.encode('ascii'),"","","",link.encode('ascii'),"","")
1970: return ret
1971:
1972: security.declarePublic('getImageTag')
1973: def getImageTag(self):
1974: """GetTag"""
1975: try:
1976: return self.imageTag
1977: except:
1978: return ""
1979:
1980:
1981: def addMovie(self,id,title,label,description,contentType,responsible,link,thumbUrl,rawFile,lowresFile,metalink,weight,credits=None,coords=None,RESPONSE=None):
1982: """SSS"""
1983:
1984: #manage_addECHO_movie(self,id,title,label,description,responsible,link,thumbUrl,rawFile,metalink,weight,credits=None,coords=None,RESPONSE=None)
1985: if not hasattr(self,id):
1986: try:
1987: manage_addECHO_movie(self,id,title,label,description,responsible,link,thumbUrl,rawFile,lowresFile,metalink,weight,credits=None,coords=None,RESPONSE=None)
1988: return "done"
1989: except:
1990: return None
1991: else:
1992: obj=getattr(self,id)
1993: obj.changeECHO_movie_main(metalink,link,rawFile,lowresFile,thumbUrl,title,label,description,contentType,weight=weight)
1994:
1995: return "changed"
1996:
1997: def addResource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None):
1998: """SSS"""
1999: try:
2000: manage_addECHO_resource(self,id,title,label,description,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None)
2001: return "done"
2002: except:
2003: return None
2004:
2005: def getSecondaryLink(self):
2006: """secondary link"""
2007: try:
2008: return self.secondaryLink
2009: except:
2010: return ""
2011:
2012: def getSecondaryLinkTitle(self):
2013: """secondary link"""
2014: try:
2015: return self.secondaryLinkTitle
2016: except:
2017: return ""
2018:
2019: def getCollectionTreeXML(self,pwstr=None):
2020: """Tree as XML"""
2021:
2022: def addPassWd(str,pwstr=None):
2023: """adds a user/passwd to an url"""
2024: if pwstr:
2025: txt2=re.sub(r"(http://)(.*?)","\g<1>%s@\g<2>"%pwstr,str)
2026: else:
2027: txt2=re.sub(r"(http://)(.*?)","\g<1>www:3333@\g<2>",str)
2028: return txt2
2029:
2030: def getCollection(object,depth=0,pwstr=None):
2031: depth+=1
2032: collections=""
2033: for entry in object.__dict__.keys():
2034: element=getattr(object,entry)
2035: try:
2036: if element.meta_type in ["ECHO_collection","ECHO_group"]:
2037: collections+="<element name=\""+urllib.quote(element.title)+"\" url=\""+addPassWd(element.absolute_url(),pwstr=pwstr)+"\">"
2038: collections+=getCollection(element,depth)+"</element>\n"
2039: except:
2040: """nothing"""
2041: return collections
2042:
2043: ret="""<?xml version="1.0" encoding="utf-8" ?>"""
2044: return ret+"<collection>"+getCollection(self,pwstr=pwstr)+"</collection>"
2045:
2046: def createAllJSAreas(self):
2047: """create area calls for JavaScript"""
2048: areas = self.getAllMapAreas()
2049: return self.createJSAreas(areas)
2050:
2051: security.declarePublic('getCreditObject')
2052: def getCreditObject(self,name):
2053: """credit id to credititem"""
2054: try:
2055: return getattr(self.partners,name)
2056: except:
2057: return ""
2058:
2059: security.declarePublic('ECHO_generateNavBar')
2060: def ECHO_generateNavBar(self):
2061: """Erzeuge Navigationsbar"""
2062: link=""
2063: object="self"
2064: ret=[]
2065: path=self.getPhysicalPath()
2066: for element in path:
2067:
2068:
2069: if not element=="":
2070: object+="."+element
2071:
2072: label=eval(object).label
2073: link+="/"+element
2074: if not label=="":
2075: ret.append((label,link))
2076: return ret
2077:
2078:
2079: def ECHO_rerenderLinksMDWarning(self):
2080: """change form"""
2081: pt=zptFile(self, 'zpt/rerenderLinksWarning')
2082: pt.content_type="text/html"
2083: return pt()
2084:
2085:
2086:
2087: security.declarePublic('ECHO_rerenderLinksMD')
2088: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
2089: """Rerender all Links"""
2090: return ECHO_rerenderLinksMD(self,obj,types)
2091:
2092:
2093: def __init__(self,id,title,label,description="",contentType="",responsible="",credits="",weight="",sortfield="",coords=[],secondaryLinkTitle="",secondaryLink="",imageTag="",bgcolour=""):
2094:
2095: self.id = id
2096: """Festlegen der ID"""
2097: self.credits=toList(credits)
2098: self.label = label
2099: self.title=title
2100: self.description=description
2101: self.contentType=contentType
2102: self.responsible=responsible
2103: self.imageTag=imageTag
2104: self.weight=weight
2105: self.sortfield=sortfield
2106: coordsnew=[ string.split(x,",") for x in coords]
2107: self.coords=coordsnew
2108: self.secondaryLinkTitle=secondaryLinkTitle
2109: self.secondaryLink=secondaryLink
2110: self.bgcolour=bgcolour
2111:
2112:
2113: manage_options = Folder.manage_options+ Cacheable.manage_options+(
2114: {'label':'Main Config','action':'ECHO_collection_config'},
2115: {'label':'Change Labels','action':'changeLabels'},
2116: {'label':'Change Titles','action':'changeTitles'},
2117: {'label':'Localize','action':'localizeObjects'},
2118: {'label':'Change Weights','action':'changeWeights'},
2119: {'label':'Rerender Labels and Titles','action':'ECHO_rerenderLinksMDWarning'},
2120: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
2121: {'label':'create resources from XML','action':'createRessourcesFromXMLForm'},
2122: {'label':'Set Startpage','action':'setStartpageFolderForm'},
2123: {'label':'Change Viewer Templates and Image Viewer','action':'changeViewerTemplateSetsForm'},
2124: {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},
2125: {'label':'ImportCollection','action':'updateCollection'},
2126: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
2127: )
2128:
2129:
2130: security.declarePublic('ECHO_collection_config')
2131: def ECHO_collection_config(self):
2132: """Main configuration"""
2133:
2134: if not hasattr(self,'weight'):
2135: self.weight=""
2136:
2137: if not hasattr(self,'sortfield'):
2138: self.sortfield="weight"
2139:
2140: pt=zptFile(self, 'zpt/ChangeECHO_collection.zpt')
2141: return pt()
2142:
2143:
2144: def getBgcolour(self):
2145: """colour"""
2146: if hasattr(self,'bgcolour') and not (self.bgcolour==""):
2147: return self.bgcolour
2148: else:
2149: return "#dddddd"
2150:
2151:
2152: security.declarePublic('changeECHO_collection')
2153: def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",location=None,isAlwaysClickable=None,prefix="",suffix=""):
2154: """Aenderung der Properties"""
2155:
2156: self.secondaryLink=secondaryLink
2157: self.secondaryLinkTitle=secondaryLinkTitle
2158: self.imageTag=imageTag
2159: self.bgcolour=bgcolour
2160: self.location=location
2161: self.isAlwaysClickable=isAlwaysClickable
2162: self.prefix=prefix[0:]
2163: self.suffix=suffix[0:]
2164:
2165: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
2166:
2167: self.sortfield=sortfield
2168:
2169: if RESPONSE is not None:
2170: RESPONSE.redirect('manage_main')
2171:
2172: def setAlwaysClickable(self,flag="yes"):
2173: """set clickable"""
2174: if flag=="yes":
2175: self.isAlwaysClickable="yes"
2176: else:
2177: self.isAlwaysClickable=None
2178:
2179: return flag
2180:
2181: def showOverview(self):
2182: """overview"""
2183: if 'ECHO_overview.html' in self.__dict__.keys():
2184: return getattr(self,'ECHO_overview.html')()
2185: pt=zptFile(self, 'zpt/ECHO_content_overview.zpt')
2186: return pt()
2187:
2188:
2189: security.declareProtected('View','index_html')
2190: def index_html(self):
2191: """standard page"""
2192: if self.ZCacheable_isCachingEnabled():
2193:
2194: result = self.ZCacheable_get()
2195: if result is not None:
2196: # Got a cached value.
2197: return result
2198:
2199: if 'index.html' in self.__dict__.keys():
2200: ret=getattr(self,'index.html')()
2201:
2202: elif 'overview' in self.__dict__.keys():
2203: ret=self.showOverview()
2204: elif hasattr(self,'collection_index_template'):
2205: ret=self.collection_index_template()
2206: elif hasattr(self,'main_index_template'):
2207:
2208: ret=self.main_index_template.__of__(self)(self.main_template)
2209: else:
2210: pt=zptFile(self, 'zpt/ECHO_main_index_template_standard.zpt')
2211: pt.content_type="text/html"
2212: ret=pt.render()
2213:
2214: self.ZCacheable_set(ret)
2215: return ret
2216:
2217: security.declarePublic('content_html')
2218: def content_html(self,**argv):
2219: """template fuer content"""
2220: #print "NN",argv
2221: return ECHO_basis.content_html(self,'collection')
2222:
2223: def getCredits(self):
2224: """Ausgabe der credits"""
2225: if self.credits:
2226: return self.credits
2227: else:
2228: return []
2229:
2230: def area_img(self):
2231: """area image"""
2232: bt = BrowserCheck(self)
2233: if bt.isIE or bt.isN4:
2234: return sendFile(self, 'images/red.gif', 'image/gif')
2235: else:
2236: return sendFile(self, 'images/reda.png', 'image/png')
2237:
2238: def trans_img(self):
2239: """empty image"""
2240: return sendFile(self, 'images/trans.gif', 'image/gif')
2241:
2242: def hl_lib_js(self):
2243: """javascript"""
2244: return sendFile(self, 'js/hl_lib.js', 'text/plain')
2245:
2246: def js_lib_js(self):
2247: """javascript -- old name"""
2248: return sendFile(self, 'js/baselib.js', 'text/plain')
2249:
2250: def baselib_js(self):
2251: """javascript"""
2252: return sendFile(self, 'js/baselib.js', 'text/plain')
2253:
2254: def hl_add_js(self):
2255: """javascript"""
2256: return sendFile(self, 'js/hl_add.js', 'text/plain')
2257:
2258: def getAllMapAreas(self,mapColTypes=['ECHO_collection','ECHO_resource','ECHO_link','ECHO_externalLink']):
2259: """Give list of coordinates"""
2260:
2261: areas=[]
2262: for entry in self.getSubCols(subColTypes=mapColTypes):
2263: object=entry
2264: areas.extend(object.getMapAreas())
2265: return areas
2266:
2267:
2268: def deleteMapAreas(self):
2269: """deletes all map areas from this object"""
2270: for obs in self.ZopeFind(self, obj_metatypes=['MapArea'], search_sub=1):
2271: ob = obs[1]
2272: id = ob.id
2273: parent = ob.aq_parent
2274: print "deleting: ", ob.id
2275: parent._delObject(id)
2276: return "Done"
2277:
2278:
2279: getSubCols = ECHO_helpers.getSubCols
2280:
2281: Globals.InitializeClass(ECHO_collection)
2282:
2283: def manage_addECHO_collectionForm(self):
2284: """Add collection form"""
2285: pt=zptFile(self, 'zpt/AddECHO_collectionForm.zpt')
2286: return pt()
2287:
2288:
2289: def manage_addECHO_collection(self,id,title,label,description="",contentType="",responsible="",weight=0,sortfield="weight",coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour=""):
2290: """add a echo collection"""
2291:
2292:
2293: newObj=ECHO_collection(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
2294:
2295: self._setObject(id,newObj)
2296:
2297: if RESPONSE is not None:
2298: RESPONSE.redirect('manage_main')
2299:
2300: class ECHO_group(ECHO_collection):
2301: """ECHO Gruppe"""
2302: security=ClassSecurityInfo()
2303: meta_type="ECHO_group"
2304:
2305: manage_options = Folder.manage_options+(
2306: {'label':'Main Config','action':'ECHO_group_config'},
2307: {'label':'Rerender Links','action':'ECHO_rerenderLinksMDWarning'},
2308: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
2309: )
2310:
2311: security.declareProtected('View','index_html')
2312:
2313:
2314: def getRDF(self,urn=None):
2315: """rdf of the collection"""
2316: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
2317:
2318: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
2319:
2320:
2321: if not urn:
2322: urn=self.absolute_url()
2323: li="""<RDF:li RDF:resource="%s" />\n"""
2324:
2325:
2326: for content in contents:
2327: ret+=content[1].getRDF()+"\n"
2328:
2329: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn
2330: for content in contents:
2331: nurn=content[1].absolute_url()
2332: ret+=li%nurn
2333: return ret+"</RDF:Seq>"
2334:
2335: def index_html(self):
2336: """standard page"""
2337: displayedObjects=self.ZopeFind(self,obj_metatypes=displayTypes)
2338: #if (len(displayedObjects)==1) and (displayedObjects[0][1].meta_type=="ECHO_collection"): # nur ein Object dann redirect auf dieses Object
2339: # return self.REQUEST.RESPONSE.redirect(displayedObjects[0][1].absolute_url())
2340:
2341: if 'index.html' in self.__dict__.keys():
2342: return getattr(self,'index.html')()
2343:
2344: elif 'overview' in self.__dict__.keys():
2345: return self.showOverview()
2346: elif hasattr(self,'group_index_template'):
2347: return self.group_index_template()
2348: elif hasattr(self,'collection_index_template'):
2349: return self.collection_index_template()
2350: elif hasattr(self,'main_index_template'):
2351: return self.main_index_template()
2352:
2353: pt=zptFile(self, 'zpt/ECHO_main_index_template_standard.zpt')
2354: pt.content_type="text/html"
2355: return pt()
2356:
2357: def ECHO_group_config(self):
2358: """Main configuration"""
2359:
2360: if not hasattr(self,'weight'):
2361: self.weight=""
2362:
2363: if not hasattr(self,'sortfield'):
2364: self.sortfield="weight"
2365:
2366: if not hasattr(self,'coords'):
2367: self.coords=[]
2368:
2369: pt=zptFile(self, 'zpt/ChangeECHO_group.zpt')
2370: return pt()
2371:
2372: def changeECHO_group(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
2373: """Aenderung der Properties"""
2374:
2375: self.secondaryLink=secondaryLink
2376: self.secondaryLinkTitle=secondaryLinkTitle
2377: self.imageTag=imageTag
2378: self.bgcolour=bgcolour
2379: self.logo=logo
2380:
2381: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
2382:
2383:
2384:
2385: self.sortfield=sortfield
2386:
2387: if RESPONSE is not None:
2388: RESPONSE.redirect('manage_main')
2389:
2390: def getLogo(self):
2391: """logo ausgeben"""
2392: try:
2393: return self.logo
2394: except:
2395: return "ECHO_groups"
2396:
2397: security.declarePublic('content_html')
2398: def content_html(self):
2399: """template fuer content"""
2400: return ECHO_basis.content_html(self,'group')
2401:
2402:
2403:
2404: def manage_addECHO_groupForm(self):
2405: """Add group form"""
2406: pt=zptFile(self, 'zpt/AddECHO_groupForm.zpt')
2407: return pt()
2408:
2409:
2410: def manage_addECHO_group(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
2411: """add a echo group"""
2412:
2413:
2414: newObj=ECHO_group(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
2415:
2416: setattr(newObj,'logo',logo)
2417: self._setObject(id,newObj)
2418:
2419: if RESPONSE is not None:
2420: RESPONSE.redirect('manage_main')
2421:
2422: Globals.InitializeClass(ECHO_group)
2423:
2424:
2425: class ECHO_userFolder(UserFolder):
2426: """User folder for Intranet"""
2427: _domain_auth_mode=1 # Identification via domain
2428: meta_type="ECHO_userFolder"
2429:
2430: def authenticate(self, name, password, request):
2431: emergency = self._emergency_user
2432: if name is None:
2433: return None
2434: if emergency and name==emergency.getUserName():
2435: user = emergency
2436: else:
2437: user = self.getUser(name)
2438: if user is not None and user.authenticate(password, request):
2439: return user
2440: else:
2441: return None
2442:
2443: def domainSpecMatch(self,spec, request):
2444: host=''
2445: addr=''
2446:
2447: # Fast exit for the match-all case
2448: if len(spec) == 1 and spec[0] == '*':
2449: return 1
2450:
2451: if request.has_key('REMOTE_HOST'):
2452: host=request['REMOTE_HOST']
2453:
2454: if request.has_key('REMOTE_ADDR'):
2455: addr=request['REMOTE_ADDR']
2456:
2457: if request.has_key('HTTP_X_FORWARDED_FOR'):
2458: addr=request['HTTP_X_FORWARDED_FOR']
2459:
2460:
2461: if not host and not addr:
2462: return 0
2463:
2464: if not host:
2465: try: host=socket.gethostbyaddr(addr)[0]
2466: except: pass
2467: if not addr:
2468: try: addr=socket.gethostbyname(host)
2469: except: pass
2470:
2471:
2472: _host=host.split('.')
2473: _addr=addr.split('.')
2474: _hlen=len(_host)
2475: _alen=len(_addr)
2476:
2477: for ob in spec:
2478: sz=len(ob)
2479: _ob=ob.split('.')
2480: _sz=len(_ob)
2481:
2482: mo = addr_match(ob)
2483: if mo is not None:
2484: if mo.end(0)==sz:
2485: fail=0
2486: for i in range(_sz):
2487: a=_addr[i]
2488: o=_ob[i]
2489: if (o != a) and (o != '*'):
2490: fail=1
2491: break
2492: if fail:
2493: continue
2494: return 1
2495:
2496: mo = host_match(ob)
2497: if mo is not None:
2498: if mo.end(0)==sz:
2499: if _hlen < _sz:
2500: continue
2501: elif _hlen > _sz:
2502: _item=_host[-_sz:]
2503: else:
2504: _item=_host
2505: fail=0
2506: for i in range(_sz):
2507: h=_item[i]
2508: o=_ob[i]
2509: if (o != h) and (o != '*'):
2510: fail=1
2511: break
2512: if fail:
2513: continue
2514: return 1
2515: return 0
2516:
2517: Globals.default__class_init__(ECHO_userFolder)
2518:
2519:
2520:
2521: def manage_addECHO_userFolder(self,dtself=None,REQUEST=None,**ignored):
2522: """add a user folder """
2523: f=ECHO_userFolder()
2524: self=self.this()
2525: try: self._setObject('acl_users', f)
2526: except: return MessageDialog(
2527: title ='Item Exists',
2528: message='This object already contains a User Folder',
2529: action ='%s/manage_main' % REQUEST['URL1'])
2530: self.__allow_groups__=f
2531: if REQUEST is not None:
2532: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
2533:
2534: def manage_addECHO_userFolderForm(self):
2535: """add a user folder form"""
2536: return manage_addECHO_userFolder(self)
2537:
2538:
2539:
2540: def createNode(self,descrs,node):
2541: name=descrs[node]['name']
2542: type=descrs[node]['type']
2543: urn=node
2544: #print " will create",node.encode('utf-8')
2545: id=re.sub('[^a-zA-Z0-9]','',name).encode('ascii','ignore')
2546: #print "id",id
2547: #print type
2548: #self.REQUEST.RESPONSE.write("<p>%s<p>\n"%id)
2549: if type=="CDLI_group":
2550:
2551: try:
2552: manage_addECHO_collection(self,id,name,name,"","","","","")
2553:
2554: except:
2555: self.REQUEST.RESPONSE.write("<p>Error%s</p>\n"%id)
2556:
2557: self.REQUEST.RESPONSE.write("<p>Creates:%s</p>\n"%getattr(self,id).absolute_url())
2558:
2559: return type,getattr(self,id),urn
2560:
2561: if type=="CDLI_item":
2562: try:
2563: manage_addECHO_resource(self,id,name,name,"","",urn,"","")
2564: except:
2565: self.REQUEST.RESPONSE.write("<p>Error%s</p>\n"%id)
2566: self.REQUEST.RESPONSE.write("<p>Creates:%s</p>\n"%getattr(self,id).absolute_url())
2567:
2568:
2569: return "XX"
2570:
2571:
2572: class ECHO_root(Folder,Persistent,Implicit):
2573: """ECHO Root Folder"""
2574:
2575: security=ClassSecurityInfo()
2576:
2577: meta_type="ECHO_root"
2578:
2579: def findObjectFromFulltext(self,url=None,existUri=None):
2580: '''
2581:
2582: @param url:
2583: @param existUri:
2584: '''
2585: #TODO: at the moment assume that the filename is unique, the whole has to changed to a system of ids.
2586: return None
2587:
2588: def reindex(self,RESPONSE=None):
2589: """indiziere alle Objecte neu"""
2590:
2591: if RESPONSE:
2592: RESPONSE.write("<html><body>")
2593:
2594: resources=self.ZopeFind(self,obj_metatypes=["ECHO_resource"], search_sub=1)
2595:
2596: for resource in resources:
2597: resource[1].reindex()
2598: print "<p> done %s </p>\n"
2599: if RESPONSE:
2600: RESPONSE.write("<p> done %s </p>\n"%resource[0])
2601:
2602: if RESPONSE:
2603: RESPONSE.write("<p> ok </p></html></body>\n")
2604:
2605: def printer(self,txt):
2606: print txt
2607: print txt[2]
2608: print txt[2].getImageTag()
2609: print "HO"
2610: return txt[2].getImageTag()
2611:
2612: def printer2(self,txt):
2613: print txt
2614:
2615:
2616: def item2(self,txt):
2617: return txt[2]
2618:
2619: def setLanguage(self,lang):
2620: """Set language cookie"""
2621: self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")
2622:
2623: def switchLanguage(self):
2624: """Set language cookie"""
2625: if self.getLanguage()=="en":
2626: lang="de"
2627: else:
2628: lang="en"
2629:
2630: self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")
2631: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1'])
2632: def getLanguage(self):
2633: """get language cookie"""
2634: lang= self.REQUEST.cookies.get('lang_exhibition','de')
2635: if lang == '':
2636: lang="de"
2637: return lang
2638:
2639: def getContentOverviewTemplate(self):
2640: """produces overview template with macro"""
2641: pt = zptObjectOrFile(self, 'content_overview_template')
2642: return pt
2643:
2644: def mapstyle_css(self):
2645: """send mapstyle.css"""
2646: sendFile(self, 'html/ECHO_mapstyle.css', 'text/css')
2647:
2648:
2649: ###Cdli adds -> have to be removed
2650: def getTablet(self,item):
2651: #print "getTablet"
2652: try:
2653: read=urllib.urlopen("http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"%item).read()
2654: read=re.sub("\[search\]","search",read)
2655: return read[read.find("<body>")+6:read.rfind("</body>")]
2656: except:
2657: return "<h1>Sorry no connection to the data server enlil.museum.upenn.edu</h1>"
2658: #return "http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"
2659: ###END CDLI add
2660:
2661:
2662: def URLquote(self, text):
2663: """urllib.quote fuer Michael"""
2664: return urllib.quote(text)
2665:
2666:
2667: def checkResource(self,id):
2668: """checks if a resource is in the tree, gives back none or list of resources"""
2669: if not id:
2670: id=""
2671: splitted=id.split("/")
2672: id=splitted[len(splitted)-1]
2673: if hasattr(self,"_v_checkResource") and self._v_checkResource.has_key(id): #existiert ein cache und id ist bereits drin?
2674: return self._v_checkResource[id]
2675:
2676: else:
2677: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],obj_ids=[id],search_sub=1)
2678:
2679: if not hasattr(self,"_v_checkResource"): self._v_checkResource={}#lege cache an falls nicht existent
2680: if resources:
2681: self._v_checkResource[id]=resources[0:] # slicing to be sure that data is stabil
2682: else:
2683: self._v_checkResource[id]=None
2684:
2685: return self._v_checkResource[id]
2686:
2687: def sendForm(self,fromaddr,content,server='mail.mpiwg-berlin.mpg.de'):
2688: """sendform"""
2689: toaddrs=["dwinter@mpiwg-berlin.mpg.de"]
2690:
2691: msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
2692: % (fromaddr, ", ".join(toaddrs),"testsub"))
2693: server = smtplib.SMTP(server)
2694: #server.set_debuglevel(1)
2695: msg=msg+content
2696: server.sendmail(fromaddr, toaddrs, msg)
2697: server.quit()
2698:
2699: def generateFromRDFForm(self):
2700: """change form"""
2701: pt=zptFile(self, 'zpt/generateFromRDFForm')
2702: pt.content_type="text/html"
2703: return pt()
2704:
2705: def generateFromRDF(self,file,startNode="/Cuneiform Corpus"):
2706:
2707: """generate from RDF"""
2708:
2709: global seqs
2710: seqs={}
2711: global descrs
2712: descrs={}
2713: global key
2714: key=""
2715: global value
2716: value=""
2717:
2718: def getEdges(seqs,urn):
2719: """edges"""
2720: ret=[]
2721: return seqs[urn]
2722:
2723: def createSubs(self,seqs,descrs,urn,level=0):
2724: """create subs"""
2725: for edge in getEdges(seqs,urn):
2726: cn=createNode(self,descrs,edge)
2727: if cn[0]=="CDLI_group":
2728: createSubs(cn[1],seqs,descrs,cn[2],level+1)
2729: return
2730:
2731: def start_element(name,attrs):
2732:
2733: global seqs
2734: global descrs
2735: global key
2736: global value
2737: seq=""
2738: if name=="RDF:Seq":
2739: key=attrs.get('RDF:about')
2740: try: # teste ob liste
2741: x=seqs[key][0]
2742: except:
2743:
2744: seqs[key]=[]
2745:
2746:
2747: elif name=="RDF:Description":
2748: key=attrs.get('RDF:about')
2749:
2750:
2751: elif name=="RDF:li":
2752: name=attrs.get('RDF:resource')
2753: seqs[key].append(name)
2754:
2755: elif name=="ECHONAVIGATION:type":
2756: value="type"
2757:
2758: elif name=="ECHONAVIGATION:name":
2759: value="name"
2760: elif name=="ECHONAVIGATION:linkClickable":
2761: value="linkClickable"
2762:
2763: def end_element(name):
2764: """nothing"""
2765: key=""
2766: value=""
2767:
2768: def char_data(data):
2769: """nothing"""
2770:
2771: data=re.sub("\n","",data)
2772: try:
2773: if descrs[key].has_key(value):
2774: descrs[key][value]+=data
2775: else:
2776: descrs[key][value]=data
2777: except:
2778:
2779: descrs[key]={}
2780: descrs[key][value]=data
2781:
2782: p = xml.parsers.expat.ParserCreate()
2783:
2784: p.StartElementHandler = start_element
2785: p.EndElementHandler = end_element
2786: p.CharacterDataHandler = char_data
2787:
2788:
2789: p.ParseFile(file)
2790: self.REQUEST.RESPONSE.write("<html><body><h1>Start</h1>")
2791: createSubs(self,seqs,descrs,startNode)
2792: self.REQUEST.RESPONSE.write("<h1>done</h1></body></html>")
2793: #print "done"
2794:
2795:
2796: return "done"
2797:
2798:
2799:
2800:
2801: def changeWeightsInCollection(self):
2802: """change all lables of a collection"""
2803: ret=""
2804: argv=self.REQUEST.form
2805:
2806: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
2807: for resource in resources:
2808:
2809: try:
2810: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
2811: resource[1].weight=argv[resource[1].getId()][0:]
2812: except:
2813: pass
2814: return ret
2815:
2816: def changeWeights(self):
2817: """change form"""
2818: pt=zptFile(self, 'zpt/changeWeightForm')
2819: pt.content_type="text/html"
2820: return pt()
2821: getSubCols = ECHO_helpers.getSubCols
2822:
2823: manage_options=Folder.manage_options+(
2824: {'label':'Main Config','action':'ECHO_copyright_configForm'},
2825: {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},
2826: {'label':'Change Weights','action':'changeWeights'},
2827: {'label':'Generate from RDF','action':'generateFromRDFForm'},
2828:
2829: )
2830:
2831:
2832:
2833: def reloadMetaDataFromStorageWarning(self,RESPONSE=None):
2834: """warning"""
2835: pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt')
2836: pt.content_type="text/html"
2837: return pt()
2838:
2839: def reloadMetaDataFromStorage(self,RESPONSE=None):
2840: """reload MD from Storage"""
2841:
2842: return reloadMetaDataFromStorage(self,RESPONSE)
2843:
2844: def getRDF(self,urn=None):
2845: """rdf of the collection"""
2846:
2847: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
2848:
2849: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
2850:
2851: li="""<RDF:li RDF:resource="%s" />\n"""
2852:
2853:
2854: for content in contents:
2855: ret+=content[1].getRDF()+"\n"
2856:
2857: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn
2858: for content in contents:
2859: nurn=content[1].absolute_url()
2860: ret+=li%nurn
2861: return ret+"</RDF:Seq>"
2862:
2863:
2864: def showContent(self,path):
2865: """return content/html"""
2866:
2867: return ECHO_helpers.urlopen(path+"/content_html").read()
2868:
2869: def getImageViewers(self):
2870: """images"""
2871: viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject'])
2872: return viewers
2873:
2874:
2875: def getBibTag(self,tag,content):
2876: """get field tag for index-meta-generation"""
2877: if not content or content=="":
2878: return ""
2879: ret="<%s>"%tag
2880: #ret+=urllib.quote(content)
2881: ret+=content
2882:
2883: ret+="</%s>"%tag
2884: return ret
2885:
2886: def getValueFromClass(self,field,found):
2887: """retattribute falss existing"""
2888: try:
2889:
2890: return getattr(found,field).decode('ascii','ignore')
2891: except:
2892: return ""
2893:
2894: security.declarePublic('getImageTag')
2895: def getImageTag(self):
2896: """needed by main_template"""
2897: return ""
2898:
2899: secondaryLink="" #needed by main_template
2900: secondaryLinkTitle="" #needed by main_template
2901:
2902: def getBgcolour(self):
2903: """hack"""
2904: return "#dddddd"
2905:
2906: security.declareProtected('View','contentTypeSelector_HTML')
2907: def contentTypeSelector_HTML(self,selected=None):
2908: """give type selector"""
2909: if not selected:
2910: retStr="<option selected>\n"
2911: else:
2912: retStr="<option>\n"
2913:
2914: try: # erste version contentTypes exists
2915: for contentType in self.ZopeFind(self.contentTypes,obj_metatypes=["ECHO_contentType","OSAS_MetadataMapping"]):
2916: if selected and (contentType[0]==selected):
2917: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
2918: else:
2919: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
2920: except:
2921: try:
2922: for contentType in self.ZopeFind(self.standardMD,obj_metatypes=["OSAS_MetadataMapping"]):
2923: if selected and (contentType[0]==selected):
2924: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
2925: else:
2926: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
2927: except:
2928: """nothing"""
2929:
2930: return retStr
2931:
2932: def renderingTypeSelector_HTML(self,selected=None):
2933: """give type selector"""
2934: if not selected:
2935: retStr="<option selected>\n"
2936: else:
2937: retStr="<option>\n"
2938:
2939: try: # erste version renderingTypes exists
2940: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
2941: if selected and (renderingType[0]==selected):
2942: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
2943: else:
2944: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
2945: except:
2946: """nothing"""
2947: return retStr
2948:
2949:
2950: def copyrightTypeSelector_HTML(self, object=None, selected=None,first=None):
2951: """give type selector"""
2952:
2953: if not first:
2954: if not selected:
2955: retStr="<option selected>\n"
2956: else:
2957: retStr="<option>\n"
2958: else:
2959: if not selected:
2960: retStr="""<option selected value="%s">%s\n"""%first
2961: else:
2962: retStr="""<option value="%s">%s\n"""%first
2963:
2964:
2965: try: # erste version copyrightTypes exists
2966: for copyrightType in self.ZopeFind(self.copyrightTypes,obj_metatypes=["ECHO_copyrightType"]):
2967: if selected and (copyrightType[0]==selected):
2968: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2969: else:
2970: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2971:
2972: for copyrightTypeSelf in self.ZopeFind(object,obj_metatypes=["ECHO_copyrightType"],search_sub=1):
2973: if selected and (copyrightTypeSelf[0]==selected):
2974: retStr+="""<option selected value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
2975: else:
2976: retStr+="""<option value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
2977:
2978: except:
2979: """nothing"""
2980:
2981: return retStr
2982:
2983: def partnerSelector_HTML(self,selected=None):
2984: """give type selector"""
2985: if not selected:
2986: retStr="<option selected>\n"
2987: else:
2988: retStr="<option>\n"
2989:
2990: try: # erste version copyrightTypes exists
2991: for copyrightType in self.ZopeFind(self.partners,obj_metatypes=["ECHO_partner"]):
2992: if selected and (copyrightType[0]==selected):
2993: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2994: else:
2995: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2996: except:
2997: """nothing"""
2998: return retStr
2999:
3000: mediaTypes=['all','text','images','sound','video'] # konfigurierbar in neuer version ueber echoroot??
3001:
3002: def mediaTypeSelector_HTML(self,selected=None):
3003: """give type selector"""
3004: if not selected:
3005: retStr="<option selected>\n"
3006: else:
3007: retStr="<option>\n"
3008:
3009: try: # erste version mediatypesTypes exists
3010: for mediaType in self.mediaTypes:
3011: if selected and (mediaType in selected):
3012: retStr+="""<option selected value="%s">%s\n"""%(mediaType,mediaType)
3013: else:
3014: retStr+="""<option value="%s">%s\n"""%(mediaType,mediaType)
3015: except:
3016: """nothing"""
3017: return retStr
3018:
3019:
3020: def patchContentType(self,obj=None):
3021: """austauschen content_type with contentType (patch bei umstieg von alter Version)"""
3022:
3023:
3024: if not obj:
3025: obj = self
3026:
3027: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate'])
3028:
3029: for entry in entries:
3030: setattr(entry[1],'contentType',entry[1].content_type)
3031: #entry[1].contentType == entry[1].content_type
3032:
3033: if entry[1].meta_type == 'ECHO_collection':
3034: entry[1].patchContentType(entry[1])
3035:
3036:
3037: return "changed all contenttypes in: "+self.title
3038:
3039:
3040: def repairAllCoords(self):
3041: """updates map coordinates on the same and sublevels"""
3042: return repairCoords(self)
3043:
3044:
3045: def patchViewClassification(self,obj=None):
3046: """setze viewClassification heuristisch"""
3047:
3048: def checkIfArrow(obj):
3049: if hasattr(obj,'coords'):
3050: for coordtemp in obj.coords:
3051:
3052: if (len(coordtemp)>4) and not (coordtemp[4]==''):
3053: return 4
3054: return None
3055: return None
3056:
3057: if not obj:
3058: obj = self
3059:
3060: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_group'])
3061:
3062: for entry in entries:
3063:
3064: if checkIfArrow(entry[1]):
3065: setattr(entry[1],'viewClassification','view point')
3066: else:
3067: setattr(entry[1],'viewClassification','area')
3068:
3069: #entry[1].contentType == entry[1].content_type
3070:
3071: if entry[1].meta_type in ['ECHO_collection','ECHO_group']:
3072: entry[1].patchViewClassification(entry[1])
3073:
3074:
3075: return "changed all contenttypes in: "+self.title
3076:
3077: def deleteCache(self,obj=None,RESPONSE=None):
3078: """setze alle collections auf cache = CacheManager"""
3079: if not obj:
3080: obj = self
3081: entries=obj.ZopeFind(obj,search_sub=1)
3082: for entry in entries:
3083: if hasattr(entry[1],'_v_hash'):
3084: entry[1]._v_hash=None
3085:
3086: return "changed all CM in: "+self.title
3087:
3088:
3089: security.declarePublic('ECHO_newViewerLink')
3090: def ECHO_newViewerLink(self,obj=None):
3091: """change links (:86 faellt weg)"""
3092:
3093: if not obj:
3094: obj = self
3095:
3096: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
3097:
3098: for entry in entries:
3099:
3100: if entry[1].meta_type == 'ECHO_resource':
3101:
3102: entry[1].link=re.sub('\:86','',entry[1].link)
3103:
3104: else:
3105:
3106: entry[1].ECHO_newViewerLink(entry[1])
3107:
3108: return "Rerenderd all links to resources in: "+self.title
3109:
3110: def __init__(self,id,title):
3111: """init"""
3112: self.id = id
3113: self.title=title
3114:
3115: def deleteSpace(self,str):
3116: """delete space at the end of a line"""
3117: if str[len(str)-1]==" ":
3118: return str[0:len(str)-1]
3119: else:
3120: return str
3121:
3122:
3123:
3124: # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt
3125:
3126: def formatAscii(self,str,url=None):
3127: """ersetze ascii umbrueche durch <br>"""
3128: #url=None
3129: if url:
3130:
3131: retStr=""
3132: words=str.split("\n")
3133:
3134: for word in words:
3135: strUrl=url%word
3136:
3137: retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
3138: str=retStr
3139: if str:
3140: return re.sub(r"[\n]","<br/>",str)
3141: else:
3142: return ""
3143:
3144: def link2html(self,str):
3145: """link2html fuer VLP muss hier noch raus"""
3146: if str:
3147:
3148: str=re.sub("\&","&",str)
3149: dom=xml.dom.minidom.parseString("<?xml version='1.0' encoding='utf-8'?><txt>"+str+"</txt>")
3150: links=dom.getElementsByTagName("link")
3151:
3152:
3153: for link in links:
3154: link.tagName="a"
3155: ref=link.getAttribute("ref")
3156: pn=link.getAttribute("page")
3157:
3158: if self.checkRef(ref):
3159: if pn:
3160: link.setAttribute("href",self.aq_parent.absolute_url()+"/references?id="+ref+"&page="+pn)
3161: else:
3162: link.setAttribute("href",self.aq_parent.absolute_url()+"/references?id="+ref)
3163:
3164:
3165: newxml=dom.toxml('utf-8')
3166:
3167: retStr=regexpTXT.search(newxml)
3168:
3169: return retStr.group(1)
3170:
3171:
3172: return ""
3173:
3174: def xml2html(self,str,quote="yes"):
3175: """link2html fuer VLP muss hier noch raus"""
3176:
3177: if str:
3178: if quote=="yes2":
3179: str=re.sub("\&","&",str)
3180: #dom=xml.dom.minidom.parseString(str)
3181: dom = NonvalidatingReader.parseString(str,"http://www.mpiwg-berlin.mpg.de/")
3182: #links=dom.getElementsByTagName("link")
3183: links=Ft.Xml.XPath.Evaluate(".//link", contextNode=dom)
3184: for link in links:
3185: #link.tagName="a"
3186:
3187: ref=link.getAttributeNS(EMPTY_NAMESPACE,"ref")
3188: pn=link.getAttributeNS(EMPTY_NAMESPACE,"page")
3189:
3190: cns=link.childNodes[0:]
3191:
3192: newLink=dom.createElementNS(EMPTY_NAMESPACE,"a")
3193: for x in cns:
3194: newLink.appendChild(x)
3195:
3196:
3197:
3198: link.parentNode.replaceChild(newLink,link)
3199: if self.checkRef(ref):
3200: if pn:
3201: newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref+"&p="+pn)
3202: else:
3203: newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref)
3204:
3205: #str= dom.toxml('utf-8')
3206: buf = cStringIO.StringIO()
3207: PrettyPrint(dom, stream=buf)
3208: str = buf.getvalue()
3209: buf.close()
3210: #str=PrettyPrint(dom.documentElement,encoding='UTF-8')
3211: #print link.toxml('utf-8')
3212: #print type(str)
3213: retStr=regexpPage.search(str)
3214:
3215: try: # hack warum fehtl manchmal page??
3216: return retStr.group(1)
3217: except:
3218: return str
3219: return ""
3220:
3221: def checkRef(self,ref):
3222: if ref[0:3]=='lit':
3223: if len(self.library_data({ 'id':ref}))>0:
3224: return 1
3225: try:
3226: if ref[0:7]=="tec_cat":
3227: return 1
3228: except:
3229: """nothing"""
3230:
3231: dbs={'vl_technology':'','vl_people':" AND complete='yes'",'vl_sites':''}
3232: res=None
3233: for db in dbs.keys():
3234: res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))
3235: return res
3236:
3237: #Ende Methode fuer vlp
3238:
3239: def PgQuoteString(self,string):
3240: """Quote string"""
3241:
3242: return libpq.PgQuoteString(string)
3243:
3244: security.declareProtected('View','getPartners')
3245: def getPartners(self):
3246: """Get list of Partners. Presently only from a subfolder partners"""
3247: if hasattr(self,'partners'):
3248: return [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])]
3249: else:
3250: return []
3251:
3252: def getInstitutions(self):
3253: """Get list of Partners. Presently only from a subfolder partners"""
3254:
3255: return [ item[1] for item in self.institutions.ZopeFind(self.institutions,obj_metatypes=['ECHO_institution'])]
3256:
3257:
3258: def getPartnersXML(self):
3259: """partner liste als xml"""
3260: partners=self.getPartners()
3261: ret="""<?xml version="1.0" encoding="utf-8" ?>
3262: <partners>"""
3263:
3264: for partner in partners:
3265: ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),partner.title)
3266:
3267: return ret+"\n</partners>"
3268:
3269: def getCollectionTree(self):
3270: """get the collection tree (list of triples (parent,child, depth)"""
3271:
3272: def getCollection(object,depth=0):
3273: depth+=1
3274: collections=[]
3275: for entry in object.__dict__.keys():
3276: element=getattr(object,entry)
3277: try:
3278: if element.meta_type=="ECHO_collection":
3279: collections.append((object,element,depth))
3280: collections+=getCollection(element,depth)
3281: except:
3282: """nothing"""
3283: return collections
3284:
3285:
3286: return getCollection(self)
3287:
3288: def getCollectionTreeIds(self):
3289: """Show the IDs of the Tree"""
3290: ret=[]
3291: for collection in self.getCollectionTree():
3292: ret.append((collection[0].getId(),collection[1].getId(),collection[2]))
3293: return ret
3294:
3295: def getResourcesHTML(self,viewerType=None,filter=None):
3296: """gebe all ressourcen aus"""
3297:
3298: def sortHTML(x,y):
3299: return cmp(x[1].title,y[1].title)
3300:
3301: ret="""<html><body><h2>Resources in ECHO</h3>"""
3302:
3303: resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
3304: ret+="""<h3>Found %i resources</h3>"""%len(resources)
3305: resources.sort(sortHTML)
3306: for resource in resources:
3307: echo_url=resource[1].absolute_url()
3308:
3309: if hasattr(resource[1],'title'):
3310: title=resource[1].title
3311: else:
3312: title="None"
3313: if filter:
3314: if re.search(filter,title):
3315: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
3316: else:
3317: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
3318:
3319: ret +="""\n</body></html>"""
3320:
3321: #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html")
3322: #self.REQUEST.RESPONSE.write(ret)
3323: return ret
3324:
3325: def getResourcesXML(self,viewerType=None,filter=None):
3326: """gebe all ressourcen aus"""
3327: ret="""<?xml version="1.0" ?>
3328: <index>"""
3329: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3330:
3331: echo_url=resource[1].absolute_url()
3332: if hasattr(resource[1],'link'):
3333: viewer_url=resource[1].link
3334: else:
3335: viewer_url="NO URL"
3336: if filter:
3337: if re.search(filter,viewer_url):
3338: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3339: else:
3340: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3341: ret +="""\n</index>"""
3342:
3343: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3344: self.REQUEST.RESPONSE.write(ret)
3345:
3346: def getFullTextsXML(self,viewerType=None,filter=None):
3347: """gebe all ressourcen aus"""
3348: ret="""<?xml version="1.0" ?>
3349: <index>"""
3350: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3351:
3352: echo_url=resource[1].absolute_url()
3353: if resource[1].getFullTextXML(noredirect="yes"):
3354: if hasattr(resource[1],'link'):
3355: viewer_url=echo_url+"/getFullTextXML"
3356: else:
3357: viewer_url="NO URL"
3358: if filter:
3359: if re.search(filter,viewer_url):
3360: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3361: else:
3362: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3363: ret +="""\n</index>"""
3364:
3365:
3366: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3367: self.REQUEST.RESPONSE.write(ret)
3368:
3369:
3370: def getMetaDatasXML(self,viewerType=None,filter=None):
3371: """gebe all ressourcen aus"""
3372: # check if the request's host part was OK
3373: http_host = self.REQUEST['HTTP_HOST']
3374: host_port = self.REQUEST['SERVER_PORT']
3375: fix_host = None
3376: if http_host and http_host.rfind(host_port) == -1:
3377: print "HTTP_HOST needs fixing!"
3378: fix_host = http_host + ":" + host_port
3379:
3380: ret="""<?xml version="1.0" ?>
3381: <index>"""
3382: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3383:
3384: echo_url=resource[1].absolute_url()
3385: if fix_host:
3386: #print "replacing ", http_host, " by ", fix_host
3387: echo_url = string.replace(echo_url, http_host, fix_host, 1)
3388:
3389: if hasattr(resource[1],'link'):
3390: meta_url=echo_url+"/getMetaDataXML"
3391: else:
3392: meta_url="NO_URL"
3393:
3394: if filter and not re.search(filter,viewer_url):
3395: continue
3396:
3397: #modificationDate=time.strptime(str(resource[1].bobobase_modification_time()),"%Y/%m/%d %H:%M:%S %Z")
3398:
3399: modificationDate=resource[1].bobobase_modification_time().strftime("%Y/%m/%d %H:%M:%S")
3400:
3401: ret+="""\n<resource resourceLink="%s" metaLink="%s" modificationDate="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(meta_url,safe='/:?'),modificationDate)
3402:
3403:
3404: ret +="""\n</index>"""
3405:
3406: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3407: self.REQUEST.RESPONSE.write(ret)
3408:
3409:
3410: def findPartners(self):
3411: """find all partners in partners"""
3412: par=self.ZopeFind(self.partners, obj_metatypes='ECHO_partner')
3413: return par
3414:
3415: def getPartnerFromID(self):
3416: """find partner form ID return object"""
3417: pa=self.REQUEST['partner']
3418: par=self.ZopeFind(self.partners, obj_ids=[pa])
3419: return par
3420:
3421: def getPartnerFromIDParameter(self, id):
3422: """ find partners from ID"""
3423: par=self.ZopeFind(self.partners, obj_ids=[id])
3424: return par
3425:
3426: def getInstitutionFromID(self,id):
3427: """ find institution from id """
3428: inst=self.ZopeFind(self.institutions, obj_ids=[id])
3429: return inst
3430:
3431:
3432: def manage_addECHO_root(self,id,title,RESPONSE=None):
3433: """Add an ECHO_root"""
3434: self._setObject(id,ECHO_root(id,title))
3435:
3436: if RESPONSE is not None:
3437: RESPONSE.redirect('manage_main')
3438:
3439: def manage_addECHO_rootForm(self):
3440: """Nothing yet"""
3441: pt=zptFile(self, 'zpt/AddECHO_root.zpt')
3442: return pt()
3443:
3444: class ECHO_copyrightType(Folder,ECHO_basis):
3445: """copyright typ"""
3446:
3447: meta_type="ECHO_copyrightType"
3448:
3449: def __init__(self,id,title,label,url):
3450: """init"""
3451: self.id=id
3452: self.title=title
3453: self.label=label
3454: self.url=url
3455:
3456: manage_options = Folder.manage_options+(
3457: {'label':'Main Config','action':'ECHO_copyrightType_config_mainForm'},
3458: )
3459:
3460: def ECHO_copyrightType_config_mainForm(self):
3461: """change form"""
3462: pt=zptFile(self, 'zpt/ChangeECHO_copyrightType')
3463: pt.content_type="text/html"
3464: return pt()
3465:
3466: def ECHO_copyrightType_config_main(self,title,label,url,RESPONSE=None):
3467: """change"""
3468: self.title=title
3469: self.label=label
3470: self.url=url
3471:
3472: if RESPONSE is not None:
3473: RESPONSE.redirect('manage_main')
3474:
3475: def manage_addECHO_copyrightTypeForm(self):
3476: """Form for adding a ressource"""
3477: pt=zptFile(self, 'zpt/AddECHO_copyrightTypeForm.zpt')
3478: return pt()
3479:
3480:
3481: def manage_addECHO_copyrightType(self,id,title,label,url,RESPONSE=None):
3482: """addaresource"""
3483:
3484: newObj=ECHO_copyrightType(id,title,label,url)
3485:
3486: self._setObject(id,newObj)
3487:
3488: if RESPONSE is not None:
3489: RESPONSE.redirect('manage_main')
3490:
3491:
3492:
3493: class ECHO_partner(Image,Persistent,ECHO_basis):
3494: """ECHO Partner"""
3495:
3496: meta_type="ECHO_partner"
3497:
3498: def __init__(self, id, title,url, file, copyrightType, person, email, country, color, content_type='', precondition=''):
3499: self.__name__=id
3500: self.title=title
3501: self.url=url
3502: self.person=person
3503: self.email=email
3504: self.country=country
3505: self.color=color
3506: self.precondition=precondition
3507: self.copyrightType=copyrightType
3508: data, size = self._read_data(file)
3509: content_type=self._get_content_type(file, data, id, content_type)
3510: self.update_data(data, content_type, size)
3511:
3512: manage_options = Image.manage_options+(
3513: {'label':'Partner Information','action':'ECHO_partner_config'},
3514: )
3515:
3516:
3517: def changeECHO_partner(self,url,copyrightType,person, email, country, color, RESPONSE=None):
3518: """Change main information"""
3519: self.url=url
3520: self.person=person
3521: self.email=email
3522: self.country=country
3523: self.color=color
3524: self.copyrightType=copyrightType
3525: if RESPONSE is not None:
3526: RESPONSE.redirect('manage_main')
3527:
3528:
3529:
3530: def ECHO_partner_config(self):
3531: """Main configuration"""
3532: if not hasattr(self,'url'):
3533: self.url=""
3534: pt=zptFile(self, 'zpt/ChangeECHO_partner.zpt')
3535: return pt()
3536:
3537:
3538: manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(),
3539: Kind='ECHO_partner',kind='ECHO_partner')
3540:
3541:
3542:
3543: def manage_addECHO_partner(self, id, url, person, email, country, color, file=None, copyrightType='', title='', precondition='', content_type='',
3544: REQUEST=None):
3545: """
3546: Add a new ECHO_partner object.
3547:
3548: Creates a new ECHO_partner object 'id' with the contents of 'file'.
3549: Based on Image.manage_addImage
3550: """
3551:
3552: id=str(id)
3553: title=str(title)
3554: content_type=str(content_type)
3555: precondition=str(precondition)
3556:
3557: id, title = OFS.Image.cookId(id, title, file)
3558:
3559: self=self.this()
3560:
3561: # First, we create the image without data:
3562: self._setObject(id, ECHO_partner(id,title,url,'',copyrightType, person, email, country, color, content_type, precondition))
3563:
3564: # Now we "upload" the data. By doing this in two steps, we
3565: # can use a database trick to make the upload more efficient.
3566: if file:
3567: self._getOb(id).manage_upload(file)
3568: if content_type:
3569: self._getOb(id).content_type=content_type
3570:
3571: if REQUEST is not None:
3572: try: url=self.DestinationURL()
3573: except: url=REQUEST['URL1']
3574: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
3575: return id
3576:
3577: class ECHO_linkList(ZopePageTemplate,ECHO_basis):
3578: """LinkList Objekt"""
3579: meta_type="ECHO_linkList"
3580:
3581: _default_content_fn = os.path.join(package_home(globals()), 'html/ECHO_pageTemplateDefault.html')
3582:
3583: manage_options = ZopePageTemplate.manage_options+(
3584: {'label':'Main Config','action':'changeECHO_linkListWeightForm'},
3585: )
3586:
3587: def content_html(self):
3588: """content_html"""
3589: return ECHO_basis.content_html(self,'pageTemplate')
3590:
3591: def changeECHO_linkListWeightForm(self):
3592: """change"""
3593: pt=zptFile(self, 'zpt/ChangeECHO_linkListTemplate.zpt')
3594: return pt()
3595:
3596: def changeECHO_linkListWeight(self,contentType,label,RESPONSE=None):
3597: """change"""
3598: self.contentType=contentType
3599: self.label=label
3600:
3601: if RESPONSE is not None:
3602: RESPONSE.redirect('manage_main')
3603:
3604: def getLabel(self):
3605: if hasattr(self,'label'):
3606: return self.label.encode('utf-8')
3607: else:
3608: return 0
3609:
3610: def getcontentType(self):
3611: """get contentType"""
3612: if hasattr(self,'contentType'):
3613: return self.contentType
3614: else:
3615: return 0
3616:
3617: def __init__(self, id, label, title=None, text=None, contentType=None):
3618: self.id = str(id)
3619: self.title=title
3620: self.label=label
3621: self.ZBindings_edit(self._default_bindings)
3622: if text is None:
3623: text = ''
3624: self.pt_edit(text, contentType)
3625:
3626:
3627:
3628:
3629: def manage_addECHO_linkListForm(self):
3630: """Form for adding"""
3631: pt=zptFile(self, 'zpt/AddECHO_linkListTemplate.zpt')
3632: return pt()
3633:
3634:
3635: def manage_addECHO_linkList(self, id, label,contentType=0,title=None, text=None,
3636: REQUEST=None, submit=None):
3637: """Add a LinkList with optional file content."""
3638:
3639: id = str(id)
3640: if REQUEST is None:
3641: self._setObject(id, ECHO_linkList(id, label, text))
3642: ob = getattr(self, id)
3643: setattr(ob,'contentType',contentType)
3644: if title:
3645: ob.pt_setTitle(title)
3646: return ob
3647: else:
3648: file = REQUEST.form.get('file')
3649: headers = getattr(file, 'headers', None)
3650: if (headers is None) or (not file.filename):
3651: zpt = ECHO_linkList(id, file)
3652: else:
3653: zpt = ECHO_linkList(id, label,'', file, headers.get('contentType'))
3654:
3655: self._setObject(id, zpt)
3656: ob = getattr(self, id)
3657: if title:
3658: ob.pt_setTitle(title)
3659:
3660: try:
3661: u = self.DestinationURL()
3662: except AttributeError:
3663: u = REQUEST['URL1']
3664:
3665: if submit == " Add and Edit ":
3666: u = "%s/%s" % (u, urllib.quote(id))
3667: REQUEST.RESPONSE.redirect(u+'/manage_main')
3668: return ''
3669:
3670:
3671: class ECHO_support(Folder,ECHO_basis):
3672: """gefoerdert durch"""
3673: meta_type="ECHO_support"
3674:
3675:
3676:
3677: def __init__(self,id,institutions=None):
3678: """init"""
3679: self.id=id
3680: self.title=''
3681: self.institutions=toList(institutions)
3682:
3683: def getSupporter(self):
3684: """return institutions"""
3685: if self.institutions:
3686: return self.institutions
3687: else:
3688: return []
3689:
3690: manage_options = Folder.manage_options+(
3691: {'label':'Main Config','action':'ECHO_support_configForm'},
3692: )
3693:
3694: def ECHO_support_configForm(self):
3695: """change form"""
3696: pt=zptFile(self, 'zpt/ChangeECHO_support')
3697: pt.content_type="text/html"
3698: return pt()
3699:
3700: def ECHO_support_config(self,institutions=None,RESPONSE=None):
3701: """change"""
3702: self.institutions=toList(institutions)
3703:
3704: if RESPONSE is not None:
3705: RESPONSE.redirect('manage_main')
3706:
3707:
3708: def manage_addECHO_supportForm(self):
3709: """Form for adding"""
3710: pt=zptFile(self, 'zpt/AddECHO_support.zpt')
3711: return pt()
3712:
3713: def manage_addECHO_support(self, id,institutions=None,RESPONSE=None):
3714: """add the copyright"""
3715:
3716: meta_type="ECHO_support"
3717:
3718:
3719: self._setObject(id, ECHO_support(id,institutions))
3720:
3721: if RESPONSE is not None:
3722: RESPONSE.redirect('manage_main')
3723:
3724:
3725: class ECHO_institution(Image,Persistent,ECHO_basis):
3726: """ECHO Institution"""
3727:
3728: meta_type="ECHO_institution"
3729:
3730: def __init__(self, id, title,url, file, person, email, country, content_type='', precondition=''):
3731: self.__name__=id
3732: self.title=title
3733: self.url=url
3734: self.person=person
3735: self.email=email
3736: self.country=country
3737: self.precondition=precondition
3738: data, size = self._read_data(file)
3739: content_type=self._get_content_type(file, data, id, content_type)
3740: self.update_data(data, content_type, size)
3741:
3742: manage_options = Image.manage_options+(
3743: {'label':'Institution Information','action':'ECHO_institution_config'},
3744: )
3745:
3746:
3747: def changeECHO_institution(self,url,person, email, country,RESPONSE=None):
3748: """Change main information"""
3749: self.url=url
3750: self.person=person
3751: self.email=email
3752: self.country=country
3753: if RESPONSE is not None:
3754: RESPONSE.redirect('manage_main')
3755:
3756:
3757:
3758: def ECHO_institution_config(self):
3759: """Main configuration"""
3760: if not hasattr(self,'url'):
3761: self.url=""
3762: pt=zptFile(self, 'zpt/ChangeECHO_institution.zpt')
3763: return pt()
3764:
3765:
3766: manage_addECHO_institutionForm=DTMLFile('dtml/ECHO_institutionAdd',globals(),
3767: Kind='ECHO_institution',kind='ECHO_institution')
3768:
3769:
3770:
3771: def manage_addECHO_institution(self, id, url, person, email, country, file=None, title='', precondition='', content_type='',
3772: REQUEST=None):
3773: """
3774: Add a new ECHO_institution object.
3775:
3776: Creates a new ECHO_institution object 'id' with the contents of 'file'.
3777: Based on Image.manage_addImage
3778: """
3779:
3780: id=str(id)
3781: title=str(title)
3782: content_type=str(content_type)
3783: precondition=str(precondition)
3784:
3785: id, title = OFS.Image.cookId(id, title, file)
3786:
3787: self=self.this()
3788:
3789: # First, we create the image without data:
3790: self._setObject(id, ECHO_institution(id,title,url,'', person, email, country, content_type, precondition))
3791:
3792: # Now we "upload" the data. By doing this in two steps, we
3793: # can use a database trick to make the upload more efficient.
3794: if file:
3795: self._getOb(id).manage_upload(file)
3796: if content_type:
3797: self._getOb(id).content_type=content_type
3798:
3799: if REQUEST is not None:
3800: try: url=self.DestinationURL()
3801: except: url=REQUEST['URL1']
3802: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
3803: return id
3804:
3805: def repairCoords(self):
3806: """updates map coordinates to new MapArea objects"""
3807: msg = ""
3808: for cols in self.ZopeFind(self, obj_metatypes=['ECHO_collection','ECHO_resource'], search_sub=1):
3809: col = cols[1]
3810: if not hasattr(col, 'coords'):
3811: continue
3812: print "fixing: ", col.id
3813: msg += "fixing: "+col.id+"\n"
3814: coords = col.coords
3815: if len(coords) > 0:
3816: # delete old MapAreas
3817: for areas in self.ZopeFind(col, obj_metatypes=['MapArea']):
3818: #area = areas[1]
3819: id = areas[0]
3820: print " deleting: ", id
3821: msg += " deleting: "+id+"\n"
3822: col._delObject(id)
3823: # add new MapAreas
3824: areacnt = 0
3825: for coord in coords:
3826: if len(coord) < 4:
3827: continue
3828: type = col.viewClassification
3829: if type == 'view point':
3830: type = 'arrow'
3831: if type is None:
3832: if len(coord) > 4:
3833: type = 'arrow'
3834: else:
3835: type = 'area'
3836: newid = "a%02d"%areacnt
3837: areacnt += 1
3838: area = MapArea(newid, coord, type=type)
3839: print " adding: ", newid
3840: msg += " adding: "+newid+"\n"
3841: col.addMapArea(area)
3842: msg += "\nDone!"
3843: return msg
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>