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