--- ECHO_content/ECHO_helpers.py 2005/11/03 14:45:28 1.64 +++ ECHO_content/ECHO_helpers.py 2008/11/19 14:22:42 1.93 @@ -14,8 +14,49 @@ from AccessControl import ClassSecurityI import os.path from OFS.Folder import Folder import ECHO_collection +import base64 +import bz2 +import xmlrpclib +import sys +import logging + +#erstzt logging +def logger(txt,method,txt2): + """logging""" + logging.info(txt+ txt2) + +displayTypes = ['ZSQLExtendFolder','ZSQLBibliography','ECHO_group','ECHO_collection','ECHO_resource','ECHO_link','ECHO_sqlElement','ECHO_pageTemplate','ECHO_externalLink','ImageCollectionIFrame','VLP_resource','VLP_essay','ECHO_ZCatalogElement','ImageCollection','versionedFileFolder','extVersionedFileFolder','ECHO_movie'] + + +#decode and compress for xmlrpc communication with OSAS_server + +def encodeRPC(string): + return base64.encodestring(bz2.compress(string)) +def decodeRPC(string): + return bz2.decompress(base64.decodestring(string)) + +def unicodify(s): + """decode str (utf-8 or latin-1 representation) into unicode object""" + if not s: + return u"" + if isinstance(s, str): + try: + return s.decode('utf-8') + except: + return s.decode('latin-1') + else: + return s + +def utf8ify(s): + """encode unicode object or string into byte string in utf-8 representation. + assumes string objects to be utf-8""" + if not s: + return "" + if isinstance(s, str): + return s + else: + return s.encode('utf-8') -displayTypes = ['ZSQLExtendFolder','ZSQLBibliography','ECHO_group','ECHO_collection','ECHO_resource','ECHO_link','ECHO_sqlElement','ECHO_pageTemplate','ECHO_externalLink','ImageCollectionIFrame','VLP_resource','VLP_essay','ECHO_ZCatalogElement','ImageCollection','versionedFileFolder','ECHO_movie'] def content_html(self,type): """template fuer content""" @@ -25,6 +66,7 @@ def content_html(self,type): # return templates[0][1]() if hasattr(self,type+"_template"): + obj=getattr(self,type+"_template") return obj() else: @@ -38,7 +80,34 @@ class ECHO_basis: """basis eigenschaften fuer echo objekte""" security=ClassSecurityInfo() security.declarePublic('getImageTag') + + management_page_charset="utf-8" + isVisible = True + + # Managment for the PID + def setPID(self,pid): + """set the pid""" + self.pid=pid + return True + + def getPID(self): + """get the pid""" + return getattr(self,'pid',None) + + + def unicodify(self, s): + """return unicode object for string (utf-8 or latin1) or unicode object s""" + return unicodify(s) + + # compatibility of old decode method + decode = unicodify + + def utf8ify(self, s): + """return utf-8 encoded string object for string or unicode object s""" + return utf8ify(s) + + def manage_addECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None): return ECHO_collection.manage_addECHO_locale(self,lang,title,label) @@ -115,14 +184,52 @@ class ECHO_basis: return ret + def content_html_XMLRpc(self): + """xml_rpc_version""" + return encodeRPC(self.content_html()) + def content_html(self,type="collection"): """template fuer content bei einbau und ECHO_Umgebung""" return content_html(self,type) + + def getIsVisible(self): + """return if object and all parents are visible""" + + # if object is not visible return False + if hasattr(self,'isVisible'): + if not self.isVisible : return False + + # else if parent of object is not ECHO_root, ECHO_basis or None + if not self.aq_parent.meta_type in ['ECHO_root','ECHO_basis',None] : + return self.aq_parent.getIsVisible() + + # else return True + return True + + def setIsVisible(self, isVisible): + """ set object attribute isVisible""" + self.isVisible = isVisible + + def getAttributeIsVisible(self): + """ return object attribute isVisible""" + if hasattr(self,'isVisible'): + return self.isVisible + return True + + def getDescription(self): + """get content of description field""" + + return self.unicodify(getattr(self,'description','')); + def getTitle(self): """title""" - lang=self.getLanguage() + if hasattr(self,'getLanguage'): + lang=self.getLanguage() + else: + lang=None + locale=None if lang and not (lang =="de"): locale=self.ZopeFind(self,obj_ids=["locale_"+lang]) @@ -130,19 +237,20 @@ class ECHO_basis: if locale: return self.decode(locale[0][1].title) else: + try: return self.decode(self.title) - - - try: - return self.title.encode('utf-8','ignore') - except: - self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error - return self.title.encode('utf-8','ignore') + except: + return self.title def getLabel(self): """title""" - lang=self.getLanguage() + if hasattr(self,'getLanguage'): + lang=self.getLanguage() + else: + lang=None + locale=None + if lang and not (lang=="de"): locale=self.ZopeFind(self,obj_ids=["locale_"+lang]) @@ -160,13 +268,7 @@ class ECHO_basis: return ret return self.decode(self.label) - try: - return self.label.encode('utf-8','ignore') - except: - self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error - return self.label.encode('utf-8','ignore') - - + def changeECHOEntriesForm(self): """change Entries for the ECHO Navigation environment""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHOEntriesForm')).__of__(self) @@ -307,10 +409,10 @@ class ECHO_basis: js+="""addArea('%s', 'overview', %s, '%s', '%s');\n"""%(ob.getFullId(),ob.getCoordString(),ob.getType(),perm) return js - def createMapHead(self): + def createMapHead(self,mapColTypes=None): """create javascript include and script tags for head""" pt=zptFile(self, 'zpt/ECHO_content_map_frag_js') - return pt() + return pt(mapColTypes=mapColTypes) def createMapImg(self): """generate img-tag for map""" @@ -333,20 +435,33 @@ class ECHO_basis: """generate map link""" bt = BrowserCheck(self) id = ob.getFullId() - link = ob.getLinkId() + url = ob.getTargetUrl() + if url == "": + # ECHOResource with empty link -> no link + href = 'href="#" onclick="return false;"' + else: + href = 'href="%s"'%ob.getLinkId() + + if target is None: + targetattr = "" + else: + targetattr = 'target="%s"'%target + if text is None: text = ob.getLabel() + if text is None: text = "link" + tiptext = ob.getTip() tag = "" if bt.isN4: # N4 needs layer for highlighting - tag += '" else: # a-element - tag = '" @@ -357,6 +472,17 @@ class ECHO_basis: bt = BrowserCheck(self) id = ob.getFullId() link = ob.getLinkId() + url = ob.getTargetUrl() + if url == "": + # ECHOResource with empty link -> no link + href = 'href="#" onclick="return false;"' + else: + href = 'href="%s"'%ob.getLinkId() + + if target is None: + targetattr = "" + else: + targetattr = 'target="%s"'%target tiptext = ob.getTip() tag = "" @@ -382,7 +508,7 @@ class ECHO_basis: if float(rot) < 0: marksrc = circlesrc - tag += ''%(link,marksrc,rot) + tag += ''%(href,marksrc,rot) elif ob.isTypeText(): # N4 - Text tag += '
'%(id,id,id,link,target) + tag = ''%(id,id,id,href,targetattr) if ob.isTypeArrow(): # DOM - Arrow rot = ob.angle @@ -507,7 +633,7 @@ def readFieldFromXML(meta_url,parent,fie def urlopen(url): """urlopen mit timeout""" - socket.setdefaulttimeout(2) + socket.setdefaulttimeout(10) ret=urllib.urlopen(url) socket.setdefaulttimeout(5) return ret @@ -531,11 +657,36 @@ def checkOnlyOneInGroup(object): return displayedObjects[0][1] else: return object -def getSubCols(self, sortfield=None, subColTypes=displayTypes, sortFieldMD=None,searchMD=None,generic="yes"): + +def getSubCols(self, sortfield=None, + subColTypes=displayTypes, + sortFieldMD=None, + searchMD=None, + searchMD_modus='search', + searchSimple=None, + generic="yes",search_sub=0, + isVisible=True): def sort(x,y): - return cmp(x[0],y[0]) - + try: + if type(x[0])==type(y[0]): + return cmp(x[0],y[0]) + else: + if type(x[0])==types.StringType: + tmpX=unicodify(x[0]) + tmpY=y[0] + else: + tmpY=unicodify(y[0]) + tmpX=x[0] + return cmp(tmpX,tmpY) + + except: + logging.error("Error at ECHO_helpers.sort:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") + logging.error(" : %s %s"%sys.exc_info()[0:2]) + logging.error("Error at ECHO_helpers.sort:"+repr(x)+"--"+repr(type(x[0]))) + logging.error("Error at ECHO_helpers.sort:"+repr(y)+"--"+repr(type(y[0]))) + logging.error("Error at ECHO_helpers.sort:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB") + return 0 def sortfnc(sortfield,x,y): try: xa=x[1].getMDValue(sortfield,generic=generic) @@ -549,35 +700,37 @@ def getSubCols(self, sortfield=None, sub sortWithMD = lambda sortfield : (lambda x,y : sortfnc(sortfield,x,y)) ids=[] - displayedObjects=self.ZopeFind(self,obj_metatypes=subColTypes) - + displayedObjects=self.ZopeFind(self,obj_metatypes=subColTypes,search_sub=search_sub) - - for entry in displayedObjects: - - - object=entry[1] - if searchMD and hasattr(object,'getMDValue'): - flag=0 - for field in searchMD.keys(): - if object.getMDValue(field,generic=generic)==searchMD[field]: - flag=1 - else: - flag=0 - break - if flag==1: - ids.append(object) - else: - ids.append(object) - + if searchSimple and (not (searchSimple==""))and hasattr(self,'resourceCatalog'): + searchString=" AND ".join(searchSimple.split()) + ids=[x.getObject() for x in self.resourceCatalog({'getMDValueSimpleSearchField':searchString,'getIsVisible':True})] + else: + for entry in displayedObjects: + object=entry[1] + if searchMD: + if hasattr(object,'getMDValue'): + flag=0 + for field in searchMD.keys(): + #if object.getMDValue(field,generic=generic)==searchMD[field]: + #if re.match(searchMD[field],object.getMDValue(field,generic=generic)): + if searchMD_modus=='match': + searchResult=re.match(searchMD[field],object.getMDValue(field,generic=generic)) + else: + searchResult=re.search(searchMD[field],object.getMDValue(field,generic=generic)) + if searchResult: + flag=1 + else: + flag=0 + break + if flag==1: + ids.append(object) + else: + ids.append(object) if not sortfield: sortfield=getattr(self,'sortfield','weight') - - tmplist=[] - for x in ids: - if hasattr(x,sortfield): try: tmp=int(getattr(x,sortfield)) @@ -594,7 +747,9 @@ def getSubCols(self, sortfield=None, sub else: tmplist.sort(sortWithMD(sortFieldMD)) - return [x for (key,x) in tmplist] + ret=[x for (key,x) in tmplist] + + return ret def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']): """Rerender all Links""" @@ -760,7 +915,8 @@ def zptFile(self, path, orphaned=False): # unusual case pt=PageTemplateFile(os.path.join(package_home(globals()), path)) else: - pt=PageTemplateFile(os.path.join(package_home(globals()), path)).__of__(self) + + pt=PageTemplateFile(os.path.join(package_home(globals()), path)).__of__(self) return pt @@ -832,7 +988,7 @@ class BrowserCheck: def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None): """Einlesen der Metadaten und und erstellen des geaenderten XML file""" - + def updateTextToolNode(tag,value): metanode=dom.getElementsByTagName('texttool')[0] @@ -849,8 +1005,9 @@ def writeMetadata(url,metadict,project=N node.appendChild(nodetext) metanode.appendChild(node) + if xmlfrag: - geturl=""" + geturl=""" @@ -866,12 +1023,14 @@ def writeMetadata(url,metadict,project=N except: - return (None,"XCannot open: "+url) + logger("ECHO writeMetadata",logging.ERROR,"XCannot open: "+url) + return (None,"XCannot open: "+url) try: dom=xml.dom.minidom.parseString(geturl) except: - return (None,"Cannot parse: "+url+"
"+geturl) + logger("ECHO writeMetadata",logging.ERROR,"Cannot parse: "+url+"
"+geturl) + return (None,"Cannot parse: "+url+"
"+geturl) @@ -883,15 +1042,15 @@ def writeMetadata(url,metadict,project=N metanode=metanodes[0] for metaData in metadict.keys(): - - try: + if metaData: + try: nodeOld=metanode.getElementsByTagName(metaData) - except: + except: nodeOld=None - if nodeOld: + if nodeOld: metanode.removeChild(nodeOld[0]).unlink() - else: + else: # try also old writing rule - instead of _: try: nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData)) @@ -901,16 +1060,21 @@ def writeMetadata(url,metadict,project=N if nodeOld: metanode.removeChild(nodeOld[0]).unlink() - metanodeneu=dom.createElement(metaData) - 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) + metanodeneu=dom.createElement(metaData) + try: + metanodetext=dom.createTextNode(metadict[metaData].decode('utf-8')) + except: + 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) + + @@ -932,13 +1096,14 @@ def writeMetadata(url,metadict,project=N if digiliburlprefix: updateTextToolNode('digiliburlprefix',digiliburlprefix) - - try: - return dom.toxml().encode('utf-8') - except: - return dom.toxml('utf-8') + + try: - + return dom.toxml(encoding='utf-8').encode('utf-8') + except: + + + return dom.toxml(encoding='utf-8') def readMetadata(url): """Methode zum Auslesen der Metadateninformation zu einer Resource @@ -984,8 +1149,7 @@ def readMetadata(url): except: """nothing""" - - return metadict,"" + return (metadict,"") class MapArea(SimpleItem): @@ -1094,7 +1258,8 @@ class MapArea(SimpleItem): parent = self.aq_parent text = parent.getMapText() if text is not None: - return text.document_src() + #return text.document_src() + return text() return "" def getLabel(self): @@ -1104,6 +1269,21 @@ class MapArea(SimpleItem): return self.aq_parent.label or self.aq_parent.id return self.label + def getTargetUrl(self): + """returns the URL of the linked object""" + if hasattr(self, 'aq_parent'): + p = self.aq_parent + # ECHOResource and ECHOLink have 'link' attribute + if hasattr(p, 'link'): + if p.link is None: + # return empty string for empty link + return "" + else: + return p.link + + # return None for unknown type + return None + def setLabel(self, label): """sets the label""" self.label = label @@ -1149,6 +1329,8 @@ class MapText(Folder,ZopePageTemplate): self.ZBindings_edit(self._default_bindings) if text is None: text = open(self._default_content_fn).read() + if content_type is None: + content_type = self.content_type self.pt_edit(text, content_type) def createLocale(self):