Annotation of ECHO_content/ECHO_resource.py, revision 1.6.2.6

1.6.2.1   dwinter     1: #TODO: change metaDataHash, jetzt tag -> data(tags aus dem neuen Metadatamain)
                      2: #TODO: contentType aus den Metadaten
                      3: 
1.1       dwinter     4: import urlparse
                      5: import string
                      6: import tempfile
                      7: import zipfile
                      8: import re
                      9: import os,shutil
                     10: import OFS.Image
                     11: from types import *
                     12: from OFS.Cache import Cacheable
                     13: from OFS.Image import Image
                     14: from Globals import DTMLFile
                     15: from OFS.Folder import Folder
                     16: from OFS.SimpleItem import SimpleItem
                     17: from AccessControl import ClassSecurityInfo
                     18: from AccessControl.User import UserFolder
                     19: from Globals import InitializeClass
                     20: from Globals import DTMLFile
                     21: import Globals
                     22: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
                     23: from Products.PageTemplates.PageTemplate import PageTemplate
                     24: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate,manage_addPageTemplate
                     25: from Globals import Persistent, package_home
                     26: from Acquisition import Implicit
                     27: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
                     28: from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon
1.2       dwinter    29: try:
                     30:    from Products.MetaDataProvider.MetaDataClient import MetaDataClient
                     31: except:
                     32:    print "no metadata services"
1.1       dwinter    33: import urllib
                     34: import urllib2
                     35: import cgi
                     36: import smtplib
                     37: import time
1.6.2.1   dwinter    38: #from Ft.Xml.Domlette import NonvalidatingReader
                     39: #from Ft.Xml.Domlette import PrettyPrint, Print
                     40: #from Ft.Xml import EMPTY_NAMESPACE
                     41: #
                     42: #import Ft.Xml.XPath
1.1       dwinter    43: import cStringIO
                     44: 
                     45: import sys
                     46: 
                     47: try:
                     48:         from psycopg import libpq
                     49: except:
                     50:         try:
                     51:                 from pyPgSQL import libpq
                     52:         except:
                     53:                 print "ECHO_collection: Warning - No libpq imported!"
                     54:                 
                     55: import xml.dom.minidom
                     56: 
                     57: import urllib
                     58: import xml.dom.minidom
                     59: import ECHO_helpers
                     60: from ECHO_helpers import *
                     61: 
                     62: 
                     63: from ECHO_movie import *
1.6.2.4   casties    64: #import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen
1.1       dwinter    65: import xmlrpclib
                     66: 
                     67: import logging
                     68: 
                     69: class ECHO_resource(CatalogAware,Folder,Persistent,ECHO_basis):
                     70:     """ECHO Ressource"""
                     71:     security=ClassSecurityInfo()
                     72:     meta_type='ECHO_resource'
                     73:     default_catalog='resourceCatalog'
                     74:     
1.6.2.1   dwinter    75:    #    viewClassificationList=viewClassificationListMaster
                     76:    
1.6.2.6 ! dwinter    77:    
        !            78:    
1.6.2.1   dwinter    79:         
1.1       dwinter    80:     def PrincipiaSearchSource(self):
                     81:            """Return cataloguable key for ourselves."""
                     82:            return str(self)
1.6.2.6 ! dwinter    83:           
        !            84:     def getDCDate(self):
        !            85:        """dc mapped date"""
        !            86:        try:
        !            87:            bibdata=self.getMetaDataManager().getBibData(path=self.getMetaDataLink())
        !            88:            dcMapped = self.getMetaDataManager().getDCMappedData(bibdata)
        !            89:            return dcMapped.get('date')
        !            90:        except:
        !            91:             
        !            92:             logging.error("getDCDate doesn't work, cannot read metadata:"+self.getId())
        !            93:            
        !            94:        
1.1       dwinter    95:     getSubCols = ECHO_helpers.getSubCols
1.6.2.1   dwinter    96:     
1.6.2.5   dwinter    97: #    def getMetaDataManager(self):
                     98: #       """hole eine Instanz von MetaDataFolder
                     99: #       TODO: sollte konfigurierbar sein. 
                    100: #       zur Zeit wird enfach nur self.metadata falls vorhanden zurueckggegeben.
                    101: #       """
                    102: #  
                    103: #       mf= getattr(self,"metadataFolder",None)
                    104: #       #logging.debug("MetadataManager:"+repr(mf))
                    105: #       return mf
                    106: #       
1.1       dwinter   107: 
                    108:     def index_meta(self,RESPONSE=None):
                    109:         """ gibt das im metalink gespeicher xml-file zurueck"""
                    110:         url = self.metalink
                    111:         txt=""
                    112:         logging.debug("ml:%s"%url)
                    113:         try:
                    114:             page = urllib.urlopen(url);
                    115:             if RESPONSE:
                    116:                 RESPONSE.setHeader("Content-Type","text/xml")
                    117:             
                    118:             txt = page.read();
                    119:         except:
                    120:             logging.error("Cannot read metadata of: %s"%self.getId())
                    121:         
                    122:         return txt
                    123:         
                    124:     def reindex(self):
                    125:         """generate fields for indexing and reindex"""
                    126:         
                    127:         #TODO: korrigieren des metalink pfades konfigurierbar machen
                    128:         splitted= [x for x in urlparse.urlparse(self.metalink)]
                    129:         splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]
                    130:         
                    131:         if splitted[0]=="http":
                    132:             self.metalink=urlparse.urlunparse(splitted)
                    133:         
                    134: 
                    135:         self.fullTextUrl=self.getFullTextXML(noredirect="yes")
                    136:         
                    137:         #TODO: korrigieren relative url to absoluter url volltexten, konfigurierbar?
                    138:         splitted= [x for x in urlparse.urlparse(self.fullTextUrl)]
                    139:         if splitted[0]=="":
                    140:             splitted[0]="http"
                    141:             splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]
                    142:             
                    143:             self.fullTextUrl=urlparse.urlunparse(splitted)
                    144:             
                    145:         self.imagePath=self.getImagePath()
                    146:         
                    147:         self.reindex_object()
                    148:   
                    149:   
1.6.2.5   dwinter   150:  
1.1       dwinter   151: 
                    152:     def getRDF(self,urn=None):
                    153:             """rdf"""
1.3       dwinter   154:             ap = self.getArchivePathFromMetadata()
                    155:          
                    156:        
                    157:             ret=getRDFDescription(self,self.link,urn=urn,ap=ap)
1.4       dwinter   158:            
1.1       dwinter   159:             return ret+self.createSubElementRDF(urn=urn) 
                    160: 
                    161:   
                    162:     def changeAccessRightForm(self,preselect=None):
                    163:         """change the access rights"""
                    164:         
                    165:         pt=zptFile(self, 'zpt/ChangeECHO_resourceAccessRight.zpt')
                    166:         return pt(preselect=preselect)
                    167:     
                    168:     def changeAccessRight(self):
                    169:         """changeRights"""
                    170:         argv=self.REQUEST.form
                    171:         self.setAccessRightXML(argv["%s_xml"%self.getId()])
                    172:         self.accessRight=argv["%s_echo"%self.getId()]
                    173:          
                    174:         self.REQUEST.RESPONSE.redirect('manage_main')
                    175:         
                    176:     
                    177:     def getAccessRightSelectorHTML(self,outlook="select",xmldominant=None,preselect=None):
                    178:             """htmlselector, xmldominant= in der regel wird der wert des xmlfiles ausgegeben ausser er existiert nicht"""
                    179:             values=['','free','MPIWG']
                    180:             
                    181:             if preselect:#set all to the preselected
                    182:                 ar=(preselect,preselect)
                    183:             else:#else set to actual value
                    184:                 ar=self.getAccessRightMD()
                    185:                 
                    186:             if outlook=="select":
                    187:                     ret="""<select name="%s_xml">"""%self.getId()
                    188:                     ret1="""<select name="%s_echo">"""%self.getId()
                    189:                     for value in values:
                    190:                             if value==ar[0]:
                    191:                                     ret+="<option selected>%s</option>"%value
                    192:                             else:
                    193:                                     ret+="<option>%s</option>"%value
                    194:                             
                    195:                             if value==ar[1]:
                    196:                                     ret1+="<option selected>%s</option>"%value
                    197:                             else:
                    198:                                     ret1+="<option>%s</option>"%value
                    199:                     
                    200:                     
                    201:                     if not xmldominant:
                    202:                         return ret+"</select>",ret1+"</select>"
                    203:                     else:
                    204:                         if ar[0] is not None:
                    205:                             return ret+"</select>"
                    206:                         else:
                    207:                             return "<p>No xml file (only local selection):"+ret1
                    208: 
                    209:             else:
                    210:                     ret=""
                    211:                     ret1=""
                    212:                     for value in values:
                    213:                             
                    214:                             if value==ar[0]:
                    215:                                     ret+="""<input type="radio" name="%s_xml" value="%s" checked>%s"""%(self.getId(),value,value)
                    216:                             else:
                    217:                                     ret+="""<input type="radio" name="%s_xml" value="%s">%s"""%(self.getId(),value,value)
                    218:                                     
                    219:                             if value==ar[1]:
                    220:                                     ret1+="""<input type="radio" name="%s_echo" value="%s" checked>%s"""%(self.getId(),value,value)
                    221:                             else:
                    222:                                     ret1+="""<input type="radio" name="%s_echo" value="%s">%s"""%(self.getId(),value,value)
                    223: 
                    224:                     if not xmldominant:                        
                    225:                         return ret,ret1
                    226:                     else:                         
                    227:                         if ar[0]:
                    228:                             return ret
                    229:                         else:
                    230:                             return "<p>No xml file (only local selection)</p>"+ret1
                    231: 
                    232: 
                    233: 
                    234:     def copyAccessRightsFromMD(self):
                    235:             """kopiere rechte aus den metadaten"""
                    236:             self.accessRight=self.getAccessRightMD()[0]
                    237:             
                    238:             
                    239:             
                    240:             
                    241:     
                    242:     def getAccessRightMD(self):
                    243:                 """set accessright"""
                    244:                 url=self.metalink
                    245: 
                    246:                 try:
                    247:                     urllib.urlopen(url)
                    248:                 except:
                    249:                     logger("ECHO_Resource (getAccessRightMD)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
                    250: 
                    251:                     return None,getattr(self,'accessRight','')
                    252:                 
                    253:             
                    254:                 try:
                    255:                         dom = NonvalidatingReader.parseUri(url)
                    256:                 except:
                    257:                         logger("ECHO_Resource (getAccessRightMD)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
                    258:                         return (None,"Cannot parse: "+url+"<br>"+"%s (%s)"%sys.exc_info()[0:2])
                    259: 
                    260: 
                    261:                 accessright=dom.xpath("//meta/access-conditions/access/@type")
                    262:                 if accessright:
                    263:                     accessright=accessright[0].value
                    264:                 if str(accessright)=='institution':
                    265:                     tmp=dom.xpath("//meta/access-conditions/access/name")
                    266:                     if tmp:
                    267:                         accessright=getTextFromNode(tmp[0])
                    268:                     
                    269:                 if not accessright:
                    270:                     accessright=""
                    271:                 
                    272:                 return accessright,getattr(self,'accessRight','')             
                    273: 
                    274:     def changeAccessRightMD(self,accessright,RESPONSE=None):
                    275:             """change the rights - not user anymore"""
                    276:             #TODO: check if method still needed
                    277:             params="accessright=%s"%accessright
                    278: 
                    279: 
                    280:             #print ECHO_helpers.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read()
                    281: 
                    282:             tries=0
                    283:             for i in range(10):
                    284:                     x=ECHO_helpers.urlopen('http://echo.mpiwg-berlin.mpg.de/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/setAccessRightXML'+urllib.quote('?'+params))).read()
                    285:                     if x=="ok":
                    286:                            
                    287:                             break;
                    288:                  
                    289:             
                    290:           
                    291:             if RESPONSE is not None:
                    292:                         RESPONSE.redirect('manage_main')
                    293: 
                    294:                 
                    295:     def setAccessRightXML(self,accessright):
                    296:                 """set accessright"""
                    297:                 url=self.metalink
                    298:                 accessrights=['MPIWG','free']#allowes rights
                    299:                 
                    300:                 if accessright =='':
                    301:                     """do nothing"""
                    302:                     return ""
                    303:                     
                    304:                     
                    305:                 try:
                    306:                         geturl=""
                    307:                         for line in ECHO_helpers.urlopen(url).readlines():
                    308:                                 geturl=geturl+line 
                    309: 
                    310: 
                    311:                 except:
                    312:                         return (None,"Cannot open: "+url)
                    313: 
                    314:                 try:
                    315:                         dom=xml.dom.minidom.parseString(geturl)
                    316:                         root=dom.getElementsByTagName('resource')[0]
                    317:                 except:
                    318:                         return (None,"Cannot parse: "+url+"<br>"+geturl)
                    319: 
                    320:                 metamains=dom.getElementsByTagName('meta')
                    321:                 
                    322:                 if not metamains:
                    323:                         nodenew=dom.createElement('meta')
                    324:                         root.appendChild(nodenew)
                    325:                         metamain=nodenew
                    326:                 else:
                    327:                         metamain=metamains[0]
                    328:                 
                    329:                 
                    330:                 metanodes=metamain.getElementsByTagName('access-conditions')
                    331: 
                    332:                 if not metanodes:
                    333:                         nodenew=dom.createElement('access-conditions')
                    334:                         metamain.appendChild(nodenew)
                    335:                         metanode=nodenew
                    336:                 else:
                    337:                         metanode=metanodes[0]
                    338: 
                    339:                 accesses=metanode.getElementsByTagName('access')
                    340: 
                    341:                 #delete old
                    342:                 if accesses:
                    343:                      metanode.removeChild(accesses[0]).unlink()
                    344: 
                    345:                 #create new
                    346:                     
                    347:                 nodenew2=dom.createElement('access')
                    348:                 metanode.appendChild(nodenew2)
                    349:                 metanode2=nodenew2
                    350:                 
                    351:                 attribute=metanode2.getAttribute('type')
                    352:                 
                    353:                 if accessright=="free":
                    354:                     
                    355:                      metanode2.setAttribute('type','free')
                    356:                 
                    357:                 elif accessright.upper()=='MPIWG':
                    358:                         metanode2.setAttribute('type','institution')
                    359:                         nodenew4=dom.createElement('name')
                    360:                         metanodetext=dom.createTextNode('MPIWG')
                    361:                         nodenew4.appendChild(metanodetext)
                    362:                         nodenew2.appendChild(nodenew4)
                    363:                 #print dom.toxml().encode('utf-8')
                    364:                 string= encodeRPC(dom.toxml().encode('utf-8'))
                    365:                 
                    366:                 #TODO: make server configurable
                    367:                 server=xmlrpclib.Server("http://foxridge.mpiwg-berlin.mpg.de/server")
                    368: 
                    369:                 path=urlparse.urlparse(self.metalink)[2]
                    370:          
                    371:                 server.writeMetaDataFile(path,string,"yes")
                    372:         
                    373: 
                    374:     def createImageUrl(self,pn=1):
                    375:             """create ImageUrl"""
                    376: 
                    377:             
1.5       dwinter   378:             resourcepath=readFieldFromXML_xpath(self.metalink,'//resource/archive-path')
1.1       dwinter   379:             
                    380:             digiliburlprefix=readFieldFromXML(self.metalink,'texttool','digiliburlprefix')
                    381:             images=readFieldFromXML(self.metalink,'texttool','image')
                    382: 
                    383: 
                    384:             if (not resourcepath) or (not digiliburlprefix) or (not images):
                    385:                     logger("ECHO (createImageUrl)",logging.ERROR,"Cannot create ImageUrl for %s"%self.absolute_url())
                    386:                     return None
                    387:             resourcepath=resourcepath.replace('/mpiwg/online','')
                    388:             if not digiliburlprefix: digiliburlprefix="http://echo.mpiwg-berlin.mpg.de/zogilib?"
                    389: 
                    390:             if (not images) or (not resourcepath): return None
                    391: 
                    392:             return "%sfn=%s&pn=%i"%(digiliburlprefix,resourcepath+"/"+images,pn)
                    393:     
                    394:     def copyTitleToInfoXML(self,RESPONSE=None):
                    395:             """copy title from the resource"""
                    396:             presentationXML=readFieldFromXML(self.metalink,'texttool','presentation')
1.5       dwinter   397:             resourcepath=readFieldFromXML_xpath(self.metalink,'//resource/archive-path')
1.1       dwinter   398:             if (not presentationXML) or (not resourcepath): 
                    399:                 if RESPONSE:
                    400:                         RESPONSE.write("Error: %s\n"%self.getId())
                    401:                 else:
                    402:                         return None,self.absolute_url()
                    403: 
                    404:             try:
                    405:                     fh=file(os.path.join(resourcepath,presentationXML),'w')
                    406:                     fh.write("""<info>
                    407:                     <author></author>
                    408:                     <title>%s</title>
                    409:                     <date></date>
                    410:                     <display>yes</display>
                    411:                     </info>"""%self.title)
                    412:                     fh.close()
                    413:                     return 1,self.getId()
                    414:             except:
                    415:                     if RESPONSE:
                    416:                             RESPONSE.write("Error: %s\n"%self.getId())
                    417:                     else:
                    418:                             return None,self.absolute_url()
                    419: 
                    420:             
                    421: 
                    422: 
                    423: 
                    424:     def setLink(self, link=None):
                    425:         """change link field"""
                    426:         if link is not None:
                    427:             self.link = link
                    428:             
                    429:    
                    430:     def getTextToolsField(self,name,default=''):
                    431:         """Lese Textoolsfelder aus index.meta im path aus"""
                    432:         
                    433:         try:
                    434:             dom=xml.dom.minidom.parse(self.metalink)
                    435:             node=dom.getElementsByTagName('texttool')[0] #getNode
                    436:             subnode=node.getElementsByTagName(name)[0]
                    437: 
                    438:             # bei text wird nur der Folder gebraucht
                    439:             if name=="text":
                    440:                 splitted=getText(subnode.childNodes).split("/")
                    441:                 return splitted[len(splitted)-2]
                    442:             else:
                    443:                 return getText(subnode.childNodes)
                    444:         except:
                    445:             return default
                    446:    
                    447: 
                    448: 
                    449: 
                    450:     security.declarePublic('content_html')      
                    451:     def content_html(self):
                    452:         """template fuer content"""
                    453:         return ECHO_basis.content_html(self,'resource')
                    454:     
                    455: #    def getViewClassification(self):
                    456: #        if hasattr(self,'viewClassification'):
                    457: #            return self.viewClassification
                    458: #        else:
                    459: #            return ""
                    460: 
                    461:     def getFullTextXML(self,noredirect=None):
                    462:             """getFullTextXML; gives the FullText as an XML Document, and <error></error> if somthing goes wrong."""
                    463: 
                    464:             try:
                    465:                     #logger("ECHO Fulltext",logging.INFO,"open %s"%self.metalink)
                    466:                     fh=ECHO_helpers.urlopen(self.metalink)
                    467:                     #logger("ECHO Fulltext",logging.INFO,"opened %s"%self.metalink)
                    468:                     dom=xml.dom.minidom.parse(fh)
                    469:                     texttools=dom.getElementsByTagName('texttool')
                    470:                     text=texttools[0].getElementsByTagName('text')
                    471:                     texturl=getText(text[0].childNodes)
                    472: 
                    473:                     #logger("ECHO Fulltext",logging.INFO,"found %s"%texturl)
                    474:                     fh.close()
                    475:                     #logger("ECHO Fulltext",logging.INFO,"closed fh")
                    476:                     #keine url
                    477:                     if not (texturl.split(":")[0] in ['http','ftp','file']): 
                    478:                         if not noredirect:
                    479:                             return file(texturl).read()
                    480:                         else:
                    481:                             return texturl
                    482: 
                    483:                     if not noredirect:
                    484:                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')  
                    485:                             logger("ECHO Fulltext",logging.INFO,"redirect to:%s"%texturl)
                    486:                             self.REQUEST.RESPONSE.redirect(texturl)
                    487:                     else:
                    488:                             return texturl
                    489:             except:
                    490: 
                    491:                     if not noredirect:
                    492:                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                    493:                             self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
                    494:                     else:
                    495:                             return "<error>no fulltext available</error>"
                    496: 
                    497:     def getImagePath(self):
                    498:             """gibt pfad zum image aus"""
                    499:             return self.getImageView(noredirect="yes",onlyPath="yes")
                    500:     
1.3       dwinter   501:     def getArchivePathFromMetadata(self):
                    502:        try:
1.5       dwinter   503:            archivePath=readFieldFromXML_xpath(self.metalink,"//resource/archive-path")
                    504:            return archivePath
1.3       dwinter   505:        except:
                    506:            return ""
                    507:    
1.1       dwinter   508:     def getImageView(self,noredirect=None,onlyPath=None):
                    509:             """getImages; give Imageviewr  and <error></error> if somthing goes wrong."""
                    510:             try:
1.5       dwinter   511:                    archivePath=readFieldFromXML_xpath(self.metalink,"//resource/archive-path")
                    512:                   
1.1       dwinter   513:                     archivepath=re.sub('/mpiwg/online/','',archivepath) 
                    514:                     imageurl="http://echo.mpiwg-berlin.mpg.de/zogilib?fn="+archivepath+"/"+imagetemp
                    515:                     fh.close()
                    516: 
                    517:                     if not noredirect:
                    518:                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')  
                    519:                             self.REQUEST.RESPONSE.redirect(imageurl)
                    520:                     else:
                    521:                             if not onlyPath:
                    522:                                     return imageurl
                    523:                             else:
                    524:                                     return archivepath+"/"+imagetemp
                    525:             except:
                    526: 
                    527:                     if not noredirect:
                    528:                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                    529:                             self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
                    530:                     else:
                    531:                             return "<error>no images available</error>"
                    532: 
                    533:     
                    534:     def getCopyrightsHTML(self):
                    535:             """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus"""
                    536:             
                    537:             if hasattr(self,'copyrightModel'):
                    538:                     obj=self.copyrightModel
                    539:                     
                    540:             else:
                    541:                     return "ERROR"
                    542:             ret=[]
                    543:             
                    544:             for copyright in obj.getCopyrights(): #copyright - media / partner / copyrightID
                    545:                     
                    546:                     
                    547:                     try:
                    548:                         if hasattr(self.copyrightTypes,copyright[2]):
                    549:                              copyrightTypeObj=getattr(self.copyrightTypes,copyright[2])
                    550:                              link="copyrightTypes/"+copyright[2]+'/copyright.html'
                    551:                         else:
                    552:                              copyrightTypeObj=getattr(obj,copyright[2])
                    553:                              link="copyrightModel/"+copyright[2]+'/copyright.html'
                    554:                              
                    555:                         label=copyrightTypeObj.label
                    556:                         url=getattr(copyrightTypeObj, 'url', '')
                    557:                             
                    558:                         if url!='':
                    559:                                  ret.append((url,copyright[0],copyright[1],copyright[2],label))
                    560:                         else:
                    561:                                 if hasattr(copyrightTypeObj, 'copyright.html'):
                    562:                                      ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label))
                    563:                                 else:
                    564:                                      ret.append(('empty',copyright[0],copyright[1],copyright[2],label))
                    565:                     except:
                    566:                             """nothing"""
                    567:                     
                    568:             return ret
                    569:             
                    570:     def getInstitutionsHTML(self):
                    571:                 """gibt Liste der foerdernden Institutionen aus"""
                    572:                 
                    573:                 if hasattr(self,'support'):
                    574:                         obj=self.support
                    575:                         ret=obj.getSupporter()
                    576:                         return ret
                    577:                 else:
                    578:                         return ''
                    579:                         
                    580:     def getOwnerOriginalsHTML(self):
                    581:                """gibt Liste der foerdernden Institutionen aus"""
                    582:                
                    583:                if hasattr(self,'ownerOriginal'):
                    584:                        obj=self.ownerOriginal
                    585:                        ret=obj.getOwner()
                    586:                        return ret
                    587:                else:
                    588:                        return ''
                    589:     
                    590:     def getDigiCopyByHTML(self):
                    591:                """gibt Liste der foerdernden Institutionen aus"""
                    592:                
                    593:                if hasattr(self,'digiCopyBy'):
                    594:                        obj=self.digiCopyBy
                    595:                        ret=obj.getDigiCopyBy()
                    596:                        return ret
                    597:                else:
                    598:                        return ''                    
                    599:     
                    600:     def getCredits(self):
                    601:         """Ausgabe der credits"""
                    602:         if self.credits:
                    603:             return self.credits
                    604:         else:
                    605:             return []
                    606: 
                    607: 
1.6.2.5   dwinter   608: #    def getStorageManagerResourceURL(self):
                    609: #        """get the link to storage"""
                    610: #        urlbase=self.getStorageManagerURL();
                    611: #        
                    612: #        #now get the path from the metadatalink
                    613: #        
                    614: #        path = self.correctPath(self.getMetaDataLink())
                    615: #        if path is None:
                    616: #            return ""
                    617: #        else:
                    618: #            path=path.replace("index.meta","")
                    619: #            return urlbase+path
                    620: #        
1.1       dwinter   621:         
                    622:     def correctPath(self,path):
                    623:         #take only the path of the url which starts with /permanent or /experimental
                    624:         
                    625:         rs= re.search("/permanent/(.*)", path);
                    626:         if rs is not None:
                    627:             txt="permanent/"+rs.group(1)
                    628:         else:
                    629:             rs= re.search("/experimental/(.*)", path);
                    630:             if rs is not None:
                    631:                 txt="experimental"+rs.group(1)
                    632:             else:
                    633:                 return None
                    634:         
                    635:         return txt
                    636:         
                    637:     def __init__(self,id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords):
                    638: 
                    639:         self.id = id
                    640:         """Festlegen der ID"""
                    641:         
                    642:         self.label = label
                    643:         self.link= link
                    644:         self.metalink=metalink
                    645:         self.title=title
                    646:         self.weight=weight
                    647:         self.credits=toList(credits)
                    648:         self.description=description
                    649:         self.contentType=contentType
                    650:         self.copyrightType=copyrightType
                    651:         self.renderingType=renderingType
                    652:         self.responsible=responsible
                    653:         self.resourceID=resourceID
                    654:         
                    655:         if coords:
                    656:             coordsnew=[ string.split(x,",") for x in coords]
                    657:         else:
                    658:             coordsnew=[]
                    659:         
                    660:         self.coords=coordsnew
                    661: #       self.viewClassification=""
                    662: 
                    663: 
                    664: 
                    665:     def getContentType(self):
                    666:             try:
                    667:                     return normalizeCt(self.contentType)
                    668:             except:
                    669:                     return ""
                    670: 
                    671:     def getCopyrightType(self):
                    672:             try:
                    673:                     return self.copyrightType
                    674:             except:
                    675:                     return ""
                    676: 
                    677:     def getRenderingType(self):
                    678:             try:
                    679:                     return self.renderingType
                    680:             except:
                    681:                     return ""
                    682: 
                    683:     def ECHO_resource_config(self):
                    684:         """Main configuration"""
                    685: 
                    686:         if not hasattr(self,'weight'):
                    687:             self.weight=""
                    688: 
                    689:         pt=zptFile(self, 'zpt/ChangeECHO_resource.zpt')
                    690:         return pt()
                    691:     
                    692: 
                    693:     def ECHO_resource_config_main(self):
                    694:         """Main configuration"""
                    695:         if not hasattr(self,'weight'):
                    696:             self.weight=""
                    697:         pt=zptFile(self, 'zpt/ChangeECHO_resource_main.zpt')
                    698:         return pt()
                    699: 
                    700:     def ECHO_resource_config_coords(self):
                    701:         """Coords configuration """
                    702:         pt=zptFile(self, 'zpt/ChangeECHO_resource_coords.zpt')
                    703:         return pt()
                    704: 
                    705:     def ECHO_resource_config_credits(self):
                    706:         """Main configuration"""
                    707:         pt=zptFile(self, 'zpt/ChangeECHO_resource_credits.zpt')
                    708:         return pt()
                    709: 
                    710:     
                    711:     def changeViewer(self,newViewer):
                    712:         """set newViewer to the url of the new viewer
                    713:         only if metalink is set, otherwise it gives false
                    714:         """
                    715:         
                    716:         texterUrl="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/servlet/Texter?fn=/"
                    717:         
                    718:         vl,msg=self.checkValidityOfMetaLink()
                    719:         
                    720:         if not vl: #ungueltiger link, versuche neuen
                    721:             newStr=re.match(".*/mpiwg/online/(.*)",self.metalink) # suche pfad hinter /mpiwg/online 
                    722:             oldLink=self.metalink
                    723:             
                    724:             if newStr:
                    725:                 self.metalink=texterUrl+newStr.group(1)
                    726:                 vl,msg=self.checkValidityOfMetaLink()
                    727:             else:
                    728:                 logging.error("change Viewer XX(mew Metadatafile) %s"%self.metalink)
                    729:                 vl=False
                    730:                 
                    731:             if not vl: # geht immer noch nicht, dann setzte wieder zurueck
                    732:                 self.metalink=oldLink
                    733:             
                    734:             logging.info("change Viewer (mew Metadatafile) %s"%self.metalink)
                    735:            
                    736:         if vl:
                    737:             self.newViewer=newViewer
                    738:             return vl,msg
                    739:         else:
                    740:             return vl,msg
                    741:     
                    742:     def checkValidityOfMetaLink(self):
                    743:         """checks if the metalink is valid xml"""
                    744:         
                    745:         ml=self.metalink
                    746:         
                    747:         try:
                    748:             txt=urllib.urlopen(ml)
                    749: 
                    750:         except:
                    751:             return False,"Cannot open: %s)"%ml
                    752:         
                    753:         txt.close()        
                    754:         try:
                    755:             dom = NonvalidatingReader.parseUri(ml)
                    756:         except:
                    757:             return False, "Connot parse: %s)"%ml
                    758:         
                    759:         if len(dom.xpath("//texttool"))==0:
                    760:             return False, "No texttools: %s)"%ml
                    761:             
                    762:         return True,""
                    763:         
                    764:     def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,newViewer='',RESPONSE=None):
                    765:         """Aenderung der Properties"""
                    766:         self.resourceID=resourceID
                    767:         self.title=title
                    768:         self.label=label
                    769:         self.description=description
                    770: 
                    771:         self.contentType=contentType
                    772:         self.renderingType=renderingType
                    773:         self.weight=weight
                    774:         
                    775:         self.link=link
                    776:         self.metalink=metalink
                    777:         
                    778:         self.newViewer=newViewer
                    779:         
                    780:         
                    781:         if RESPONSE is not None:
                    782:             RESPONSE.redirect('manage_main')
                    783: 
                    784: 
                    785:     def changeECHO_resource_coords(self,RESPONSE=None):
                    786:         """Aenderung der Properties - coords"""
                    787:         #return self.REQUEST
                    788:         for area in self.getMapAreas():
                    789:             id = area.getId()
                    790:             if self.REQUEST.has_key('del.'+id):
                    791:                 # delete this area
                    792:                 self._delObject(id)
                    793:                 # return to same menu
                    794:                 if RESPONSE is not None:
                    795:                     RESPONSE.redirect('ECHO_resource_config_coords')
                    796:                 return
                    797:             # modify this area
                    798:             coordstring = self.REQUEST.get('coords.'+id, '')
                    799:             coords = string.split(coordstring, ',')
                    800:             angle = self.REQUEST.get('angle.'+id, '0')
                    801:             type = self.REQUEST.get('type.'+id, 'area')
                    802:             if len(coords) == 4:
                    803:                 area.setCoordString(coordstring)
                    804:                 area.setAngle(angle)
                    805:                 area.setType(type)
                    806:         # return to main menu    
                    807:         if RESPONSE is not None:
                    808:             RESPONSE.redirect('manage_main')
                    809: 
                    810: 
                    811:     def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None):
                    812:         """Aenderung der Properties"""
                    813:         self.credits=credits
                    814:         self.responsible=responsible
                    815:         self.copyrightType=copyrightType
                    816:         
                    817:         if RESPONSE is not None:
                    818:             RESPONSE.redirect('manage_main')
                    819: 
                    820: 
1.6.2.1   dwinter   821:  
1.1       dwinter   822:     def changeECHO_resource_metadata(self,RESPONSE=None):
                    823:             """change metadata"""
1.6.2.1   dwinter   824:             
                    825:             self.copyIndex_meta2echo_resource()
                    826:             tags=mappedData.keys()
                    827:             
                    828:           
                    829:             for field in tags:
1.1       dwinter   830:                     try:
1.6.2.1   dwinter   831:                             self.metaDataHash[field]=self.REQUEST.form[field]
                    832:                     
1.1       dwinter   833:                     except:
                    834:                             logger("ECHO_collection (changeECHO_resource_metadata)",logging.ERROR,"%s (%s)"%sys.exc_info()[0:2])
                    835: 
                    836:             logging.debug("changeECHO_resource_metadata:"+repr(self.newMetaXML()))
                    837:             
                    838:             
                    839:             mc = MetaDataClient("http://content.mpiwg-berlin.mpg.de/metaDataServer") 
                    840:             x=mc.writeMetaDataFile(self.getMetaDataLink(),self.newMetaXML(),compressed=None)
                    841:                            
                    842:             logging.debug("changeECHO_resource_metadata (xlrpc return):"+repr(x))
                    843:             
                    844: 
                    845:             if RESPONSE is not None:
                    846:                     RESPONSE.redirect('manage_main')
                    847: 
                    848:     
                    849: 
                    850:     def getMDValueSimpleSearchField(self):
1.6.2.1   dwinter   851:             """returns value for simple search aus DC daten"""
1.1       dwinter   852:             
1.6.2.3   dwinter   853:             try:
                    854:                bibdata=self.getMetaDataManager().getBibData(path=self.getMetaDataLink())
                    855:                dcMapped = self.getMetaDataManager().getDCMappedData(bibdata)
                    856:                logging.debug("getMDValueSimpleSearchField:"+ repr(dcMapped))
                    857:                return " ".join([dcMapped.get('title',''),
                    858:                             dcMapped.get('creator',''),
1.6.2.6 ! dwinter   859:                             dcMapped.get('date',''),self.getTitle(),self.getDescription()])
1.6.2.3   dwinter   860:            
                    861:             except:
1.6.2.6 ! dwinter   862:                logging.error("getMDValueSimpleSearchField doesn't work cannot read metadata:"+self.getId())
        !           863:                return " ".join([self.getDescription(),self.getTitle()])
1.6.2.3   dwinter   864:                
1.1       dwinter   865: 
                    866:     def newMetaXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,digiliburlprefix=None):
                    867:             """new index.meta"""
                    868:             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                    869: 
                    870:             if not hasattr(self,'metaDataHash'):
                    871:                 
                    872:                     self.copyIndex_meta2echo_resource()
1.6.2.1   dwinter   873:             
                    874:             return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)
1.1       dwinter   875: 
                    876:     def showMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
                    877:             """return bibliographical metadata as stored in the object"""
                    878:             
                    879:             try:
                    880:                     
                    881:                     return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,xmlfrag="yes")
                    882:             except:
                    883:                     return "<error> no metadata stored</error>"
                    884:     
                    885:     def getXQueryMetaData(self,xquery):
                    886:                 '''
                    887:                 execute an xquery on the metadata and returns a list of tuples, 
                    888:                 each tuple represent the content of the node as text and the whole node as xml-fragment
                    889:                 @param xquery: xquery auf den metadaten
                    890:                 '''
                    891:                 
                    892:                 try:
                    893:                         md=writeMetadata(self.metalink,self.metaDataHash,xmlfrag="yes")
                    894:                 except:
                    895:                         return None
                    896: 
                    897:                 dom = NonvalidatingReader.parseString(md,"http://www.mpiwg-berlin.mpg.de/")
                    898:                 
                    899:                 results=Ft.Xml.XPath.Evaluate(xquery, contextNode=dom)
                    900:             
                    901:                 ret=[]
                    902:                 for result in results:
                    903:                     
                    904:                     buf = cStringIO.StringIO()
                    905:                     PrettyPrint(result, stream=buf)
                    906:                     str = buf.getvalue()[0:]
                    907:                     buf.close()
                    908:                     ret.append((getTextFromNode(result),str)) 
                    909:                         
                    910:                 return ret
                    911:         
                    912:     def getMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
                    913:             """prints out metadata as stored in the echo environment, format is the index.meta format"""
                    914:             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                    915:             return writeMetadata(self.metalink,self.metaDataHash)
                    916: 
                    917:     def getMetaDataLink(self):
                    918:         """get link to the meta data"""
                    919:         return self.metalink
                    920:     
                    921:     def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None):
                    922:         """Aenderung der Properties"""
                    923:         
                    924:         setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
                    925:         self.link=link
                    926:         self.metalink=metalink
                    927:         
                    928:         if RESPONSE is not None:
                    929:             RESPONSE.redirect('manage_main')
                    930:             
                    931:             
                    932:     manage_options = (
                    933:         {'label':'Main Config','action':'ECHO_resource_config_main'},
1.6.2.1   dwinter   934:         {'label':'Edit Metadata','action':'ECHO_getResourceMD'},
1.1       dwinter   935:         {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
                    936:         {'label':'set/change startpage','action':'setStartPageForm'},
                    937:         {'label':'Change AccessRights','action':'changeAccessRightForm'}, 
                    938:         ) + Folder.manage_options
                    939: 
                    940: 
                    941:             
                    942: 
                    943: 
                    944:     def getMetaDataHash(self):
                    945:             """md hash"""
1.6       dwinter   946:            
                    947:             return getattr(self,'metaDataHash',{})
1.6.2.1   dwinter   948:            
                    949:     def getMetaDataValue(self,fieldName):
                    950:        
                    951:        self.copyIndex_meta2echo_resource()
                    952:        return self.metaDataHash.get(fieldName,{}).get('value','')
                    953:        
1.1       dwinter   954:     def findLabelsFromMapping(self,referenceType):
                    955:         """gib hash mit label -> generic zurueck"""
                    956:         #return {},[]
1.6.2.1   dwinter   957:         mo=self.getMetaDataManager().getBibMapping(referenceType)
1.1       dwinter   958:         
1.6.2.1   dwinter   959:         if mo is None:
                    960:            return [],{}     
                    961:          
                    962:         return mo.getFieldList(),mo.getFields()
1.1       dwinter   963: 
                    964:     def findTagsFromMapping(self,referenceType):
                    965:         """gib hash mit label -> generic zurueck"""
                    966:         
1.6.2.1   dwinter   967:         return self.findLabelsFromMapping(referenceType)
1.1       dwinter   968: 
                    969:     
1.6.2.1   dwinter   970:    
1.1       dwinter   971:     def copyIndex_meta2echo_resource(self,RESPONSE=None):
1.6.2.1   dwinter   972:             #copy MD von Index_meta to the echo_resource
1.1       dwinter   973:             
1.6.2.1   dwinter   974:             logging.debug("copyIndex_meta2echo_resource:"+self.metalink)
                    975:             md = self.getMetaDataManager().getBibData(path=self.metalink)
                    976:             logging.debug("copyIndex_meta2echo_resource:"+repr(md))
                    977:             self.metaDataHash=self.getMetaDataManager().getBibMappedData(md)
                    978:             logging.debug("copyIndex_meta2echo_resource:"+repr(self.metaDataHash))
1.1       dwinter   979:             
1.6.2.1   dwinter   980:             self.contentType=normalizeCt(self.metaDataHash.get('@type',''))
1.1       dwinter   981:             
1.6.2.1   dwinter   982:             return
1.6.2.3   dwinter   983:            
                    984:     def getDRI(self,type="escidoc"):
                    985:        """get DRI"""
                    986:        try:
                    987:            dri = self.getMetaDataManager().getDRI(path=self.metalink,type=type)
                    988:        except:
                    989:            return None
                    990:        
                    991:        return dri
1.1       dwinter   992:         
                    993:     def ECHO_getResourceMD(self,template="yes",back=None,overwrite="no"):
                    994:         """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""
1.6.2.1   dwinter   995:         #(metadict, error)=readMetadata(self.metalink)
                    996:         logging.debug("getMetaData:"+self.metalink)
                    997:         
                    998:         self.copyIndex_meta2echo_resource()
1.1       dwinter   999:         if back:
                   1000:             self.REQUEST.SESSION['back']=back
                   1001: 
                   1002:         if (not self.contentType) or (overwrite=="yes"):
1.6.2.1   dwinter  1003:                 self.contentType=normalizeCt(normalizeCt(self.metaDataHash.get('@type','')).lower())
1.1       dwinter  1004:                 
1.6.2.1   dwinter  1005:         if not (normalizeCt(self.contentType).lower()==normalizeCt(self.contentType).lower()):
                   1006:                 self.REQUEST.SESSION['contentStorage']=normalizeCt(self.contentType)
1.1       dwinter  1007:                 self.REQUEST.SESSION['contentZope']=normalizeCt(self.contentType)
                   1008: 
                   1009:                 return zptFile(self, 'zpt/ECHO_getResourceMDErrorContentType.zpt')()
                   1010: 
                   1011:         #self.REQUEST.SESSION['metadict']=metadict
                   1012:         
                   1013:         
                   1014:         if template=="yes":
                   1015:                 #pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_resourceMD.zpt'),metadict=metadict).__of__(self)
                   1016:                 pt=zptFile(self, 'zpt/ECHO_resourceMD.zpt')
                   1017:                 
1.6.2.1   dwinter  1018:                 return pt(metadict=self.metaDataHash)
1.1       dwinter  1019: 
                   1020:         
                   1021: 
                   1022:     
                   1023:     
1.6.2.1   dwinter  1024: #    def ECHO_getMD(self,item):
                   1025: #        """Ausgabe der MD"""
                   1026: #        return getattr(self,item)
1.1       dwinter  1027: 
1.6.2.5   dwinter  1028:     def checkPDF(self,path):
1.1       dwinter  1029:             """check if pdf in the path"""
                   1030:             try:
                   1031:                     for fileName in os.listdir(path):
                   1032:                             if os.path.splitext(fileName)[1]==".pdf":
                   1033:                                     return os.path.join(path,fileName)
                   1034:                     return None
                   1035:             except:
                   1036:                     return None
                   1037:             
                   1038:             
                   1039:     security.declareProtected('View','index_html')
                   1040:     def index_html(self):
                   1041:         """standard page"""
1.6.2.5   dwinter  1042:         pdf=self.checkPDF(self.link)
1.1       dwinter  1043:         if pdf:
                   1044:                 fh=file(pdf,'r').read()
                   1045:                 self.REQUEST.RESPONSE.setHeader('Content-Type','application/pdf')
                   1046:                 self.REQUEST.RESPONSE.write(fh)
                   1047:                 self.REQUEST.RESPONSE.close()
                   1048:                 return 
                   1049:             
                   1050:         if getattr(self,'newViewer',''): #benutze den neuen viewer
                   1051:             url=self.newViewer+'url='+self.metalink+"&mode=texttool"
                   1052:             return self.REQUEST.RESPONSE.redirect(url)
                   1053:             
                   1054:         return self.REQUEST.RESPONSE.redirect(self.link)
                   1055: 
                   1056:     def startpage_html(self):
                   1057:             """prints out a startpage for a resource for use e.g. in the BVE"""
                   1058: 
                   1059:             # suche ob startpage.html in dem Ordner vorhanden ist, dann wir diese angezeigt
                   1060: 
                   1061:             sp=self.ZopeFind(self,obj_ids=['startpage.html'])
                   1062: 
                   1063:             if sp:
                   1064:                     return sp[1]()
                   1065: 
                   1066:             #pruefen ob irgendwo ein template
                   1067:             if hasattr(self,'startpage_index_template'): 
                   1068:                     return self.startpage_index_template()
                   1069: 
                   1070:             #generisches template ausgeben
                   1071:             
                   1072:             pt=zptFile(self, 'zpt/ECHO_startpage_index_template_standard.zpt')
                   1073:             pt.content_type="text/html"
                   1074:             return pt()
                   1075: 
                   1076:     def toc_html(self):
                   1077:             
                   1078:             sp=self.ZopeFind(self,obj_ids=['toc.html'])
                   1079:                     
                   1080:             if sp:
                   1081:                     return sp[0][1]()
                   1082: 
                   1083: 
1.6.2.5   dwinter  1084:     security.declarePublic('generate_label') 
1.1       dwinter  1085: 
                   1086:     def generate_label(self):
                   1087:         """Erzeugt_standard_Label aus Template"""
1.6.2.1   dwinter  1088:         self.label=self.getMetaDataManager().getBibFormattedLabel(path=self.metalink)
                   1089:         return self.label
                   1090:         
1.1       dwinter  1091: 
1.6.2.5   dwinter  1092:     security.declarePublic('generate_title') 
1.1       dwinter  1093:     def generate_title(self,RESPONSE=None):
                   1094:         """Erzeugt_standard_Label aus Template"""
1.6.2.1   dwinter  1095:         self.title=self.generate_label();
                   1096:         return self.title
1.1       dwinter  1097: 
                   1098: Globals.InitializeClass(ECHO_resource)
                   1099: 
                   1100: def manage_addECHO_resourceForm(self):
                   1101:         """Form for adding a ressource"""
                   1102:         pt=zptFile(self, 'zpt/AddECHO_resourceForm.zpt')
                   1103:         return pt()
                   1104: 
                   1105: 
                   1106: 
                   1107: def manage_addECHO_resource(self,id,title,label,description="",responsible="",link="",metalink="",weight="",copyrightType=None,resourceID=None,contentType=None,renderingType=None,credits=None,coords=None,RESPONSE=None):
                   1108:     """addresource"""
                   1109: 
                   1110:     newObj=ECHO_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords)
                   1111: 
                   1112:     self._setObject(id,newObj)
                   1113: 
                   1114:     if RESPONSE is not None:
                   1115:         RESPONSE.redirect('manage_main')
                   1116:  

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