--- ECHO_content/ECHO_helpers.py 2007/01/31 14:12:39 1.80
+++ ECHO_content/ECHO_helpers.py 2012/01/19 19:03:28 1.103.2.4
@@ -11,22 +11,28 @@ from OFS.SimpleItem import SimpleItem
from Globals import package_home
import Globals
from AccessControl import ClassSecurityInfo
+from Acquisition import aq_parent,aq_chain,aq_base
import os.path
from OFS.Folder import Folder
import ECHO_collection
import base64
import bz2
import xmlrpclib
-
+import sys
import logging
+#import amara
#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','ECHO_movie']
+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']
+def normalizeCt(str):
+ """normalizes content_type"""
+ #str= str.replace(" ","_")
+ return str.replace("-"," ").lower()
#decode and compress for xmlrpc communication with OSAS_server
@@ -35,6 +41,29 @@ def encodeRPC(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')
+
+
def content_html(self,type):
"""template fuer content"""
#templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
@@ -43,7 +72,7 @@ def content_html(self,type):
# return templates[0][1]()
if hasattr(self,type+"_template"):
- logging.info("type: %s"%type)
+
obj=getattr(self,type+"_template")
return obj()
else:
@@ -61,6 +90,52 @@ class ECHO_basis:
management_page_charset="utf-8"
isVisible = True
+ # Managment for the PID
+ def setPID(self,pid):
+ """set the pid"""
+ logging.debug(self.getId()+" PID set to "+pid)
+ self.pid=pid
+ return True
+
+ def getPID(self):
+ """get the pid"""
+
+ pid =getattr(self,'pid',None)
+
+ if pid == self.getParentPID():
+ return None
+ else:
+ return pid
+
+
+ def getParentPID(self):
+ """get the PID of the parent"""
+ parent = self.aq_parent
+
+ pidF = getattr(parent,'getPID',None)
+
+ if pidF is None:
+ return None
+
+ else:
+ return pidF()
+
+ 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 getBrowserType(self):
+ """returns browserType object"""
+ return browserType(self)
+
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)
@@ -72,24 +147,25 @@ class ECHO_basis:
def showRDF(self):
"""showrdf"""
self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
- ret="""\n\n"""
+ ret="""\n\n"""
ret+=self.getRDF(urn="echo:collectionroot")+"\n"
- ret+=""""""
+ ret+=""""""
return ret
def RDF(self):
"""showrdf"""
self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
- ret="""\n\n"""
+ ret="""\n\n"""
ret+=self.getRDF(urn=self.absolute_url())+"\n"
- ret+=""""""
+ ret+=""""""
return ret
@@ -99,10 +175,10 @@ class ECHO_basis:
urn=self.absolute_url()
ret=""
- rettemp="""\n"""%urn
+ rettemp="""\n"""%urn
flag=0
- li="""\n"""
+ li="""\n"""
if not ('' in self.getFullTextXML(noredirect='Yes')):
nurn=self.absolute_url()+'/getFullTextXML'
rettemp+=li%nurn
@@ -118,7 +194,7 @@ class ECHO_basis:
rettemp+=li%nurn
flag=1
- rettemp+=""
+ rettemp+=""
if flag==1:
ret+=rettemp
@@ -135,8 +211,8 @@ class ECHO_basis:
nurn=self.absolute_url()+'/showMetaDataXML'
ret+=getRDFDescription(self,self.absolute_url()+'/showMetaDataXML',urn=nurn,nameDef="Metadata",typeName="ECHO_metaData")
+
return ret
-
def content_html_XMLRpc(self):
"""xml_rpc_version"""
return encodeRPC(self.content_html())
@@ -147,28 +223,34 @@ class ECHO_basis:
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()
+ """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
+ # else return True
+ return True
def setIsVisible(self, isVisible):
- """ set object attribute isVisible"""
- self.isVisible = isVisible
+ """ set object attribute isVisible"""
+ self.isVisible = isVisible
def getAttributeIsVisible(self):
- """ return object attribute isVisible"""
- if hasattr(self,'isVisible'):
- return self.isVisible
- return True
+ """ 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"""
@@ -246,9 +328,7 @@ class ECHO_basis:
def getOverview(self):
"""map overview graphics"""
#return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
- if self.hasOverview():
- return getattr(self, 'overview')
- return None
+ return getattr(self, 'overview', None)
def getMapAreas(self):
"""returns the list of MapAreas"""
@@ -356,17 +436,17 @@ 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"""
- bt = BrowserCheck(self)
+ bt = browserType(self)
tag = ""
src = self.getOverview().absolute_url()
- if bt.isN4:
+ if bt['isN4']:
# N4 needs ilayer to create an id
tag += ''%src
else:
@@ -380,22 +460,35 @@ class ECHO_basis:
def createMapLink(self, ob, text=None, target="_blank"):
"""generate map link"""
- bt = BrowserCheck(self)
+ bt = browserType(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:
+ if bt['isN4']:
# N4 needs layer for highlighting
- tag += '" + text + ""
else:
# a-element
- tag = '" + text + ""
@@ -403,13 +496,24 @@ class ECHO_basis:
def createMapAux(self, ob, arrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil", circlesrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/kreis", target="_blank",backLink=None,alternativArrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil_blau"):
"""generate map link image, text and other stuff"""
- bt = BrowserCheck(self)
+ bt = browserType(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 = ""
- if bt.isN4:
+ if bt['isN4']:
#
# N4 needs layer and img elements
#
@@ -431,7 +535,7 @@ class ECHO_basis:
if float(rot) < 0:
marksrc = circlesrc
- tag += ''%(link,marksrc,rot)
+ tag += ''%(href,marksrc,rot)
elif ob.isTypeText():
# N4 - Text
tag += '
'
else:
# N4 - Area
- tag += '
'
@@ -449,7 +553,7 @@ class ECHO_basis:
#
# (more or less) DOM capable browser
#
- tag = '
'%(id,id,id,link,target)
+ tag = ''%(id,id,id,href,targetattr)
if ob.isTypeArrow():
# DOM - Arrow
rot = ob.angle
@@ -472,7 +576,7 @@ class ECHO_basis:
if float(rot) < 0:
marksrc = circlesrc
- if bt.isIEWin and bt.versIE > 5:
+ if bt['isIEWin'] and bt['versIE'] > 5:
# IE/Win 5.5 has "feature" for PNG transparency
tag += ''%(id,marksrc,rot,marksrc,rot)
else:
@@ -487,7 +591,7 @@ class ECHO_basis:
tag += ' '
else:
# DOM - Area
- if bt.isIE:
+ if bt['isIE']:
# IE needs transparent img for area
tag += '"
+ logging.debug("ECHO_rerenderLinksMD: generatedLabel")
+ ret+="OK:"+entry[0]+"-- "+self.unicodify(entry[1].getTitle())+"-- "+self.unicodify(entry[1].getTitle())+"
"
except:
+
ret+="Error:"+entry[0]+"
"
-
+ logging.debug("ECHO_rerenderLinksMD: error")
+ logging.debug("%s %s"%(sys.exc_info()[0],sys.exc_info()[1]))
return ""+ret+"Rerenderd all links to resources in: "+self.title+""
-def reloadMetaDataFromStorage(self,RESPONSE=None):
- """copy metadata from the storage to ECHO"""
- ret=""
- resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
- if RESPONSE is not None:
- RESPONSE.setHeader("Content-Type", type)
- RESPONSE.write("\n")
-
- for resource in resources:
- x=str(resource[1].copyIndex_meta2echo_resource())+"
"
- if RESPONSE is not None:
- RESPONSE.write(x+"\n")
-
- ret+=x
-
- if RESPONSE is not None:
- #RESPONSE.redirect('./manage_main')
- RESPONSE.write( "")
- return ret
-def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None):
+def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None,ap=""):
"""rdf"""
ret=""
- about=""""""
- name="""%s"""
- link="""%s"""
- clickable="""%s"""
- #link=""""""
- type="""%s"""
- #xlink=""""""
+ about=""""""
+ name="""%s"""
+ link="""%s"""
+ clickable="""%s"""
+ #link=""""""
+ type="""%s"""
+
+ #xlink=""""""
+
+ if ap=="":
+ ap2=""
+ else:
+ ap2 = """%s"""%ap
+
if not urn:
#urn="urn:"+re.sub('/',':',self.absolute_url())
urn=self.absolute_url()
@@ -741,8 +900,14 @@ def getRDFDescription(self,linkURL,urn=N
else:
type2=type%typeName
- #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n"
- ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n"
+
+
+ #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n"
+ try:
+ ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n"+ap2+"\n"
+ except:
+ ret=self.unicodify(about2)+"\n"+self.unicodify(name2)+"\n"+self.unicodify(type2)+"\n"+self.unicodify(clickable2)+"\n"+self.unicodify(ap2)+"\n"
+
return ret
def getCopyrightsFromForm(self,argv):
@@ -868,28 +1033,30 @@ def sendFile(self, filename, type):
return
-class BrowserCheck:
+def browserType(zope):
"""check the browsers request to find out the browser type"""
+ bt = {}
+ ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
+ bt['ua'] = ua
+ bt['isN4'] = False
+ bt['isIE'] = False
+ if string.find(ua, 'MSIE') > -1:
+ bt['isIE'] = True
+ else:
+ bt['isN4'] = string.find(ua, 'Mozilla/4.') > -1
+ try:
+ nav = ua[string.find(ua, '('):]
+ bt['nav'] = nav
+ ie = string.split(nav, "; ")[1]
+ if string.find(ie, "MSIE") > -1:
+ bt['versIE'] = string.split(ie, " ")[1]
+ except: pass
- def __init__(self, zope):
- """initialisiere"""
- self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
- self.isN4 = False
- self.isIE = False
- if string.find(self.ua, 'MSIE') > -1:
- self.isIE = True
- else:
- self.isN4 = string.find(self.ua, 'Mozilla/4.') > -1
- try:
- self.nav = self.ua[string.find(self.ua, '('):]
- ie = string.split(self.nav, "; ")[1]
- if string.find(ie, "MSIE") > -1:
- self.versIE = string.split(ie, " ")[1]
- except: pass
- self.isMac = string.find(self.ua, 'Macintosh') > -1
- self.isWin = string.find(self.ua, 'Windows') > -1
- self.isIEWin = self.isIE and self.isWin
- self.isIEMac = self.isIE and self.isMac
+ bt['isMac'] = string.find(ua, 'Macintosh') > -1
+ bt['isWin'] = string.find(ua, 'Windows') > -1
+ bt['isIEWin'] = bt['isIE'] and bt['isWin']
+ bt['isIEMac'] = bt['isIE'] and bt['isMac']
+ return bt
def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None):
@@ -1011,51 +1178,7 @@ def writeMetadata(url,metadict,project=N
return dom.toxml(encoding='utf-8')
-def readMetadata(url):
- """Methode zum Auslesen der Metadateninformation zu einer Resource
- Vorerst noch Typ bib"""
- metadict={}
-
- try:
- geturl=""
- for line in urlopen(url).readlines():
- geturl=geturl+line
-
-
- except:
- return (None,"Cannot open: "+url)
-
- try:
- dom=xml.dom.minidom.parseString(geturl)
- except:
- return (None,"Cannot parse: "+url+"
"+geturl)
-
- metanode=dom.getElementsByTagName('bib')
- metadict['bib_type']='Book'
- if len(metanode)==0:
- metanode=dom.getElementsByTagName('archimedes')
- metadict['bib_type']='Archimedes'
-
-
- if not len(metanode)==0:
- metacontent=metanode[0].childNodes
-
- try:
- metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
- except:
- """nothing"""
-
- for node in metacontent:
- try:
- #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
- #metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
- metadict[re.sub('-','_',node.tagName.lower())]=getText(node.childNodes)
-
- except:
- """nothing"""
-
- return (metadict,"")
class MapArea(SimpleItem):
@@ -1164,7 +1287,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):
@@ -1174,6 +1298,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
@@ -1219,6 +1358,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):