--- ECHO_content/ECHO_collection.py 2004/08/17 15:24:38 1.164 +++ ECHO_content/ECHO_collection.py 2004/10/05 07:31:09 1.173 @@ -32,6 +32,12 @@ from Acquisition import Implicit from ECHO_helpers import displayTypes import urllib import time +from Ft.Xml.Domlette import NonvalidatingReader +from Ft.Xml.Domlette import PrettyPrint +from Ft.Xml import EMPTY_NAMESPACE + +import Ft.Xml.XPath +import cStringIO try: from psycopg import libpq @@ -270,6 +276,13 @@ def getText(nodelist): rc = rc + node.data return rc +def getTextFromNode(nodename): + nodelist=nodename.childNodes + rc = "" + for node in nodelist: + if node.nodeType == node.TEXT_NODE: + rc = rc + node.data + return rc def sendFile(self, filename, type): """sends an object or a local file (in the product) as response""" @@ -383,10 +396,11 @@ def writeMetadata(url,metadict,project=N metanode.removeChild(nodeOld[0]).unlink() metanodeneu=dom.createElement(metaData) - try: - metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8")) - except: - metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8')) + metanodetext=dom.createTextNode(metadict[metaData]) + #try: + #metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8")) + #except: + #metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8')) metanodeneu.appendChild(metanodetext) metanode.appendChild(metanodeneu) @@ -413,7 +427,10 @@ def writeMetadata(url,metadict,project=N if digiliburlprefix: updateTextToolNode('digiliburlprefix',digiliburlprefix) - return dom.toxml().encode('utf-8') + try: + return dom.toxml().encode('utf-8') + except: + return dom.toxml('utf-8') @@ -513,6 +530,7 @@ class ECHO_copyright(Folder): {'label':'Main Config','action':'ECHO_copyright_configForm'}, ) + def ECHO_copyright_configForm(self): """change form""" pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_copyright').__of__(self) @@ -666,7 +684,7 @@ class ECHO_fullText(ZopePageTemplate): # 3 handler functions def start_element(name, attrs): global retLex - print name + retLex+=createTag(name,attrs) def end_element(name): global retLex @@ -689,7 +707,7 @@ class ECHO_fullText(ZopePageTemplate): p.CharacterDataHandler = char_data p.Parse(lemmatized.encode('utf-8'),1) - print repr(lemmatized.encode('utf-8')) + #print repr(lemmatized.encode('utf-8')) return retLex @@ -797,7 +815,7 @@ class ECHO_resource(Folder,Persistent): """showrdf""" self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') ret="""\n\n""" - ret+=self.getRDF(urn="echo:collectionroot")+"\n" + ret+=self.getRDF(urn="echo:colllectionroot")+"\n" ret+="""""" return ret @@ -1020,6 +1038,7 @@ class ECHO_resource(Folder,Persistent): path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server path=re.sub('http://vision.rz-berlin.mpg.de','',path) # falls vision als server + path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo path=re.sub('/index.meta','',path) @@ -1083,6 +1102,7 @@ class ECHO_resource(Folder,Persistent): path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server + path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo path=re.sub('http://vision.rz-berlin.mpg.de','',path) # falls vision als server @@ -1127,7 +1147,9 @@ class ECHO_resource(Folder,Persistent): texttools=dom.getElementsByTagName('texttool') text=texttools[0].getElementsByTagName('text') texturl=getText(text[0].childNodes) - + if not (texturl.split(":")[0] in ['http','ftp','file']): + texturl=re.sub("//","/",texturl) + #return texturl+"::"+texturl.split(":")[0] if not noredirect: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') self.REQUEST.RESPONSE.redirect(texturl) @@ -2081,7 +2103,7 @@ class ECHO_collection(Folder, Persistent pt=PageTemplateFile('Products/ECHO_content/zpt/changeViewerTemplateSet').__of__(self) return pt() - def getViewerTemplateSets(self,obj_ids=None): + def getViewerTemplateSets(self,obj_ids=None,RESPONSE=None): """Get the ViewerTemplateSet title for configuration""" ret=[] @@ -2090,7 +2112,7 @@ class ECHO_collection(Folder, Persistent for viewerTemplateSet in viewerTemplateSets: ret.append((viewerTemplateSet[1].title,viewerTemplateSet[0],viewerTemplateSet[1])) - + return ret except: @@ -2270,6 +2292,11 @@ class ECHO_collection(Folder, Persistent def getCollectionTreeXML(self): """Tree as XML""" + def addPassWd(str): + """adds a user/passwd to an url""" + txt2=re.sub(r"(http://)(.*?)","\g<1>www:3333@\g<2>",str) + return txt2 + def getCollection(object,depth=0): depth+=1 collections="" @@ -2277,7 +2304,7 @@ class ECHO_collection(Folder, Persistent element=getattr(object,entry) try: if element.meta_type in ["ECHO_collection","ECHO_group"]: - collections+="" + collections+="" collections+=getCollection(element,depth)+"\n" except: """nothing""" @@ -2534,7 +2561,7 @@ class ECHO_collection(Folder, Persistent else: return "#dddddd" - def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",viewClassification=None,location=None): + def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",viewClassification=None,location=None,isAlwaysClickable=None): """Aenderung der Properties""" self.secondaryLink=secondaryLink @@ -2543,6 +2570,7 @@ class ECHO_collection(Folder, Persistent self.bgcolour=bgcolour self.viewClassification=viewClassification self.location=location + self.isAlwaysClickable=isAlwaysClickable if coords: coordsnew=[ string.split(x,",") for x in coords] @@ -2562,7 +2590,15 @@ class ECHO_collection(Folder, Persistent if RESPONSE is not None: RESPONSE.redirect('manage_main') + def setAlwaysClickable(self,flag="yes"): + """set clickable""" + if flag=="yes": + self.isAlwaysClickable="yes" + else: + self.isAlwaysClickable=None + return flag + def showOverview(self): """overview""" if 'ECHO_overview.html' in self.__dict__.keys(): @@ -2934,13 +2970,162 @@ def manage_addECHO_userFolderForm(self): """add a user folder form""" return manage_addECHO_userFolder(self) + + +def createNode(self,descrs,node): + name=descrs[node]['name'] + type=descrs[node]['type'] + urn=node + #print " will create",node.encode('utf-8') + id=re.sub('[^a-zA-Z0-9]','',name).encode('ascii','ignore') + #print "id",id + #print type + #self.REQUEST.RESPONSE.write("

%s

\n"%id) + if type=="CDLI_group": + + try: + manage_addECHO_collection(self,id,name,name,"","","","","") + + except: + self.REQUEST.RESPONSE.write("

Error%s

\n"%id) + + self.REQUEST.RESPONSE.write("

Creates:%s

\n"%getattr(self,id).absolute_url()) + + return type,getattr(self,id),urn + + if type=="CDLI_item": + try: + manage_addECHO_resource(self,id,name,name,"","",urn,"","") + except: + self.REQUEST.RESPONSE.write("

Error%s

\n"%id) + self.REQUEST.RESPONSE.write("

Creates:%s

\n"%getattr(self,id).absolute_url()) + + + return "XX" + + class ECHO_root(Folder,Persistent,Implicit): """ECHO Root Folder""" security=ClassSecurityInfo() meta_type="ECHO_root" + + ###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 generateFromRDFForm(self): + """change form""" + pt=PageTemplateFile('Products/ECHO_content/zpt/generateFromRDFForm').__of__(self) + 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="" @@ -2967,7 +3152,9 @@ class ECHO_root(Folder,Persistent,Implic {'label':'Main Config','action':'ECHO_copyright_configForm'}, {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'}, {'label':'Change Weights','action':'changeWeights'}, - ) + {'label':'Generate from RDF','action':'generateFromRDFForm'}, + +) def showRDF(self): @@ -3233,6 +3420,26 @@ class ECHO_root(Folder,Persistent,Implic return "changed all contenttypes in: "+self.title + def deleteCache(self,obj=None,RESPONSE=None): + """setze alle collections auf cache = CacheManager""" + + + if not obj: + obj = self + + entries=obj.ZopeFind(obj,search_sub=1) + + for entry in entries: + if hasattr(entry[1],'_v_hash'): + entry[1]._v_hash=None + + + + + return "changed all CM in: "+self.title + + + def ECHO_newViewerLink(self,obj=None): """change links (:86 faellt weg)""" @@ -3298,9 +3505,15 @@ class ECHO_root(Folder,Persistent,Implic for link in links: link.tagName="a" - ref=link.getAttribute("ref") + ref=link.getAttribute("ref") + pn=link.getAttribute("page") + if self.checkRef(ref): - link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref) + if pn: + link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref+"&p="+pn) + else: + link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref) + newxml=dom.toxml('utf-8') @@ -3313,30 +3526,47 @@ class ECHO_root(Folder,Persistent,Implic def xml2html(self,str,quote="yes"): """link2html fuer VLP muss hier noch raus""" - print str + if str: if quote=="yes2": str=re.sub("\&","&",str) - dom=xml.dom.minidom.parseString(str) - links=dom.getElementsByTagName("link") - - + #dom=xml.dom.minidom.parseString(str) + dom = NonvalidatingReader.parseString(str,"http://www.mpiwg-berlin.mpg.de/") + #links=dom.getElementsByTagName("link") + links=Ft.Xml.XPath.Evaluate(".//link", contextNode=dom) for link in links: - link.tagName="a" - ref=link.getAttribute("ref") + #link.tagName="a" + + ref=link.getAttributeNS(EMPTY_NAMESPACE,"ref") + pn=link.getAttributeNS(EMPTY_NAMESPACE,"page") + cns=link.childNodes + + newLink=dom.createElementNS(EMPTY_NAMESPACE,"a") + for cn in cns: + newLink.appendChild(cn) + + link.parentNode.replaceChild(newLink,link) if self.checkRef(ref): - link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref) + if pn: + newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref+"&p="+pn) + else: + newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref) - str= dom.toxml() - + #str= dom.toxml('utf-8') + buf = cStringIO.StringIO() + PrettyPrint(dom, stream=buf, encoding='UTF-8') + str = buf.getvalue() + buf.close() + #str=PrettyPrint(dom.documentElement,encoding='UTF-8') #print link.toxml('utf-8') + #print type(str) retStr=regexpPage.search(str) return retStr.group(1) return "" def checkRef(self,ref): - dbs={'vl_literature':'AND CD LIKE \'%lise%\'','vl_technology':'','vl_people':''} + dbs={'vl_literature':'AND CD LIKE \'%lise%\'','vl_technology':'','vl_people':'','vl_sites':''} res=None for db in dbs.keys(): @@ -3369,7 +3599,7 @@ class ECHO_root(Folder,Persistent,Implic """ for partner in partners: - ret+="""\n"""%(partner.getId(),unicode(partner.title,'utf-8','replace')) + ret+="""\n"""%(partner.getId(),partner.title) return ret+"\n" @@ -3476,11 +3706,22 @@ class ECHO_root(Folder,Persistent,Implic def getMetaDatasXML(self,viewerType=None,filter=None): """gebe all ressourcen aus""" + # check if the request's host part was OK + http_host = self.REQUEST['HTTP_HOST'] + host_port = self.REQUEST['SERVER_PORT'] + fix_host = None + if http_host and http_host.rfind(host_port) == -1: + print "HTTP_HOST needs fixing!" + fix_host = http_host + ":" + host_port + ret=""" """ for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1): echo_url=resource[1].absolute_url() + if fix_host: + #print "replacing ", http_host, " by ", fix_host + echo_url = string.replace(echo_url, http_host, fix_host, 1) if hasattr(resource[1],'link'): meta_url=echo_url+"/getMetaDataXML" @@ -3498,8 +3739,7 @@ class ECHO_root(Folder,Persistent,Implic ret +="""\n""" - - + self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml") self.REQUEST.RESPONSE.write(ret)