Diff for /ECHO_content/ECHO_collection.py between versions 1.294 and 1.310.2.9

version 1.294, 2008/02/04 18:49:13 version 1.310.2.9, 2012/09/03 13:11:09
Line 1 Line 1
 """New version of the product started February, 8th. Without scientific classification, use content-type for further classification."""  """New version of the produc started February, 8th. Without scientific classification, use content-type for further classification."""
 """Echo collection provides the classes for the ECHO content web-site.  """Echo collection provides the classes for the ECHO content web-site.
   
 class ECHO_collection is the basis class for an ECHO collection.  class ECHO_collection is the basis class for an ECHO collection.
Line 9  class ECHO_externalLink contains informa Line 9  class ECHO_externalLink contains informa
   
   
 """  """
 try:  
         from reportlab.pdfgen import canvas  
         from reportlab.lib.pagesizes import A4  
 except:  
         print "PDF generation will not work"  
             
 import urlparse  import urlparse
 import string  import string
Line 40  from Globals import Persistent, package_ Line 36  from Globals import Persistent, package_
 from Acquisition import Implicit  from Acquisition import Implicit
 from Products.ZCatalog.CatalogPathAwareness import CatalogAware  from Products.ZCatalog.CatalogPathAwareness import CatalogAware
 from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon  from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon
   import ECHO_helpers
   from Acquisition import aq_parent
   try:
       from Products.MetaDataProvider.MetaDataClient import MetaDataClient
   except:
       print "no metadataclient"
 import urllib  import urllib
 import urllib2  import urllib2
 import cgi  import cgi
 import smtplib  import smtplib
 import time  import time
 from Ft.Xml.Domlette import NonvalidatingReader  #from Ft.Xml.Domlette import NonvalidatingReader
 from Ft.Xml.Domlette import PrettyPrint, Print  #from Ft.Xml.Domlette import PrettyPrint, Print
 from Ft.Xml import EMPTY_NAMESPACE  #from Ft.Xml import EMPTY_NAMESPACE
   #
 import Ft.Xml.XPath  #import Ft.Xml.XPath
 import cStringIO  import cStringIO
   
 import sys  import sys
   import logging
   
 try:  try:
         from psycopg import libpq          from psycopg import libpq
Line 79  except: Line 81  except:
         pass          pass
   
 from ECHO_movie import *  from ECHO_movie import *
 import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen  #import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen
 import xmlrpclib  import xmlrpclib
   
 import logging  import logging
   
   from ECHO_root  import ECHO_root
   
 #ersetzt logging.info  #ersetzt logging.info
 def logger(txt,method,txt2):  def logger(txt,method,txt2):
     """logging"""      """logging"""
     logging.info(txt+ txt2)      logging.info(txt+ txt2)
   
 def normalizeCt(str):  
         """normalizes content_type"""  
         #str= str.replace(" ","_")  
         return str.replace("-"," ").lower()  
   
 def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs=""):  def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs=""):
   
Line 106  def setECHO_collectionInformation(self,t Line 106  def setECHO_collectionInformation(self,t
         self.credits=toList(credits)          self.credits=toList(credits)
         self.weight=weight          self.weight=weight
   
   import ECHO_resource
   from ECHO_resource import manage_addECHO_resource
   
   class ECHO_resource(ECHO_resource.ECHO_resource):
       """depricated use class in ECHO_resource.py"""
   
   
 class ECHO_partner(Image,Persistent,ECHO_basis):  class ECHO_partner(Image,Persistent,ECHO_basis):
     """ECHO Partner"""      """ECHO Partner"""
   
Line 374  class ECHO_fullText(ZopePageTemplate,ECH Line 381  class ECHO_fullText(ZopePageTemplate,ECH
                 try:                  try:
                    dom=xml.dom.minidom.parseString(self())                     dom=xml.dom.minidom.parseString(self())
                 except:                  except:
                    dom=xml.dom.minidom.parseString(self().encode('latin-1'))                     dom=xml.dom.minidom.parseString(self.utf8ify(self()))
                 pages=dom.getElementsByTagName('page')                  pages=dom.getElementsByTagName('page')
                                   
                 return pages[int(nr)-1].toxml()                  return pages[int(nr)-1].toxml()
Line 415  def manage_addECHO_fullText(self, id, ti Line 422  def manage_addECHO_fullText(self, id, ti
     return ''      return ''
   
   
 class ECHO_resource(CatalogAware,Folder,Persistent,ECHO_basis):  
     """ECHO Ressource"""  
     security=ClassSecurityInfo()  
     meta_type='ECHO_resource'  
     default_catalog='resourceCatalog'  
       
 #    viewClassificationList=viewClassificationListMaster  
   
     def PrincipiaSearchSource(self):  
            """Return cataloguable key for ourselves."""  
            return str(self)  
   
     getSubCols = ECHO_helpers.getSubCols  
   
     def reindex(self):  
         """generate fields for indexing and reindex"""  
           
         #TODO: korrigieren des metalink pfades konfigurierbar machen  
         splitted= [x for x in urlparse.urlparse(self.metalink)]  
         splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]  
           
         if splitted[0]=="http":  
             self.metalink=urlparse.urlunparse(splitted)  
           
   
         self.fullTextUrl=self.getFullTextXML(noredirect="yes")  
           
         #TODO: korrigieren relative url to absoluter url volltexten, konfigurierbar?  
         splitted= [x for x in urlparse.urlparse(self.fullTextUrl)]  
         if splitted[0]=="":  
             splitted[0]="http"  
             splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]  
               
             self.fullTextUrl=urlparse.urlunparse(splitted)  
               
         self.imagePath=self.getImagePath()  
           
         self.reindex_object()  
     
     
     security.declareProtected('View','createPDF')  
     def createPDF(self,RESPONSE=None,local=None,dpi=150):  
             """erzeuge pdf file"""  
             pages=1  
             dpi=float(dpi)  
             imagePath=self.getImagePath().replace("/mpiwg/online","")  
               
               
             image="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler?fn="+imagePath+"&dw=%i&dh=%i&pn=%i"  
             xmlInfo="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/dlInfo-xml.jsp?fn="+imagePath  
   
             dom=xml.dom.minidom.parse(urllib.urlopen(xmlInfo))  
             for parameter in dom.getElementsByTagName('parameter'):  
                     if parameter.getAttribute('name')=="pt":  
                             pages=int(parameter.getAttribute('value'))  
                             break  
               
   
             tempdir="/tmp/archivesImageServer"  
             if not os.path.exists(tempdir):  
                     os.mkdir(tempdir)   
     
             tmpPath=tempfile.mkdtemp(dir=tempdir)  
               
   
             tmpZip=tempfile.mktemp(dir=tempdir)  
   
             tmpFn=os.path.split(tmpZip)[1]  
   
   
       
   
             if RESPONSE:  
                     RESPONSE.setHeader("Content-Type","text/html")  
                     RESPONSE.write("<h1>I am creating  the pdf</h1>")  
                     txt="<h3>1. step: getting the images( %i pages)</h3>"%pages  
                     RESPONSE.write(txt)  
   
             c=canvas.Canvas(tmpZip)  
             for i in range(1,pages+1):  
                     if RESPONSE:  
                             RESPONSE.write(str("<p>Get Page: %i<br>\n"%i))  
                     faktor=dpi/72.0  
                       
                     fn=tmpPath+"/%i"%i  
   
                     width,height=A4  
                     #print image%(width*faktor,height*faktor,i)  
                     url=urllib.urlopen(image%(width*faktor,height*faktor,i)).read()  
                     fh=file(fn,"w")  
                     fh.write(url)  
                     fh.close()  
   
       
   
                     c.drawImage(fn,0,0,width=width,height=height)  
                     c.showPage()  
             c.save()  
             if RESPONSE:  
                     RESPONSE.write("<p>finished<br>\n")  
   
             if RESPONSE:  
                     len=os.stat(tmpZip)[6]  
                     downloadUrl=self.absolute_url()+"/downloadPDF"  
                     RESPONSE.write("""<h1><a href="downloadPDF?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len))  
                     RESPONSE.write("""<p>The file will be stored for a while, you can download it later, the URL is:</p>  
                     <p><a href="downloadPDF?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn))  
                     RESPONSE.close()  
   
   
     def downloadPDF(self,fn):  
             """download prepared set"""  
             filename="/tmp/archivesImageServer/"+fn  
             namePDF=self.getId()+".pdf"  
             self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%namePDF)  
             self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")  
             len=os.stat(filename)[6]  
             self.REQUEST.RESPONSE.setHeader("Content-Length",len)  
             images=file(filename).read()  
             self.REQUEST.RESPONSE.write(images)  
             self.REQUEST.RESPONSE.close()  
   
   
     def getRDF(self,urn=None):  
             """rdf"""  
             ret=getRDFDescription(self,self.link,urn=urn)  
             return ret+self.createSubElementRDF(urn=urn)   
   
     
     def changeAccessRightForm(self,preselect=None):  
         """change the access rights"""  
           
         pt=zptFile(self, 'zpt/ChangeECHO_resourceAccessRight.zpt')  
         return pt(preselect=preselect)  
       
     def changeAccessRight(self):  
         """changeRights"""  
         argv=self.REQUEST.form  
         self.setAccessRightXML(argv["%s_xml"%self.getId()])  
         self.accessRight=argv["%s_echo"%self.getId()]  
            
         self.REQUEST.RESPONSE.redirect('manage_main')  
           
       
     def getAccessRightSelectorHTML(self,outlook="select",xmldominant=None,preselect=None):  
             """htmlselector, xmldominant= in der regel wird der wert des xmlfiles ausgegeben ausser er existiert nicht"""  
             values=['','free','MPIWG']  
               
             if preselect:#set all to the preselected  
                 ar=(preselect,preselect)  
             else:#else set to actual value  
                 ar=self.getAccessRightMD()  
                   
             if outlook=="select":  
                     ret="""<select name="%s_xml">"""%self.getId()  
                     ret1="""<select name="%s_echo">"""%self.getId()  
                     for value in values:  
                             if value==ar[0]:  
                                     ret+="<option selected>%s</option>"%value  
                             else:  
                                     ret+="<option>%s</option>"%value  
                               
                             if value==ar[1]:  
                                     ret1+="<option selected>%s</option>"%value  
                             else:  
                                     ret1+="<option>%s</option>"%value  
                       
                       
                     if not xmldominant:  
                         return ret+"</select>",ret1+"</select>"  
                     else:  
                         if ar[0] is not None:  
                             return ret+"</select>"  
                         else:  
                             return "<p>No xml file (only local selection):"+ret1  
   
             else:  
                     ret=""  
                     ret1=""  
                     for value in values:  
                               
                             if value==ar[0]:  
                                     ret+="""<input type="radio" name="%s_xml" value="%s" checked>%s"""%(self.getId(),value,value)  
                             else:  
                                     ret+="""<input type="radio" name="%s_xml" value="%s">%s"""%(self.getId(),value,value)  
                                       
                             if value==ar[1]:  
                                     ret1+="""<input type="radio" name="%s_echo" value="%s" checked>%s"""%(self.getId(),value,value)  
                             else:  
                                     ret1+="""<input type="radio" name="%s_echo" value="%s">%s"""%(self.getId(),value,value)  
   
                     if not xmldominant:                          
                         return ret,ret1  
                     else:                           
                         if ar[0]:  
                             return ret  
                         else:  
                             return "<p>No xml file (only local selection)</p>"+ret1  
   
   
   
     def copyAccessRightsFromMD(self):  
             """kopiere rechte aus den metadaten"""  
             self.accessRight=self.getAccessRightMD()[0]  
               
               
               
               
       
     def getAccessRightMD(self):  
                 """set accessright"""  
                 url=self.metalink  
   
                 try:  
                     urllib.urlopen(url)  
                 except:  
                     logger("ECHO_Resource (getAccessRightMD)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])  
   
                     return None,getattr(self,'accessRight','')  
                   
               
                 try:  
                         dom = NonvalidatingReader.parseUri(url)  
                 except:  
                         logger("ECHO_Resource (getAccessRightMD)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])  
                         return (None,"Cannot parse: "+url+"<br>"+"%s (%s)"%sys.exc_info()[0:2])  
   
   
                 accessright=dom.xpath("//meta/access-conditions/access/@type")  
                 if accessright:  
                     accessright=accessright[0].value  
                 if str(accessright)=='institution':  
                     tmp=dom.xpath("//meta/access-conditions/access/name")  
                     if tmp:  
                         accessright=getTextFromNode(tmp[0])  
                       
                 if not accessright:  
                     accessright=""  
                   
                 return accessright,getattr(self,'accessRight','')               
   
     def changeAccessRightMD(self,accessright,RESPONSE=None):  
             """change the rights - not user anymore"""  
             #TODO: check if method still needed  
             params="accessright=%s"%accessright  
   
   
             #print ECHO_helpers.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read()  
   
             tries=0  
             for i in range(10):  
                     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()  
                     if x=="ok":  
                              
                             break;  
                    
               
             
             if RESPONSE is not None:  
                         RESPONSE.redirect('manage_main')  
   
                   
     def setAccessRightXML(self,accessright):  
                 """set accessright"""  
                 url=self.metalink  
                 accessrights=['MPIWG','free']#allowes rights  
                   
                 if accessright =='':  
                     """do nothing"""  
                     return ""  
                       
                       
                 try:  
                         geturl=""  
                         for line in ECHO_helpers.urlopen(url).readlines():  
                                 geturl=geturl+line   
   
   
                 except:  
                         return (None,"Cannot open: "+url)  
   
                 try:  
                         dom=xml.dom.minidom.parseString(geturl)  
                         root=dom.getElementsByTagName('resource')[0]  
                 except:  
                         return (None,"Cannot parse: "+url+"<br>"+geturl)  
   
                 metamains=dom.getElementsByTagName('meta')  
                   
                 if not metamains:  
                         nodenew=dom.createElement('meta')  
                         root.appendChild(nodenew)  
                         metamain=nodenew  
                 else:  
                         metamain=metamains[0]  
                   
                   
                 metanodes=metamain.getElementsByTagName('access-conditions')  
   
                 if not metanodes:  
                         nodenew=dom.createElement('access-conditions')  
                         metamain.appendChild(nodenew)  
                         metanode=nodenew  
                 else:  
                         metanode=metanodes[0]  
   
                 accesses=metanode.getElementsByTagName('access')  
   
                 #delete old  
                 if accesses:  
                      metanode.removeChild(accesses[0]).unlink()  
   
                 #create new  
                       
                 nodenew2=dom.createElement('access')  
                 metanode.appendChild(nodenew2)  
                 metanode2=nodenew2  
                   
                 attribute=metanode2.getAttribute('type')  
                   
                 if accessright=="free":  
                       
                      metanode2.setAttribute('type','free')  
                   
                 elif accessright.upper()=='MPIWG':  
                         metanode2.setAttribute('type','institution')  
                         nodenew4=dom.createElement('name')  
                         metanodetext=dom.createTextNode('MPIWG')  
                         nodenew4.appendChild(metanodetext)  
                         nodenew2.appendChild(nodenew4)  
                 #print dom.toxml().encode('utf-8')  
                 string= encodeRPC(dom.toxml().encode('utf-8'))  
                   
                 #TODO: make server configurable  
                 server=xmlrpclib.Server("http://foxridge.mpiwg-berlin.mpg.de/server")  
   
                 path=urlparse.urlparse(self.metalink)[2]  
            
                 server.writeMetaDataFile(path,string,"yes")  
           
     def setStartPageForm(self):  
             """Form for changing the startpage"""  
   
               
             pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPage.zpt')  
             pt.content_type="text/html"  
             return pt()  
       
   
     def createImageUrl(self,pn=1):  
             """create ImageUrl"""  
   
               
             resourcepath=readFieldFromXML(self.metalink,'resource','archive-path')  
               
             digiliburlprefix=readFieldFromXML(self.metalink,'texttool','digiliburlprefix')  
             images=readFieldFromXML(self.metalink,'texttool','image')  
   
   
             if (not resourcepath) or (not digiliburlprefix) or (not images):  
                     logger("ECHO (createImageUrl)",logging.ERROR,"Cannot create ImageUrl for %s"%self.absolute_url())  
                     return None  
             resourcepath=resourcepath.replace('/mpiwg/online','')  
             if not digiliburlprefix: digiliburlprefix="http://echo.mpiwg-berlin.mpg.de/zogilib?"  
   
             if (not images) or (not resourcepath): return None  
   
             return "%sfn=%s&pn=%i"%(digiliburlprefix,resourcepath+"/"+images,pn)  
       
     def copyTitleToInfoXML(self,RESPONSE=None):  
             """copy title from the resource"""  
             presentationXML=readFieldFromXML(self.metalink,'texttool','presentation')  
             resourcepath=readFieldFromXML(self.metalink,'resource','archive-path')  
             if (not presentationXML) or (not resourcepath):   
                 if RESPONSE:  
                         RESPONSE.write("Error: %s\n"%self.getId())  
                 else:  
                         return None,self.absolute_url()  
   
             try:  
                     fh=file(os.path.join(resourcepath,presentationXML),'w')  
                     fh.write("""<info>  
                     <author></author>  
                     <title>%s</title>  
                     <date></date>  
                     <display>yes</display>  
                     </info>"""%self.title)  
                     fh.close()  
                     return 1,self.getId()  
             except:  
                     if RESPONSE:  
                             RESPONSE.write("Error: %s\n"%self.getId())  
                     else:  
                             return None,self.absolute_url()  
   
               
     def setStartPage(self,startpage=None,RESPONSE=None):  
             """set start page, if no startpage defined use the generic one of the resource"""  
   
             if (not (type(startpage)==StringType)):  
                     if ("__generic" in startpage): # checke ob generic in der liste  
                             startpage=self.absolute_url()+"/startpage_html"  
                     elif ("__firstPage" in startpage): # checke ob generic in der liste  
                             startpage=self.createImageUrl()  
                               
             if (not startpage):  
                     startpage=self.absolute_url()+"/startpage_html"  
             elif (startpage=="__generic"):  
                     startpage=self.absolute_url()+"/startpage_html"  
             elif (startpage=="__firstPage"):  
                         startpage=self.createImageUrl()  
       
             params="startpage=%s"%startpage  
             #print 'http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))  
                  
             tries=0  
             for i in range(10):  
                     x=ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))).read()  
                     if x=="ok":  
                              
                             break;  
                    
               
             path=self.metalink  
               
             path=re.sub(self.REQUEST['SERVER_URL'],'',path)  
             path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path)  
               
             path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server  
             path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server  
             path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server  
             path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server  
             path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server  
             path=re.sub('http://vision.mpiwg-berlin.mpg.de','',path) # falls vision als server  
             path=re.sub('http://xserve02.mpiwg-berlin.mpg.de:18880','',path) # falls vision als server  
             path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo  
             path=re.sub('/index.meta','',path)   
   
   
             ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()  
   
             if RESPONSE is not None:  
                         RESPONSE.redirect('manage_main')  
   
     def changeViewerTemplateSetForm(self):  
             """change the viewer template set"""  
             pt=zptFile(self, 'zpt/changeResourceViewerTemplateSet')  
             return pt()  
   
   
     def setLink(self, link=None):  
         """change link field"""  
         if link is not None:  
             self.link = link  
               
      
     def getTextToolsField(self,name,default=''):  
         """Lese Textoolsfelder aus index.meta im path aus"""  
           
         try:  
             dom=xml.dom.minidom.parse(self.metalink)  
             node=dom.getElementsByTagName('texttool')[0] #getNode  
             subnode=node.getElementsByTagName(name)[0]  
   
             # bei text wird nur der Folder gebraucht  
             if name=="text":  
                 splitted=getText(subnode.childNodes).split("/")  
                 return splitted[len(splitted)-2]  
             else:  
                 return getText(subnode.childNodes)  
         except:  
             return default  
      
   
     def changeViewerTemplateSet(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None):  
             """changeit"""  
   
             paramList=['project','startpage','xslt','thumbtemplate','topbar','digiLibTemplate','digiliburlprefix']  
   
               
             #writeMetadata(self.metalink,self.metaDataHash,project,None,xslt,thumbtemplate,topbar,digiLibTemplate)  
   
             params="project=%s&xslt=%s&thumbtemplate=%s&topbar=%s&digiLibTemplate=%s&digiliburlprefix=%s"%(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix)  
   
             try:  
                 tries=0  
                 for i in range(10):  
                         x=ECHO_helpers.urlopen('http://echo.mpiwg-berlin.mpg.de/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))).read()  
                         if x=="ok":  
                              
                             break;  
                    
             except:  
                 logger("ECHO_ressource (changeViewerTemplateSet)", logging.ERROR,"%s (%s)"%sys.exc_info()[0:2])            
                 logger("ECHO_ressource (changeViewerTemplateSet)", logging.ERROR,'http://echo.mpiwg-berlin.mpg.de/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params)))  
             #print self.absolute_url()+'/newMetaXML'+urllib.quote'?'+params)  
             # hack Pfad auf die Dokumente  
             path=self.metalink  
               
               
   
             path=re.sub('/index.meta','',path)   
   
             #TODO: direct access to the file system necessary, fix that also xmlrpc to the server where the index file is stored is possible      
             parsedUrl=urlparse.urlparse(path)  
             path=parsedUrl[2]  
   
             try:          
                 return ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()  
             except:  
                 logger("ECHO_Resource (changeViewerTemplateSet)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])  
                 logger("ECHO_Resource (changeViewerTemplateSet)", logging.INFO,"http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path)  
   
             if RESPONSE is not None:  
                         RESPONSE.redirect('manage_main')  
   
       
   
     security.declarePublic('content_html')        
     def content_html(self):  
         """template fuer content"""  
         return ECHO_basis.content_html(self,'resource')  
       
 #    def getViewClassification(self):  
 #        if hasattr(self,'viewClassification'):  
 #            return self.viewClassification  
 #        else:  
 #            return ""  
   
     def getFullTextXML(self,noredirect=None):  
             """getFullTextXML; gives the FullText as an XML Document, and <error></error> if somthing goes wrong."""  
   
             try:  
                     #logger("ECHO Fulltext",logging.INFO,"open %s"%self.metalink)  
                     fh=ECHO_helpers.urlopen(self.metalink)  
                     #logger("ECHO Fulltext",logging.INFO,"opened %s"%self.metalink)  
                     dom=xml.dom.minidom.parse(fh)  
                     texttools=dom.getElementsByTagName('texttool')  
                     text=texttools[0].getElementsByTagName('text')  
                     texturl=getText(text[0].childNodes)  
   
                     #logger("ECHO Fulltext",logging.INFO,"found %s"%texturl)  
                     fh.close()  
                     #logger("ECHO Fulltext",logging.INFO,"closed fh")  
                     #keine url  
                     if not (texturl.split(":")[0] in ['http','ftp','file']):   
                         if not noredirect:  
                             return file(texturl).read()  
                         else:  
                             return texturl  
   
                     if not noredirect:  
                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')    
                             logger("ECHO Fulltext",logging.INFO,"redirect to:%s"%texturl)  
                             self.REQUEST.RESPONSE.redirect(texturl)  
                     else:  
                             return texturl  
             except:  
   
                     if not noredirect:  
                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')  
                             self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")  
                     else:  
                             return "<error>no fulltext available</error>"  
   
     def getImagePath(self):  
             """gibt pfad zum image aus"""  
             return self.getImageView(noredirect="yes",onlyPath="yes")  
       
     def getImageView(self,noredirect=None,onlyPath=None):  
             """getImages; give Imageviewr  and <error></error> if somthing goes wrong."""  
             try:  
                     fh=ECHO_helpers.urlopen(self.metalink)  
                     dom=xml.dom.minidom.parse(fh)  
                     texttools=dom.getElementsByTagName('texttool')  
                     text=texttools[0].getElementsByTagName('image')  
                     imagetemp=getText(text[0].childNodes)  
                       
                     text=dom.getElementsByTagName('archive-path')  
                     archivepath=getText(text[0].childNodes)  
                     archivepath=re.sub('/mpiwg/online/','',archivepath)   
                     imageurl="http://echo.mpiwg-berlin.mpg.de/zogilib?fn="+archivepath+"/"+imagetemp  
                     fh.close()  
   
                     if not noredirect:  
                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')    
                             self.REQUEST.RESPONSE.redirect(imageurl)  
                     else:  
                             if not onlyPath:  
                                     return imageurl  
                             else:  
                                     return archivepath+"/"+imagetemp  
             except:  
   
                     if not noredirect:  
                             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')  
                             self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")  
                     else:  
                             return "<error>no images available</error>"  
   
       
     def getCopyrightsHTML(self):  
             """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus"""  
               
             if hasattr(self,'copyrightModel'):  
                     obj=self.copyrightModel  
                       
             else:  
                     return "ERROR"  
             ret=[]  
               
             for copyright in obj.getCopyrights(): #copyright - media / partner / copyrightID  
                       
                       
                     try:  
                         if hasattr(self.copyrightTypes,copyright[2]):  
                              copyrightTypeObj=getattr(self.copyrightTypes,copyright[2])  
                              link="copyrightTypes/"+copyright[2]+'/copyright.html'  
                         else:  
                              copyrightTypeObj=getattr(obj,copyright[2])  
                              link="copyrightModel/"+copyright[2]+'/copyright.html'  
                                
                         label=copyrightTypeObj.label  
                         url=getattr(copyrightTypeObj, 'url', '')  
                               
                         if url!='':  
                                  ret.append((url,copyright[0],copyright[1],copyright[2],label))  
                         else:  
                                 if hasattr(copyrightTypeObj, 'copyright.html'):  
                                      ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label))  
                                 else:  
                                      ret.append(('empty',copyright[0],copyright[1],copyright[2],label))  
                     except:  
                             """nothing"""  
                       
             return ret  
               
     def getInstitutionsHTML(self):  
                 """gibt Liste der foerdernden Institutionen aus"""  
                   
                 if hasattr(self,'support'):  
                         obj=self.support  
                         ret=obj.getSupporter()  
                         return ret  
                 else:  
                         return ''  
                           
     def getOwnerOriginalsHTML(self):  
                """gibt Liste der foerdernden Institutionen aus"""  
                  
                if hasattr(self,'ownerOriginal'):  
                        obj=self.ownerOriginal  
                        ret=obj.getOwner()  
                        return ret  
                else:  
                        return ''  
       
     def getDigiCopyByHTML(self):  
                """gibt Liste der foerdernden Institutionen aus"""  
                  
                if hasattr(self,'digiCopyBy'):  
                        obj=self.digiCopyBy  
                        ret=obj.getDigiCopyBy()  
                        return ret  
                else:  
                        return ''                      
       
     def getCredits(self):  
         """Ausgabe der credits"""  
         if self.credits:  
             return self.credits  
         else:  
             return []  
   
   
       
     def __init__(self,id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords):  
   
         self.id = id  
         """Festlegen der ID"""  
           
         self.label = label  
         self.link= link  
         self.metalink=metalink  
         self.title=title  
         self.weight=weight  
         self.credits=toList(credits)  
         self.description=description  
         self.contentType=contentType  
         self.copyrightType=copyrightType  
         self.renderingType=renderingType  
         self.responsible=responsible  
         self.resourceID=resourceID  
           
         if coords:  
             coordsnew=[ string.split(x,",") for x in coords]  
         else:  
             coordsnew=[]  
           
         self.coords=coordsnew  
 #       self.viewClassification=""  
   
   
   
     def getContentType(self):  
             try:  
                     return normalizeCt(self.contentType)  
             except:  
                     return ""  
   
     def getCopyrightType(self):  
             try:  
                     return self.copyrightType  
             except:  
                     return ""  
   
     def getRenderingType(self):  
             try:  
                     return self.renderingType  
             except:  
                     return ""  
   
     def ECHO_resource_config(self):  
         """Main configuration"""  
   
         if not hasattr(self,'weight'):  
             self.weight=""  
   
         pt=zptFile(self, 'zpt/ChangeECHO_resource.zpt')  
         return pt()  
       
   
     def ECHO_resource_config_main(self):  
         """Main configuration"""  
         if not hasattr(self,'weight'):  
             self.weight=""  
         pt=zptFile(self, 'zpt/ChangeECHO_resource_main.zpt')  
         return pt()  
   
     def ECHO_resource_config_coords(self):  
         """Coords configuration """  
         pt=zptFile(self, 'zpt/ChangeECHO_resource_coords.zpt')  
         return pt()  
   
     def ECHO_resource_config_credits(self):  
         """Main configuration"""  
         pt=zptFile(self, 'zpt/ChangeECHO_resource_credits.zpt')  
         return pt()  
   
     def ECHO_resource_config_metadata(self):  
         """Main configuration"""  
         if (hasattr(self,'metadata')) and not (hasattr(self,'metaDataHash')):  
                 self.metaDataHash={}  
                 self.contentType=self.bib_type  
                 for data in self.metadata:  
                         data_neu=re.sub('-','_',data)  
                         self.metaDataHash[data_neu]=getattr(self,data)[0:]  
   
           
         pt=zptFile(self, 'zpt/ChangeECHO_resource_metadata.zpt')  
         return pt()  
   
   
       
     def changeViewer(self,newViewer):  
         """set newViewer to the url of the new viewer  
         only if metalink is set, otherwise it gives false  
         """  
           
         texterUrl="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/servlet/Texter?fn=/"  
           
         vl,msg=self.checkValidityOfMetaLink()  
           
         if not vl: #ungueltiger link, versuche neuen  
             newStr=re.match(".*/mpiwg/online/(.*)",self.metalink) # suche pfad hinter /mpiwg/online   
             oldLink=self.metalink  
               
             if newStr:  
                 self.metalink=texterUrl+newStr.group(1)  
                 vl,msg=self.checkValidityOfMetaLink()  
             else:  
                 logging.error("change Viewer XX(mew Metadatafile) %s"%self.metalink)  
                 vl=False  
                   
             if not vl: # geht immer noch nicht, dann setzte wieder zurueck  
                 self.metaLink=oldLink  
               
             logging.info("change Viewer (mew Metadatafile) %s"%self.metalink)  
              
         if vl:  
             self.newViewer=newViewer  
             return vl,msg  
         else:  
             return vl,msg  
       
     def checkValidityOfMetaLink(self):  
         """checks if the metalink is valid xml"""  
           
         ml=self.metalink  
           
         try:  
             txt=urllib.urlopen(ml)  
   
         except:  
             return False,"Cannot open: %s)"%ml  
           
         txt.close()          
         try:  
             dom = NonvalidatingReader.parseUri(ml)  
         except:  
             return False, "Connot parse: %s)"%ml  
           
         if len(dom.xpath("//texttool"))==0:  
             return False, "No texttools: %s)"%ml  
               
         return True,""  
           
     def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,newViewer='',RESPONSE=None):  
         """Aenderung der Properties"""  
         self.resourceID=resourceID  
         self.title=title  
         self.label=label  
         self.description=description  
   
         self.contentType=contentType  
         self.renderingType=renderingType  
         self.weight=weight  
           
         self.link=link  
         self.metalink=metalink  
           
         self.newViewer=newViewer  
           
           
         if RESPONSE is not None:  
             RESPONSE.redirect('manage_main')  
   
   
     def changeECHO_resource_coords(self,RESPONSE=None):  
         """Aenderung der Properties - coords"""  
         #return self.REQUEST  
         for area in self.getMapAreas():  
             id = area.getId()  
             if self.REQUEST.has_key('del.'+id):  
                 # delete this area  
                 self._delObject(id)  
                 # return to same menu  
                 if RESPONSE is not None:  
                     RESPONSE.redirect('ECHO_resource_config_coords')  
                 return  
             # modify this area  
             coordstring = self.REQUEST.get('coords.'+id, '')  
             coords = string.split(coordstring, ',')  
             angle = self.REQUEST.get('angle.'+id, '0')  
             type = self.REQUEST.get('type.'+id, 'area')  
             if len(coords) == 4:  
                 area.setCoordString(coordstring)  
                 area.setAngle(angle)  
                 area.setType(type)  
         # return to main menu      
         if RESPONSE is not None:  
             RESPONSE.redirect('manage_main')  
   
   
     def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None):  
         """Aenderung der Properties"""  
         self.credits=credits  
         self.responsible=responsible  
         self.copyrightType=copyrightType  
           
         if RESPONSE is not None:  
             RESPONSE.redirect('manage_main')  
   
   
     def changeECHO_resource_metadata_local(self,RESPONSE=None):  
             """change metadata"""  
             tags=self.findTagsFromMapping(normalizeCt(self.contentType))  
             for field in tags[1]:  
                     self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)][0:]  
                           
   
                       
             if RESPONSE is not None:  
                     RESPONSE.redirect('manage_main')  
   
     def changeECHO_resource_metadata(self,RESPONSE=None):  
             """change metadata"""  
             tags=self.findTagsFromMapping(normalizeCt(self.contentType))  
             self.OSAS_meta={}  
             for field in tags[1]:  
                     try:  
                             self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]  
                             self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)]  
                     except:  
                             logger("ECHO_collection (changeECHO_resource_metadata)",logging.ERROR,"%s (%s)"%sys.exc_info()[0:2])  
   
             print self.newMetaXML()  
             tries=0  
             for i in range(10):  
                     x=ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML')).read()  
                     if x=="ok":  
                              
                             break;  
                    
               
   
             if RESPONSE is not None:  
                     RESPONSE.redirect('manage_main')  
   
       
   
     def getMDValueSimpleSearchField(self):  
             """returns value for simple search"""  
               
             try:  
                 return " ".join([self.getMDValue('title',generic="yes"),  
                              self.getMDValue('author',generic="yes"),  
                              self.getMDValue('year',generic="yes"),self.getTitle()])  
             except:  
                   
                 #logger(" ECHO_collection(getMDSimpleSearchField)",logging.INFO," ".join([self.getMDValue('title',generic="yes"),  
                  #            self.getMDValue('author',generic="yes"),  
                   #           self.getMDValue('year',generic="yes"),'']))  
                 return ""  
                                
     def getMDValue(self,fieldNameTest,empty=None,generic=None):  
             """get md values"""  
             #TODO: cache mappinghash  
               
             fieldName=None  
             if generic:  
                 if self.contentType:  
                     ct=self.contentType.replace(" ","_").lower()  
                     ct=self.contentType.replace("-","_").lower()  
                 else:  
                     logger("ECHO_collection (getMDValue)", logging.INFO, "no_content type for %s"%self.getId())  
                     ct=""  
                       
                 #caching  
                 if not hasattr(self,'_v_mapHash'): #noch keine cachevariable  
                     self._v_mapHash={}  
                   
                   
   
                 tmp=self._v_mapHash.get(ct,None)   
                 if tmp: #teste ob type schon existiert  
                     fieldName=tmp.get(fieldNameTest,None)  
                 else:  
                     self._v_mapHash[ct]={}  
                       
   
                 #noch nicht gecached      
                 if not fieldName and hasattr(self.standardMD,ct):      
                     fieldName=getattr(self.standardMD,ct).generateMappingHash()[fieldNameTest][0]  
                     self._v_mapHash[ct][fieldNameTest]=fieldName  
             if not fieldName:  
                 fieldName=fieldNameTest    
             if not empty:  
                            #FIXME: warum gibt es manchmal kein metadatahas  
                 try:  
                       
                     ret =self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%normalizeCt(self.contentType))  
                 except:  
                     logger("ECHO (line 1069)",logging.ERROR,"no md hash for %s"%self.getId())   
                     return ""  
                     
             else:  
   
                      
                    ret= self.metaDataHash.get(fieldNameTest,empty)  
                  
             return unicodify(ret)  
   
     getFieldValue=getMDValue #depricated  
   
     def newMetaXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,digiliburlprefix=None):  
             """new index.meta"""  
             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')  
   
             if not hasattr(self,'metaDataHash'):  
                   
                     self.copyIndex_meta2echo_resource()  
             try:  
   
   
                     return writeMetadata(self.metalink,self.OSAS_meta,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)  
             except:  
                     #print self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix  
   
                     return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)  
   
     def showMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):  
             """return bibliographical metadata as stored in the object"""  
               
             try:  
                       
                     return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,xmlfrag="yes")  
             except:  
                     return "<error> no metadata stored</error>"  
       
     def getXQueryMetaData(self,xquery):  
                 '''  
                 execute an xquery on the metadata and returns a list of tuples,   
                 each tuple represent the content of the node as text and the whole node as xml-fragment  
                 @param xquery: xquery auf den metadaten  
                 '''  
                   
                 try:  
                         md=writeMetadata(self.metalink,self.metaDataHash,xmlfrag="yes")  
                 except:  
                         return None  
   
                 dom = NonvalidatingReader.parseString(md,"http://www.mpiwg-berlin.mpg.de/")  
                   
                 results=Ft.Xml.XPath.Evaluate(xquery, contextNode=dom)  
               
                 ret=[]  
                 for result in results:  
                       
                     buf = cStringIO.StringIO()  
                     PrettyPrint(result, stream=buf)  
                     str = buf.getvalue()[0:]  
                     buf.close()  
                     ret.append((getTextFromNode(result),str))   
                           
                 return ret  
           
     def getMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):  
             """prints out metadata as stored in the echo environment, format is the index.meta format"""  
             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')  
             return writeMetadata(self.metalink,self.metaDataHash)  
   
     def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None):  
         """Aenderung der Properties"""  
           
         setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)  
         self.link=link  
         self.metalink=metalink  
           
         if RESPONSE is not None:  
             RESPONSE.redirect('manage_main')  
               
               
     manage_options = Folder.manage_options+(  
         {'label':'Main Config','action':'ECHO_resource_config_main'},  
         {'label':'Change Metadata','action':'ECHO_resource_config_metadata'},  
         {'label':'Graphic Coords','action':'ECHO_graphicEntry'},  
         {'label':'Sync Metadata','action':'ECHO_getResourceMD'},  
         {'label':'Change TemplateSets and Image Viewer','action':'changeViewerTemplateSetForm'},  
         {'label':'set/change startpage','action':'setStartPageForm'},  
         {'label':'Copy MD for indexing and search','action':'copySearchFields'},  
         {'label':'Change AccessRights','action':'changeAccessRightForm'},   
         )  
   
   
     def isDefinedInThisSet(self,fields,field):  
             """checks if field is defined in fields"""  
             if (fields[0].has_key(field)) and not (fields[0][field]==""):  
                     return 1  
             else:  
                     
                     return 0  
               
     def getFieldLabel(self,fields,field):  
         """get labels"""  
         try:  
             ret =fields[0][field]  
             if ret == "":  
                 return field  
             else:  
                 return ret  
         except:  
             return field  
   
   
   
     def getFieldTag(self,fields,field):  
         """get labels"""  
         try:  
             ret =fields[0][field]  
             if ret == "":  
                 return field  
             else:  
                 return ret  
         except:  
             return field  
   
       
   
     def getMetaDataHash(self):  
             """md hash"""  
             return self.metaDataHash  
       
     def setFieldValue(self,field,value):  
         """get value"""  
         #TODO: remove setFieldValue  
           
         if not hasattr(self,'metaDataHash'):  
                 setattr(self,'metaDataHash',{})  
         self.metaDataHash[field]=value[0:]  
   
     def copySearchFields(self):  
             """copys metadatafields to the object"""  
             fields=['author','title','year']  
               
             for field in fields:  
                     setattr(self,'MD_'+field,self.getMDValue(field,generic="yes"))  
       
   
     def findLabelsFromMapping(self,referenceType):  
         """gib hash mit label -> generic zurueck"""  
         #return {},[]  
   
         temp=self.ZopeFind(self.standardMD)  
   
         if referenceType=="":  
                 referenceType="book"  
           
           
         bibdata={}  
         retdata={}  
         fields=[]  
         fieldlist=self.standardMD.fieldList  
   
         tags=self.findTagsFromMapping(normalizeCt(self.contentType))  
         self.referencetypes=tags[2]  
         for referenceTypeF in self.referencetypes:  
                   
                   
                 if normalizeCt(referenceTypeF[1].title) == normalizeCt(referenceType.lower()):  
   
                         try:  
                                 bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields  
                                 referenceType=referenceTypeF[1].title  
                         except:  
                                 bibdata[referenceType]=referenceTypeF[1].fields  
                   
   
                         bibdata['data']=referenceTypeF[1]  
                         fields=bibdata[referenceType]  
                         for field in fieldlist:  
                             retdata[field]=referenceTypeF[1].getValue(field)[1]  
   
         return retdata,fieldlist,temp,fields  
   
     def findTagsFromMapping(self,referenceType):  
         """gib hash mit label -> generic zurueck"""  
           
   
         if referenceType=="":  
                 referenceType="book"  
           
         temp =  self.ZopeFind(self.standardMD)[0:]  
   
           
         #self.referencetypes=temp[0:]  
           
           
       
   
         bibdata={}  
         retdata={}  
         fieldlist=self.standardMD.fieldList  
         fields=[]  
         for referenceTypeF in temp:  
                 #print referenceType  
           
                 if normalizeCt(referenceTypeF[1].title) == normalizeCt(referenceType.lower()):  
                         try:  
                                 bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields  
                                 referenceType=referenceTypeF[1].title  
                         except:  
                                 bibdata[referenceType]=referenceTypeF[1].fields  
                         bibdata['data']=referenceTypeF[1]  
                         fields=bibdata[referenceType]  
                         for field in fieldlist:  
                             retdata[field]=referenceTypeF[1].getValue(field)[0]  
           
         return retdata,fieldlist,temp,fields  
   
       
     security.declarePublic('copyIndex_meta2echo_resource') # has to be change, presentlyset because of OSAS koordination  
     def copyIndex_meta2echo_resource(self,RESPONSE=None):  
             """copy MD von Index_meta to the echo_resource"""  
               
             (metadict, error)=readMetadata(self.metalink)  
   
   
               
             self.metaDataHash={}  
             if not error=="": #Fehler beim Auslesen des Metafiles  
                       
                     return "ERROR:",error,self.absolute_url()  
               
             self.contentType=normalizeCt(metadict['bib_type'])[0:]  
             fields=self.findTagsFromMapping(normalizeCt(self.contentType))  
               
             #fields=self.findLabelsFromMapping(normalizeCt(self.contentType))  
             for field in fields[1]:  
                       
                     if self.isDefinedInThisSet(fields,field):  
                             #print urllib.unquote(metadict.get(self.getFieldTag(fields,field),''))  
                             self.setFieldValue(self.getFieldTag(fields,field),metadict.get(self.getFieldTag(fields,field),''))  
   
               
               
             if RESPONSE:  
                     return RESPONSE.redirect('manage_main')  
               
             return "OK:",self.absolute_url(),normalizeCt(self.contentType)  
           
     def ECHO_getResourceMD(self,template="yes",back=None,overwrite="no"):  
         """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""  
         (metadict, error)=readMetadata(self.metalink)  
           
         if back:  
             self.REQUEST.SESSION['back']=back  
   
         if not error=="": #Fehler beim Auslesen des Metafiles  
                 return "ERROR:",error  
           
         if (not self.contentType) or (overwrite=="yes"):  
                 self.contentType=normalizeCt(normalizeCt(metadict['bib_type']).lower())  
                   
         if not (normalizeCt(metadict['bib_type']).lower()==normalizeCt(self.contentType).lower()):  
                 self.REQUEST.SESSION['contentStorage']=normalizeCt(metadict['bib_type'])  
                 self.REQUEST.SESSION['contentZope']=normalizeCt(self.contentType)  
   
                 return zptFile(self, 'zpt/ECHO_getResourceMDErrorContentType.zpt')()  
   
         #self.REQUEST.SESSION['metadict']=metadict  
           
           
           
   
         self.REQUEST.SESSION['diffs']=checkDiffs(self,metadict)  
   
   
         if template=="yes":  
                 #pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_resourceMD.zpt'),metadict=metadict).__of__(self)  
                 pt=zptFile(self, 'zpt/ECHO_resourceMD.zpt')  
                   
                 return pt(metadict=metadict)  
   
           
   
       
       
     def ECHO_getMD(self,item):  
         """Ausgabe der MD"""  
         return getattr(self,item)  
   
     def checkRDF(self,path):  
             """check if pdf in the path"""  
             try:  
                     for fileName in os.listdir(path):  
                             if os.path.splitext(fileName)[1]==".pdf":  
                                     return os.path.join(path,fileName)  
                     return None  
             except:  
                     return None  
               
               
     security.declareProtected('View','index_html')  
     def index_html(self):  
         """standard page"""  
         pdf=self.checkRDF(self.link)  
         if pdf:  
                 fh=file(pdf,'r').read()  
                 self.REQUEST.RESPONSE.setHeader('Content-Type','application/pdf')  
                 self.REQUEST.RESPONSE.write(fh)  
                 self.REQUEST.RESPONSE.close()  
                 return   
               
         if getattr(self,'newViewer',''): #benutze den neuen viewer  
             url=self.newViewer+'url='+self.metalink+"&mode=texttool"  
             return self.REQUEST.RESPONSE.redirect(url)  
               
         return self.REQUEST.RESPONSE.redirect(self.link)  
   
     def startpage_html(self):  
             """prints out a startpage for a resource for use e.g. in the BVE"""  
   
             # suche ob startpage.html in dem Ordner vorhanden ist, dann wir diese angezeigt  
   
             sp=self.ZopeFind(self,obj_ids=['startpage.html'])  
   
             if sp:  
                     return sp[1]()  
   
             #pruefen ob irgendwo ein template  
             if hasattr(self,'startpage_index_template'):   
                     return self.startpage_index_template()  
   
             #generisches template ausgeben  
               
             pt=zptFile(self, 'zpt/ECHO_startpage_index_template_standard.zpt')  
             pt.content_type="text/html"  
             return pt()  
   
     def toc_html(self):  
               
             sp=self.ZopeFind(self,obj_ids=['toc.html'])  
                       
             if sp:  
                     return sp[0][1]()  
   
   
     security.declarePublic('generate_label') # has to be change, presentlyset because of OSAS koordination  
   
     def generate_label(self):  
         """Erzeugt_standard_Label aus Template"""  
         pt=getattr(self,"label_template_"+normalizeCt(self.contentType).lower())  
   
         self.label=pt()[0:]  
         return pt()  
   
     security.declarePublic('generate_title') # has to be change, presentlyset because of OSAS koordination  
   
     def generate_title(self,RESPONSE=None):  
         """Erzeugt_standard_Label aus Template"""  
         pt=getattr(self,"label_template_"+normalizeCt(self.contentType).lower())  
   
         self.title=pt()[0:]  
           
         return pt()  
   
 Globals.InitializeClass(ECHO_resource)  
   
 def manage_addECHO_resourceForm(self):  
         """Form for adding a ressource"""  
         pt=zptFile(self, 'zpt/AddECHO_resourceForm.zpt')  
         return pt()  
   
   
   
 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):  
     """addresource"""  
   
     newObj=ECHO_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords)  
   
     self._setObject(id,newObj)  
   
     if RESPONSE is not None:  
         RESPONSE.redirect('manage_main')  
     
   
 class ECHO_externalLink(Folder,ECHO_basis):  class ECHO_externalLink(Folder,ECHO_basis):
Line 2035  class ECHO_collection(CatalogAware, Fold Line 697  class ECHO_collection(CatalogAware, Fold
     meta_type='ECHO_collection'      meta_type='ECHO_collection'
     default_catalog='resourceCatalog'      default_catalog='resourceCatalog'
           
       rootMetaTypes = ['ECHO_root', 'ECHO_main', 'ECHO_nav']
       
 #    viewClassificationList=viewClassificationListMaster  #    viewClassificationList=viewClassificationListMaster
     displayTypes=displayTypes      displayTypes=displayTypes
   
     path="/mpiwg/online/permanent/shipbuilding"      path="/mpiwg/online/permanent/shipbuilding"
   
       def getSection(self, crumbs=None):
           """returns the current section name"""
           # use breadcrumbs if available
           if crumbs is not None and len(crumbs) > 0:
               return crumbs[0][2].getId()
       
           p = self
           sec = None
           # descend parents to the root (and remember the last id)
           while p is not None and p.meta_type not in self.rootMetaTypes:
               sec = p.getId()
               p = aq_parent(p.context)
        
           return sec
       
       def getSubSection(self, crumbs=None):
           """returns the current subsection name"""
           # use breadcrumbs if available
           if crumbs is not None and len(crumbs) > 1:
               return crumbs[1][2].getId()
       
           p = self
           sec = None
           subsec = None
           # descend parents to the root (and remember the last id)
           while p is not None and p.meta_type not in self.rootMetaTypes:
               subsec = sec
               sec = p.getId()
               p = aq_parent(p.context)
             
           return subsec
       
       
       def getCrumb(self):
           """returns breadcrumb for this object"""
           return ECHO_helpers.getCrumb(self)
   
       def getHierCrumbs(self):
           """returns a list of hierarchical breadcrumbs from self to the ECHO_root"""
           return ECHO_helpers.getHierCrumbs(self)
   
           
     def exportImportObjects_html(self,RESPONSE):      def exportImportObjects_html(self,RESPONSE):
         """ImportObject"""          """ImportObject"""
Line 2061  class ECHO_collection(CatalogAware, Fold Line 766  class ECHO_collection(CatalogAware, Fold
         ret=None          ret=None
                   
         for name in zf.namelist():          for name in zf.namelist():
                fn=tempfile.mkstemp()[1]                 ds,fn=tempfile.mkstemp()
                tf=file(fn,"w")                 tf=file(fn,"w")
                x=zf.read(name)                 x=zf.read(name)
                tf.write(x)                 tf.write(x)
Line 2072  class ECHO_collection(CatalogAware, Fold Line 777  class ECHO_collection(CatalogAware, Fold
                    if not ret:                     if not ret:
                        ret=""                         ret=""
                    ret+="Cannot import: %s (Already existing?)<br>"%name                     ret+="Cannot import: %s (Already existing?)<br>"%name
              os.close(ds)
                os.remove(fn)                 os.remove(fn)
                   
           zf.close()
   
         if ret:          if ret:
             return """<html><body>%s</body></html>"""%ret              return """<html><body>%s</body></html>"""%ret
         if RESPONSE:          if RESPONSE:
Line 2192  class ECHO_collection(CatalogAware, Fold Line 900  class ECHO_collection(CatalogAware, Fold
             if not urn:              if not urn:
                     urn=self.absolute_url()                      urn=self.absolute_url()
                                           
             li="""<RDF:li RDF:resource="%s" />\n"""              li="""<rdf:li rdf:resource="%s" />\n"""
   
                           
             for content in contents:              for content in contents:
           try:
                     ret+=content[1].getRDF()+"\n"                      ret+=content[1].getRDF()+"\n"
                                       except:
             ret+="""<RDF:Seq RDF:about="%s">\n"""%urn              logging.error("getrdf: "+repr(content[1].getRDF()))
               try:
                   ret+=self.unicodify(content[1].getRDF())+"\n"
               except:
               logging.error("--still cannot do it")
                   ret+=repr(content[1].getRDF())+"\n"
               ret+="""<rdf:Seq rdf:about="%s">\n"""%urn
             for content in contents:              for content in contents:
                     nurn=content[1].absolute_url()                      nurn=content[1].absolute_url()
                     ret+=li%nurn                      ret+=li%nurn
             return ret+"</RDF:Seq>"              return ret+"</rdf:Seq>"
                           
   
           
Line 2332  class ECHO_collection(CatalogAware, Fold Line 1047  class ECHO_collection(CatalogAware, Fold
                             pass                              pass
             return ret              return ret
                 
     def importCollection(self,path=None,RESPONSE=None):      def importCollection(self,path=None,viewerUrl=None,metaDataUrl=None,replacePathPermanent=None,replacePathExperimental=None,RESPONSE=None):
         """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""          """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""
                   
         if path is None:          if path is None:
Line 2345  class ECHO_collection(CatalogAware, Fold Line 1060  class ECHO_collection(CatalogAware, Fold
                           
             if fileName:              if fileName:
                                   
                 tempPath=re.sub("/mpiwg/online","",path)                  if (replacePathExperimental and replacePathExperimental!=''):
                 link="http://echo.mpiwg-berlin.mpg.de/zogilib_book?fn="+tempPath+"/"+fileName+"/pageimg"                      path=re.sub(replacePathExperimental,"/mpiwg/online/experimental",path)
                      
                   if (replacePathPermanent and replacePathPermanent!=''):
                       path=re.sub(replacePathPermanent,"/mpiwg/online/permanent",path)
                                   
                 metalink=self.path+"/"+fileName+"/index.meta"                  link=viewerUrl%(path+"/"+fileName+"/pageimg")
                   
                   metalink=metaDataUrl+"/"+path+"/"+fileName+"/index.meta"
                 try:                  try:
   
                         #link="http://nausikaa2.mpiwg-berlin.mpg.de/cgi-bin/toc/toc.x.cgi?dir="+fileName+"&step=thumb"                          #link="http://nausikaa2.mpiwg-berlin.mpg.de/cgi-bin/toc/toc.x.cgi?dir="+fileName+"&step=thumb"
                                                   
                         newObj=ECHO_resource(fileName,link,metalink,fileName,fileName,fileName,'generated','book','','','','','','')                          newObj=ECHO_resource(fileName,link,metalink,fileName,fileName,fileName,'','book','','','','','','')
                         self._setObject(fileName,newObj)                          self._setObject(fileName,newObj)
                                   
                         genObj=getattr(self,fileName)                          genObj=getattr(self,fileName)
Line 2368  class ECHO_collection(CatalogAware, Fold Line 1088  class ECHO_collection(CatalogAware, Fold
         if RESPONSE is not None:          if RESPONSE is not None:
             RESPONSE.redirect('manage_main')              RESPONSE.redirect('manage_main')
   
     def changeViewerTemplateSetsForm(self):  
       def changeViewerForm(self):
             """change the viewer template set"""              """change the viewer template set"""
             pt=zptFile(self, 'zpt/changeViewerTemplateSet')              pt=zptFile(self, 'zpt/changeECHOViewer')
             return pt()              return pt()
   
     def getViewerTemplateSets(self,obj_ids=None,RESPONSE=None):  
             """Get the ViewerTemplateSet title for configuration"""  
             ret=[]  
               
             try:  
                     viewerTemplateSets=self.ZopeFind(self.viewerTemplateSets,obj_metatypes=['OSAS_viewerTemplateSet'],obj_ids=obj_ids)#assumes viewerTemplateSets folder somewhere in the hierarchie.  
               
                     for viewerTemplateSet in viewerTemplateSets:  
                             ret.append((viewerTemplateSet[1].title,viewerTemplateSet[0],viewerTemplateSet[1]))  
   
                     return ret  
                       
             except:  
                     return [('no ViewerTemplateSetfolders','')]  
   
     def getTextToolsField(self,name,default=''):      def getTextToolsField(self,name,default=''):
             """Lese viewerTemplateSet der Collection not implemented yet!"""              """Lese text tool field  der Collection not implemented yet!"""
                           
             return default              return default
   
                           
     def isSelectedViewerTemplateSet(self,obj,id):  
         """is ausgewaehlt"""  
           
         if self.REQUEST['viewerTemplateSet']==id:  
             return 1  
         else:  
             return None  
   
     def changeViewer(self,newViewer,REQUEST=None,RESPONSE=None):      def changeViewer(self,newViewer,REQUEST=None,RESPONSE=None):
         """changes all ressources to the newViewer"""          """changes all ressources to the newViewer"""
Line 2424  class ECHO_collection(CatalogAware, Fold Line 1123  class ECHO_collection(CatalogAware, Fold
         if RESPONSE is not None:          if RESPONSE is not None:
                     RESPONSE.write("<p>Done</p></body></html>")                      RESPONSE.write("<p>Done</p></body></html>")
   
     def changeViewerTemplateSets(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None):  
             """change the templates"""  
   
             resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)  
   
             for resource in resources:  
   
                     resource[1].changeViewerTemplateSet(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix)  
   
             if RESPONSE is not None:  
                     RESPONSE.redirect('manage_main')  
   
   
     def setStartpageFolderForm(self):  
             """Form for changing the startpage"""  
   
               
             pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPageFolder.zpt')  
             pt.content_type="text/html"  
             return pt()  
       
     def setStartpageFolder(self,startpage=None,RESPONSE=None):  
             """change the templates"""  
   
             resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)  
   
             for resource in resources:  
   
                     resource[1].setStartPage(startpage)  
   
             if RESPONSE is not None:  
                     RESPONSE.redirect('manage_main')  
   
     def copyTitleToInfoXMLFolder(self,RESPONSE=None):      def copyTitleToInfoXMLFolder(self,RESPONSE=None):
             """copy title into the title field of info.xml              """copy title into the title field of info.xml
Line 2490  class ECHO_collection(CatalogAware, Fold Line 1158  class ECHO_collection(CatalogAware, Fold
             if RESPONSE is not None:              if RESPONSE is not None:
                     RESPONSE.redirect('manage_main')                      RESPONSE.redirect('manage_main')
                                           
     def reloadMetaDataFromStorageWarning(self,RESPONSE=None):  
             """warning"""  
             pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt')  
             pt.content_type="text/html"  
             return pt()  
   
     def reloadMetaDataFromStorage(self,RESPONSE=None):  
             """copy metadata from the storage to ECHO"""  
   
             return reloadMetaDataFromStorage(self,RESPONSE)  
   
           
     def getPartnerCopyright(self,name,sonst="generic"):      def getPartnerCopyright(self,name,sonst="generic"):
Line 2591  class ECHO_collection(CatalogAware, Fold Line 1249  class ECHO_collection(CatalogAware, Fold
             manage_addECHO_resource(self,id,title,label,description,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None)              manage_addECHO_resource(self,id,title,label,description,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None)
             return "done"              return "done"
         except:          except:
               logging.error("ECHOcollection: (AddResource): %s %s"%sys.exc_info()[0:2])
             return None              return None
   
       def addResourceAndCreateLabelAndTitle(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None):
           """SSS"""
           ret = self.addResource(id,title,label,description,contentType,responsible,link,metalink,weight,credits,coords,RESPONSE)
           if ret is None:
               return None
           
           try:
               server2=getattr(self,id)
               server2.copyIndex_meta2echo_resource()
               server2.generate_label()
               server2.generate_title()
           except:
                 logging.error("An Error occured adding the resource A\n %s %s"%sys.exc_info()[0:2])
                 return None
           return "done"
     def getSecondaryLink(self):      def getSecondaryLink(self):
         """secondary link"""          """secondary link"""
         try:          try:
Line 2717  class ECHO_collection(CatalogAware, Fold Line 1391  class ECHO_collection(CatalogAware, Fold
         {'label':'Export/Import Objects','action':'exportImportObjects_html'},          {'label':'Export/Import Objects','action':'exportImportObjects_html'},
         {'label':'Graphic Coords','action':'ECHO_graphicEntry'},          {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
         {'label':'create resources from XML','action':'createRessourcesFromXMLForm'},          {'label':'create resources from XML','action':'createRessourcesFromXMLForm'},
         {'label':'Set Startpage','action':'setStartpageFolderForm'},          {'label':'Change Image Viewer','action':'changeViewerForm'},
         {'label':'Change Viewer Templates and Image Viewer','action':'changeViewerTemplateSetsForm'},  
         {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},  
         {'label':'ImportCollection','action':'importCollection'},          {'label':'ImportCollection','action':'importCollection'},
         {'label':'Copy MD for indexing and search','action':'copySearchFields'},  
         {'label':'Change access rights',  'action':'changeAccessRightsCollectionForm'},          {'label':'Change access rights',  'action':'changeAccessRightsCollectionForm'},
         )          )
   
Line 2736  class ECHO_collection(CatalogAware, Fold Line 1407  class ECHO_collection(CatalogAware, Fold
         if not hasattr(self,'sortfield'):          if not hasattr(self,'sortfield'):
             self.sortfield="weight"              self.sortfield="weight"
       
         pt=zptFile(self, 'zpt/ChangeECHO_collection.zpt')          pt=zptFile(self, 'zpt/ChangeECHO_Collection.zpt')
         return pt()          return pt()
   
   
Line 2780  class ECHO_collection(CatalogAware, Fold Line 1451  class ECHO_collection(CatalogAware, Fold
           
     def showOverview(self):      def showOverview(self):
         """overview"""          """overview"""
         if 'ECHO_overview.html' in self.__dict__.keys():          # use ECHO_overview.html template in this instance
             return getattr(self,'ECHO_overview.html')()          if 'ECHO_overview.html' in self:
               return self['ECHO_overview.html']()
           
           # use ECHO_overview_main template in path
           if hasattr(self, 'ECHO_overview_main'):
               return getattr(self, 'ECHO_overview_main')()
           
           # use template from Product
         pt=zptFile(self, 'zpt/ECHO_content_overview.zpt')          pt=zptFile(self, 'zpt/ECHO_content_overview.zpt')
         return pt()          return pt()
   
Line 2790  class ECHO_collection(CatalogAware, Fold Line 1468  class ECHO_collection(CatalogAware, Fold
     def index_html(self):      def index_html(self):
         """standard page"""          """standard page"""
         if self.ZCacheable_isCachingEnabled():          if self.ZCacheable_isCachingEnabled():
               
             result = self.ZCacheable_get()              result = self.ZCacheable_get()
             if result is not None:              if result is not None:
                 # Got a cached value.                  # Got a cached value.
                 return result                  return result
                   
         if 'index.html' in self.__dict__.keys():          # old Zope 2.9 method
             ret=getattr(self,'index.html')()          #if 'index.html' in self.__dict__.keys():
           #    ret=getattr(self,'index.html')()
   
           # use Zope 2.12 IContainer for child access
           if 'index.html' in self:
               # use index.html template if it exists
               ret = self['index.html']()
                   
         elif 'overview' in self.__dict__.keys():          elif 'overview' in self:
               # use red-rectangle template when there's an 'overview'
             ret=self.showOverview()              ret=self.showOverview()
   
           # use getattr for acquisition
         elif hasattr(self,'collection_index_template'):          elif hasattr(self,'collection_index_template'):
               # use 'collection_index_template' in acquisition path
             ret=self.collection_index_template()                  ret=self.collection_index_template()    
         elif hasattr(self,'main_index_template'):  
   
           elif hasattr(self,'main_index_template'):
               # use 'main_index_template' in acquisition path
             ret=self.main_index_template.__of__(self)(self.main_template)              ret=self.main_index_template.__of__(self)(self.main_template)
               
         else:          else:
               # use template from Product
             pt=zptFile(self, 'zpt/ECHO_main_index_template_standard.zpt')              pt=zptFile(self, 'zpt/ECHO_main_index_template_standard.zpt')
             pt.content_type="text/html"              pt.content_type="text/html"
             ret=pt.render()              ret=pt.render()
Line 2835  class ECHO_collection(CatalogAware, Fold Line 1525  class ECHO_collection(CatalogAware, Fold
   
     def area_img(self):      def area_img(self):
         """area image"""          """area image"""
         bt = BrowserCheck(self)          bt = browserType(self)
         if bt.isIE or bt.isN4:          if bt['isIE'] or bt['isN4']:
             return sendFile(self, 'images/red.gif', 'image/gif')              return sendFile(self, 'images/red.gif', 'image/gif')
         else:          else:
             return sendFile(self, 'images/reda.png', 'image/png')              return sendFile(self, 'images/reda.png', 'image/png')
Line 2934  class ECHO_group(ECHO_collection): Line 1624  class ECHO_group(ECHO_collection):
                           
             if not urn:              if not urn:
                     urn=self.absolute_url()                      urn=self.absolute_url()
             li="""<RDF:li RDF:resource="%s" />\n"""              li="""<rdf:li rdf:resource="%s" />\n"""
                           
                           
             for content in contents:              for content in contents:
                     ret+=content[1].getRDF()+"\n"                      ret+=self.unicodify(content[1].getRDF())+"\n"
                                           
             ret+="""<RDF:Seq RDF:about="%s">\n"""%urn              ret+="""<rdf:Seq rdf:about="%s">\n"""%urn
             for content in contents:              for content in contents:
                     nurn=content[1].absolute_url()                      nurn=content[1].absolute_url()
                     ret+=li%nurn                      ret+=li%nurn
             return ret+"</RDF:Seq>"              return ret+"</rdf:Seq>"
                           
         def index_html(self):          def index_html(self):
                 """standard page"""                  """standard page"""
Line 3128  class ECHO_userFolder(UserFolder): Line 1818  class ECHO_userFolder(UserFolder):
                         return 1                          return 1
             return 0              return 0
   
 Globals.default__class_init__(ECHO_userFolder)  # ROC: problem with 2.12
   #Globals.default__class_init__(ECHO_userFolder)
   
   
   
Line 3183  def createNode(self,descrs,node): Line 1874  def createNode(self,descrs,node):
         return "XX"          return "XX"
   
   
 class ECHO_root(Folder,Persistent,Implicit):  
     """ECHO Root Folder"""  
   
     security=ClassSecurityInfo()  
       
     meta_type="ECHO_root"  
     management_page_charset="utf-8"  
       
     getSubCols = ECHO_helpers.getSubCols  
   
     manage_options=Folder.manage_options+(  
                 {'label':'Main Config','action':'ECHO_copyright_configForm'},  
                 {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},  
                 {'label':'Change Weights','action':'changeWeights'},  
                 {'label':'Generate from RDF','action':'generateFromRDFForm'},  
                 {'label':'update Resource Catalog','action':'updateResourceCatalog'},  
                 {'label':'Copy MD for indexing and search','action':'copySearchFields'},  
 )  
   
   
     def copySearchFields(self,RESPONSE=None):  
             """copys < metadatafields to the object"""  
             resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)  
   
             for resource in resources:  
   
                     resource[1].copySearchFields()  
   
             if RESPONSE is not None:  
                     RESPONSE.redirect('manage_main')  
      
     def mod_re_sub(self,pattern,replace,string):  
         """re.sub aus mod re zur Verfuegung stellen"""  
         return re.sub(pattern,replace,string)  
       
     def findObjectFromFulltext(self,existUri):  
         '''  
           
         @param url:  
         @param existUri:  
         '''  
   
         if existUri:  
             #TODO: at the moment assume that the filename is unique, the whole has to changed to a system of ids.  
             filename=existUri.split("/")[-1]  
           
         founds=self.resourceCatalog.search({'fullTextUrl':os.path.splitext(filename)[0]})    
           
         ret=[(found.title,found.getObject().absolute_url(),found.getObject().aq_parent.absolute_url()) for found in founds]  
           
         return ret  
           
     def reindex(self,RESPONSE=None):  
         """indiziere alle Objecte neu"""  
           
         if RESPONSE:  
             RESPONSE.write("<html><body>")  
           
         resources=self.ZopeFind(self,obj_metatypes=["ECHO_resource"], search_sub=1)  
           
         for resource in resources:  
             resource[1].reindex()  
             #print "<p> done %s </p>\n"  
             if RESPONSE:  
                 RESPONSE.write("<p> done %s </p>\n"%resource[0])  
                   
         if RESPONSE:  
             RESPONSE.write("<p> ok </p></html></body>\n")  
               
   
     def setLanguage(self,lang):  
             """Set language cookie"""  
             self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")  
   
     def switchLanguage(self):  
             """Set language cookie"""  
             if self.getLanguage()=="en":  
                     lang="de"  
             else:  
                     lang="en"  
               
             self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")  
             self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1'])  
               
     def getLanguage(self):  
             """get language cookie"""  
             lang= self.REQUEST.cookies.get('lang_exhibition','de')  
             if lang == '':  
                     lang="de"  
             return lang  
       
     def getContentOverviewTemplate(self):  
         """produces overview template with macro"""  
         pt = zptObjectOrFile(self, 'content_overview_template')  
         return pt  
   
     def mapstyle_css(self):  
         """send mapstyle.css"""  
         sendFile(self, 'html/ECHO_mapstyle.css', 'text/css')  
   
   
     ###Cdli adds -> have to be removed  
     def getTablet(self,item):  
         #print "getTablet"  
         try:  
                 read=urllib.urlopen("http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"%item).read()  
                 read=re.sub("\[search\]","search",read)  
                 return read[read.find("<body>")+6:read.rfind("</body>")]  
         except:  
                 return "<h1>Sorry no connection to the data server enlil.museum.upenn.edu</h1>"  
         #return "http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"  
     ###END CDLI add  
   
   
     def URLquote(self, text):  
         """urllib.quote fuer Michael"""  
         return urllib.quote(text)  
   
   
     def checkResource(self,id):  
             """checks if a resource is in the tree, gives back none or list of resources"""  
             if not id:  
                 id=""  
             splitted=id.split("/")  
             id=splitted[len(splitted)-1]  
             if hasattr(self,"_v_checkResource") and self._v_checkResource.has_key(id): #existiert ein cache und id ist bereits drin?  
                             return self._v_checkResource[id]  
   
             else:  
                     resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],obj_ids=[id],search_sub=1)  
   
                     if not hasattr(self,"_v_checkResource"): self._v_checkResource={}#lege cache an falls nicht existent  
                     if resources:  
                             self._v_checkResource[id]=resources[0:] # slicing to be sure that data is stabil  
                     else:  
                             self._v_checkResource[id]=None  
                       
                     return self._v_checkResource[id]  
               
     def sendForm(self,fromaddr,content,server='mail.mpiwg-berlin.mpg.de'):  
             """sendform"""  
             toaddrs=["dwinter@mpiwg-berlin.mpg.de"]  
               
             msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"  
                    % (fromaddr, ", ".join(toaddrs),"testsub"))  
             server = smtplib.SMTP(server)  
             #server.set_debuglevel(1)  
             msg=msg+content  
             server.sendmail(fromaddr, toaddrs, msg)  
             server.quit()  
                    
     def generateFromRDFForm(self):  
                 """change form"""  
                 pt=zptFile(self, 'zpt/generateFromRDFForm')  
                 pt.content_type="text/html"  
                 return pt()  
   
     def generateFromRDF(self,file,startNode="/Cuneiform Corpus"):  
   
             """generate from RDF"""  
   
             global seqs  
             seqs={}  
             global descrs  
             descrs={}  
             global key  
             key=""  
             global value  
             value=""  
   
             def getEdges(seqs,urn):  
                     """edges"""  
                     ret=[]  
                     return seqs[urn]  
   
             def createSubs(self,seqs,descrs,urn,level=0):  
                     """create subs"""  
                     for edge in getEdges(seqs,urn):  
                             cn=createNode(self,descrs,edge)  
                             if cn[0]=="CDLI_group":  
                                     createSubs(cn[1],seqs,descrs,cn[2],level+1)  
                     return  
   
             def start_element(name,attrs):  
   
                     global seqs  
                     global descrs  
                     global key  
                     global value  
                     seq=""  
                     if name=="RDF:Seq":  
                             key=attrs.get('RDF:about')  
                             try: # teste ob liste  
                                     x=seqs[key][0]  
                             except:  
   
                                     seqs[key]=[]  
   
                       
                     elif name=="RDF:Description":  
                             key=attrs.get('RDF:about')  
                               
   
                     elif name=="RDF:li":  
                             name=attrs.get('RDF:resource')  
                             seqs[key].append(name)  
   
                     elif name=="ECHONAVIGATION:type":  
                             value="type"  
   
                     elif name=="ECHONAVIGATION:name":  
                             value="name"  
                     elif name=="ECHONAVIGATION:linkClickable":  
                             value="linkClickable"  
                               
             def end_element(name):  
                             """nothing"""  
                             key=""  
                             value=""  
   
             def char_data(data):  
                     """nothing"""  
   
                     data=re.sub("\n","",data)  
                     try:  
                             if descrs[key].has_key(value):  
                                     descrs[key][value]+=data  
                             else:  
                                     descrs[key][value]=data  
                     except:  
   
                             descrs[key]={}  
                             descrs[key][value]=data  
                               
             p = xml.parsers.expat.ParserCreate()  
               
             p.StartElementHandler = start_element  
             p.EndElementHandler = end_element  
             p.CharacterDataHandler = char_data  
               
               
             p.ParseFile(file)  
             self.REQUEST.RESPONSE.write("<html><body><h1>Start</h1>")  
             createSubs(self,seqs,descrs,startNode)  
             self.REQUEST.RESPONSE.write("<h1>done</h1></body></html>")  
             #print "done"  
   
               
             return "done"  
       
               
   
                   
     def changeWeightsInCollection(self):  
             """change all lables of a collection"""  
             ret=""  
             argv=self.REQUEST.form  
               
             resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])  
             for resource in resources:  
                      
                     try:  
                             ret+=resource[1].getId()+"   "+argv[resource[1].getId()]+"</br>"  
                             resource[1].weight=argv[resource[1].getId()][0:]  
                     except:  
                             pass  
             return ret  
   
     def changeWeights(self):  
                 """change form"""  
                 pt=zptFile(self, 'zpt/changeWeightForm')  
                 pt.content_type="text/html"  
                 return pt()  
     
   
     def reloadMetaDataFromStorageWarning(self,RESPONSE=None):  
             """warning"""  
             pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt')  
             pt.content_type="text/html"  
             return pt()  
   
     def reloadMetaDataFromStorage(self,RESPONSE=None):  
             """reload MD from Storage"""  
   
             return reloadMetaDataFromStorage(self,RESPONSE)  
       
     def getRDF(self,urn=None):  
             """rdf of the collection"""  
   
             contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])  
   
             ret=getRDFDescription(self,self.absolute_url(),urn=urn)  
               
             li="""<RDF:li RDF:resource="%s" />\n"""  
   
               
             for content in contents:  
                     ret+=content[1].getRDF()+"\n"  
                       
             ret+="""<RDF:Seq RDF:about="%s">\n"""%urn  
             for content in contents:  
                     nurn=content[1].absolute_url()  
                     ret+=li%nurn  
             return ret+"</RDF:Seq>"  
               
   
     def showContent(self,path):  
             """return content/html"""  
               
             return ECHO_helpers.urlopen(path+"/content_html").read()  
       
     def getImageViewers(self):  
         """images"""  
         viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject'])  
         return viewers  
       
   
     def getBibTag(self,tag,content):  
             """get field tag for index-meta-generation"""  
             if not content or content=="":  
                     return ""  
             ret="<%s>"%tag  
             #ret+=urllib.quote(content)  
             ret+=content  
   
             ret+="</%s>"%tag  
             return ret  
   
     def getValueFromClass(self,field,found):  
             """ret attribute if existing"""  
             try:  
                       
                     return getattr(found,field).decode('ascii','ignore')  
             except:  
                     return ""  
   
     security.declarePublic('getImageTag')  
     def getImageTag(self):  
             """needed by main_template"""  
             return ""  
           
     secondaryLink="" #needed by main_template  
     secondaryLinkTitle="" #needed by main_template  
       
     def getBgcolour(self):  
         """hack"""  
         return "#dddddd"  
   
     security.declareProtected('View','contentTypeSelector_HTML')  
     def contentTypeSelector_HTML(self,selected=None):  
         """give type selector"""  
         if not selected:  
             retStr="<option selected>\n"  
         else:  
             retStr="<option>\n"  
               
         try: # erste version contentTypes exists  
             for contentType in self.ZopeFind(self.contentTypes,obj_metatypes=["ECHO_contentType","OSAS_MetadataMapping"]):  
                 if selected and (contentType[0]==selected):  
                     retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])  
                 else:                  
                     retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])  
         except:  
                 try:  
                         for contentType in self.ZopeFind(self.standardMD,obj_metatypes=["OSAS_MetadataMapping"]):  
                                 if selected and (contentType[0]==selected):  
                                         retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])  
                                 else:                  
                                         retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])  
                 except:  
                         """nothing"""  
                               
         return retStr  
   
     def renderingTypeSelector_HTML(self,selected=None):  
          """give type selector"""  
          if not selected:  
                  retStr="<option selected>\n"  
          else:  
                  retStr="<option>\n"  
                    
          try: # erste version renderingTypes exists  
                  for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):  
                          if selected and (renderingType[0]==selected):  
                                  retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])  
                          else:                  
                                  retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])  
          except:  
                  """nothing"""  
          return retStr  
   
   
     def copyrightTypeSelector_HTML(self, object=None, selected=None,first=None):  
          """give type selector"""  
   
          if not first:  
                  if not selected:  
                          retStr="<option selected>\n"  
                  else:  
                          retStr="<option>\n"  
          else:  
                  if not selected:  
                          retStr="""<option selected value="%s">%s\n"""%first  
                  else:  
                          retStr="""<option value="%s">%s\n"""%first  
   
            
          try: # erste version copyrightTypes exists  
                  for copyrightType in self.ZopeFind(self.copyrightTypes,obj_metatypes=["ECHO_copyrightType"]):  
                          if selected and (copyrightType[0]==selected):  
                                  retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])  
                          else:                  
                                  retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])  
                    
                  for copyrightTypeSelf in self.ZopeFind(object,obj_metatypes=["ECHO_copyrightType"],search_sub=1):  
                          if selected and (copyrightTypeSelf[0]==selected):  
                                  retStr+="""<option selected value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])  
                          else:                  
                                  retStr+="""<option value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])  
                                    
          except:  
              """nothing"""  
                    
          return retStr  
   
     def partnerSelector_HTML(self,selected=None):  
          """give type selector"""  
          if not selected:  
                  retStr="<option selected>\n"  
          else:  
                  retStr="<option>\n"  
                    
          try: # erste version copyrightTypes exists  
                  for copyrightType in self.ZopeFind(self.partners,obj_metatypes=["ECHO_partner"]):  
                          if selected and (copyrightType[0]==selected):  
                                  retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])  
                          else:                  
                                  retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])  
          except:  
                  """nothing"""  
          return retStr  
    
     mediaTypes=['all','text','images','sound','video'] # konfigurierbar in neuer version ueber echoroot??  
   
     def mediaTypeSelector_HTML(self,selected=None):  
          """give type selector"""  
          if not selected:  
                  retStr="<option selected>\n"  
          else:  
                  retStr="<option>\n"  
            
          try: # erste version mediatypesTypes exists  
                  for mediaType in self.mediaTypes:  
                          if selected and (mediaType in selected):  
                                  retStr+="""<option selected value="%s">%s\n"""%(mediaType,mediaType)  
                          else:                  
                                  retStr+="""<option value="%s">%s\n"""%(mediaType,mediaType)  
          except:  
                  """nothing"""  
          return retStr  
   
               
     def patchContentType(self,obj=None):  
         """austauschen content_type with contentType (patch bei umstieg von alter Version)"""  
       
   
         if not obj:  
             obj = self  
               
         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate'])  
   
         for entry in entries:  
                 setattr(entry[1],'contentType',entry[1].content_type)  
                 #entry[1].contentType == entry[1].content_type  
   
                 if entry[1].meta_type == 'ECHO_collection':  
                     entry[1].patchContentType(entry[1])      
   
                   
         return "changed all contenttypes in: "+self.title  
   
   
     def repairAllCoords(self):  
         """updates map coordinates on the same and sublevels"""  
         return repairCoords(self)  
   
   
     def patchViewClassification(self,obj=None):  
         """setze viewClassification heuristisch"""  
   
         def checkIfArrow(obj):  
                 if hasattr(obj,'coords'):  
                         for coordtemp in obj.coords:  
   
                                 if (len(coordtemp)>4) and not (coordtemp[4]==''):  
                                         return 4  
                         return None  
                 return None  
           
         if not obj:  
             obj = self  
               
         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_group'])  
   
         for entry in entries:  
                   
                 if checkIfArrow(entry[1]):  
                         setattr(entry[1],'viewClassification','view point')  
                 else:  
                         setattr(entry[1],'viewClassification','area')  
   
                 #entry[1].contentType == entry[1].content_type  
   
                 if entry[1].meta_type in ['ECHO_collection','ECHO_group']:  
                     entry[1].patchViewClassification(entry[1])      
   
                   
         return "changed all contenttypes in: "+self.title  
   
     def deleteCache(self,obj=None,RESPONSE=None):  
         """setze alle collections auf cache = CacheManager"""  
         if not obj:  
             obj = self  
         entries=obj.ZopeFind(obj,search_sub=1)  
         for entry in entries:  
                 if hasattr(entry[1],'_v_hash'):  
                         entry[1]._v_hash=None  
           
         return "changed all CM in: "+self.title  
   
       
     security.declarePublic('ECHO_newViewerLink')  
     def ECHO_newViewerLink(self,obj=None):  
         """change links (:86 faellt weg)"""  
   
         if not obj:  
             obj = self  
               
         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])  
   
         for entry in entries:  
                   
                 if entry[1].meta_type == 'ECHO_resource':  
                       
                     entry[1].link=re.sub('\:86','',entry[1].link)  
   
                 else:  
                       
                     entry[1].ECHO_newViewerLink(entry[1])  
                   
         return "Rerenderd all links to resources in: "+self.title  
   
     def __init__(self,id,title):  
         """init"""  
         self.id = id  
         self.title=title  
   
     def deleteSpace(self,str):  
         """delete space at the end of a line"""  
         if str[len(str)-1]==" ":  
             return str[0:len(str)-1]  
         else:  
             return str  
           
       
   
     # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt  
   
     def formatAscii(self,str,url=None):  
         """ersetze ascii umbrueche durch <br>"""  
   
     if not str:   
             return ""  
   
         if url:  
               
             retStr=""  
             words=str.split("\n")  
               
             for word in words:  
                 strUrl=url%word  
   
                 retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)  
             str=retStr  
         if str:  
             str = re.sub(r"[\n]","<br/>",str)  
             return unicodify(str)  
         else:  
             return u""  
           
     link2html=vlp_xmlhelpers.link2html  
     related2html=vlp_xmlhelpers.related2html  
   
     xml2html=vlp_xmlhelpers.xml2html  
    
     checkRef=vlp_xmlhelpers.checkRef  
       
 #    def checkRef(self,ref):  
 #            if ref[0:3]=='lit':  
 #                    if len(self.library_data({ 'id':ref}))>0:  
 #                            return 1  
 #            try:  
 #                    if ref[0:7]=="tec_cat":  
 #                            return 1  
 #            except:  
 #                    """nothing"""  
 #                      
 #            dbs={'vl_technology':'','vl_people':" AND complete='yes'",'vl_sites':''}  
 #            res=None  
 #            for db in dbs.keys():  
 #                    res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))  
 #            return res  
 #                                      
 #    #Ende Methode fuer vlp  
   
     def PgQuoteString(self,string):  
         """Quote string"""  
   
         return libpq.PgQuoteString(string)  
   
     security.declareProtected('View','getPartners')  
     def getPartners(self):  
         """Get list of Partners. Presently only from a subfolder partners"""  
         if hasattr(self,'partners'):              
                 ret = [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])]  
                 def sort_title(one, another) : return cmp(one.title, another.title)  
                 ret.sort(sort_title)  
                 return ret  
         else:  
                 return []  
     
     def getInstitutions(self):  
         """Get list of Partners. Presently only from a subfolder partners"""  
                       
         return [ item[1] for item in self.institutions.ZopeFind(self.institutions,obj_metatypes=['ECHO_institution'])]  
   
      
     def getPartnersXML(self):  
         """partner liste als xml"""   
         partners=self.getPartners()  
         ret="""<?xml version="1.0" encoding="utf-8" ?>  
         <partners>"""  
           
         for partner in partners:  
             ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),partner.title)  
   
         return ret+"\n</partners>"  
       
     def getCollectionTree(self):  
         """get the collection tree (list of triples (parent,child, depth)"""  
   
         def getCollection(object,depth=0):  
             depth+=1  
             collections=[]  
             for entry in object.__dict__.keys():  
                 element=getattr(object,entry)  
                 try:  
                     if element.meta_type=="ECHO_collection":  
                         collections.append((object,element,depth))  
                         collections+=getCollection(element,depth)  
                 except:  
                     """nothing"""  
             return collections  
           
   
         return getCollection(self)  
       
     def getCollectionTreeIds(self):  
         """Show the IDs of the Tree"""  
         ret=[]  
         for collection in self.getCollectionTree():  
             ret.append((collection[0].getId(),collection[1].getId(),collection[2]))  
         return ret  
   
     def getResourcesHTML(self,viewerType=None,filter=None):  
             """gebe all ressourcen aus"""  
   
             def sortHTML(x,y):  
                     return cmp(x[1].title,y[1].title)  
               
             ret="""<html><body><h2>Resources in ECHO</h3>"""  
               
             resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)  
             ret+="""<h3>Found %i resources</h3>"""%len(resources)  
             resources.sort(sortHTML)  
             for resource in resources:  
                     echo_url=resource[1].absolute_url()  
                       
                     if hasattr(resource[1],'title'):  
                             title=resource[1].title  
                     else:  
                             title="None"  
                     if filter:  
                             if re.search(filter,title):  
                                     ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)  
                     else:  
                             ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)  
   
             ret +="""\n</body></html>"""  
               
             #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html")  
             #self.REQUEST.RESPONSE.write(ret)  
             return ret  
       
     def getResourcesXML(self,viewerType=None,filter=None):  
             """gebe all ressourcen aus"""  
             ret="""<?xml version="1.0" ?>  
                      <index>"""  
             for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):  
   
                     echo_url=resource[1].absolute_url()  
                     if hasattr(resource[1],'link'):  
                             viewer_url=resource[1].link  
                     else:  
                             viewer_url="NO URL"  
                     if filter:  
                             if re.search(filter,viewer_url):  
                                     ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))  
                     else:  
                             ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))  
             ret +="""\n</index>"""  
               
             self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")  
             self.REQUEST.RESPONSE.write(ret)  
   
     def getFullTextsXML(self,viewerType=None,filter=None):  
             """gebe all ressourcen aus"""  
             ret="""<?xml version="1.0" ?>  
                      <index>"""  
             for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):  
   
                     echo_url=resource[1].absolute_url()  
                     if resource[1].getFullTextXML(noredirect="yes"):  
                             if hasattr(resource[1],'link'):  
                                     viewer_url=echo_url+"/getFullTextXML"  
                             else:  
                                     viewer_url="NO URL"  
                             if filter:  
                                     if re.search(filter,viewer_url):  
                                             ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))  
                             else:  
                                     ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))  
             ret +="""\n</index>"""  
               
               
             self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")  
             self.REQUEST.RESPONSE.write(ret)  
   
   
     def getMetaDatasXML(self,viewerType=None,filter=None):  
             """gebe all ressourcen aus"""  
             # check if the request's host part was OK  
             http_host = self.REQUEST['HTTP_HOST']  
             host_port = self.REQUEST['SERVER_PORT']  
             fix_host = None  
             if http_host and http_host.rfind(host_port) == -1:  
                     print "HTTP_HOST needs fixing!"  
                     fix_host = http_host + ":" + host_port  
   
             ret="""<?xml version="1.0" ?>  
                      <index>"""  
             for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):  
   
                     echo_url=resource[1].absolute_url()  
                     if fix_host:  
                             #print "replacing ", http_host, " by ", fix_host  
                             echo_url = string.replace(echo_url, http_host, fix_host, 1)  
                       
                     if hasattr(resource[1],'link'):  
                             meta_url=echo_url+"/getMetaDataXML"  
                     else:  
                             meta_url="NO_URL"  
                               
                     if filter and not re.search(filter,viewer_url):  
                             continue  
   
                     #modificationDate=time.strptime(str(resource[1].bobobase_modification_time()),"%Y/%m/%d %H:%M:%S %Z")  
                       
                     modificationDate=resource[1].bobobase_modification_time().strftime("%Y/%m/%d %H:%M:%S")  
   
                     ret+="""\n<resource resourceLink="%s" metaLink="%s" modificationDate="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(meta_url,safe='/:?'),modificationDate)  
                       
                               
             ret +="""\n</index>"""  
   
             self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")  
             self.REQUEST.RESPONSE.write(ret)  
   
               
     def findPartners(self):       
         """find all partners in partners"""  
         par=self.ZopeFind(self.partners, obj_metatypes='ECHO_partner')  
         return par  
           
     def getPartnerFromID(self):  
         """find partner form ID return object"""  
         pa=self.REQUEST['partner']  
         par=self.ZopeFind(self.partners, obj_ids=[pa])  
         return par  
           
     def getPartnerFromIDParameter(self, id):  
         """ find partners from ID"""  
         par=self.ZopeFind(self.partners, obj_ids=[id])  
         return par  
           
     def getInstitutionFromID(self,id):  
         """ find institution from id """  
         inst=self.ZopeFind(self.institutions, obj_ids=[id])  
         return inst  
   
     def updateResourceCatalog(self,REQUEST,RESPONSE):  
         """update ressource catalog"""  
         catalog=getattr(self,'resourceCatalog',None)  
         if not catalog:  
             return """<html><body><h3>No resourceCatalog available</h3></body></html>"""  
           
         else:  
             class element:  
                 def __init__(self,group,name):  
                     self.group=group  
                     self.name=name  
             catalog.manage_delObjects('author splitter')  
             #elements=[element('Stop Words',""" Don't remove stop words' """),element('Word Splitter','ECHO author splitter')]  
             elements=[element('Word Splitter','ECHO author splitter')]  
             manage_addLexicon(catalog,id="author splitter",elements=elements)  
               
             return catalog.manage_catalogReindex(REQUEST,RESPONSE,'manage_main')  
               
           
     def checkMetaDataLinks(self,correct=None):  
         """check all metadatalinks and if correct is set change the servername to content.mpiwg-berlin.mpg.de"""  
           
         self.REQUEST.RESPONSE.write("<html><body>")  
         for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):  
             metalink=resource[1].metalink  
           
             try:  
                 url=urllib.urlopen(metalink)  
             except:  
                   
                 self.REQUEST.RESPONSE.write("<p>ERROR (opening %s):"%resource[1].absolute_url() +" -- %s %s <br>"%sys.exc_info()[0:2])  
                 self.REQUEST.RESPONSE.write("-----------%s"%metalink)  
               
                 if correct:  
                     urlparsed=[x for x in urlparse.urlparse(metalink)]  
                     urlparsed[1]="content.mpiwg-berlin.mpg.de"  
                     neu=urlparse.urlunparse(urlparsed)  
                     resource[1].metalink=neu[0:]  
                     self.REQUEST.RESPONSE.write("----------changed to:%s)"%neu)  
                                   
 def manage_addECHO_root(self,id,title,RESPONSE=None):  
     """Add an ECHO_root"""  
     self._setObject(id,ECHO_root(id,title))  
       
     if RESPONSE is not None:  
         RESPONSE.redirect('manage_main')  
   
 def manage_addECHO_rootForm(self):  
         """Nothing yet"""  
         pt=zptFile(self, 'zpt/AddECHO_root.zpt')  
         return pt()  
   
 class ECHO_copyrightType(Folder,ECHO_basis):  class ECHO_copyrightType(Folder,ECHO_basis):
         """copyright typ"""          """copyright typ"""
Line 4478  def repairCoords(self): Line 2308  def repairCoords(self):
         msg += "\nDone!"          msg += "\nDone!"
         return msg          return msg
   
 from ECHO_Nav import ECHO_navigation  from ECHO_root import ECHO_main
   
 class ECHO_main(ECHO_root,ECHO_navigation):  
     """echo main object combines ECHO_root and ECHO_navigation"""  
       
     meta_type="ECHO_main"  
       
     def __init__(self,id,title):  
         """init"""  
         self.id=id  
         self.title=title  
         self.pathToHierarchy="/"+self.id # hierarchie always starts with the object.  
         self.displayedMetaTypes=displayTypes  
           
           
     manage_options = Folder.manage_options+(  
         {'label':'Main Config','action':'ECHO_navigationConfigForm'},  
         {'label':'Cache','action':'ECHO_cacheManageForm'},  
         {'label':'Main Config','action':'ECHO_copyright_configForm'},  
         {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},  
         {'label':'Change Weights','action':'changeWeights'},  
         {'label':'Generate from RDF','action':'generateFromRDFForm'},  
         {'label':'update Resource Catalog','action':'updateResourceCatalog'},  
         {'label':'Copy MD for indexing and search','action':'copySearchFields'},  
         )  
   
       
 def manage_addECHO_mainForm(self):  
     """Form for adding"""  
     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_main.zpt')).__of__(self)  
     return pt()  
   
 def manage_addECHO_main(self,id,title,RESPONSE=None):  #class ECHO_main(ECHO_root,ECHO_navigation):
     """Add an ECHO_main"""  #    """echo main object combines ECHO_root and ECHO_navigation"""
     self._setObject(id,ECHO_main(id,title))  #    
       #    meta_type="ECHO_main"
     obj=self._getOb(id)  #    
     text=file(os.path.join(package_home(globals()),'zpt','main_template')).read()  #    def __init__(self,id,title):
       #        """init"""
     manage_addPageTemplate(obj,'main_template',text=text)                 #        self.id=id
       #        self.title=title
     #        self.pathToHierarchy="/"+self.id # hierarchie always starts with the object.
     if RESPONSE is not None:  #        self.displayedMetaTypes=displayTypes
         RESPONSE.redirect('manage_main')  #        
   #        
   #    manage_options = Folder.manage_options+(
   #        {'label':'Main Config','action':'ECHO_navigationConfigForm'},
   #        {'label':'Cache','action':'ECHO_cacheManageForm'},
   #        {'label':'Main Config','action':'ECHO_copyright_configForm'},
   #        {'label':'Change Weights','action':'changeWeights'},
   #        {'label':'Generate from RDF','action':'generateFromRDFForm'},
   #        {'label':'update Resource Catalog','action':'updateResourceCatalog'},
   #        {'label':'Copy MD for indexing and search','action':'copySearchFields'},
   #        )
   #
   #    
   #def manage_addECHO_mainForm(self):
   #    """Form for adding"""
   #    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_main.zpt')).__of__(self)
   #    return pt()
   #
   #def manage_addECHO_main(self,id,title,RESPONSE=None):
   #    """Add an ECHO_main"""
   #    self._setObject(id,ECHO_main(id,title))
   #    
   #    obj=self._getOb(id)
   #    text=file(os.path.join(package_home(globals()),'zpt','main_template')).read()
   #    
   #    manage_addPageTemplate(obj,'main_template',text=text)               
   #    
   #  
   #    if RESPONSE is not None:
   #        RESPONSE.redirect('manage_main')

Removed from v.1.294  
changed lines
  Added in v.1.310.2.9


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