"""ECHO_root for the central functions for ECHO used by all objects """ import urlparse import string import tempfile import zipfile import re import os,shutil import OFS.Image from types import * from OFS.Cache import Cacheable from OFS.Image import Image from Globals import DTMLFile from OFS.Folder import Folder from OFS.SimpleItem import SimpleItem from AccessControl import ClassSecurityInfo from AccessControl.User import UserFolder from Globals import InitializeClass from Globals import DTMLFile import Globals from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PageTemplates.PageTemplate import PageTemplate from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate,manage_addPageTemplate from Globals import Persistent, package_home from Acquisition import Implicit from Products.ZCatalog.CatalogPathAwareness import CatalogAware from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon import ECHO_helpers from Acquisition import aq_parent try: from Products.MetaDataProvider.MetaDataClient import MetaDataClient except: print "no metadataclient" import urllib import urllib2 import cgi import smtplib import time #from Ft.Xml.Domlette import NonvalidatingReader #from Ft.Xml.Domlette import PrettyPrint, Print #from Ft.Xml import EMPTY_NAMESPACE # #import Ft.Xml.XPath import cStringIO import sys import logging try: from psycopg import libpq except: try: from pyPgSQL import libpq except: print "ECHO_collection: Warning - No libpq imported!" import xml.dom.minidom import urllib import xml.dom.minidom import ECHO_helpers from ECHO_helpers import * #import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen import xmlrpclib import logging #ersetzt logging.info def logger(txt,method,txt2): """logging""" logging.info(txt+ txt2) class ECHO_root(Folder,Persistent,Implicit): """ECHO Root Folder""" security=ClassSecurityInfo() meta_type="ECHO_root" management_page_charset="utf-8" getSubCols = ECHO_helpers.getSubCols manage_options=Folder.manage_options+( {'label':'Main Config','action':'mainConfig_html'}, {'label':'Change Weights','action':'changeWeights'}, {'label':'Generate from RDF','action':'generateFromRDFForm'}, {'label':'update Resource Catalog','action':'updateResourceCatalog'}, ) def mainConfig_html(self): """change form""" pt=zptFile(self, 'zpt/ChangeECHO_root.zpt') pt.content_type="text/html" return pt() def getMetaDataManagerName(self): """name of the metadatamanager""" return getattr(self,"metaDataManagerName","metadata"); def changeECHO_root(self,metaDataManagerName,REQUEST=None): """change the main properties""" self.metaDataManagerName=metaDataManagerName if self.getMetaDataManager() is None: return """"ERROR: Folder: %s does not exist. """%metaDataManagerName if REQUEST is not None: REQUEST.RESPONSE.redirect('manage_main') else: return "" def getMetaDataManager(self): """hole eine Instanz von MetaDataFolder """ mf= getattr(self,self.getMetaDataManagerName(),None) return mf def getECHORootURL(self): return self.absolute_url() def getECHORoot(self): return self def getBrowserType(self): """returns browserType object""" return browserType(self) def mod_re_sub(self,pattern,replace,string): """re.sub aus mod re zur Verfuegung stellen""" return re.sub(pattern,replace,string) def findObjectFromFulltext(self,existUri): ''' @param url: @param existUri: ''' if existUri: #TODO: at the moment assume that the filename is unique, the whole has to changed to a system of ids. filename=existUri.split("/")[-1] founds=self.resourceCatalog.search({'fullTextUrl':os.path.splitext(filename)[0]}) ret=[(found.title,found.getObject().absolute_url(),found.getObject().aq_parent.absolute_url()) for found in founds] return ret def reindex(self,RESPONSE=None): """indiziere alle Objecte neu""" if RESPONSE: RESPONSE.write("") resources=self.ZopeFind(self,obj_metatypes=["ECHO_resource"], search_sub=1) for resource in resources: resource[1].reindex() #print "

done %s

\n" if RESPONSE: RESPONSE.write("

done %s

\n"%resource[0]) if RESPONSE: RESPONSE.write("

ok

\n") def setLanguage(self,lang): """Set language cookie""" self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/") def switchLanguage(self): """Set language cookie""" if self.getLanguage()=="en": lang="de" else: lang="en" self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/") self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']) def getLanguage(self): """get language cookie""" lang= self.REQUEST.cookies.get('lang_exhibition','de') if lang == '': lang="de" return lang def getContentOverviewTemplate(self): """produces overview template with macro""" pt = zptObjectOrFile(self, 'content_overview_template') return pt def mapstyle_css(self): """send mapstyle.css""" sendFile(self, 'html/ECHO_mapstyle.css', 'text/css') ###Cdli adds -> have to be removed def getTablet(self,item): #print "getTablet" try: read=urllib.urlopen("http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"%item).read() read=re.sub("\[search\]","search",read) return read[read.find("")+6:read.rfind("")] except: return "

Sorry no connection to the data server enlil.museum.upenn.edu

" #return "http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl" ###END CDLI add def URLquote(self, text): """urllib.quote fuer Michael""" return urllib.quote(text) def checkResource(self,id): """checks if a resource is in the tree, gives back none or list of resources""" if not id: id="" splitted=id.split("/") id=splitted[len(splitted)-1] if hasattr(self,"_v_checkResource") and self._v_checkResource.has_key(id): #existiert ein cache und id ist bereits drin? return self._v_checkResource[id] else: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],obj_ids=[id],search_sub=1) if not hasattr(self,"_v_checkResource"): self._v_checkResource={}#lege cache an falls nicht existent if resources: self._v_checkResource[id]=resources[0:] # slicing to be sure that data is stabil else: self._v_checkResource[id]=None return self._v_checkResource[id] def sendForm(self,fromaddr,content,server='mail.mpiwg-berlin.mpg.de'): """sendform""" toaddrs=["dwinter@mpiwg-berlin.mpg.de"] msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (fromaddr, ", ".join(toaddrs),"testsub")) server = smtplib.SMTP(server) #server.set_debuglevel(1) msg=msg+content server.sendmail(fromaddr, toaddrs, msg) server.quit() def generateFromRDFForm(self): """change form""" pt=zptFile(self, 'zpt/generateFromRDFForm') pt.content_type="text/html" return pt() def generateFromRDF(self,file,startNode="/Cuneiform Corpus"): """generate from RDF""" global seqs seqs={} global descrs descrs={} global key key="" global value value="" def getEdges(seqs,urn): """edges""" ret=[] return seqs[urn] def createSubs(self,seqs,descrs,urn,level=0): """create subs""" for edge in getEdges(seqs,urn): cn=createNode(self,descrs,edge) if cn[0]=="CDLI_group": createSubs(cn[1],seqs,descrs,cn[2],level+1) return def start_element(name,attrs): global seqs global descrs global key global value seq="" if name=="rdf:Seq": key=attrs.get('rdf:about') try: # teste ob liste x=seqs[key][0] except: seqs[key]=[] elif name=="rdf:Description": key=attrs.get('rdf:about') elif name=="rdf:li": name=attrs.get('rdf:resource') seqs[key].append(name) elif name=="echonavigation:type": value="type" elif name=="echonavigation:name": value="name" elif name=="echonavigation:linkClickable": value="linkClickable" def end_element(name): """nothing""" key="" value="" def char_data(data): """nothing""" data=re.sub("\n","",data) try: if descrs[key].has_key(value): descrs[key][value]+=data else: descrs[key][value]=data except: descrs[key]={} descrs[key][value]=data p = xml.parsers.expat.ParserCreate() p.StartElementHandler = start_element p.EndElementHandler = end_element p.CharacterDataHandler = char_data p.ParseFile(file) self.REQUEST.RESPONSE.write("

Start

") createSubs(self,seqs,descrs,startNode) self.REQUEST.RESPONSE.write("

done

") #print "done" return "done" def changeWeightsInCollection(self): """change all lables of a collection""" ret="" argv=self.REQUEST.form resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink']) for resource in resources: try: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"
" resource[1].weight=argv[resource[1].getId()][0:] except: pass return ret def changeWeights(self): """change form""" pt=zptFile(self, 'zpt/changeWeightForm') pt.content_type="text/html" return pt() def getRDF(self,urn=None): """rdf of the collection""" contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection']) ret=getRDFDescription(self,self.absolute_url(),urn=urn) li="""\n""" for content in contents: ret+=content[1].getRDF()+"\n" ret+="""\n"""%urn for content in contents: nurn=content[1].absolute_url() ret+=li%nurn return ret+"" def showContent(self,path): """return content/html""" return ECHO_helpers.urlopen(path+"/content_html").read() def getBibTag(self,tag,content): """get field tag for index-meta-generation""" if not content or content=="": return "" ret="<%s>"%tag #ret+=urllib.quote(content) ret+=content ret+=""%tag return ret def getValueFromClass(self,field,found): """ret attribute if existing""" try: return getattr(found,field)#.decode('ascii','ignore') except: logging.error("can't: decode: %s"%repr(field)) logging.error(" %s %s"%(sys.exc_info()[0],sys.exc_info()[1])) return "" security.declarePublic('getImageTag') def getImageTag(self): """needed by main_template""" return "" secondaryLink="" #needed by main_template secondaryLinkTitle="" #needed by main_template def getBgcolour(self): """hack""" return "#dddddd" security.declareProtected('View','contentTypeSelector_HTML') def contentTypeSelector_HTML(self,selected=None): """give type selector""" if not selected: retStr="