File:  [Repository] / ECHO_content / ECHO_resource.py
Revision 1.6.2.5: download - view: text, annotated - select for diffs - revision graph
Wed Aug 29 07:53:31 2012 UTC (11 years, 9 months ago) by dwinter
Branches: cleanup
Diff to: branchpoint 1.6: preferred, unified
removed very old pdf generation
all references to OSAS removed
viewtemplates

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

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