--- ECHO_content/Attic/ECHO_root.py 2012/08/29 07:53:31 1.1
+++ ECHO_content/Attic/ECHO_root.py 2013/05/17 06:20:22 1.1.2.2
@@ -0,0 +1,1044 @@
+"""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+="%s>"%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="