File:  [Repository] / ECHO_content / ECHO_resource.py
Revision 1.6.2.6: download - view: text, annotated - select for diffs - revision graph
Mon Sep 3 14:48:22 2012 UTC (11 years, 10 months ago) by dwinter
Branches: cleanup
Diff to: branchpoint 1.6: preferred, unified
aenderungen bei getmetadata

getDBDate hinzugefuegt fuer ressourcen
getMDValueSimpelSearchFor...

korrigiert und bei link hinzugefuegt.

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

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