Annotation of ECHO_content/ECHO_root.py, revision 1.1.2.4

1.1.2.1   dwinter     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: 
1.1.2.4 ! dwinter   774: 
1.1.2.3   dwinter   775:     def exportAllCollectionsAsJSON(self,REQUEST=None,exportTypes=['ECHO_resource']):
1.1.2.2   dwinter   776:         "export all collections"
                    777:         import json
1.1.2.3   dwinter   778:         collections = self.ZopeFind(self,obj_metatypes=['ECHO_collection','ECHO_group'],search_sub=1)
1.1.2.4 ! dwinter   779:         #collections = self.ZopeFind(self,obj_metatypes=['ECHO_group'],search_sub=1)
1.1.2.2   dwinter   780:         
                    781:         ret={}
                    782:         for collection in collections:
                    783:             colId = collection[1].absolute_url().replace(self.absolute_url(),'')
1.1.2.3   dwinter   784:             ret[colId]=collection[1].getExport(metatypes=exportTypes);
1.1.2.2   dwinter   785:           
                    786:         if REQUEST:
                    787:                 REQUEST.response.setHeader("Content-type", "text/json; charset=utf-8")
                    788:          
                    789:         return json.dumps(ret)
                    790:     
1.1.2.3   dwinter   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'])
1.1.2.2   dwinter   794:       
1.1.2.3   dwinter   795: 
1.1.2.2   dwinter   796:         
1.1.2.1   dwinter   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:             
1.1.2.2   dwinter   805:           
1.1.2.1   dwinter   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>