--- ECHO_content/ECHO_helpers.py 2004/09/09 16:56:37 1.19
+++ ECHO_content/ECHO_helpers.py 2004/12/02 20:11:49 1.31
@@ -1,10 +1,355 @@
+import re
+import string
import socket
import urllib
+import string
+import xml.dom.minidom
+from types import *
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from OFS.SimpleItem import SimpleItem
+from Globals import package_home
+import Globals
+from AccessControl import ClassSecurityInfo
+import os.path
+
+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']
+
+def content_html(self,type):
+ """template fuer content"""
+ #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
+ #
+ #if templates:
+ # return templates[0][1]()
+
+ if hasattr(self,type+"_template"):
+ obj=getattr(self,type+"_template")
+ return obj()
+ else:
+ pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
+ pt.content_type="text/html"
+ return pt()
+
+
+
+class ECHO_basis:
+ """basis eigenschaften fuer echo objekte"""
+ def showRDF(self):
+ """showrdf"""
+ self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
+ ret="""\n\n"""
+ ret+=self.getRDF(urn="echo:colllectionroot")+"\n"
+
+ ret+=""""""
+ return ret
+
+
+
+ def createSubElementRDF(self,urn=None):
+ """rdf list"""
+ if not urn:
+ urn=self.absolute_url()
+ ret=""
+
+ rettemp="""\n"""%urn
+ flag=0
+
+ li="""\n"""
+ if not ('' in self.getFullTextXML(noredirect='Yes')):
+ nurn=self.absolute_url()+'/getFullTextXML'
+ rettemp+=li%nurn
+ flag=1
+ if not ('' in self.getImageView(noredirect='Yes')):
+ nurn=self.absolute_url()+'/getImageView'
+ rettemp+=li%nurn
+ flag=1
+
+
+ if not ('' in self.showMetaDataXML()):
+ nurn=self.absolute_url()+'/showMetaDataXML'
+ rettemp+=li%nurn
+ flag=1
+
+ rettemp+=""
+
+ if flag==1:
+ ret+=rettemp
+
+ if not ('' in self.getFullTextXML(noredirect='Yes')):
+ nurn=self.absolute_url()+'/getFullTextXML'
+ ret+=getRDFDescription(self,self.absolute_url()+'/getFullTextXML',urn=nurn,nameDef="Fulltext",typeName="ECHO_fulltext")
+
+ if not ('' in self.getImageView(noredirect='Yes')):
+ nurn=self.absolute_url()+'/getImageView'
+ ret+=getRDFDescription(self,self.absolute_url()+'/getImageView',urn=nurn,nameDef="Image View",typeName="ECHO_imageview")
+
+ if not ('' in self.showMetaDataXML()):
+ nurn=self.absolute_url()+'/showMetaDataXML'
+ ret+=getRDFDescription(self,self.absolute_url()+'/showMetaDataXML',urn=nurn,nameDef="Metadata",typeName="ECHO_metaData")
+
+ return ret
+
+ def content_html(self,type="collection"):
+ """template fuer content bei einbau und ECHO_Umgebung"""
+
+ return content_html(self,type)
+
+ def getTitle(self):
+ """title"""
+ try:
+ return self.title.encode('utf-8','ignore')
+ except:
+ self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
+ return self.title.encode('utf-8','ignore')
+
+ def getLabel(self):
+ """title"""
+ try:
+ return self.label.encode('utf-8','ignore')
+ except:
+ self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
+ return self.label.encode('utf-8','ignore')
+
+
+ def changeECHOEntriesForm(self):
+ """change Entries for the ECHO Navigation environment"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHOEntriesForm')).__of__(self)
+ return pt()
+
+ def changeECHOEntries(self,label,weight,description,queryString,RESPONSE=None):
+ """change Entries for the ECHO Navigation environment
+ @param label: label fuer die Navigation"""
+ self.label=label
+ self.weight=weight
+ self.description=description
+ self.queryString=queryString
+
+ if RESPONSE:
+ RESPONSE.redirect("manage_main")
+
+ manage_options=({'label':'change ECHO Navigation Entries','action':'changeECHOEntriesForm'},)
+
+
+ def hasOverview(self):
+ """returns if there is an overview graphics"""
+ return hasattr(self, 'overview')
+
+ def hasParentOverview(self):
+ """returns if the parent has an overview graphics"""
+ return hasattr(self.aq_parent, 'overview')
+
+ def getOverview(self):
+ """map overview graphics"""
+ #return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
+ if self.hasOverview():
+ return getattr(self, 'overview')
+ return None
+
+ def getMapAreas(self):
+ """returns the list of MapAreas"""
+ # get all contained MapAreas
+ areas = [res[1] for res in self.ZopeFind(self, obj_metatypes=('MapArea'))]
+ return areas
+
+ def addMapArea(self, newarea):
+ """add a map area to this object"""
+ if (newarea.id is None):
+ # create new id
+ areas = self.getMapAreas()
+ newarea.id = "a%02d"%len(areas)
+ self._setObject(newarea.id, newarea)
+
+ def ECHO_graphicEntry(self):
+ """change map coordinates"""
+ if self.hasParentOverview():
+ pt=zptFile(self, 'zpt/ECHO_draw.zpt')
+ return pt()
+ else:
+ return "NO OVERVIEW GRAPHICS"
+
+ def ECHO_addCoords(self,RESPONSE=None):
+ """change or add MapArea"""
+ #return self.REQUEST
+ # change existing areas
+ for area in self.getMapAreas():
+ id = area.getId()
+ if self.REQUEST.has_key('del.'+id):
+ # delete this area
+ self._delObject(id)
+ # return to same menu
+ if RESPONSE is not None:
+ RESPONSE.redirect('ECHO_graphicEntry')
+ return
+ # modify this area
+ coordstring = self.REQUEST.get('coords.'+id, '')
+ coords = string.split(coordstring, ',')
+ angle = self.REQUEST.get('angle.'+id, '0')
+ type = self.REQUEST.get('type.'+id, 'area')
+ if len(coords) == 4:
+ area.setCoordString(coordstring)
+ area.setAngle(angle)
+ area.setType(type)
+ # add new area
+ if self.REQUEST.has_key('add'):
+ coordstring = self.REQUEST.get('coords.new', '')
+ coords = string.split(coordstring, ',')
+ angle = self.REQUEST.get('angle.new', '0')
+ type = self.REQUEST.get('type.new', 'area')
+ if len(coords) == 4:
+ coords.append(angle)
+ area = MapArea(None, coords, type=type)
+ self.addMapArea(area)
+ # return to edit area menu
+ if RESPONSE is not None:
+ RESPONSE.redirect('ECHO_graphicEntry')
+
+ def createJSAreas(self, areas):
+ """create area calls for JavaScript"""
+ dynamical="\n"
+ for ob in areas:
+ if ob.isTypeArrow():
+ dynamical+="""addArea('%s', 'overview', %s, 'arrow');\n"""%(ob.getFullId(),ob.getCoordString())
+ else:
+ dynamical+="""addArea('%s', 'overview', %s, 'area');\n"""%(ob.getFullId(),ob.getCoordString())
+ return dynamical
+
+ def createMapHead(self):
+ """create javascript include and script tags for head"""
+ pt=zptFile(self, 'zpt/ECHO_content_map_frag_js')
+ return pt()
+
+ def createMapImg(self):
+ """generate img-tag for map"""
+ bt = BrowserCheck(self)
+ tag = ""
+ #src = self.REQUEST['URL1'] + "/overview"
+ src = self.getOverview().absolute_url()
+ if bt.isN4:
+ tag += ''%src
+ else:
+ tag += ''%src
+ return tag
+
+ def createParentMapImg(self):
+ """generate img-tag for map of parent"""
+ return self.aq_parent.createMapImg()
+
+ def createMapLink(self, ob, text=None):
+ """generate map link"""
+ bt = BrowserCheck(self)
+ id = ob.getFullId()
+ link = ob.getLinkId()
+ if text is None:
+ text = ob.getLabel()
+ if text is None:
+ text = "link"
+ tag = ""
+ if bt.isN4:
+ tag += '" + text + ""
+ else:
+ tag = '" + text + ""
+ return tag
+
+ def createMapAux(self, ob, arrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil"):
+ """generate map link image, text and other stuff"""
+ bt = BrowserCheck(self)
+ id = ob.getFullId()
+ link = ob.getLinkId()
+ tiptext = ob.getText()
+ tag = ""
+
+ if bt.isN4:
+ tag += ''%(id,id,id)
+ if ob.isTypeArrow():
+ rot = ob.angle
+ tag += ''%(link,arrowsrc,rot)
+ else:
+ tag += ''
+ tag += ''
+ else:
+ tag = ''%(id,id,id,link)
+ if ob.isTypeArrow():
+ rot = ob.angle
+ if bt.isIEWin and bt.versIE > 5:
+ tag += ''%(id,arrowsrc,rot,arrowsrc,rot)
+ else:
+ tag += ''%(id,arrowsrc,rot)
+ else:
+ if bt.isIEWin:
+ tag += '
'
+ tag += ''
+ return tag
+
+
+ #ende der echo erweiterungen
+
+
+def toList(field):
+ """Einzelfeld in Liste umwandeln"""
+ if type(field)==StringType:
+ return [field]
+ else:
+ return field
+
+def getText(nodelist):
+
+ rc = ""
+ for node in nodelist:
+ if node.nodeType == node.TEXT_NODE:
+ rc = rc + node.data
+ return rc
+
+def getTextFromNode(nodename):
+ nodelist=nodename.childNodes
+ rc = ""
+ for node in nodelist:
+ if node.nodeType == node.TEXT_NODE:
+ rc = rc + node.data
+ return rc
+
+
+def readFieldFromXML(meta_url,parent,field):
+ """lesespezifisches metadatum"""
+ try:
+ dom=xml.dom.minidom.parse(meta_url)
+
+ except:
+ try:
+ fh=urllib.urlopen(meta_url)
+ dom=xml.dom.minidom.parse(fh)
+ except:
+ return None
+ if not dom: return None
+
+ parent=dom.getElementsByTagName(parent)
+ if not parent: return None
+
+ field=parent[0].getElementsByTagName(field)
+
+ if not field: return None
+
+ return getText(field[0].childNodes)
+
+
+
def urlopen(url):
"""urlopen mit timeout"""
+ socket.setdefaulttimeout(2)
+ ret=urllib.urlopen(url)
socket.setdefaulttimeout(5)
- return urllib.urlopen(url)
+ return ret
# urlopener = urllib.URLopener()
#
# try:
@@ -14,7 +359,7 @@ def urlopen(url):
# return None
-displayTypes = ['ZSQLExtendFolder','ZSQLBibliography','ECHO_group','ECHO_collection','ECHO_resource','ECHO_link','ECHO_sqlElement','ECHO_pageTemplate','ImageCollectionIFrame','VLP_resource','VLP_essay','ECHO_ZCatalogElement']
+
def checkOnlyOneInGroup(object):
@@ -23,24 +368,26 @@ def checkOnlyOneInGroup(object):
if len(displayedObjects)==1: # nur ein Object dann redirect auf dieses Object
return displayedObjects[0][1]
- else:
- return object
+ else: return object
-def getSubCols(self,sortfield="weight",subColTypes= displayTypes):
+def getSubCols(self,sortfield="weight",subColTypes= displayTypes,sortFieldMD=None):
-
+ def sortfnc(sortfield,x,y):
+ xa=x[1].getMDValue(sortfield)
+ ya=y[1].getMDValue(sortfield)
+ print xa,ya
+ return cmp(xa,ya)
+
+ sortWithMD = lambda sortfield : (lambda x,y : sortfnc(sortfield,x,y))
ids=[]
displayedObjects=self.ZopeFind(self,obj_metatypes=subColTypes)
for entry in displayedObjects:
+
object=entry[1]
- try:
- if object.meta_type in subColTypes:
- ids.append(object)
-
- except:
- """nothing"""
+ ids.append(object)
+
try:
sortfield=self.sortfield
except:
@@ -58,5 +405,481 @@ def getSubCols(self,sortfield="weight",s
else:
tmp=10000000
tmplist.append((tmp,x))
- tmplist.sort()
+
+ if not sortFieldMD:
+ tmplist.sort()
+ else:
+ tmplist.sort(sortWithMD(sortFieldMD))
+
return [x for (key,x) in tmplist]
+
+def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
+ """Rerender all Links"""
+ ret=""
+
+ if not obj:
+ obj = self
+
+ entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource'],search_sub=1)
+
+ for entry in entries:
+ if entry[1].meta_type == 'ECHO_resource':
+ try:
+ entry[1].ECHO_getResourceMD(template="no")
+ if "title" in types:
+ entry[1].generate_title()
+ if "label" in types:
+ entry[1].generate_label()
+ ret+="OK:"+entry[0]+"-- "+entry[1].getTitle().decode('utf-8')+"-- "+entry[1].getTitle().decode('utf-8')+"
"
+ except:
+ ret+="Error:"+entry[0]+"
"
+
+
+
+
+ return ""+ret+"Rerenderd all links to resources in: "+self.title+""
+
+def reloadMetaDataFromStorage(self,RESPONSE=None):
+ """copy metadata from the storage to ECHO"""
+ ret=""
+ resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
+
+ for resource in resources:
+ x=str(resource[1].copyIndex_meta2echo_resource())+"
"
+ ret+=x
+ #print x
+
+
+ if RESPONSE is not None:
+ #RESPONSE.redirect('./manage_main')
+ return ""+ret+""
+
+ return ret
+
+def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None):
+ """rdf"""
+
+ ret=""
+ about=""""""
+ name="""%s"""
+ link="""%s"""
+ clickable="""%s"""
+ #link=""""""
+ type="""%s"""
+ #xlink=""""""
+ if not urn:
+ #urn="urn:"+re.sub('/',':',self.absolute_url())
+ urn=self.absolute_url()
+ about2=about%urn
+ if not nameDef:
+ if hasattr(self,'label') and not (self.label==""):
+ name2=name%self.label
+ elif not self.title=="":
+ name2=name%self.title
+ else:
+ name2=name%self.getId()
+
+ name2=re.sub('&','&',name2)
+ else:
+ name2=name%nameDef
+
+ linkURL=re.sub('http:','',linkURL)
+ linkURL2=re.sub('&','&',linkURL)
+ link2=link%(("http:"+linkURL2),("http:"+urllib.quote(linkURL)))
+ clickable2=clickable%"true"
+
+ if not typeName:
+ type2=type%self.meta_type
+ else:
+ type2=type%typeName
+
+ #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n"
+ ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n"
+ return ret
+
+def getCopyrightsFromForm(self,argv):
+ medias={}
+ partners={}
+ copyrights={}
+
+ copyrightsFinal=[]
+ for arg in argv.keys():
+
+ if arg[0:5]=='media':
+ nm=int(arg[5:])
+ medias[nm]=argv[arg]
+ elif arg[0:5]=='partn':
+ nm=int(arg[5:])
+ partners[nm]=argv[arg]
+ elif arg[0:5]=='copyr':
+ nm=int(arg[5:])
+ copyrights[nm]=argv[arg]
+
+
+
+ copyrightsList=[(medias[nm],partners[nm],copyrights[nm]) for nm in medias.keys()]
+ for copyright in copyrightsList:
+
+ if copyright[2]=='institution0000':
+ copyrightsFinal.append((copyright[0],copyright[1],self.getPartnerCopyright(copyright[1],'')))
+ else:
+ if not copyright[0]=='':
+ copyrightsFinal.append(copyright)
+
+
+ return copyrightsFinal
+
+#List of different types for the graphical linking viewer
+viewClassificationListMaster=['view point','area']
+
+
+def checkDiffs(self,metadict):
+ """check differences"""
+
+
+
+
+ def NoneToEmpty(obj):
+ if obj:
+ return obj
+ else:
+ return ""
+
+
+
+ diffs={}
+
+ tags=self.findTagsFromMapping(self.contentType)
+ self.referencetypes=tags[2]
+ self.fields=tags[3]
+
+
+ for field in tags[1]:
+ try:
+ if (NoneToEmpty(self.getFieldValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
+ diffs[self.getFieldTag(tags,field)]=1
+ else:
+
+ diffs[self.getFieldTag(tags,field)]=0
+ except:
+ diffs[self.getFieldTag(tags,field)]=0
+
+ return diffs
+
+
+def zptFile(self, path):
+ """returns a page template file from the product"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()), path)).__of__(self)
+ return pt
+
+
+def sendFile(self, filename, type):
+ """sends an object or a local file (in the product) as response"""
+ paths = filename.split('/')
+ object = self
+ # look for an object called filename
+ for path in paths:
+ if hasattr(object, path):
+ object = getattr(object, path)
+ else:
+ object = None
+ break
+ if object:
+ # if the object exists then send it
+ return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
+ else:
+ # send a local file with the given content-type
+ fn = os.path.join(package_home(globals()), filename)
+ self.REQUEST.RESPONSE.setHeader("Content-Type", type)
+ self.REQUEST.RESPONSE.write(file(fn).read())
+ return
+
+
+class BrowserCheck:
+ """check the browsers request to find out the browser type"""
+
+ def __init__(self, zope):
+ """initialisiere"""
+ self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
+ self.isN4 = False
+ self.isIE = False
+ if string.find(self.ua, 'MSIE') > -1:
+ self.isIE = True
+ else:
+ self.isN4 = string.find(self.ua, 'Mozilla/4.') > -1
+ try:
+ self.nav = self.ua[string.find(self.ua, '('):]
+ ie = string.split(self.nav, "; ")[1]
+ if string.find(ie, "MSIE") > -1:
+ self.versIE = string.split(ie, " ")[1]
+ except: pass
+ self.isMac = string.find(self.ua, 'Macintosh') > -1
+ self.isWin = string.find(self.ua, 'Windows') > -1
+ self.isIEWin = self.isIE and self.isWin
+ self.isIEMac = self.isIE and self.isMac
+
+
+def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None):
+ """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
+
+ def updateTextToolNode(tag,value):
+ #print dom,tag,value
+ metanode=dom.getElementsByTagName('texttool')[0]
+ try:
+ nodeOld=metanode.getElementsByTagName(tag)
+ except:
+ nodeOld=None
+
+ if nodeOld:
+ metanode.removeChild(nodeOld[0]).unlink()
+
+ node=dom.createElement(tag)
+ nodetext=dom.createTextNode(value)
+ node.appendChild(nodetext)
+ metanode.appendChild(node)
+
+ if xmlfrag:
+ geturl="""
+
+
+
+
+
+ """
+ dom=xml.dom.minidom.parseString(geturl)
+ else:
+ try:
+ geturl=""
+ for line in urlopen(url).readlines():
+ geturl=geturl+line
+
+
+ except:
+ return (None,"XCannot open: "+url)
+
+ try:
+ dom=xml.dom.minidom.parseString(geturl)
+ except:
+ return (None,"Cannot parse: "+url+"
"+geturl)
+
+
+
+ metanodes=dom.getElementsByTagName('bib')
+
+ if not metanodes:
+ metanodes=dom.getElementsByTagName('archimedes')
+
+ metanode=metanodes[0]
+
+ for metaData in metadict.keys():
+
+ try:
+ nodeOld=metanode.getElementsByTagName(metaData)
+ except:
+ nodeOld=None
+
+ if nodeOld:
+ metanode.removeChild(nodeOld[0]).unlink()
+ else:
+ # try also old writing rule - instead of _:
+ try:
+ nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
+ except:
+ nodeOld=None
+
+ if nodeOld:
+ metanode.removeChild(nodeOld[0]).unlink()
+
+ metanodeneu=dom.createElement(metaData)
+ metanodetext=dom.createTextNode(metadict[metaData])
+ #try:
+ #metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
+ #except:
+ #metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
+ metanodeneu.appendChild(metanodetext)
+ metanode.appendChild(metanodeneu)
+
+
+
+
+
+ if project:
+ updateTextToolNode('project',project)
+
+ if startpage:
+ updateTextToolNode('startpage',startpage)
+
+ if topbar:
+ updateTextToolNode('toptemplate',topbar)
+
+ if thumbtemplate:
+ updateTextToolNode('thumbtemplate',thumbtemplate)
+
+ if xslt:
+ updateTextToolNode('xslt',xslt)
+
+
+ if digiliburlprefix:
+ updateTextToolNode('digiliburlprefix',digiliburlprefix)
+
+ try:
+ return dom.toxml().encode('utf-8')
+ except:
+ return dom.toxml('utf-8')
+
+
+
+def readMetadata(url):
+ """Methode zum Auslesen der Metadateninformation zu einer Resource
+ Vorerst noch Typ bib"""
+
+ metadict={}
+
+ try:
+ geturl=""
+ for line in urlopen(url).readlines():
+ geturl=geturl+line
+
+
+ except:
+ return (None,"Cannot open: "+url)
+
+ try:
+ dom=xml.dom.minidom.parseString(geturl)
+ except:
+ return (None,"Cannot parse: "+url+"
"+geturl)
+
+ metanode=dom.getElementsByTagName('bib')
+ metadict['bib_type']='Book'
+ if len(metanode)==0:
+ metanode=dom.getElementsByTagName('archimedes')
+ metadict['bib_type']='Archimedes'
+
+
+ if not len(metanode)==0:
+ metacontent=metanode[0].childNodes
+
+ try:
+ metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
+ except:
+ """nothing"""
+
+ for node in metacontent:
+ try:
+ #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
+ metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
+ except:
+ """nothing"""
+
+
+ return metadict,""
+
+
+class MapArea(SimpleItem):
+ """simple class to hold coordinates"""
+
+ meta_type = 'MapArea'
+ # Create a SecurityInfo for this class.
+ security = ClassSecurityInfo()
+ security.setDefaultAccess("allow")
+ # type constants
+ TYPE_AREA = 'area'
+ TYPE_ARROW = 'arrow'
+
+ def __init__(self, id, coords, label=None, type=None, text=None):
+ """init"""
+ self.coords = coords[0:4]
+ if len(coords) > 4:
+ self.angle = coords[4]
+ else:
+ self.angle = 0
+ self.id = id
+ self.label = label
+ self.setType(type)
+ self.text = text
+
+ def setCoords(self, coords):
+ """sets the coords"""
+ self.coords = coords
+
+ def getCoordString(self):
+ """returns coordinates as a string"""
+ return string.join(self.coords, ',')
+
+ def setCoordString(self, coordstring):
+ """sets coordinates from a string"""
+ coords = string.split(coordstring, ',')
+ self.coords = [c.strip() for c in coords]
+
+ def getFullId(self, prefix=None):
+ """returns the id with prefixed parent id"""
+ if prefix is None:
+ if hasattr(self, 'aq_parent'):
+ prefix = self.aq_parent.id
+ else:
+ prefix = "id"
+ fid = prefix + "." + self.id
+ return fid
+
+ def getType(self):
+ """returns the type"""
+ return self.type
+
+ def setType(self, type):
+ """sets the type"""
+ if type == MapArea.TYPE_ARROW:
+ self.type = MapArea.TYPE_ARROW
+ elif type == MapArea.TYPE_AREA:
+ self.type = MapArea.TYPE_AREA
+ else:
+ self.type = MapArea.TYPE_AREA
+
+ def isTypeArea(self):
+ """returns if the type is area"""
+ return self.type == MapArea.TYPE_AREA
+
+ def isTypeArrow(self):
+ """returns if the type is arrow"""
+ return self.type == MapArea.TYPE_ARROW
+
+ def getAngle(self):
+ """returns the angle"""
+ return self.angle
+
+ def setAngle(self, angle):
+ """sets the angle"""
+ self.angle = angle
+
+ def getText(self):
+ """returns the popup text"""
+ if self.text is None:
+ if hasattr(self, 'aq_parent'):
+ parent = self.aq_parent
+ if parent.contentType == 'text-popup':
+ return parent.description
+ return self.text
+
+ def setText(self, text):
+ """sets the text"""
+ self.text = text
+
+ def getLabel(self):
+ """returns the link label"""
+ if self.label is None:
+ if hasattr(self, 'aq_parent'):
+ return self.aq_parent.label or self.aq_parent.id
+ return self.label
+
+ def setLabel(self, label):
+ """sets the label"""
+ self.label = label
+
+ def getLinkId(self):
+ if hasattr(self, 'aq_parent'):
+ return self.aq_parent.id
+ return self.id
+
+
+# call this to initialize framework classes, which
+# does the right thing with the security assertions.
+Globals.InitializeClass(MapArea)