File:  [Repository] / ECHO_content / ECHO_helpers.py
Revision 1.25: download - view: text, annotated - select for diffs - revision graph
Wed Nov 24 15:16:33 2004 UTC (19 years, 6 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
transfered method from ECHO_collection to ECHO_helpers

    1: import socket
    2: import urllib
    3: import xml.dom.minidom
    4: from types import *
    5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    6: from Globals import package_home
    7: import os.path
    8: 
    9: 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']
   10: 
   11: def content_html(self,type):
   12:         """template fuer content"""
   13:         #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
   14:         #
   15:         #if templates:
   16:         #    return templates[0][1]()
   17: 
   18:         if hasattr(self,type+"_template"):
   19:             obj=getattr(self,type+"_template")
   20:             return obj()
   21:         else:
   22:             pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
   23:             pt.content_type="text/html"
   24:             return pt()
   25:     
   26:     
   27: 
   28: class ECHO_basis:
   29:     """basis eigenschaften fuer echo objekte"""
   30:     
   31:     def content_html(self,type="collection"):
   32: 	    """template fuer content bei einbau und ECHO_Umgebung"""
   33: 	    
   34: 	    return content_html(self,type)
   35:         
   36:     def getTitle(self):
   37: 	"""title"""
   38: 	try:
   39: 		return self.title.encode('utf-8','ignore') 
   40: 	except:
   41: 		self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
   42: 		return self.title.encode('utf-8','ignore') 
   43: 	
   44:     def getLabel(self):
   45: 	"""title"""
   46: 	try:
   47: 		return self.label.encode('utf-8','ignore') 
   48: 	except:
   49: 		self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
   50: 		return self.label.encode('utf-8','ignore') 
   51: 	
   52:     
   53:     def changeECHOEntriesForm(self):
   54:         """change Entries for the ECHO Navigation environment"""
   55:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHOEntriesForm')).__of__(self)
   56:         return pt()
   57:     
   58:     def changeECHOEntries(self,label,weight,description,RESPONSE=None):
   59:         """change Entries for the ECHO Navigation environment
   60:         @param label: label fuer die Navigation"""
   61:         self.label=label
   62:         self.weight=weight
   63:         self.description=description
   64:         
   65:         if RESPONSE:
   66:             RESPONSE.redirect("manage_main")
   67: 
   68:     manage_options=({'label':'change ECHO Navigation Entries','action':'changeECHOEntriesForm'},)
   69: 
   70:     #ende der echo erweiterungen
   71: 
   72: 
   73: def toList(field):
   74:     """Einzelfeld in Liste umwandeln"""
   75:     if type(field)==StringType:
   76:         return [field]
   77:     else:
   78:         return field
   79: 
   80: def getText(nodelist):
   81: 
   82:     rc = ""
   83:     for node in nodelist:
   84:     	if node.nodeType == node.TEXT_NODE:
   85:            rc = rc + node.data
   86:     return rc
   87: 
   88: def getTextFromNode(nodename):
   89:     nodelist=nodename.childNodes
   90:     rc = ""
   91:     for node in nodelist:
   92:     	if node.nodeType == node.TEXT_NODE:
   93:            rc = rc + node.data
   94:     return rc
   95: 
   96: 
   97: def readFieldFromXML(meta_url,parent,field):
   98: 	"""lesespezifisches metadatum"""
   99: 	
  100: 	try:
  101: 		dom=xml.dom.minidom.parse(meta_url)
  102: 
  103: 	except:
  104: 		try:
  105: 			fh=urllib.urlopen(meta_url)
  106: 			dom=xml.dom.minidom.parse(fh)
  107: 	        except:
  108: 			return None
  109: 	if not dom: return None
  110: 
  111: 	parent=dom.getElementsByTagName(parent)
  112: 	if not parent: return None
  113: 
  114: 	field=parent[0].getElementsByTagName(field)
  115: 
  116: 	if not field: return None
  117: 
  118: 	return getText(field[0].childNodes)
  119: 	
  120: 	
  121: 	      
  122: def urlopen(url):
  123: 	"""urlopen mit timeout"""
  124: 	socket.setdefaulttimeout(2)
  125: 	ret=urllib.urlopen(url)
  126: 	socket.setdefaulttimeout(5)
  127: 	return ret
  128: #	urlopener = urllib.URLopener()
  129: #
  130: #	try:		
  131: #		con = urlopener.open(url)
  132: #		return con
  133: #	except timeoutsocket.Timeout:
  134: #		return None
  135: 
  136: 
  137: 
  138: 
  139: 
  140: def checkOnlyOneInGroup(object): 
  141: 	"""check if object is a group and if it containt only one element it return this element"""
  142: 	displayedObjects=object.ZopeFind(object,obj_metatypes=displayTypes)
  143: 	if len(displayedObjects)==1: # nur ein Object dann redirect auf dieses Object
  144: 
  145: 		return displayedObjects[0][1]
  146: 	else:
  147: 		return object
  148: 
  149: def getSubCols(self,sortfield="weight",subColTypes= displayTypes):
  150: 
  151:         
  152:         ids=[]
  153: 	displayedObjects=self.ZopeFind(self,obj_metatypes=subColTypes)
  154: 	
  155: 	
  156: 	for entry in displayedObjects:
  157:             
  158:             object=entry[1]
  159:             ids.append(object)
  160: 
  161:         try:
  162:             sortfield=self.sortfield
  163:         except:
  164:             """nothing"""
  165:             
  166:         tmplist=[]
  167:         for x in ids:
  168:             if hasattr(x,sortfield):
  169:                 try:
  170: 
  171:                     x=int(x)
  172:                 except:
  173:                     """nothing"""
  174:                 tmp=getattr(x,sortfield)
  175:             else:
  176:                 tmp=10000000
  177:             tmplist.append((tmp,x))
  178:         tmplist.sort()
  179: 
  180:         return [x for (key,x) in tmplist]
  181: 
  182: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
  183:         """Rerender all Links"""
  184: 	ret=""
  185: 	
  186:         if not obj:
  187:             obj = self
  188:             
  189:         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource'],search_sub=1)
  190: 
  191:         for entry in entries:
  192: 		if entry[1].meta_type == 'ECHO_resource':
  193: 			try:
  194: 				entry[1].ECHO_getResourceMD(template="no")
  195:                                 if "title" in types:
  196:                                     entry[1].generate_title()
  197:                                 if "label" in types:
  198:                                     entry[1].generate_label()
  199: 				ret+="OK:"+entry[0]+"-- "+entry[1].getTitle().decode('utf-8')+"-- "+entry[1].getTitle().decode('utf-8')+"<br>"
  200: 			except:
  201: 				ret+="Error:"+entry[0]+"<br>"
  202: 
  203: 		
  204:                 
  205:                 
  206:         return "<html><body>"+ret+"Rerenderd all links to resources in: "+self.title+"</html></body>"
  207: 
  208: def reloadMetaDataFromStorage(self,RESPONSE=None):
  209: 	    """copy metadata from the storage to ECHO"""
  210: 	    ret=""
  211: 	    resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
  212: 
  213: 	    for resource in resources:
  214: 		    x=str(resource[1].copyIndex_meta2echo_resource())+"<br>"
  215: 		    ret+=x
  216: 		    #print x
  217: 		    
  218: 
  219: 	    if RESPONSE is not None:
  220: 		    #RESPONSE.redirect('./manage_main')
  221: 		    return "<html><body>"+ret+"</html></body>"
  222: 
  223: 	    return ret
  224:     
  225: def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None):
  226: 	    """rdf"""
  227: 	    
  228: 	    ret=""
  229: 	    about="""<RDF:Description RDF:about="%s">"""
  230: 	    name="""<ECHONAVIGATION:name>%s</ECHONAVIGATION:name>"""
  231: 	    link="""<ECHONAVIGATION:link xlink:href="%s">%s</ECHONAVIGATION:link>"""
  232: 	    clickable="""<ECHONAVIGATION:linkClickable>%s</ECHONAVIGATION:linkClickable>"""
  233: 	    #link="""<ECHONAVIGATION:link RDF:about="%s"/>"""
  234: 	    type="""<ECHONAVIGATION:type>%s</ECHONAVIGATION:type>"""
  235:             #xlink="""<ECHONAVIGATION:xlink xlink:href="%s"/>"""	
  236: 	    if not urn:
  237: 		    #urn="urn:"+re.sub('/',':',self.absolute_url())
  238: 		    urn=self.absolute_url()
  239: 	    about2=about%urn
  240: 	    if not nameDef:
  241: 		    if hasattr(self,'label') and not (self.label==""):
  242: 			    name2=name%self.label
  243: 		    elif not self.title=="":
  244: 			    name2=name%self.title
  245: 		    else:
  246: 			    name2=name%self.getId()
  247: 
  248: 		    name2=re.sub('&','&amp;',name2)
  249: 	    else:
  250: 		    name2=name%nameDef
  251: 
  252: 	    linkURL=re.sub('http:','',linkURL)
  253: 	    linkURL2=re.sub('&','&amp;',linkURL)
  254: 	    link2=link%(("http:"+linkURL2),("http:"+urllib.quote(linkURL)))
  255: 	    clickable2=clickable%"true"
  256: 
  257: 	    if not typeName:
  258: 		    type2=type%self.meta_type
  259: 	    else:
  260: 		    type2=type%typeName
  261: 	    
  262: 	    #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
  263: 	    ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
  264: 	    return ret
  265:     
  266: def getCopyrightsFromForm(self,argv): 
  267: 	medias={}
  268: 	partners={}
  269: 	copyrights={}
  270: 	
  271: 	copyrightsFinal=[]
  272: 	for arg in argv.keys():
  273: 		
  274: 		if arg[0:5]=='media':
  275: 			nm=int(arg[5:])
  276: 			medias[nm]=argv[arg]
  277: 		elif arg[0:5]=='partn':
  278: 			nm=int(arg[5:])
  279: 			partners[nm]=argv[arg]
  280: 		elif arg[0:5]=='copyr':
  281: 			nm=int(arg[5:])
  282: 			copyrights[nm]=argv[arg]
  283: 
  284: 
  285: 
  286: 	copyrightsList=[(medias[nm],partners[nm],copyrights[nm]) for nm in medias.keys()]
  287: 	for copyright in copyrightsList:
  288: 		
  289: 		if copyright[2]=='institution0000':
  290: 			copyrightsFinal.append((copyright[0],copyright[1],self.getPartnerCopyright(copyright[1],'')))
  291: 		else:
  292: 			if not copyright[0]=='':
  293: 				copyrightsFinal.append(copyright)
  294: 		
  295: 			
  296: 	return copyrightsFinal
  297: 
  298: #List of different types for the graphical linking viewer
  299: viewClassificationListMaster=['view point','area']
  300: 
  301: 
  302: def checkDiffs(self,metadict):
  303: 	    """check differences"""
  304: 
  305: 	    
  306: 
  307:     
  308: 	    def NoneToEmpty(obj):
  309: 		    if obj:
  310: 			    return obj
  311: 		    else:
  312: 			    return ""
  313: 
  314: 	    
  315: 	    
  316: 	    diffs={}
  317: 	    
  318: 	    tags=self.findTagsFromMapping(self.contentType)
  319: 	    self.referencetypes=tags[2]
  320: 	    self.fields=tags[3]
  321: 	    
  322:     
  323: 	    for field in tags[1]:
  324: 		    try:
  325: 			    if (NoneToEmpty(self.getFieldValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
  326: 				    diffs[self.getFieldTag(tags,field)]=1
  327: 			    else:
  328: 				    
  329: 				    diffs[self.getFieldTag(tags,field)]=0
  330: 		    except:
  331: 			    diffs[self.getFieldTag(tags,field)]=0
  332: 			    
  333: 	    return diffs
  334:     
  335: 
  336: 
  337: 
  338: def sendFile(self, filename, type):
  339:     """sends an object or a local file (in the product) as response"""
  340:     paths = filename.split('/')
  341:     object = self
  342:     # look for an object called filename
  343:     for path in paths:
  344:         if hasattr(object, path):
  345: 	    object = getattr(object, path)
  346: 	else:
  347: 	    object = None
  348: 	    break
  349:     if object:
  350: 	# if the object exists then send it
  351: 	return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
  352:     else:
  353: 	# send a local file with the given content-type
  354: 	fn = os.path.join(package_home(globals()), filename)
  355: 	self.REQUEST.RESPONSE.setHeader("Content-Type", type)
  356: 	self.REQUEST.RESPONSE.write(file(fn).read())
  357:     return
  358: 
  359: class BrowserCheck:
  360:     """check the browsers request to find out the browser type"""
  361:     
  362:     def __init__(self, zope):
  363:         """initialisiere"""
  364: 	self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
  365: 	self.isN4 = (string.find(self.ua, 'Mozilla/4.') > -1) and (string.find(self.ua, 'MSIE') < 0)
  366: 	self.isIE = string.find(self.ua, 'MSIE') > -1
  367: 	self.nav = self.ua[string.find(self.ua, '('):]
  368: 	ie = string.split(self.nav, "; ")[1]
  369: 	if string.find(ie, "MSIE") > -1:
  370: 	    self.versIE = string.split(ie, " ")[1]
  371: 	self.isMac = string.find(self.ua, 'Macintosh') > -1
  372: 	self.isWin = string.find(self.ua, 'Windows') > -1
  373: 	self.isIEWin = self.isIE and self.isWin
  374: 	self.isIEMac = self.isIE and self.isMac
  375: 
  376: 		
  377: 		
  378: def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None):
  379: 	"""Einlesen der Metadaten und und erstellen des geaenderten XML file"""
  380: 
  381: 	def updateTextToolNode(tag,value):
  382: 		#print dom,tag,value
  383: 		metanode=dom.getElementsByTagName('texttool')[0]
  384: 		try:
  385: 			nodeOld=metanode.getElementsByTagName(tag)
  386: 		except:
  387: 			nodeOld=None
  388: 			
  389: 		if nodeOld:
  390: 			metanode.removeChild(nodeOld[0]).unlink()
  391: 
  392: 		node=dom.createElement(tag)
  393: 		nodetext=dom.createTextNode(value)
  394: 		node.appendChild(nodetext)
  395: 		metanode.appendChild(node)
  396: 
  397: 	if xmlfrag:
  398: 		geturl="""<?xml version="1.0" ?>
  399:                            <resource type="MPIWG">
  400: 			   <meta>
  401: 			    <bib type="Book">
  402: 	                    </bib>
  403: 			    </meta>
  404: 			    </resource>"""
  405: 		dom=xml.dom.minidom.parseString(geturl)
  406: 	else:
  407: 		try:
  408: 			geturl=""
  409: 			for line in ECHO_helpers.urlopen(url).readlines():
  410: 				geturl=geturl+line
  411: 
  412: 
  413: 		except:
  414: 			return (None,"Cannot open: "+url)
  415: 
  416: 		try:
  417: 			dom=xml.dom.minidom.parseString(geturl)
  418: 		except:
  419: 			return (None,"Cannot parse: "+url+"<br>"+geturl)
  420: 
  421: 	
  422: 
  423: 	metanodes=dom.getElementsByTagName('bib')
  424: 
  425: 	if not metanodes:
  426: 		metanodes=dom.getElementsByTagName('archimedes')
  427: 
  428: 	metanode=metanodes[0]
  429: 
  430: 	for metaData in metadict.keys():
  431: 		
  432: 		try:
  433: 			nodeOld=metanode.getElementsByTagName(metaData)
  434: 		except:
  435: 			nodeOld=None
  436: 			
  437: 		if nodeOld:
  438: 			metanode.removeChild(nodeOld[0]).unlink()
  439: 		else:
  440: 			# try also old writing rule - instead of _:
  441: 			try:
  442: 				nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
  443: 			except:
  444: 				nodeOld=None
  445: 				
  446: 			if nodeOld:
  447: 				metanode.removeChild(nodeOld[0]).unlink()
  448: 
  449: 		metanodeneu=dom.createElement(metaData)
  450:                 metanodetext=dom.createTextNode(metadict[metaData])
  451: 		#try:
  452: 			#metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
  453: 		#except:
  454: 			#metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
  455: 		metanodeneu.appendChild(metanodetext)
  456: 		metanode.appendChild(metanodeneu)
  457: 
  458: 
  459: 	
  460: 	
  461: 	
  462: 	if project:
  463: 		updateTextToolNode('project',project)
  464: 
  465: 	if startpage:
  466: 		updateTextToolNode('startpage',startpage)
  467: 
  468: 	if topbar:
  469: 		updateTextToolNode('toptemplate',topbar)
  470: 
  471: 	if thumbtemplate:
  472: 		updateTextToolNode('thumbtemplate',thumbtemplate)
  473: 
  474: 	if xslt:
  475: 		updateTextToolNode('xslt',xslt)
  476: 
  477: 	
  478: 	if digiliburlprefix:
  479: 		updateTextToolNode('digiliburlprefix',digiliburlprefix)
  480: 	
  481:         try:	
  482: 	 return dom.toxml().encode('utf-8')
  483: 	except:
  484: 	 return dom.toxml('utf-8')
  485: 
  486: 	
  487: 	
  488: def readMetadata(url):
  489:     """Methode zum Auslesen der Metadateninformation zu einer Resource
  490:     Vorerst noch Typ bib"""
  491:     
  492:     metadict={}
  493:     try:
  494:         geturl=""
  495:         for line in ECHO_helpers.urlopen(url).readlines():
  496:             geturl=geturl+line
  497:         
  498:         
  499:     except:
  500:         return (None,"Cannot open: "+url)
  501: 
  502:     try:
  503:         dom=xml.dom.minidom.parseString(geturl)
  504:     except:
  505:         return (None,"Cannot parse: "+url+"<br>"+geturl)
  506: 
  507:     metanode=dom.getElementsByTagName('bib')
  508:     metadict['bib_type']='Book'
  509:     if len(metanode)==0:
  510:         metanode=dom.getElementsByTagName('archimedes')
  511:         metadict['bib_type']='Archimedes'
  512:         
  513:         
  514:     if not len(metanode)==0:    
  515:         metacontent=metanode[0].childNodes
  516:     
  517:         try:
  518:             metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
  519:         except:
  520:             """nothing"""
  521:         
  522:         for node in metacontent:
  523:             try:
  524: 		    #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
  525: 		    metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
  526:             except:
  527:                 """nothing"""
  528: 
  529: 
  530:     return metadict,""
  531:     

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>