--- 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+=""%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="