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: import string
13: import re
14: import os
15: import OFS.Image
16: from types import *
17: from OFS.Cache import Cacheable
18: from OFS.Image import Image
19: from Globals import DTMLFile
20: from OFS.Folder import Folder
21: from OFS.SimpleItem import SimpleItem
22: from AccessControl import ClassSecurityInfo
23: from AccessControl.User import UserFolder
24: from Globals import InitializeClass
25: from Globals import DTMLFile
26: import Globals
27: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
28: from Products.PageTemplates.PageTemplate import PageTemplate
29: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
30: from Globals import Persistent, package_home
31: from Acquisition import Implicit
32: from ECHO_helpers import displayTypes
33: import urllib
34: import time
35:
36: try:
37: from psycopg import libpq
38: except:
39: try:
40: from pyPgSQL import libpq
41: except:
42: print "ECHO_collection: Warning - No libpq imported!"
43:
44: import xml.dom.minidom
45:
46: import urllib
47: import xml.dom.minidom
48: from ECHO_graphicalOverview import javaHandler,javaScriptMain
49: import ECHO_helpers
50:
51: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
52: """Rerender all Links"""
53: ret=""
54:
55: if not obj:
56: obj = self
57:
58: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource'],search_sub=1)
59:
60: for entry in entries:
61: if entry[1].meta_type == 'ECHO_resource':
62: try:
63: entry[1].ECHO_getResourceMD(template="no")
64: if "title" in types:
65: entry[1].generate_title()
66: if "label" in types:
67: entry[1].generate_label()
68: ret+="OK:"+entry[0]+"-- "+entry[1].getTitle().decode('utf-8')+"-- "+entry[1].getTitle().decode('utf-8')+"<br>"
69: except:
70: ret+="Error:"+entry[0]+"<br>"
71:
72:
73:
74:
75: return "<html><body>"+ret+"Rerenderd all links to resources in: "+self.title+"</html></body>"
76:
77: def reloadMetaDataFromStorage(self,RESPONSE=None):
78: """copy metadata from the storage to ECHO"""
79: ret=""
80: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
81:
82: for resource in resources:
83: x=str(resource[1].copyIndex_meta2echo_resource())+"<br>"
84: ret+=x
85: #print x
86:
87:
88: if RESPONSE is not None:
89: #RESPONSE.redirect('./manage_main')
90: return "<html><body>"+ret+"</html></body>"
91:
92: return ret
93:
94: def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None):
95: """rdf"""
96:
97: ret=""
98: about="""<RDF:Description RDF:about="%s">"""
99: name="""<ECHONAVIGATION:name>%s</ECHONAVIGATION:name>"""
100: link="""<ECHONAVIGATION:link xlink:href="%s">%s</ECHONAVIGATION:link>"""
101: clickable="""<ECHONAVIGATION:linkClickable>%s</ECHONAVIGATION:linkClickable>"""
102: #link="""<ECHONAVIGATION:link RDF:about="%s"/>"""
103: type="""<ECHONAVIGATION:type>%s</ECHONAVIGATION:type>"""
104: #xlink="""<ECHONAVIGATION:xlink xlink:href="%s"/>"""
105: if not urn:
106: #urn="urn:"+re.sub('/',':',self.absolute_url())
107: urn=self.absolute_url()
108: about2=about%urn
109: if not nameDef:
110: if hasattr(self,'label') and not (self.label==""):
111: name2=name%self.label
112: elif not self.title=="":
113: name2=name%self.title
114: else:
115: name2=name%self.getId()
116:
117: name2=re.sub('&','&',name2)
118: else:
119: name2=name%nameDef
120:
121: linkURL=re.sub('http:','',linkURL)
122: linkURL2=re.sub('&','&',linkURL)
123: link2=link%(("http:"+linkURL2),("http:"+urllib.quote(linkURL)))
124: clickable2=clickable%"true"
125:
126: if not typeName:
127: type2=type%self.meta_type
128: else:
129: type2=type%typeName
130:
131: #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
132: ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
133: return ret
134:
135: def getCopyrightsFromForm(self,argv):
136: medias={}
137: partners={}
138: copyrights={}
139:
140: copyrightsFinal=[]
141: for arg in argv.keys():
142:
143: if arg[0:5]=='media':
144: nm=int(arg[5:])
145: medias[nm]=argv[arg]
146: elif arg[0:5]=='partn':
147: nm=int(arg[5:])
148: partners[nm]=argv[arg]
149: elif arg[0:5]=='copyr':
150: nm=int(arg[5:])
151: copyrights[nm]=argv[arg]
152:
153:
154:
155: copyrightsList=[(medias[nm],partners[nm],copyrights[nm]) for nm in medias.keys()]
156: for copyright in copyrightsList:
157:
158: if copyright[2]=='institution0000':
159: copyrightsFinal.append((copyright[0],copyright[1],self.getPartnerCopyright(copyright[1],'')))
160: else:
161: if not copyright[0]=='':
162: copyrightsFinal.append(copyright)
163:
164:
165: return copyrightsFinal
166:
167: #List of different types for the graphical linking viewer
168: viewClassificationListMaster=['view point','area']
169:
170:
171: def checkDiffs(self,metadict):
172: """check differences"""
173:
174:
175:
176:
177: def NoneToEmpty(obj):
178: if obj:
179: return obj
180: else:
181: return ""
182:
183:
184:
185: diffs={}
186:
187: tags=self.findTagsFromMapping(self.contentType)
188: self.referencetypes=tags[2]
189: self.fields=tags[3]
190:
191:
192: for field in tags[1]:
193: try:
194: if (NoneToEmpty(self.getFieldValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
195: diffs[self.getFieldTag(tags,field)]=1
196: else:
197:
198: diffs[self.getFieldTag(tags,field)]=0
199: except:
200: diffs[self.getFieldTag(tags,field)]=0
201:
202: return diffs
203:
204: def content_html(self,type):
205: """template fuer content"""
206: #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
207: #
208: #if templates:
209: # return templates[0][1]()
210:
211: if hasattr(self,type+"_template"):
212: obj=getattr(self,type+"_template")
213: return obj()
214: else:
215: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
216: pt.content_type="text/html"
217: return pt()
218:
219: def toList(field):
220: """Einzelfeld in Liste umwandeln"""
221: if type(field)==StringType:
222: return [field]
223: else:
224: return field
225:
226: def getText(nodelist):
227:
228: rc = ""
229: for node in nodelist:
230: if node.nodeType == node.TEXT_NODE:
231: rc = rc + node.data
232: return rc
233:
234:
235: def sendFile(self, filename, type):
236: """sends an object or a local file (in the product) as response"""
237: paths = filename.split('/')
238: object = self
239: # look for an object called filename
240: for path in paths:
241: if hasattr(object, path):
242: object = getattr(object, path)
243: else:
244: object = None
245: break
246: if object:
247: # if the object exists then send it
248: return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
249: else:
250: # send a local file with the given content-type
251: fn = os.path.join(package_home(globals()), filename)
252: self.REQUEST.RESPONSE.setHeader("Content-Type", type)
253: self.REQUEST.RESPONSE.write(file(fn).read())
254: return
255:
256: class BrowserCheck:
257: """check the browsers request to find out the browser type"""
258:
259: def __init__(self, zope):
260: self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
261: self.isN4 = (string.find(self.ua, 'Mozilla/4.') > -1) and (string.find(self.ua, 'MSIE') < 0)
262: self.isIE = string.find(self.ua, 'MSIE') > -1
263: self.nav = self.ua[string.find(self.ua, '('):]
264: ie = string.split(self.nav, "; ")[1]
265: if string.find(ie, "MSIE") > -1:
266: self.versIE = string.split(ie, " ")[1]
267: self.isMac = string.find(self.ua, 'Macintosh') > -1
268: self.isWin = string.find(self.ua, 'Windows') > -1
269: self.isIEWin = self.isIE and self.isWin
270: self.isIEMac = self.isIE and self.isMac
271:
272:
273:
274:
275: def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None):
276: """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
277: def updateTextToolNode(tag,value):
278: #print dom,tag,value
279: metanode=dom.getElementsByTagName('texttool')[0]
280: try:
281: nodeOld=metanode.getElementsByTagName(tag)
282: except:
283: nodeOld=None
284:
285: if nodeOld:
286: metanode.removeChild(nodeOld[0]).unlink()
287:
288: node=dom.createElement(tag)
289: nodetext=dom.createTextNode(value)
290: node.appendChild(nodetext)
291: metanode.appendChild(node)
292:
293: if xmlfrag:
294: geturl="""<?xml version="1.0" ?>
295: <resource type="MPIWG">
296: <meta>
297: <bib type="Book">
298: </bib>
299: </meta>
300: </resource>"""
301: dom=xml.dom.minidom.parseString(geturl)
302: else:
303: try:
304: geturl=""
305: for line in urllib.urlopen(url).readlines():
306: geturl=geturl+line
307:
308:
309: except:
310: return (None,"Cannot open: "+url)
311:
312: try:
313: dom=xml.dom.minidom.parseString(geturl)
314: except:
315: return (None,"Cannot parse: "+url+"<br>"+geturl)
316:
317:
318:
319: metanodes=dom.getElementsByTagName('bib')
320:
321: if not metanodes:
322: metanodes=dom.getElementsByTagName('archimedes')
323:
324: metanode=metanodes[0]
325:
326: for metaData in metadict.keys():
327:
328: try:
329: nodeOld=metanode.getElementsByTagName(metaData)
330: except:
331: nodeOld=None
332:
333: if nodeOld:
334: metanode.removeChild(nodeOld[0]).unlink()
335: else:
336: # try also old writing rule - instead of _:
337: try:
338: nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
339: except:
340: nodeOld=None
341:
342: if nodeOld:
343: metanode.removeChild(nodeOld[0]).unlink()
344:
345: metanodeneu=dom.createElement(metaData)
346: try:
347: metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
348: except:
349: metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
350: metanodeneu.appendChild(metanodetext)
351: metanode.appendChild(metanodeneu)
352:
353:
354:
355:
356:
357: if project:
358: updateTextToolNode('project',project)
359:
360: if startpage:
361: updateTextToolNode('startpage',startpage)
362:
363: if topbar:
364: updateTextToolNode('toptemplate',topbar)
365:
366: if thumbtemplate:
367: updateTextToolNode('thumbtemplate',thumbtemplate)
368:
369: if xslt:
370: updateTextToolNode('xslt',xslt)
371:
372:
373: if digiliburlprefix:
374: updateTextToolNode('digiliburlprefix',digiliburlprefix)
375:
376: return dom.toxml().encode('utf-8')
377:
378:
379:
380: def readMetadata(url):
381: """Methode zum Auslesen der Metadateninformation zu einer Resource
382: Vorerst noch Typ bib"""
383:
384: metadict={}
385: try:
386: geturl=""
387: for line in urllib.urlopen(url).readlines():
388: geturl=geturl+line
389:
390:
391: except:
392: return (None,"Cannot open: "+url)
393:
394: try:
395: dom=xml.dom.minidom.parseString(geturl)
396: except:
397: return (None,"Cannot parse: "+url+"<br>"+geturl)
398:
399: metanode=dom.getElementsByTagName('bib')
400: metadict['bib_type']='Book'
401: if len(metanode)==0:
402: metanode=dom.getElementsByTagName('archimedes')
403: metadict['bib_type']='Archimedes'
404:
405:
406: if not len(metanode)==0:
407: metacontent=metanode[0].childNodes
408:
409: try:
410: metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
411: except:
412: """nothing"""
413:
414: for node in metacontent:
415: try:
416: #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
417: metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
418: except:
419: """nothing"""
420:
421:
422: return metadict,""
423:
424:
425: def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs,viewClassification=""):
426:
427: """Allegemeine Informationen zu einer ECHO Collection"""
428:
429: self.viewClassification=viewClassification
430:
431: self.label = label
432: self.title=title
433: self.description=description
434: self.contentType=contentType
435: self.responsible=responsible
436: self.credits=toList(credits)
437: self.weight=weight
438:
439: coords=[]
440: #coordinates of for rectangles
441:
442:
443: if coordstrs:
444: for coordstr in coordstrs:
445:
446: try:
447: temco=coordstr.split(",")
448: except:
449: temco=[]
450:
451: coords.append(temco)
452:
453:
454: self.coords=coords[0:]
455:
456: class ECHO_copyright(Folder):
457: """Copyright informationen"""
458: meta_type="ECHO_copyright"
459:
460:
461:
462: def __init__(self,id,title,copyrights):
463: """init"""
464: self.title=title
465: self.id=id
466: self.copyrights=copyrights[0:]
467:
468: def getCopyrights(self):
469: """return coyprights"""
470: return self.copyrights
471:
472: manage_options = Folder.manage_options+(
473: {'label':'Main Config','action':'ECHO_copyright_configForm'},
474: )
475:
476: def ECHO_copyright_configForm(self):
477: """change form"""
478: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_copyright').__of__(self)
479: pt.content_type="text/html"
480: return pt()
481:
482: def ECHO_copyright_config(self,title,RESPONSE=None):
483: """change"""
484: self.title=title
485: self.copyrights=[]
486: self.copyrights=getCopyrightsFromForm(self,self.REQUEST.form)[0:]
487:
488: if RESPONSE is not None:
489: RESPONSE.redirect('manage_main')
490:
491:
492: def manage_addECHO_copyrightForm(self):
493: """Form for adding"""
494: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_copyright.zpt').__of__(self)
495: return pt()
496:
497: def manage_addECHO_copyright(self, id,title,RESPONSE=None):
498: """add the copyright"""
499:
500: meta_type="ECHO_copyright"
501:
502: #first generate copyrights as list of tripels (mediaType,partner,copyrightType)
503:
504:
505:
506: self._setObject(id, ECHO_copyright(id, title,getCopyrightsFromForm(self,self.REQUEST.form)))
507:
508: if RESPONSE is not None:
509: RESPONSE.redirect('manage_main')
510:
511: class ECHO_layoutTemplate(ZopePageTemplate):
512: """Create a layout Template for different purposes"""
513:
514: meta_type="ECHO_layoutTemplate"
515:
516: def __init__(self, id, text=None, content_type=None,EchoType=None):
517: self.id = str(id)
518:
519:
520:
521: self.ZBindings_edit(self._default_bindings)
522: if text is None:
523: self._default_content_fn = os.path.join(package_home(globals()),
524: 'zpt/ECHO_%s_template_standard.zpt'%EchoType)
525: text = open(self._default_content_fn).read()
526: self.pt_edit(text, content_type)
527:
528:
529: """change form"""
530:
531:
532: def manage_addECHO_layoutTemplateForm(self):
533: """Form for adding"""
534: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_layoutTemplate.zpt').__of__(self)
535: return pt()
536:
537: from urllib import quote
538:
539:
540: def manage_addECHO_layoutTemplate(self, EchoType,title=None,REQUEST=None):
541: "Add a Page Template with optional file content."
542: if type(EchoType)==StringType:
543: EchoTypes=[EchoType]
544: else:
545: EchoTypes=EchoType
546:
547: for singleType in EchoTypes:
548:
549: id = str(singleType)+"_template"
550: if REQUEST is None:
551: self._setObject(id, ECHO_layoutTemplate(id, text,EchoType=singleType))
552: ob = getattr(self, id)
553:
554: if title:
555: ob.pt_setTitle(title)
556: return ob
557: else:
558: file = REQUEST.form.get('file')
559: headers = getattr(file, 'headers', None)
560: if headers is None or not file.filename:
561: zpt = ECHO_layoutTemplate(id,EchoType=singleType)
562: else:
563: zpt = ECHO_layoutTemplate(id, file, headers.get('content_type'))
564:
565: self._setObject(id, zpt)
566: ob = getattr(self, id)
567: if title:
568: ob.pt_setTitle(title)
569:
570: try:
571: u = self.DestinationURL()
572: except AttributeError:
573: u = REQUEST['URL1']
574:
575:
576: REQUEST.RESPONSE.redirect(u+'/manage_main')
577: return ''
578:
579:
580:
581: class ECHO_resource(Folder,Persistent):
582: """ECHO Ressource"""
583: security=ClassSecurityInfo()
584: meta_type='ECHO_resource'
585:
586: viewClassificationList=viewClassificationListMaster
587:
588: getSubCols = ECHO_helpers.getSubCols
589:
590: security.declareProtected('View','index_html')
591:
592: def showRDF(self):
593: """showrdf"""
594: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
595: ret="""<?xml version="1.0" encoding="utf-8"?>\n<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ECHONAVIGATION="http://www.echo.eu/rdf#">\n"""
596: ret+=self.getRDF(urn="echo:collectionroot")+"\n"
597:
598: ret+="""</RDF:RDF>"""
599: return ret
600:
601: def getRDF(self,urn=None):
602: """rdf"""
603: ret=getRDFDescription(self,self.link,urn=urn)
604: return ret+self.createSubElementRDF(urn=urn)
605:
606:
607: def createSubElementRDF(self,urn=None):
608: """rdf list"""
609: if not urn:
610: urn=self.absolute_url()
611: ret=""
612:
613: rettemp="""<RDF:Seq RDF:about="%s">\n"""%urn
614: flag=0
615:
616: li="""<RDF:li RDF:resource="%s" />\n"""
617: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
618: nurn=self.absolute_url()+'/getFullTextXML'
619: rettemp+=li%nurn
620: flag=1
621: if not ('<error>' in self.getImageView(noredirect='Yes')):
622: nurn=self.absolute_url()+'/getImageView'
623: rettemp+=li%nurn
624: flag=1
625:
626:
627: if not ('<error>' in self.showMetaDataXML()):
628: nurn=self.absolute_url()+'/showMetaDataXML'
629: rettemp+=li%nurn
630: flag=1
631:
632: rettemp+="</RDF:Seq>"
633:
634: if flag==1:
635: ret+=rettemp
636:
637: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
638: nurn=self.absolute_url()+'/getFullTextXML'
639: ret+=getRDFDescription(self,self.absolute_url()+'/getFullTextXML',urn=nurn,nameDef="Fulltext",typeName="ECHO_fulltext")
640:
641: if not ('<error>' in self.getImageView(noredirect='Yes')):
642: nurn=self.absolute_url()+'/getImageView'
643: ret+=getRDFDescription(self,self.absolute_url()+'/getImageView',urn=nurn,nameDef="Image View",typeName="ECHO_imageview")
644:
645: if not ('<error>' in self.showMetaDataXML()):
646: nurn=self.absolute_url()+'/showMetaDataXML'
647: ret+=getRDFDescription(self,self.absolute_url()+'/showMetaDataXML',urn=nurn,nameDef="Metadata",typeName="ECHO_metaData")
648:
649: return ret
650:
651: def getAccessRightSelectorHTML(self,outlook="select"):
652: """htmlselector"""
653: values=['free','mpiwg']
654:
655: if outlook=="select":
656: ret="""<select name="%s">"""%self.getId()
657:
658: for value in values:
659: if value==self.getAccessRightMD():
660: ret+="<option selected>%s</option>"%value
661: else:
662: ret+="<option>%s</option>"%value
663: return ret+"</select>"
664:
665: else:
666: ret=""
667: for value in values:
668:
669: if value==self.getAccessRightMD():
670: ret+="""<input type="radio" name="%s" value="%s" checked>%s"""%(self.getId(),value,value)
671: else:
672: ret+="""<input type="radio" name="%s" value="%s">%s"""%(self.getId(),value,value)
673: return ret
674:
675:
676:
677: def getAccessRightMD(self):
678: """set accessright"""
679: url=self.metalink
680:
681: try:
682: geturl=""
683: for line in urllib.urlopen(url).readlines():
684: geturl=geturl+line
685:
686:
687: except:
688: return (None,"Cannot open: "+url)
689:
690: try:
691: dom=xml.dom.minidom.parseString(geturl)
692: root=dom.getElementsByTagName('resource')[0]
693: except:
694: return (None,"Cannot parse: "+url+"<br>"+geturl)
695:
696: internal=dom.getElementsByTagName('internal')
697: if internal:
698: institution=dom.getElementsByTagName('institution')
699: return getText(institution[0].childNodes)
700:
701: free=dom.getElementsByTagName('free')
702: if free:
703: return "free"
704:
705: return "free" #default free
706:
707: def changeAccessRightMD(self,accessright,RESPONSE=None):
708: """change the rights"""
709:
710: params="accessright=%s"%accessright
711:
712:
713: #print urllib.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read()
714:
715:
716: urllib.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()
717:
718:
719: if RESPONSE is not None:
720: RESPONSE.redirect('manage_main')
721:
722:
723: def setAccessRightXML(self,accessright):
724: """set accessright"""
725: url=self.metalink
726:
727: try:
728: geturl=""
729: for line in urllib.urlopen(url).readlines():
730: geturl=geturl+line
731:
732:
733: except:
734: return (None,"Cannot open: "+url)
735:
736: try:
737: dom=xml.dom.minidom.parseString(geturl)
738: root=dom.getElementsByTagName('resource')[0]
739: except:
740: return (None,"Cannot parse: "+url+"<br>"+geturl)
741:
742: metanodes=dom.getElementsByTagName('access-conditions')
743:
744: if not metanodes:
745: nodenew=dom.createElement('access-conditions')
746: root.appendChild(nodenew)
747: metanode=nodenew
748: else:
749: metanode=metanodes[0]
750:
751: accesses=metanode.getElementsByTagName('access')
752:
753: if not accesses:
754: nodenew2=dom.createElement('access')
755: metanode.appendChild(nodenew2)
756: metanode2=nodenew2
757: else:
758: metanode2=accesses[0]
759:
760: internal=metanode.getElementsByTagName('internal')
761:
762: if internal:
763: metanode2.removeChild(internal[0]).unlink()
764:
765: free=metanode.getElementsByTagName('free')
766:
767: if free:
768: metanode2.removeChild(internal[0]).unlink()
769:
770:
771: if accessright=='free':
772: nodenew3=dom.createElement('free')
773: metanode2.appendChild(nodenew3)
774: elif accessright=='mpiwg':
775: nodenew3=dom.createElement('internal')
776: nodenew4=dom.createElement('institution')
777: metanodetext=dom.createTextNode('mpiwg')
778: nodenew4.appendChild(metanodetext)
779: nodenew3.appendChild(nodenew4)
780: metanode2.appendChild(nodenew3)
781:
782: return dom.toxml().encode('utf-8')
783:
784: def setStartPageForm(self):
785: """Form for changing the startpage"""
786:
787:
788: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resourceStartPage.zpt').__of__(self)
789: pt.content_type="text/html"
790: return pt()
791:
792:
793: def setStartPage(self,startpage=None,RESPONSE=None):
794: """set start page, if no startpage defined use the generic one of the resource"""
795:
796: if (not (type(startpage)==StringType)) and ("__generic" in startpage): # checke ob generic in der liste
797: startpage=self.absolute_url()+"/startpage_html"
798:
799: if (not startpage) or (startpage=="__generic"):
800: startpage=self.absolute_url()+"/startpage_html"
801:
802:
803: params="startpage=%s"%startpage
804:
805: urllib.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()
806:
807:
808: path=self.metalink
809:
810: path=re.sub(self.REQUEST['SERVER_URL'],'',path)
811: path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path)
812:
813: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
814: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server
815: path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server
816: path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server
817: path=re.sub('/index.meta','',path)
818:
819:
820: urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
821:
822: if RESPONSE is not None:
823: RESPONSE.redirect('manage_main')
824:
825: def changeViewerTemplateSetForm(self):
826: """change the viewer template set"""
827: pt=PageTemplateFile('Products/ECHO_content/zpt/changeResourceViewerTemplateSet').__of__(self)
828: return pt()
829:
830:
831: def getTextToolsField(self,name,default=''):
832: """Lese Textoolsfelder aus index.meta im path aus"""
833:
834: try:
835: dom=xml.dom.minidom.parse(self.metalink)
836: node=dom.getElementsByTagName('texttool')[0] #getNode
837: subnode=node.getElementsByTagName(name)[0]
838:
839: # bei text wird nur der Folder gebraucht
840: if name=="text":
841: splitted=getText(subnode.childNodes).split("/")
842: return splitted[len(splitted)-2]
843: else:
844: return getText(subnode.childNodes)
845: except:
846: return default
847:
848:
849: def changeViewerTemplateSet(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None):
850: """changeit"""
851:
852: paramList=['project','startpage','xslt','thumbtemplate','topbar','digiLibTemplate','digiliburlprefix']
853:
854:
855: #writeMetadata(self.metalink,self.metaDataHash,project,None,xslt,thumbtemplate,topbar,digiLibTemplate)
856:
857: params="project=%s&xslt=%s&thumbtemplate=%s&topbar=%s&digiLibTemplate=%s&digiliburlprefix=%s"%(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix)
858:
859:
860: urllib.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()
861:
862: #print self.absolute_url()+'/newMetaXML'+urllib.quote'?'+params)
863: # hack Pfad auf die Dokumente
864: path=self.metalink
865:
866:
867:
868: path=re.sub('/index.meta','',path)
869:
870: path=re.sub(self.REQUEST['SERVER_URL'],'',path)
871: path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path)
872:
873: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
874: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
875: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server
876:
877: path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server
878: path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server
879:
880: return urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
881:
882: if RESPONSE is not None:
883: RESPONSE.redirect('manage_main')
884:
885:
886: def getTitle(self):
887: """title"""
888: try:
889: return self.title.encode('utf-8','ignore')
890: except:
891: self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
892: return self.title.encode('utf-8','ignore')
893:
894: def getLabel(self):
895: """title"""
896: try:
897: return self.label.encode('utf-8','ignore')
898: except:
899: self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
900: return self.label.encode('utf-8','ignore')
901:
902: def content_html(self):
903: """template fuer content"""
904: return content_html(self,'resource')
905:
906: def getViewClassification(self):
907: if hasattr(self,'viewClassification'):
908: return self.viewClassification
909: else:
910: return ""
911:
912: def getFullTextXML(self,noredirect=None):
913: """getFullTextXML; gives the FullText as an XML Document, and <error></error> if somthing goes wrong."""
914: try:
915: fh=urllib.urlopen(self.metalink)
916: dom=xml.dom.minidom.parse(fh)
917: texttools=dom.getElementsByTagName('texttool')
918: text=texttools[0].getElementsByTagName('text')
919: texturl=getText(text[0].childNodes)
920:
921: if not noredirect:
922: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
923: self.REQUEST.RESPONSE.redirect(texturl)
924: else:
925: return texturl
926: except:
927:
928: if not noredirect:
929: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
930: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
931: else:
932: return "<error>no fulltext available</error>"
933:
934:
935: def getImageView(self,noredirect=None):
936: """getImages; give Imageviewr and <error></error> if somthing goes wrong."""
937: try:
938: fh=urllib.urlopen(self.metalink)
939: dom=xml.dom.minidom.parse(fh)
940: texttools=dom.getElementsByTagName('texttool')
941: text=texttools[0].getElementsByTagName('image')
942: imagetemp=getText(text[0].childNodes)
943:
944: text=dom.getElementsByTagName('archive-path')
945: archivepath=getText(text[0].childNodes)
946: archivepath=re.sub('/mpiwg/online/','',archivepath)
947: imageurl="http://echo.mpiwg-berlin.mpg.de/zogilib?fn="+archivepath+"/"+imagetemp
948: if not noredirect:
949: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
950: self.REQUEST.RESPONSE.redirect(imageurl)
951: else:
952: return imageurl
953: except:
954:
955: if not noredirect:
956: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
957: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
958: else:
959: return "<error>no images available</error>"
960:
961:
962: def getCopyrightsHTML(self):
963: """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus"""
964:
965: if hasattr(self,'copyrightModel'):
966: obj=self.copyrightModel
967:
968: else:
969: return "ERROR"
970: ret=[]
971:
972: for copyright in obj.getCopyrights(): #copyright - media / partner / copyrightID
973:
974:
975: try:
976: if hasattr(self.copyrightTypes,copyright[2]):
977: copyrightTypeObj=getattr(self.copyrightTypes,copyright[2])
978: link="copyrightTypes/"+copyright[2]+'/copyright.html'
979: else:
980: copyrightTypeObj=getattr(obj,copyright[2])
981: link="copyrightModel/"+copyright[2]+'/copyright.html'
982:
983: label=copyrightTypeObj.label
984: url=getattr(copyrightTypeObj, 'url', '')
985:
986: if url!='':
987: ret.append((url,copyright[0],copyright[1],copyright[2],label))
988: else:
989: if hasattr(copyrightTypeObj, 'copyright.html'):
990: ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label))
991: else:
992: ret.append(('empty',copyright[0],copyright[1],copyright[2],label))
993: except:
994: """nothing"""
995:
996: return ret
997:
998: def getCredits(self):
999: """Ausgabe der credits"""
1000: if self.credits:
1001: return self.credits
1002: else:
1003: return []
1004:
1005: def __init__(self,id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords):
1006:
1007: self.id = id
1008: """Festlegen der ID"""
1009:
1010: self.label = label
1011: self.link= link
1012: self.metalink=metalink
1013: self.title=title
1014: self.weight=weight
1015: self.credits=toList(credits)
1016: self.description=description
1017: self.contentType=contentType
1018: self.copyrightType=copyrightType
1019: self.renderingType=renderingType
1020: self.responsible=responsible
1021: self.resourceID=resourceID
1022:
1023: if coords:
1024: coordsnew=[ string.split(x,",") for x in coords]
1025: else:
1026: coordsnew=[]
1027:
1028: self.coords=coordsnew
1029:
1030:
1031: def getCoords(self):
1032: """gibt coordinaten als String zurück und löscht zugleich einträge die keine Koordinaten sind, letzteres zur korrektur der Eingabe der alten version"""
1033: retList=[]
1034: if hasattr(self,'coords'):
1035: for x in self.coords:
1036: if len(x)>1:
1037: retList.append(string.join(x,","))
1038: return retList
1039:
1040:
1041:
1042: def getContentType(self):
1043: try:
1044: return self.contentType
1045: except:
1046: return ""
1047:
1048: def getCopyrightType(self):
1049: try:
1050: return self.copyrightType
1051: except:
1052: return ""
1053:
1054: def getRenderingType(self):
1055: try:
1056: return self.renderingType
1057: except:
1058: return ""
1059:
1060: def ECHO_resource_config(self):
1061: """Main configuration"""
1062:
1063: if not hasattr(self,'weight'):
1064: self.weight=""
1065:
1066: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource.zpt').__of__(self)
1067: return pt()
1068:
1069:
1070: def ECHO_resource_config_main(self):
1071: """Main configuration"""
1072:
1073: if not hasattr(self,'weight'):
1074: self.weight=""
1075:
1076: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_main.zpt').__of__(self)
1077: return pt()
1078:
1079: def ECHO_resource_config_coords(self):
1080: """Coords configuration """
1081:
1082: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_coords.zpt').__of__(self)
1083: return pt()
1084:
1085: def ECHO_resource_config_credits(self):
1086: """Main configuration"""
1087:
1088: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_credits.zpt').__of__(self)
1089: return pt()
1090:
1091: def ECHO_resource_config_metadata(self):
1092: """Main configuration"""
1093:
1094: if (hasattr(self,'metadata')) and not (hasattr(self,'metaDataHash')):
1095: self.metaDataHash={}
1096: self.contentType=self.bib_type
1097: for data in self.metadata:
1098: data_neu=re.sub('-','_',data)
1099: self.meta
1100: DataHash[data_neu]=getattr(self,data)[0:]
1101:
1102:
1103: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_metadata.zpt').__of__(self)
1104: return pt()
1105:
1106:
1107:
1108:
1109: def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,RESPONSE=None):
1110: """Änderung der Properties"""
1111: self.resourceID=resourceID
1112: self.title=title
1113: self.label=label
1114: self.description=description
1115:
1116: self.contentType=contentType
1117: self.renderingType=renderingType
1118: self.weight=weight
1119:
1120: self.link=link
1121: self.metalink=metalink
1122:
1123: if RESPONSE is not None:
1124: RESPONSE.redirect('manage_main')
1125:
1126:
1127: def changeECHO_resource_coords(self,coords,viewClassification,RESPONSE=None):
1128: """Änderung der Properties - coords"""
1129:
1130: if type(coords)==StringType:
1131: coords=[coords]
1132:
1133: try:
1134: coordsnew=[ string.split(x,",") for x in coords]
1135: except:
1136: coordsnew=[]
1137:
1138: self.coords=coordsnew[0:]
1139: self.viewClassification=viewClassification
1140:
1141: if RESPONSE is not None:
1142: RESPONSE.redirect('manage_main')
1143:
1144: def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None):
1145: """Änderung der Properties"""
1146: self.credits=credits
1147: self.responsible=responsible
1148: self.copyrightType=copyrightType
1149:
1150: if RESPONSE is not None:
1151: RESPONSE.redirect('manage_main')
1152:
1153:
1154: def changeECHO_resource_metadata_local(self,RESPONSE=None):
1155: """change metadata"""
1156: tags=self.findTagsFromMapping(self.contentType)
1157: for field in tags[1]:
1158: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)][0:]
1159:
1160:
1161:
1162: if RESPONSE is not None:
1163: RESPONSE.redirect('manage_main')
1164:
1165: def changeECHO_resource_metadata(self,RESPONSE=None):
1166: """change metadata"""
1167: tags=self.findTagsFromMapping(self.contentType)
1168: self.OSAS_meta={}
1169: for field in tags[1]:
1170: try:
1171: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]
1172: self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)]
1173: except:
1174: """nothing"""
1175:
1176: urllib.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()
1177:
1178:
1179: if RESPONSE is not None:
1180: RESPONSE.redirect('manage_main')
1181:
1182:
1183: def getMDValue(self,fieldName):
1184: return self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%self.contentType)
1185:
1186: def newMetaXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,digiliburlprefix=None):
1187: """new index.meta"""
1188: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1189:
1190: if not hasattr(self,'metaDataHash'):
1191:
1192: self.copyIndex_meta2echo_resource()
1193: try:
1194: return writeMetadata(self.metalink,self.OSAS_meta,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)
1195: except:
1196: return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)
1197:
1198: def showMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
1199: """schreibe md"""
1200:
1201: try:
1202:
1203: return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,xmlfrag="yes")
1204: except:
1205: return "<error> no metadata stored</error>"
1206:
1207: def getMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
1208: """prints out metadata as stored in the echo environment, format is the index.meta format"""
1209: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1210: return writeMetadata(self.metalink,self.metaDataHash)
1211:
1212: def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,viewClassification="",coords=None,credits=None,RESPONSE=None):
1213: """Änderung der Properties"""
1214:
1215: try:
1216: coordsnew=[ string.split(x,",") for x in coords]
1217: except:
1218: coordsnew=[]
1219:
1220: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
1221: self.viewClassification=viewClassification
1222: self.coords=coordsnew[0:]
1223: self.link=link
1224: self.metalink=metalink
1225:
1226: if RESPONSE is not None:
1227: RESPONSE.redirect('manage_main')
1228:
1229:
1230: manage_options = Folder.manage_options+(
1231: {'label':'Main Config','action':'ECHO_resource_config_main'},
1232: {'label':'Change Metadata','action':'ECHO_resource_config_metadata'},
1233: {'label':'Change Coords','action':'ECHO_resource_config_coords'},
1234: {'label':'Add coords','action':'ECHO_graphicEntry'},
1235: {'label':'Sync Metadata','action':'ECHO_getResourceMD'},
1236: {'label':'Change TemplateSets','action':'changeViewerTemplateSetForm'},
1237: {'label':'set/change startpage','action':'setStartPageForm'},
1238: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
1239: )
1240:
1241: def getOverview(self):
1242: """overview graphics"""
1243:
1244: return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
1245:
1246: def ECHO_graphicEntry(self):
1247: """DO nothing"""
1248: overview = self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])
1249: if overview:
1250: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
1251: return pt()
1252: else:
1253: return "NO OVERVIEW GRAPHICS"
1254:
1255: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
1256: """Enter coords"""
1257: coords=self.coords
1258: temco=coordstr.split(",")
1259: temco.append(angle)
1260: coords.append(temco)
1261:
1262: self.coords=coords[0:]
1263:
1264: if RESPONSE is not None:
1265: RESPONSE.redirect('ECHO_graphicEntry')
1266:
1267:
1268: def isDefinedInThisSet(self,fields,field):
1269: """checks if field is defined in fields"""
1270: if (fields[0].has_key(field)) and not (fields[0][field]==""):
1271: return 1
1272: else:
1273:
1274: return 0
1275:
1276: def getFieldLabel(self,fields,field):
1277: """get labels"""
1278: try:
1279: ret =fields[0][field]
1280: if ret == "":
1281: return field
1282: else:
1283: return ret
1284: except:
1285: return field
1286:
1287:
1288:
1289: def getFieldTag(self,fields,field):
1290: """get labels"""
1291: try:
1292: ret =fields[0][field]
1293: if ret == "":
1294: return field
1295: else:
1296: return ret
1297: except:
1298: return field
1299:
1300:
1301:
1302: def getFieldValue(self,field):
1303: """get value"""
1304:
1305: try:
1306:
1307: ret=self.metaDataHash[field]
1308: if ret == "":
1309: return None
1310: else:
1311: return ret
1312: except:
1313: return None
1314:
1315: def getMetaDataHash(self):
1316: """md hash"""
1317: return self.metaDataHash
1318:
1319: def setFieldValue(self,field,value):
1320: """get value"""
1321:
1322: if not hasattr(self,'metaDataHash'):
1323: setattr(self,'metaDataHash',{})
1324: self.metaDataHash[field]=value[0:]
1325:
1326:
1327: def copySearchFields(self):
1328: """copys metadatafields to the object"""
1329: fields=['author','title','year']
1330: for field in fields:
1331: setattr(self,'MD_'+field,self.getFieldValue(field))
1332:
1333:
1334: def findLabelsFromMapping(self,referenceType):
1335: """gib hash mit label -> generic zurueck"""
1336: #return {},[]
1337:
1338: temp=self.ZopeFind(self.standardMD)
1339:
1340: if referenceType=="":
1341: referenceType="book"
1342:
1343:
1344: bibdata={}
1345: retdata={}
1346: fields=[]
1347: fieldlist=self.standardMD.fieldList
1348:
1349: for referenceTypeF in self.referencetypes:
1350:
1351: if referenceTypeF[1].title.lower() == referenceType.lower():
1352:
1353: try:
1354: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
1355: referenceType=referenceTypeF[1].title
1356: except:
1357: bibdata[referenceType]=referenceTypeF[1].fields
1358:
1359:
1360: bibdata['data']=referenceTypeF[1]
1361: fields=bibdata[referenceType]
1362: for field in fieldlist:
1363: retdata[field]=referenceTypeF[1].getValue(field)[1]
1364:
1365: return retdata,fieldlist,temp,fields
1366:
1367: def findTagsFromMapping(self,referenceType):
1368: """gib hash mit label -> generic zurueck"""
1369:
1370:
1371: if referenceType=="":
1372: referenceType="book"
1373:
1374: temp = self.ZopeFind(self.standardMD)[0:]
1375:
1376:
1377: #self.referencetypes=temp[0:]
1378:
1379:
1380:
1381:
1382:
1383:
1384: bibdata={}
1385: retdata={}
1386: fieldlist=self.standardMD.fieldList
1387: fields=[]
1388: for referenceTypeF in temp:
1389: #print referenceType
1390:
1391: if referenceTypeF[1].title.lower() == referenceType.lower():
1392: try:
1393: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
1394: referenceType=referenceTypeF[1].title
1395: except:
1396: bibdata[referenceType]=referenceTypeF[1].fields
1397: bibdata['data']=referenceTypeF[1]
1398: fields=bibdata[referenceType]
1399: for field in fieldlist:
1400: retdata[field]=referenceTypeF[1].getValue(field)[0]
1401:
1402: return retdata,fieldlist,temp,fields
1403:
1404:
1405: security.declarePublic('copyIndex_meta2echo_resource') # has to be change, presentlyset because of OSAS koordination
1406: def copyIndex_meta2echo_resource(self,RESPONSE=None):
1407: """copy MD von Index_meta to the echo_resource"""
1408:
1409: (metadict, error)=readMetadata(self.metalink)
1410:
1411:
1412:
1413: self.metaDataHash={}
1414: if not error=="": #Fehler beim Auslesen des Metafiles
1415:
1416: return "ERROR:",error,self.absolute_url()
1417:
1418: self.contentType=metadict['bib_type'][0:]
1419: fields=self.findTagsFromMapping(self.contentType)
1420:
1421: #fields=self.findLabelsFromMapping(self.contentType)
1422: for field in fields[1]:
1423:
1424: if self.isDefinedInThisSet(fields,field):
1425: #print urllib.unquote(metadict.get(self.getFieldTag(fields,field),''))
1426: self.setFieldValue(self.getFieldTag(fields,field),metadict.get(self.getFieldTag(fields,field),''))
1427:
1428:
1429:
1430: if RESPONSE:
1431: return RESPONSE.redirect('manage_main')
1432:
1433: def ECHO_getResourceMD(self,template="yes",back=None):
1434: """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""
1435: (metadict, error)=readMetadata(self.metalink)
1436:
1437: if back:
1438: self.REQUEST.SESSION['back']=back
1439:
1440: if not error=="": #Fehler beim Auslesen des Metafiles
1441: return "ERROR:",error
1442:
1443:
1444: if not (metadict['bib_type'].lower()==self.contentType.lower()):
1445: self.REQUEST.SESSION['contentStorage']=metadict['bib_type']
1446: self.REQUEST.SESSION['contentZope']=self.contentType
1447:
1448: return PageTemplateFile('Products/ECHO_content/zpt/ECHO_getResourceMDErrorContentType.zpt').__of__(self)()
1449:
1450: self.REQUEST.SESSION['metadict']=metadict
1451:
1452:
1453:
1454: self.REQUEST.SESSION['diffs']=checkDiffs(self,self.REQUEST.SESSION['metadict'])
1455:
1456:
1457:
1458: if template=="yes":
1459: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_resourceMD.zpt').__of__(self)
1460: return pt()
1461:
1462:
1463:
1464:
1465:
1466: def ECHO_getMD(self,item):
1467: """Ausgabe der MD"""
1468: return getattr(self,item)
1469:
1470: def index_html(self):
1471: """standard page"""
1472:
1473: return self.REQUEST.RESPONSE.redirect(self.link)
1474:
1475: def startpage_html(self):
1476: """prints out a startpage for a resource for use e.g. in the BVE"""
1477:
1478: # suche ob startpage.html in dem Ordner vorhanden ist, dann wir diese angezeigt
1479:
1480: sp=self.ZopeFind(self,obj_ids=['startpage.html'])
1481:
1482: if sp:
1483: return sp[1]()
1484:
1485: #prüfen ob irgendwo ein template
1486: if hasattr(self,'startpage_index_template'):
1487: return self.startpage_index_template()
1488:
1489: #generisches template ausgeben
1490:
1491: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_startpage_index_template_standard.zpt').__of__(self)
1492: pt.content_type="text/html"
1493: return pt()
1494:
1495: def toc_html(self):
1496:
1497: sp=self.ZopeFind(self,obj_ids=['toc.html'])
1498:
1499: if sp:
1500: return sp[0][1]()
1501:
1502:
1503: security.declarePublic('generate_label') # has to be change, presentlyset because of OSAS koordination
1504:
1505: def generate_label(self):
1506: """Erzeugt_standard_Label aus Template"""
1507: pt=getattr(self,"label_template_"+self.contentType.lower())
1508:
1509: self.label=pt()[0:]
1510: return pt()
1511:
1512: security.declarePublic('generate_title') # has to be change, presentlyset because of OSAS koordination
1513:
1514: def generate_title(self,RESPONSE=None):
1515: """Erzeugt_standard_Label aus Template"""
1516: pt=getattr(self,"label_template_"+self.contentType.lower())
1517:
1518: self.title=pt()[0:]
1519:
1520: return pt()
1521:
1522: Globals.InitializeClass(ECHO_resource)
1523:
1524: def manage_addECHO_resourceForm(self):
1525: """Form for adding a ressource"""
1526: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_resourceForm.zpt').__of__(self)
1527: return pt()
1528:
1529:
1530:
1531: 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):
1532: """addaresource"""
1533:
1534: newObj=ECHO_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords)
1535:
1536: self._setObject(id,newObj)
1537:
1538: if RESPONSE is not None:
1539: RESPONSE.redirect('manage_main')
1540:
1541:
1542: class ECHO_externalLink(Folder):
1543: """Link zu einer externen Ressource"""
1544: security=ClassSecurityInfo()
1545: meta_type='ECHO_externalLink'
1546:
1547: def getTitle(self):
1548: """title"""
1549: try:
1550: return self.title.encode('utf-8','ignore')
1551: except:
1552: self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
1553: return self.title.encode('utf-8','ignore')
1554:
1555: def getLabel(self):
1556: """title"""
1557: try:
1558: return self.label.encode('utf-8','ignore')
1559: except:
1560: self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
1561: return self.label.encode('utf-8','ignore')
1562:
1563: def content_html(self):
1564: """template fuer content"""
1565: return content_html(self,'externalLink')
1566:
1567: def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords):
1568:
1569: self.id = id
1570: """Festlegen der ID"""
1571:
1572: self.credits=toList(credits)
1573: self.label = label
1574: self.link= link
1575: self.title=title
1576: self.weight=weight
1577: self.description=description
1578: self.contentType=contentType
1579: self.responsible=responsible
1580: coordsnew=[ string.split(x,",") for x in coords]
1581: self.coords=coordsnew
1582:
1583: def ECHO_externalLink_config(self):
1584: """Main configuration"""
1585:
1586: if not hasattr(self,'weight'):
1587: self.weight=""
1588: if not hasattr(self,'coords'):
1589:
1590: self.coords=['']
1591:
1592:
1593: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_externalLink.zpt').__of__(self)
1594: return pt()
1595:
1596:
1597: def changeECHO_externalLink(self,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None):
1598:
1599: """Änderung der Properties"""
1600: try:
1601: coordsnew=[ string.split(x,",") for x in coords]
1602: except:
1603: coordsnew=[]
1604:
1605: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coords)
1606:
1607: self.coords=coordsnew[0:]
1608: self.link=link
1609: if RESPONSE is not None:
1610: RESPONSE.redirect('manage_main')
1611:
1612:
1613: manage_options = Folder.manage_options+(
1614: {'label':'Main Config','action':'ECHO_externalLink_config'},
1615: )
1616:
1617:
1618: def index_html(self):
1619: """standard page"""
1620:
1621: return self.REQUEST.RESPONSE.redirect(self.link)
1622:
1623: def manage_addECHO_externalLinkForm(self):
1624: """Form for external Links"""
1625: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_externalLinkForm.zpt').__of__(self)
1626: return pt()
1627:
1628:
1629: def manage_addECHO_externalLink(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None):
1630: """Add an external Link"""
1631:
1632: newObj=ECHO_externalLink(id,link,title,label,description,contentType,responsible,credits,weight,coords)
1633:
1634: self._setObject(id,newObj)
1635:
1636: if RESPONSE is not None:
1637: RESPONSE.redirect('manage_main')
1638:
1639:
1640: class ECHO_link(ECHO_externalLink):
1641: """external_link"""
1642:
1643: meta_type="ECHO_link"
1644:
1645:
1646: def content_html(self):
1647: """template fuer link"""
1648: if hasattr(self,"link_template"):
1649: return content_html(self,'link')
1650: else:
1651: return content_html(self,'collection')
1652:
1653: def manage_addECHO_linkForm(self):
1654: """Form for external Links"""
1655: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_linkForm.zpt').__of__(self)
1656: return pt()
1657:
1658:
1659: def manage_addECHO_link(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None):
1660: """Add an external Link"""
1661:
1662: newObj=ECHO_link(id,link,title,label,description,contentType,responsible,credits,weight,coords)
1663:
1664: self._setObject(id,newObj)
1665:
1666: if RESPONSE is not None:
1667: RESPONSE.redirect('manage_main')
1668:
1669:
1670: class ECHO_collection(Folder, Persistent, Implicit, Cacheable):
1671: """ECHO Collection"""
1672:
1673: security=ClassSecurityInfo()
1674: meta_type='ECHO_collection'
1675: viewClassificationList=viewClassificationListMaster
1676: displayTypes=displayTypes
1677:
1678: path="/mpiwg/online/permanent/shipbuilding"
1679:
1680: def getRDF(self,urn=None):
1681: """rdf of the collection"""
1682:
1683: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
1684:
1685: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
1686:
1687: if not urn:
1688: urn=self.absolute_url()
1689:
1690: li="""<RDF:li RDF:resource="%s" />\n"""
1691:
1692:
1693: for content in contents:
1694: ret+=content[1].getRDF()+"\n"
1695:
1696: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn
1697: for content in contents:
1698: nurn=content[1].absolute_url()
1699: ret+=li%nurn
1700: return ret+"</RDF:Seq>"
1701:
1702:
1703: def showRDF(self):
1704: """showrdf"""
1705: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1706: ret="""<?xml version="1.0" encoding="utf-8"?>\n<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ECHONAVIGATION="http://www.echo.eu/rdf#">\n"""
1707: ret+=self.getRDF(urn="echo:collectionroot")+"\n"
1708:
1709: ret+="""</RDF:RDF>"""
1710:
1711: return ret
1712:
1713:
1714: def changeLabels(self):
1715: """change form"""
1716: pt=PageTemplateFile('Products/ECHO_content/zpt/changeLabelsForm').__of__(self)
1717: pt.content_type="text/html"
1718: return pt()
1719:
1720: def changeTitles(self):
1721: """change form"""
1722: pt=PageTemplateFile('Products/ECHO_content/zpt/changeTitleForm').__of__(self)
1723: pt.content_type="text/html"
1724: return pt()
1725:
1726: def changeAccessRightsCollection(self):
1727: """change"""
1728: ret=""
1729: argv=self.REQUEST.form
1730:
1731: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1732: for resource in resources:
1733:
1734: try:
1735: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1736: resource[1].changeAccessRightMD(argv[resource[1].getId()])
1737: except:
1738: """not"""
1739: return ret
1740:
1741: def changeLabelsInCollection(self):
1742: """change all lables of a collection"""
1743: ret=""
1744: argv=self.REQUEST.form
1745:
1746: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1747: for resource in resources:
1748:
1749: try:
1750: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1751: resource[1].label=argv[resource[1].getId()][0:]
1752: except:
1753: """not"""
1754: return ret
1755:
1756: def changeTitlesInCollection(self):
1757: """change all lables of a collection"""
1758: ret=""
1759: argv=self.REQUEST.form
1760:
1761: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1762: for resource in resources:
1763:
1764: try:
1765: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1766: resource[1].title=argv[resource[1].getId()][0:]
1767: except:
1768: """not"""
1769: return ret
1770:
1771: def updateCollection(self,RESPONSE=None):
1772: """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""
1773: files=os.listdir(self.path)
1774: ret=""
1775: for fileName in files:
1776:
1777: if fileName:
1778:
1779: tempPath=re.sub("/mpiwg/online","",self.path)
1780: link="http://echo.mpiwg-berlin.mpg.de/zogilib_book?fn="+tempPath+"/"+fileName+"/pageimg"
1781:
1782: metalink=self.path+"/"+fileName+"/index.meta"
1783: try:
1784:
1785: #link="http://nausikaa2.mpiwg-berlin.mpg.de/cgi-bin/toc/toc.x.cgi?dir="+fileName+"&step=thumb"
1786:
1787: newObj=ECHO_resource(fileName,link,metalink,fileName,fileName,fileName,'generated','book','','','','','','')
1788: self._setObject(fileName,newObj)
1789:
1790: genObj=getattr(self,fileName)
1791: #genObj.createIndexFile()
1792: ret+="OK:"+fileName+"<br/>"
1793: except:
1794: print "ERROR"
1795: ret+="ERROR:"+fileName+"<br/>"
1796:
1797: return ret
1798:
1799: if RESPONSE is not None:
1800: RESPONSE.redirect('manage_main')
1801:
1802: def updateCollectionMD(self,RESPONSE=None):
1803: """updateMD"""
1804: files=os.listdir(self.path)
1805: for fileName in files:
1806: if fileName:
1807: genObj=getattr(self,fileName)
1808: genObj.copyIndex_meta2echo_resource()
1809: genObj.generate_title()
1810:
1811: if RESPONSE is not None:
1812: RESPONSE.redirect('manage_main')
1813:
1814:
1815:
1816: def changeViewerTemplateSetsForm(self):
1817: """change the viewer template set"""
1818: pt=PageTemplateFile('Products/ECHO_content/zpt/changeViewerTemplateSet').__of__(self)
1819: return pt()
1820:
1821: def getViewerTemplateSets(self,obj_ids=None):
1822: """Get the ViewerTemplateSet title for configuration"""
1823: ret=[]
1824:
1825: try:
1826: viewerTemplateSets=self.ZopeFind(self.viewerTemplateSets,obj_metatypes=['OSAS_viewerTemplateSet'],obj_ids=obj_ids)#assumes viewerTemplateSets folder somewhere in the hierarchie.
1827:
1828: for viewerTemplateSet in viewerTemplateSets:
1829: ret.append((viewerTemplateSet[1].title,viewerTemplateSet[0],viewerTemplateSet[1]))
1830:
1831: return ret
1832:
1833: except:
1834: return [('no ViewerTemplateSetfolders','')]
1835:
1836: def getTextToolsField(self,name,default=''):
1837: """Lese viewerTemplateSet der Collection not implemented yet!"""
1838:
1839: return default
1840:
1841:
1842: def isSelectedViewerTemplateSet(self,obj,id):
1843: """is ausgewählt"""
1844:
1845: if self.REQUEST['viewerTemplateSet']==id:
1846: return 1
1847: else:
1848: return None
1849:
1850: def changeViewerTemplateSets(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,RESPONSE=None):
1851: """change the templates"""
1852:
1853: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
1854:
1855: for resource in resources:
1856:
1857: resource[1].changeViewerTemplateSet(project,xslt,thumbtemplate,topbar,digiLibTemplate)
1858:
1859: if RESPONSE is not None:
1860: RESPONSE.redirect('manage_main')
1861:
1862:
1863: def setStartpageFolderForm(self):
1864: """Form for changing the startpage"""
1865:
1866:
1867: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resourceStartPageFolder.zpt').__of__(self)
1868: pt.content_type="text/html"
1869: return pt()
1870:
1871: def setStartpageFolder(self,startpage=None,RESPONSE=None):
1872: """change the templates"""
1873:
1874: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
1875:
1876: for resource in resources:
1877:
1878: resource[1].setStartPage(startpage)
1879:
1880: if RESPONSE is not None:
1881: RESPONSE.redirect('manage_main')
1882:
1883:
1884:
1885: def copySearchFields(self,RESPONSE=None):
1886: """copys import metadatafields to the object"""
1887: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1888:
1889: for resource in resources:
1890:
1891: resource[1].copySearchFields()
1892:
1893: if RESPONSE is not None:
1894: RESPONSE.redirect('manage_main')
1895:
1896: def reloadMetaDataFromStorageWarning(self,RESPONSE=None):
1897: """warning"""
1898: pt=PageTemplateFile('Products/ECHO_content/zpt/reloadMetaDataFromStorageWarning.zpt').__of__(self)
1899: pt.content_type="text/html"
1900: return pt()
1901:
1902: def reloadMetaDataFromStorage(self,RESPONSE=None):
1903: """copy metadata from the storage to ECHO"""
1904:
1905: return reloadMetaDataFromStorage(self,RESPONSE=None)
1906:
1907:
1908: def getPartnerCopyright(self,name,sonst="generic"):
1909: """gibt generisches copyright eines partners aus, sonst behalte jetzige einsteillung"""
1910: #print "hi",name,sonst
1911: #print getattr(self.partners,name).copyrightType
1912: try:
1913: partner=getattr(self.partners,name)
1914: return partner.copyrightType
1915: except:
1916: print "error"
1917: return sonst
1918:
1919: def partnerSelector_HTML(self,selected=None):
1920: """give type selector"""
1921: if not selected:
1922: retStr="<option selected>\n"
1923: else:
1924: retStr="<option>\n"
1925:
1926: try: # erste version copyrightTypes exists
1927: for partner in self.credits:
1928: if selected and (partner==selected):
1929: retStr+="""<option selected value="%s">%s\n"""%(partner,partner)
1930: else:
1931: retStr+="""<option value="%s">%s\n"""%(partner,partner)
1932: except:
1933: """nothing"""
1934: return retStr
1935:
1936: def getViewClassification(self):
1937: if hasattr(self,'viewClassification'):
1938: return self.viewClassification
1939: else:
1940: return ""
1941:
1942: def getTitle(self):
1943: """title"""
1944: try:
1945: return self.title.encode('utf-8','ignore')
1946: except:
1947: self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
1948: return self.title.encode('utf-8','ignore')
1949:
1950: def getLabel(self):
1951: """title"""
1952: try:
1953: return self.label.encode('utf-8','ignore')
1954: except:
1955: self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
1956: return self.label.encode('utf-8','ignore')
1957:
1958: def createRessourcesFromXMLForm(self):
1959: """form"""
1960: pt=PageTemplateFile('Products/ECHO_content/zpt/createRessourcesFromXMLForm.zpt').__of__(self)
1961: return pt()
1962:
1963: def createRessourcesFromXML(self,fileupload):
1964: """read an XML file for generating resources"""
1965: dom=xml.dom.minidom.parse(fileupload)
1966: ret="<h2>Added</h2>"
1967: for resource in dom.getElementsByTagName('resource'):
1968: link=getText(resource.getElementsByTagName('link')[0].childNodes)
1969: label=getText(resource.getElementsByTagName('label')[0].childNodes)
1970: #splitted=link.split("?")[0].split("/")
1971: #id=splitted[len(splitted)-1].encode('ascii')
1972: id=re.sub(" ","_",label).encode('ascii')
1973:
1974: ret+="<p>"+label+"</p>"
1975: manage_addECHO_resource(self,id,label.encode('ascii'),label.encode('ascii'),"","","",link.encode('ascii'),"","")
1976: return ret
1977:
1978: def getImageTag(self):
1979: """GetTag"""
1980: try:
1981: return self.imageTag
1982: except:
1983: return ""
1984:
1985: def addResource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None):
1986: """SSS"""
1987: try:
1988: manage_addECHO_resource(self,id,title,label,description,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None)
1989: return "done"
1990: except:
1991: return None
1992:
1993: def getSecondaryLink(self):
1994: """secondary link"""
1995: try:
1996: return self.secondaryLink
1997: except:
1998: return ""
1999:
2000: def getSecondaryLinkTitle(self):
2001: """secondary link"""
2002: try:
2003: return self.secondaryLinkTitle
2004: except:
2005: return ""
2006:
2007: def getCollectionTreeXML(self):
2008: """Tree as XML"""
2009:
2010: def getCollection(object,depth=0):
2011: depth+=1
2012: collections=""
2013: for entry in object.__dict__.keys():
2014: element=getattr(object,entry)
2015: try:
2016: if element.meta_type in ["ECHO_collection","ECHO_group"]:
2017: collections+="<element name=\""+quote(element.title)+"\" url=\""+element.absolute_url()+"\">"
2018: collections+=getCollection(element,depth)+"</element>\n"
2019: except:
2020: """nothing"""
2021: return collections
2022:
2023: ret="""<?xml version="1.0" encoding="utf-8" ?>"""
2024: return ret+"<collection>"+getCollection(self)+"</collection>"
2025:
2026: def createJavaScript(self):
2027: """OLD CreateJava"""
2028: ret=javaScriptMain
2029:
2030: dynamical="\n"
2031: for ob in self.getGraphicCoords():
2032: if ob[4][4] == "":
2033: dynamical+="""Coords.push(new Coord('%s', Img, %s));\n"""%(ob[1],ob[0])
2034: else:
2035: dynamical+="""Coords.push(new Coord('%s', Img, %s));//%s\n"""%(ob[1],ob[0],ob[4][4])
2036: dynamical+="ShowArrow(new getObj('i.%s'),Img,%s);\n"%(ob[1],ob[0])
2037: ret+=javaHandler%dynamical
2038: return ret
2039:
2040: def createJSAreas(self):
2041: """create area calls for JavaScript"""
2042: dynamical="\n"
2043: for ob in self.getGraphicCoords():
2044: if ob[5] == "area":
2045: dynamical+="""addArea('%s', 'overview', %s, 'area');\n"""%(ob[1],ob[0])
2046: else:
2047: dynamical+="""addArea('%s', 'overview', %s, 'arrow');\n"""%(ob[1],ob[0])
2048: return dynamical
2049:
2050: def createMapHead(self):
2051: """create javascript include and script tags for head"""
2052: pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_content_map_frag_js')).__of__(self)
2053: return pt()
2054:
2055: def createMapImg(self):
2056: """generate img-tag for map"""
2057: bt = BrowserCheck(self)
2058: tag = ""
2059: src = self.REQUEST['URL1'] + "/overview"
2060: if bt.isN4:
2061: tag += '<ilayer id="overview" visibility="show"><img src="%s"></ilayer>'%src
2062: else:
2063: tag += '<img id="overview" src="%s" />'%src
2064: return tag
2065:
2066: def createMapLink(self, ob, text=None):
2067: """generate map link"""
2068: bt = BrowserCheck(self)
2069: id = ob[1]
2070: link = ob[1]
2071: if text == None:
2072: text = ob[2]
2073: tag = ""
2074: if bt.isN4:
2075: tag += '<ilayer id="a.%s"><a onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
2076: tag += ">" + text + "</a></ilayer>"
2077: else:
2078: tag = '<a id="a.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
2079: if ob[3].contentType == 'text-popup':
2080: tag += ' title="%s"'%ob[3].description
2081: tag += ">" + text + "</a>"
2082: return tag
2083:
2084: def createMapAux(self, ob, arrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil"):
2085: """generate map link image, text and other stuff"""
2086: id = ob[1]
2087: link = ob[1]
2088: vtype = ob[5]
2089: ctype = ob[3].contentType
2090: bt = BrowserCheck(self)
2091: tag = ""
2092:
2093: if bt.isN4:
2094: tag += '<layer id="i.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)">'%(id,id,id)
2095: if vtype == "view point":
2096: rot = ob[4][4]
2097: tag += '<a href="%s"><img border="0" src="%s&rot=%s" /></a>'%(link,arrowsrc,rot)
2098: else:
2099: tag += '<a href="%s"><img border="0" width="1000" height="1000" src="trans_img"'%(link)
2100: if ctype == "text-popup":
2101: desc = ob[3].description
2102: tag += ' alt="%s"'%desc
2103: tag += ' /></a>'
2104: tag += '</layer>'
2105: else:
2106: tag = '<a id="b.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank">'%(id,id,id,link)
2107: if vtype == "view point":
2108: rot = ob[4][4]
2109: if bt.isIEWin and bt.versIE > 5:
2110: tag += '<span id="i.%s" style="position:absolute; top:-100px; left:-100px; border-style:none; border-width=1px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'%s&rot=%s\');"><img style="visibility:hidden" src="%s&rot=%s" /></span>'%(id,arrowsrc,rot,arrowsrc,rot)
2111: else:
2112: tag += '<img id="i.%s" src="%s&rot=%s" border="1" style="position:absolute; top:-100px; left:-100px; border-style:none;" />'%(id,arrowsrc,rot)
2113: else:
2114: if bt.isIEWin:
2115: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;background:url(area_img)"'%(id)
2116: else:
2117: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;"'%(id)
2118: if ctype == "text-popup":
2119: desc = ob[3].description
2120: tag += ' title="%s"'%desc
2121: tag += '> </div>'
2122: tag += '</a>'
2123: return tag
2124:
2125:
2126: security.declarePublic('getCreditObject')
2127: def getCreditObject(self,name):
2128: """credit id to credititem"""
2129: try:
2130: return getattr(self.partners,name)
2131: except:
2132: return ""
2133:
2134: security.declarePublic('ECHO_generateNavBar')
2135: def ECHO_generateNavBar(self):
2136: """Erzeuge Navigationsbar"""
2137: link=""
2138: object="self"
2139: ret=[]
2140: path=self.getPhysicalPath()
2141: for element in path:
2142:
2143:
2144: if not element=="":
2145: object+="."+element
2146:
2147: label=eval(object).label
2148: link+="/"+element
2149: if not label=="":
2150: ret.append((label,link))
2151: return ret
2152:
2153: security.declarePublic('ECHO_rerenderLinksMD')
2154:
2155:
2156: def ECHO_rerenderLinksMDWarning(self):
2157: """change form"""
2158: pt=PageTemplateFile('Products/ECHO_content/zpt/rerenderLinksWarning').__of__(self)
2159: pt.content_type="text/html"
2160: return pt()
2161:
2162:
2163:
2164: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
2165: """Rerender all Links"""
2166: return ECHO_rerenderLinksMD(self,obj,types)
2167:
2168:
2169: security.declarePublic('ECHO_newViewerLink')
2170:
2171:
2172: def getCoords(self):
2173: try:
2174:
2175: x= [string.join(x,",") for x in self.coords]
2176: return x
2177:
2178: except:
2179:
2180: return []
2181:
2182: def __init__(self,id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle,secondaryLink,imageTag="",bgcolour=""):
2183:
2184:
2185: self.id = id
2186: """Festlegen der ID"""
2187: self.credits=toList(credits)
2188: self.label = label
2189: self.title=title
2190: self.description=description
2191: self.contentType=contentType
2192: self.responsible=responsible
2193: self.imageTag=imageTag
2194: self.weight=weight
2195: self.sortfield=sortfield
2196: coordsnew=[ string.split(x,",") for x in coords]
2197: self.coords=coordsnew
2198: self.secondaryLinkTitle=secondaryLinkTitle
2199: self.secondaryLink=secondaryLink
2200: self.bgcolour=bgcolour
2201:
2202:
2203: manage_options = Folder.manage_options+ Cacheable.manage_options+(
2204: {'label':'Main Config','action':'ECHO_collection_config'},
2205: {'label':'Change Labels','action':'changeLabels'},
2206: {'label':'Change Titles','action':'changeTitles'},
2207: {'label':'Rerender Labels and Titles','action':'ECHO_rerenderLinksMDWarning'},
2208: {'label':'Graphics','action':'ECHO_graphicEntry'},
2209: {'label':'create resources from XML','action':'createRessourcesFromXMLForm'},
2210: {'label':'Set Startpage','action':'setStartpageFolderForm'},
2211: {'label':'Change Viewer Templates','action':'changeViewerTemplateSetsForm'},
2212: {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},
2213: {'label':'ImportCollection','action':'updateCollection'},
2214: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
2215: )
2216:
2217: def getOverview(self):
2218: """overview graphics"""
2219:
2220: return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
2221:
2222:
2223: def ECHO_graphicEntry(self):
2224: """DO nothing"""
2225: overview = self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])
2226:
2227:
2228: if overview:
2229: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
2230: return pt()
2231: else:
2232: return "NO OVERVIEW GRAPHICS"
2233:
2234: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
2235: """Enter coords"""
2236: coords=self.coords
2237: temco=coordstr.split(",")
2238: temco.append(angle)
2239: coords.append(temco)
2240: self.coords=coords[0:]
2241:
2242: if RESPONSE is not None:
2243: RESPONSE.redirect('ECHO_graphicEntry')
2244:
2245:
2246: security.declarePublic('ECHO_collection_config')
2247: def ECHO_collection_config(self):
2248: """Main configuration"""
2249:
2250: if not hasattr(self,'weight'):
2251: self.weight=""
2252:
2253: if not hasattr(self,'sortfield'):
2254: self.sortfield="weight"
2255:
2256: if not hasattr(self,'coords'):
2257: self.coords=[]
2258:
2259: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_collection.zpt').__of__(self)
2260: return pt()
2261:
2262:
2263: security.declarePublic('changeECHO_collection')
2264:
2265:
2266: def getBgcolour(self):
2267: """colour"""
2268: if hasattr(self,'bgcolour') and not (self.bgcolour==""):
2269: return self.bgcolour
2270: else:
2271: return "#dddddd"
2272:
2273: def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",viewClassification=None,location=None):
2274: """Aenderung der Properties"""
2275:
2276: self.secondaryLink=secondaryLink
2277: self.secondaryLinkTitle=secondaryLinkTitle
2278: self.imageTag=imageTag
2279: self.bgcolour=bgcolour
2280: self.viewClassification=viewClassification
2281: self.location=location
2282:
2283: if coords:
2284: coordsnew=[ string.split(x,",") for x in coords]
2285: self.coords=coordsnew[0:]
2286: else:
2287: coordsnew=None
2288: self.coords=None
2289:
2290: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
2291: try:
2292: self.coords=coordsnew[0:] # HACK fehler in setECHO_collection
2293: except:
2294: """none"""
2295:
2296: self.sortfield=sortfield
2297:
2298: if RESPONSE is not None:
2299: RESPONSE.redirect('manage_main')
2300:
2301:
2302: def showOverview(self):
2303: """overview"""
2304: if 'ECHO_overview.html' in self.__dict__.keys():
2305: return getattr(self,'ECHO_overview.html')()
2306: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_content_overview.zpt').__of__(self)
2307: return pt()
2308:
2309: security.declareProtected('View','index_html')
2310:
2311: def index_html(self):
2312: """standard page"""
2313: if self.ZCacheable_isCachingEnabled():
2314:
2315: result = self.ZCacheable_get()
2316: if result is not None:
2317: # Got a cached value.
2318: return result
2319:
2320: if 'index.html' in self.__dict__.keys():
2321: ret=getattr(self,'index.html')()
2322:
2323: elif 'overview' in self.__dict__.keys():
2324: ret=self.showOverview()
2325: elif hasattr(self,'collection_index_template'):
2326: ret=self.collection_index_template()
2327: elif hasattr(self,'main_index_template'):
2328: ret=self.main_index_template()
2329: else:
2330: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_main_index_template_standard.zpt').__of__(self)
2331: pt.content_type="text/html"
2332: ret=pt.render()
2333:
2334: self.ZCacheable_set(ret)
2335: return ret
2336:
2337: def content_html(self):
2338: """template fuer content"""
2339: return content_html(self,'collection')
2340:
2341: def getCredits(self):
2342: """Ausgabe der credits"""
2343: if self.credits:
2344: return self.credits
2345: else:
2346: return []
2347:
2348: def area_img(self):
2349: """area image"""
2350: bt = BrowserCheck(self)
2351: if bt.isIE or bt.isN4:
2352: return sendFile(self, 'images/red.gif', 'image/gif')
2353: else:
2354: return sendFile(self, 'images/reda.png', 'image/png')
2355:
2356: def trans_img(self):
2357: """empty image"""
2358: return sendFile(self, 'images/trans.gif', 'image/gif')
2359:
2360: def hl_lib_js(self):
2361: """javascript"""
2362: return sendFile(self, 'js/hl_lib.js', 'text/plain')
2363:
2364: def js_lib_js(self):
2365: """javascript"""
2366: return sendFile(self, 'js/js_lib.js', 'text/plain')
2367:
2368: def getGraphicCoords(self):
2369: """Give list of coordinates"""
2370: subColTypes=['ECHO_collection','ECHO_resource']
2371: ids=[]
2372: for entrySearch in self.ZopeFind(self,obj_metatypes=subColTypes):
2373: object=entrySearch[1]
2374: if hasattr(object,'coords'):
2375: for coordtemp in object.coords:
2376: if len(coordtemp)>3:
2377: coord=coordtemp[0:4]
2378: label=""
2379: vc=""
2380: if hasattr(object,'label') and not object.label=="":
2381: label=object.label
2382: elif hasattr(object,'title') and not object.title=="":
2383: label=object.title
2384: else:
2385: label=object.getId()
2386: if object.viewClassification != "":
2387: vc=object.viewClassification
2388: else:
2389: if len(coordtemp) > 4 and coordtemp[4] != "":
2390: vc="view point"
2391: else:
2392: vc="area"
2393: ids.append([string.join(coord,", "),object.getId(),label,object,coordtemp,vc])
2394: return ids
2395:
2396:
2397:
2398:
2399: getSubCols = ECHO_helpers.getSubCols
2400:
2401: Globals.InitializeClass(ECHO_collection)
2402:
2403: def manage_addECHO_collectionForm(self):
2404: """Add collection form"""
2405: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_collectionForm.zpt').__of__(self)
2406: return pt()
2407:
2408:
2409: def manage_addECHO_collection(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour=""):
2410: """add a echo collection"""
2411:
2412:
2413: newObj=ECHO_collection(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
2414:
2415: self._setObject(id,newObj)
2416:
2417: if RESPONSE is not None:
2418: RESPONSE.redirect('manage_main')
2419:
2420: class ECHO_group(ECHO_collection):
2421: """ECHO Gruppe"""
2422: security=ClassSecurityInfo()
2423: meta_type="ECHO_group"
2424:
2425: manage_options = Folder.manage_options+(
2426: {'label':'Main Config','action':'ECHO_group_config'},
2427: {'label':'Rerender Links','action':'ECHO_rerenderLinksMDWarning'},
2428: {'label':'Graphics','action':'ECHO_graphicEntry'},
2429: )
2430:
2431: security.declareProtected('View','index_html')
2432:
2433: def showRDF(self):
2434: """showrdf"""
2435: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
2436: ret="""<?xml version="1.0" encoding="utf-8"?>\n<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ECHONAVIGATION="http://www.echo.eu/rdf#">\n"""
2437: ret+=self.getRDF(urn="echo:collectionroot")+"\n"
2438:
2439: ret+="""</RDF:RDF>"""
2440:
2441: return ret
2442:
2443: def getRDF(self,urn=None):
2444: """rdf of the collection"""
2445: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
2446:
2447: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
2448:
2449:
2450: if not urn:
2451: urn=self.absolute_url()
2452: li="""<RDF:li RDF:resource="%s" />\n"""
2453:
2454:
2455: for content in contents:
2456: ret+=content[1].getRDF()+"\n"
2457:
2458: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn
2459: for content in contents:
2460: nurn=content[1].absolute_url()
2461: ret+=li%nurn
2462: return ret+"</RDF:Seq>"
2463:
2464: def index_html(self):
2465: """standard page"""
2466: displayedObjects=self.ZopeFind(self,obj_metatypes=displayTypes)
2467: #if (len(displayedObjects)==1) and (displayedObjects[0][1].meta_type=="ECHO_collection"): # nur ein Object dann redirect auf dieses Object
2468: # return self.REQUEST.RESPONSE.redirect(displayedObjects[0][1].absolute_url())
2469:
2470: if 'index.html' in self.__dict__.keys():
2471: return getattr(self,'index.html')()
2472:
2473: elif 'overview' in self.__dict__.keys():
2474: return self.showOverview()
2475: elif hasattr(self,'group_index_template'):
2476: return self.group_index_template()
2477: elif hasattr(self,'collection_index_template'):
2478: return self.collection_index_template()
2479: elif hasattr(self,'main_index_template'):
2480: return self.main_index_template()
2481:
2482: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_main_index_template_standard.zpt').__of__(self)
2483: pt.content_type="text/html"
2484: return pt()
2485:
2486: def ECHO_group_config(self):
2487: """Main configuration"""
2488:
2489: if not hasattr(self,'weight'):
2490: self.weight=""
2491:
2492: if not hasattr(self,'sortfield'):
2493: self.sortfield="weight"
2494:
2495: if not hasattr(self,'coords'):
2496: self.coords=[]
2497:
2498: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_group.zpt').__of__(self)
2499: return pt()
2500:
2501: def changeECHO_group(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
2502: """Änderung der Properties"""
2503:
2504: self.secondaryLink=secondaryLink
2505: self.secondaryLinkTitle=secondaryLinkTitle
2506: self.imageTag=imageTag
2507: self.bgcolour=bgcolour
2508: self.logo=logo
2509:
2510: if coords:
2511: coordsnew=[ string.split(x,",") for x in coords]
2512: self.coords=coordsnew[0:]
2513: else:
2514: coordsnew=None
2515: self.coords=None
2516:
2517: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
2518:
2519:
2520:
2521: self.sortfield=sortfield
2522:
2523: if RESPONSE is not None:
2524: RESPONSE.redirect('manage_main')
2525:
2526: def getLogo(self):
2527: """logo ausgeben"""
2528: try:
2529: return self.logo
2530: except:
2531: return "ECHO_groups"
2532:
2533: def content_html(self):
2534: """template fuer content"""
2535: return content_html(self,'group')
2536:
2537:
2538:
2539: def manage_addECHO_groupForm(self):
2540: """Add group form"""
2541: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_groupForm.zpt').__of__(self)
2542: return pt()
2543:
2544:
2545: def manage_addECHO_group(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
2546: """add a echo group"""
2547:
2548:
2549: newObj=ECHO_group(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
2550:
2551: setattr(newObj,'logo',logo)
2552: self._setObject(id,newObj)
2553:
2554: if RESPONSE is not None:
2555: RESPONSE.redirect('manage_main')
2556:
2557: Globals.InitializeClass(ECHO_group)
2558:
2559:
2560: class ECHO_userFolder(UserFolder):
2561: """User folder for Intranet"""
2562: _domain_auth_mode=1 # Identification via domain
2563: meta_type="ECHO_userFolder"
2564:
2565: def authenticate(self, name, password, request):
2566: emergency = self._emergency_user
2567: if name is None:
2568: return None
2569: if emergency and name==emergency.getUserName():
2570: user = emergency
2571: else:
2572: user = self.getUser(name)
2573: if user is not None and user.authenticate(password, request):
2574: return user
2575: else:
2576: return None
2577:
2578: def domainSpecMatch(self,spec, request):
2579: host=''
2580: addr=''
2581:
2582: # Fast exit for the match-all case
2583: if len(spec) == 1 and spec[0] == '*':
2584: return 1
2585:
2586: if request.has_key('REMOTE_HOST'):
2587: host=request['REMOTE_HOST']
2588:
2589: if request.has_key('REMOTE_ADDR'):
2590: addr=request['REMOTE_ADDR']
2591:
2592: if request.has_key('HTTP_X_FORWARDED_FOR'):
2593: addr=request['HTTP_X_FORWARDED_FOR']
2594:
2595:
2596: if not host and not addr:
2597: return 0
2598:
2599: if not host:
2600: try: host=socket.gethostbyaddr(addr)[0]
2601: except: pass
2602: if not addr:
2603: try: addr=socket.gethostbyname(host)
2604: except: pass
2605:
2606:
2607: _host=host.split('.')
2608: _addr=addr.split('.')
2609: _hlen=len(_host)
2610: _alen=len(_addr)
2611:
2612: for ob in spec:
2613: sz=len(ob)
2614: _ob=ob.split('.')
2615: _sz=len(_ob)
2616:
2617: mo = addr_match(ob)
2618: if mo is not None:
2619: if mo.end(0)==sz:
2620: fail=0
2621: for i in range(_sz):
2622: a=_addr[i]
2623: o=_ob[i]
2624: if (o != a) and (o != '*'):
2625: fail=1
2626: break
2627: if fail:
2628: continue
2629: return 1
2630:
2631: mo = host_match(ob)
2632: if mo is not None:
2633: if mo.end(0)==sz:
2634: if _hlen < _sz:
2635: continue
2636: elif _hlen > _sz:
2637: _item=_host[-_sz:]
2638: else:
2639: _item=_host
2640: fail=0
2641: for i in range(_sz):
2642: h=_item[i]
2643: o=_ob[i]
2644: if (o != h) and (o != '*'):
2645: fail=1
2646: break
2647: if fail:
2648: continue
2649: return 1
2650: return 0
2651:
2652: Globals.default__class_init__(ECHO_userFolder)
2653:
2654:
2655:
2656: def manage_addECHO_userFolder(self,dtself=None,REQUEST=None,**ignored):
2657: """add a user folder """
2658: f=ECHO_userFolder()
2659: self=self.this()
2660: try: self._setObject('acl_users', f)
2661: except: return MessageDialog(
2662: title ='Item Exists',
2663: message='This object already contains a User Folder',
2664: action ='%s/manage_main' % REQUEST['URL1'])
2665: self.__allow_groups__=f
2666: if REQUEST is not None:
2667: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
2668:
2669: def manage_addECHO_userFolderForm(self):
2670: """add a user folder form"""
2671: return manage_addECHO_userFolder(self)
2672:
2673: class ECHO_root(Folder,Persistent,Implicit):
2674: """ECHO Root Folder"""
2675:
2676: security=ClassSecurityInfo()
2677:
2678: meta_type="ECHO_root"
2679:
2680:
2681: manage_options=Folder.manage_options+(
2682: {'label':'Main Config','action':'ECHO_copyright_configForm'},
2683: {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},
2684: )
2685:
2686:
2687: def showRDF(self):
2688: """showrdf"""
2689: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
2690: ret="""<?xml version="1.0" encoding="utf-8"?>\n<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ECHONAVIGATION="http://www.echo.eu/rdf#">\n"""
2691: ret+=self.getRDF(urn="echo:collectionroot")+"\n"
2692:
2693: ret+="""</RDF:RDF>"""
2694: return ret
2695:
2696:
2697: def reloadMetaDataFromStorageWarning(self,RESPONSE=None):
2698: """warning"""
2699: pt=PageTemplateFile('Products/ECHO_content/zpt/reloadMetaDataFromStorageWarning.zpt').__of__(self)
2700: pt.content_type="text/html"
2701: return pt()
2702:
2703: def reloadMetaDataFromStorage(self,RESPONSE=None):
2704: """reload MD from Storage"""
2705:
2706: return reloadMetaDataFromStorage(self,RESPONSE)
2707:
2708: def getRDF(self,urn=None):
2709: """rdf of the collection"""
2710:
2711: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
2712:
2713: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
2714:
2715: li="""<RDF:li RDF:resource="%s" />\n"""
2716:
2717:
2718: for content in contents:
2719: ret+=content[1].getRDF()+"\n"
2720:
2721: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn
2722: for content in contents:
2723: nurn=content[1].absolute_url()
2724: ret+=li%nurn
2725: return ret+"</RDF:Seq>"
2726:
2727:
2728: def showContent(self,path):
2729: """return content/html"""
2730:
2731: return urllib.urlopen(path+"/content_html").read()
2732:
2733: def getImageViewers(self):
2734: """images"""
2735: viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject'])
2736: return viewers
2737:
2738:
2739: def getBibTag(self,tag,content):
2740: """get field tag für index-meta-generation"""
2741: if not content or content=="":
2742: return ""
2743: ret="<%s>"%tag
2744: #ret+=urllib.quote(content)
2745: ret+=content
2746:
2747: ret+="</%s>"%tag
2748: return ret
2749:
2750: def getValueFromClass(self,field,found):
2751: """retattribute falss existing"""
2752: try:
2753:
2754: return getattr(found,field).decode('ascii','ignore')
2755: except:
2756: return ""
2757:
2758: def getImageTag(self):
2759: """needed by main_template"""
2760: return ""
2761: secondaryLink="" #needed by main_template
2762: secondaryLinkTitle="" #needed by main_template
2763:
2764: def getBgcolour(self):
2765: """hack"""
2766: return "#dddddd"
2767:
2768: def contentTypeSelector_HTML(self,selected=None):
2769: """give type selector"""
2770: if not selected:
2771: retStr="<option selected>\n"
2772: else:
2773: retStr="<option>\n"
2774:
2775: try: # erste version contentTypes exists
2776: for contentType in self.ZopeFind(self.contentTypes,obj_metatypes=["ECHO_contentType","OSAS_MetadataMapping"]):
2777: if selected and (contentType[0]==selected):
2778: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
2779: else:
2780: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
2781: except:
2782: try:
2783: for contentType in self.ZopeFind(self.standardMD,obj_metatypes=["OSAS_MetadataMapping"]):
2784: if selected and (contentType[0]==selected):
2785: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
2786: else:
2787: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
2788: except:
2789: """nothing"""
2790:
2791: return retStr
2792:
2793: def renderingTypeSelector_HTML(self,selected=None):
2794: """give type selector"""
2795: if not selected:
2796: retStr="<option selected>\n"
2797: else:
2798: retStr="<option>\n"
2799:
2800: try: # erste version renderingTypes exists
2801: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
2802: if selected and (renderingType[0]==selected):
2803: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
2804: else:
2805: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
2806: except:
2807: """nothing"""
2808: return retStr
2809:
2810: def renderingTypeSelector_HTML(self,selected=None):
2811: """give type selector"""
2812: if not selected:
2813: retStr="<option selected>\n"
2814: else:
2815: retStr="<option>\n"
2816:
2817: try: # erste version renderingTypes exists
2818: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
2819: if selected and (renderingType[0]==selected):
2820: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
2821: else:
2822: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
2823: except:
2824: """nothing"""
2825: return retStr
2826:
2827:
2828: def copyrightTypeSelector_HTML(self, object=None, selected=None,first=None):
2829: """give type selector"""
2830:
2831: if not first:
2832: if not selected:
2833: retStr="<option selected>\n"
2834: else:
2835: retStr="<option>\n"
2836: else:
2837: if not selected:
2838: retStr="""<option selected value="%s">%s\n"""%first
2839: else:
2840: retStr="""<option value="%s">%s\n"""%first
2841:
2842:
2843: try: # erste version copyrightTypes exists
2844: for copyrightType in self.ZopeFind(self.copyrightTypes,obj_metatypes=["ECHO_copyrightType"]):
2845: if selected and (copyrightType[0]==selected):
2846: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2847: else:
2848: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2849:
2850: for copyrightTypeSelf in self.ZopeFind(object,obj_metatypes=["ECHO_copyrightType"],search_sub=1):
2851: if selected and (copyrightTypeSelf[0]==selected):
2852: retStr+="""<option selected value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
2853: else:
2854: retStr+="""<option value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
2855:
2856: except:
2857: """nothing"""
2858:
2859: return retStr
2860:
2861: def partnerSelector_HTML(self,selected=None):
2862: """give type selector"""
2863: if not selected:
2864: retStr="<option selected>\n"
2865: else:
2866: retStr="<option>\n"
2867:
2868: try: # erste version copyrightTypes exists
2869: for copyrightType in self.ZopeFind(self.partners,obj_metatypes=["ECHO_partner"]):
2870: if selected and (copyrightType[0]==selected):
2871: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2872: else:
2873: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2874: except:
2875: """nothing"""
2876: return retStr
2877:
2878: mediaTypes=['all','text','images','sound','video'] # konfigurierbar in neuer version über echoroot??
2879:
2880: def mediaTypeSelector_HTML(self,selected=None):
2881: """give type selector"""
2882: if not selected:
2883: retStr="<option selected>\n"
2884: else:
2885: retStr="<option>\n"
2886:
2887: try: # erste version mediatypesTypes exists
2888: for mediaType in self.mediaTypes:
2889: if selected and (mediaType in selected):
2890: retStr+="""<option selected value="%s">%s\n"""%(mediaType,mediaType)
2891: else:
2892: retStr+="""<option value="%s">%s\n"""%(mediaType,mediaType)
2893: except:
2894: """nothing"""
2895: return retStr
2896:
2897:
2898: def patchContentType(self,obj=None):
2899: """austauschen content_type with contentType (patch bei umstieg von alter Version)"""
2900:
2901:
2902: if not obj:
2903: obj = self
2904:
2905: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate'])
2906:
2907: for entry in entries:
2908: setattr(entry[1],'contentType',entry[1].content_type)
2909: #entry[1].contentType == entry[1].content_type
2910:
2911: if entry[1].meta_type == 'ECHO_collection':
2912: entry[1].patchContentType(entry[1])
2913:
2914:
2915: return "changed all contenttypes in: "+self.title
2916:
2917:
2918: def patchViewClassification(self,obj=None):
2919: """setze viewClassification heuristisch"""
2920:
2921: def checkIfArrow(obj):
2922: if hasattr(obj,'coords'):
2923: for coordtemp in obj.coords:
2924:
2925: if (len(coordtemp)>4) and not (coordtemp[4]==''):
2926: return 4
2927: return None
2928: return None
2929:
2930: if not obj:
2931: obj = self
2932:
2933: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_group'])
2934:
2935: for entry in entries:
2936:
2937: if checkIfArrow(entry[1]):
2938: setattr(entry[1],'viewClassification','view point')
2939: else:
2940: setattr(entry[1],'viewClassification','area')
2941:
2942: #entry[1].contentType == entry[1].content_type
2943:
2944: if entry[1].meta_type in ['ECHO_collection','ECHO_group']:
2945: entry[1].patchViewClassification(entry[1])
2946:
2947:
2948: return "changed all contenttypes in: "+self.title
2949:
2950: def ECHO_newViewerLink(self,obj=None):
2951: """change links (:86 faellt weg)"""
2952:
2953: if not obj:
2954: obj = self
2955:
2956: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
2957:
2958: for entry in entries:
2959:
2960: if entry[1].meta_type == 'ECHO_resource':
2961:
2962: entry[1].link=re.sub('\:86','',entry[1].link)
2963:
2964: else:
2965:
2966: entry[1].ECHO_newViewerLink(entry[1])
2967:
2968: return "Rerenderd all links to resources in: "+self.title
2969:
2970: def __init__(self,id,title):
2971: """init"""
2972: self.id = id
2973: self.title=title
2974:
2975: def deleteSpace(self,str):
2976: """delete space at the end of a line"""
2977: if str[len(str)-1]==" ":
2978: return str[0:len(str)-1]
2979: else:
2980: return str
2981:
2982:
2983:
2984: # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt
2985:
2986: def formatAscii(self,str,url=None):
2987: """ersetze ascii umbrueche durch <br>"""
2988: #url=None
2989: if url:
2990:
2991: retStr=""
2992: words=str.split("\n")
2993:
2994: for word in words:
2995: strUrl=url%word
2996:
2997: retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
2998: str=retStr
2999: if str:
3000: return re.sub(r"[\n]","<br/>",str)
3001: else:
3002: return ""
3003:
3004: def link2html(self,str):
3005: """link2html fuer VLP muss hier noch raus"""
3006: if str:
3007:
3008: str=re.sub("\&","&",str)
3009: dom=xml.dom.minidom.parseString("<?xml version='1.0' encoding='utf-8'?><txt>"+str+"</txt>")
3010: links=dom.getElementsByTagName("link")
3011:
3012:
3013: for link in links:
3014: link.tagName="a"
3015: ref=link.getAttribute("ref")
3016: if self.checkRef(ref):
3017: link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref)
3018:
3019: newxml=dom.toxml('utf-8')
3020: match=re.sub(r'<\?xml version=\"1.0\" encoding=\"utf-8\"\?>\n<txt>','',newxml)
3021: match=re.sub(r'</txt>','',match)
3022:
3023: return match
3024:
3025: return ""
3026:
3027: def xml2html(self,str):
3028: """link2html fuer VLP muss hier noch raus"""
3029: if str:
3030:
3031: str=re.sub("\&","&",str)
3032: dom=xml.dom.minidom.parseString(str)
3033: links=dom.getElementsByTagName("link")
3034:
3035:
3036: for link in links:
3037: link.tagName="a"
3038: ref=link.getAttribute("ref")
3039: if self.checkRef(ref):
3040: link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref)
3041:
3042: return dom.toxml('utf-8')
3043: return ""
3044:
3045: def checkRef(self,ref):
3046: dbs={'vl_literature':'AND CD LIKE \'%lise%\'','vl_technology':'','vl_people':''}
3047: res=None
3048: for db in dbs.keys():
3049:
3050: res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))
3051: return res
3052:
3053: #Ende Methode fuer vlp
3054:
3055: def PgQuoteString(self,string):
3056: """Quote string"""
3057:
3058: return libpq.PgQuoteString(string)
3059:
3060: def getPartners(self):
3061: """Get list of Partners. Presently only from a subfolder partners"""
3062:
3063: return [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])]
3064:
3065:
3066:
3067:
3068:
3069: def getPartnersXML(self):
3070: """partner liste als xml"""
3071: partners=self.getPartners()
3072: ret="""<?xml version="1.0" encoding="utf-8" ?>
3073: <partners>"""
3074:
3075: for partner in partners:
3076: ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),unicode(partner.title,'utf-8','replace'))
3077:
3078: return ret+"\n</partners>"
3079:
3080: def getCollectionTree(self):
3081: """get the collection tree (list of triples (parent,child, depth)"""
3082:
3083: def getCollection(object,depth=0):
3084: depth+=1
3085: collections=[]
3086: for entry in object.__dict__.keys():
3087: element=getattr(object,entry)
3088: try:
3089: if element.meta_type=="ECHO_collection":
3090: collections.append((object,element,depth))
3091: collections+=getCollection(element,depth)
3092: except:
3093: """nothing"""
3094: return collections
3095:
3096:
3097: return getCollection(self)
3098:
3099: def getCollectionTreeIds(self):
3100: """Show the IDs of the Tree"""
3101: ret=[]
3102: for collection in self.getCollectionTree():
3103: ret.append((collection[0].getId(),collection[1].getId(),collection[2]))
3104: return ret
3105:
3106: def getResourcesHTML(self,viewerType=None,filter=None):
3107: """gebe all ressourcen aus"""
3108:
3109: def sortHTML(x,y):
3110: return cmp(x[1].title,y[1].title)
3111:
3112: ret="""<html><body><h2>Resources in ECHO</h3>"""
3113:
3114: resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
3115: ret+="""<h3>Found %i resources</h3>"""%len(resources)
3116: resources.sort(sortHTML)
3117: for resource in resources:
3118: echo_url=resource[1].absolute_url()
3119:
3120: if hasattr(resource[1],'title'):
3121: title=resource[1].title
3122: else:
3123: title="None"
3124: if filter:
3125: if re.search(filter,title):
3126: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
3127: else:
3128: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
3129:
3130: ret +="""\n</body></html>"""
3131:
3132: #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html")
3133: #self.REQUEST.RESPONSE.write(ret)
3134: return ret
3135:
3136: def getResourcesXML(self,viewerType=None,filter=None):
3137: """gebe all ressourcen aus"""
3138: ret="""<?xml version="1.0" ?>
3139: <index>"""
3140: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3141:
3142: echo_url=resource[1].absolute_url()
3143: if hasattr(resource[1],'link'):
3144: viewer_url=resource[1].link
3145: else:
3146: viewer_url="NO URL"
3147: if filter:
3148: if re.search(filter,viewer_url):
3149: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3150: else:
3151: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3152: ret +="""\n</index>"""
3153:
3154: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3155: self.REQUEST.RESPONSE.write(ret)
3156:
3157: def getFullTextsXML(self,viewerType=None,filter=None):
3158: """gebe all ressourcen aus"""
3159: ret="""<?xml version="1.0" ?>
3160: <index>"""
3161: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3162:
3163: echo_url=resource[1].absolute_url()
3164: if resource[1].getFullTextXML(noredirect="yes"):
3165: if hasattr(resource[1],'link'):
3166: viewer_url=echo_url+"/getFullTextXML"
3167: else:
3168: viewer_url="NO URL"
3169: if filter:
3170: if re.search(filter,viewer_url):
3171: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3172: else:
3173: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3174: ret +="""\n</index>"""
3175:
3176:
3177: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3178: self.REQUEST.RESPONSE.write(ret)
3179:
3180:
3181: def getMetaDatasXML(self,viewerType=None,filter=None):
3182: """gebe all ressourcen aus"""
3183: ret="""<?xml version="1.0" ?>
3184: <index>"""
3185: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3186:
3187: echo_url=resource[1].absolute_url()
3188:
3189: if hasattr(resource[1],'link'):
3190: meta_url=echo_url+"/getMetaDataXML"
3191: else:
3192: meta_url="NO_URL"
3193:
3194: if filter and not re.search(filter,viewer_url):
3195: continue
3196:
3197: #modificationDate=time.strptime(str(resource[1].bobobase_modification_time()),"%Y/%m/%d %H:%M:%S %Z")
3198:
3199: modificationDate=resource[1].bobobase_modification_time().strftime("%Y/%m/%d %H:%M:%S")
3200:
3201: ret+="""\n<resource resourceLink="%s" metaLink="%s" modificationDate="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(meta_url,safe='/:?'),modificationDate)
3202:
3203:
3204: ret +="""\n</index>"""
3205:
3206:
3207: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3208: self.REQUEST.RESPONSE.write(ret)
3209:
3210:
3211: def findPartners(self):
3212: """find all partners in partners"""
3213: par=self.ZopeFind(self.partners, obj_metatypes='ECHO_partner')
3214: return par
3215:
3216: def getPartnerFromID(self):
3217: """find partner form ID return object"""
3218: pa=self.REQUEST['partner']
3219: par=self.ZopeFind(self.partners, obj_ids=[pa])
3220: return par
3221:
3222: def getPartnerFromIDParameter(self, id):
3223: """ find partners from ID"""
3224: par=self.ZopeFind(self.partners, obj_ids=[id])
3225: return par
3226:
3227:
3228:
3229: def manage_addECHO_root(self,id,title,RESPONSE=None):
3230: """Add an ECHO_root"""
3231: self._setObject(id,ECHO_root(id,title))
3232:
3233: if RESPONSE is not None:
3234: RESPONSE.redirect('manage_main')
3235:
3236: def manage_addECHO_rootForm(self):
3237: """Nothing yet"""
3238: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_root.zpt').__of__(self)
3239: return pt()
3240:
3241: class ECHO_copyrightType(Folder):
3242: """copyright typ"""
3243:
3244: meta_type="ECHO_copyrightType"
3245:
3246: def __init__(self,id,title,label,url):
3247: """init"""
3248: self.id=id
3249: self.title=title
3250: self.label=label
3251: self.url=url
3252:
3253: manage_options = Folder.manage_options+(
3254: {'label':'Main Config','action':'ECHO_copyrightType_config_mainForm'},
3255: )
3256:
3257: def ECHO_copyrightType_config_mainForm(self):
3258: """change form"""
3259: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_copyrightType').__of__(self)
3260: pt.content_type="text/html"
3261: return pt()
3262:
3263: def ECHO_copyrightType_config_main(self,title,label,url,RESPONSE=None):
3264: """change"""
3265: self.title=title
3266: self.label=label
3267: self.url=url
3268:
3269: if RESPONSE is not None:
3270: RESPONSE.redirect('manage_main')
3271:
3272: def manage_addECHO_copyrightTypeForm(self):
3273: """Form for adding a ressource"""
3274: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_copyrightTypeForm.zpt').__of__(self)
3275: return pt()
3276:
3277:
3278: def manage_addECHO_copyrightType(self,id,title,label,url,RESPONSE=None):
3279: """addaresource"""
3280:
3281: newObj=ECHO_copyrightType(id,title,label,url)
3282:
3283: self._setObject(id,newObj)
3284:
3285: if RESPONSE is not None:
3286: RESPONSE.redirect('manage_main')
3287:
3288:
3289:
3290: class ECHO_partner(Image,Persistent):
3291: """ECHO Partner"""
3292:
3293: meta_type="ECHO_partner"
3294:
3295: def __init__(self, id, title,url, file, copyrightType, person, email, country, color, content_type='', precondition=''):
3296: self.__name__=id
3297: self.title=title
3298: self.url=url
3299: self.person=person
3300: self.email=email
3301: self.country=country
3302: self.color=color
3303: self.precondition=precondition
3304: self.copyrightType=copyrightType
3305: data, size = self._read_data(file)
3306: content_type=self._get_content_type(file, data, id, content_type)
3307: self.update_data(data, content_type, size)
3308:
3309: manage_options = Image.manage_options+(
3310: {'label':'Partner Information','action':'ECHO_partner_config'},
3311: )
3312:
3313:
3314: def changeECHO_partner(self,url,copyrightType,person, email, country, color, RESPONSE=None):
3315: """Change main information"""
3316: self.url=url
3317: self.person=person
3318: self.email=email
3319: self.country=country
3320: self.color=color
3321: self.copyrightType=copyrightType
3322: if RESPONSE is not None:
3323: RESPONSE.redirect('manage_main')
3324:
3325:
3326:
3327: def ECHO_partner_config(self):
3328: """Main configuration"""
3329: if not hasattr(self,'url'):
3330: self.url=""
3331: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_partner.zpt').__of__(self)
3332: return pt()
3333:
3334:
3335: manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(),
3336: Kind='ECHO_partner',kind='ECHO_partner')
3337:
3338:
3339:
3340: def manage_addECHO_partner(self, id, url, person, email, country, color, file=None, copyrightType='', title='', precondition='', content_type='',
3341: REQUEST=None):
3342: """
3343: Add a new ECHO_partner object.
3344:
3345: Creates a new ECHO_partner object 'id' with the contents of 'file'.
3346: Based on Image.manage_addImage
3347: """
3348:
3349: id=str(id)
3350: title=str(title)
3351: content_type=str(content_type)
3352: precondition=str(precondition)
3353:
3354: id, title = OFS.Image.cookId(id, title, file)
3355:
3356: self=self.this()
3357:
3358: # First, we create the image without data:
3359: self._setObject(id, ECHO_partner(id,title,url,'',copyrightType, person, email, country, color, content_type, precondition))
3360:
3361: # Now we "upload" the data. By doing this in two steps, we
3362: # can use a database trick to make the upload more efficient.
3363: if file:
3364: self._getOb(id).manage_upload(file)
3365: if content_type:
3366: self._getOb(id).content_type=content_type
3367:
3368: if REQUEST is not None:
3369: try: url=self.DestinationURL()
3370: except: url=REQUEST['URL1']
3371: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
3372: return id
3373:
3374:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>