Annotation of ECHO_content/ECHO_resource.py, revision 1.9

1.1       dwinter     1: import urlparse
                      2: import string
                      3: import tempfile
                      4: import zipfile
                      5: import re
                      6: import os,shutil
                      7: import OFS.Image
                      8: from types import *
                      9: from OFS.Cache import Cacheable
                     10: from OFS.Image import Image
                     11: from Globals import DTMLFile
                     12: from OFS.Folder import Folder
                     13: from OFS.SimpleItem import SimpleItem
                     14: from AccessControl import ClassSecurityInfo
                     15: from AccessControl.User import UserFolder
                     16: from Globals import InitializeClass
                     17: from Globals import DTMLFile
                     18: import Globals
                     19: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
                     20: from Products.PageTemplates.PageTemplate import PageTemplate
                     21: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate,manage_addPageTemplate
                     22: from Globals import Persistent, package_home
                     23: from Acquisition import Implicit
                     24: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
                     25: from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon
1.2       dwinter    26: try:
                     27:    from Products.MetaDataProvider.MetaDataClient import MetaDataClient
                     28: except:
                     29:    print "no metadata services"
1.1       dwinter    30: import urllib
                     31: import urllib2
                     32: import cgi
                     33: import smtplib
                     34: import time
                     35: from Ft.Xml.Domlette import NonvalidatingReader
                     36: from Ft.Xml.Domlette import PrettyPrint, Print
                     37: from Ft.Xml import EMPTY_NAMESPACE
                     38: 
                     39: import Ft.Xml.XPath
                     40: import cStringIO
                     41: 
                     42: import sys
                     43: 
                     44: try:
                     45:         from psycopg import libpq
                     46: except:
                     47:         try:
                     48:                 from pyPgSQL import libpq
                     49:         except:
                     50:                 print "ECHO_collection: Warning - No libpq imported!"
                     51:                 
                     52: import xml.dom.minidom
                     53: 
                     54: import urllib
                     55: import xml.dom.minidom
                     56: import ECHO_helpers
                     57: from ECHO_helpers import *
                     58: 
                     59: 
                     60: from ECHO_movie import *
                     61: import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen
                     62: import xmlrpclib
                     63: 
                     64: import logging
                     65: 
                     66: class ECHO_resource(CatalogAware,Folder,Persistent,ECHO_basis):
                     67:     """ECHO Ressource"""
                     68:     security=ClassSecurityInfo()
                     69:     meta_type='ECHO_resource'
                     70:     default_catalog='resourceCatalog'
                     71:     
                     72: #    viewClassificationList=viewClassificationListMaster
                     73: 
1.8       dwinter    74:     
1.1       dwinter    75:     def PrincipiaSearchSource(self):
                     76:            """Return cataloguable key for ourselves."""
                     77:            return str(self)
                     78: 
                     79:     getSubCols = ECHO_helpers.getSubCols
                     80: 
                     81:     def index_meta(self,RESPONSE=None):
                     82:         """ gibt das im metalink gespeicher xml-file zurueck"""
                     83:         url = self.metalink
                     84:         txt=""
                     85:         logging.debug("ml:%s"%url)
                     86:         try:
                     87:             page = urllib.urlopen(url);
                     88:             if RESPONSE:
                     89:                 RESPONSE.setHeader("Content-Type","text/xml")
                     90:             
                     91:             txt = page.read();
                     92:         except:
                     93:             logging.error("Cannot read metadata of: %s"%self.getId())
                     94:         
                     95:         return txt
                     96:         
                     97:     def reindex(self):
                     98:         """generate fields for indexing and reindex"""
                     99:         
                    100:         #TODO: korrigieren des metalink pfades konfigurierbar machen
                    101:         splitted= [x for x in urlparse.urlparse(self.metalink)]
                    102:         splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]
                    103:         
                    104:         if splitted[0]=="http":
                    105:             self.metalink=urlparse.urlunparse(splitted)
                    106:         
                    107: 
                    108:         self.fullTextUrl=self.getFullTextXML(noredirect="yes")
                    109:         
                    110:         #TODO: korrigieren relative url to absoluter url volltexten, konfigurierbar?
                    111:         splitted= [x for x in urlparse.urlparse(self.fullTextUrl)]
                    112:         if splitted[0]=="":
                    113:             splitted[0]="http"
                    114:             splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]
                    115:             
                    116:             self.fullTextUrl=urlparse.urlunparse(splitted)
                    117:             
                    118:         self.imagePath=self.getImagePath()
                    119:         
                    120:         self.reindex_object()
                    121:   
                    122:   
                    123:     security.declareProtected('View','createPDF')
                    124:     def createPDF(self,RESPONSE=None,local=None,dpi=150):
                    125:             """erzeuge pdf file"""
                    126:             pages=1
                    127:             dpi=float(dpi)
                    128:             imagePath=self.getImagePath().replace("/mpiwg/online","")
                    129:             
                    130:             
                    131:             image="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler?fn="+imagePath+"&dw=%i&dh=%i&pn=%i"
                    132:             xmlInfo="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/dlInfo-xml.jsp?fn="+imagePath
                    133: 
                    134:             dom=xml.dom.minidom.parse(urllib.urlopen(xmlInfo))
                    135:             for parameter in dom.getElementsByTagName('parameter'):
                    136:                     if parameter.getAttribute('name')=="pt":
                    137:                             pages=int(parameter.getAttribute('value'))
                    138:                             break
                    139:             
                    140: 
                    141:             tempdir="/tmp/archivesImageServer"
                    142:             if not os.path.exists(tempdir):
                    143:                     os.mkdir(tempdir) 
                    144:   
                    145:             tmpPath=tempfile.mkdtemp(dir=tempdir)
                    146:             
                    147: 
                    148:             tmpZip=tempfile.mktemp(dir=tempdir)
                    149: 
                    150:             tmpFn=os.path.split(tmpZip)[1]
                    151: 
                    152: 
                    153:     
                    154: 
                    155:             if RESPONSE:
                    156:                     RESPONSE.setHeader("Content-Type","text/html")
                    157:                     RESPONSE.write("<h1>I am creating  the pdf</h1>")
                    158:                     txt="<h3>1. step: getting the images( %i pages)</h3>"%pages
                    159:                     RESPONSE.write(txt)
                    160: 
                    161:             c=canvas.Canvas(tmpZip)
                    162:             for i in range(1,pages+1):
                    163:                     if RESPONSE:
                    164:                             RESPONSE.write(str("<p>Get Page: %i<br>\n"%i))
                    165:                     faktor=dpi/72.0
                    166:                     
                    167:                     fn=tmpPath+"/%i"%i
                    168: 
                    169:                     width,height=A4
                    170:                     #print image%(width*faktor,height*faktor,i)
                    171:                     url=urllib.urlopen(image%(width*faktor,height*faktor,i)).read()
                    172:                     fh=file(fn,"w")
                    173:                     fh.write(url)
                    174:                     fh.close()
                    175: 
                    176:     
                    177: 
                    178:                     c.drawImage(fn,0,0,width=width,height=height)
                    179:                     c.showPage()
                    180:             c.save()
                    181:             if RESPONSE:
                    182:                     RESPONSE.write("<p>finished<br>\n")
                    183: 
                    184:             if RESPONSE:
                    185:                     len=os.stat(tmpZip)[6]
                    186:                     downloadUrl=self.absolute_url()+"/downloadPDF"
                    187:                     RESPONSE.write("""<h1><a href="downloadPDF?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len))
                    188:                     RESPONSE.write("""<p>The file will be stored for a while, you can download it later, the URL is:</p>
                    189:                     <p><a href="downloadPDF?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn))
                    190:                     RESPONSE.close()
                    191: 
                    192: 
                    193:     def downloadPDF(self,fn):
                    194:             """download prepared set"""
                    195:             filename="/tmp/archivesImageServer/"+fn
                    196:             namePDF=self.getId()+".pdf"
                    197:             self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%namePDF)
                    198:             self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
                    199:             len=os.stat(filename)[6]
                    200:             self.REQUEST.RESPONSE.setHeader("Content-Length",len)
                    201:             images=file(filename).read()
                    202:             self.REQUEST.RESPONSE.write(images)
                    203:             self.REQUEST.RESPONSE.close()
                    204: 
                    205: 
                    206:     def getRDF(self,urn=None):
                    207:             """rdf"""
1.3       dwinter   208:             ap = self.getArchivePathFromMetadata()
                    209:          
                    210:        
                    211:             ret=getRDFDescription(self,self.link,urn=urn,ap=ap)
1.4       dwinter   212:            
1.1       dwinter   213:             return ret+self.createSubElementRDF(urn=urn) 
                    214: 
                    215:   
                    216:     def changeAccessRightForm(self,preselect=None):
                    217:         """change the access rights"""
                    218:         
                    219:         pt=zptFile(self, 'zpt/ChangeECHO_resourceAccessRight.zpt')
                    220:         return pt(preselect=preselect)
                    221:     
                    222:     def changeAccessRight(self):
                    223:         """changeRights"""
                    224:         argv=self.REQUEST.form
                    225:         self.setAccessRightXML(argv["%s_xml"%self.getId()])
                    226:         self.accessRight=argv["%s_echo"%self.getId()]
                    227:          
                    228:         self.REQUEST.RESPONSE.redirect('manage_main')
                    229:         
                    230:     
                    231:     def getAccessRightSelectorHTML(self,outlook="select",xmldominant=None,preselect=None):
                    232:             """htmlselector, xmldominant= in der regel wird der wert des xmlfiles ausgegeben ausser er existiert nicht"""
                    233:             values=['','free','MPIWG']
                    234:             
                    235:             if preselect:#set all to the preselected
                    236:                 ar=(preselect,preselect)
                    237:             else:#else set to actual value
                    238:                 ar=self.getAccessRightMD()
                    239:                 
                    240:             if outlook=="select":
                    241:                     ret="""<select name="%s_xml">"""%self.getId()
                    242:                     ret1="""<select name="%s_echo">"""%self.getId()
                    243:                     for value in values:
                    244:                             if value==ar[0]:
                    245:                                     ret+="<option selected>%s</option>"%value
                    246:                             else:
                    247:                                     ret+="<option>%s</option>"%value
                    248:                             
                    249:                             if value==ar[1]:
                    250:                                     ret1+="<option selected>%s</option>"%value
                    251:                             else:
                    252:                                     ret1+="<option>%s</option>"%value
                    253:                     
                    254:                     
                    255:                     if not xmldominant:
                    256:                         return ret+"</select>",ret1+"</select>"
                    257:                     else:
                    258:                         if ar[0] is not None:
                    259:                             return ret+"</select>"
                    260:                         else:
                    261:                             return "<p>No xml file (only local selection):"+ret1
                    262: 
                    263:             else:
                    264:                     ret=""
                    265:                     ret1=""
                    266:                     for value in values:
                    267:                             
                    268:                             if value==ar[0]:
                    269:                                     ret+="""<input type="radio" name="%s_xml" value="%s" checked>%s"""%(self.getId(),value,value)
                    270:                             else:
                    271:                                     ret+="""<input type="radio" name="%s_xml" value="%s">%s"""%(self.getId(),value,value)
                    272:                                     
                    273:                             if value==ar[1]:
                    274:                                     ret1+="""<input type="radio" name="%s_echo" value="%s" checked>%s"""%(self.getId(),value,value)
                    275:                             else:
                    276:                                     ret1+="""<input type="radio" name="%s_echo" value="%s">%s"""%(self.getId(),value,value)
                    277: 
                    278:                     if not xmldominant:                        
                    279:                         return ret,ret1
                    280:                     else:                         
                    281:                         if ar[0]:
                    282:                             return ret
                    283:                         else:
                    284:                             return "<p>No xml file (only local selection)</p>"+ret1
                    285: 
                    286: 
                    287: 
                    288:     def copyAccessRightsFromMD(self):
                    289:             """kopiere rechte aus den metadaten"""
                    290:             self.accessRight=self.getAccessRightMD()[0]
                    291:             
                    292:             
                    293:             
                    294:             
1.8       dwinter   295:     def getMetaLink(self):
                    296:        return self.metalink
                    297: 
                    298:     def setMetaLink(self,ml):
                    299:        self.metalink=ml
                    300:        return
                    301: 
1.1       dwinter   302:     def getAccessRightMD(self):
                    303:                 """set accessright"""
                    304:                 url=self.metalink
                    305: 
                    306:                 try:
                    307:                     urllib.urlopen(url)
                    308:                 except:
                    309:                     logger("ECHO_Resource (getAccessRightMD)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
                    310: 
                    311:                     return None,getattr(self,'accessRight','')
                    312:                 
                    313:             
                    314:                 try:
                    315:                         dom = NonvalidatingReader.parseUri(url)
                    316:                 except:
                    317:                         logger("ECHO_Resource (getAccessRightMD)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
                    318:                         return (None,"Cannot parse: "+url+"<br>"+"%s (%s)"%sys.exc_info()[0:2])
                    319: 
                    320: 
                    321:                 accessright=dom.xpath("//meta/access-conditions/access/@type")
                    322:                 if accessright:
                    323:                     accessright=accessright[0].value
                    324:                 if str(accessright)=='institution':
                    325:                     tmp=dom.xpath("//meta/access-conditions/access/name")
                    326:                     if tmp:
                    327:                         accessright=getTextFromNode(tmp[0])
                    328:                     
                    329:                 if not accessright:
                    330:                     accessright=""
                    331:                 
                    332:                 return accessright,getattr(self,'accessRight','')             
                    333: 
                    334:     def changeAccessRightMD(self,accessright,RESPONSE=None):
                    335:             """change the rights - not user anymore"""
                    336:             #TODO: check if method still needed
                    337:             params="accessright=%s"%accessright
                    338: 
                    339: 
                    340:             #print ECHO_helpers.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read()
                    341: 
                    342:             tries=0
                    343:             for i in range(10):
                    344:                     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()
                    345:                     if x=="ok":
                    346:                            
                    347:                             break;
                    348:                  
                    349:             
                    350:           
                    351:             if RESPONSE is not None:
                    352:                         RESPONSE.redirect('manage_main')
                    353: 
                    354:                 
                    355:     def setAccessRightXML(self,accessright):
                    356:                 """set accessright"""
                    357:                 url=self.metalink
                    358:                 accessrights=['MPIWG','free']#allowes rights
                    359:                 
                    360:                 if accessright =='':
                    361:                     """do nothing"""
                    362:                     return ""
                    363:                     
                    364:                     
                    365:                 try:
                    366:                         geturl=""
                    367:                         for line in ECHO_helpers.urlopen(url).readlines():
                    368:                                 geturl=geturl+line 
                    369: 
                    370: 
                    371:                 except:
                    372:                         return (None,"Cannot open: "+url)
                    373: 
                    374:                 try:
                    375:                         dom=xml.dom.minidom.parseString(geturl)
                    376:                         root=dom.getElementsByTagName('resource')[0]
                    377:                 except:
                    378:                         return (None,"Cannot parse: "+url+"<br>"+geturl)
                    379: 
                    380:                 metamains=dom.getElementsByTagName('meta')
                    381:                 
                    382:                 if not metamains:
                    383:                         nodenew=dom.createElement('meta')
                    384:                         root.appendChild(nodenew)
                    385:                         metamain=nodenew
                    386:                 else:
                    387:                         metamain=metamains[0]
                    388:                 
                    389:                 
                    390:                 metanodes=metamain.getElementsByTagName('access-conditions')
                    391: 
                    392:                 if not metanodes:
                    393:                         nodenew=dom.createElement('access-conditions')
                    394:                         metamain.appendChild(nodenew)
                    395:                         metanode=nodenew
                    396:                 else:
                    397:                         metanode=metanodes[0]
                    398: 
                    399:                 accesses=metanode.getElementsByTagName('access')
                    400: 
                    401:                 #delete old
                    402:                 if accesses:
                    403:                      metanode.removeChild(accesses[0]).unlink()
                    404: 
                    405:                 #create new
                    406:                     
                    407:                 nodenew2=dom.createElement('access')
                    408:                 metanode.appendChild(nodenew2)
                    409:                 metanode2=nodenew2
                    410:                 
                    411:                 attribute=metanode2.getAttribute('type')
                    412:                 
                    413:                 if accessright=="free":
                    414:                     
                    415:                      metanode2.setAttribute('type','free')
                    416:                 
                    417:                 elif accessright.upper()=='MPIWG':
                    418:                         metanode2.setAttribute('type','institution')
                    419:                         nodenew4=dom.createElement('name')
                    420:                         metanodetext=dom.createTextNode('MPIWG')
                    421:                         nodenew4.appendChild(metanodetext)
                    422:                         nodenew2.appendChild(nodenew4)
                    423:                 #print dom.toxml().encode('utf-8')
                    424:                 string= encodeRPC(dom.toxml().encode('utf-8'))
                    425:                 
                    426:                 #TODO: make server configurable
                    427:                 server=xmlrpclib.Server("http://foxridge.mpiwg-berlin.mpg.de/server")
                    428: 
                    429:                 path=urlparse.urlparse(self.metalink)[2]
                    430:          
                    431:                 server.writeMetaDataFile(path,string,"yes")
                    432:         
                    433:     def setStartPageForm(self):
                    434:             """Form for changing the startpage"""
                    435: 
                    436:             
                    437:             pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPage.zpt')
                    438:             pt.content_type="text/html"
                    439:             return pt()
                    440:     
                    441: 
                    442:     def createImageUrl(self,pn=1):
                    443:             """create ImageUrl"""
                    444: 
                    445:             
1.5       dwinter   446:             resourcepath=readFieldFromXML_xpath(self.metalink,'//resource/archive-path')
1.1       dwinter   447:             
                    448:             digiliburlprefix=readFieldFromXML(self.metalink,'texttool','digiliburlprefix')
                    449:             images=readFieldFromXML(self.metalink,'texttool','image')
                    450: 
                    451: 
                    452:             if (not resourcepath) or (not digiliburlprefix) or (not images):
                    453:                     logger("ECHO (createImageUrl)",logging.ERROR,"Cannot create ImageUrl for %s"%self.absolute_url())
                    454:                     return None
                    455:             resourcepath=resourcepath.replace('/mpiwg/online','')
                    456:             if not digiliburlprefix: digiliburlprefix="http://echo.mpiwg-berlin.mpg.de/zogilib?"
                    457: 
                    458:             if (not images) or (not resourcepath): return None
                    459: 
                    460:             return "%sfn=%s&pn=%i"%(digiliburlprefix,resourcepath+"/"+images,pn)
                    461:     
                    462:     def copyTitleToInfoXML(self,RESPONSE=None):
                    463:             """copy title from the resource"""
                    464:             presentationXML=readFieldFromXML(self.metalink,'texttool','presentation')
1.5       dwinter   465:             resourcepath=readFieldFromXML_xpath(self.metalink,'//resource/archive-path')
1.1       dwinter   466:             if (not presentationXML) or (not resourcepath): 
                    467:                 if RESPONSE:
                    468:                         RESPONSE.write("Error: %s\n"%self.getId())
                    469:                 else:
                    470:                         return None,self.absolute_url()
                    471: 
                    472:             try:
                    473:                     fh=file(os.path.join(resourcepath,presentationXML),'w')
                    474:                     fh.write("""<info>
                    475:                     <author></author>
                    476:                     <title>%s</title>
                    477:                     <date></date>
                    478:                     <display>yes</display>
                    479:                     </info>"""%self.title)
                    480:                     fh.close()
                    481:                     return 1,self.getId()
                    482:             except:
                    483:                     if RESPONSE:
                    484:                             RESPONSE.write("Error: %s\n"%self.getId())
                    485:                     else:
                    486:                             return None,self.absolute_url()
                    487: 
                    488:             
                    489:     def setStartPage(self,startpage=None,RESPONSE=None):
                    490:             """set start page, if no startpage defined use the generic one of the resource"""
                    491: 
                    492:             if (not (type(startpage)==StringType)):
                    493:                     if ("__generic" in startpage): # checke ob generic in der liste
                    494:                             startpage=self.absolute_url()+"/startpage_html"
                    495:                     elif ("__firstPage" in startpage): # checke ob generic in der liste
                    496:                             startpage=self.createImageUrl()
                    497:                             
                    498:             if (not startpage):
                    499:                     startpage=self.absolute_url()+"/startpage_html"
                    500:             elif (startpage=="__generic"):
                    501:                     startpage=self.absolute_url()+"/startpage_html"
                    502:             elif (startpage=="__firstPage"):
                    503:                         startpage=self.createImageUrl()
                    504:     
                    505:             params="startpage=%s"%startpage
                    506:             #print 'http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))
                    507:                
                    508:             tries=0
                    509:             for i in range(10):
                    510:                     x=ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))).read()
                    511:                     if x=="ok":
                    512:                            
                    513:                             break;
                    514:                  
                    515:             
                    516:             path=self.metalink
                    517:             
                    518:             path=re.sub(self.REQUEST['SERVER_URL'],'',path)
                    519:             path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path)
                    520:             
                    521:             path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
                    522:             path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server
                    523:             path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server
                    524:             path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server
                    525:             path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server
                    526:             path=re.sub('http://vision.mpiwg-berlin.mpg.de','',path) # falls vision als server
                    527:             path=re.sub('http://xserve02.mpiwg-berlin.mpg.de:18880','',path) # falls vision als server
                    528:             path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo
                    529:             path=re.sub('/index.meta','',path) 
                    530: 
                    531: 
                    532:             ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
                    533: 
                    534:             if RESPONSE is not None:
                    535:                         RESPONSE.redirect('manage_main')
                    536: 
                    537:     def changeViewerTemplateSetForm(self):
                    538:             """change the viewer template set"""
                    539:             pt=zptFile(self, 'zpt/changeResourceViewerTemplateSet')
                    540:             return pt()
                    541: 
                    542: 
                    543:     def setLink(self, link=None):
                    544:         """change link field"""
                    545:         if link is not None:
                    546:             self.link = link
                    547:             
                    548:    
                    549:     def getTextToolsField(self,name,default=''):
                    550:         """Lese Textoolsfelder aus index.meta im path aus"""
                    551:         
                    552:         try:
                    553:             dom=xml.dom.minidom.parse(self.metalink)
                    554:             node=dom.getElementsByTagName('texttool')[0] #getNode
                    555:             subnode=node.getElementsByTagName(name)[0]
                    556: 
                    557:             # bei text wird nur der Folder gebraucht
                    558:             if name=="text":
                    559:                 splitted=getText(subnode.childNodes).split("/")
                    560:                 return splitted[len(splitted)-2]
                    561:             else:
                    562:                 return getText(subnode.childNodes)
                    563:         except:
                    564:             return default
                    565:    
                    566: 
                    567:     def changeViewerTemplateSet(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None):
                    568:             """changeit"""
                    569: 
                    570:             paramList=['project','startpage','xslt','thumbtemplate','topbar','digiLibTemplate','digiliburlprefix']
                    571: 
                    572:             
                    573:             #writeMetadata(self.metalink,self.metaDataHash,project,None,xslt,thumbtemplate,topbar,digiLibTemplate)
                    574: 
                    575:             params="project=%s&xslt=%s&thumbtemplate=%s&topbar=%s&digiLibTemplate=%s&digiliburlprefix=%s"%(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix)
                    576: 
                    577:             try:
                    578:                 tries=0
                    579:                 for i in range(10):
                    580:                         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()+'/newMetaXML'+urllib.quote('?'+params))).read()
                    581:                         if x=="ok":
                    582:                            
                    583:                             break;
                    584:                  
                    585:             except:
                    586:                 logger("ECHO_ressource (changeViewerTemplateSet)", logging.ERROR,"%s (%s)"%sys.exc_info()[0:2])          
                    587:                 logger("ECHO_ressource (changeViewerTemplateSet)", logging.ERROR,'http://echo.mpiwg-berlin.mpg.de/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params)))
                    588:             #print self.absolute_url()+'/newMetaXML'+urllib.quote'?'+params)
                    589:             # hack Pfad auf die Dokumente
                    590:             path=self.metalink
                    591:             
                    592:             
                    593: 
                    594:             path=re.sub('/index.meta','',path) 
                    595: 
                    596:             #TODO: direct access to the file system necessary, fix that also xmlrpc to the server where the index file is stored is possible    
                    597:             parsedUrl=urlparse.urlparse(path)
                    598:             path=parsedUrl[2]
                    599: 
                    600:             try:        
                    601:                 return ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
                    602:             except:
                    603:                 logger("ECHO_Resource (changeViewerTemplateSet)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
                    604:                 logger("ECHO_Resource (changeViewerTemplateSet)", logging.INFO,"http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path)
                    605: 
                    606:             if RESPONSE is not None:
                    607:                         RESPONSE.redirect('manage_main')
                    608: 
                    609:     
                    610: 
                    611:     security.declarePublic('content_html')      
                    612:     def content_html(self):
                    613:         """template fuer content"""
                    614:         return ECHO_basis.content_html(self,'resource')
                    615:     
                    616: #    def getViewClassification(self):
                    617: #        if hasattr(self,'viewClassification'):
                    618: #            return self.viewClassification
                    619: #        else:
                    620: #            return ""
                    621: 
                    622:     def getFullTextXML(self,noredirect=None):
                    623:             """getFullTextXML; gives the FullText as an XML Document, and <error></error> if somthing goes wrong."""
                    624: 
                    625:             try:
                    626:                     #logger("ECHO Fulltext",logging.INFO,"open %s"%self.metalink)
                    627:                     fh=ECHO_helpers.urlopen(self.metalink)
                    628:                     #logger("ECHO Fulltext",logging.INFO,"opened %s"%self.metalink)
                    629:                     dom=xml.dom.minidom.parse(fh)
                    630:                     texttools=dom.getElementsByTagName('texttool')
1.7       dwinter   631:                     
1.9     ! dwinter   632: 
1.7       dwinter   633:                     text=texttools[0].getElementsByTagName('text-url-path') #pfad auf text im neuen system
                    634:                     logging.debug(text);
                    635:                     if (text is not None) and len(text)>0:
                    636:                        texturl=getText(text[0].childNodes)
                    637:                        textBasisUrl=None
                    638:                        if hasattr(self,"getFullTextBasisUrl"):
                    639:                            textBasisUrl=self.getFullTextBasisUrl()
                    640:                        else: #default
                    641:                            textBasisUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/getDoc?doc=%s"
                    642:                        #Beispiel http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/getDoc?doc=/archimedes/la/achil_propo_087_la_1545.xml
                    643:                        logging.debug(textBasisUrl);
                    644:                        texturl=textBasisUrl%texturl
                    645:                     else:
                    646:                      text=texttools[0].getElementsByTagName('text')
                    647:                      texturl=getText(text[0].childNodes)
1.1       dwinter   648: 
1.9     ! dwinter   649:                      #TODO: hack has to be romoved, if index.meta for annalen are changed!! (DW)
        !           650:             if (texturl is not None) and (texturl.startswith("/mpiwg/online/permanent/einstein/annalen")):
        !           651:                  texturl=texturl.replace("/mpiwg/online/permanent/einstein/annalen/","/diverse/de/") 
        !           652:                               splitted=texturl.split("/fulltext")
        !           653:                               texturl=splitted[0]+".xml"
        !           654:                      if hasattr(self,"getFullTextBasisUrl"):
        !           655:                                 textBasisUrl=self.getFullTextBasisUrl()
        !           656:                      else: #default                                                                                                                            
        !           657:                                 textBasisUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/getDoc?doc=%s"
        !           658:                                 #Beispiel http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/getDoc?doc=/archimedes/la/achil_propo_087_la_1545.xml                                 
        !           659:                               logging.debug(textBasisUrl);
        !           660:                               texturl=textBasisUrl%texturl
        !           661:                      
        !           662:   
        !           663: 
        !           664: 
1.1       dwinter   665:                     #logger("ECHO Fulltext",logging.INFO,"found %s"%texturl)
                    666:                     fh.close()
                    667:                     #logger("ECHO Fulltext",logging.INFO,"closed fh")
                    668:                     #keine url
                    669:                     if not (texturl.split(":")[0] in ['http','ftp','file']): 
                    670:                         if not noredirect:
                    671:                             return file(texturl).read()
                    672:                         else:
                    673:                             return texturl
                    674: 
                    675:                     if not noredirect:
                    676:                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')  
                    677:                             logger("ECHO Fulltext",logging.INFO,"redirect to:%s"%texturl)
                    678:                             self.REQUEST.RESPONSE.redirect(texturl)
                    679:                     else:
                    680:                             return texturl
                    681:             except:
1.9     ! dwinter   682:            logging.debug(sys.exc_info()[0])
        !           683:            logging.debug(sys.exc_info()[1])
        !           684:            logging.debug(sys.exc_info()[2])
1.1       dwinter   685:                     if not noredirect:
                    686:                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                    687:                             self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
                    688:                     else:
                    689:                             return "<error>no fulltext available</error>"
                    690: 
                    691:     def getImagePath(self):
                    692:             """gibt pfad zum image aus"""
                    693:             return self.getImageView(noredirect="yes",onlyPath="yes")
                    694:     
1.3       dwinter   695:     def getArchivePathFromMetadata(self):
                    696:        try:
1.5       dwinter   697:            archivePath=readFieldFromXML_xpath(self.metalink,"//resource/archive-path")
                    698:            return archivePath
1.3       dwinter   699:        except:
                    700:            return ""
                    701:    
1.1       dwinter   702:     def getImageView(self,noredirect=None,onlyPath=None):
                    703:             """getImages; give Imageviewr  and <error></error> if somthing goes wrong."""
                    704:             try:
1.5       dwinter   705:                    archivePath=readFieldFromXML_xpath(self.metalink,"//resource/archive-path")
                    706:                   
1.1       dwinter   707:                     archivepath=re.sub('/mpiwg/online/','',archivepath) 
                    708:                     imageurl="http://echo.mpiwg-berlin.mpg.de/zogilib?fn="+archivepath+"/"+imagetemp
                    709:                     fh.close()
                    710: 
                    711:                     if not noredirect:
                    712:                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')  
                    713:                             self.REQUEST.RESPONSE.redirect(imageurl)
                    714:                     else:
                    715:                             if not onlyPath:
                    716:                                     return imageurl
                    717:                             else:
                    718:                                     return archivepath+"/"+imagetemp
                    719:             except:
                    720: 
                    721:                     if not noredirect:
                    722:                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                    723:                             self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
                    724:                     else:
                    725:                             return "<error>no images available</error>"
                    726: 
                    727:     
                    728:     def getCopyrightsHTML(self):
                    729:             """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus"""
                    730:             
                    731:             if hasattr(self,'copyrightModel'):
                    732:                     obj=self.copyrightModel
                    733:                     
                    734:             else:
                    735:                     return "ERROR"
                    736:             ret=[]
                    737:             
                    738:             for copyright in obj.getCopyrights(): #copyright - media / partner / copyrightID
                    739:                     
                    740:                     
                    741:                     try:
                    742:                         if hasattr(self.copyrightTypes,copyright[2]):
                    743:                              copyrightTypeObj=getattr(self.copyrightTypes,copyright[2])
                    744:                              link="copyrightTypes/"+copyright[2]+'/copyright.html'
                    745:                         else:
                    746:                              copyrightTypeObj=getattr(obj,copyright[2])
                    747:                              link="copyrightModel/"+copyright[2]+'/copyright.html'
                    748:                              
                    749:                         label=copyrightTypeObj.label
                    750:                         url=getattr(copyrightTypeObj, 'url', '')
                    751:                             
                    752:                         if url!='':
                    753:                                  ret.append((url,copyright[0],copyright[1],copyright[2],label))
                    754:                         else:
                    755:                                 if hasattr(copyrightTypeObj, 'copyright.html'):
                    756:                                      ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label))
                    757:                                 else:
                    758:                                      ret.append(('empty',copyright[0],copyright[1],copyright[2],label))
                    759:                     except:
                    760:                             """nothing"""
                    761:                     
                    762:             return ret
                    763:             
                    764:     def getInstitutionsHTML(self):
                    765:                 """gibt Liste der foerdernden Institutionen aus"""
                    766:                 
                    767:                 if hasattr(self,'support'):
                    768:                         obj=self.support
                    769:                         ret=obj.getSupporter()
                    770:                         return ret
                    771:                 else:
                    772:                         return ''
                    773:                         
                    774:     def getOwnerOriginalsHTML(self):
                    775:                """gibt Liste der foerdernden Institutionen aus"""
                    776:                
                    777:                if hasattr(self,'ownerOriginal'):
                    778:                        obj=self.ownerOriginal
                    779:                        ret=obj.getOwner()
                    780:                        return ret
                    781:                else:
                    782:                        return ''
                    783:     
                    784:     def getDigiCopyByHTML(self):
                    785:                """gibt Liste der foerdernden Institutionen aus"""
                    786:                
                    787:                if hasattr(self,'digiCopyBy'):
                    788:                        obj=self.digiCopyBy
                    789:                        ret=obj.getDigiCopyBy()
                    790:                        return ret
                    791:                else:
                    792:                        return ''                    
                    793:     
                    794:     def getCredits(self):
                    795:         """Ausgabe der credits"""
                    796:         if self.credits:
                    797:             return self.credits
                    798:         else:
                    799:             return []
                    800: 
                    801: 
                    802:     def getStorageManagerResourceURL(self):
                    803:         """get the link to storage"""
                    804:         urlbase=self.getStorageManagerURL();
                    805:         
                    806:         #now get the path from the metadatalink
                    807:         
                    808:         path = self.correctPath(self.getMetaDataLink())
                    809:         if path is None:
                    810:             return ""
                    811:         else:
                    812:             path=path.replace("index.meta","")
                    813:             return urlbase+path
                    814:         
                    815:         
                    816:     def correctPath(self,path):
                    817:         #take only the path of the url which starts with /permanent or /experimental
                    818:         
                    819:         rs= re.search("/permanent/(.*)", path);
                    820:         if rs is not None:
                    821:             txt="permanent/"+rs.group(1)
                    822:         else:
                    823:             rs= re.search("/experimental/(.*)", path);
                    824:             if rs is not None:
                    825:                 txt="experimental"+rs.group(1)
                    826:             else:
                    827:                 return None
                    828:         
                    829:         return txt
                    830:         
                    831:     def __init__(self,id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords):
                    832: 
                    833:         self.id = id
                    834:         """Festlegen der ID"""
                    835:         
                    836:         self.label = label
                    837:         self.link= link
                    838:         self.metalink=metalink
                    839:         self.title=title
                    840:         self.weight=weight
                    841:         self.credits=toList(credits)
                    842:         self.description=description
                    843:         self.contentType=contentType
                    844:         self.copyrightType=copyrightType
                    845:         self.renderingType=renderingType
                    846:         self.responsible=responsible
                    847:         self.resourceID=resourceID
                    848:         
                    849:         if coords:
                    850:             coordsnew=[ string.split(x,",") for x in coords]
                    851:         else:
                    852:             coordsnew=[]
                    853:         
                    854:         self.coords=coordsnew
                    855: #       self.viewClassification=""
                    856: 
                    857: 
                    858: 
                    859:     def getContentType(self):
                    860:             try:
                    861:                     return normalizeCt(self.contentType)
                    862:             except:
                    863:                     return ""
                    864: 
                    865:     def getCopyrightType(self):
                    866:             try:
                    867:                     return self.copyrightType
                    868:             except:
                    869:                     return ""
                    870: 
                    871:     def getRenderingType(self):
                    872:             try:
                    873:                     return self.renderingType
                    874:             except:
                    875:                     return ""
                    876: 
                    877:     def ECHO_resource_config(self):
                    878:         """Main configuration"""
                    879: 
                    880:         if not hasattr(self,'weight'):
                    881:             self.weight=""
                    882: 
                    883:         pt=zptFile(self, 'zpt/ChangeECHO_resource.zpt')
                    884:         return pt()
                    885:     
                    886: 
                    887:     def ECHO_resource_config_main(self):
                    888:         """Main configuration"""
                    889:         if not hasattr(self,'weight'):
                    890:             self.weight=""
                    891:         pt=zptFile(self, 'zpt/ChangeECHO_resource_main.zpt')
                    892:         return pt()
                    893: 
                    894:     def ECHO_resource_config_coords(self):
                    895:         """Coords configuration """
                    896:         pt=zptFile(self, 'zpt/ChangeECHO_resource_coords.zpt')
                    897:         return pt()
                    898: 
                    899:     def ECHO_resource_config_credits(self):
                    900:         """Main configuration"""
                    901:         pt=zptFile(self, 'zpt/ChangeECHO_resource_credits.zpt')
                    902:         return pt()
                    903: 
                    904:     def ECHO_resource_config_metadata(self):
                    905:         """Main configuration"""
                    906:         if (hasattr(self,'metadata')) and not (hasattr(self,'metaDataHash')):
                    907:                 self.metaDataHash={}
                    908:                 self.contentType=self.bib_type
                    909:                 for data in self.metadata:
                    910:                         data_neu=re.sub('-','_',data)
                    911:                         self.metaDataHash[data_neu]=getattr(self,data)[0:]
                    912: 
                    913:         
                    914:         pt=zptFile(self, 'zpt/ChangeECHO_resource_metadata.zpt')
                    915:         return pt()
                    916: 
                    917: 
                    918:     
                    919:     def changeViewer(self,newViewer):
                    920:         """set newViewer to the url of the new viewer
                    921:         only if metalink is set, otherwise it gives false
                    922:         """
                    923:         
                    924:         texterUrl="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/servlet/Texter?fn=/"
                    925:         
                    926:         vl,msg=self.checkValidityOfMetaLink()
                    927:         
1.8       dwinter   928: 
                    929: 
                    930: 
1.1       dwinter   931:         if not vl: #ungueltiger link, versuche neuen
                    932:             newStr=re.match(".*/mpiwg/online/(.*)",self.metalink) # suche pfad hinter /mpiwg/online 
                    933:             oldLink=self.metalink
                    934:             
                    935:             if newStr:
                    936:                 self.metalink=texterUrl+newStr.group(1)
                    937:                 vl,msg=self.checkValidityOfMetaLink()
                    938:             else:
                    939:                 logging.error("change Viewer XX(mew Metadatafile) %s"%self.metalink)
                    940:                 vl=False
                    941:                 
                    942:             if not vl: # geht immer noch nicht, dann setzte wieder zurueck
                    943:                 self.metalink=oldLink
                    944:             
                    945:             logging.info("change Viewer (mew Metadatafile) %s"%self.metalink)
                    946:            
                    947:         if vl:
1.8       dwinter   948: 
1.1       dwinter   949:             self.newViewer=newViewer
                    950:             return vl,msg
                    951:         else:
                    952:             return vl,msg
                    953:     
                    954:     def checkValidityOfMetaLink(self):
                    955:         """checks if the metalink is valid xml"""
                    956:         
                    957:         ml=self.metalink
                    958:         
                    959:         try:
                    960:             txt=urllib.urlopen(ml)
                    961: 
                    962:         except:
                    963:             return False,"Cannot open: %s)"%ml
                    964:         
                    965:         txt.close()        
                    966:         try:
                    967:             dom = NonvalidatingReader.parseUri(ml)
                    968:         except:
                    969:             return False, "Connot parse: %s)"%ml
                    970:         
                    971:         if len(dom.xpath("//texttool"))==0:
                    972:             return False, "No texttools: %s)"%ml
                    973:             
                    974:         return True,""
                    975:         
                    976:     def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,newViewer='',RESPONSE=None):
                    977:         """Aenderung der Properties"""
                    978:         self.resourceID=resourceID
                    979:         self.title=title
                    980:         self.label=label
                    981:         self.description=description
                    982: 
                    983:         self.contentType=contentType
                    984:         self.renderingType=renderingType
                    985:         self.weight=weight
                    986:         
                    987:         self.link=link
                    988:         self.metalink=metalink
                    989:         
                    990:         self.newViewer=newViewer
                    991:         
                    992:         
                    993:         if RESPONSE is not None:
                    994:             RESPONSE.redirect('manage_main')
                    995: 
                    996: 
                    997:     def changeECHO_resource_coords(self,RESPONSE=None):
                    998:         """Aenderung der Properties - coords"""
                    999:         #return self.REQUEST
                   1000:         for area in self.getMapAreas():
                   1001:             id = area.getId()
                   1002:             if self.REQUEST.has_key('del.'+id):
                   1003:                 # delete this area
                   1004:                 self._delObject(id)
                   1005:                 # return to same menu
                   1006:                 if RESPONSE is not None:
                   1007:                     RESPONSE.redirect('ECHO_resource_config_coords')
                   1008:                 return
                   1009:             # modify this area
                   1010:             coordstring = self.REQUEST.get('coords.'+id, '')
                   1011:             coords = string.split(coordstring, ',')
                   1012:             angle = self.REQUEST.get('angle.'+id, '0')
                   1013:             type = self.REQUEST.get('type.'+id, 'area')
                   1014:             if len(coords) == 4:
                   1015:                 area.setCoordString(coordstring)
                   1016:                 area.setAngle(angle)
                   1017:                 area.setType(type)
                   1018:         # return to main menu    
                   1019:         if RESPONSE is not None:
                   1020:             RESPONSE.redirect('manage_main')
                   1021: 
                   1022: 
                   1023:     def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None):
                   1024:         """Aenderung der Properties"""
                   1025:         self.credits=credits
                   1026:         self.responsible=responsible
                   1027:         self.copyrightType=copyrightType
                   1028:         
                   1029:         if RESPONSE is not None:
                   1030:             RESPONSE.redirect('manage_main')
                   1031: 
                   1032: 
                   1033:     def changeECHO_resource_metadata_local(self,RESPONSE=None):
                   1034:             """change metadata"""
                   1035:             tags=self.findTagsFromMapping(normalizeCt(self.contentType))
                   1036:             for field in tags[1]:
                   1037:                     self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)][0:]
                   1038:                         
                   1039: 
                   1040:                     
                   1041:             if RESPONSE is not None:
                   1042:                     RESPONSE.redirect('manage_main')
                   1043: 
                   1044:     def changeECHO_resource_metadata(self,RESPONSE=None):
                   1045:             """change metadata"""
                   1046:             tags=self.findTagsFromMapping(normalizeCt(self.contentType))
                   1047:             self.OSAS_meta={}
                   1048:             for field in tags[1]:
                   1049:                     try:
                   1050:                             self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]
                   1051:                             self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)]
                   1052:                     except:
                   1053:                             logger("ECHO_collection (changeECHO_resource_metadata)",logging.ERROR,"%s (%s)"%sys.exc_info()[0:2])
                   1054: 
                   1055:             logging.debug("changeECHO_resource_metadata:"+repr(self.newMetaXML()))
                   1056:             
                   1057:             
                   1058:             mc = MetaDataClient("http://content.mpiwg-berlin.mpg.de/metaDataServer") 
                   1059:             x=mc.writeMetaDataFile(self.getMetaDataLink(),self.newMetaXML(),compressed=None)
                   1060:                            
                   1061:             logging.debug("changeECHO_resource_metadata (xlrpc return):"+repr(x))
                   1062:             
                   1063: 
                   1064:             if RESPONSE is not None:
                   1065:                     RESPONSE.redirect('manage_main')
                   1066: 
                   1067:     
                   1068: 
                   1069:     def getMDValueSimpleSearchField(self):
                   1070:             """returns value for simple search"""
                   1071:             
                   1072:             try:
                   1073:                 return " ".join([self.getMDValue('title',generic="yes"),
                   1074:                              self.getMDValue('author',generic="yes"),
                   1075:                              self.getMDValue('year',generic="yes"),self.getTitle()])
                   1076:             except:
                   1077:                 
                   1078:                 #logger(" ECHO_collection(getMDSimpleSearchField)",logging.INFO," ".join([self.getMDValue('title',generic="yes"),
                   1079:                  #            self.getMDValue('author',generic="yes"),
                   1080:                   #           self.getMDValue('year',generic="yes"),'']))
                   1081:                 return ""
                   1082:                              
                   1083:     def getMDValue(self,fieldNameTest,empty=None,generic=None):
                   1084:             """get md values"""
                   1085:             #TODO: cache mappinghash
                   1086:             
                   1087:             fieldName=None
                   1088:             if generic:
                   1089:                 if self.contentType:
                   1090:                     ct=self.contentType.replace(" ","_").lower()
                   1091:                     ct=self.contentType.replace("-","_").lower()
                   1092:                 else:
                   1093:                     logger("ECHO_collection (getMDValue)", logging.INFO, "no_content type for %s"%self.getId())
                   1094:                     ct=""
                   1095:                     
                   1096:                 #caching
                   1097:                 if not hasattr(self,'_v_mapHash'): #noch keine cachevariable
                   1098:                     self._v_mapHash={}
                   1099:                 
                   1100:                 
                   1101: 
                   1102:                 tmp=self._v_mapHash.get(ct,None) 
                   1103:                 if tmp: #teste ob type schon existiert
                   1104:                     fieldName=tmp.get(fieldNameTest,None)
                   1105:                 else:
                   1106:                     self._v_mapHash[ct]={}
                   1107:                     
                   1108: 
                   1109:                 #noch nicht gecached    
1.7       dwinter  1110:                 if not fieldName and hasattr(self.getStandardMD(),ct):    
                   1111:                     fieldName=getattr(self.getStandardMD(),ct).generateMappingHash()[fieldNameTest][0]
1.1       dwinter  1112:                     self._v_mapHash[ct][fieldNameTest]=fieldName
                   1113:             if not fieldName:
                   1114:                 fieldName=fieldNameTest  
                   1115:             if not empty:
                   1116:                            #FIXME: warum gibt es manchmal kein metadatahas
                   1117:                 try:
                   1118:                     
                   1119:                     ret =self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%normalizeCt(self.contentType))
                   1120:                 except:
                   1121:                     logger("ECHO (line 1069)",logging.ERROR,"no md hash for %s"%self.getId()) 
                   1122:                     return ""
                   1123:                   
                   1124:             else:
                   1125: 
                   1126:                    
                   1127:                    ret= self.metaDataHash.get(fieldNameTest,empty)
1.6       dwinter  1128:            
1.1       dwinter  1129:             return unicodify(ret)
                   1130: 
                   1131:     getFieldValue=getMDValue #depricated
                   1132: 
                   1133:     def newMetaXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,digiliburlprefix=None):
                   1134:             """new index.meta"""
                   1135:             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                   1136: 
                   1137:             if not hasattr(self,'metaDataHash'):
                   1138:                 
                   1139:                     self.copyIndex_meta2echo_resource()
                   1140:             try:
                   1141: 
                   1142: 
                   1143:                     return writeMetadata(self.metalink,self.OSAS_meta,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)
                   1144:             except:
                   1145:                     #print self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix
                   1146: 
                   1147:                     return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)
                   1148: 
                   1149:     def showMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
                   1150:             """return bibliographical metadata as stored in the object"""
                   1151:             
                   1152:             try:
                   1153:                     
                   1154:                     return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,xmlfrag="yes")
                   1155:             except:
                   1156:                     return "<error> no metadata stored</error>"
                   1157:     
                   1158:     def getXQueryMetaData(self,xquery):
                   1159:                 '''
                   1160:                 execute an xquery on the metadata and returns a list of tuples, 
                   1161:                 each tuple represent the content of the node as text and the whole node as xml-fragment
                   1162:                 @param xquery: xquery auf den metadaten
                   1163:                 '''
                   1164:                 
                   1165:                 try:
                   1166:                         md=writeMetadata(self.metalink,self.metaDataHash,xmlfrag="yes")
                   1167:                 except:
                   1168:                         return None
                   1169: 
                   1170:                 dom = NonvalidatingReader.parseString(md,"http://www.mpiwg-berlin.mpg.de/")
                   1171:                 
                   1172:                 results=Ft.Xml.XPath.Evaluate(xquery, contextNode=dom)
                   1173:             
                   1174:                 ret=[]
                   1175:                 for result in results:
                   1176:                     
                   1177:                     buf = cStringIO.StringIO()
                   1178:                     PrettyPrint(result, stream=buf)
                   1179:                     str = buf.getvalue()[0:]
                   1180:                     buf.close()
                   1181:                     ret.append((getTextFromNode(result),str)) 
                   1182:                         
                   1183:                 return ret
                   1184:         
                   1185:     def getMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
                   1186:             """prints out metadata as stored in the echo environment, format is the index.meta format"""
                   1187:             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                   1188:             return writeMetadata(self.metalink,self.metaDataHash)
                   1189: 
                   1190:     def getMetaDataLink(self):
                   1191:         """get link to the meta data"""
                   1192:         return self.metalink
                   1193:     
                   1194:     def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None):
                   1195:         """Aenderung der Properties"""
                   1196:         
                   1197:         setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
                   1198:         self.link=link
                   1199:         self.metalink=metalink
                   1200:         
                   1201:         if RESPONSE is not None:
                   1202:             RESPONSE.redirect('manage_main')
                   1203:             
                   1204:             
                   1205:     manage_options = (
                   1206:         {'label':'Main Config','action':'ECHO_resource_config_main'},
                   1207:         {'label':'Change Local Metadata','action':'ECHO_resource_config_metadata'},
                   1208:         {'label':'Sync Metadata with Repository','action':'ECHO_getResourceMD'},
                   1209:         {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
                   1210:         {'label':'Change TemplateSets and Image Viewer','action':'changeViewerTemplateSetForm'},
                   1211:         {'label':'set/change startpage','action':'setStartPageForm'},
                   1212:         {'label':'Copy MD for indexing and search','action':'copySearchFields'},
                   1213:         {'label':'Change AccessRights','action':'changeAccessRightForm'}, 
                   1214:         ) + Folder.manage_options
                   1215: 
                   1216: 
                   1217:     def isDefinedInThisSet(self,fields,field):
                   1218:             """checks if field is defined in fields"""
                   1219:             if (fields[0].has_key(field)) and not (fields[0][field]==""):
                   1220:                     return 1
                   1221:             else:
                   1222:                   
                   1223:                     return 0
                   1224:             
                   1225:     def getFieldLabel(self,fields,field):
                   1226:         """get labels"""
                   1227:         try:
                   1228:             ret =fields[0][field]
                   1229:             if ret == "":
                   1230:                 return field
                   1231:             else:
                   1232:                 return ret
                   1233:         except:
                   1234:             return field
                   1235: 
                   1236: 
                   1237: 
                   1238:     def getFieldTag(self,fields,field):
                   1239:         """get labels"""
                   1240:         try:
                   1241:             ret =fields[0][field]
                   1242:             if ret == "":
                   1243:                 return field
                   1244:             else:
                   1245:                 return ret
                   1246:         except:
                   1247:             return field
                   1248: 
                   1249:     
                   1250: 
                   1251:     def getMetaDataHash(self):
                   1252:             """md hash"""
1.6       dwinter  1253:            
                   1254:             return getattr(self,'metaDataHash',{})
1.1       dwinter  1255:     
                   1256:     def setFieldValue(self,field,value):
                   1257:         """get value"""
                   1258:         #TODO: remove setFieldValue
                   1259:         
                   1260:         if not hasattr(self,'metaDataHash'):
                   1261:                 setattr(self,'metaDataHash',{})
                   1262:         self.metaDataHash[field]=value[0:]
                   1263: 
                   1264:     def copySearchFields(self):
                   1265:             """copys metadatafields to the object"""
1.6       dwinter  1266:             
                   1267:             # Zunaechst die gnerischen felder
1.1       dwinter  1268:             fields=['author','title','year']
                   1269:             for field in fields:
1.6       dwinter  1270:                setattr(self,'MD_'+field,self.getMDValue(field,generic="yes"))
                   1271:                     
                   1272:            # jetzt die spezifischen
                   1273:            for field in self.getMetaDataHash().keys():
1.7       dwinter  1274:                    
                   1275:                    if (not field is None) and (not (field in fields)):
1.6       dwinter  1276:                        logging.debug("ECHO_resource (copySearchFields) mapping: "+field)
1.7       dwinter  1277:                        logging.debug("ECHO_resource (copySearchFields) mapping value : "+self.getMDValue(field))
1.6       dwinter  1278:                        setattr(self,'MD_'+field,self.getMDValue(field))
                   1279:    
                   1280:            
                   1281:              
1.1       dwinter  1282: 
                   1283:     def findLabelsFromMapping(self,referenceType):
                   1284:         """gib hash mit label -> generic zurueck"""
                   1285:         #return {},[]
                   1286: 
1.7       dwinter  1287:         temp=self.ZopeFind(self.getStandardMD())
1.1       dwinter  1288: 
                   1289:         if referenceType=="":
                   1290:                 referenceType="book"
                   1291:         
                   1292:         
                   1293:         bibdata={}
                   1294:         retdata={}
                   1295:         fields=[]
1.7       dwinter  1296:         fieldlist=self.getStandardMD().fieldList
1.1       dwinter  1297: 
                   1298:         tags=self.findTagsFromMapping(normalizeCt(self.contentType))
1.6       dwinter  1299:         logging.debug("ECHO_resource(findLabelsFromMapping)"+repr(tags))
1.1       dwinter  1300:         self.referencetypes=tags[2]
                   1301:         for referenceTypeF in self.referencetypes:
                   1302:                 
1.6       dwinter  1303:                 logging.debug("--- compare"+normalizeCt(referenceTypeF[1].title)+normalizeCt(referenceType.lower()))
1.1       dwinter  1304:                 if normalizeCt(referenceTypeF[1].title) == normalizeCt(referenceType.lower()):
1.6       dwinter  1305:                        
1.1       dwinter  1306:                         try:
1.7       dwinter  1307:                                 bibdata[referenceTypeF[1].title]=referenceTypeF[1].getUsedFields()
1.1       dwinter  1308:                                 referenceType=referenceTypeF[1].title
1.7       dwinter  1309:                                 logging.debug("------fields:"+repr(bibdata[referenceTypeF[1].title]))
1.1       dwinter  1310:                         except:
1.7       dwinter  1311:                                 bibdata[referenceType]=referenceTypeF[1].getUsedFields()
1.1       dwinter  1312:                 
                   1313: 
                   1314:                         bibdata['data']=referenceTypeF[1]
                   1315:                         fields=bibdata[referenceType]
                   1316:                         for field in fieldlist:
                   1317:                             retdata[field]=referenceTypeF[1].getValue(field)[1]
1.6       dwinter  1318:         
1.1       dwinter  1319:         return retdata,fieldlist,temp,fields
                   1320: 
                   1321:     def findTagsFromMapping(self,referenceType):
                   1322:         """gib hash mit label -> generic zurueck"""
                   1323:         
                   1324: 
                   1325:         if referenceType=="":
                   1326:                 referenceType="book"
                   1327:         
1.7       dwinter  1328:         temp =  self.ZopeFind(self.getStandardMD())[0:]
1.1       dwinter  1329: 
                   1330:         
                   1331:         #self.referencetypes=temp[0:]
                   1332:         
                   1333:         
                   1334:     
                   1335: 
                   1336:         bibdata={}
                   1337:         retdata={}
1.7       dwinter  1338:         fieldlist=self.getStandardMD().fieldList
1.1       dwinter  1339:         fields=[]
                   1340:         for referenceTypeF in temp:
                   1341:                 #print referenceType
                   1342:         
                   1343:                 if normalizeCt(referenceTypeF[1].title) == normalizeCt(referenceType.lower()):
                   1344:                         try:
1.7       dwinter  1345:                                 bibdata[referenceTypeF[1].title]=referenceTypeF[1].getUsedFields()
1.1       dwinter  1346:                                 referenceType=referenceTypeF[1].title
                   1347:                         except:
1.7       dwinter  1348:                                logging.debug("Error in ECHOresource(findTagsFromMapping): %s %s"%(sys.exc_info()[0],sys.exc_info()[1]))
                   1349:                                logging.debug(referenceTypeF)
                   1350:                                #TODO:CCCC
                   1351:                                bibdata[referenceType]=referenceTypeF[1].getUsedFields()
1.1       dwinter  1352:                         bibdata['data']=referenceTypeF[1]
                   1353:                         fields=bibdata[referenceType]
                   1354:                         for field in fieldlist:
                   1355:                             retdata[field]=referenceTypeF[1].getValue(field)[0]
                   1356:         
                   1357:         return retdata,fieldlist,temp,fields
                   1358: 
                   1359:     
                   1360:     security.declarePublic('copyIndex_meta2echo_resource') # has to be change, presentlyset because of OSAS koordination
                   1361:     def copyIndex_meta2echo_resource(self,RESPONSE=None):
                   1362:             """copy MD von Index_meta to the echo_resource"""
                   1363:             
                   1364:             (metadict, error)=readMetadata(self.metalink)
1.7       dwinter  1365:             logging.debug(metadict)
1.1       dwinter  1366:             
                   1367:             self.metaDataHash={}
                   1368:             if not error=="": #Fehler beim Auslesen des Metafiles
                   1369:                     
                   1370:                     return "ERROR:",error,self.absolute_url()
                   1371:             
                   1372:             self.contentType=normalizeCt(metadict['bib_type'])[0:]
                   1373:             fields=self.findTagsFromMapping(normalizeCt(self.contentType))
                   1374:             
                   1375:             #fields=self.findLabelsFromMapping(normalizeCt(self.contentType))
                   1376:             for field in fields[1]:
                   1377:                     
                   1378:                     if self.isDefinedInThisSet(fields,field):
                   1379:                             #print urllib.unquote(metadict.get(self.getFieldTag(fields,field),''))
                   1380:                             self.setFieldValue(self.getFieldTag(fields,field),metadict.get(self.getFieldTag(fields,field),''))
                   1381: 
                   1382:             
                   1383:             
                   1384:             if RESPONSE:
                   1385:                     return RESPONSE.redirect('manage_main')
                   1386:             
                   1387:             return "OK:",self.absolute_url(),normalizeCt(self.contentType)
                   1388:         
                   1389:     def ECHO_getResourceMD(self,template="yes",back=None,overwrite="no"):
                   1390:         """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""
                   1391:         (metadict, error)=readMetadata(self.metalink)
1.7       dwinter  1392:         logging.debug("METADICT:")
                   1393:         logging.debug(metadict)
1.1       dwinter  1394:         if back:
                   1395:             self.REQUEST.SESSION['back']=back
                   1396: 
                   1397:         if not error=="": #Fehler beim Auslesen des Metafiles
                   1398:                 return "ERROR:",error
                   1399:         
                   1400:         if (not self.contentType) or (overwrite=="yes"):
                   1401:                 self.contentType=normalizeCt(normalizeCt(metadict['bib_type']).lower())
                   1402:                 
                   1403:         if not (normalizeCt(metadict['bib_type']).lower()==normalizeCt(self.contentType).lower()):
                   1404:                 self.REQUEST.SESSION['contentStorage']=normalizeCt(metadict['bib_type'])
                   1405:                 self.REQUEST.SESSION['contentZope']=normalizeCt(self.contentType)
                   1406: 
                   1407:                 return zptFile(self, 'zpt/ECHO_getResourceMDErrorContentType.zpt')()
                   1408: 
                   1409:         #self.REQUEST.SESSION['metadict']=metadict
                   1410:         
                   1411:         
                   1412:         
                   1413: 
                   1414:         self.REQUEST.SESSION['diffs']=checkDiffs(self,metadict)
                   1415: 
                   1416: 
                   1417:         if template=="yes":
                   1418:                 #pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_resourceMD.zpt'),metadict=metadict).__of__(self)
                   1419:                 pt=zptFile(self, 'zpt/ECHO_resourceMD.zpt')
                   1420:                 
                   1421:                 return pt(metadict=metadict)
                   1422: 
                   1423:         
                   1424: 
                   1425:     
                   1426:     
                   1427:     def ECHO_getMD(self,item):
                   1428:         """Ausgabe der MD"""
                   1429:         return getattr(self,item)
                   1430: 
                   1431:     def checkRDF(self,path):
                   1432:             """check if pdf in the path"""
                   1433:             try:
                   1434:                     for fileName in os.listdir(path):
                   1435:                             if os.path.splitext(fileName)[1]==".pdf":
                   1436:                                     return os.path.join(path,fileName)
                   1437:                     return None
                   1438:             except:
                   1439:                     return None
                   1440:             
                   1441:             
                   1442:     security.declareProtected('View','index_html')
                   1443:     def index_html(self):
                   1444:         """standard page"""
                   1445:         pdf=self.checkRDF(self.link)
                   1446:         if pdf:
                   1447:                 fh=file(pdf,'r').read()
                   1448:                 self.REQUEST.RESPONSE.setHeader('Content-Type','application/pdf')
                   1449:                 self.REQUEST.RESPONSE.write(fh)
                   1450:                 self.REQUEST.RESPONSE.close()
                   1451:                 return 
                   1452:             
                   1453:         if getattr(self,'newViewer',''): #benutze den neuen viewer
                   1454:             url=self.newViewer+'url='+self.metalink+"&mode=texttool"
                   1455:             return self.REQUEST.RESPONSE.redirect(url)
                   1456:             
                   1457:         return self.REQUEST.RESPONSE.redirect(self.link)
                   1458: 
                   1459:     def startpage_html(self):
                   1460:             """prints out a startpage for a resource for use e.g. in the BVE"""
                   1461: 
                   1462:             # suche ob startpage.html in dem Ordner vorhanden ist, dann wir diese angezeigt
                   1463: 
                   1464:             sp=self.ZopeFind(self,obj_ids=['startpage.html'])
                   1465: 
                   1466:             if sp:
                   1467:                     return sp[1]()
                   1468: 
                   1469:             #pruefen ob irgendwo ein template
                   1470:             if hasattr(self,'startpage_index_template'): 
                   1471:                     return self.startpage_index_template()
                   1472: 
                   1473:             #generisches template ausgeben
                   1474:             
                   1475:             pt=zptFile(self, 'zpt/ECHO_startpage_index_template_standard.zpt')
                   1476:             pt.content_type="text/html"
                   1477:             return pt()
                   1478: 
                   1479:     def toc_html(self):
                   1480:             
                   1481:             sp=self.ZopeFind(self,obj_ids=['toc.html'])
                   1482:                     
                   1483:             if sp:
                   1484:                     return sp[0][1]()
                   1485: 
                   1486: 
                   1487:     security.declarePublic('generate_label') # has to be change, presentlyset because of OSAS koordination
                   1488: 
                   1489:     def generate_label(self):
                   1490:         """Erzeugt_standard_Label aus Template"""
1.7       dwinter  1491:           
                   1492:         templateName="label_template_"+normalizeCt(self.contentType).lower();
                   1493:         if hasattr(self, templateName):
                   1494:            pt=getattr(self,templateName)
                   1495:            self.title=pt()[0:]
                   1496:            return pt()
                   1497:         else:
                   1498:            pt=getattr(self.metadata,templateName)
                   1499:            
                   1500:            mdHash={}
                   1501:            #mdHash={"author":self.getMDValue('author'),"title":self.getMDValue('title'),"year":self.MD_year}
                   1502:            #logging.debug(mdHash)
                   1503:            logging.debug("new format for template")
                   1504:            fields=['author','title','year']
                   1505:            
                   1506:            for field in fields:
                   1507:                mdHash[field]=self.getMDValue(field);
                   1508:                     
                   1509:            # jetzt die spezifischen
                   1510:            for field in self.getMetaDataHash().keys():
                   1511:                    
                   1512:                    if (not field is None) and (not (field in fields)):
1.1       dwinter  1513: 
1.7       dwinter  1514:                        logging.debug(field)
                   1515:                        mdHash[field]=self.getMDValue(field);
                   1516:    
                   1517:            
                   1518:            self.title=pt(md=mdHash)[0:]
                   1519:            return pt(md=mdHash)[0:]
                   1520:         
                   1521:         
                   1522:         
                   1523:        
                   1524:     security.declarePublic('generate_title') # has to be change, presently set because of OSAS koordination
1.1       dwinter  1525: 
                   1526:     def generate_title(self,RESPONSE=None):
                   1527:         """Erzeugt_standard_Label aus Template"""
1.7       dwinter  1528:         
                   1529:           
                   1530:         templateName="label_template_"+normalizeCt(self.contentType).lower();
                   1531:         if hasattr(self, templateName):
                   1532:            pt=getattr(self,templateName)
                   1533:            self.title=pt()[0:]
                   1534:            return pt()
                   1535:         else:
                   1536:            pt=getattr(self.metadata,templateName)
                   1537:            
                   1538:            mdHash={}
                   1539:            #mdHash={"author":self.getMDValue('author'),"title":self.getMDValue('title'),"year":self.MD_year}
                   1540:            #logging.debug(mdHash)
                   1541:            logging.debug("new format for template")
                   1542:            fields=['author','title','year']
                   1543:            
                   1544:            for field in fields:
                   1545:                mdHash[field]=self.getMDValue(field);
                   1546:                     
                   1547:            # jetzt die spezifischen
                   1548:            for field in self.getMetaDataHash().keys():
                   1549:                    
                   1550:                    if (not field is None) and (not (field in fields)):
1.1       dwinter  1551: 
1.7       dwinter  1552:                        logging.debug(field)
                   1553:                        mdHash[field]=self.getMDValue(field);
                   1554:    
                   1555:            
                   1556:            self.title=pt(md=mdHash)[0:]
                   1557:            return pt(md=mdHash)[0:]
                   1558:         
                   1559:         
1.1       dwinter  1560:         
                   1561: 
                   1562: Globals.InitializeClass(ECHO_resource)
                   1563: 
                   1564: def manage_addECHO_resourceForm(self):
                   1565:         """Form for adding a ressource"""
                   1566:         pt=zptFile(self, 'zpt/AddECHO_resourceForm.zpt')
                   1567:         return pt()
                   1568: 
                   1569: 
                   1570: 
                   1571: 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):
                   1572:     """addresource"""
                   1573: 
                   1574:     newObj=ECHO_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords)
                   1575: 
                   1576:     self._setObject(id,newObj)
                   1577: 
                   1578:     if RESPONSE is not None:
                   1579:         RESPONSE.redirect('manage_main')
1.8       dwinter  1580:  

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