File:  [Repository] / ECHO_content / ECHO_resource.py
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Tue Apr 14 16:31:27 2009 UTC (15 years, 1 month ago) by dwinter
Branches: MAIN
CVS tags: HEAD
mpwig:archive-path to rdf added

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

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