Annotation of ECHO_content/ECHO_helpers.py, revision 1.25

1.17      dwinter     1: import socket
1.15      dwinter     2: import urllib
1.21      dwinter     3: import xml.dom.minidom
1.24      dwinter     4: from types import *
1.25    ! dwinter     5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
        !             6: from Globals import package_home
        !             7: import os.path
        !             8: 
        !             9: 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']
        !            10: 
        !            11: def content_html(self,type):
        !            12:         """template fuer content"""
        !            13:         #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
        !            14:         #
        !            15:         #if templates:
        !            16:         #    return templates[0][1]()
        !            17: 
        !            18:         if hasattr(self,type+"_template"):
        !            19:             obj=getattr(self,type+"_template")
        !            20:             return obj()
        !            21:         else:
        !            22:             pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
        !            23:             pt.content_type="text/html"
        !            24:             return pt()
        !            25:     
        !            26:     
        !            27: 
        !            28: class ECHO_basis:
        !            29:     """basis eigenschaften fuer echo objekte"""
        !            30:     
        !            31:     def content_html(self,type="collection"):
        !            32:        """template fuer content bei einbau und ECHO_Umgebung"""
        !            33:        
        !            34:        return content_html(self,type)
        !            35:         
        !            36:     def getTitle(self):
        !            37:    """title"""
        !            38:    try:
        !            39:        return self.title.encode('utf-8','ignore') 
        !            40:    except:
        !            41:        self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
        !            42:        return self.title.encode('utf-8','ignore') 
        !            43:    
        !            44:     def getLabel(self):
        !            45:    """title"""
        !            46:    try:
        !            47:        return self.label.encode('utf-8','ignore') 
        !            48:    except:
        !            49:        self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
        !            50:        return self.label.encode('utf-8','ignore') 
        !            51:    
        !            52:     
        !            53:     def changeECHOEntriesForm(self):
        !            54:         """change Entries for the ECHO Navigation environment"""
        !            55:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHOEntriesForm')).__of__(self)
        !            56:         return pt()
        !            57:     
        !            58:     def changeECHOEntries(self,label,weight,description,RESPONSE=None):
        !            59:         """change Entries for the ECHO Navigation environment
        !            60:         @param label: label fuer die Navigation"""
        !            61:         self.label=label
        !            62:         self.weight=weight
        !            63:         self.description=description
        !            64:         
        !            65:         if RESPONSE:
        !            66:             RESPONSE.redirect("manage_main")
        !            67: 
        !            68:     manage_options=({'label':'change ECHO Navigation Entries','action':'changeECHOEntriesForm'},)
        !            69: 
        !            70:     #ende der echo erweiterungen
        !            71: 
1.24      dwinter    72: 
                     73: def toList(field):
                     74:     """Einzelfeld in Liste umwandeln"""
                     75:     if type(field)==StringType:
                     76:         return [field]
                     77:     else:
                     78:         return field
1.21      dwinter    79: 
                     80: def getText(nodelist):
                     81: 
                     82:     rc = ""
                     83:     for node in nodelist:
                     84:        if node.nodeType == node.TEXT_NODE:
                     85:            rc = rc + node.data
                     86:     return rc
                     87: 
1.25    ! dwinter    88: def getTextFromNode(nodename):
        !            89:     nodelist=nodename.childNodes
        !            90:     rc = ""
        !            91:     for node in nodelist:
        !            92:        if node.nodeType == node.TEXT_NODE:
        !            93:            rc = rc + node.data
        !            94:     return rc
        !            95: 
1.21      dwinter    96: 
                     97: def readFieldFromXML(meta_url,parent,field):
                     98:    """lesespezifisches metadatum"""
1.16      dwinter    99:    
1.21      dwinter   100:    try:
                    101:        dom=xml.dom.minidom.parse(meta_url)
                    102: 
                    103:    except:
1.22      dwinter   104:        try:
                    105:            fh=urllib.urlopen(meta_url)
                    106:            dom=xml.dom.minidom.parse(fh)
                    107:            except:
                    108:            return None
1.21      dwinter   109:    if not dom: return None
                    110: 
                    111:    parent=dom.getElementsByTagName(parent)
1.23      dwinter   112:    if not parent: return None
1.21      dwinter   113: 
                    114:    field=parent[0].getElementsByTagName(field)
                    115: 
                    116:    if not field: return None
                    117: 
                    118:    return getText(field[0].childNodes)
                    119:    
                    120:    
                    121:          
1.15      dwinter   122: def urlopen(url):
                    123:    """urlopen mit timeout"""
1.20      dwinter   124:    socket.setdefaulttimeout(2)
                    125:    ret=urllib.urlopen(url)
1.18      dwinter   126:    socket.setdefaulttimeout(5)
1.20      dwinter   127:    return ret
1.17      dwinter   128: #  urlopener = urllib.URLopener()
                    129: #
                    130: #  try:        
                    131: #      con = urlopener.open(url)
                    132: #      return con
                    133: #  except timeoutsocket.Timeout:
                    134: #      return None
1.15      dwinter   135: 
                    136: 
1.25    ! dwinter   137: 
1.11      dwinter   138: 
1.6       dwinter   139: 
1.14      dwinter   140: def checkOnlyOneInGroup(object): 
1.6       dwinter   141:    """check if object is a group and if it containt only one element it return this element"""
                    142:    displayedObjects=object.ZopeFind(object,obj_metatypes=displayTypes)
                    143:    if len(displayedObjects)==1: # nur ein Object dann redirect auf dieses Object
1.8       dwinter   144: 
1.6       dwinter   145:        return displayedObjects[0][1]
                    146:    else:
                    147:        return object
                    148: 
                    149: def getSubCols(self,sortfield="weight",subColTypes= displayTypes):
1.1       dwinter   150: 
1.3       dwinter   151:         
1.1       dwinter   152:         ids=[]
1.6       dwinter   153:    displayedObjects=self.ZopeFind(self,obj_metatypes=subColTypes)
                    154:    
                    155:    
                    156:    for entry in displayedObjects:
1.25    ! dwinter   157:             
1.3       dwinter   158:             object=entry[1]
1.25    ! dwinter   159:             ids.append(object)
        !           160: 
1.1       dwinter   161:         try:
                    162:             sortfield=self.sortfield
                    163:         except:
                    164:             """nothing"""
                    165:             
                    166:         tmplist=[]
                    167:         for x in ids:
                    168:             if hasattr(x,sortfield):
                    169:                 try:
1.7       dwinter   170: 
1.1       dwinter   171:                     x=int(x)
                    172:                 except:
                    173:                     """nothing"""
                    174:                 tmp=getattr(x,sortfield)
                    175:             else:
                    176:                 tmp=10000000
                    177:             tmplist.append((tmp,x))
                    178:         tmplist.sort()
1.25    ! dwinter   179: 
1.1       dwinter   180:         return [x for (key,x) in tmplist]
1.25    ! dwinter   181: 
        !           182: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
        !           183:         """Rerender all Links"""
        !           184:    ret=""
        !           185:    
        !           186:         if not obj:
        !           187:             obj = self
        !           188:             
        !           189:         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource'],search_sub=1)
        !           190: 
        !           191:         for entry in entries:
        !           192:        if entry[1].meta_type == 'ECHO_resource':
        !           193:            try:
        !           194:                entry[1].ECHO_getResourceMD(template="no")
        !           195:                                 if "title" in types:
        !           196:                                     entry[1].generate_title()
        !           197:                                 if "label" in types:
        !           198:                                     entry[1].generate_label()
        !           199:                ret+="OK:"+entry[0]+"-- "+entry[1].getTitle().decode('utf-8')+"-- "+entry[1].getTitle().decode('utf-8')+"<br>"
        !           200:            except:
        !           201:                ret+="Error:"+entry[0]+"<br>"
        !           202: 
        !           203:        
        !           204:                 
        !           205:                 
        !           206:         return "<html><body>"+ret+"Rerenderd all links to resources in: "+self.title+"</html></body>"
        !           207: 
        !           208: def reloadMetaDataFromStorage(self,RESPONSE=None):
        !           209:        """copy metadata from the storage to ECHO"""
        !           210:        ret=""
        !           211:        resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
        !           212: 
        !           213:        for resource in resources:
        !           214:            x=str(resource[1].copyIndex_meta2echo_resource())+"<br>"
        !           215:            ret+=x
        !           216:            #print x
        !           217:            
        !           218: 
        !           219:        if RESPONSE is not None:
        !           220:            #RESPONSE.redirect('./manage_main')
        !           221:            return "<html><body>"+ret+"</html></body>"
        !           222: 
        !           223:        return ret
        !           224:     
        !           225: def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None):
        !           226:        """rdf"""
        !           227:        
        !           228:        ret=""
        !           229:        about="""<RDF:Description RDF:about="%s">"""
        !           230:        name="""<ECHONAVIGATION:name>%s</ECHONAVIGATION:name>"""
        !           231:        link="""<ECHONAVIGATION:link xlink:href="%s">%s</ECHONAVIGATION:link>"""
        !           232:        clickable="""<ECHONAVIGATION:linkClickable>%s</ECHONAVIGATION:linkClickable>"""
        !           233:        #link="""<ECHONAVIGATION:link RDF:about="%s"/>"""
        !           234:        type="""<ECHONAVIGATION:type>%s</ECHONAVIGATION:type>"""
        !           235:             #xlink="""<ECHONAVIGATION:xlink xlink:href="%s"/>"""   
        !           236:        if not urn:
        !           237:            #urn="urn:"+re.sub('/',':',self.absolute_url())
        !           238:            urn=self.absolute_url()
        !           239:        about2=about%urn
        !           240:        if not nameDef:
        !           241:            if hasattr(self,'label') and not (self.label==""):
        !           242:                name2=name%self.label
        !           243:            elif not self.title=="":
        !           244:                name2=name%self.title
        !           245:            else:
        !           246:                name2=name%self.getId()
        !           247: 
        !           248:            name2=re.sub('&','&amp;',name2)
        !           249:        else:
        !           250:            name2=name%nameDef
        !           251: 
        !           252:        linkURL=re.sub('http:','',linkURL)
        !           253:        linkURL2=re.sub('&','&amp;',linkURL)
        !           254:        link2=link%(("http:"+linkURL2),("http:"+urllib.quote(linkURL)))
        !           255:        clickable2=clickable%"true"
        !           256: 
        !           257:        if not typeName:
        !           258:            type2=type%self.meta_type
        !           259:        else:
        !           260:            type2=type%typeName
        !           261:        
        !           262:        #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
        !           263:        ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
        !           264:        return ret
        !           265:     
        !           266: def getCopyrightsFromForm(self,argv): 
        !           267:    medias={}
        !           268:    partners={}
        !           269:    copyrights={}
        !           270:    
        !           271:    copyrightsFinal=[]
        !           272:    for arg in argv.keys():
        !           273:        
        !           274:        if arg[0:5]=='media':
        !           275:            nm=int(arg[5:])
        !           276:            medias[nm]=argv[arg]
        !           277:        elif arg[0:5]=='partn':
        !           278:            nm=int(arg[5:])
        !           279:            partners[nm]=argv[arg]
        !           280:        elif arg[0:5]=='copyr':
        !           281:            nm=int(arg[5:])
        !           282:            copyrights[nm]=argv[arg]
        !           283: 
        !           284: 
        !           285: 
        !           286:    copyrightsList=[(medias[nm],partners[nm],copyrights[nm]) for nm in medias.keys()]
        !           287:    for copyright in copyrightsList:
        !           288:        
        !           289:        if copyright[2]=='institution0000':
        !           290:            copyrightsFinal.append((copyright[0],copyright[1],self.getPartnerCopyright(copyright[1],'')))
        !           291:        else:
        !           292:            if not copyright[0]=='':
        !           293:                copyrightsFinal.append(copyright)
        !           294:        
        !           295:            
        !           296:    return copyrightsFinal
        !           297: 
        !           298: #List of different types for the graphical linking viewer
        !           299: viewClassificationListMaster=['view point','area']
        !           300: 
        !           301: 
        !           302: def checkDiffs(self,metadict):
        !           303:        """check differences"""
        !           304: 
        !           305:        
        !           306: 
        !           307:     
        !           308:        def NoneToEmpty(obj):
        !           309:            if obj:
        !           310:                return obj
        !           311:            else:
        !           312:                return ""
        !           313: 
        !           314:        
        !           315:        
        !           316:        diffs={}
        !           317:        
        !           318:        tags=self.findTagsFromMapping(self.contentType)
        !           319:        self.referencetypes=tags[2]
        !           320:        self.fields=tags[3]
        !           321:        
        !           322:     
        !           323:        for field in tags[1]:
        !           324:            try:
        !           325:                if (NoneToEmpty(self.getFieldValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
        !           326:                    diffs[self.getFieldTag(tags,field)]=1
        !           327:                else:
        !           328:                    
        !           329:                    diffs[self.getFieldTag(tags,field)]=0
        !           330:            except:
        !           331:                diffs[self.getFieldTag(tags,field)]=0
        !           332:                
        !           333:        return diffs
        !           334:     
        !           335: 
        !           336: 
        !           337: 
        !           338: def sendFile(self, filename, type):
        !           339:     """sends an object or a local file (in the product) as response"""
        !           340:     paths = filename.split('/')
        !           341:     object = self
        !           342:     # look for an object called filename
        !           343:     for path in paths:
        !           344:         if hasattr(object, path):
        !           345:        object = getattr(object, path)
        !           346:    else:
        !           347:        object = None
        !           348:        break
        !           349:     if object:
        !           350:    # if the object exists then send it
        !           351:    return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
        !           352:     else:
        !           353:    # send a local file with the given content-type
        !           354:    fn = os.path.join(package_home(globals()), filename)
        !           355:    self.REQUEST.RESPONSE.setHeader("Content-Type", type)
        !           356:    self.REQUEST.RESPONSE.write(file(fn).read())
        !           357:     return
        !           358: 
        !           359: class BrowserCheck:
        !           360:     """check the browsers request to find out the browser type"""
        !           361:     
        !           362:     def __init__(self, zope):
        !           363:         """initialisiere"""
        !           364:    self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
        !           365:    self.isN4 = (string.find(self.ua, 'Mozilla/4.') > -1) and (string.find(self.ua, 'MSIE') < 0)
        !           366:    self.isIE = string.find(self.ua, 'MSIE') > -1
        !           367:    self.nav = self.ua[string.find(self.ua, '('):]
        !           368:    ie = string.split(self.nav, "; ")[1]
        !           369:    if string.find(ie, "MSIE") > -1:
        !           370:        self.versIE = string.split(ie, " ")[1]
        !           371:    self.isMac = string.find(self.ua, 'Macintosh') > -1
        !           372:    self.isWin = string.find(self.ua, 'Windows') > -1
        !           373:    self.isIEWin = self.isIE and self.isWin
        !           374:    self.isIEMac = self.isIE and self.isMac
        !           375: 
        !           376:        
        !           377:        
        !           378: def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None):
        !           379:    """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
        !           380: 
        !           381:    def updateTextToolNode(tag,value):
        !           382:        #print dom,tag,value
        !           383:        metanode=dom.getElementsByTagName('texttool')[0]
        !           384:        try:
        !           385:            nodeOld=metanode.getElementsByTagName(tag)
        !           386:        except:
        !           387:            nodeOld=None
        !           388:            
        !           389:        if nodeOld:
        !           390:            metanode.removeChild(nodeOld[0]).unlink()
        !           391: 
        !           392:        node=dom.createElement(tag)
        !           393:        nodetext=dom.createTextNode(value)
        !           394:        node.appendChild(nodetext)
        !           395:        metanode.appendChild(node)
        !           396: 
        !           397:    if xmlfrag:
        !           398:        geturl="""<?xml version="1.0" ?>
        !           399:                            <resource type="MPIWG">
        !           400:               <meta>
        !           401:                <bib type="Book">
        !           402:                        </bib>
        !           403:                </meta>
        !           404:                </resource>"""
        !           405:        dom=xml.dom.minidom.parseString(geturl)
        !           406:    else:
        !           407:        try:
        !           408:            geturl=""
        !           409:            for line in ECHO_helpers.urlopen(url).readlines():
        !           410:                geturl=geturl+line
        !           411: 
        !           412: 
        !           413:        except:
        !           414:            return (None,"Cannot open: "+url)
        !           415: 
        !           416:        try:
        !           417:            dom=xml.dom.minidom.parseString(geturl)
        !           418:        except:
        !           419:            return (None,"Cannot parse: "+url+"<br>"+geturl)
        !           420: 
        !           421:    
        !           422: 
        !           423:    metanodes=dom.getElementsByTagName('bib')
        !           424: 
        !           425:    if not metanodes:
        !           426:        metanodes=dom.getElementsByTagName('archimedes')
        !           427: 
        !           428:    metanode=metanodes[0]
        !           429: 
        !           430:    for metaData in metadict.keys():
        !           431:        
        !           432:        try:
        !           433:            nodeOld=metanode.getElementsByTagName(metaData)
        !           434:        except:
        !           435:            nodeOld=None
        !           436:            
        !           437:        if nodeOld:
        !           438:            metanode.removeChild(nodeOld[0]).unlink()
        !           439:        else:
        !           440:            # try also old writing rule - instead of _:
        !           441:            try:
        !           442:                nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
        !           443:            except:
        !           444:                nodeOld=None
        !           445:                
        !           446:            if nodeOld:
        !           447:                metanode.removeChild(nodeOld[0]).unlink()
        !           448: 
        !           449:        metanodeneu=dom.createElement(metaData)
        !           450:                 metanodetext=dom.createTextNode(metadict[metaData])
        !           451:        #try:
        !           452:            #metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
        !           453:        #except:
        !           454:            #metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
        !           455:        metanodeneu.appendChild(metanodetext)
        !           456:        metanode.appendChild(metanodeneu)
        !           457: 
        !           458: 
        !           459:    
        !           460:    
        !           461:    
        !           462:    if project:
        !           463:        updateTextToolNode('project',project)
        !           464: 
        !           465:    if startpage:
        !           466:        updateTextToolNode('startpage',startpage)
        !           467: 
        !           468:    if topbar:
        !           469:        updateTextToolNode('toptemplate',topbar)
        !           470: 
        !           471:    if thumbtemplate:
        !           472:        updateTextToolNode('thumbtemplate',thumbtemplate)
        !           473: 
        !           474:    if xslt:
        !           475:        updateTextToolNode('xslt',xslt)
        !           476: 
        !           477:    
        !           478:    if digiliburlprefix:
        !           479:        updateTextToolNode('digiliburlprefix',digiliburlprefix)
        !           480:    
        !           481:         try:   
        !           482:     return dom.toxml().encode('utf-8')
        !           483:    except:
        !           484:     return dom.toxml('utf-8')
        !           485: 
        !           486:    
        !           487:    
        !           488: def readMetadata(url):
        !           489:     """Methode zum Auslesen der Metadateninformation zu einer Resource
        !           490:     Vorerst noch Typ bib"""
        !           491:     
        !           492:     metadict={}
        !           493:     try:
        !           494:         geturl=""
        !           495:         for line in ECHO_helpers.urlopen(url).readlines():
        !           496:             geturl=geturl+line
        !           497:         
        !           498:         
        !           499:     except:
        !           500:         return (None,"Cannot open: "+url)
        !           501: 
        !           502:     try:
        !           503:         dom=xml.dom.minidom.parseString(geturl)
        !           504:     except:
        !           505:         return (None,"Cannot parse: "+url+"<br>"+geturl)
        !           506: 
        !           507:     metanode=dom.getElementsByTagName('bib')
        !           508:     metadict['bib_type']='Book'
        !           509:     if len(metanode)==0:
        !           510:         metanode=dom.getElementsByTagName('archimedes')
        !           511:         metadict['bib_type']='Archimedes'
        !           512:         
        !           513:         
        !           514:     if not len(metanode)==0:    
        !           515:         metacontent=metanode[0].childNodes
        !           516:     
        !           517:         try:
        !           518:             metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
        !           519:         except:
        !           520:             """nothing"""
        !           521:         
        !           522:         for node in metacontent:
        !           523:             try:
        !           524:            #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
        !           525:            metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
        !           526:             except:
        !           527:                 """nothing"""
        !           528: 
        !           529: 
        !           530:     return metadict,""
        !           531:     

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