--- ECHO_content/ECHO_helpers.py 2005/11/29 13:48:44 1.66
+++ ECHO_content/ECHO_helpers.py 2008/09/08 19:02:30 1.90
@@ -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,24 @@ class ECHO_basis:
"""basis eigenschaften fuer echo objekte"""
security=ClassSecurityInfo()
security.declarePublic('getImageTag')
+
+ management_page_charset="utf-8"
+ isVisible = True
+
+
+ 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 +174,46 @@ 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 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 +221,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 +252,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 +393,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"""
@@ -334,19 +420,26 @@ class ECHO_basis:
bt = BrowserCheck(self)
id = ob.getFullId()
link = 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 += '" + text + ""
else:
# a-element
- tag = '" + text + ""
@@ -507,7 +600,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 +624,36 @@ def checkOnlyOneInGroup(object):
return displayedObjects[0][1]
else: return object
-def getSubCols(self, sortfield=None, subColTypes=displayTypes, sortFieldMD=None,searchMD=None,searchSimple=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,44 +667,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)
- if searchSimple and (not (searchSimple==""))and hasattr(self,'resourceCatalog'):
-
- searchString=" AND ".join(searchSimple.split())
-
- ids=[x.getObject() for x in self.resourceCatalog({'getMDValueSimpleSearchField':searchString})]
-
+ 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:
-
-
+ for entry in displayedObjects:
object=entry[1]
- if searchMD and hasattr(object,'getMDValue'):
+ 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 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)
-
-
+ 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))
@@ -771,7 +882,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
@@ -843,7 +955,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]
@@ -860,8 +972,9 @@ def writeMetadata(url,metadict,project=N
node.appendChild(nodetext)
metanode.appendChild(node)
+
if xmlfrag:
- geturl="""
+ geturl="""
@@ -877,12 +990,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)
@@ -894,15 +1009,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))
@@ -912,16 +1027,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)
+
+
@@ -943,13 +1063,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
@@ -995,8 +1116,7 @@ def readMetadata(url):
except:
"""nothing"""
-
- return metadict,""
+ return (metadict,"")
class MapArea(SimpleItem):
@@ -1105,7 +1225,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):
@@ -1160,6 +1281,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):