Annotation of ECHO_content/ECHO_helpers.py, revision 1.31
1.30 dwinter 1: import re
1.28 dwinter 2: import string
1.17 dwinter 3: import socket
1.15 dwinter 4: import urllib
1.29 casties 5: import string
1.21 dwinter 6: import xml.dom.minidom
1.24 dwinter 7: from types import *
1.25 dwinter 8: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
1.29 casties 9: from OFS.SimpleItem import SimpleItem
1.25 dwinter 10: from Globals import package_home
1.29 casties 11: import Globals
12: from AccessControl import ClassSecurityInfo
1.25 dwinter 13: import os.path
14:
15: displayTypes = ['ZSQLExtendFolder','ZSQLBibliography','ECHO_group','ECHO_collection','ECHO_resource','ECHO_link','ECHO_sqlElement','ECHO_pageTemplate','ECHO_externalLink','ImageCollectionIFrame','VLP_resource','VLP_essay','ECHO_ZCatalogElement','ImageCollection','versionedFileFolder']
16:
17: def content_html(self,type):
18: """template fuer content"""
19: #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
20: #
21: #if templates:
22: # return templates[0][1]()
23:
24: if hasattr(self,type+"_template"):
25: obj=getattr(self,type+"_template")
26: return obj()
27: else:
28: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
29: pt.content_type="text/html"
30: return pt()
31:
32:
33:
34: class ECHO_basis:
35: """basis eigenschaften fuer echo objekte"""
1.26 dwinter 36: def showRDF(self):
37: """showrdf"""
38: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
39: 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"""
40: ret+=self.getRDF(urn="echo:colllectionroot")+"\n"
41:
42: ret+="""</RDF:RDF>"""
43: return ret
44:
45:
46:
47: def createSubElementRDF(self,urn=None):
48: """rdf list"""
49: if not urn:
50: urn=self.absolute_url()
51: ret=""
52:
53: rettemp="""<RDF:Seq RDF:about="%s">\n"""%urn
54: flag=0
55:
56: li="""<RDF:li RDF:resource="%s" />\n"""
57: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
58: nurn=self.absolute_url()+'/getFullTextXML'
59: rettemp+=li%nurn
60: flag=1
61: if not ('<error>' in self.getImageView(noredirect='Yes')):
62: nurn=self.absolute_url()+'/getImageView'
63: rettemp+=li%nurn
64: flag=1
65:
66:
67: if not ('<error>' in self.showMetaDataXML()):
68: nurn=self.absolute_url()+'/showMetaDataXML'
69: rettemp+=li%nurn
70: flag=1
71:
72: rettemp+="</RDF:Seq>"
73:
74: if flag==1:
75: ret+=rettemp
76:
77: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
78: nurn=self.absolute_url()+'/getFullTextXML'
79: ret+=getRDFDescription(self,self.absolute_url()+'/getFullTextXML',urn=nurn,nameDef="Fulltext",typeName="ECHO_fulltext")
80:
81: if not ('<error>' in self.getImageView(noredirect='Yes')):
82: nurn=self.absolute_url()+'/getImageView'
83: ret+=getRDFDescription(self,self.absolute_url()+'/getImageView',urn=nurn,nameDef="Image View",typeName="ECHO_imageview")
84:
85: if not ('<error>' in self.showMetaDataXML()):
86: nurn=self.absolute_url()+'/showMetaDataXML'
87: ret+=getRDFDescription(self,self.absolute_url()+'/showMetaDataXML',urn=nurn,nameDef="Metadata",typeName="ECHO_metaData")
88:
89: return ret
90:
1.25 dwinter 91: def content_html(self,type="collection"):
92: """template fuer content bei einbau und ECHO_Umgebung"""
93:
94: return content_html(self,type)
95:
96: def getTitle(self):
97: """title"""
98: try:
99: return self.title.encode('utf-8','ignore')
100: except:
101: self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
102: return self.title.encode('utf-8','ignore')
103:
104: def getLabel(self):
105: """title"""
106: try:
107: return self.label.encode('utf-8','ignore')
108: except:
109: self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
110: return self.label.encode('utf-8','ignore')
111:
112:
113: def changeECHOEntriesForm(self):
114: """change Entries for the ECHO Navigation environment"""
115: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHOEntriesForm')).__of__(self)
116: return pt()
117:
1.26 dwinter 118: def changeECHOEntries(self,label,weight,description,queryString,RESPONSE=None):
1.25 dwinter 119: """change Entries for the ECHO Navigation environment
120: @param label: label fuer die Navigation"""
121: self.label=label
122: self.weight=weight
123: self.description=description
1.26 dwinter 124: self.queryString=queryString
1.25 dwinter 125:
126: if RESPONSE:
127: RESPONSE.redirect("manage_main")
128:
129: manage_options=({'label':'change ECHO Navigation Entries','action':'changeECHOEntriesForm'},)
130:
1.31 ! casties 131:
! 132: def hasOverview(self):
! 133: """returns if there is an overview graphics"""
! 134: return hasattr(self, 'overview')
! 135:
! 136: def hasParentOverview(self):
! 137: """returns if the parent has an overview graphics"""
! 138: return hasattr(self.aq_parent, 'overview')
! 139:
! 140: def getOverview(self):
! 141: """map overview graphics"""
! 142: #return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
! 143: if self.hasOverview():
! 144: return getattr(self, 'overview')
! 145: return None
! 146:
1.29 casties 147: def getMapAreas(self):
148: """returns the list of MapAreas"""
149: # get all contained MapAreas
150: areas = [res[1] for res in self.ZopeFind(self, obj_metatypes=('MapArea'))]
151: return areas
152:
153: def addMapArea(self, newarea):
154: """add a map area to this object"""
155: if (newarea.id is None):
156: # create new id
157: areas = self.getMapAreas()
158: newarea.id = "a%02d"%len(areas)
159: self._setObject(newarea.id, newarea)
160:
1.31 ! casties 161: def ECHO_graphicEntry(self):
! 162: """change map coordinates"""
! 163: if self.hasParentOverview():
! 164: pt=zptFile(self, 'zpt/ECHO_draw.zpt')
! 165: return pt()
! 166: else:
! 167: return "NO OVERVIEW GRAPHICS"
! 168:
1.29 casties 169: def ECHO_addCoords(self,RESPONSE=None):
170: """change or add MapArea"""
171: #return self.REQUEST
172: # change existing areas
173: for area in self.getMapAreas():
174: id = area.getId()
175: if self.REQUEST.has_key('del.'+id):
176: # delete this area
177: self._delObject(id)
178: # return to same menu
179: if RESPONSE is not None:
180: RESPONSE.redirect('ECHO_graphicEntry')
181: return
182: # modify this area
183: coordstring = self.REQUEST.get('coords.'+id, '')
184: coords = string.split(coordstring, ',')
185: angle = self.REQUEST.get('angle.'+id, '0')
186: type = self.REQUEST.get('type.'+id, 'area')
187: if len(coords) == 4:
188: area.setCoordString(coordstring)
189: area.setAngle(angle)
190: area.setType(type)
191: # add new area
192: if self.REQUEST.has_key('add'):
193: coordstring = self.REQUEST.get('coords.new', '')
194: coords = string.split(coordstring, ',')
195: angle = self.REQUEST.get('angle.new', '0')
196: type = self.REQUEST.get('type.new', 'area')
197: if len(coords) == 4:
198: coords.append(angle)
199: area = MapArea(None, coords, type=type)
200: self.addMapArea(area)
201: # return to edit area menu
202: if RESPONSE is not None:
203: RESPONSE.redirect('ECHO_graphicEntry')
1.31 ! casties 204:
! 205: def createJSAreas(self, areas):
! 206: """create area calls for JavaScript"""
! 207: dynamical="\n"
! 208: for ob in areas:
! 209: if ob.isTypeArrow():
! 210: dynamical+="""addArea('%s', 'overview', %s, 'arrow');\n"""%(ob.getFullId(),ob.getCoordString())
! 211: else:
! 212: dynamical+="""addArea('%s', 'overview', %s, 'area');\n"""%(ob.getFullId(),ob.getCoordString())
! 213: return dynamical
! 214:
! 215: def createMapHead(self):
! 216: """create javascript include and script tags for head"""
! 217: pt=zptFile(self, 'zpt/ECHO_content_map_frag_js')
! 218: return pt()
! 219:
! 220: def createMapImg(self):
! 221: """generate img-tag for map"""
! 222: bt = BrowserCheck(self)
! 223: tag = ""
! 224: #src = self.REQUEST['URL1'] + "/overview"
! 225: src = self.getOverview().absolute_url()
! 226: if bt.isN4:
! 227: tag += '<ilayer id="overview" visibility="show"><img src="%s"></ilayer>'%src
! 228: else:
! 229: tag += '<img id="overview" src="%s" />'%src
! 230: return tag
! 231:
! 232: def createParentMapImg(self):
! 233: """generate img-tag for map of parent"""
! 234: return self.aq_parent.createMapImg()
! 235:
! 236: def createMapLink(self, ob, text=None):
! 237: """generate map link"""
! 238: bt = BrowserCheck(self)
! 239: id = ob.getFullId()
! 240: link = ob.getLinkId()
! 241: if text is None:
! 242: text = ob.getLabel()
! 243: if text is None:
! 244: text = "link"
! 245: tag = ""
! 246: if bt.isN4:
! 247: tag += '<ilayer id="a.%s"><a onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
! 248: tag += ">" + text + "</a></ilayer>"
! 249: else:
! 250: tag = '<a id="a.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
! 251: if ob.text:
! 252: tag += ' title="%s"'%ob.text
! 253: tag += ">" + text + "</a>"
! 254: return tag
! 255:
! 256: def createMapAux(self, ob, arrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil"):
! 257: """generate map link image, text and other stuff"""
! 258: bt = BrowserCheck(self)
! 259: id = ob.getFullId()
! 260: link = ob.getLinkId()
! 261: tiptext = ob.getText()
! 262: tag = ""
! 263:
! 264: if bt.isN4:
! 265: tag += '<layer id="i.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)">'%(id,id,id)
! 266: if ob.isTypeArrow():
! 267: rot = ob.angle
! 268: tag += '<a href="%s"><img border="0" src="%s&rot=%s" /></a>'%(link,arrowsrc,rot)
! 269: else:
! 270: tag += '<a href="%s"><img border="0" width="1000" height="1000" src="trans_img"'%(link)
! 271: if tiptext:
! 272: tag += ' alt="%s"'%tiptext
! 273: tag += ' /></a>'
! 274: tag += '</layer>'
! 275: else:
! 276: tag = '<a id="b.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank">'%(id,id,id,link)
! 277: if ob.isTypeArrow():
! 278: rot = ob.angle
! 279: if bt.isIEWin and bt.versIE > 5:
! 280: 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)
! 281: else:
! 282: tag += '<img id="i.%s" src="%s&rot=%s" border="1" style="position:absolute; top:-100px; left:-100px; border-style:none;" />'%(id,arrowsrc,rot)
! 283: else:
! 284: if bt.isIEWin:
! 285: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;background:url(area_img)"'%(id)
! 286: else:
! 287: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;"'%(id)
! 288: if tiptext:
! 289: tag += ' title="%s"'%tiptext
! 290: tag += '> </div>'
! 291: tag += '</a>'
! 292: return tag
1.29 casties 293:
294:
1.25 dwinter 295: #ende der echo erweiterungen
296:
1.24 dwinter 297:
298: def toList(field):
299: """Einzelfeld in Liste umwandeln"""
300: if type(field)==StringType:
301: return [field]
302: else:
303: return field
1.21 dwinter 304:
305: def getText(nodelist):
306:
307: rc = ""
308: for node in nodelist:
309: if node.nodeType == node.TEXT_NODE:
310: rc = rc + node.data
311: return rc
312:
1.25 dwinter 313: def getTextFromNode(nodename):
314: nodelist=nodename.childNodes
315: rc = ""
316: for node in nodelist:
317: if node.nodeType == node.TEXT_NODE:
318: rc = rc + node.data
319: return rc
320:
1.21 dwinter 321:
322: def readFieldFromXML(meta_url,parent,field):
323: """lesespezifisches metadatum"""
1.16 dwinter 324:
1.21 dwinter 325: try:
326: dom=xml.dom.minidom.parse(meta_url)
327:
328: except:
1.22 dwinter 329: try:
330: fh=urllib.urlopen(meta_url)
331: dom=xml.dom.minidom.parse(fh)
332: except:
333: return None
1.21 dwinter 334: if not dom: return None
335:
336: parent=dom.getElementsByTagName(parent)
1.23 dwinter 337: if not parent: return None
1.21 dwinter 338:
339: field=parent[0].getElementsByTagName(field)
340:
341: if not field: return None
342:
343: return getText(field[0].childNodes)
344:
345:
346:
1.15 dwinter 347: def urlopen(url):
348: """urlopen mit timeout"""
1.20 dwinter 349: socket.setdefaulttimeout(2)
350: ret=urllib.urlopen(url)
1.18 dwinter 351: socket.setdefaulttimeout(5)
1.20 dwinter 352: return ret
1.17 dwinter 353: # urlopener = urllib.URLopener()
354: #
355: # try:
356: # con = urlopener.open(url)
357: # return con
358: # except timeoutsocket.Timeout:
359: # return None
1.15 dwinter 360:
361:
1.25 dwinter 362:
1.11 dwinter 363:
1.6 dwinter 364:
1.14 dwinter 365: def checkOnlyOneInGroup(object):
1.6 dwinter 366: """check if object is a group and if it containt only one element it return this element"""
367: displayedObjects=object.ZopeFind(object,obj_metatypes=displayTypes)
368: if len(displayedObjects)==1: # nur ein Object dann redirect auf dieses Object
1.8 dwinter 369:
1.6 dwinter 370: return displayedObjects[0][1]
1.27 dwinter 371: else: return object
1.6 dwinter 372:
1.27 dwinter 373: def getSubCols(self,sortfield="weight",subColTypes= displayTypes,sortFieldMD=None):
1.1 dwinter 374:
1.27 dwinter 375: def sortfnc(sortfield,x,y):
376: xa=x[1].getMDValue(sortfield)
377: ya=y[1].getMDValue(sortfield)
378: print xa,ya
379: return cmp(xa,ya)
380:
381: sortWithMD = lambda sortfield : (lambda x,y : sortfnc(sortfield,x,y))
1.1 dwinter 382: ids=[]
1.6 dwinter 383: displayedObjects=self.ZopeFind(self,obj_metatypes=subColTypes)
384:
385:
386: for entry in displayedObjects:
1.25 dwinter 387:
1.3 dwinter 388: object=entry[1]
1.25 dwinter 389: ids.append(object)
390:
1.1 dwinter 391: try:
392: sortfield=self.sortfield
393: except:
394: """nothing"""
395:
396: tmplist=[]
397: for x in ids:
398: if hasattr(x,sortfield):
399: try:
1.7 dwinter 400:
1.1 dwinter 401: x=int(x)
402: except:
403: """nothing"""
404: tmp=getattr(x,sortfield)
405: else:
406: tmp=10000000
407: tmplist.append((tmp,x))
1.25 dwinter 408:
1.27 dwinter 409: if not sortFieldMD:
410: tmplist.sort()
411: else:
412: tmplist.sort(sortWithMD(sortFieldMD))
413:
1.1 dwinter 414: return [x for (key,x) in tmplist]
1.25 dwinter 415:
416: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
417: """Rerender all Links"""
418: ret=""
419:
420: if not obj:
421: obj = self
422:
423: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource'],search_sub=1)
424:
425: for entry in entries:
426: if entry[1].meta_type == 'ECHO_resource':
427: try:
428: entry[1].ECHO_getResourceMD(template="no")
429: if "title" in types:
430: entry[1].generate_title()
431: if "label" in types:
432: entry[1].generate_label()
433: ret+="OK:"+entry[0]+"-- "+entry[1].getTitle().decode('utf-8')+"-- "+entry[1].getTitle().decode('utf-8')+"<br>"
434: except:
435: ret+="Error:"+entry[0]+"<br>"
436:
437:
438:
439:
440: return "<html><body>"+ret+"Rerenderd all links to resources in: "+self.title+"</html></body>"
441:
442: def reloadMetaDataFromStorage(self,RESPONSE=None):
443: """copy metadata from the storage to ECHO"""
444: ret=""
445: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
446:
447: for resource in resources:
448: x=str(resource[1].copyIndex_meta2echo_resource())+"<br>"
449: ret+=x
450: #print x
451:
452:
453: if RESPONSE is not None:
454: #RESPONSE.redirect('./manage_main')
455: return "<html><body>"+ret+"</html></body>"
456:
457: return ret
458:
459: def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None):
460: """rdf"""
461:
462: ret=""
463: about="""<RDF:Description RDF:about="%s">"""
464: name="""<ECHONAVIGATION:name>%s</ECHONAVIGATION:name>"""
465: link="""<ECHONAVIGATION:link xlink:href="%s">%s</ECHONAVIGATION:link>"""
466: clickable="""<ECHONAVIGATION:linkClickable>%s</ECHONAVIGATION:linkClickable>"""
467: #link="""<ECHONAVIGATION:link RDF:about="%s"/>"""
468: type="""<ECHONAVIGATION:type>%s</ECHONAVIGATION:type>"""
469: #xlink="""<ECHONAVIGATION:xlink xlink:href="%s"/>"""
470: if not urn:
471: #urn="urn:"+re.sub('/',':',self.absolute_url())
472: urn=self.absolute_url()
473: about2=about%urn
474: if not nameDef:
475: if hasattr(self,'label') and not (self.label==""):
476: name2=name%self.label
477: elif not self.title=="":
478: name2=name%self.title
479: else:
480: name2=name%self.getId()
481:
482: name2=re.sub('&','&',name2)
483: else:
484: name2=name%nameDef
485:
486: linkURL=re.sub('http:','',linkURL)
487: linkURL2=re.sub('&','&',linkURL)
488: link2=link%(("http:"+linkURL2),("http:"+urllib.quote(linkURL)))
489: clickable2=clickable%"true"
490:
491: if not typeName:
492: type2=type%self.meta_type
493: else:
494: type2=type%typeName
495:
496: #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
497: ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
498: return ret
499:
500: def getCopyrightsFromForm(self,argv):
501: medias={}
502: partners={}
503: copyrights={}
504:
505: copyrightsFinal=[]
506: for arg in argv.keys():
507:
508: if arg[0:5]=='media':
509: nm=int(arg[5:])
510: medias[nm]=argv[arg]
511: elif arg[0:5]=='partn':
512: nm=int(arg[5:])
513: partners[nm]=argv[arg]
514: elif arg[0:5]=='copyr':
515: nm=int(arg[5:])
516: copyrights[nm]=argv[arg]
517:
518:
519:
520: copyrightsList=[(medias[nm],partners[nm],copyrights[nm]) for nm in medias.keys()]
521: for copyright in copyrightsList:
522:
523: if copyright[2]=='institution0000':
524: copyrightsFinal.append((copyright[0],copyright[1],self.getPartnerCopyright(copyright[1],'')))
525: else:
526: if not copyright[0]=='':
527: copyrightsFinal.append(copyright)
528:
529:
530: return copyrightsFinal
531:
532: #List of different types for the graphical linking viewer
533: viewClassificationListMaster=['view point','area']
534:
535:
536: def checkDiffs(self,metadict):
537: """check differences"""
538:
539:
540:
541:
542: def NoneToEmpty(obj):
543: if obj:
544: return obj
545: else:
546: return ""
547:
548:
549:
550: diffs={}
551:
552: tags=self.findTagsFromMapping(self.contentType)
553: self.referencetypes=tags[2]
554: self.fields=tags[3]
555:
556:
557: for field in tags[1]:
558: try:
559: if (NoneToEmpty(self.getFieldValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
560: diffs[self.getFieldTag(tags,field)]=1
561: else:
562:
563: diffs[self.getFieldTag(tags,field)]=0
564: except:
565: diffs[self.getFieldTag(tags,field)]=0
566:
567: return diffs
568:
569:
1.29 casties 570: def zptFile(self, path):
571: """returns a page template file from the product"""
572: pt=PageTemplateFile(os.path.join(package_home(globals()), path)).__of__(self)
573: return pt
1.25 dwinter 574:
575:
576: def sendFile(self, filename, type):
577: """sends an object or a local file (in the product) as response"""
578: paths = filename.split('/')
579: object = self
580: # look for an object called filename
581: for path in paths:
582: if hasattr(object, path):
583: object = getattr(object, path)
584: else:
585: object = None
586: break
587: if object:
588: # if the object exists then send it
589: return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
590: else:
591: # send a local file with the given content-type
592: fn = os.path.join(package_home(globals()), filename)
593: self.REQUEST.RESPONSE.setHeader("Content-Type", type)
594: self.REQUEST.RESPONSE.write(file(fn).read())
595: return
596:
1.29 casties 597:
1.25 dwinter 598: class BrowserCheck:
599: """check the browsers request to find out the browser type"""
600:
601: def __init__(self, zope):
602: """initialisiere"""
603: self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
1.29 casties 604: self.isN4 = False
605: self.isIE = False
606: if string.find(self.ua, 'MSIE') > -1:
607: self.isIE = True
608: else:
609: self.isN4 = string.find(self.ua, 'Mozilla/4.') > -1
610: try:
611: self.nav = self.ua[string.find(self.ua, '('):]
612: ie = string.split(self.nav, "; ")[1]
613: if string.find(ie, "MSIE") > -1:
614: self.versIE = string.split(ie, " ")[1]
615: except: pass
1.25 dwinter 616: self.isMac = string.find(self.ua, 'Macintosh') > -1
617: self.isWin = string.find(self.ua, 'Windows') > -1
618: self.isIEWin = self.isIE and self.isWin
619: self.isIEMac = self.isIE and self.isMac
620:
621:
622: def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None):
623: """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
624:
625: def updateTextToolNode(tag,value):
626: #print dom,tag,value
627: metanode=dom.getElementsByTagName('texttool')[0]
628: try:
629: nodeOld=metanode.getElementsByTagName(tag)
630: except:
631: nodeOld=None
632:
633: if nodeOld:
634: metanode.removeChild(nodeOld[0]).unlink()
635:
636: node=dom.createElement(tag)
637: nodetext=dom.createTextNode(value)
638: node.appendChild(nodetext)
639: metanode.appendChild(node)
640:
641: if xmlfrag:
642: geturl="""<?xml version="1.0" ?>
643: <resource type="MPIWG">
644: <meta>
645: <bib type="Book">
646: </bib>
647: </meta>
648: </resource>"""
649: dom=xml.dom.minidom.parseString(geturl)
650: else:
651: try:
652: geturl=""
1.30 dwinter 653: for line in urlopen(url).readlines():
1.25 dwinter 654: geturl=geturl+line
655:
656:
657: except:
1.30 dwinter 658: return (None,"XCannot open: "+url)
1.25 dwinter 659:
660: try:
661: dom=xml.dom.minidom.parseString(geturl)
662: except:
663: return (None,"Cannot parse: "+url+"<br>"+geturl)
664:
665:
666:
667: metanodes=dom.getElementsByTagName('bib')
668:
669: if not metanodes:
670: metanodes=dom.getElementsByTagName('archimedes')
671:
672: metanode=metanodes[0]
673:
674: for metaData in metadict.keys():
675:
676: try:
677: nodeOld=metanode.getElementsByTagName(metaData)
678: except:
679: nodeOld=None
680:
681: if nodeOld:
682: metanode.removeChild(nodeOld[0]).unlink()
683: else:
684: # try also old writing rule - instead of _:
685: try:
686: nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
687: except:
688: nodeOld=None
689:
690: if nodeOld:
691: metanode.removeChild(nodeOld[0]).unlink()
692:
693: metanodeneu=dom.createElement(metaData)
694: metanodetext=dom.createTextNode(metadict[metaData])
695: #try:
696: #metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
697: #except:
698: #metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
699: metanodeneu.appendChild(metanodetext)
700: metanode.appendChild(metanodeneu)
701:
702:
703:
704:
705:
706: if project:
707: updateTextToolNode('project',project)
708:
709: if startpage:
710: updateTextToolNode('startpage',startpage)
711:
712: if topbar:
713: updateTextToolNode('toptemplate',topbar)
714:
715: if thumbtemplate:
716: updateTextToolNode('thumbtemplate',thumbtemplate)
717:
718: if xslt:
719: updateTextToolNode('xslt',xslt)
720:
721:
722: if digiliburlprefix:
723: updateTextToolNode('digiliburlprefix',digiliburlprefix)
724:
725: try:
726: return dom.toxml().encode('utf-8')
727: except:
728: return dom.toxml('utf-8')
729:
730:
731:
732: def readMetadata(url):
733: """Methode zum Auslesen der Metadateninformation zu einer Resource
734: Vorerst noch Typ bib"""
735:
736: metadict={}
1.30 dwinter 737:
1.25 dwinter 738: try:
739: geturl=""
1.30 dwinter 740: for line in urlopen(url).readlines():
1.25 dwinter 741: geturl=geturl+line
742:
743:
744: except:
745: return (None,"Cannot open: "+url)
746:
747: try:
748: dom=xml.dom.minidom.parseString(geturl)
749: except:
1.30 dwinter 750: return (None,"Cannot parse: "+url+"<br>"+geturl)
1.25 dwinter 751:
752: metanode=dom.getElementsByTagName('bib')
753: metadict['bib_type']='Book'
754: if len(metanode)==0:
755: metanode=dom.getElementsByTagName('archimedes')
756: metadict['bib_type']='Archimedes'
757:
758:
759: if not len(metanode)==0:
760: metacontent=metanode[0].childNodes
761:
762: try:
763: metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
764: except:
765: """nothing"""
766:
767: for node in metacontent:
1.30 dwinter 768: try:
769: #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
770: metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
771: except:
772: """nothing"""
1.25 dwinter 773:
774:
775: return metadict,""
776:
1.29 casties 777:
778: class MapArea(SimpleItem):
779: """simple class to hold coordinates"""
780:
781: meta_type = 'MapArea'
782: # Create a SecurityInfo for this class.
783: security = ClassSecurityInfo()
784: security.setDefaultAccess("allow")
785: # type constants
786: TYPE_AREA = 'area'
787: TYPE_ARROW = 'arrow'
788:
789: def __init__(self, id, coords, label=None, type=None, text=None):
790: """init"""
791: self.coords = coords[0:4]
792: if len(coords) > 4:
793: self.angle = coords[4]
794: else:
795: self.angle = 0
796: self.id = id
797: self.label = label
798: self.setType(type)
799: self.text = text
800:
801: def setCoords(self, coords):
802: """sets the coords"""
803: self.coords = coords
804:
805: def getCoordString(self):
806: """returns coordinates as a string"""
807: return string.join(self.coords, ',')
808:
809: def setCoordString(self, coordstring):
810: """sets coordinates from a string"""
811: coords = string.split(coordstring, ',')
812: self.coords = [c.strip() for c in coords]
813:
814: def getFullId(self, prefix=None):
815: """returns the id with prefixed parent id"""
816: if prefix is None:
817: if hasattr(self, 'aq_parent'):
818: prefix = self.aq_parent.id
819: else:
820: prefix = "id"
821: fid = prefix + "." + self.id
822: return fid
823:
824: def getType(self):
825: """returns the type"""
826: return self.type
827:
828: def setType(self, type):
829: """sets the type"""
830: if type == MapArea.TYPE_ARROW:
831: self.type = MapArea.TYPE_ARROW
832: elif type == MapArea.TYPE_AREA:
833: self.type = MapArea.TYPE_AREA
834: else:
835: self.type = MapArea.TYPE_AREA
836:
837: def isTypeArea(self):
838: """returns if the type is area"""
839: return self.type == MapArea.TYPE_AREA
840:
841: def isTypeArrow(self):
842: """returns if the type is arrow"""
843: return self.type == MapArea.TYPE_ARROW
844:
845: def getAngle(self):
846: """returns the angle"""
847: return self.angle
848:
849: def setAngle(self, angle):
850: """sets the angle"""
851: self.angle = angle
852:
853: def getText(self):
854: """returns the popup text"""
855: if self.text is None:
856: if hasattr(self, 'aq_parent'):
857: parent = self.aq_parent
858: if parent.contentType == 'text-popup':
859: return parent.description
860: return self.text
861:
862: def setText(self, text):
863: """sets the text"""
864: self.text = text
865:
866: def getLabel(self):
867: """returns the link label"""
868: if self.label is None:
869: if hasattr(self, 'aq_parent'):
870: return self.aq_parent.label or self.aq_parent.id
871: return self.label
872:
873: def setLabel(self, label):
874: """sets the label"""
875: self.label = label
876:
877: def getLinkId(self):
878: if hasattr(self, 'aq_parent'):
879: return self.aq_parent.id
880: return self.id
881:
882:
883: # call this to initialize framework classes, which
884: # does the right thing with the security assertions.
885: Globals.InitializeClass(MapArea)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>