File:  [Repository] / ECHO_content / Attic / ECHO_root.py
Revision 1.1.2.4: download - view: text, annotated - select for diffs - revision graph
Thu Aug 8 13:00:19 2013 UTC (10 years, 11 months ago) by dwinter
Branches: cleanup
export funktionen in JSON

    1: """ECHO_root for the central functions for ECHO used by all objects
    2: 
    3: """
    4: 
    5:      
    6: import urlparse
    7: import string
    8: import tempfile
    9: import zipfile
   10: import re
   11: import os,shutil
   12: import OFS.Image
   13: from types import *
   14: from OFS.Cache import Cacheable
   15: from OFS.Image import Image
   16: from Globals import DTMLFile
   17: from OFS.Folder import Folder
   18: from OFS.SimpleItem import SimpleItem
   19: from AccessControl import ClassSecurityInfo
   20: from AccessControl.User import UserFolder
   21: from Globals import InitializeClass
   22: from Globals import DTMLFile
   23: import Globals
   24: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
   25: from Products.PageTemplates.PageTemplate import PageTemplate
   26: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate,manage_addPageTemplate
   27: from Globals import Persistent, package_home
   28: from Acquisition import Implicit
   29: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
   30: from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon
   31: import ECHO_helpers
   32: from Acquisition import aq_parent
   33: try:
   34:     from Products.MetaDataProvider.MetaDataClient import MetaDataClient
   35: except:
   36:     print "no metadataclient"
   37: import urllib
   38: import urllib2
   39: import cgi
   40: import smtplib
   41: import time
   42: #from Ft.Xml.Domlette import NonvalidatingReader
   43: #from Ft.Xml.Domlette import PrettyPrint, Print
   44: #from Ft.Xml import EMPTY_NAMESPACE
   45: #
   46: #import Ft.Xml.XPath
   47: import cStringIO
   48: 
   49: import sys
   50: import logging
   51: 
   52: try:
   53:         from psycopg import libpq
   54: except:
   55:         try:
   56:                 from pyPgSQL import libpq
   57:         except:
   58:                 print "ECHO_collection: Warning - No libpq imported!"
   59:                 
   60: import xml.dom.minidom
   61: 
   62: import urllib
   63: import xml.dom.minidom
   64: import ECHO_helpers
   65: from ECHO_helpers import *
   66: 
   67: 
   68: 
   69: #import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen
   70: import xmlrpclib
   71: 
   72: import logging
   73: 
   74: #ersetzt logging.info
   75: def logger(txt,method,txt2):
   76:     """logging"""
   77:     logging.info(txt+ txt2)
   78: 
   79: 
   80: 
   81: 
   82: class ECHO_root(Folder,Persistent,Implicit):
   83:     """ECHO Root Folder"""
   84: 
   85:     security=ClassSecurityInfo()
   86:     
   87:     meta_type="ECHO_root"
   88:     management_page_charset="utf-8"
   89:     
   90:     getSubCols = ECHO_helpers.getSubCols
   91: 
   92:     manage_options=Folder.manage_options+(              
   93:                 {'label':'Main Config','action':'mainConfig_html'},
   94:                 {'label':'Change Weights','action':'changeWeights'},
   95:                 {'label':'Generate from RDF','action':'generateFromRDFForm'},
   96:                 {'label':'update Resource Catalog','action':'updateResourceCatalog'},
   97:                )
   98: 
   99: 
  100:     def mainConfig_html(self):
  101:         """change form"""
  102:         pt=zptFile(self, 'zpt/ChangeECHO_root.zpt')
  103:         pt.content_type="text/html"
  104:         return pt()
  105:   
  106:   
  107:     def getMetaDataManagerName(self):
  108:         """name of the metadatamanager"""
  109:         return getattr(self,"metaDataManagerName","metadata");
  110:         
  111:     
  112:     def changeECHO_root(self,metaDataManagerName,REQUEST=None):
  113:         """change the main properties"""
  114:         self.metaDataManagerName=metaDataManagerName
  115:         
  116:         if self.getMetaDataManager() is None:
  117:             return """"<html><body>ERROR: Folder: %s does not exist.
  118:             </body></html>
  119:             """%metaDataManagerName
  120:         
  121:         if REQUEST is not None:
  122:              REQUEST.RESPONSE.redirect('manage_main')
  123:         else:
  124:             return ""
  125:         
  126:         
  127:     def getMetaDataManager(self):
  128:          """hole eine Instanz von MetaDataFolder       
  129:          """
  130:     
  131:          mf= getattr(self,self.getMetaDataManagerName(),None)
  132:         
  133:          return mf
  134:          
  135: 
  136:     def getECHORootURL(self):
  137:         return self.absolute_url()
  138:     
  139:     def getECHORoot(self):
  140:         return self
  141: 
  142:     def getBrowserType(self):
  143:         """returns browserType object"""
  144:         return browserType(self)
  145:     
  146:     def mod_re_sub(self,pattern,replace,string):
  147:         """re.sub aus mod re zur Verfuegung stellen"""
  148:         return re.sub(pattern,replace,string)
  149:     
  150:     def findObjectFromFulltext(self,existUri):
  151:         '''
  152:         
  153:         @param url:
  154:         @param existUri:
  155:         '''
  156: 
  157:         if existUri:
  158:             #TODO: at the moment assume that the filename is unique, the whole has to changed to a system of ids.
  159:             filename=existUri.split("/")[-1]
  160:         
  161:         founds=self.resourceCatalog.search({'fullTextUrl':os.path.splitext(filename)[0]})  
  162:         
  163:         ret=[(found.title,found.getObject().absolute_url(),found.getObject().aq_parent.absolute_url()) for found in founds]
  164:         
  165:         return ret
  166:         
  167:     def reindex(self,RESPONSE=None):
  168:         """indiziere alle Objecte neu"""
  169:         
  170:         if RESPONSE:
  171:             RESPONSE.write("<html><body>")
  172:         
  173:         resources=self.ZopeFind(self,obj_metatypes=["ECHO_resource"], search_sub=1)
  174:         
  175:         for resource in resources:
  176:             resource[1].reindex()
  177:             #print "<p> done %s </p>\n"
  178:             if RESPONSE:
  179:                 RESPONSE.write("<p> done %s </p>\n"%resource[0])
  180:                 
  181:         if RESPONSE:
  182:             RESPONSE.write("<p> ok </p></html></body>\n")
  183:             
  184: 
  185:     def setLanguage(self,lang):
  186:             """Set language cookie"""
  187:             self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")
  188: 
  189:     def switchLanguage(self):
  190:             """Set language cookie"""
  191:             if self.getLanguage()=="en":
  192:                     lang="de"
  193:             else:
  194:                     lang="en"
  195:             
  196:             self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")
  197:             self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1'])
  198:             
  199:     def getLanguage(self):
  200:             """get language cookie"""
  201:             lang= self.REQUEST.cookies.get('lang_exhibition','de')
  202:             if lang == '':
  203:                     lang="de"
  204:             return lang
  205:     
  206:     def getContentOverviewTemplate(self):
  207:         """produces overview template with macro"""
  208:         pt = zptObjectOrFile(self, 'content_overview_template')
  209:         return pt
  210: 
  211:     def mapstyle_css(self):
  212:         """send mapstyle.css"""
  213:         sendFile(self, 'html/ECHO_mapstyle.css', 'text/css')
  214: 
  215: 
  216:     ###Cdli adds -> have to be removed
  217:     def getTablet(self,item):
  218:         #print "getTablet"
  219:         try:
  220:                 read=urllib.urlopen("http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"%item).read()
  221:                 read=re.sub("\[search\]","search",read)
  222:                 return read[read.find("<body>")+6:read.rfind("</body>")]
  223:         except:
  224:                 return "<h1>Sorry no connection to the data server enlil.museum.upenn.edu</h1>"
  225:         #return "http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"
  226:     ###END CDLI add
  227: 
  228: 
  229:     def URLquote(self, text):
  230:         """urllib.quote fuer Michael"""
  231:         return urllib.quote(text)
  232: 
  233: 
  234:     def checkResource(self,id):
  235:             """checks if a resource is in the tree, gives back none or list of resources"""
  236:             if not id:
  237:                 id=""
  238:             splitted=id.split("/")
  239:             id=splitted[len(splitted)-1]
  240:             if hasattr(self,"_v_checkResource") and self._v_checkResource.has_key(id): #existiert ein cache und id ist bereits drin?
  241:                             return self._v_checkResource[id]
  242: 
  243:             else:
  244:                     resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],obj_ids=[id],search_sub=1)
  245: 
  246:                     if not hasattr(self,"_v_checkResource"): self._v_checkResource={}#lege cache an falls nicht existent
  247:                     if resources:
  248:                             self._v_checkResource[id]=resources[0:] # slicing to be sure that data is stabil
  249:                     else:
  250:                             self._v_checkResource[id]=None
  251:                     
  252:                     return self._v_checkResource[id]
  253:             
  254:     def sendForm(self,fromaddr,content,server='mail.mpiwg-berlin.mpg.de'):
  255:             """sendform"""
  256:             toaddrs=["dwinter@mpiwg-berlin.mpg.de"]
  257:             
  258:             msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
  259:                    % (fromaddr, ", ".join(toaddrs),"testsub"))
  260:             server = smtplib.SMTP(server)
  261:             #server.set_debuglevel(1)
  262:             msg=msg+content
  263:             server.sendmail(fromaddr, toaddrs, msg)
  264:             server.quit()
  265:                  
  266:     def generateFromRDFForm(self):
  267:                 """change form"""
  268:                 pt=zptFile(self, 'zpt/generateFromRDFForm')
  269:                 pt.content_type="text/html"
  270:                 return pt()
  271: 
  272:     def generateFromRDF(self,file,startNode="/Cuneiform Corpus"):
  273: 
  274:             """generate from RDF"""
  275: 
  276:             global seqs
  277:             seqs={}
  278:             global descrs
  279:             descrs={}
  280:             global key
  281:             key=""
  282:             global value
  283:             value=""
  284: 
  285:             def getEdges(seqs,urn):
  286:                     """edges"""
  287:                     ret=[]
  288:                     return seqs[urn]
  289: 
  290:             def createSubs(self,seqs,descrs,urn,level=0):
  291:                     """create subs"""
  292:                     for edge in getEdges(seqs,urn):
  293:                             cn=createNode(self,descrs,edge)
  294:                             if cn[0]=="CDLI_group":
  295:                                     createSubs(cn[1],seqs,descrs,cn[2],level+1)
  296:                     return
  297: 
  298:             def start_element(name,attrs):
  299: 
  300:                     global seqs
  301:                     global descrs
  302:                     global key
  303:                     global value
  304:                     seq=""
  305:                     if name=="rdf:Seq":
  306:                             key=attrs.get('rdf:about')
  307:                             try: # teste ob liste
  308:                                     x=seqs[key][0]
  309:                             except:
  310: 
  311:                                     seqs[key]=[]
  312: 
  313:                     
  314:                     elif name=="rdf:Description":
  315:                             key=attrs.get('rdf:about')
  316:                             
  317: 
  318:                     elif name=="rdf:li":
  319:                             name=attrs.get('rdf:resource')
  320:                             seqs[key].append(name)
  321: 
  322:                     elif name=="echonavigation:type":
  323:                             value="type"
  324: 
  325:                     elif name=="echonavigation:name":
  326:                             value="name"
  327:                     elif name=="echonavigation:linkClickable":
  328:                             value="linkClickable"
  329:                             
  330:             def end_element(name):
  331:                             """nothing"""
  332:                             key=""
  333:                             value=""
  334: 
  335:             def char_data(data):
  336:                     """nothing"""
  337: 
  338:                     data=re.sub("\n","",data)
  339:                     try:
  340:                             if descrs[key].has_key(value):
  341:                                     descrs[key][value]+=data
  342:                             else:
  343:                                     descrs[key][value]=data
  344:                     except:
  345: 
  346:                             descrs[key]={}
  347:                             descrs[key][value]=data
  348:                             
  349:             p = xml.parsers.expat.ParserCreate()
  350:             
  351:             p.StartElementHandler = start_element
  352:             p.EndElementHandler = end_element
  353:             p.CharacterDataHandler = char_data
  354:             
  355:             
  356:             p.ParseFile(file)
  357:             self.REQUEST.RESPONSE.write("<html><body><h1>Start</h1>")
  358:             createSubs(self,seqs,descrs,startNode)
  359:             self.REQUEST.RESPONSE.write("<h1>done</h1></body></html>")
  360:             #print "done"
  361: 
  362:             
  363:             return "done"
  364:     
  365:             
  366: 
  367:                 
  368:     def changeWeightsInCollection(self):
  369:             """change all lables of a collection"""
  370:             ret=""
  371:             argv=self.REQUEST.form
  372:             
  373:             resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
  374:             for resource in resources:
  375:                    
  376:                     try:
  377:                             ret+=resource[1].getId()+"   "+argv[resource[1].getId()]+"</br>"
  378:                             resource[1].weight=argv[resource[1].getId()][0:]
  379:                     except:
  380:                             pass
  381:             return ret
  382: 
  383:     def changeWeights(self):
  384:                 """change form"""
  385:                 pt=zptFile(self, 'zpt/changeWeightForm')
  386:                 pt.content_type="text/html"
  387:                 return pt()
  388:   
  389:     
  390:     def getRDF(self,urn=None):
  391:             """rdf of the collection"""
  392: 
  393:             contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
  394: 
  395:             ret=getRDFDescription(self,self.absolute_url(),urn=urn)
  396:             
  397:             li="""<rdf:li rdf:resource="%s" />\n"""
  398: 
  399:             
  400:             for content in contents:
  401:                     ret+=content[1].getRDF()+"\n"
  402:                     
  403:             ret+="""<rdf:Seq rdf:about="%s">\n"""%urn
  404:             for content in contents:
  405:                     nurn=content[1].absolute_url()
  406:                     ret+=li%nurn
  407:             return ret+"</rdf:Seq>"
  408:             
  409: 
  410:     def showContent(self,path):
  411:             """return content/html"""
  412:             
  413:             return ECHO_helpers.urlopen(path+"/content_html").read()
  414:     
  415:     
  416: 
  417:     def getBibTag(self,tag,content):
  418:             """get field tag for index-meta-generation"""
  419:             if not content or content=="":
  420:                     return ""
  421:             ret="<%s>"%tag
  422:             #ret+=urllib.quote(content)
  423:             ret+=content
  424: 
  425:             ret+="</%s>"%tag
  426:             return ret
  427: 
  428:     def getValueFromClass(self,field,found):
  429:             """ret attribute if existing"""
  430:             try:
  431:                     
  432: 
  433:                     return getattr(found,field)#.decode('ascii','ignore')
  434: 
  435: 
  436: 
  437:             except:
  438:                     logging.error("can't: decode: %s"%repr(field))
  439:                     logging.error("      %s %s"%(sys.exc_info()[0],sys.exc_info()[1]))
  440:                     return ""
  441: 
  442:     security.declarePublic('getImageTag')
  443:     def getImageTag(self):
  444:             """needed by main_template"""
  445:             return ""
  446:         
  447:     secondaryLink="" #needed by main_template
  448:     secondaryLinkTitle="" #needed by main_template
  449:     
  450:     def getBgcolour(self):
  451:         """hack"""
  452:         return "#dddddd"
  453: 
  454:     security.declareProtected('View','contentTypeSelector_HTML')
  455:     def contentTypeSelector_HTML(self,selected=None):
  456:         """give type selector"""
  457:         if not selected:
  458:             retStr="<option selected>\n"
  459:         else:
  460:             retStr="<option>\n"
  461:             
  462:         try: # erste version contentTypes exists
  463:             for contentType in self.ZopeFind(self.contentTypes,obj_metatypes=["ECHO_contentType"]):
  464:                 if selected and (contentType[0]==selected):
  465:                     retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
  466:                 else:                
  467:                     retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
  468:         except:
  469:                 
  470:                 """nothing"""
  471:                             
  472:         return retStr
  473: 
  474:     def renderingTypeSelector_HTML(self,selected=None):
  475:          """give type selector"""
  476:          if not selected:
  477:                  retStr="<option selected>\n"
  478:          else:
  479:                  retStr="<option>\n"
  480:                  
  481:          try: # erste version renderingTypes exists
  482:                  for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
  483:                          if selected and (renderingType[0]==selected):
  484:                                  retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
  485:                          else:                
  486:                                  retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
  487:          except:
  488:                  """nothing"""
  489:          return retStr
  490: 
  491: 
  492:     def copyrightTypeSelector_HTML(self, object=None, selected=None,first=None):
  493:          """give type selector"""
  494: 
  495:          if not first:
  496:                  if not selected:
  497:                          retStr="<option selected>\n"
  498:                  else:
  499:                          retStr="<option>\n"
  500:          else:
  501:                  if not selected:
  502:                          retStr="""<option selected value="%s">%s\n"""%first
  503:                  else:
  504:                          retStr="""<option value="%s">%s\n"""%first
  505: 
  506:          
  507:          try: # erste version copyrightTypes exists
  508:                  for copyrightType in self.ZopeFind(self.copyrightTypes,obj_metatypes=["ECHO_copyrightType"]):
  509:                          if selected and (copyrightType[0]==selected):
  510:                                  retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
  511:                          else:                
  512:                                  retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
  513:                  
  514:                  for copyrightTypeSelf in self.ZopeFind(object,obj_metatypes=["ECHO_copyrightType"],search_sub=1):
  515:                          if selected and (copyrightTypeSelf[0]==selected):
  516:                                  retStr+="""<option selected value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
  517:                          else:                
  518:                                  retStr+="""<option value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
  519:                                  
  520:          except:
  521:              """nothing"""
  522:                  
  523:          return retStr
  524: 
  525:     def partnerSelector_HTML(self,selected=None):
  526:          """give type selector"""
  527:          if not selected:
  528:                  retStr="<option selected>\n"
  529:          else:
  530:                  retStr="<option>\n"
  531:                  
  532:          try: # erste version copyrightTypes exists
  533:                  for copyrightType in self.ZopeFind(self.partners,obj_metatypes=["ECHO_partner"]):
  534:                          if selected and (copyrightType[0]==selected):
  535:                                  retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
  536:                          else:                
  537:                                  retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
  538:          except:
  539:                  """nothing"""
  540:          return retStr
  541:  
  542:     mediaTypes=['all','text','images','sound','video'] # konfigurierbar in neuer version ueber echoroot??
  543: 
  544:     def mediaTypeSelector_HTML(self,selected=None):
  545:          """give type selector"""
  546:          if not selected:
  547:                  retStr="<option selected>\n"
  548:          else:
  549:                  retStr="<option>\n"
  550:          
  551:          try: # erste version mediatypesTypes exists
  552:                  for mediaType in self.mediaTypes:
  553:                          if selected and (mediaType in selected):
  554:                                  retStr+="""<option selected value="%s">%s\n"""%(mediaType,mediaType)
  555:                          else:                
  556:                                  retStr+="""<option value="%s">%s\n"""%(mediaType,mediaType)
  557:          except:
  558:                  """nothing"""
  559:          return retStr
  560: 
  561:             
  562:     def patchContentType(self,obj=None):
  563:         """austauschen content_type with contentType (patch bei umstieg von alter Version)"""
  564:     
  565: 
  566:         if not obj:
  567:             obj = self
  568:             
  569:         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate'])
  570: 
  571:         for entry in entries:
  572:                 setattr(entry[1],'contentType',entry[1].content_type)
  573:                 #entry[1].contentType == entry[1].content_type
  574: 
  575:                 if entry[1].meta_type == 'ECHO_collection':
  576:                     entry[1].patchContentType(entry[1])    
  577: 
  578:                 
  579:         return "changed all contenttypes in: "+self.title
  580: 
  581: 
  582:     def repairAllCoords(self):
  583:         """updates map coordinates on the same and sublevels"""
  584:         return repairCoords(self)
  585: 
  586: 
  587:     def patchViewClassification(self,obj=None):
  588:         """setze viewClassification heuristisch"""
  589: 
  590:         def checkIfArrow(obj):
  591:                 if hasattr(obj,'coords'):
  592:                         for coordtemp in obj.coords:
  593: 
  594:                                 if (len(coordtemp)>4) and not (coordtemp[4]==''):
  595:                                         return 4
  596:                         return None
  597:                 return None
  598:         
  599:         if not obj:
  600:             obj = self
  601:             
  602:         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_group'])
  603: 
  604:         for entry in entries:
  605:                 
  606:                 if checkIfArrow(entry[1]):
  607:                         setattr(entry[1],'viewClassification','view point')
  608:                 else:
  609:                         setattr(entry[1],'viewClassification','area')
  610: 
  611:                 #entry[1].contentType == entry[1].content_type
  612: 
  613:                 if entry[1].meta_type in ['ECHO_collection','ECHO_group']:
  614:                     entry[1].patchViewClassification(entry[1])    
  615: 
  616:                 
  617:         return "changed all contenttypes in: "+self.title
  618: 
  619:     def deleteCache(self,obj=None,RESPONSE=None):
  620:         """setze alle collections auf cache = CacheManager"""
  621:         if not obj:
  622:             obj = self
  623:         entries=obj.ZopeFind(obj,search_sub=1)
  624:         for entry in entries:
  625:                 if hasattr(entry[1],'_v_hash'):
  626:                         entry[1]._v_hash=None
  627:         
  628:         return "changed all CM in: "+self.title
  629: 
  630:     
  631:     security.declarePublic('ECHO_newViewerLink')
  632:     def ECHO_newViewerLink(self,obj=None):
  633:         """change links (:86 faellt weg)"""
  634: 
  635:         if not obj:
  636:             obj = self
  637:             
  638:         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
  639: 
  640:         for entry in entries:
  641:                 
  642:                 if entry[1].meta_type == 'ECHO_resource':
  643:                     
  644:                     entry[1].link=re.sub('\:86','',entry[1].link)
  645: 
  646:                 else:
  647:                     
  648:                     entry[1].ECHO_newViewerLink(entry[1])
  649:                 
  650:         return "Rerenderd all links to resources in: "+self.title
  651: 
  652:     def __init__(self,id,title):
  653:         """init"""
  654:         self.id = id
  655:         self.title=title
  656: 
  657:     def deleteSpace(self,str):
  658:         """delete space at the end of a line"""
  659:         if str[len(str)-1]==" ":
  660:             return str[0:len(str)-1]
  661:         else:
  662:             return str
  663:         
  664:     
  665: 
  666:     # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt
  667: 
  668:     def formatAscii(self,str,url=None):
  669:         """ersetze ascii umbrueche durch <br>"""
  670: 
  671:         if not str: 
  672:                 return ""
  673:     
  674:         if url:
  675:             
  676:             retStr=""
  677:             words=str.split("\n")
  678:             
  679:             for word in words:
  680:                 strUrl=url%word
  681:     
  682:                 retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
  683:             str=retStr
  684:         if str:
  685:             str = re.sub(r"[\n]","<br/>",str)
  686:             return unicodify(str)
  687:         else:
  688:             return u""
  689:             
  690:     #link2html=vlp_xmlhelpers.link2html
  691:     #related2html=vlp_xmlhelpers.related2html
  692: 
  693:     #xml2html=vlp_xmlhelpers.xml2html
  694:  
  695:     #checkRef=vlp_xmlhelpers.checkRef
  696:     
  697: #    def checkRef(self,ref):
  698: #            if ref[0:3]=='lit':
  699: #                    if len(self.library_data({ 'id':ref}))>0:
  700: #                            return 1
  701: #            try:
  702: #                    if ref[0:7]=="tec_cat":
  703: #                            return 1
  704: #            except:
  705: #                    """nothing"""
  706: #                    
  707: #            dbs={'vl_technology':'','vl_people':" AND complete='yes'",'vl_sites':''}
  708: #            res=None
  709: #            for db in dbs.keys():
  710: #                    res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))
  711: #            return res
  712: #                                    
  713: #    #Ende Methode fuer vlp
  714: 
  715:     def PgQuoteString(self,string):
  716:         """Quote string"""
  717: 
  718:         return libpq.PgQuoteString(string)
  719: 
  720:     security.declareProtected('View','getPartners')
  721:     def getPartners(self):
  722:         """Get list of Partners. Presently only from a subfolder partners"""
  723:         if hasattr(self,'partners'):            
  724:                 ret = [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])]
  725:                 def sort_title(one, another) : return cmp(one.title, another.title)
  726:                 ret.sort(sort_title)
  727:                 return ret
  728:         else:
  729:                 return []
  730:   
  731:     def getInstitutions(self):
  732:         """Get list of Partners. Presently only from a subfolder partners"""
  733:                     
  734:         return [ item[1] for item in self.institutions.ZopeFind(self.institutions,obj_metatypes=['ECHO_institution'])]
  735: 
  736:    
  737:     def getPartnersXML(self):
  738:         """partner liste als xml""" 
  739:         partners=self.getPartners()
  740:         ret="""<?xml version="1.0" encoding="utf-8" ?>
  741:         <partners>"""
  742:         
  743:         for partner in partners:
  744:             ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),partner.title)
  745: 
  746:         return ret+"\n</partners>"
  747:     
  748:     def getCollectionTree(self):
  749:         """get the collection tree (list of triples (parent,child, depth)"""
  750: 
  751:         def getCollection(object,depth=0):
  752:             depth+=1
  753:             collections=[]
  754:             for entry in object.__dict__.keys():
  755:                 element=getattr(object,entry)
  756:                 try:
  757:                     if element.meta_type=="ECHO_collection":
  758:                         collections.append((object,element,depth))
  759:                         collections+=getCollection(element,depth)
  760:                 except:
  761:                     """nothing"""
  762:             return collections
  763:         
  764: 
  765:         return getCollection(self)
  766:     
  767:     def getCollectionTreeIds(self):
  768:         """Show the IDs of the Tree"""
  769:         ret=[]
  770:         for collection in self.getCollectionTree():
  771:             ret.append((collection[0].getId(),collection[1].getId(),collection[2]))
  772:         return ret
  773: 
  774: 
  775:     def exportAllCollectionsAsJSON(self,REQUEST=None,exportTypes=['ECHO_resource']):
  776:         "export all collections"
  777:         import json
  778:         collections = self.ZopeFind(self,obj_metatypes=['ECHO_collection','ECHO_group'],search_sub=1)
  779:         #collections = self.ZopeFind(self,obj_metatypes=['ECHO_group'],search_sub=1)
  780:         
  781:         ret={}
  782:         for collection in collections:
  783:             colId = collection[1].absolute_url().replace(self.absolute_url(),'')
  784:             ret[colId]=collection[1].getExport(metatypes=exportTypes);
  785:           
  786:         if REQUEST:
  787:                 REQUEST.response.setHeader("Content-type", "text/json; charset=utf-8")
  788:          
  789:         return json.dumps(ret)
  790:     
  791:     def exportAllCollectionsAndSubCollectionAsJSON(self,REQUEST):
  792:         "exportiere alle collectionen und subcolletionen, export nicht die inhalte der collectionen sondern nur die hierarchie"
  793:         return  self.exportAllCollectionsAsJSON(REQUEST=None,exportTypes=['ECHO_collection','ECHO_group'])
  794:       
  795: 
  796:         
  797:     def getResourcesHTML(self,viewerType=None,filter=None):
  798:             """gebe all ressourcen aus"""
  799: 
  800:             def sortHTML(x,y):
  801:                     return cmp(x[1].title,y[1].title)
  802:             
  803:             ret="""<html><body><h2>Resources in ECHO</h3>"""
  804:             
  805:           
  806:             resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource','VLP_resource'],search_sub=1)
  807:             ret+="""<h3>Found %i resources</h3>"""%len(resources)
  808:             resources.sort(sortHTML)
  809:             for resource in resources:
  810:                     echo_url=resource[1].absolute_url()
  811:                     
  812:                     if hasattr(resource[1],'title'):
  813:                             title=resource[1].title
  814:                     else:
  815:                             title="None"
  816:                     if filter:
  817:                             if re.search(filter,title):
  818:                                     ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
  819:                     else:
  820:                             ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
  821: 
  822:             ret +="""\n</body></html>"""
  823:             
  824:             #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html")
  825:             #self.REQUEST.RESPONSE.write(ret)
  826:             return ret
  827:     
  828:     def getResourcesXML(self,viewerType=None,filter=None):
  829:             """gebe all ressourcen aus"""
  830:             ret="""<?xml version="1.0" ?>
  831:                      <index>"""
  832:             for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource','VLP_resource'],search_sub=1):
  833: 
  834:                     echo_url=resource[1].absolute_url()
  835:                     if hasattr(resource[1],'link'):
  836:                             viewer_url=resource[1].link
  837:                     else:
  838:                             viewer_url="NO URL"
  839:                     if filter:
  840:                             if re.search(filter,viewer_url):
  841:                                     ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
  842:                     else:
  843:                             ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
  844:             ret +="""\n</index>"""
  845:             
  846:             self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
  847:             self.REQUEST.RESPONSE.write(ret)
  848: 
  849:     def getCollectionsXML(self,viewerType=None,filter=None):
  850:             """gebe collections aus"""
  851:             ret="""<?xml version="1.0" ?>
  852:                      <index>"""
  853:             for resource in self.ZopeFind(self,obj_metatypes=['ECHO_collection','ECHO_group'],search_sub=1):
  854: 
  855:                     echo_url=resource[1].absolute_url()
  856:                  
  857:                     ret+="""\n<collection echoLink="%s"/>"""%urllib.quote(echo_url,safe='/:?')
  858:             ret +="""\n</index>"""
  859:             
  860:             self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
  861:             self.REQUEST.RESPONSE.write(ret)
  862: 
  863:     def getFullTextsXML(self,viewerType=None,filter=None):
  864:             """gebe all ressourcen aus"""
  865:             ret="""<?xml version="1.0" ?>
  866:                      <index>"""
  867:             for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
  868: 
  869:                     echo_url=resource[1].absolute_url()
  870:                     if resource[1].getFullTextXML(noredirect="yes"):
  871:                             if hasattr(resource[1],'link'):
  872:                                     viewer_url=echo_url+"/getFullTextXML"
  873:                             else:
  874:                                     viewer_url="NO URL"
  875:                             if filter:
  876:                                     if re.search(filter,viewer_url):
  877:                                             ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
  878:                             else:
  879:                                     ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
  880:             ret +="""\n</index>"""
  881:             
  882:             
  883:             self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
  884:             self.REQUEST.RESPONSE.write(ret)
  885: 
  886: 
  887:     def getMetaDatasXML(self,viewerType=None,filter=None):
  888:             """gebe all ressourcen aus"""
  889:             # check if the request's host part was OK
  890:             http_host = self.REQUEST['HTTP_HOST']
  891:             host_port = self.REQUEST['SERVER_PORT']
  892:             fix_host = None
  893:             if http_host and http_host.rfind(host_port) == -1:
  894:                     print "HTTP_HOST needs fixing!"
  895:                     fix_host = http_host + ":" + host_port
  896: 
  897:             ret="""<?xml version="1.0" ?>
  898:                      <index>"""
  899:             for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
  900: 
  901:                     echo_url=resource[1].absolute_url()
  902:                     if fix_host:
  903:                             #print "replacing ", http_host, " by ", fix_host
  904:                             echo_url = string.replace(echo_url, http_host, fix_host, 1)
  905:                     
  906:                     if hasattr(resource[1],'link'):
  907:                             meta_url=echo_url+"/getMetaDataXML"
  908:                     else:
  909:                             meta_url="NO_URL"
  910:                             
  911:                     if filter and not re.search(filter,viewer_url):
  912:                             continue
  913: 
  914:                     #modificationDate=time.strptime(str(resource[1].bobobase_modification_time()),"%Y/%m/%d %H:%M:%S %Z")
  915:                     
  916:                     modificationDate=resource[1].bobobase_modification_time().strftime("%Y/%m/%d %H:%M:%S")
  917: 
  918:                     ret+="""\n<resource resourceLink="%s" metaLink="%s" modificationDate="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(meta_url,safe='/:?'),modificationDate)
  919:                     
  920:                             
  921:             ret +="""\n</index>"""
  922: 
  923:             self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
  924:             self.REQUEST.RESPONSE.write(ret)
  925: 
  926:             
  927:     def findPartners(self):     
  928:         """find all partners in partners"""
  929:         par=self.ZopeFind(self.partners, obj_metatypes='ECHO_partner')
  930:         return par
  931:         
  932:     def getPartnerFromID(self):
  933:         """find partner form ID return object"""
  934:         pa=self.REQUEST['partner']
  935:         par=self.ZopeFind(self.partners, obj_ids=[pa])
  936:         return par
  937:         
  938:     def getPartnerFromIDParameter(self, id):
  939:         """ find partners from ID"""
  940:         par=self.ZopeFind(self.partners, obj_ids=[id])
  941:         return par
  942:         
  943:     def getInstitutionFromID(self,id):
  944:         """ find institution from id """
  945:         inst=self.ZopeFind(self.institutions, obj_ids=[id])
  946:         return inst
  947: 
  948:     def updateResourceCatalog(self,REQUEST,RESPONSE):
  949:         """update ressource catalog"""
  950:         catalog=getattr(self,'resourceCatalog',None)
  951:         if not catalog:
  952:             return """<html><body><h3>No resourceCatalog available</h3></body></html>"""
  953:         
  954:         else:
  955:             class element:
  956:                 def __init__(self,group,name):
  957:                     self.group=group
  958:                     self.name=name
  959:             catalog.manage_delObjects('author splitter')
  960:             #elements=[element('Stop Words',""" Don't remove stop words' """),element('Word Splitter','ECHO author splitter')]
  961:             elements=[element('Word Splitter','ECHO author splitter')]
  962:             manage_addLexicon(catalog,id="author splitter",elements=elements)
  963:             
  964:             return catalog.manage_catalogReindex(REQUEST,RESPONSE,'manage_main')
  965:             
  966:         
  967:     def checkMetaDataLinks(self,correct=None):
  968:         """check all metadatalinks and if correct is set change the servername to content.mpiwg-berlin.mpg.de"""
  969:         
  970:         self.REQUEST.RESPONSE.write("<html><body>")
  971:         for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
  972:             metalink=resource[1].metalink
  973:         
  974:             try:
  975:                 url=urllib.urlopen(metalink)
  976:             except:
  977:                 
  978:                 self.REQUEST.RESPONSE.write("<p>ERROR (opening %s):"%resource[1].absolute_url() +" -- %s %s <br>"%sys.exc_info()[0:2])
  979:                 self.REQUEST.RESPONSE.write("-----------%s"%metalink)
  980:             
  981:                 if correct:
  982:                     urlparsed=[x for x in urlparse.urlparse(metalink)]
  983:                     urlparsed[1]="content.mpiwg-berlin.mpg.de"
  984:                     neu=urlparse.urlunparse(urlparsed)
  985:                     resource[1].metalink=neu[0:]
  986:                     self.REQUEST.RESPONSE.write("----------changed to:%s)"%neu)
  987:    
  988:    
  989:    
  990: def manage_addECHO_root(self,id,title,RESPONSE=None):
  991:     """Add an ECHO_root"""
  992:     self._setObject(id,ECHO_root(id,title))
  993:     
  994:     if RESPONSE is not None:
  995:         RESPONSE.redirect('manage_main')
  996: 
  997: def manage_addECHO_rootForm(self):
  998:         """Nothing yet"""
  999:         pt=zptFile(self, 'zpt/AddECHO_root.zpt')
 1000:         return pt()
 1001:     
 1002:     
 1003:     
 1004: from ECHO_Nav import ECHO_navigation
 1005: 
 1006: class ECHO_main(ECHO_root,ECHO_navigation):
 1007:     """echo main object combines ECHO_root and ECHO_navigation"""
 1008:     
 1009:     meta_type="ECHO_main"
 1010:     
 1011:     def __init__(self,id,title):
 1012:         """init"""
 1013:         self.id=id
 1014:         self.title=title
 1015:         self.pathToHierarchy="/"+self.id # hierarchie always starts with the object.
 1016:         self.displayedMetaTypes=displayTypes
 1017:         
 1018:         
 1019:     manage_options = Folder.manage_options+(
 1020:         {'label':'Main Config','action':'ECHO_navigationConfigForm'},
 1021:         {'label':'Cache','action':'ECHO_cacheManageForm'},
 1022:         {'label':'Main Config','action':'ECHO_copyright_configForm'},
 1023:         {'label':'Change Weights','action':'changeWeights'},
 1024:         {'label':'Generate from RDF','action':'generateFromRDFForm'},
 1025:         {'label':'update Resource Catalog','action':'updateResourceCatalog'},
 1026:         {'label':'Copy MD for indexing and search','action':'copySearchFields'},
 1027:         )
 1028: 
 1029:     
 1030: def manage_addECHO_mainForm(self):
 1031:     """Form for adding"""
 1032:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_main.zpt')).__of__(self)
 1033:     return pt()
 1034: 
 1035: def manage_addECHO_main(self,id,title,RESPONSE=None):
 1036:     """Add an ECHO_main"""
 1037:     self._setObject(id,ECHO_main(id,title))
 1038:     
 1039:     obj=self._getOb(id)
 1040:     text=file(os.path.join(package_home(globals()),'zpt','main_template')).read()
 1041:     
 1042:     manage_addPageTemplate(obj,'main_template',text=text)               
 1043:     
 1044:   
 1045:     if RESPONSE is not None:
 1046:         RESPONSE.redirect('manage_main')
 1047: 
 1048:     
 1049:                              

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