File:  [Repository] / ECHO_content / ECHO_resource.py
Revision 1.6.2.4: download - view: text, annotated - select for diffs - revision graph
Thu Aug 23 10:25:32 2012 UTC (11 years, 9 months ago) by casties
Branches: cleanup
Diff to: branchpoint 1.6: preferred, unified
quick fix for missing vlp_xmlhelpers.

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

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