1: import re
2: import string
3: import socket
4: import urllib
5: import string
6: import xml.dom.minidom
7: import types
8: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
9: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
10: from OFS.SimpleItem import SimpleItem
11: from Globals import package_home
12: import Globals
13: from AccessControl import ClassSecurityInfo
14: import os.path
15: from OFS.Folder import Folder
16: import ECHO_collection
17: import base64
18: import bz2
19: import xmlrpclib
20:
21: 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']
22:
23:
24: #decode and compress for xmlrpc communication with OSAS_server
25:
26: def encodeRPC(string):
27: return base64.encodestring(bz2.compress(string))
28: def decodeRPC(string):
29: return bz2.decompress(base64.decodestring(string))
30:
31: def content_html(self,type):
32: """template fuer content"""
33: #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
34: #
35: #if templates:
36: # return templates[0][1]()
37:
38: if hasattr(self,type+"_template"):
39: obj=getattr(self,type+"_template")
40: return obj()
41: else:
42: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ECHO_%s_template_standard.zpt'%type)).__of__(self)
43: pt.content_type="text/html"
44: return pt()
45:
46:
47:
48: class ECHO_basis:
49: """basis eigenschaften fuer echo objekte"""
50: security=ClassSecurityInfo()
51: security.declarePublic('getImageTag')
52:
53: management_page_charset="utf-8"
54:
55: def manage_addECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
56: return ECHO_collection.manage_addECHO_locale(self,lang,title,label)
57:
58: def getImageTag(self):
59: """sollte uerberschrieben werden, falls von der Klasse eine imagetag zurueckkommt"""
60:
61: return ""
62:
63: def showRDF(self):
64: """showrdf"""
65: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
66: ret="""<?xml version="1.0" encoding="utf-8"?>\n<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ECHONAVIGATION="http://www.echo.eu/rdf#">\n"""
67:
68: ret+=self.getRDF(urn="echo:collectionroot")+"\n"
69:
70:
71: ret+="""</RDF:RDF>"""
72: return ret
73:
74:
75: def RDF(self):
76: """showrdf"""
77: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
78: ret="""<?xml version="1.0" encoding="utf-8"?>\n<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ECHONAVIGATION="http://www.echo.eu/rdf#">\n"""
79:
80: ret+=self.getRDF(urn=self.absolute_url())+"\n"
81:
82:
83: ret+="""</RDF:RDF>"""
84: return ret
85:
86:
87: def createSubElementRDF(self,urn=None):
88: """rdf list"""
89: if not urn:
90: urn=self.absolute_url()
91: ret=""
92:
93: rettemp="""<RDF:Seq RDF:about="%s">\n"""%urn
94: flag=0
95:
96: li="""<RDF:li RDF:resource="%s" />\n"""
97: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
98: nurn=self.absolute_url()+'/getFullTextXML'
99: rettemp+=li%nurn
100: flag=1
101: if not ('<error>' in self.getImageView(noredirect='Yes')):
102: nurn=self.absolute_url()+'/getImageView'
103: rettemp+=li%nurn
104: flag=1
105:
106:
107: if not ('<error>' in self.showMetaDataXML()):
108: nurn=self.absolute_url()+'/showMetaDataXML'
109: rettemp+=li%nurn
110: flag=1
111:
112: rettemp+="</RDF:Seq>"
113:
114: if flag==1:
115: ret+=rettemp
116:
117: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
118: nurn=self.absolute_url()+'/getFullTextXML'
119: ret+=getRDFDescription(self,self.absolute_url()+'/getFullTextXML',urn=nurn,nameDef="Fulltext",typeName="ECHO_fulltext")
120:
121: if not ('<error>' in self.getImageView(noredirect='Yes')):
122: nurn=self.absolute_url()+'/getImageView'
123: ret+=getRDFDescription(self,self.absolute_url()+'/getImageView',urn=nurn,nameDef="Image View",typeName="ECHO_imageview")
124:
125: if not ('<error>' in self.showMetaDataXML()):
126: nurn=self.absolute_url()+'/showMetaDataXML'
127: ret+=getRDFDescription(self,self.absolute_url()+'/showMetaDataXML',urn=nurn,nameDef="Metadata",typeName="ECHO_metaData")
128:
129: return ret
130:
131: def content_html_XMLRpc(self):
132: """xml_rpc_version"""
133: return encodeRPC(self.content_html())
134:
135: def content_html(self,type="collection"):
136: """template fuer content bei einbau und ECHO_Umgebung"""
137:
138: return content_html(self,type)
139:
140: def getTitle(self):
141: """title"""
142: if hasattr(self,'getLanguage'):
143: lang=self.getLanguage()
144: else:
145: lang=None
146:
147: locale=None
148: if lang and not (lang =="de"):
149: locale=self.ZopeFind(self,obj_ids=["locale_"+lang])
150:
151: if locale:
152: return self.decode(locale[0][1].title)
153: else:
154: try:
155: return self.decode(self.title)
156: except:
157: return self.title
158:
159: def getLabel(self):
160: """title"""
161: if hasattr(self,'getLanguage'):
162: lang=self.getLanguage()
163: else:
164: lang=None
165:
166: locale=None
167:
168: if lang and not (lang=="de"):
169: locale=self.ZopeFind(self,obj_ids=["locale_"+lang])
170:
171: if locale:
172: return self.decode(locale[0][1].label)
173:
174:
175: if not hasattr(self,'label'):
176: self.label=""
177:
178: if self.label=="":
179: ret=self.getTitle()
180: if ret=="":
181: ret=self.getId()
182: return ret
183:
184: return self.decode(self.label)
185:
186: def changeECHOEntriesForm(self):
187: """change Entries for the ECHO Navigation environment"""
188: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHOEntriesForm')).__of__(self)
189: return pt()
190:
191: def changeECHOEntries(self,label,weight,description,queryString,RESPONSE=None):
192: """change Entries for the ECHO Navigation environment
193: @param label: label fuer die Navigation"""
194: self.label=label
195: self.weight=weight
196: self.description=description
197: self.queryString=queryString
198:
199: if RESPONSE:
200: RESPONSE.redirect("manage_main")
201:
202: manage_options=({'label':'change ECHO Navigation Entries','action':'changeECHOEntriesForm'},)
203:
204:
205: def hasOverview(self):
206: """returns if there is an overview graphics"""
207: return hasattr(self, 'overview')
208:
209: def hasParentOverview(self):
210: """returns if the parent has an overview graphics"""
211: return hasattr(self.aq_parent, 'overview')
212:
213: def getOverview(self):
214: """map overview graphics"""
215: #return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
216: if self.hasOverview():
217: return getattr(self, 'overview')
218: return None
219:
220: def getMapAreas(self):
221: """returns the list of MapAreas"""
222: forcetypes = self.REQUEST.get('map_force_types', None)
223: if forcetypes:
224: typelist = forcetypes.split(',')
225: else:
226: typelist = None
227: areas = []
228: # get all contained MapAreas
229: for res in self.ZopeFind(self, obj_metatypes=('MapArea')):
230: area = res[1]
231: # check the allowed types
232: if typelist is not None and area.getType() not in typelist:
233: continue
234: areas.append(area)
235: return areas
236:
237: def addMapArea(self, newarea):
238: """add a map area to this object"""
239: if (newarea.id is None):
240: # create new id
241: ids = [a.id for a in self.getMapAreas()]
242: i = len(ids)
243: while ("a%02d"%i in ids):
244: # if it exists, try the next one
245: i += 1
246: newarea.id = "a%02d"%i
247: self._setObject(newarea.id, newarea)
248:
249: def getMapText(self):
250: """returns the MapText"""
251: # get (the first) contained MapText
252: #lang="en"
253: lang=self.getLanguage()
254: res=None
255: if lang and not (lang=="de"):
256: resTmp = self.ZopeFind(self, obj_metatypes=('ECHO_mapText'))
257: res = self.ZopeFind(resTmp[0][1])
258:
259: if not res:
260: res = self.ZopeFind(self, obj_metatypes=('ECHO_mapText'))
261: if len(res) > 0:
262: text = res[0][1]
263: return text
264: return None
265:
266: def ECHO_graphicEntry(self):
267: """change map coordinates"""
268: if self.hasParentOverview():
269: pt=zptFile(self, 'zpt/ECHO_draw.zpt')
270: return pt()
271: else:
272: return "NO OVERVIEW GRAPHICS"
273:
274: def ECHO_addCoords(self,RESPONSE=None):
275: """change or add MapArea"""
276: #return self.REQUEST
277: # change existing areas
278: for area in self.getMapAreas():
279: id = area.getId()
280: if self.REQUEST.has_key('del.'+id):
281: # delete this area
282: self._delObject(id)
283: # return to same menu
284: if RESPONSE is not None:
285: RESPONSE.redirect('ECHO_graphicEntry')
286: return
287: # modify this area
288: coordstring = self.REQUEST.get('coords.'+id, '')
289: coords = string.split(coordstring, ',')
290: angle = self.REQUEST.get('angle.'+id, '0')
291: type = self.REQUEST.get('type.'+id, 'area')
292: permanent = self.REQUEST.get('permanent.'+id, '')
293: if len(coords) == 4:
294: area.setCoordString(coordstring)
295: area.setAngle(angle)
296: area.setType(type)
297: area.setPermanent(permanent)
298: # add the "new" area
299: if self.REQUEST.has_key('add'):
300: coordstring = self.REQUEST.get('coords.new', '')
301: coords = string.split(coordstring, ',')
302: angle = self.REQUEST.get('angle.new', '0')
303: type = self.REQUEST.get('type.new', 'area')
304: permanent = self.REQUEST.get('permanent.new', '')
305: if len(coords) == 4:
306: coords.append(angle)
307: area = MapArea(None, coords, type=type, permanent=permanent)
308: self.addMapArea(area)
309: # return to edit area menu
310: if RESPONSE is not None:
311: RESPONSE.redirect('ECHO_graphicEntry')
312:
313: def createJSAreas(self, areas):
314: """create area calls for JavaScript"""
315: forceperm = self.REQUEST.get('map_force_permanent', None)
316: js="\n"
317: for ob in areas:
318: # check for force-permanent
319: if forceperm is not None:
320: perm = forceperm
321: else:
322: perm = ob.isPermanent()
323: js+="""addArea('%s', 'overview', %s, '%s', '%s');\n"""%(ob.getFullId(),ob.getCoordString(),ob.getType(),perm)
324: return js
325:
326: def createMapHead(self):
327: """create javascript include and script tags for head"""
328: pt=zptFile(self, 'zpt/ECHO_content_map_frag_js')
329: return pt()
330:
331: def createMapImg(self):
332: """generate img-tag for map"""
333: bt = BrowserCheck(self)
334: tag = ""
335: src = self.getOverview().absolute_url()
336: if bt.isN4:
337: # N4 needs ilayer to create an id
338: tag += '<ilayer id="overview" visibility="show"><img src="%s"></ilayer>'%src
339: else:
340: # img with id
341: tag += '<img id="overview" src="%s" />'%src
342: return tag
343:
344: def createParentMapImg(self):
345: """generate img-tag for map of parent"""
346: return self.aq_parent.createMapImg()
347:
348: def createMapLink(self, ob, text=None, target="_blank"):
349: """generate map link"""
350: bt = BrowserCheck(self)
351: id = ob.getFullId()
352: link = ob.getLinkId()
353: if text is None:
354: text = ob.getLabel()
355: if text is None:
356: text = "link"
357: tiptext = ob.getTip()
358: tag = ""
359: if bt.isN4:
360: # N4 needs layer for highlighting
361: tag += '<ilayer id="a.%s"><a class="maplink" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="%s"'%(id,id,id,link,target)
362: tag += ">" + text + "</a></ilayer>"
363: else:
364: # a-element
365: tag = '<a id="a.%s" class="maplink" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="%s"'%(id,id,id,link,target)
366: if tiptext:
367: tag += ' title="%s"'%tiptext
368: tag += ">" + text + "</a>"
369: return tag
370:
371: 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"):
372: """generate map link image, text and other stuff"""
373: bt = BrowserCheck(self)
374: id = ob.getFullId()
375: link = ob.getLinkId()
376: tiptext = ob.getTip()
377: tag = ""
378:
379: if bt.isN4:
380: #
381: # N4 needs layer and img elements
382: #
383: tag += '<layer id="i.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)">'%(id,id,id)
384: if ob.isTypeArrow():
385: # N4 - Arrow
386: rot = ob.angle
387:
388: if hasattr(getattr(self,link),'link'):
389: cLink=getattr(self,link).link
390: # if existing delete virtuell path
391: cLink=cLink.replace('/'.join(self.REQUEST['VirtualRootPhysicalPath']),'')
392:
393: if backLink and hasattr(getattr(self,link),'link') and backLink==self.REQUEST['SERVER_URL']+cLink.lstrip():
394: marksrc=alternativArrowsrc
395: else:
396: marksrc = arrowsrc
397:
398:
399: if float(rot) < 0:
400: marksrc = circlesrc
401: tag += '<a href="%s"><img border="0" src="%s&rot=%s" /></a>'%(link,marksrc,rot)
402: elif ob.isTypeText():
403: # N4 - Text
404: tag += '<div id="t.%s" class="maptext"'%(id)
405: tag += 'style="visibility:hidden">'
406: tag += ob.getText()
407: tag += '</div>'
408: else:
409: # N4 - Area
410: tag += '<a href="%s"><img border="0" width="1000" height="1000" src="trans_img"'%(link)
411: if tiptext:
412: tag += ' alt="%s"'%tiptext
413: tag += ' /></a>'
414: tag += '</layer>'
415: else:
416: #
417: # (more or less) DOM capable browser
418: #
419: tag = '<a id="b.%s" class="mapmarklink" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="%s">'%(id,id,id,link,target)
420: if ob.isTypeArrow():
421: # DOM - Arrow
422: rot = ob.angle
423:
424: if hasattr(getattr(self,link),'link'):
425: cLink=getattr(self,link).link
426: # if existing delete virtuell path
427: if hasattr(self.REQUEST,'VirtualRootPhysicalPath'):
428: cLink=cLink.replace('/'.join(self.REQUEST['VirtualRootPhysicalPath']),'')
429:
430: if backLink and hasattr(getattr(self,link),'link') and backLink==self.REQUEST['SERVER_URL']+cLink.lstrip():
431: marksrc=alternativArrowsrc
432: else:
433: marksrc = arrowsrc
434:
435: try:
436: rot=float(rot)
437: except:
438: rot=0
439:
440: if float(rot) < 0:
441: marksrc = circlesrc
442: if bt.isIEWin and bt.versIE > 5:
443: # IE/Win 5.5 has "feature" for PNG transparency
444: tag += '<span id="i.%s" style="position:absolute; top:-100px; left:-100px; border-style:none; border-width=1px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'%s&rot=%s\');"><img style="visibility:hidden" src="%s&rot=%s" /></span>'%(id,marksrc,rot,marksrc,rot)
445: else:
446: # arrow image
447: tag += '<img id="i.%s" src="%s&rot=%s" border="1" style="position:absolute; top:-100px; left:-100px; border-style:none;" />'%(id,marksrc,rot)
448: elif ob.isTypeText():
449: # DOM - Text
450: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;"'%(id)
451: tag += '><div id="t.%s" class="maptext"'%(id)
452: tag += 'style="visibility:hidden">'
453: tag += ob.getText()
454: tag += '</div></div>'
455: else:
456: # DOM - Area
457: if bt.isIE:
458: # IE needs transparent img for area
459: tag += '<img id="i.%s" border="0" style="position:absolute; top:-100px; left:-100px;" src="trans_img"'%(id)
460: if tiptext:
461: tag += ' title="%s"'%tiptext
462: tag += " />"
463: else:
464: # empty div for area
465: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;"'%(id)
466: if tiptext:
467: tag += ' title="%s"'%tiptext
468: tag += '> </div>'
469: tag += '</a>'
470: return tag
471:
472:
473: #ende der echo erweiterungen
474:
475:
476: def toList(field):
477: """Einzelfeld in Liste umwandeln"""
478: if type(field)==types.StringType:
479: return [field]
480: else:
481: return field
482:
483: def getText(nodelist):
484: rc = ""
485: for node in nodelist:
486: if node.nodeType == node.TEXT_NODE:
487: rc = rc + node.data
488: return rc
489:
490: def getTextFromNode(nodename):
491: nodelist=nodename.childNodes
492: rc = ""
493: for node in nodelist:
494: if node.nodeType == node.TEXT_NODE:
495: rc = rc + node.data
496: return rc
497:
498:
499: def readFieldFromXML(meta_url,parent,field):
500: """lesespezifisches metadatum"""
501:
502: try:
503: dom=xml.dom.minidom.parse(meta_url)
504:
505: except:
506: try:
507: fh=urllib.urlopen(meta_url)
508: dom=xml.dom.minidom.parse(fh)
509: except:
510: return None
511: if not dom: return None
512:
513: parent=dom.getElementsByTagName(parent)
514: if not parent: return None
515:
516: field=parent[0].getElementsByTagName(field)
517:
518: if not field: return None
519:
520: return getText(field[0].childNodes)
521:
522:
523:
524: def urlopen(url):
525: """urlopen mit timeout"""
526: socket.setdefaulttimeout(2)
527: ret=urllib.urlopen(url)
528: socket.setdefaulttimeout(5)
529: return ret
530: # urlopener = urllib.URLopener()
531: #
532: # try:
533: # con = urlopener.open(url)
534: # return con
535: # except timeoutsocket.Timeout:
536: # return None
537:
538:
539:
540:
541:
542: def checkOnlyOneInGroup(object):
543: """check if object is a group and if it containt only one element it return this element"""
544: displayedObjects=object.ZopeFind(object,obj_metatypes=displayTypes)
545: if len(displayedObjects)==1: # nur ein Object dann redirect auf dieses Object
546:
547: return displayedObjects[0][1]
548: else: return object
549:
550:
551: def getSubCols(self, sortfield=None, subColTypes=displayTypes, sortFieldMD=None,searchMD=None,searchMD_modus='search',searchSimple=None,generic="yes",search_sub=0):
552:
553: def sort(x,y):
554: return cmp(x[0],y[0])
555:
556: def sortfnc(sortfield,x,y):
557: try:
558: xa=x[1].getMDValue(sortfield,generic=generic)
559: except:
560: xa=""
561: try:
562: ya=y[1].getMDValue(sortfield,generic=generic)
563: except:
564: ya=""
565: return cmp(xa,ya)
566:
567: sortWithMD = lambda sortfield : (lambda x,y : sortfnc(sortfield,x,y))
568: ids=[]
569: displayedObjects=self.ZopeFind(self,obj_metatypes=subColTypes,search_sub=search_sub)
570:
571: if searchSimple and (not (searchSimple==""))and hasattr(self,'resourceCatalog'):
572: searchString=" AND ".join(searchSimple.split())
573: ids=[x.getObject() for x in self.resourceCatalog({'getMDValueSimpleSearchField':searchString})]
574: else:
575: for entry in displayedObjects:
576: object=entry[1]
577: if searchMD:
578: if hasattr(object,'getMDValue'):
579: flag=0
580: for field in searchMD.keys():
581: #if object.getMDValue(field,generic=generic)==searchMD[field]:
582: #if re.match(searchMD[field],object.getMDValue(field,generic=generic)):
583: if searchMD_modus=='match':
584: searchResult=re.match(searchMD[field],object.getMDValue(field,generic=generic))
585: else:
586: searchResult=re.search(searchMD[field],object.getMDValue(field,generic=generic))
587: if searchResult:
588: flag=1
589: else:
590: flag=0
591: break
592: if flag==1:
593: ids.append(object)
594: else:
595: ids.append(object)
596: if not sortfield:
597: sortfield=getattr(self,'sortfield','weight')
598: tmplist=[]
599: for x in ids:
600: if hasattr(x,sortfield):
601: try:
602: tmp=int(getattr(x,sortfield))
603: except:
604: tmp=getattr(x,sortfield)
605:
606: else:
607: tmp=10000000
608:
609: tmplist.append((tmp,x))
610:
611: if not sortFieldMD:
612: tmplist.sort(sort)
613: else:
614: tmplist.sort(sortWithMD(sortFieldMD))
615:
616: ret=[x for (key,x) in tmplist]
617:
618: return ret
619:
620: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
621: """Rerender all Links"""
622: ret=""
623:
624: if not obj:
625: obj = self
626:
627: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource'],search_sub=1)
628:
629: for entry in entries:
630: if entry[1].meta_type == 'ECHO_resource':
631: try:
632: entry[1].ECHO_getResourceMD(template="no",overwrite="yes")
633: if "title" in types:
634: entry[1].generate_title()
635: if "label" in types:
636: entry[1].generate_label()
637: ret+="OK:"+entry[0]+"-- "+entry[1].getTitle().decode('utf-8')+"-- "+entry[1].getTitle().decode('utf-8')+"<br>"
638: except:
639: ret+="Error:"+entry[0]+"<br>"
640:
641:
642:
643:
644: return "<html><body>"+ret+"Rerenderd all links to resources in: "+self.title+"</html></body>"
645:
646: def reloadMetaDataFromStorage(self,RESPONSE=None):
647: """copy metadata from the storage to ECHO"""
648: ret=""
649: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
650: if RESPONSE is not None:
651: RESPONSE.setHeader("Content-Type", type)
652: RESPONSE.write("<html><body>\n")
653:
654: for resource in resources:
655: x=str(resource[1].copyIndex_meta2echo_resource())+"<br>"
656: if RESPONSE is not None:
657: RESPONSE.write(x+"\n")
658:
659: ret+=x
660:
661: if RESPONSE is not None:
662: #RESPONSE.redirect('./manage_main')
663: RESPONSE.write( "</html></body>")
664:
665: return ret
666:
667: def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None):
668: """rdf"""
669:
670: ret=""
671: about="""<RDF:Description RDF:about="%s">"""
672: name="""<ECHONAVIGATION:name>%s</ECHONAVIGATION:name>"""
673: link="""<ECHONAVIGATION:link xlink:href="%s">%s</ECHONAVIGATION:link>"""
674: clickable="""<ECHONAVIGATION:linkClickable>%s</ECHONAVIGATION:linkClickable>"""
675: #link="""<ECHONAVIGATION:link RDF:about="%s"/>"""
676: type="""<ECHONAVIGATION:type>%s</ECHONAVIGATION:type>"""
677: #xlink="""<ECHONAVIGATION:xlink xlink:href="%s"/>"""
678: if not urn:
679: #urn="urn:"+re.sub('/',':',self.absolute_url())
680: urn=self.absolute_url()
681: about2=about%urn
682: if not nameDef:
683: if hasattr(self,'label') and not (self.label==""):
684: name2=name%self.label
685: elif not self.title=="":
686: name2=name%self.title
687: else:
688: name2=name%self.getId()
689:
690: name2=re.sub('&','&',name2)
691: else:
692: name2=name%nameDef
693:
694: linkURL=re.sub('http:','',linkURL)
695: linkURL2=re.sub('&','&',linkURL)
696: link2=link%(("http:"+linkURL2),("http:"+urllib.quote(linkURL)))
697: clickable2=clickable%"true"
698:
699: if not typeName:
700: type2=type%self.meta_type
701: else:
702: type2=type%typeName
703:
704: #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
705: ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
706: return ret
707:
708: def getCopyrightsFromForm(self,argv):
709: medias={}
710: partners={}
711: copyrights={}
712:
713: copyrightsFinal=[]
714: for arg in argv.keys():
715:
716: if arg[0:5]=='media':
717: nm=int(arg[5:])
718: medias[nm]=argv[arg]
719: elif arg[0:5]=='partn':
720: nm=int(arg[5:])
721: partners[nm]=argv[arg]
722: elif arg[0:5]=='copyr':
723: nm=int(arg[5:])
724: copyrights[nm]=argv[arg]
725:
726:
727:
728: copyrightsList=[(medias[nm],partners[nm],copyrights[nm]) for nm in medias.keys()]
729: for copyright in copyrightsList:
730:
731: if copyright[2]=='institution0000':
732: copyrightsFinal.append((copyright[0],copyright[1],self.getPartnerCopyright(copyright[1],'')))
733: else:
734: if not copyright[0]=='':
735: copyrightsFinal.append(copyright)
736:
737:
738: return copyrightsFinal
739:
740: #List of different types for the graphical linking viewer
741: viewClassificationListMaster=['view point','area']
742:
743:
744: def checkDiffs(self,metadict):
745: """check differences"""
746:
747:
748:
749:
750: def NoneToEmpty(obj):
751: if obj:
752: return obj
753: else:
754: return ""
755:
756:
757:
758: diffs={}
759:
760: tags=self.findTagsFromMapping(self.contentType)
761: self.referencetypes=tags[2]
762: self.fields=tags[3]
763:
764:
765: for field in tags[1]:
766: try:
767: if (NoneToEmpty(self.getMDValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
768: diffs[self.getFieldTag(tags,field)]=1
769: else:
770:
771: diffs[self.getFieldTag(tags,field)]=0
772: except:
773: diffs[self.getFieldTag(tags,field)]=0
774:
775: return diffs
776:
777:
778: def zptFile(self, path, orphaned=False):
779: """returns a page template file from the product"""
780: if orphaned:
781: # unusual case
782: pt=PageTemplateFile(os.path.join(package_home(globals()), path))
783: else:
784:
785: pt=PageTemplateFile(os.path.join(package_home(globals()), path)).__of__(self)
786: return pt
787:
788:
789: def findObjectPath(startobject, filename):
790: """returns the object with the name filename starting at startobject"""
791: if startobject is None:
792: return None
793: paths = filename.split('/')
794: object = startobject
795: for path in paths:
796:
797: if hasattr(object, path):
798: object = getattr(object, path)
799: else:
800: object = None
801: break
802: return object
803:
804:
805: def zptObjectOrFile(self, filename, localdir='zpt', orphaned=False):
806: """returns a page template instance or a file from the product"""
807: # look for an object called path
808: pt = findObjectPath(self, filename)
809: # the object should also not be a python function
810: if (pt is None) or isinstance(pt, types.FunctionType):
811: # get a ZPT file
812: pt = zptFile(self, localdir+'/'+filename, orphaned=orphaned)
813: return pt
814:
815:
816: def sendFile(self, filename, type):
817: """sends an object or a local file (in the product) as response"""
818: # look for an object called filename
819: object = findObjectPath(self, filename)
820: if object:
821: # if the object exists then send it
822: return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
823: else:
824: # send a local file with the given content-type
825: fn = os.path.join(package_home(globals()), filename)
826: self.REQUEST.RESPONSE.setHeader("Content-Type", type)
827: self.REQUEST.RESPONSE.write(file(fn).read())
828: return
829:
830:
831: class BrowserCheck:
832: """check the browsers request to find out the browser type"""
833:
834: def __init__(self, zope):
835: """initialisiere"""
836: self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
837: self.isN4 = False
838: self.isIE = False
839: if string.find(self.ua, 'MSIE') > -1:
840: self.isIE = True
841: else:
842: self.isN4 = string.find(self.ua, 'Mozilla/4.') > -1
843: try:
844: self.nav = self.ua[string.find(self.ua, '('):]
845: ie = string.split(self.nav, "; ")[1]
846: if string.find(ie, "MSIE") > -1:
847: self.versIE = string.split(ie, " ")[1]
848: except: pass
849: self.isMac = string.find(self.ua, 'Macintosh') > -1
850: self.isWin = string.find(self.ua, 'Windows') > -1
851: self.isIEWin = self.isIE and self.isWin
852: self.isIEMac = self.isIE and self.isMac
853:
854:
855: def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None):
856: """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
857:
858: def updateTextToolNode(tag,value):
859:
860: metanode=dom.getElementsByTagName('texttool')[0]
861: try:
862: nodeOld=metanode.getElementsByTagName(tag)
863: except:
864: nodeOld=None
865:
866: if nodeOld:
867: metanode.removeChild(nodeOld[0]).unlink()
868:
869: node=dom.createElement(tag)
870: nodetext=dom.createTextNode(value)
871: node.appendChild(nodetext)
872: metanode.appendChild(node)
873:
874: if xmlfrag:
875: geturl="""<?xml version="1.0" encoding="UTF-8" ?>
876: <resource type="MPIWG">
877: <meta>
878: <bib type="Book">
879: </bib>
880: </meta>
881: </resource>"""
882: dom=xml.dom.minidom.parseString(geturl)
883: else:
884: try:
885: geturl=""
886: for line in urlopen(url).readlines():
887: geturl=geturl+line
888:
889:
890: except:
891: return (None,"XCannot open: "+url)
892:
893: try:
894: dom=xml.dom.minidom.parseString(geturl)
895: except:
896: return (None,"Cannot parse: "+url+"<br>"+geturl)
897:
898:
899:
900: metanodes=dom.getElementsByTagName('bib')
901:
902: if not metanodes:
903: metanodes=dom.getElementsByTagName('archimedes')
904:
905: metanode=metanodes[0]
906:
907: for metaData in metadict.keys():
908:
909: try:
910: nodeOld=metanode.getElementsByTagName(metaData)
911: except:
912: nodeOld=None
913:
914: if nodeOld:
915: metanode.removeChild(nodeOld[0]).unlink()
916: else:
917: # try also old writing rule - instead of _:
918: try:
919: nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
920: except:
921: nodeOld=None
922:
923: if nodeOld:
924: metanode.removeChild(nodeOld[0]).unlink()
925:
926: metanodeneu=dom.createElement(metaData)
927: try:
928: metanodetext=dom.createTextNode(metadict[metaData])
929: except:
930: metanodetext=dom.createTextNode(metadict[metaData].decode('utf-8'))
931: #try:
932: #metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
933: #except:
934: #metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
935: metanodeneu.appendChild(metanodetext)
936: metanode.appendChild(metanodeneu)
937:
938:
939:
940:
941:
942: if project:
943: updateTextToolNode('project',project)
944:
945: if startpage:
946: updateTextToolNode('startpage',startpage)
947:
948: if topbar:
949: updateTextToolNode('toptemplate',topbar)
950:
951: if thumbtemplate:
952: updateTextToolNode('thumbtemplate',thumbtemplate)
953:
954: if xslt:
955: updateTextToolNode('xslt',xslt)
956:
957:
958: if digiliburlprefix:
959: updateTextToolNode('digiliburlprefix',digiliburlprefix)
960:
961: try:
962: return dom.toxml(encoding='utf-8').encode('utf-8')
963: except:
964: return dom.toxml(encoding='utf-8')
965:
966: def readMetadata(url):
967: """Methode zum Auslesen der Metadateninformation zu einer Resource
968: Vorerst noch Typ bib"""
969:
970: metadict={}
971:
972: try:
973: geturl=""
974: for line in urlopen(url).readlines():
975: geturl=geturl+line
976:
977:
978: except:
979: return (None,"Cannot open: "+url)
980:
981: try:
982: dom=xml.dom.minidom.parseString(geturl)
983: except:
984: return (None,"Cannot parse: "+url+"<br>"+geturl)
985:
986: metanode=dom.getElementsByTagName('bib')
987: metadict['bib_type']='Book'
988: if len(metanode)==0:
989: metanode=dom.getElementsByTagName('archimedes')
990: metadict['bib_type']='Archimedes'
991:
992:
993: if not len(metanode)==0:
994: metacontent=metanode[0].childNodes
995:
996: try:
997: metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
998: except:
999: """nothing"""
1000:
1001: for node in metacontent:
1002: try:
1003: #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
1004: #metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
1005: metadict[re.sub('-','_',node.tagName.lower())]=getText(node.childNodes)
1006:
1007: except:
1008: """nothing"""
1009:
1010: return (metadict,"")
1011:
1012:
1013: class MapArea(SimpleItem):
1014: """simple class to hold coordinates"""
1015:
1016: meta_type = 'MapArea'
1017: # Create a SecurityInfo for this class.
1018: security = ClassSecurityInfo()
1019: security.setDefaultAccess("allow")
1020: # type constants
1021: TYPE_AREA = 'area'
1022: TYPE_ARROW = 'arrow'
1023: TYPE_TEXT = 'text'
1024:
1025: def __init__(self, id, coords, label=None, type=None, tip=None, permanent=False):
1026: """init"""
1027: self.coords = coords[0:4]
1028: if len(coords) > 4:
1029: self.angle = coords[4]
1030: else:
1031: self.angle = 0
1032: self.id = id
1033: self.label = label
1034: self.setType(type)
1035: self.tip = tip
1036: self.permanent = permanent
1037:
1038: def setCoords(self, coords):
1039: """sets the coords"""
1040: self.coords = coords
1041:
1042: def getCoordString(self):
1043: """returns coordinates as a string"""
1044: return string.join(self.coords, ',')
1045:
1046: def setCoordString(self, coordstring):
1047: """sets coordinates from a string"""
1048: coords = string.split(coordstring, ',')
1049: self.coords = [c.strip() for c in coords]
1050:
1051: def getFullId(self, prefix=None):
1052: """returns the id with prefixed parent id"""
1053: if prefix is None:
1054: if hasattr(self, 'aq_parent'):
1055: prefix = self.aq_parent.id
1056: else:
1057: prefix = "id"
1058: fid = prefix + "." + self.id
1059: return fid
1060:
1061: def getType(self):
1062: """returns the type"""
1063: return self.type
1064:
1065: def setType(self, type):
1066: """sets the type"""
1067: if type == MapArea.TYPE_ARROW:
1068: self.type = MapArea.TYPE_ARROW
1069: elif type == MapArea.TYPE_AREA:
1070: self.type = MapArea.TYPE_AREA
1071: elif type == MapArea.TYPE_TEXT:
1072: self.type = MapArea.TYPE_TEXT
1073: else:
1074: self.type = MapArea.TYPE_AREA
1075:
1076: def isTypeArea(self):
1077: """returns if the type is area"""
1078: return self.type == MapArea.TYPE_AREA
1079:
1080: def isTypeArrow(self):
1081: """returns if the type is arrow"""
1082: return self.type == MapArea.TYPE_ARROW
1083:
1084: def isTypeText(self):
1085: """returns if the type is text"""
1086: return self.type == MapArea.TYPE_TEXT
1087:
1088: def getAngle(self):
1089: """returns the angle"""
1090: return self.angle
1091:
1092: def setAngle(self, angle):
1093: """sets the angle"""
1094: self.angle = angle
1095:
1096: def getTip(self):
1097: """returns the popup text"""
1098: # patch old version
1099: if not hasattr(self, 'tip'):
1100: self.tip = self.text
1101:
1102: if self.tip is None:
1103: if hasattr(self, 'aq_parent'):
1104: parent = self.aq_parent
1105: if parent.contentType == 'text-popup':
1106: return parent.description
1107: return self.tip
1108:
1109: def setTip(self, text):
1110: """sets the text"""
1111: self.tiptext = text
1112:
1113: def getText(self):
1114: """returns the text fpr the area"""
1115: if hasattr(self, 'aq_parent'):
1116: parent = self.aq_parent
1117: text = parent.getMapText()
1118: if text is not None:
1119: return text.document_src()
1120: return ""
1121:
1122: def getLabel(self):
1123: """returns the link label"""
1124: if self.label is None:
1125: if hasattr(self, 'aq_parent'):
1126: return self.aq_parent.label or self.aq_parent.id
1127: return self.label
1128:
1129: def setLabel(self, label):
1130: """sets the label"""
1131: self.label = label
1132:
1133: def isPermanent(self):
1134: """returns the permanent state"""
1135: # patch old objects
1136: if not hasattr(self, 'permanent'):
1137: self.permanent = False
1138: return self.permanent
1139:
1140: def setPermanent(self, state):
1141: """sets the permanent state"""
1142: if state:
1143: self.permanent = True
1144: else:
1145: self.permanent = False
1146:
1147: def getLinkId(self):
1148: if hasattr(self, 'aq_parent'):
1149: return self.aq_parent.id
1150: return self.id
1151:
1152: # call this to initialize framework classes, which
1153: # does the right thing with the security assertions.
1154: Globals.InitializeClass(MapArea)
1155:
1156:
1157: class MapText(Folder,ZopePageTemplate):
1158: """class to hold text for map areas"""
1159:
1160: meta_type = 'ECHO_mapText'
1161: # Create a SecurityInfo for this class.
1162: security = ClassSecurityInfo()
1163: security.setDefaultAccess("allow")
1164:
1165:
1166: _default_content_fn = os.path.join(package_home(globals()),
1167: 'html', 'ECHO_mapText_default.html')
1168:
1169: def __init__(self, id, text=None, content_type=None):
1170: self.id = str(id)
1171: self.ZBindings_edit(self._default_bindings)
1172: if text is None:
1173: text = open(self._default_content_fn).read()
1174: self.pt_edit(text, content_type)
1175:
1176: def createLocale(self):
1177: """create locale"""
1178: return ECHO_collection.manage_addECHO_localeForm(self)
1179:
1180: manage_main=ZopePageTemplate.pt_editForm
1181:
1182: def manage_addECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
1183: """manage add echo locale in map"""
1184: ECHO_collection.manage_addECHO_locale(self,lang,title,label,text,content_type)
1185: if RESPONSE is not None:
1186: RESPONSE.redirect('manage_main')
1187:
1188:
1189: def changeLocale(self):
1190: """change locale"""
1191: return self.locale_en.change_ECHO_localeForm()
1192:
1193: def change_ECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
1194: """change echo locale"""
1195:
1196: obj= self.locale_en.change_ECHO_locale(lang,title,label,text,content_type,RESPONSE)
1197:
1198:
1199:
1200: if RESPONSE is not None:
1201: RESPONSE.redirect('manage_main')
1202:
1203:
1204: # Product registration and Add support
1205: manage_addMapTextForm = PageTemplateFile(
1206: 'zpt/AddECHO_mapText', globals(), __name__='manage_addMapTextForm')
1207:
1208: def manage_addMapText(self, id, title=None, text=None,
1209: REQUEST=None, submit=None):
1210: "Add a Map Text with optional file content."
1211:
1212: id = str(id)
1213: if REQUEST is None:
1214: self._setObject(id, MapText(id, text))
1215: ob = getattr(self, id)
1216: if title:
1217: ob.pt_setTitle(title)
1218: return ob
1219: else:
1220: file = REQUEST.form.get('file')
1221: headers = getattr(file, 'headers', None)
1222: if headers is None or not file.filename:
1223: zpt = MapText(id, text)
1224: else:
1225: zpt = MapText(id, file, headers.get('content_type'))
1226:
1227: self._setObject(id, zpt)
1228: if title:
1229: ob = getattr(self, id)
1230: ob.pt_setTitle(title)
1231:
1232: try:
1233: u = self.DestinationURL()
1234: except AttributeError:
1235: u = REQUEST['URL1']
1236:
1237: if submit == " Add and Edit ":
1238: u = "%s/%s" % (u, urllib.quote(id))
1239: REQUEST.RESPONSE.redirect(u+'/manage_main')
1240: return ''
1241:
1242: # call this to initialize framework classes, which
1243: # does the right thing with the security assertions.
1244: Globals.InitializeClass(MapText)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>