Annotation of ECHO_content/ECHO_helpers.py, revision 1.61

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>