Annotation of ECHO_content/ECHO_helpers.py, revision 1.94
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
1.57 dwinter 15: from OFS.Folder import Folder
16: import ECHO_collection
1.67 dwinter 17: import base64
18: import bz2
19: import xmlrpclib
1.88 dwinter 20: import sys
1.79 dwinter 21: import logging
1.25 dwinter 22:
1.80 dwinter 23: #erstzt logging
24: def logger(txt,method,txt2):
25: """logging"""
26: logging.info(txt+ txt2)
27:
1.87 casties 28: 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','extVersionedFileFolder','ECHO_movie']
1.25 dwinter 29:
1.94 ! dwinter 30: def normalizeCt(str):
! 31: """normalizes content_type"""
! 32: #str= str.replace(" ","_")
! 33: return str.replace("-"," ").lower()
1.67 dwinter 34:
35: #decode and compress for xmlrpc communication with OSAS_server
36:
37: def encodeRPC(string):
38: return base64.encodestring(bz2.compress(string))
39: def decodeRPC(string):
40: return bz2.decompress(base64.decodestring(string))
41:
1.84 casties 42: def unicodify(s):
43: """decode str (utf-8 or latin-1 representation) into unicode object"""
44: if not s:
45: return u""
46: if isinstance(s, str):
47: try:
48: return s.decode('utf-8')
49: except:
50: return s.decode('latin-1')
51: else:
52: return s
53:
54: def utf8ify(s):
55: """encode unicode object or string into byte string in utf-8 representation.
56: assumes string objects to be utf-8"""
57: if not s:
58: return ""
59: if isinstance(s, str):
60: return s
61: else:
62: return s.encode('utf-8')
63:
64:
1.25 dwinter 65: def content_html(self,type):
66: """template fuer content"""
67: #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
68: #
69: #if templates:
70: # return templates[0][1]()
71:
72: if hasattr(self,type+"_template"):
1.88 dwinter 73:
1.25 dwinter 74: obj=getattr(self,type+"_template")
75: return obj()
76: else:
1.61 dwinter 77: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ECHO_%s_template_standard.zpt'%type)).__of__(self)
1.25 dwinter 78: pt.content_type="text/html"
79: return pt()
80:
81:
82:
83: class ECHO_basis:
84: """basis eigenschaften fuer echo objekte"""
1.41 dwinter 85: security=ClassSecurityInfo()
86: security.declarePublic('getImageTag')
1.69 dwinter 87:
88: management_page_charset="utf-8"
1.78 dwinter 89: isVisible = True
1.69 dwinter 90:
1.93 dwinter 91: # Managment for the PID
92: def setPID(self,pid):
93: """set the pid"""
94: self.pid=pid
95: return True
96:
97: def getPID(self):
98: """get the pid"""
99: return getattr(self,'pid',None)
100:
1.94 ! dwinter 101: def getParentPID(self):
! 102: """get the PID of the parent"""
! 103: parent = self.aq_parent
! 104:
! 105: pidF = getattr(parent,'getPID',None)
! 106:
! 107: if pidF is None:
! 108: return None
! 109:
! 110: else:
! 111: return pidF()
1.85 casties 112:
113: def unicodify(self, s):
114: """return unicode object for string (utf-8 or latin1) or unicode object s"""
115: return unicodify(s)
1.86 casties 116:
117: # compatibility of old decode method
118: decode = unicodify
1.85 casties 119:
120:
121: def utf8ify(self, s):
122: """return utf-8 encoded string object for string or unicode object s"""
123: return utf8ify(s)
124:
125:
1.57 dwinter 126: def manage_addECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
1.61 dwinter 127: return ECHO_collection.manage_addECHO_locale(self,lang,title,label)
128:
1.41 dwinter 129: def getImageTag(self):
1.61 dwinter 130: """sollte uerberschrieben werden, falls von der Klasse eine imagetag zurueckkommt"""
131:
132: return ""
1.41 dwinter 133:
1.26 dwinter 134: def showRDF(self):
1.61 dwinter 135: """showrdf"""
1.26 dwinter 136: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1.61 dwinter 137: 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 138:
1.61 dwinter 139: ret+=self.getRDF(urn="echo:collectionroot")+"\n"
1.36 dwinter 140:
1.26 dwinter 141:
1.61 dwinter 142: ret+="""</RDF:RDF>"""
143: return ret
1.26 dwinter 144:
145:
1.46 dwinter 146: def RDF(self):
1.61 dwinter 147: """showrdf"""
1.46 dwinter 148: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1.61 dwinter 149: 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 150:
1.61 dwinter 151: ret+=self.getRDF(urn=self.absolute_url())+"\n"
1.46 dwinter 152:
153:
1.61 dwinter 154: ret+="""</RDF:RDF>"""
155: return ret
1.46 dwinter 156:
157:
1.26 dwinter 158: def createSubElementRDF(self,urn=None):
1.61 dwinter 159: """rdf list"""
160: if not urn:
161: urn=self.absolute_url()
162: ret=""
163:
164: rettemp="""<RDF:Seq RDF:about="%s">\n"""%urn
165: flag=0
166:
167: li="""<RDF:li RDF:resource="%s" />\n"""
168: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
169: nurn=self.absolute_url()+'/getFullTextXML'
170: rettemp+=li%nurn
171: flag=1
172: if not ('<error>' in self.getImageView(noredirect='Yes')):
173: nurn=self.absolute_url()+'/getImageView'
174: rettemp+=li%nurn
175: flag=1
176:
177:
178: if not ('<error>' in self.showMetaDataXML()):
179: nurn=self.absolute_url()+'/showMetaDataXML'
180: rettemp+=li%nurn
181: flag=1
182:
183: rettemp+="</RDF:Seq>"
184:
185: if flag==1:
186: ret+=rettemp
187:
188: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
189: nurn=self.absolute_url()+'/getFullTextXML'
190: ret+=getRDFDescription(self,self.absolute_url()+'/getFullTextXML',urn=nurn,nameDef="Fulltext",typeName="ECHO_fulltext")
1.26 dwinter 191:
1.61 dwinter 192: if not ('<error>' in self.getImageView(noredirect='Yes')):
1.26 dwinter 193: nurn=self.absolute_url()+'/getImageView'
1.61 dwinter 194: ret+=getRDFDescription(self,self.absolute_url()+'/getImageView',urn=nurn,nameDef="Image View",typeName="ECHO_imageview")
195:
196: if not ('<error>' in self.showMetaDataXML()):
1.26 dwinter 197: nurn=self.absolute_url()+'/showMetaDataXML'
1.61 dwinter 198: ret+=getRDFDescription(self,self.absolute_url()+'/showMetaDataXML',urn=nurn,nameDef="Metadata",typeName="ECHO_metaData")
1.26 dwinter 199:
1.61 dwinter 200: return ret
201:
1.68 dwinter 202: def content_html_XMLRpc(self):
203: """xml_rpc_version"""
204: return encodeRPC(self.content_html())
205:
1.25 dwinter 206: def content_html(self,type="collection"):
1.61 dwinter 207: """template fuer content bei einbau und ECHO_Umgebung"""
208:
209: return content_html(self,type)
1.78 dwinter 210:
211: def getIsVisible(self):
1.88 dwinter 212: """return if object and all parents are visible"""
213:
214: # if object is not visible return False
215: if hasattr(self,'isVisible'):
216: if not self.isVisible : return False
217:
218: # else if parent of object is not ECHO_root, ECHO_basis or None
219: if not self.aq_parent.meta_type in ['ECHO_root','ECHO_basis',None] :
220: return self.aq_parent.getIsVisible()
1.78 dwinter 221:
1.88 dwinter 222: # else return True
223: return True
1.78 dwinter 224:
225: def setIsVisible(self, isVisible):
1.88 dwinter 226: """ set object attribute isVisible"""
227: self.isVisible = isVisible
1.78 dwinter 228:
229: def getAttributeIsVisible(self):
1.88 dwinter 230: """ return object attribute isVisible"""
231: if hasattr(self,'isVisible'):
232: return self.isVisible
233: return True
1.78 dwinter 234:
1.93 dwinter 235: def getDescription(self):
236: """get content of description field"""
237:
238:
239: return self.unicodify(getattr(self,'description',''));
240:
1.25 dwinter 241: def getTitle(self):
1.61 dwinter 242: """title"""
1.76 dwinter 243: if hasattr(self,'getLanguage'):
244: lang=self.getLanguage()
245: else:
246: lang=None
247:
1.61 dwinter 248: locale=None
249: if lang and not (lang =="de"):
250: locale=self.ZopeFind(self,obj_ids=["locale_"+lang])
251:
252: if locale:
253: return self.decode(locale[0][1].title)
254: else:
1.76 dwinter 255: try:
1.61 dwinter 256: return self.decode(self.title)
1.76 dwinter 257: except:
258: return self.title
1.61 dwinter 259:
1.25 dwinter 260: def getLabel(self):
1.61 dwinter 261: """title"""
1.76 dwinter 262: if hasattr(self,'getLanguage'):
263: lang=self.getLanguage()
264: else:
265: lang=None
266:
1.61 dwinter 267: locale=None
1.76 dwinter 268:
1.61 dwinter 269: if lang and not (lang=="de"):
270: locale=self.ZopeFind(self,obj_ids=["locale_"+lang])
271:
272: if locale:
273: return self.decode(locale[0][1].label)
274:
275:
276: if not hasattr(self,'label'):
277: self.label=""
278:
279: if self.label=="":
280: ret=self.getTitle()
281: if ret=="":
282: ret=self.getId()
283: return ret
284:
285: return self.decode(self.label)
1.69 dwinter 286:
1.25 dwinter 287: def changeECHOEntriesForm(self):
288: """change Entries for the ECHO Navigation environment"""
289: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHOEntriesForm')).__of__(self)
290: return pt()
291:
1.26 dwinter 292: def changeECHOEntries(self,label,weight,description,queryString,RESPONSE=None):
1.25 dwinter 293: """change Entries for the ECHO Navigation environment
294: @param label: label fuer die Navigation"""
295: self.label=label
296: self.weight=weight
297: self.description=description
1.61 dwinter 298: self.queryString=queryString
1.25 dwinter 299:
300: if RESPONSE:
301: RESPONSE.redirect("manage_main")
302:
303: manage_options=({'label':'change ECHO Navigation Entries','action':'changeECHOEntriesForm'},)
304:
1.31 casties 305:
306: def hasOverview(self):
307: """returns if there is an overview graphics"""
1.61 dwinter 308: return hasattr(self, 'overview')
1.31 casties 309:
310: def hasParentOverview(self):
311: """returns if the parent has an overview graphics"""
1.61 dwinter 312: return hasattr(self.aq_parent, 'overview')
1.31 casties 313:
314: def getOverview(self):
315: """map overview graphics"""
316: #return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
1.61 dwinter 317: if self.hasOverview():
318: return getattr(self, 'overview')
319: return None
1.31 casties 320:
1.29 casties 321: def getMapAreas(self):
322: """returns the list of MapAreas"""
1.61 dwinter 323: forcetypes = self.REQUEST.get('map_force_types', None)
324: if forcetypes:
325: typelist = forcetypes.split(',')
326: else:
327: typelist = None
328: areas = []
329: # get all contained MapAreas
1.56 casties 330: for res in self.ZopeFind(self, obj_metatypes=('MapArea')):
1.61 dwinter 331: area = res[1]
332: # check the allowed types
333: if typelist is not None and area.getType() not in typelist:
334: continue
335: areas.append(area)
336: return areas
1.29 casties 337:
338: def addMapArea(self, newarea):
1.61 dwinter 339: """add a map area to this object"""
340: if (newarea.id is None):
341: # create new id
342: ids = [a.id for a in self.getMapAreas()]
343: i = len(ids)
344: while ("a%02d"%i in ids):
345: # if it exists, try the next one
346: i += 1
347: newarea.id = "a%02d"%i
348: self._setObject(newarea.id, newarea)
1.29 casties 349:
1.50 casties 350: def getMapText(self):
351: """returns the MapText"""
1.61 dwinter 352: # get (the first) contained MapText
353: #lang="en"
354: lang=self.getLanguage()
355: res=None
356: if lang and not (lang=="de"):
357: resTmp = self.ZopeFind(self, obj_metatypes=('ECHO_mapText'))
358: res = self.ZopeFind(resTmp[0][1])
359:
360: if not res:
361: res = self.ZopeFind(self, obj_metatypes=('ECHO_mapText'))
362: if len(res) > 0:
363: text = res[0][1]
364: return text
365: return None
1.50 casties 366:
1.31 casties 367: def ECHO_graphicEntry(self):
368: """change map coordinates"""
369: if self.hasParentOverview():
370: pt=zptFile(self, 'zpt/ECHO_draw.zpt')
371: return pt()
372: else:
373: return "NO OVERVIEW GRAPHICS"
374:
1.29 casties 375: def ECHO_addCoords(self,RESPONSE=None):
376: """change or add MapArea"""
1.61 dwinter 377: #return self.REQUEST
378: # change existing areas
379: for area in self.getMapAreas():
380: id = area.getId()
381: if self.REQUEST.has_key('del.'+id):
382: # delete this area
383: self._delObject(id)
384: # return to same menu
385: if RESPONSE is not None:
386: RESPONSE.redirect('ECHO_graphicEntry')
387: return
388: # modify this area
389: coordstring = self.REQUEST.get('coords.'+id, '')
390: coords = string.split(coordstring, ',')
391: angle = self.REQUEST.get('angle.'+id, '0')
392: type = self.REQUEST.get('type.'+id, 'area')
393: permanent = self.REQUEST.get('permanent.'+id, '')
394: if len(coords) == 4:
395: area.setCoordString(coordstring)
396: area.setAngle(angle)
397: area.setType(type)
398: area.setPermanent(permanent)
399: # add the "new" area
400: if self.REQUEST.has_key('add'):
401: coordstring = self.REQUEST.get('coords.new', '')
402: coords = string.split(coordstring, ',')
403: angle = self.REQUEST.get('angle.new', '0')
404: type = self.REQUEST.get('type.new', 'area')
405: permanent = self.REQUEST.get('permanent.new', '')
406: if len(coords) == 4:
407: coords.append(angle)
408: area = MapArea(None, coords, type=type, permanent=permanent)
409: self.addMapArea(area)
410: # return to edit area menu
411: if RESPONSE is not None:
412: RESPONSE.redirect('ECHO_graphicEntry')
1.31 casties 413:
1.56 casties 414: def createJSAreas(self, areas):
1.31 casties 415: """create area calls for JavaScript"""
1.61 dwinter 416: forceperm = self.REQUEST.get('map_force_permanent', None)
1.53 casties 417: js="\n"
1.31 casties 418: for ob in areas:
1.61 dwinter 419: # check for force-permanent
420: if forceperm is not None:
421: perm = forceperm
422: else:
423: perm = ob.isPermanent()
424: js+="""addArea('%s', 'overview', %s, '%s', '%s');\n"""%(ob.getFullId(),ob.getCoordString(),ob.getType(),perm)
1.53 casties 425: return js
1.31 casties 426:
1.81 casties 427: def createMapHead(self,mapColTypes=None):
1.31 casties 428: """create javascript include and script tags for head"""
429: pt=zptFile(self, 'zpt/ECHO_content_map_frag_js')
1.81 casties 430: return pt(mapColTypes=mapColTypes)
1.31 casties 431:
432: def createMapImg(self):
1.61 dwinter 433: """generate img-tag for map"""
434: bt = BrowserCheck(self)
435: tag = ""
436: src = self.getOverview().absolute_url()
437: if bt.isN4:
438: # N4 needs ilayer to create an id
439: tag += '<ilayer id="overview" visibility="show"><img src="%s"></ilayer>'%src
440: else:
441: # img with id
442: tag += '<img id="overview" src="%s" />'%src
443: return tag
1.31 casties 444:
445: def createParentMapImg(self):
1.61 dwinter 446: """generate img-tag for map of parent"""
447: return self.aq_parent.createMapImg()
1.31 casties 448:
1.48 dwinter 449: def createMapLink(self, ob, text=None, target="_blank"):
1.61 dwinter 450: """generate map link"""
451: bt = BrowserCheck(self)
452: id = ob.getFullId()
1.91 casties 453: url = ob.getTargetUrl()
454: if url == "":
455: # ECHOResource with empty link -> no link
456: href = 'href="#" onclick="return false;"'
457: else:
458: href = 'href="%s"'%ob.getLinkId()
459:
1.90 casties 460: if target is None:
461: targetattr = ""
462: else:
463: targetattr = 'target="%s"'%target
464:
1.61 dwinter 465: if text is None:
466: text = ob.getLabel()
1.90 casties 467:
1.61 dwinter 468: if text is None:
469: text = "link"
1.90 casties 470:
1.61 dwinter 471: tiptext = ob.getTip()
472: tag = ""
473: if bt.isN4:
474: # N4 needs layer for highlighting
1.91 casties 475: tag += '<ilayer id="a.%s"><a class="maplink" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" %s %s'%(id,id,id,href,targetattr)
1.61 dwinter 476: tag += ">" + text + "</a></ilayer>"
477: else:
478: # a-element
1.91 casties 479: tag = '<a id="a.%s" class="maplink" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" %s %s'%(id,id,id,href,targetattr)
1.61 dwinter 480: if tiptext:
481: tag += ' title="%s"'%tiptext
482: tag += ">" + text + "</a>"
483: return tag
1.31 casties 484:
1.59 dwinter 485: 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",backLink=None,alternativArrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil_blau"):
1.61 dwinter 486: """generate map link image, text and other stuff"""
487: bt = BrowserCheck(self)
488: id = ob.getFullId()
489: link = ob.getLinkId()
1.92 casties 490: url = ob.getTargetUrl()
491: if url == "":
492: # ECHOResource with empty link -> no link
493: href = 'href="#" onclick="return false;"'
494: else:
495: href = 'href="%s"'%ob.getLinkId()
496:
497: if target is None:
498: targetattr = ""
499: else:
500: targetattr = 'target="%s"'%target
1.61 dwinter 501: tiptext = ob.getTip()
502: tag = ""
503:
504: if bt.isN4:
505: #
506: # N4 needs layer and img elements
507: #
508: tag += '<layer id="i.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)">'%(id,id,id)
509: if ob.isTypeArrow():
510: # N4 - Arrow
511: rot = ob.angle
512:
1.60 dwinter 513: if hasattr(getattr(self,link),'link'):
1.61 dwinter 514: cLink=getattr(self,link).link
515: # if existing delete virtuell path
516: cLink=cLink.replace('/'.join(self.REQUEST['VirtualRootPhysicalPath']),'')
517:
518: if backLink and hasattr(getattr(self,link),'link') and backLink==self.REQUEST['SERVER_URL']+cLink.lstrip():
519: marksrc=alternativArrowsrc
520: else:
521: marksrc = arrowsrc
522:
523:
524: if float(rot) < 0:
525: marksrc = circlesrc
1.92 casties 526: tag += '<a %s><img border="0" src="%s&rot=%s" /></a>'%(href,marksrc,rot)
1.61 dwinter 527: elif ob.isTypeText():
528: # N4 - Text
529: tag += '<div id="t.%s" class="maptext"'%(id)
530: tag += 'style="visibility:hidden">'
531: tag += ob.getText()
532: tag += '</div>'
533: else:
534: # N4 - Area
1.92 casties 535: tag += '<a %s><img border="0" width="1000" height="1000" src="trans_img"'%(href)
1.61 dwinter 536: if tiptext:
537: tag += ' alt="%s"'%tiptext
538: tag += ' /></a>'
539: tag += '</layer>'
540: else:
541: #
542: # (more or less) DOM capable browser
543: #
1.92 casties 544: tag = '<a id="b.%s" class="mapmarklink" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" %s %s>'%(id,id,id,href,targetattr)
1.61 dwinter 545: if ob.isTypeArrow():
546: # DOM - Arrow
547: rot = ob.angle
548:
549: if hasattr(getattr(self,link),'link'):
550: cLink=getattr(self,link).link
551: # if existing delete virtuell path
1.62 dwinter 552: if hasattr(self.REQUEST,'VirtualRootPhysicalPath'):
1.61 dwinter 553: cLink=cLink.replace('/'.join(self.REQUEST['VirtualRootPhysicalPath']),'')
554:
555: if backLink and hasattr(getattr(self,link),'link') and backLink==self.REQUEST['SERVER_URL']+cLink.lstrip():
556: marksrc=alternativArrowsrc
557: else:
558: marksrc = arrowsrc
559:
560: try:
561: rot=float(rot)
562: except:
563: rot=0
564:
565: if float(rot) < 0:
566: marksrc = circlesrc
567: if bt.isIEWin and bt.versIE > 5:
568: # IE/Win 5.5 has "feature" for PNG transparency
569: 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)
570: else:
571: # arrow image
572: tag += '<img id="i.%s" src="%s&rot=%s" border="1" style="position:absolute; top:-100px; left:-100px; border-style:none;" />'%(id,marksrc,rot)
573: elif ob.isTypeText():
574: # DOM - Text
575: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;"'%(id)
576: tag += '><div id="t.%s" class="maptext"'%(id)
577: tag += 'style="visibility:hidden">'
578: tag += ob.getText()
579: tag += '</div></div>'
580: else:
581: # DOM - Area
582: if bt.isIE:
583: # IE needs transparent img for area
584: tag += '<img id="i.%s" border="0" style="position:absolute; top:-100px; left:-100px;" src="trans_img"'%(id)
585: if tiptext:
586: tag += ' title="%s"'%tiptext
587: tag += " />"
588: else:
589: # empty div for area
590: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;"'%(id)
591: if tiptext:
592: tag += ' title="%s"'%tiptext
593: tag += '> </div>'
594: tag += '</a>'
595: return tag
1.29 casties 596:
597:
1.25 dwinter 598: #ende der echo erweiterungen
599:
1.24 dwinter 600:
601: def toList(field):
602: """Einzelfeld in Liste umwandeln"""
1.34 casties 603: if type(field)==types.StringType:
1.24 dwinter 604: return [field]
605: else:
606: return field
1.21 dwinter 607:
608: def getText(nodelist):
609: rc = ""
610: for node in nodelist:
1.61 dwinter 611: if node.nodeType == node.TEXT_NODE:
1.21 dwinter 612: rc = rc + node.data
613: return rc
614:
1.25 dwinter 615: def getTextFromNode(nodename):
616: nodelist=nodename.childNodes
617: rc = ""
618: for node in nodelist:
1.61 dwinter 619: if node.nodeType == node.TEXT_NODE:
1.25 dwinter 620: rc = rc + node.data
621: return rc
622:
1.21 dwinter 623:
624: def readFieldFromXML(meta_url,parent,field):
1.61 dwinter 625: """lesespezifisches metadatum"""
626:
627: try:
628: dom=xml.dom.minidom.parse(meta_url)
629:
630: except:
631: try:
632: fh=urllib.urlopen(meta_url)
633: dom=xml.dom.minidom.parse(fh)
634: except:
635: return None
636: if not dom: return None
637:
638: parent=dom.getElementsByTagName(parent)
639: if not parent: return None
640:
641: field=parent[0].getElementsByTagName(field)
642:
643: if not field: return None
644:
645: return getText(field[0].childNodes)
646:
647:
648:
1.15 dwinter 649: def urlopen(url):
1.61 dwinter 650: """urlopen mit timeout"""
1.77 dwinter 651: socket.setdefaulttimeout(10)
1.61 dwinter 652: ret=urllib.urlopen(url)
653: socket.setdefaulttimeout(5)
654: return ret
655: # urlopener = urllib.URLopener()
1.17 dwinter 656: #
1.61 dwinter 657: # try:
658: # con = urlopener.open(url)
659: # return con
660: # except timeoutsocket.Timeout:
661: # return None
1.15 dwinter 662:
663:
1.25 dwinter 664:
1.11 dwinter 665:
1.6 dwinter 666:
1.14 dwinter 667: def checkOnlyOneInGroup(object):
1.61 dwinter 668: """check if object is a group and if it containt only one element it return this element"""
669: displayedObjects=object.ZopeFind(object,obj_metatypes=displayTypes)
670: if len(displayedObjects)==1: # nur ein Object dann redirect auf dieses Object
1.8 dwinter 671:
1.61 dwinter 672: return displayedObjects[0][1]
673: else: return object
1.6 dwinter 674:
1.68 dwinter 675:
1.79 dwinter 676: def getSubCols(self, sortfield=None,
677: subColTypes=displayTypes,
678: sortFieldMD=None,
679: searchMD=None,
680: searchMD_modus='search',
681: searchSimple=None,
682: generic="yes",search_sub=0,
683: isVisible=True):
1.61 dwinter 684:
685: def sort(x,y):
1.88 dwinter 686: try:
687: if type(x[0])==type(y[0]):
688: return cmp(x[0],y[0])
689: else:
690: if type(x[0])==types.StringType:
1.89 dwinter 691: tmpX=unicodify(x[0])
1.88 dwinter 692: tmpY=y[0]
693: else:
1.89 dwinter 694: tmpY=unicodify(y[0])
1.88 dwinter 695: tmpX=x[0]
696: return cmp(tmpX,tmpY)
697:
698: except:
699: logging.error("Error at ECHO_helpers.sort:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
700: logging.error(" : %s %s"%sys.exc_info()[0:2])
701: logging.error("Error at ECHO_helpers.sort:"+repr(x)+"--"+repr(type(x[0])))
702: logging.error("Error at ECHO_helpers.sort:"+repr(y)+"--"+repr(type(y[0])))
703: logging.error("Error at ECHO_helpers.sort:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB")
704: return 0
1.61 dwinter 705: def sortfnc(sortfield,x,y):
706: try:
1.63 dwinter 707: xa=x[1].getMDValue(sortfield,generic=generic)
1.61 dwinter 708: except:
709: xa=""
710: try:
1.63 dwinter 711: ya=y[1].getMDValue(sortfield,generic=generic)
1.61 dwinter 712: except:
713: ya=""
714: return cmp(xa,ya)
715:
716: sortWithMD = lambda sortfield : (lambda x,y : sortfnc(sortfield,x,y))
1.1 dwinter 717: ids=[]
1.70 dwinter 718: displayedObjects=self.ZopeFind(self,obj_metatypes=subColTypes,search_sub=search_sub)
719:
1.68 dwinter 720: if searchSimple and (not (searchSimple==""))and hasattr(self,'resourceCatalog'):
721: searchString=" AND ".join(searchSimple.split())
1.79 dwinter 722: ids=[x.getObject() for x in self.resourceCatalog({'getMDValueSimpleSearchField':searchString,'getIsVisible':True})]
1.65 dwinter 723: else:
1.68 dwinter 724: for entry in displayedObjects:
1.65 dwinter 725: object=entry[1]
1.70 dwinter 726: if searchMD:
727: if hasattr(object,'getMDValue'):
1.65 dwinter 728: flag=0
729: for field in searchMD.keys():
730: #if object.getMDValue(field,generic=generic)==searchMD[field]:
1.74 dwinter 731: #if re.match(searchMD[field],object.getMDValue(field,generic=generic)):
1.75 dwinter 732: if searchMD_modus=='match':
733: searchResult=re.match(searchMD[field],object.getMDValue(field,generic=generic))
734: else:
735: searchResult=re.search(searchMD[field],object.getMDValue(field,generic=generic))
736: if searchResult:
1.65 dwinter 737: flag=1
738: else:
739: flag=0
740: break
741: if flag==1:
1.68 dwinter 742: ids.append(object)
1.65 dwinter 743: else:
744: ids.append(object)
1.61 dwinter 745: if not sortfield:
1.39 dwinter 746: sortfield=getattr(self,'sortfield','weight')
1.1 dwinter 747: tmplist=[]
748: for x in ids:
1.61 dwinter 749: if hasattr(x,sortfield):
750: try:
751: tmp=int(getattr(x,sortfield))
752: except:
753: tmp=getattr(x,sortfield)
754:
755: else:
756: tmp=10000000
757:
758: tmplist.append((tmp,x))
759:
760: if not sortFieldMD:
761: tmplist.sort(sort)
762: else:
763: tmplist.sort(sortWithMD(sortFieldMD))
764:
1.66 dwinter 765: ret=[x for (key,x) in tmplist]
766:
767: return ret
1.25 dwinter 768:
769: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
770: """Rerender all Links"""
1.61 dwinter 771: ret=""
772:
1.25 dwinter 773: if not obj:
774: obj = self
775:
776: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource'],search_sub=1)
777:
778: for entry in entries:
1.61 dwinter 779: if entry[1].meta_type == 'ECHO_resource':
780: try:
1.64 dwinter 781: entry[1].ECHO_getResourceMD(template="no",overwrite="yes")
1.25 dwinter 782: if "title" in types:
783: entry[1].generate_title()
784: if "label" in types:
785: entry[1].generate_label()
1.61 dwinter 786: ret+="OK:"+entry[0]+"-- "+entry[1].getTitle().decode('utf-8')+"-- "+entry[1].getTitle().decode('utf-8')+"<br>"
787: except:
788: ret+="Error:"+entry[0]+"<br>"
1.25 dwinter 789:
1.61 dwinter 790:
1.25 dwinter 791:
792:
793: return "<html><body>"+ret+"Rerenderd all links to resources in: "+self.title+"</html></body>"
794:
795: def reloadMetaDataFromStorage(self,RESPONSE=None):
1.61 dwinter 796: """copy metadata from the storage to ECHO"""
797: ret=""
798: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
1.63 dwinter 799: if RESPONSE is not None:
800: RESPONSE.setHeader("Content-Type", type)
801: RESPONSE.write("<html><body>\n")
802:
1.61 dwinter 803: for resource in resources:
804: x=str(resource[1].copyIndex_meta2echo_resource())+"<br>"
1.63 dwinter 805: if RESPONSE is not None:
806: RESPONSE.write(x+"\n")
807:
1.61 dwinter 808: ret+=x
809:
810: if RESPONSE is not None:
811: #RESPONSE.redirect('./manage_main')
1.63 dwinter 812: RESPONSE.write( "</html></body>")
1.25 dwinter 813:
1.61 dwinter 814: return ret
1.25 dwinter 815:
816: def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None):
1.61 dwinter 817: """rdf"""
818:
819: ret=""
820: about="""<RDF:Description RDF:about="%s">"""
821: name="""<ECHONAVIGATION:name>%s</ECHONAVIGATION:name>"""
822: link="""<ECHONAVIGATION:link xlink:href="%s">%s</ECHONAVIGATION:link>"""
823: clickable="""<ECHONAVIGATION:linkClickable>%s</ECHONAVIGATION:linkClickable>"""
824: #link="""<ECHONAVIGATION:link RDF:about="%s"/>"""
825: type="""<ECHONAVIGATION:type>%s</ECHONAVIGATION:type>"""
826: #xlink="""<ECHONAVIGATION:xlink xlink:href="%s"/>"""
827: if not urn:
828: #urn="urn:"+re.sub('/',':',self.absolute_url())
829: urn=self.absolute_url()
830: about2=about%urn
831: if not nameDef:
832: if hasattr(self,'label') and not (self.label==""):
833: name2=name%self.label
834: elif not self.title=="":
835: name2=name%self.title
836: else:
837: name2=name%self.getId()
838:
839: name2=re.sub('&','&',name2)
840: else:
841: name2=name%nameDef
842:
843: linkURL=re.sub('http:','',linkURL)
844: linkURL2=re.sub('&','&',linkURL)
845: link2=link%(("http:"+linkURL2),("http:"+urllib.quote(linkURL)))
846: clickable2=clickable%"true"
847:
848: if not typeName:
849: type2=type%self.meta_type
850: else:
851: type2=type%typeName
852:
853: #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
854: ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
855: return ret
1.25 dwinter 856:
857: def getCopyrightsFromForm(self,argv):
1.61 dwinter 858: medias={}
859: partners={}
860: copyrights={}
861:
862: copyrightsFinal=[]
863: for arg in argv.keys():
864:
865: if arg[0:5]=='media':
866: nm=int(arg[5:])
867: medias[nm]=argv[arg]
868: elif arg[0:5]=='partn':
869: nm=int(arg[5:])
870: partners[nm]=argv[arg]
871: elif arg[0:5]=='copyr':
872: nm=int(arg[5:])
873: copyrights[nm]=argv[arg]
1.25 dwinter 874:
875:
876:
1.61 dwinter 877: copyrightsList=[(medias[nm],partners[nm],copyrights[nm]) for nm in medias.keys()]
878: for copyright in copyrightsList:
879:
880: if copyright[2]=='institution0000':
881: copyrightsFinal.append((copyright[0],copyright[1],self.getPartnerCopyright(copyright[1],'')))
882: else:
883: if not copyright[0]=='':
884: copyrightsFinal.append(copyright)
885:
886:
887: return copyrightsFinal
1.25 dwinter 888:
889: #List of different types for the graphical linking viewer
890: viewClassificationListMaster=['view point','area']
891:
892:
893: def checkDiffs(self,metadict):
1.61 dwinter 894: """check differences"""
1.25 dwinter 895:
1.61 dwinter 896:
1.25 dwinter 897:
898:
1.61 dwinter 899: def NoneToEmpty(obj):
900: if obj:
901: return obj
902: else:
903: return ""
904:
905:
906:
907: diffs={}
908:
909: tags=self.findTagsFromMapping(self.contentType)
910: self.referencetypes=tags[2]
911: self.fields=tags[3]
912:
1.25 dwinter 913:
1.61 dwinter 914: for field in tags[1]:
915: try:
1.63 dwinter 916: if (NoneToEmpty(self.getMDValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
1.61 dwinter 917: diffs[self.getFieldTag(tags,field)]=1
918: else:
919:
920: diffs[self.getFieldTag(tags,field)]=0
921: except:
922: diffs[self.getFieldTag(tags,field)]=0
923:
924: return diffs
1.25 dwinter 925:
926:
1.33 casties 927: def zptFile(self, path, orphaned=False):
1.29 casties 928: """returns a page template file from the product"""
1.33 casties 929: if orphaned:
1.61 dwinter 930: # unusual case
931: pt=PageTemplateFile(os.path.join(package_home(globals()), path))
1.33 casties 932: else:
1.69 dwinter 933:
934: pt=PageTemplateFile(os.path.join(package_home(globals()), path)).__of__(self)
1.29 casties 935: return pt
1.25 dwinter 936:
937:
1.33 casties 938: def findObjectPath(startobject, filename):
1.34 casties 939: """returns the object with the name filename starting at startobject"""
1.33 casties 940: if startobject is None:
1.61 dwinter 941: return None
1.25 dwinter 942: paths = filename.split('/')
1.33 casties 943: object = startobject
1.25 dwinter 944: for path in paths:
1.61 dwinter 945:
1.25 dwinter 946: if hasattr(object, path):
1.61 dwinter 947: object = getattr(object, path)
948: else:
949: object = None
950: break
1.33 casties 951: return object
952:
953:
954: def zptObjectOrFile(self, filename, localdir='zpt', orphaned=False):
955: """returns a page template instance or a file from the product"""
956: # look for an object called path
957: pt = findObjectPath(self, filename)
1.34 casties 958: # the object should also not be a python function
959: if (pt is None) or isinstance(pt, types.FunctionType):
1.61 dwinter 960: # get a ZPT file
961: pt = zptFile(self, localdir+'/'+filename, orphaned=orphaned)
1.33 casties 962: return pt
963:
964:
965: def sendFile(self, filename, type):
966: """sends an object or a local file (in the product) as response"""
967: # look for an object called filename
968: object = findObjectPath(self, filename)
1.25 dwinter 969: if object:
1.61 dwinter 970: # if the object exists then send it
971: return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
1.25 dwinter 972: else:
1.61 dwinter 973: # send a local file with the given content-type
974: fn = os.path.join(package_home(globals()), filename)
975: self.REQUEST.RESPONSE.setHeader("Content-Type", type)
976: self.REQUEST.RESPONSE.write(file(fn).read())
1.25 dwinter 977: return
978:
1.29 casties 979:
1.25 dwinter 980: class BrowserCheck:
981: """check the browsers request to find out the browser type"""
982:
983: def __init__(self, zope):
984: """initialisiere"""
1.61 dwinter 985: self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
986: self.isN4 = False
987: self.isIE = False
988: if string.find(self.ua, 'MSIE') > -1:
989: self.isIE = True
990: else:
991: self.isN4 = string.find(self.ua, 'Mozilla/4.') > -1
992: try:
993: self.nav = self.ua[string.find(self.ua, '('):]
994: ie = string.split(self.nav, "; ")[1]
995: if string.find(ie, "MSIE") > -1:
996: self.versIE = string.split(ie, " ")[1]
997: except: pass
998: self.isMac = string.find(self.ua, 'Macintosh') > -1
999: self.isWin = string.find(self.ua, 'Windows') > -1
1000: self.isIEWin = self.isIE and self.isWin
1001: self.isIEMac = self.isIE and self.isMac
1.25 dwinter 1002:
1.61 dwinter 1003:
1.25 dwinter 1004: def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None):
1.61 dwinter 1005: """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
1.77 dwinter 1006:
1.61 dwinter 1007: def updateTextToolNode(tag,value):
1.39 dwinter 1008:
1.61 dwinter 1009: metanode=dom.getElementsByTagName('texttool')[0]
1010: try:
1011: nodeOld=metanode.getElementsByTagName(tag)
1012: except:
1013: nodeOld=None
1014:
1015: if nodeOld:
1016: metanode.removeChild(nodeOld[0]).unlink()
1017:
1018: node=dom.createElement(tag)
1019: nodetext=dom.createTextNode(value)
1020: node.appendChild(nodetext)
1021: metanode.appendChild(node)
1.25 dwinter 1022:
1.77 dwinter 1023:
1.61 dwinter 1024: if xmlfrag:
1.69 dwinter 1025: geturl="""<?xml version="1.0" encoding="UTF-8" ?>
1.25 dwinter 1026: <resource type="MPIWG">
1.61 dwinter 1027: <meta>
1028: <bib type="Book">
1029: </bib>
1030: </meta>
1031: </resource>"""
1032: dom=xml.dom.minidom.parseString(geturl)
1033: else:
1034: try:
1035: geturl=""
1036: for line in urlopen(url).readlines():
1037: geturl=geturl+line
1038:
1039:
1040: except:
1.80 dwinter 1041: logger("ECHO writeMetadata",logging.ERROR,"XCannot open: "+url)
1.77 dwinter 1042: return (None,"XCannot open: "+url)
1.61 dwinter 1043:
1044: try:
1045: dom=xml.dom.minidom.parseString(geturl)
1046: except:
1.80 dwinter 1047: logger("ECHO writeMetadata",logging.ERROR,"Cannot parse: "+url+"<br>"+geturl)
1.77 dwinter 1048: return (None,"Cannot parse: "+url+"<br>"+geturl)
1.61 dwinter 1049:
1050:
1051:
1052: metanodes=dom.getElementsByTagName('bib')
1053:
1054: if not metanodes:
1055: metanodes=dom.getElementsByTagName('archimedes')
1.25 dwinter 1056:
1.61 dwinter 1057: metanode=metanodes[0]
1058:
1059: for metaData in metadict.keys():
1.77 dwinter 1060: if metaData:
1061: try:
1.61 dwinter 1062: nodeOld=metanode.getElementsByTagName(metaData)
1.77 dwinter 1063: except:
1.61 dwinter 1064: nodeOld=None
1065:
1.77 dwinter 1066: if nodeOld:
1.61 dwinter 1067: metanode.removeChild(nodeOld[0]).unlink()
1.77 dwinter 1068: else:
1.61 dwinter 1069: # try also old writing rule - instead of _:
1070: try:
1071: nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
1072: except:
1073: nodeOld=None
1074:
1075: if nodeOld:
1076: metanode.removeChild(nodeOld[0]).unlink()
1077:
1.77 dwinter 1078:
1079: metanodeneu=dom.createElement(metaData)
1080: try:
1081: metanodetext=dom.createTextNode(metadict[metaData].decode('utf-8'))
1082: except:
1083: metanodetext=dom.createTextNode(metadict[metaData])
1084: #try:
1085:
1.61 dwinter 1086: #metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
1.77 dwinter 1087: #except:
1.61 dwinter 1088: #metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
1.77 dwinter 1089: metanodeneu.appendChild(metanodetext)
1090: metanode.appendChild(metanodeneu)
1091:
1092:
1.61 dwinter 1093:
1094:
1095:
1096: if project:
1097: updateTextToolNode('project',project)
1098:
1099: if startpage:
1100: updateTextToolNode('startpage',startpage)
1101:
1102: if topbar:
1103: updateTextToolNode('toptemplate',topbar)
1104:
1105: if thumbtemplate:
1106: updateTextToolNode('thumbtemplate',thumbtemplate)
1107:
1108: if xslt:
1109: updateTextToolNode('xslt',xslt)
1110:
1111:
1112: if digiliburlprefix:
1113: updateTextToolNode('digiliburlprefix',digiliburlprefix)
1.77 dwinter 1114:
1115: try:
1116:
1.69 dwinter 1117: return dom.toxml(encoding='utf-8').encode('utf-8')
1.61 dwinter 1118: except:
1.77 dwinter 1119:
1120:
1.69 dwinter 1121: return dom.toxml(encoding='utf-8')
1.61 dwinter 1122:
1.25 dwinter 1123: def readMetadata(url):
1124: """Methode zum Auslesen der Metadateninformation zu einer Resource
1125: Vorerst noch Typ bib"""
1126:
1127: metadict={}
1.30 dwinter 1128:
1.25 dwinter 1129: try:
1130: geturl=""
1.30 dwinter 1131: for line in urlopen(url).readlines():
1.25 dwinter 1132: geturl=geturl+line
1133:
1134:
1135: except:
1136: return (None,"Cannot open: "+url)
1137:
1138: try:
1139: dom=xml.dom.minidom.parseString(geturl)
1140: except:
1.61 dwinter 1141: return (None,"Cannot parse: "+url+"<br>"+geturl)
1.25 dwinter 1142:
1143: metanode=dom.getElementsByTagName('bib')
1144: metadict['bib_type']='Book'
1145: if len(metanode)==0:
1146: metanode=dom.getElementsByTagName('archimedes')
1147: metadict['bib_type']='Archimedes'
1148:
1149:
1150: if not len(metanode)==0:
1151: metacontent=metanode[0].childNodes
1152:
1153: try:
1154: metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
1155: except:
1156: """nothing"""
1157:
1158: for node in metacontent:
1.61 dwinter 1159: try:
1160: #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
1161: #metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
1162: metadict[re.sub('-','_',node.tagName.lower())]=getText(node.childNodes)
1163:
1164: except:
1165: """nothing"""
1.25 dwinter 1166:
1.69 dwinter 1167: return (metadict,"")
1.25 dwinter 1168:
1.29 casties 1169:
1170: class MapArea(SimpleItem):
1171: """simple class to hold coordinates"""
1172:
1173: meta_type = 'MapArea'
1174: # Create a SecurityInfo for this class.
1175: security = ClassSecurityInfo()
1176: security.setDefaultAccess("allow")
1177: # type constants
1178: TYPE_AREA = 'area'
1179: TYPE_ARROW = 'arrow'
1.50 casties 1180: TYPE_TEXT = 'text'
1.61 dwinter 1181:
1.53 casties 1182: def __init__(self, id, coords, label=None, type=None, tip=None, permanent=False):
1.61 dwinter 1183: """init"""
1184: self.coords = coords[0:4]
1185: if len(coords) > 4:
1186: self.angle = coords[4]
1187: else:
1188: self.angle = 0
1189: self.id = id
1190: self.label = label
1191: self.setType(type)
1192: self.tip = tip
1193: self.permanent = permanent
1.29 casties 1194:
1195: def setCoords(self, coords):
1.61 dwinter 1196: """sets the coords"""
1197: self.coords = coords
1.29 casties 1198:
1199: def getCoordString(self):
1.61 dwinter 1200: """returns coordinates as a string"""
1201: return string.join(self.coords, ',')
1.29 casties 1202:
1203: def setCoordString(self, coordstring):
1.61 dwinter 1204: """sets coordinates from a string"""
1205: coords = string.split(coordstring, ',')
1206: self.coords = [c.strip() for c in coords]
1.29 casties 1207:
1208: def getFullId(self, prefix=None):
1.61 dwinter 1209: """returns the id with prefixed parent id"""
1210: if prefix is None:
1211: if hasattr(self, 'aq_parent'):
1212: prefix = self.aq_parent.id
1213: else:
1214: prefix = "id"
1215: fid = prefix + "." + self.id
1216: return fid
1.29 casties 1217:
1218: def getType(self):
1.61 dwinter 1219: """returns the type"""
1220: return self.type
1.29 casties 1221:
1222: def setType(self, type):
1.61 dwinter 1223: """sets the type"""
1224: if type == MapArea.TYPE_ARROW:
1225: self.type = MapArea.TYPE_ARROW
1226: elif type == MapArea.TYPE_AREA:
1227: self.type = MapArea.TYPE_AREA
1228: elif type == MapArea.TYPE_TEXT:
1229: self.type = MapArea.TYPE_TEXT
1230: else:
1231: self.type = MapArea.TYPE_AREA
1232:
1.29 casties 1233: def isTypeArea(self):
1.61 dwinter 1234: """returns if the type is area"""
1235: return self.type == MapArea.TYPE_AREA
1.29 casties 1236:
1237: def isTypeArrow(self):
1.61 dwinter 1238: """returns if the type is arrow"""
1239: return self.type == MapArea.TYPE_ARROW
1.29 casties 1240:
1.50 casties 1241: def isTypeText(self):
1.61 dwinter 1242: """returns if the type is text"""
1243: return self.type == MapArea.TYPE_TEXT
1.50 casties 1244:
1.29 casties 1245: def getAngle(self):
1.61 dwinter 1246: """returns the angle"""
1247: return self.angle
1.29 casties 1248:
1249: def setAngle(self, angle):
1.61 dwinter 1250: """sets the angle"""
1251: self.angle = angle
1.29 casties 1252:
1.50 casties 1253: def getTip(self):
1.61 dwinter 1254: """returns the popup text"""
1255: # patch old version
1256: if not hasattr(self, 'tip'):
1257: self.tip = self.text
1258:
1259: if self.tip is None:
1260: if hasattr(self, 'aq_parent'):
1261: parent = self.aq_parent
1262: if parent.contentType == 'text-popup':
1263: return parent.description
1264: return self.tip
1.29 casties 1265:
1.50 casties 1266: def setTip(self, text):
1.61 dwinter 1267: """sets the text"""
1268: self.tiptext = text
1.50 casties 1269:
1270: def getText(self):
1.61 dwinter 1271: """returns the text fpr the area"""
1272: if hasattr(self, 'aq_parent'):
1273: parent = self.aq_parent
1274: text = parent.getMapText()
1275: if text is not None:
1.82 casties 1276: #return text.document_src()
1277: return text()
1.61 dwinter 1278: return ""
1.29 casties 1279:
1280: def getLabel(self):
1.61 dwinter 1281: """returns the link label"""
1282: if self.label is None:
1283: if hasattr(self, 'aq_parent'):
1284: return self.aq_parent.label or self.aq_parent.id
1285: return self.label
1.29 casties 1286:
1.91 casties 1287: def getTargetUrl(self):
1288: """returns the URL of the linked object"""
1289: if hasattr(self, 'aq_parent'):
1290: p = self.aq_parent
1291: # ECHOResource and ECHOLink have 'link' attribute
1292: if hasattr(p, 'link'):
1293: if p.link is None:
1294: # return empty string for empty link
1295: return ""
1296: else:
1297: return p.link
1298:
1299: # return None for unknown type
1300: return None
1301:
1.29 casties 1302: def setLabel(self, label):
1.61 dwinter 1303: """sets the label"""
1304: self.label = label
1.53 casties 1305:
1306: def isPermanent(self):
1.61 dwinter 1307: """returns the permanent state"""
1308: # patch old objects
1309: if not hasattr(self, 'permanent'):
1310: self.permanent = False
1311: return self.permanent
1.53 casties 1312:
1313: def setPermanent(self, state):
1.61 dwinter 1314: """sets the permanent state"""
1315: if state:
1316: self.permanent = True
1317: else:
1318: self.permanent = False
1.29 casties 1319:
1320: def getLinkId(self):
1.61 dwinter 1321: if hasattr(self, 'aq_parent'):
1322: return self.aq_parent.id
1323: return self.id
1.29 casties 1324:
1325: # call this to initialize framework classes, which
1326: # does the right thing with the security assertions.
1327: Globals.InitializeClass(MapArea)
1.49 casties 1328:
1329:
1.57 dwinter 1330: class MapText(Folder,ZopePageTemplate):
1.49 casties 1331: """class to hold text for map areas"""
1332:
1333: meta_type = 'ECHO_mapText'
1334: # Create a SecurityInfo for this class.
1335: security = ClassSecurityInfo()
1336: security.setDefaultAccess("allow")
1.58 dwinter 1337:
1338:
1.49 casties 1339: _default_content_fn = os.path.join(package_home(globals()),
1.50 casties 1340: 'html', 'ECHO_mapText_default.html')
1.49 casties 1341:
1342: def __init__(self, id, text=None, content_type=None):
1343: self.id = str(id)
1344: self.ZBindings_edit(self._default_bindings)
1345: if text is None:
1346: text = open(self._default_content_fn).read()
1.83 casties 1347: if content_type is None:
1348: content_type = self.content_type
1.49 casties 1349: self.pt_edit(text, content_type)
1350:
1.57 dwinter 1351: def createLocale(self):
1.61 dwinter 1352: """create locale"""
1353: return ECHO_collection.manage_addECHO_localeForm(self)
1.58 dwinter 1354:
1355: manage_main=ZopePageTemplate.pt_editForm
1.57 dwinter 1356:
1357: def manage_addECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
1.61 dwinter 1358: """manage add echo locale in map"""
1359: ECHO_collection.manage_addECHO_locale(self,lang,title,label,text,content_type)
1360: if RESPONSE is not None:
1361: RESPONSE.redirect('manage_main')
1.57 dwinter 1362:
1363:
1364: def changeLocale(self):
1.61 dwinter 1365: """change locale"""
1366: return self.locale_en.change_ECHO_localeForm()
1.57 dwinter 1367:
1368: def change_ECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
1.61 dwinter 1369: """change echo locale"""
1.57 dwinter 1370:
1.61 dwinter 1371: obj= self.locale_en.change_ECHO_locale(lang,title,label,text,content_type,RESPONSE)
1372:
1.57 dwinter 1373:
1374:
1.61 dwinter 1375: if RESPONSE is not None:
1376: RESPONSE.redirect('manage_main')
1.57 dwinter 1377:
1.61 dwinter 1378:
1.49 casties 1379: # Product registration and Add support
1380: manage_addMapTextForm = PageTemplateFile(
1381: 'zpt/AddECHO_mapText', globals(), __name__='manage_addMapTextForm')
1382:
1383: def manage_addMapText(self, id, title=None, text=None,
1384: REQUEST=None, submit=None):
1385: "Add a Map Text with optional file content."
1386:
1387: id = str(id)
1388: if REQUEST is None:
1389: self._setObject(id, MapText(id, text))
1390: ob = getattr(self, id)
1391: if title:
1392: ob.pt_setTitle(title)
1393: return ob
1394: else:
1395: file = REQUEST.form.get('file')
1396: headers = getattr(file, 'headers', None)
1397: if headers is None or not file.filename:
1398: zpt = MapText(id, text)
1399: else:
1400: zpt = MapText(id, file, headers.get('content_type'))
1401:
1402: self._setObject(id, zpt)
1403: if title:
1404: ob = getattr(self, id)
1405: ob.pt_setTitle(title)
1406:
1407: try:
1408: u = self.DestinationURL()
1409: except AttributeError:
1410: u = REQUEST['URL1']
1411:
1412: if submit == " Add and Edit ":
1413: u = "%s/%s" % (u, urllib.quote(id))
1414: REQUEST.RESPONSE.redirect(u+'/manage_main')
1415: return ''
1416:
1417: # call this to initialize framework classes, which
1418: # does the right thing with the security assertions.
1419: Globals.InitializeClass(MapText)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>