"""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("