1: """New version of the product started February, 8th. Without scientific classification, use content-type for further classification."""
2: """Echo collection provides the classes for the ECHO content web-site.
3:
4: class ECHO_collection is the basis class for an ECHO collection.
5:
6: class ECHO_resource contains information on ECHO resources (e.g. an Display environment for Metadata
7:
8: class ECHO_externalLink contains information on externalLinks
9:
10:
11: """
12: import string
13: import re
14: import os
15: import OFS.Image
16: from types import *
17: from OFS.Image import Image
18: from Globals import DTMLFile
19: from OFS.Folder import Folder
20: from OFS.SimpleItem import SimpleItem
21: from AccessControl import ClassSecurityInfo
22: from AccessControl.User import UserFolder
23: from Globals import InitializeClass
24: from Globals import DTMLFile
25: import Globals
26: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
27: from Products.PageTemplates.PageTemplate import PageTemplate
28: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
29: from Globals import Persistent, package_home
30: from Acquisition import Implicit
31: from ECHO_helpers import displayTypes
32: import urllib
33:
34: try:
35: from psycopg import libpq
36: except:
37: try:
38: from pyPgSQL import libpq
39: except:
40: print "ECHO_collection: Warning - No libpq imported!"
41:
42: import xml.dom.minidom
43:
44: import urllib
45: import xml.dom.minidom
46: from ECHO_graphicalOverview import javaHandler,javaScriptMain
47: import ECHO_helpers
48:
49: def getRDFDescription(self,linkURL,urn=None,nameDef=None):
50: """rdf"""
51: ret=""
52: about="""<RDF:Description about="%s">"""
53: name="""<ECHONAVIGATION:name>%s</ECHONAVIGATION:name>"""
54: link="""<ECHONAVIGATION:link xlink:href="%s">%s</ECHONAVIGATION:link>"""
55: #link="""<ECHONAVIGATION:link RDF:about="%s"/>"""
56: type="""<ECHONAVIGATION:type>%s</ECHONAVIGATION:type>"""
57: #xlink="""<ECHONAVIGATION:xlink xlink:href="%s"/>"""
58: if not urn:
59: urn="urn:"+re.sub('/',':',self.absolute_url())
60:
61: about2=about%urn
62: if not nameDef:
63: if hasattr(self,'label') and not (self.label==""):
64: name2=name%self.label
65: elif not self.title=="":
66: name2=name%self.title
67: else:
68: name2=name%self.getId()
69:
70: name2=re.sub('&','&',name2)
71: else:
72: name2=name%nameDef
73:
74: linkURL=re.sub('http:','',linkURL)
75: linkURL2=re.sub('&','&',linkURL)
76: link2=link%(("http:"+linkURL2),("http:"+urllib.quote(linkURL)))
77:
78: type2=type%self.meta_type
79:
80: ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+"\n</RDF:Description>"
81: return ret
82:
83: def getCopyrightsFromForm(self,argv):
84: medias={}
85: partners={}
86: copyrights={}
87:
88: copyrightsFinal=[]
89: for arg in argv.keys():
90:
91: if arg[0:5]=='media':
92: nm=int(arg[5:])
93: medias[nm]=argv[arg]
94: elif arg[0:5]=='partn':
95: nm=int(arg[5:])
96: partners[nm]=argv[arg]
97: elif arg[0:5]=='copyr':
98: nm=int(arg[5:])
99: copyrights[nm]=argv[arg]
100:
101:
102:
103: copyrightsList=[(medias[nm],partners[nm],copyrights[nm]) for nm in medias.keys()]
104: for copyright in copyrightsList:
105:
106: if copyright[2]=='institution0000':
107: copyrightsFinal.append((copyright[0],copyright[1],self.getPartnerCopyright(copyright[1],'')))
108: else:
109: if not copyright[0]=='':
110: copyrightsFinal.append(copyright)
111:
112:
113: return copyrightsFinal
114:
115: #List of different types for the graphical linking viewer
116: viewClassificationListMaster=['view point','area']
117:
118:
119: def checkDiffs(self,metadict):
120: """check differences"""
121:
122:
123:
124:
125: def NoneToEmpty(obj):
126: if obj:
127: return obj
128: else:
129: return ""
130:
131:
132:
133: diffs={}
134:
135: tags=self.findTagsFromMapping(self.contentType)
136: self.referencetypes=tags[2]
137: self.fields=tags[3]
138:
139:
140: for field in tags[1]:
141: try:
142: if (NoneToEmpty(self.getFieldValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
143: diffs[self.getFieldTag(tags,field)]=1
144: else:
145:
146: diffs[self.getFieldTag(tags,field)]=0
147: except:
148: diffs[self.getFieldTag(tags,field)]=0
149:
150: return diffs
151:
152: def content_html(self,type):
153: """template fuer content"""
154: #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
155: #
156: #if templates:
157: # return templates[0][1]()
158:
159: if hasattr(self,type+"_template"):
160: obj=getattr(self,type+"_template")
161: return obj()
162: else:
163: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
164: pt.content_type="text/html"
165: return pt()
166:
167: def toList(field):
168: """Einzelfeld in Liste umwandeln"""
169: if type(field)==StringType:
170: return [field]
171: else:
172: return field
173:
174: def getText(nodelist):
175:
176: rc = ""
177: for node in nodelist:
178: if node.nodeType == node.TEXT_NODE:
179: rc = rc + node.data
180: return rc
181:
182:
183: def sendFile(self, filename, type):
184: """sends an object or a local file (in the product) as response"""
185: paths = filename.split('/')
186: object = self
187: # look for an object called filename
188: for path in paths:
189: if hasattr(object, path):
190: object = getattr(object, path)
191: else:
192: object = None
193: break
194: if object:
195: # if the object exists then send it
196: return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
197: else:
198: # send a local file with the given content-type
199: fn = os.path.join(package_home(globals()), filename)
200: self.REQUEST.RESPONSE.setHeader("Content-Type", type)
201: self.REQUEST.RESPONSE.write(file(fn).read())
202: return
203:
204: class BrowserCheck:
205: """check the browsers request to find out the browser type"""
206:
207: def __init__(self, zope):
208: self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
209: self.isN4 = (string.find(self.ua, 'Mozilla/4.') > -1) and (string.find(self.ua, 'MSIE') < 0)
210: self.isIE = string.find(self.ua, 'MSIE') > -1
211: self.nav = self.ua[string.find(self.ua, '('):]
212: ie = string.split(self.nav, "; ")[1]
213: if string.find(ie, "MSIE") > -1:
214: self.versIE = string.split(ie, " ")[1]
215: self.isMac = string.find(self.ua, 'Macintosh') > -1
216: self.isWin = string.find(self.ua, 'Windows') > -1
217: self.isIEWin = self.isIE and self.isWin
218: self.isIEMac = self.isIE and self.isMac
219:
220:
221:
222:
223: def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
224: """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
225: def updateTextToolNode(tag,value):
226: #print dom,tag,value
227: metanode=dom.getElementsByTagName('texttool')[0]
228: try:
229: nodeOld=metanode.getElementsByTagName(tag)
230: except:
231: nodeOld=None
232:
233: if nodeOld:
234: metanode.removeChild(nodeOld[0]).unlink()
235:
236: node=dom.createElement(tag)
237: nodetext=dom.createTextNode(value)
238: node.appendChild(nodetext)
239: metanode.appendChild(node)
240:
241:
242: try:
243: geturl=""
244: for line in urllib.urlopen(url).readlines():
245: geturl=geturl+line
246:
247:
248: except:
249: return (None,"Cannot open: "+url)
250:
251: try:
252: dom=xml.dom.minidom.parseString(geturl)
253: except:
254: return (None,"Cannot parse: "+url+"<br>"+geturl)
255:
256: metanodes=dom.getElementsByTagName('bib')
257:
258: if not metanodes:
259: metanodes=dom.getElementsByTagName('archimedes')
260:
261: metanode=metanodes[0]
262:
263: for metaData in metadict.keys():
264:
265: try:
266: nodeOld=metanode.getElementsByTagName(metaData)
267: except:
268: nodeOld=None
269:
270: if nodeOld:
271: metanode.removeChild(nodeOld[0]).unlink()
272: else:
273: # try also old writing rule - instead of _:
274: try:
275: nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
276: except:
277: nodeOld=None
278:
279: if nodeOld:
280: metanode.removeChild(nodeOld[0]).unlink()
281:
282: metanodeneu=dom.createElement(metaData)
283: try:
284: metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
285: except:
286: metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
287: metanodeneu.appendChild(metanodetext)
288: metanode.appendChild(metanodeneu)
289:
290:
291:
292:
293:
294: if project:
295: updateTextToolNode('project',project)
296:
297: if startpage:
298: updateTextToolNode('startpage',startpage)
299:
300: if topbar:
301: updateTextToolNode('toptemplate',topbar)
302:
303: if thumbtemplate:
304: updateTextToolNode('thumbtemplate',thumbtemplate)
305:
306: if xslt:
307: updateTextToolNode('xslt',xslt)
308:
309:
310:
311: return dom.toxml().encode('utf-8')
312:
313:
314:
315: def readMetadata(url):
316: """Methode zum Auslesen der Metadateninformation zu einer Resource
317: Vorerst noch Typ bib"""
318:
319: metadict={}
320: try:
321: geturl=""
322: for line in urllib.urlopen(url).readlines():
323: geturl=geturl+line
324:
325:
326: except:
327: return (None,"Cannot open: "+url)
328:
329: try:
330: dom=xml.dom.minidom.parseString(geturl)
331: except:
332: return (None,"Cannot parse: "+url+"<br>"+geturl)
333:
334: metanode=dom.getElementsByTagName('bib')
335: metadict['bib_type']='Book'
336: if len(metanode)==0:
337: metanode=dom.getElementsByTagName('archimedes')
338: metadict['bib_type']='Archimedes'
339:
340:
341: if not len(metanode)==0:
342: metacontent=metanode[0].childNodes
343:
344: try:
345: metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
346: except:
347: """nothing"""
348:
349: for node in metacontent:
350: try:
351: #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
352: metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
353: except:
354: """nothing"""
355:
356:
357: return metadict,""
358:
359:
360: def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs,viewClassification=""):
361:
362: """Allegemeine Informationen zu einer ECHO Collection"""
363:
364: self.viewClassification=viewClassification
365:
366: self.label = label
367: self.title=title
368: self.description=description
369: self.contentType=contentType
370: self.responsible=responsible
371: self.credits=toList(credits)
372: self.weight=weight
373:
374: coords=[]
375: #coordinates of for rectangles
376:
377:
378: if coordstrs:
379: for coordstr in coordstrs:
380:
381: try:
382: temco=coordstr.split(",")
383: except:
384: temco=[]
385:
386: coords.append(temco)
387:
388:
389: self.coords=coords[0:]
390:
391: class ECHO_copyright(Folder):
392: """Copyright informationen"""
393: meta_type="ECHO_copyright"
394:
395:
396:
397: def __init__(self,id,title,copyrights):
398: """init"""
399: self.title=title
400: self.id=id
401: self.copyrights=copyrights[0:]
402:
403: def getCopyrights(self):
404: """return coyprights"""
405: return self.copyrights
406:
407: manage_options = Folder.manage_options+(
408: {'label':'Main Config','action':'ECHO_copyright_configForm'},
409: )
410:
411: def ECHO_copyright_configForm(self):
412: """change form"""
413: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_copyright').__of__(self)
414: pt.content_type="text/html"
415: return pt()
416:
417: def ECHO_copyright_config(self,title,RESPONSE=None):
418: """change"""
419: self.title=title
420: self.copyrights=[]
421: self.copyrights=getCopyrightsFromForm(self,self.REQUEST.form)[0:]
422:
423: if RESPONSE is not None:
424: RESPONSE.redirect('manage_main')
425:
426:
427: def manage_addECHO_copyrightForm(self):
428: """Form for adding"""
429: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_copyright.zpt').__of__(self)
430: return pt()
431:
432: def manage_addECHO_copyright(self, id,title,RESPONSE=None):
433: """add the copyright"""
434:
435: meta_type="ECHO_copyright"
436:
437: #first generate copyrights as list of tripels (mediaType,partner,copyrightType)
438:
439:
440:
441: self._setObject(id, ECHO_copyright(id, title,getCopyrightsFromForm(self,self.REQUEST.form)))
442:
443: if RESPONSE is not None:
444: RESPONSE.redirect('manage_main')
445:
446: class ECHO_layoutTemplate(ZopePageTemplate):
447: """Create a layout Template for different purposes"""
448:
449: meta_type="ECHO_layoutTemplate"
450:
451: def __init__(self, id, text=None, content_type=None,EchoType=None):
452: self.id = str(id)
453:
454:
455:
456: self.ZBindings_edit(self._default_bindings)
457: if text is None:
458: self._default_content_fn = os.path.join(package_home(globals()),
459: 'zpt/ECHO_%s_template_standard.zpt'%EchoType)
460: text = open(self._default_content_fn).read()
461: self.pt_edit(text, content_type)
462:
463:
464: """change form"""
465:
466:
467: def manage_addECHO_layoutTemplateForm(self):
468: """Form for adding"""
469: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_layoutTemplate.zpt').__of__(self)
470: return pt()
471:
472: from urllib import quote
473:
474:
475: def manage_addECHO_layoutTemplate(self, EchoType,title=None,REQUEST=None):
476: "Add a Page Template with optional file content."
477: if type(EchoType)==StringType:
478: EchoTypes=[EchoType]
479: else:
480: EchoTypes=EchoType
481:
482: for singleType in EchoTypes:
483:
484: id = str(singleType)+"_template"
485: if REQUEST is None:
486: self._setObject(id, ECHO_layoutTemplate(id, text,EchoType=singleType))
487: ob = getattr(self, id)
488:
489: if title:
490: ob.pt_setTitle(title)
491: return ob
492: else:
493: file = REQUEST.form.get('file')
494: headers = getattr(file, 'headers', None)
495: if headers is None or not file.filename:
496: zpt = ECHO_layoutTemplate(id,EchoType=singleType)
497: else:
498: zpt = ECHO_layoutTemplate(id, file, headers.get('content_type'))
499:
500: self._setObject(id, zpt)
501: ob = getattr(self, id)
502: if title:
503: ob.pt_setTitle(title)
504:
505: try:
506: u = self.DestinationURL()
507: except AttributeError:
508: u = REQUEST['URL1']
509:
510:
511: REQUEST.RESPONSE.redirect(u+'/manage_main')
512: return ''
513:
514:
515:
516: class ECHO_resource(Folder,Persistent):
517: """ECHO Ressource"""
518: security=ClassSecurityInfo()
519: meta_type='ECHO_resource'
520:
521: viewClassificationList=viewClassificationListMaster
522:
523: getSubCols = ECHO_helpers.getSubCols
524:
525: security.declareProtected('View','index_html')
526:
527: def showRDF(self):
528: """showrdf"""
529: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
530: 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"""
531: ret+=self.getRDF(urn="echo:collectionroot")+"\n"
532:
533: ret+="""</RDF:RDF>"""
534: return ret
535:
536: def getRDF(self,urn=None):
537: """rdf"""
538: ret=getRDFDescription(self,self.link,urn=urn)
539: return ret+self.createSubElementRDF()
540:
541:
542: def createSubElementRDF(self):
543: """rdf list"""
544: urn="urn:"+re.sub('/',':',self.absolute_url())
545: ret=""
546:
547: rettemp="""<RDF:Seq about="%s">\n"""%urn
548: flag=0
549:
550: li="""<RDF:li resource="%s" />\n"""
551: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
552: nurn="urn:"+re.sub('/',':',self.absolute_url()+'/getFullTextXML')
553: rettemp+=li%nurn
554: flag=1
555: rettemp+="</RDF:Seq>"
556:
557: if flag==1:
558: ret+=rettemp
559:
560: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
561: ret+=getRDFDescription(self,self.absolute_url()+'/getFullTextXML',urn=self.absolute_url()+'/getFullTextXML',nameDef="Fulltext")
562:
563: return ret
564:
565: def getAccessRightSelectorHTML(self,outlook="select"):
566: """htmlselector"""
567: values=['free','mpiwg']
568:
569: if outlook=="select":
570: ret="""<select name="%s">"""%self.getId()
571:
572: for value in values:
573: if value==self.getAccessRightMD():
574: ret+="<option selected>%s</option>"%value
575: else:
576: ret+="<option>%s</option>"%value
577: return ret+"</select>"
578:
579: else:
580: ret=""
581: for value in values:
582: print
583: if value==self.getAccessRightMD():
584: ret+="""<input type="radio" name="%s" value="%s" checked>%s"""%(self.getId(),value,value)
585: else:
586: ret+="""<input type="radio" name="%s" value="%s">%s"""%(self.getId(),value,value)
587: return ret
588:
589:
590:
591: def getAccessRightMD(self):
592: """set accessright"""
593: url=self.metalink
594:
595: try:
596: geturl=""
597: for line in urllib.urlopen(url).readlines():
598: geturl=geturl+line
599:
600:
601: except:
602: return (None,"Cannot open: "+url)
603:
604: try:
605: dom=xml.dom.minidom.parseString(geturl)
606: root=dom.getElementsByTagName('resource')[0]
607: except:
608: return (None,"Cannot parse: "+url+"<br>"+geturl)
609:
610: internal=dom.getElementsByTagName('internal')
611: if internal:
612: institution=dom.getElementsByTagName('institution')
613: return getText(institution[0].childNodes)
614:
615: free=dom.getElementsByTagName('free')
616: if free:
617: return "free"
618:
619: return "free" #default free
620:
621: def changeAccessRightMD(self,accessright,RESPONSE=None):
622: """change the rights"""
623:
624: params="accessright=%s"%accessright
625:
626:
627: #print urllib.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read()
628:
629:
630: urllib.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/setAccessRightXML'+urllib.quote('?'+params))).read()
631:
632:
633: if RESPONSE is not None:
634: RESPONSE.redirect('manage_main')
635:
636:
637: def setAccessRightXML(self,accessright):
638: """set accessright"""
639: url=self.metalink
640:
641: try:
642: geturl=""
643: for line in urllib.urlopen(url).readlines():
644: geturl=geturl+line
645:
646:
647: except:
648: return (None,"Cannot open: "+url)
649:
650: try:
651: dom=xml.dom.minidom.parseString(geturl)
652: root=dom.getElementsByTagName('resource')[0]
653: except:
654: return (None,"Cannot parse: "+url+"<br>"+geturl)
655:
656: metanodes=dom.getElementsByTagName('access-conditions')
657:
658: if not metanodes:
659: nodenew=dom.createElement('access-conditions')
660: root.appendChild(nodenew)
661: metanode=nodenew
662: else:
663: metanode=metanodes[0]
664:
665: accesses=metanode.getElementsByTagName('access')
666:
667: if not accesses:
668: nodenew2=dom.createElement('access')
669: metanode.appendChild(nodenew2)
670: metanode2=nodenew2
671: else:
672: metanode2=accesses[0]
673:
674: internal=metanode.getElementsByTagName('internal')
675:
676: if internal:
677: metanode2.removeChild(internal[0]).unlink()
678:
679: free=metanode.getElementsByTagName('free')
680:
681: if free:
682: metanode2.removeChild(internal[0]).unlink()
683:
684:
685: if accessright=='free':
686: nodenew3=dom.createElement('free')
687: metanode2.appendChild(nodenew3)
688: elif accessright=='mpiwg':
689: nodenew3=dom.createElement('internal')
690: nodenew4=dom.createElement('institution')
691: metanodetext=dom.createTextNode('mpiwg')
692: nodenew4.appendChild(metanodetext)
693: nodenew3.appendChild(nodenew4)
694: metanode2.appendChild(nodenew3)
695:
696: return dom.toxml().encode('utf-8')
697:
698: def setStartPageForm(self):
699: """Form for changing the startpage"""
700:
701:
702: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resourceStartPage.zpt').__of__(self)
703: pt.content_type="text/html"
704: return pt()
705:
706:
707: def setStartPage(self,startpage=None,RESPONSE=None):
708: """set start page, if no startpage defined use the generic one of the resource"""
709:
710: if (not (type(startpage)==StringType)) and ("__generic" in startpage): # checke ob generic in der liste
711: startpage=self.absolute_url()+"/startpage_html"
712:
713: if (not startpage) or (startpage=="__generic"):
714: startpage=self.absolute_url()+"/startpage_html"
715:
716:
717: params="startpage=%s"%startpage
718:
719: urllib.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))).read()
720:
721:
722: path=self.metalink
723:
724: path=re.sub(self.REQUEST['SERVER_URL'],'',path)
725: path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path)
726:
727: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
728: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server
729: path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server
730: path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server
731: path=re.sub('/index.meta','',path)
732:
733:
734: urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
735:
736: if RESPONSE is not None:
737: RESPONSE.redirect('manage_main')
738:
739: def changeViewerTemplateSetForm(self):
740: """change the viewer template set"""
741: pt=PageTemplateFile('Products/ECHO_content/zpt/changeResourceViewerTemplateSet').__of__(self)
742: return pt()
743:
744:
745: def getTextToolsField(self,name,default=''):
746: """Lese Textoolsfelder aus index.meta im path aus"""
747:
748: try:
749: dom=xml.dom.minidom.parse(self.metalink)
750: node=dom.getElementsByTagName('texttool')[0] #getNode
751: subnode=node.getElementsByTagName(name)[0]
752:
753: # bei text wird nur der Folder gebraucht
754: if name=="text":
755: splitted=getText(subnode.childNodes).split("/")
756: return splitted[len(splitted)-2]
757: else:
758: return getText(subnode.childNodes)
759: except:
760: return default
761:
762:
763: def changeViewerTemplateSet(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,RESPONSE=None):
764: """changeit"""
765:
766: paramList=['project','startpage','xslt','thumbtemplate','topbar','digiLibTemplate']
767:
768:
769: #writeMetadata(self.metalink,self.metaDataHash,project,None,xslt,thumbtemplate,topbar,digiLibTemplate)
770:
771: params="project=%s&xslt=%s&thumbtemplate=%s&topbar=%s&digiLibTemplate=%s"%(project,xslt,thumbtemplate,topbar,digiLibTemplate)
772:
773:
774: urllib.urlopen('http://echo.mpiwg-berlin.mpg.de/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))).read()
775:
776: # hack Pfad auf die Dokumente
777: path=self.metalink
778:
779:
780:
781: path=re.sub('/index.meta','',path)
782:
783: path=re.sub(self.REQUEST['SERVER_URL'],'',path)
784: path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path)
785:
786: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
787: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
788: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server
789:
790: path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server
791: path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server
792:
793: return urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
794:
795: if RESPONSE is not None:
796: RESPONSE.redirect('manage_main')
797:
798:
799: def getTitle(self):
800: """title"""
801: try:
802: return self.title.encode('utf-8','ignore')
803: except:
804: self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
805: return self.title.encode('utf-8','ignore')
806:
807: def getLabel(self):
808: """title"""
809: try:
810: return self.label.encode('utf-8','ignore')
811: except:
812: self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
813: return self.label.encode('utf-8','ignore')
814:
815: def content_html(self):
816: """template fuer content"""
817: return content_html(self,'resource')
818:
819: def getViewClassification(self):
820: if hasattr(self,'viewClassification'):
821: return self.viewClassification
822: else:
823: return ""
824:
825: def getFullTextXML(self,noredirect=None):
826: """getFullTextXML; gives the FullText as an XML Document, and <error></error> if somthing goes wrong."""
827: try:
828: fh=urllib.urlopen(self.metalink)
829: dom=xml.dom.minidom.parse(fh)
830: texttools=dom.getElementsByTagName('texttool')
831: text=texttools[0].getElementsByTagName('text')
832: texturl=getText(text[0].childNodes)
833:
834: if not noredirect:
835: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
836: self.REQUEST.RESPONSE.redirect(texturl)
837: else:
838: return texturl
839: except:
840:
841: if not noredirect:
842: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
843: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
844: else:
845: return "<error>no fulltext available</error>"
846:
847: def getCopyrightsHTML(self):
848: """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus"""
849:
850: if hasattr(self,'copyrightModel'):
851: obj=self.copyrightModel
852:
853: else:
854: return "ERROR"
855: ret=[]
856:
857: for copyright in obj.getCopyrights():
858:
859: link="copyrightTypes/"+copyright[2]+'/copyright.html'
860:
861: try:
862: copyrightTypeObj=getattr(self.copyrightTypes,copyright[2])
863: label=copyrightTypeObj.label
864: url=copyrightTypeObj.url
865:
866: if url!='':
867: ret.append((url,copyright[0],copyright[1],copyright[2],label))
868: else:
869: if hasattr(copyrightTypeObj, 'copyright.html'):
870: ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label))
871: else:
872: ret.append(('empty',copyright[0],copyright[1],copyright[2],label))
873: except:
874: """nothing"""
875:
876: return ret
877:
878: def getCredits(self):
879: """Ausgabe der credits"""
880: if self.credits:
881: return self.credits
882: else:
883: return []
884:
885: def __init__(self,id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords):
886:
887: self.id = id
888: """Festlegen der ID"""
889:
890: self.label = label
891: self.link= link
892: self.metalink=metalink
893: self.title=title
894: self.weight=weight
895: self.credits=toList(credits)
896: self.description=description
897: self.contentType=contentType
898: self.copyrightType=copyrightType
899: self.renderingType=renderingType
900: self.responsible=responsible
901: self.resourceID=resourceID
902:
903: if coords:
904: coordsnew=[ string.split(x,",") for x in coords]
905: else:
906: coordsnew=[]
907:
908: self.coords=coordsnew
909:
910:
911: def getCoords(self):
912: """gibt coordinaten als String zurück und löscht zugleich einträge die keine Koordinaten sind, letzteres zur korrektur der Eingabe der alten version"""
913: retList=[]
914: if hasattr(self,'coords'):
915: for x in self.coords:
916: if len(x)>1:
917: retList.append(string.join(x,","))
918: return retList
919:
920:
921:
922: def getContentType(self):
923: try:
924: return self.contentType
925: except:
926: return ""
927:
928: def getCopyrightType(self):
929: try:
930: return self.copyrightType
931: except:
932: return ""
933:
934: def getRenderingType(self):
935: try:
936: return self.renderingType
937: except:
938: return ""
939:
940: def ECHO_resource_config(self):
941: """Main configuration"""
942:
943: if not hasattr(self,'weight'):
944: self.weight=""
945:
946: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource.zpt').__of__(self)
947: return pt()
948:
949:
950: def ECHO_resource_config_main(self):
951: """Main configuration"""
952:
953: if not hasattr(self,'weight'):
954: self.weight=""
955:
956: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_main.zpt').__of__(self)
957: return pt()
958:
959: def ECHO_resource_config_coords(self):
960: """Coords configuration """
961:
962: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_coords.zpt').__of__(self)
963: return pt()
964:
965: def ECHO_resource_config_credits(self):
966: """Main configuration"""
967:
968: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_credits.zpt').__of__(self)
969: return pt()
970:
971: def ECHO_resource_config_metadata(self):
972: """Main configuration"""
973:
974: if (hasattr(self,'metadata')) and not (hasattr(self,'metaDataHash')):
975: self.metaDataHash={}
976: self.contentType=self.bib_type
977: for data in self.metadata:
978: data_neu=re.sub('-','_',data)
979: self.meta
980: DataHash[data_neu]=getattr(self,data)[0:]
981:
982:
983: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_metadata.zpt').__of__(self)
984: return pt()
985:
986:
987:
988:
989: def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,RESPONSE=None):
990: """Änderung der Properties"""
991: self.resourceID=resourceID
992: self.title=title
993: self.label=label
994: self.description=description
995:
996: self.contentType=contentType
997: self.renderingType=renderingType
998: self.weight=weight
999:
1000: self.link=link
1001: self.metalink=metalink
1002:
1003: if RESPONSE is not None:
1004: RESPONSE.redirect('manage_main')
1005:
1006:
1007: def changeECHO_resource_coords(self,coords,viewClassification,RESPONSE=None):
1008: """Änderung der Properties - coords"""
1009:
1010: if type(coords)==StringType:
1011: coords=[coords]
1012:
1013: try:
1014: coordsnew=[ string.split(x,",") for x in coords]
1015: except:
1016: coordsnew=[]
1017:
1018: self.coords=coordsnew[0:]
1019: self.viewClassification=viewClassification
1020:
1021: if RESPONSE is not None:
1022: RESPONSE.redirect('manage_main')
1023:
1024: def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None):
1025: """Änderung der Properties"""
1026: self.credits=credits
1027: self.responsible=responsible
1028: self.copyrightType=copyrightType
1029:
1030: if RESPONSE is not None:
1031: RESPONSE.redirect('manage_main')
1032:
1033:
1034: def changeECHO_resource_metadata_local(self,RESPONSE=None):
1035: """change metadata"""
1036: tags=self.findTagsFromMapping(self.contentType)
1037: for field in tags[1]:
1038: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)][0:]
1039:
1040:
1041:
1042: if RESPONSE is not None:
1043: RESPONSE.redirect('manage_main')
1044:
1045: def changeECHO_resource_metadata(self,RESPONSE=None):
1046: """change metadata"""
1047: tags=self.findTagsFromMapping(self.contentType)
1048: self.OSAS_meta={}
1049: for field in tags[1]:
1050: try:
1051: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]
1052: self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)]
1053: except:
1054: """nothing"""
1055:
1056: urllib.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML')).read()
1057:
1058:
1059: if RESPONSE is not None:
1060: RESPONSE.redirect('manage_main')
1061:
1062:
1063: def getMDValue(self,fieldName):
1064: return self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%self.contentType)
1065:
1066: def newMetaXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
1067: """new index.meta"""
1068: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1069:
1070: if not hasattr(self,'metaDataHash'):
1071:
1072: self.copyIndex_meta2echo_resource()
1073: try:
1074: return writeMetadata(self.metalink,self.OSAS_meta,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate)
1075: except:
1076: return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate)
1077:
1078: def getMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
1079: """prints out metadata as stored in the echo environment, format is the index.meta format"""
1080: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1081: return writeMetadata(self.metalink,self.metaDataHash)
1082:
1083: def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,viewClassification="",coords=None,credits=None,RESPONSE=None):
1084: """Änderung der Properties"""
1085:
1086: try:
1087: coordsnew=[ string.split(x,",") for x in coords]
1088: except:
1089: coordsnew=[]
1090:
1091: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
1092: self.viewClassification=viewClassification
1093: self.coords=coordsnew[0:]
1094: self.link=link
1095: self.metalink=metalink
1096:
1097: if RESPONSE is not None:
1098: RESPONSE.redirect('manage_main')
1099:
1100:
1101: manage_options = Folder.manage_options+(
1102: {'label':'Main Config','action':'ECHO_resource_config_main'},
1103: {'label':'Change Metadata','action':'ECHO_resource_config_metadata'},
1104: {'label':'Change Coords','action':'ECHO_resource_config_coords'},
1105: {'label':'Add coords','action':'ECHO_graphicEntry'},
1106: {'label':'Sync Metadata','action':'ECHO_getResourceMD'},
1107: {'label':'Change TemplateSets','action':'changeViewerTemplateSetForm'},
1108: {'label':'set/change startpage','action':'setStartPageForm'},
1109: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
1110: )
1111:
1112: def getOverview(self):
1113: """overview graphics"""
1114:
1115: return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
1116:
1117: def ECHO_graphicEntry(self):
1118: """DO nothing"""
1119: overview = self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])
1120: if overview:
1121: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
1122: return pt()
1123: else:
1124: return "NO OVERVIEW GRAPHICS"
1125:
1126: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
1127: """Enter coords"""
1128: coords=self.coords
1129: temco=coordstr.split(",")
1130: temco.append(angle)
1131: coords.append(temco)
1132:
1133: self.coords=coords[0:]
1134:
1135: if RESPONSE is not None:
1136: RESPONSE.redirect('ECHO_graphicEntry')
1137:
1138:
1139: def isDefinedInThisSet(self,fields,field):
1140: """checks if field is defined in fields"""
1141: if (fields[0].has_key(field)) and not (fields[0][field]==""):
1142: return 1
1143: else:
1144:
1145: return 0
1146:
1147: def getFieldLabel(self,fields,field):
1148: """get labels"""
1149: try:
1150: ret =fields[0][field]
1151: if ret == "":
1152: return field
1153: else:
1154: return ret
1155: except:
1156: return field
1157:
1158:
1159:
1160: def getFieldTag(self,fields,field):
1161: """get labels"""
1162: try:
1163: ret =fields[0][field]
1164: if ret == "":
1165: return field
1166: else:
1167: return ret
1168: except:
1169: return field
1170:
1171:
1172:
1173: def getFieldValue(self,field):
1174: """get value"""
1175:
1176: try:
1177:
1178: ret=self.metaDataHash[field]
1179: if ret == "":
1180: return None
1181: else:
1182: return ret
1183: except:
1184: return None
1185:
1186: def getMetaDataHash(self):
1187: """md hash"""
1188: return self.metaDataHash
1189:
1190: def setFieldValue(self,field,value):
1191: """get value"""
1192:
1193: if not hasattr(self,'metaDataHash'):
1194: setattr(self,'metaDataHash',{})
1195: self.metaDataHash[field]=value[0:]
1196:
1197:
1198: def copySearchFields(self):
1199: """copys metadatafields to the object"""
1200: fields=['author','title','year']
1201: for field in fields:
1202: setattr(self,'MD_'+field,self.getFieldValue(field))
1203:
1204:
1205: def findLabelsFromMapping(self,referenceType):
1206: """gib hash mit label -> generic zurueck"""
1207: #return {},[]
1208:
1209: temp=self.ZopeFind(self.standardMD)
1210:
1211: if referenceType=="":
1212: referenceType="book"
1213:
1214:
1215: bibdata={}
1216: retdata={}
1217: fields=[]
1218: fieldlist=self.standardMD.fieldList
1219:
1220: for referenceTypeF in self.referencetypes:
1221:
1222: if referenceTypeF[1].title.lower() == referenceType.lower():
1223:
1224: try:
1225: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
1226: referenceType=referenceTypeF[1].title
1227: except:
1228: bibdata[referenceType]=referenceTypeF[1].fields
1229:
1230:
1231: bibdata['data']=referenceTypeF[1]
1232: fields=bibdata[referenceType]
1233: for field in fieldlist:
1234: retdata[field]=referenceTypeF[1].getValue(field)[1]
1235:
1236: return retdata,fieldlist,temp,fields
1237:
1238: def findTagsFromMapping(self,referenceType):
1239: """gib hash mit label -> generic zurueck"""
1240:
1241:
1242: if referenceType=="":
1243: referenceType="book"
1244:
1245: temp = self.ZopeFind(self.standardMD)[0:]
1246:
1247:
1248: #self.referencetypes=temp[0:]
1249:
1250:
1251:
1252:
1253:
1254:
1255: bibdata={}
1256: retdata={}
1257: fieldlist=self.standardMD.fieldList
1258: fields=[]
1259: for referenceTypeF in temp:
1260: #print referenceType
1261:
1262: if referenceTypeF[1].title.lower() == referenceType.lower():
1263: try:
1264: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
1265: referenceType=referenceTypeF[1].title
1266: except:
1267: bibdata[referenceType]=referenceTypeF[1].fields
1268: bibdata['data']=referenceTypeF[1]
1269: fields=bibdata[referenceType]
1270: for field in fieldlist:
1271: retdata[field]=referenceTypeF[1].getValue(field)[0]
1272:
1273: return retdata,fieldlist,temp,fields
1274:
1275:
1276: security.declarePublic('copyIndex_meta2echo_resource') # has to be change, presentlyset because of OSAS koordination
1277: def copyIndex_meta2echo_resource(self,RESPONSE=None):
1278: """copy MD von Index_meta to the echo_resource"""
1279:
1280: (metadict, error)=readMetadata(self.metalink)
1281:
1282:
1283:
1284: self.metaDataHash={}
1285: if not error=="": #Fehler beim Auslesen des Metafiles
1286:
1287: return "ERROR:",error
1288:
1289: self.contentType=metadict['bib_type'][0:]
1290: fields=self.findTagsFromMapping(self.contentType)
1291:
1292: #fields=self.findLabelsFromMapping(self.contentType)
1293: for field in fields[1]:
1294:
1295: if self.isDefinedInThisSet(fields,field):
1296: #print urllib.unquote(metadict.get(self.getFieldTag(fields,field),''))
1297: self.setFieldValue(self.getFieldTag(fields,field),metadict.get(self.getFieldTag(fields,field),''))
1298:
1299:
1300:
1301: if RESPONSE:
1302: return RESPONSE.redirect('manage_main')
1303:
1304: def ECHO_getResourceMD(self,template="yes",back=None):
1305: """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""
1306: (metadict, error)=readMetadata(self.metalink)
1307:
1308: if back:
1309: self.REQUEST.SESSION['back']=back
1310:
1311: if not error=="": #Fehler beim Auslesen des Metafiles
1312: return "ERROR:",error
1313:
1314:
1315: if not (metadict['bib_type'].lower()==self.contentType.lower()):
1316: self.REQUEST.SESSION['contentStorage']=metadict['bib_type']
1317: self.REQUEST.SESSION['contentZope']=self.contentType
1318:
1319: return PageTemplateFile('Products/ECHO_content/zpt/ECHO_getResourceMDErrorContentType.zpt').__of__(self)()
1320:
1321: self.REQUEST.SESSION['metadict']=metadict
1322:
1323:
1324:
1325: self.REQUEST.SESSION['diffs']=checkDiffs(self,self.REQUEST.SESSION['metadict'])
1326:
1327:
1328:
1329: if template=="yes":
1330: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_resourceMD.zpt').__of__(self)
1331: return pt()
1332:
1333:
1334:
1335:
1336:
1337: def ECHO_getMD(self,item):
1338: """Ausgabe der MD"""
1339: return getattr(self,item)
1340:
1341: def index_html(self):
1342: """standard page"""
1343:
1344: return self.REQUEST.RESPONSE.redirect(self.link)
1345:
1346: def startpage_html(self):
1347: """prints out a startpage for a resource for use e.g. in the BVE"""
1348:
1349: # suche ob startpage.html in dem Ordner vorhanden ist, dann wir diese angezeigt
1350:
1351: sp=self.ZopeFind(self,obj_ids=['startpage.html'])
1352:
1353: if sp:
1354: return sp[1]()
1355:
1356: #prüfen ob irgendwo ein template
1357: if hasattr(self,'startpage_index_template'):
1358: return self.startpage_index_template()
1359:
1360: #generisches template ausgeben
1361:
1362: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_startpage_index_template_standard.zpt').__of__(self)
1363: pt.content_type="text/html"
1364: return pt()
1365:
1366: def toc_html(self):
1367:
1368: sp=self.ZopeFind(self,obj_ids=['toc.html'])
1369:
1370: if sp:
1371: return sp[0][1]()
1372:
1373:
1374: security.declarePublic('generate_label') # has to be change, presentlyset because of OSAS koordination
1375:
1376: def generate_label(self):
1377: """Erzeugt_standard_Label aus Template"""
1378: pt=getattr(self,"label_template_"+self.contentType.lower())
1379:
1380: self.label=pt()[0:]
1381: return pt()
1382:
1383: security.declarePublic('generate_title') # has to be change, presentlyset because of OSAS koordination
1384:
1385: def generate_title(self,RESPONSE=None):
1386: """Erzeugt_standard_Label aus Template"""
1387: pt=getattr(self,"label_template_"+self.contentType.lower())
1388:
1389: self.title=pt()[0:]
1390:
1391: return pt()
1392:
1393: Globals.InitializeClass(ECHO_resource)
1394:
1395: def manage_addECHO_resourceForm(self):
1396: """Form for adding a ressource"""
1397: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_resourceForm.zpt').__of__(self)
1398: return pt()
1399:
1400:
1401:
1402: def manage_addECHO_resource(self,id,title,label,description,responsible,link,metalink,weight,copyrightType=None,resourceID=None,contentType=None,renderingType=None,credits=None,coords=None,RESPONSE=None):
1403: """addaresource"""
1404:
1405: newObj=ECHO_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords)
1406:
1407: self._setObject(id,newObj)
1408:
1409: if RESPONSE is not None:
1410: RESPONSE.redirect('manage_main')
1411:
1412:
1413: class ECHO_externalLink(Folder):
1414: """Link zu einer externen Ressource"""
1415: security=ClassSecurityInfo()
1416: meta_type='ECHO_externalLink'
1417:
1418: def getTitle(self):
1419: """title"""
1420: try:
1421: return self.title.encode('utf-8','ignore')
1422: except:
1423: self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
1424: return self.title.encode('utf-8','ignore')
1425:
1426: def getLabel(self):
1427: """title"""
1428: try:
1429: return self.label.encode('utf-8','ignore')
1430: except:
1431: self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
1432: return self.label.encode('utf-8','ignore')
1433:
1434: def content_html(self):
1435: """template fuer content"""
1436: return content_html(self,'externalLink')
1437:
1438: def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords):
1439:
1440: self.id = id
1441: """Festlegen der ID"""
1442:
1443: self.credits=toList(credits)
1444: self.label = label
1445: self.link= link
1446: self.title=title
1447: self.weight=weight
1448: self.description=description
1449: self.contentType=contentType
1450: self.responsible=responsible
1451: coordsnew=[ string.split(x,",") for x in coords]
1452: self.coords=coordsnew
1453:
1454: def ECHO_externalLink_config(self):
1455: """Main configuration"""
1456:
1457: if not hasattr(self,'weight'):
1458: self.weight=""
1459: if not hasattr(self,'coords'):
1460:
1461: self.coords=['']
1462:
1463:
1464: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_externalLink.zpt').__of__(self)
1465: return pt()
1466:
1467:
1468: def changeECHO_externalLink(self,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None):
1469:
1470: """Änderung der Properties"""
1471: try:
1472: coordsnew=[ string.split(x,",") for x in coords]
1473: except:
1474: coordsnew=[]
1475:
1476: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coords)
1477:
1478: self.coords=coordsnew[0:]
1479: self.link=link
1480: if RESPONSE is not None:
1481: RESPONSE.redirect('manage_main')
1482:
1483:
1484: manage_options = Folder.manage_options+(
1485: {'label':'Main Config','action':'ECHO_externalLink_config'},
1486: )
1487:
1488:
1489: def index_html(self):
1490: """standard page"""
1491:
1492: return self.REQUEST.RESPONSE.redirect(self.link)
1493:
1494: def manage_addECHO_externalLinkForm(self):
1495: """Form for external Links"""
1496: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_externalLinkForm.zpt').__of__(self)
1497: return pt()
1498:
1499:
1500: def manage_addECHO_externalLink(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None):
1501: """Add an external Link"""
1502:
1503: newObj=ECHO_externalLink(id,link,title,label,description,contentType,responsible,credits,weight,coords)
1504:
1505: self._setObject(id,newObj)
1506:
1507: if RESPONSE is not None:
1508: RESPONSE.redirect('manage_main')
1509:
1510:
1511: class ECHO_link(ECHO_externalLink):
1512: """external_link"""
1513:
1514: meta_type="ECHO_link"
1515:
1516:
1517: def content_html(self):
1518: """template fuer link"""
1519: if hasattr(self,"link_template"):
1520: return content_html(self,'link')
1521: else:
1522: return content_html(self,'collection')
1523:
1524: def manage_addECHO_linkForm(self):
1525: """Form for external Links"""
1526: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_linkForm.zpt').__of__(self)
1527: return pt()
1528:
1529:
1530: def manage_addECHO_link(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None):
1531: """Add an external Link"""
1532:
1533: newObj=ECHO_link(id,link,title,label,description,contentType,responsible,credits,weight,coords)
1534:
1535: self._setObject(id,newObj)
1536:
1537: if RESPONSE is not None:
1538: RESPONSE.redirect('manage_main')
1539:
1540:
1541: class ECHO_collection(Folder, Persistent, Implicit):
1542: """ECHO Collection"""
1543:
1544: security=ClassSecurityInfo()
1545: meta_type='ECHO_collection'
1546: viewClassificationList=viewClassificationListMaster
1547: displayTypes=displayTypes
1548:
1549: path="/mpiwg/online/permanent/shipbuilding"
1550:
1551: def showRDF(self):
1552: """showrdf"""
1553: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1554: 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"""
1555: ret+=self.getRDF(urn="echo:collectionroot")+"\n"
1556:
1557: ret+="""</RDF:RDF>"""
1558: return ret
1559:
1560: def getRDF(self,urn=None):
1561: """rdf of the collection"""
1562:
1563: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
1564:
1565: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
1566:
1567: if not urn:
1568: urn="urn:"+re.sub('/',':',self.absolute_url())
1569:
1570: li="""<RDF:li resource="%s" />\n"""
1571:
1572:
1573: for content in contents:
1574: ret+=content[1].getRDF()+"\n"
1575:
1576: ret+="""<RDF:Seq about="%s">\n"""%urn
1577: for content in contents:
1578: nurn="urn:"+re.sub('/',':',content[1].absolute_url())
1579: ret+=li%nurn
1580: return ret+"</RDF:Seq>"
1581:
1582:
1583: def changeLabels(self):
1584: """change form"""
1585: pt=PageTemplateFile('Products/ECHO_content/zpt/changeLabelsForm').__of__(self)
1586: pt.content_type="text/html"
1587: return pt()
1588:
1589: def changeTitles(self):
1590: """change form"""
1591: pt=PageTemplateFile('Products/ECHO_content/zpt/changeTitleForm').__of__(self)
1592: pt.content_type="text/html"
1593: return pt()
1594:
1595: def changeAccessRightsCollection(self):
1596: """change"""
1597: ret=""
1598: argv=self.REQUEST.form
1599:
1600: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1601: for resource in resources:
1602:
1603: try:
1604: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1605: resource[1].changeAccessRightMD(argv[resource[1].getId()])
1606: except:
1607: """not"""
1608: return ret
1609:
1610: def changeLabelsInCollection(self):
1611: """change all lables of a collection"""
1612: ret=""
1613: argv=self.REQUEST.form
1614:
1615: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1616: for resource in resources:
1617:
1618: try:
1619: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1620: resource[1].label=argv[resource[1].getId()][0:]
1621: except:
1622: """not"""
1623: return ret
1624:
1625: def changeTitlesInCollection(self):
1626: """change all lables of a collection"""
1627: ret=""
1628: argv=self.REQUEST.form
1629:
1630: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1631: for resource in resources:
1632:
1633: try:
1634: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1635: resource[1].title=argv[resource[1].getId()][0:]
1636: except:
1637: """not"""
1638: return ret
1639:
1640: def updateCollection(self,RESPONSE=None):
1641: """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""
1642: files=os.listdir(self.path)
1643: ret=""
1644: for fileName in files:
1645:
1646: if fileName:
1647:
1648: tempPath=re.sub("/mpiwg/online","",self.path)
1649: link="http://echo.mpiwg-berlin.mpg.de/zogilib_book?fn="+tempPath+"/"+fileName+"/pageimg"
1650:
1651: metalink=self.path+"/"+fileName+"/index.meta"
1652: try:
1653:
1654: #link="http://nausikaa2.mpiwg-berlin.mpg.de/cgi-bin/toc/toc.x.cgi?dir="+fileName+"&step=thumb"
1655:
1656: newObj=ECHO_resource(fileName,link,metalink,fileName,fileName,fileName,'generated','book','','','','','','')
1657: self._setObject(fileName,newObj)
1658:
1659: genObj=getattr(self,fileName)
1660: #genObj.createIndexFile()
1661: ret+="OK:"+fileName+"<br/>"
1662: except:
1663: print "ERROR"
1664: ret+="ERROR:"+fileName+"<br/>"
1665:
1666: return ret
1667:
1668: if RESPONSE is not None:
1669: RESPONSE.redirect('manage_main')
1670:
1671: def updateCollectionMD(self,RESPONSE=None):
1672: """updateMD"""
1673: files=os.listdir(self.path)
1674: for fileName in files:
1675: if fileName:
1676: genObj=getattr(self,fileName)
1677: genObj.copyIndex_meta2echo_resource()
1678: genObj.generate_title()
1679:
1680: if RESPONSE is not None:
1681: RESPONSE.redirect('manage_main')
1682:
1683:
1684:
1685: def changeViewerTemplateSetsForm(self):
1686: """change the viewer template set"""
1687: pt=PageTemplateFile('Products/ECHO_content/zpt/changeViewerTemplateSet').__of__(self)
1688: return pt()
1689:
1690: def getViewerTemplateSets(self,obj_ids=None):
1691: """Get the ViewerTemplateSet title for configuration"""
1692: ret=[]
1693:
1694: try:
1695: viewerTemplateSets=self.ZopeFind(self.viewerTemplateSets,obj_metatypes=['OSAS_viewerTemplateSet'],obj_ids=obj_ids)#assumes viewerTemplateSets folder somewhere in the hierarchie.
1696:
1697: for viewerTemplateSet in viewerTemplateSets:
1698: ret.append((viewerTemplateSet[1].title,viewerTemplateSet[0],viewerTemplateSet[1]))
1699:
1700: return ret
1701:
1702: except:
1703: return [('no ViewerTemplateSetfolders','')]
1704:
1705: def getTextToolsField(self,name,default=''):
1706: """Lese viewerTemplateSet der Collection not implemented yet!"""
1707:
1708: return default
1709:
1710:
1711: def isSelectedViewerTemplateSet(self,obj,id):
1712: """is ausgewählt"""
1713:
1714: if self.REQUEST['viewerTemplateSet']==id:
1715: return 1
1716: else:
1717: return None
1718:
1719: def changeViewerTemplateSets(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,RESPONSE=None):
1720: """change the templates"""
1721:
1722: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1723:
1724: for resource in resources:
1725:
1726: resource[1].changeViewerTemplateSet(project,xslt,thumbtemplate,topbar,digiLibTemplate)
1727:
1728: if RESPONSE is not None:
1729: RESPONSE.redirect('manage_main')
1730:
1731:
1732: def copySearchFields(self,RESPONSE=None):
1733: """copys import metadatafields to the object"""
1734: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1735:
1736: for resource in resources:
1737:
1738: resource[1].copySearchFields()
1739:
1740: if RESPONSE is not None:
1741: RESPONSE.redirect('manage_main')
1742:
1743: def reloadMetaDataFromStorage(self,RESPONSE=None):
1744: """copy metadata from the storage to ECHO"""
1745: ret=""
1746: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
1747:
1748: for resource in resources:
1749:
1750: ret+=str(resource[1].copyIndex_meta2echo_resource())+"<br>"
1751:
1752:
1753: if RESPONSE is not None:
1754: # RESPONSE.redirect('manage_main')
1755: return ret
1756:
1757: def getPartnerCopyright(self,name,sonst="generic"):
1758: """gibt generisches copyright eines partners aus, sonst behalte jetzige einsteillung"""
1759: #print "hi",name,sonst
1760: #print getattr(self.partners,name).copyrightType
1761: try:
1762: partner=getattr(self.partners,name)
1763: return partner.copyrightType
1764: except:
1765: print "error"
1766: return sonst
1767:
1768: def partnerSelector_HTML(self,selected=None):
1769: """give type selector"""
1770: if not selected:
1771: retStr="<option selected>\n"
1772: else:
1773: retStr="<option>\n"
1774:
1775: try: # erste version copyrightTypes exists
1776: for partner in self.credits:
1777: if selected and (partner==selected):
1778: retStr+="""<option selected value="%s">%s\n"""%(partner,partner)
1779: else:
1780: retStr+="""<option value="%s">%s\n"""%(partner,partner)
1781: except:
1782: """nothing"""
1783: return retStr
1784:
1785: def getViewClassification(self):
1786: if hasattr(self,'viewClassification'):
1787: return self.viewClassification
1788: else:
1789: return ""
1790:
1791: def getTitle(self):
1792: """title"""
1793: try:
1794: return self.title.encode('utf-8','ignore')
1795: except:
1796: self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
1797: return self.title.encode('utf-8','ignore')
1798:
1799: def getLabel(self):
1800: """title"""
1801: try:
1802: return self.label.encode('utf-8','ignore')
1803: except:
1804: self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
1805: return self.label.encode('utf-8','ignore')
1806:
1807: def createRessourcesFromXMLForm(self):
1808: """form"""
1809: pt=PageTemplateFile('Products/ECHO_content/zpt/createRessourcesFromXMLForm.zpt').__of__(self)
1810: return pt()
1811:
1812: def createRessourcesFromXML(self,fileupload):
1813: """read an XML file for generating resources"""
1814: dom=xml.dom.minidom.parse(fileupload)
1815: ret="<h2>Added</h2>"
1816: for resource in dom.getElementsByTagName('resource'):
1817: link=getText(resource.getElementsByTagName('link')[0].childNodes)
1818: label=getText(resource.getElementsByTagName('label')[0].childNodes)
1819: #splitted=link.split("?")[0].split("/")
1820: #id=splitted[len(splitted)-1].encode('ascii')
1821: id=re.sub(" ","_",label).encode('ascii')
1822:
1823: ret+="<p>"+label+"</p>"
1824: manage_addECHO_resource(self,id,label.encode('ascii'),label.encode('ascii'),"","","",link.encode('ascii'),"","")
1825: return ret
1826:
1827: def getImageTag(self):
1828: """GetTag"""
1829: try:
1830: return self.imageTag
1831: except:
1832: return ""
1833:
1834: def addResource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None):
1835: """SSS"""
1836: try:
1837: manage_addECHO_resource(self,id,title,label,description,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None)
1838: return "done"
1839: except:
1840: return None
1841:
1842: def getSecondaryLink(self):
1843: """secondary link"""
1844: try:
1845: return self.secondaryLink
1846: except:
1847: return ""
1848:
1849: def getSecondaryLinkTitle(self):
1850: """secondary link"""
1851: try:
1852: return self.secondaryLinkTitle
1853: except:
1854: return ""
1855:
1856: def getCollectionTreeXML(self):
1857: """Tree as XML"""
1858:
1859: def getCollection(object,depth=0):
1860: depth+=1
1861: collections=""
1862: for entry in object.__dict__.keys():
1863: element=getattr(object,entry)
1864: try:
1865: if element.meta_type in ["ECHO_collection","ECHO_group"]:
1866: collections+="<element name=\""+quote(element.title)+"\" url=\""+element.absolute_url()+"\">"
1867: collections+=getCollection(element,depth)+"</element>\n"
1868: except:
1869: """nothing"""
1870: return collections
1871:
1872: ret="""<?xml version="1.0" encoding="utf-8" ?>"""
1873: return ret+"<collection>"+getCollection(self)+"</collection>"
1874:
1875: def createJavaScript(self):
1876: """OLD CreateJava"""
1877: ret=javaScriptMain
1878:
1879: dynamical="\n"
1880: for ob in self.getGraphicCoords():
1881: if ob[4][4] == "":
1882: dynamical+="""Coords.push(new Coord('%s', Img, %s));\n"""%(ob[1],ob[0])
1883: else:
1884: dynamical+="""Coords.push(new Coord('%s', Img, %s));//%s\n"""%(ob[1],ob[0],ob[4][4])
1885: dynamical+="ShowArrow(new getObj('i.%s'),Img,%s);\n"%(ob[1],ob[0])
1886: ret+=javaHandler%dynamical
1887: return ret
1888:
1889: def createJSAreas(self):
1890: """create area calls for JavaScript"""
1891: dynamical="\n"
1892: for ob in self.getGraphicCoords():
1893: if ob[5] == "area":
1894: dynamical+="""addArea('%s', 'overview', %s, 'area');\n"""%(ob[1],ob[0])
1895: else:
1896: dynamical+="""addArea('%s', 'overview', %s, 'arrow');\n"""%(ob[1],ob[0])
1897: return dynamical
1898:
1899: def createMapHead(self):
1900: """create javascript include and script tags for head"""
1901: pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_content_map_frag_js')).__of__(self)
1902: return pt()
1903:
1904: def createMapImg(self):
1905: """generate img-tag for map"""
1906: bt = BrowserCheck(self)
1907: tag = ""
1908: src = self.REQUEST['URL1'] + "/overview"
1909: if bt.isN4:
1910: tag += '<ilayer id="overview" visibility="show"><img src="%s"></ilayer>'%src
1911: else:
1912: tag += '<img id="overview" src="%s" />'%src
1913: return tag
1914:
1915: def createMapLink(self, ob, text=None):
1916: """generate map link"""
1917: bt = BrowserCheck(self)
1918: id = ob[1]
1919: link = ob[1]
1920: if text == None:
1921: text = ob[2]
1922: tag = ""
1923: if bt.isN4:
1924: tag += '<ilayer id="a.%s"><a onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
1925: tag += ">" + text + "</a></ilayer>"
1926: else:
1927: tag = '<a id="a.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
1928: if ob[3].contentType == 'text-popup':
1929: tag += ' title="%s"'%ob[3].description
1930: tag += ">" + text + "</a>"
1931: return tag
1932:
1933: def createMapAux(self, ob, arrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil"):
1934: """generate map link image, text and other stuff"""
1935: id = ob[1]
1936: link = ob[1]
1937: vtype = ob[5]
1938: ctype = ob[3].contentType
1939: bt = BrowserCheck(self)
1940: tag = ""
1941:
1942: if bt.isN4:
1943: tag += '<layer id="i.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)">'%(id,id,id)
1944: if vtype == "view point":
1945: rot = ob[4][4]
1946: tag += '<a href="%s"><img border="0" src="%s&rot=%s" /></a>'%(link,arrowsrc,rot)
1947: else:
1948: tag += '<a href="%s"><img border="0" width="1000" height="1000" src="trans_img"'%(link)
1949: if ctype == "text-popup":
1950: desc = ob[3].description
1951: tag += ' alt="%s"'%desc
1952: tag += ' /></a>'
1953: tag += '</layer>'
1954: else:
1955: tag = '<a id="b.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank">'%(id,id,id,link)
1956: if vtype == "view point":
1957: rot = ob[4][4]
1958: if bt.isIEWin and bt.versIE > 5:
1959: 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,arrowsrc,rot,arrowsrc,rot)
1960: else:
1961: tag += '<img id="i.%s" src="%s&rot=%s" border="1" style="position:absolute; top:-100px; left:-100px; border-style:none;" />'%(id,arrowsrc,rot)
1962: else:
1963: if bt.isIEWin:
1964: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;background:url(area_img)"'%(id)
1965: else:
1966: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;"'%(id)
1967: if ctype == "text-popup":
1968: desc = ob[3].description
1969: tag += ' title="%s"'%desc
1970: tag += '> </div>'
1971: tag += '</a>'
1972: return tag
1973:
1974:
1975: security.declarePublic('getCreditObject')
1976: def getCreditObject(self,name):
1977: """credit id to credititem"""
1978: try:
1979: return getattr(self.partners,name)
1980: except:
1981: return ""
1982:
1983: security.declarePublic('ECHO_generateNavBar')
1984: def ECHO_generateNavBar(self):
1985: """Erzeuge Navigationsbar"""
1986: link=""
1987: object="self"
1988: ret=[]
1989: path=self.getPhysicalPath()
1990: for element in path:
1991:
1992:
1993: if not element=="":
1994: object+="."+element
1995:
1996: label=eval(object).label
1997: link+="/"+element
1998: if not label=="":
1999: ret.append((label,link))
2000: return ret
2001:
2002: security.declarePublic('ECHO_rerenderLinksMD')
2003:
2004: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
2005: """Rerender all Links"""
2006: ret=""
2007:
2008: if not obj:
2009: obj = self
2010:
2011: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
2012:
2013: for entry in entries:
2014: if entry[1].meta_type == 'ECHO_resource':
2015: try:
2016: entry[1].ECHO_getResourceMD(template="no")
2017: if "title" in types:
2018: entry[1].generate_title()
2019: if "label" in types:
2020: entry[1].generate_label()
2021: ret+="OK:"+entry[0]+"-- "+entry[1].getTitle().decode('utf-8')+"-- "+entry[1].getTitle().decode('utf-8')+"<br>"
2022: except:
2023: ret+="Error:"+entry[0]+"<br>"
2024:
2025: else:
2026: self.ECHO_rerenderLinksMD(entry[1])
2027:
2028:
2029:
2030: return ret+"Rerenderd all links to resources in: "+self.title
2031:
2032: security.declarePublic('ECHO_newViewerLink')
2033:
2034:
2035: def getCoords(self):
2036: try:
2037:
2038: x= [string.join(x,",") for x in self.coords]
2039: return x
2040:
2041: except:
2042:
2043: return []
2044:
2045: def __init__(self,id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle,secondaryLink,imageTag="",bgcolour=""):
2046:
2047:
2048: self.id = id
2049: """Festlegen der ID"""
2050: self.credits=toList(credits)
2051: self.label = label
2052: self.title=title
2053: self.description=description
2054: self.contentType=contentType
2055: self.responsible=responsible
2056: self.imageTag=imageTag
2057: self.weight=weight
2058: self.sortfield=sortfield
2059: coordsnew=[ string.split(x,",") for x in coords]
2060: self.coords=coordsnew
2061: self.secondaryLinkTitle=secondaryLinkTitle
2062: self.secondaryLink=secondaryLink
2063: self.bgcolour=bgcolour
2064:
2065:
2066: manage_options = Folder.manage_options+(
2067: {'label':'Main Config','action':'ECHO_collection_config'},
2068: {'label':'Change Labels','action':'changeLabels'},
2069: {'label':'Change Titles','action':'changeTitles'},
2070: {'label':'Rerender Labels and Titles','action':'ECHO_rerenderLinksMD'},
2071: {'label':'Graphics','action':'ECHO_graphicEntry'},
2072: {'label':'create resources from XML','action':'createRessourcesFromXMLForm'},
2073: {'label':'Change Viewer Templates','action':'changeViewerTemplateSetsForm'},
2074: {'label':'Reload Metadata','action':'reloadMetaDataFromStorage'},
2075: {'label':'ImportCollection','action':'updateCollection'},
2076: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
2077: )
2078:
2079: def getOverview(self):
2080: """overview graphics"""
2081:
2082: return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
2083:
2084:
2085: def ECHO_graphicEntry(self):
2086: """DO nothing"""
2087: overview = self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])
2088:
2089:
2090: if overview:
2091: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
2092: return pt()
2093: else:
2094: return "NO OVERVIEW GRAPHICS"
2095:
2096: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
2097: """Enter coords"""
2098: coords=self.coords
2099: temco=coordstr.split(",")
2100: temco.append(angle)
2101: coords.append(temco)
2102: self.coords=coords[0:]
2103:
2104: if RESPONSE is not None:
2105: RESPONSE.redirect('ECHO_graphicEntry')
2106:
2107:
2108: security.declarePublic('ECHO_collection_config')
2109: def ECHO_collection_config(self):
2110: """Main configuration"""
2111:
2112: if not hasattr(self,'weight'):
2113: self.weight=""
2114:
2115: if not hasattr(self,'sortfield'):
2116: self.sortfield="weight"
2117:
2118: if not hasattr(self,'coords'):
2119: self.coords=[]
2120:
2121: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_collection.zpt').__of__(self)
2122: return pt()
2123:
2124:
2125: security.declarePublic('changeECHO_collection')
2126:
2127:
2128: def getBgcolour(self):
2129: """colour"""
2130: if hasattr(self,'bgcolour') and not (self.bgcolour==""):
2131: return self.bgcolour
2132: else:
2133: return "#dddddd"
2134:
2135: def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",viewClassification=None,location=None):
2136: """Aenderung der Properties"""
2137:
2138: self.secondaryLink=secondaryLink
2139: self.secondaryLinkTitle=secondaryLinkTitle
2140: self.imageTag=imageTag
2141: self.bgcolour=bgcolour
2142: self.viewClassification=viewClassification
2143: self.location=location
2144:
2145: if coords:
2146: coordsnew=[ string.split(x,",") for x in coords]
2147: self.coords=coordsnew[0:]
2148: else:
2149: coordsnew=None
2150: self.coords=None
2151:
2152: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
2153: try:
2154: self.coords=coordsnew[0:] # HACK fehler in setECHO_collection
2155: except:
2156: """none"""
2157:
2158: self.sortfield=sortfield
2159:
2160: if RESPONSE is not None:
2161: RESPONSE.redirect('manage_main')
2162:
2163:
2164: def showOverview(self):
2165: """overview"""
2166: if 'ECHO_overview.html' in self.__dict__.keys():
2167: return getattr(self,'ECHO_overview.html')()
2168: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_content_overview.zpt').__of__(self)
2169: return pt()
2170:
2171: security.declareProtected('View','index_html')
2172:
2173: def index_html(self):
2174: """standard page"""
2175:
2176: if 'index.html' in self.__dict__.keys():
2177: return getattr(self,'index.html')()
2178:
2179: elif 'overview' in self.__dict__.keys():
2180: return self.showOverview()
2181: elif hasattr(self,'collection_index_template'):
2182: return self.collection_index_template()
2183: elif hasattr(self,'main_index_template'):
2184: return self.main_index_template()
2185:
2186: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_main_index_template_standard.zpt').__of__(self)
2187: pt.content_type="text/html"
2188: return pt()
2189:
2190: def content_html(self):
2191: """template fuer content"""
2192: return content_html(self,'collection')
2193:
2194: def getCredits(self):
2195: """Ausgabe der credits"""
2196: if self.credits:
2197: return self.credits
2198: else:
2199: return []
2200:
2201: def area_img(self):
2202: """area image"""
2203: bt = BrowserCheck(self)
2204: if bt.isIE or bt.isN4:
2205: return sendFile(self, 'images/red.gif', 'image/gif')
2206: else:
2207: return sendFile(self, 'images/reda.png', 'image/png')
2208:
2209: def trans_img(self):
2210: """empty image"""
2211: return sendFile(self, 'images/trans.gif', 'image/gif')
2212:
2213: def hl_lib_js(self):
2214: """javascript"""
2215: return sendFile(self, 'js/hl_lib.js', 'text/plain')
2216:
2217: def js_lib_js(self):
2218: """javascript"""
2219: return sendFile(self, 'js/js_lib.js', 'text/plain')
2220:
2221: def getGraphicCoords(self):
2222: """Give list of coordinates"""
2223: subColTypes=['ECHO_collection','ECHO_resource']
2224: ids=[]
2225: for entrySearch in self.ZopeFind(self,obj_metatypes=subColTypes):
2226: object=entrySearch[1]
2227: if hasattr(object,'coords'):
2228: for coordtemp in object.coords:
2229: if len(coordtemp)>3:
2230: coord=coordtemp[0:4]
2231: label=""
2232: vc=""
2233: if hasattr(object,'label') and not object.label=="":
2234: label=object.label
2235: elif hasattr(object,'title') and not object.title=="":
2236: label=object.title
2237: else:
2238: label=object.getId()
2239: if object.viewClassification != "":
2240: vc=object.viewClassification
2241: else:
2242: if len(coordtemp) > 4 and coordtemp[4] != "":
2243: vc="view point"
2244: else:
2245: vc="area"
2246: ids.append([string.join(coord,", "),object.getId(),label,object,coordtemp,vc])
2247: return ids
2248:
2249:
2250:
2251:
2252: getSubCols = ECHO_helpers.getSubCols
2253:
2254: Globals.InitializeClass(ECHO_collection)
2255:
2256: def manage_addECHO_collectionForm(self):
2257: """Add collection form"""
2258: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_collectionForm.zpt').__of__(self)
2259: return pt()
2260:
2261:
2262: def manage_addECHO_collection(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour=""):
2263: """add a echo collection"""
2264:
2265:
2266: newObj=ECHO_collection(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
2267:
2268: self._setObject(id,newObj)
2269:
2270: if RESPONSE is not None:
2271: RESPONSE.redirect('manage_main')
2272:
2273: class ECHO_group(ECHO_collection):
2274: """ECHO Gruppe"""
2275: security=ClassSecurityInfo()
2276: meta_type="ECHO_group"
2277:
2278: manage_options = Folder.manage_options+(
2279: {'label':'Main Config','action':'ECHO_group_config'},
2280: {'label':'Rerender Links','action':'ECHO_rerenderLinksMD'},
2281: {'label':'Graphics','action':'ECHO_graphicEntry'},
2282: )
2283:
2284: security.declareProtected('View','index_html')
2285:
2286: def getRDF(self,urn=None):
2287: """rdf of the collection"""
2288: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
2289:
2290: ret=getRDFDescription(self,self.absolute_url(),urn)
2291:
2292:
2293:
2294: urn="urn:"+re.sub('/',':',self.absolute_url())
2295: li="""<RDF:li resource="%s" />\n"""
2296:
2297:
2298: for content in contents:
2299: ret+=content[1].getRDF()+"\n"
2300:
2301: ret+="""<RDF:Seq about="%s">\n"""%urn
2302: for content in contents:
2303: nurn="urn:"+re.sub('/',':',content[1].absolute_url())
2304: ret+=li%nurn
2305: return ret+"</RDF:Seq>"
2306:
2307: def index_html(self):
2308: """standard page"""
2309: displayedObjects=self.ZopeFind(self,obj_metatypes=displayTypes)
2310: #if (len(displayedObjects)==1) and (displayedObjects[0][1].meta_type=="ECHO_collection"): # nur ein Object dann redirect auf dieses Object
2311: # return self.REQUEST.RESPONSE.redirect(displayedObjects[0][1].absolute_url())
2312:
2313: if 'index.html' in self.__dict__.keys():
2314: return getattr(self,'index.html')()
2315:
2316: elif 'overview' in self.__dict__.keys():
2317: return self.showOverview()
2318: elif hasattr(self,'group_index_template'):
2319: return self.group_index_template()
2320: elif hasattr(self,'collection_index_template'):
2321: return self.collection_index_template()
2322: elif hasattr(self,'main_index_template'):
2323: return self.main_index_template()
2324:
2325: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_main_index_template_standard.zpt').__of__(self)
2326: pt.content_type="text/html"
2327: return pt()
2328:
2329: def ECHO_group_config(self):
2330: """Main configuration"""
2331:
2332: if not hasattr(self,'weight'):
2333: self.weight=""
2334:
2335: if not hasattr(self,'sortfield'):
2336: self.sortfield="weight"
2337:
2338: if not hasattr(self,'coords'):
2339: self.coords=[]
2340:
2341: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_group.zpt').__of__(self)
2342: return pt()
2343:
2344: def changeECHO_group(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
2345: """Änderung der Properties"""
2346:
2347: self.secondaryLink=secondaryLink
2348: self.secondaryLinkTitle=secondaryLinkTitle
2349: self.imageTag=imageTag
2350: self.bgcolour=bgcolour
2351: self.logo=logo
2352:
2353: if coords:
2354: coordsnew=[ string.split(x,",") for x in coords]
2355: self.coords=coordsnew[0:]
2356: else:
2357: coordsnew=None
2358: self.coords=None
2359:
2360: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
2361:
2362:
2363:
2364: self.sortfield=sortfield
2365:
2366: if RESPONSE is not None:
2367: RESPONSE.redirect('manage_main')
2368:
2369: def getLogo(self):
2370: """logo ausgeben"""
2371: try:
2372: return self.logo
2373: except:
2374: return "ECHO_groups"
2375:
2376: def content_html(self):
2377: """template fuer content"""
2378: return content_html(self,'group')
2379:
2380:
2381:
2382: def manage_addECHO_groupForm(self):
2383: """Add group form"""
2384: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_groupForm.zpt').__of__(self)
2385: return pt()
2386:
2387:
2388: def manage_addECHO_group(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
2389: """add a echo group"""
2390:
2391:
2392: newObj=ECHO_group(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
2393:
2394: setattr(newObj,'logo',logo)
2395: self._setObject(id,newObj)
2396:
2397: if RESPONSE is not None:
2398: RESPONSE.redirect('manage_main')
2399:
2400: Globals.InitializeClass(ECHO_group)
2401:
2402:
2403: class ECHO_userFolder(UserFolder):
2404: """User folder for Intranet"""
2405: _domain_auth_mode=1 # Identification via domain
2406: meta_type="ECHO_userFolder"
2407:
2408: def authenticate(self, name, password, request):
2409: emergency = self._emergency_user
2410: if name is None:
2411: return None
2412: if emergency and name==emergency.getUserName():
2413: user = emergency
2414: else:
2415: user = self.getUser(name)
2416: if user is not None and user.authenticate(password, request):
2417: return user
2418: else:
2419: return None
2420:
2421: def domainSpecMatch(self,spec, request):
2422: host=''
2423: addr=''
2424:
2425: # Fast exit for the match-all case
2426: if len(spec) == 1 and spec[0] == '*':
2427: return 1
2428:
2429: if request.has_key('REMOTE_HOST'):
2430: host=request['REMOTE_HOST']
2431:
2432: if request.has_key('REMOTE_ADDR'):
2433: addr=request['REMOTE_ADDR']
2434:
2435: if request.has_key('HTTP_X_FORWARDED_FOR'):
2436: addr=request['HTTP_X_FORWARDED_FOR']
2437:
2438:
2439: if not host and not addr:
2440: return 0
2441:
2442: if not host:
2443: try: host=socket.gethostbyaddr(addr)[0]
2444: except: pass
2445: if not addr:
2446: try: addr=socket.gethostbyname(host)
2447: except: pass
2448:
2449:
2450: _host=host.split('.')
2451: _addr=addr.split('.')
2452: _hlen=len(_host)
2453: _alen=len(_addr)
2454:
2455: for ob in spec:
2456: sz=len(ob)
2457: _ob=ob.split('.')
2458: _sz=len(_ob)
2459:
2460: mo = addr_match(ob)
2461: if mo is not None:
2462: if mo.end(0)==sz:
2463: fail=0
2464: for i in range(_sz):
2465: a=_addr[i]
2466: o=_ob[i]
2467: if (o != a) and (o != '*'):
2468: fail=1
2469: break
2470: if fail:
2471: continue
2472: return 1
2473:
2474: mo = host_match(ob)
2475: if mo is not None:
2476: if mo.end(0)==sz:
2477: if _hlen < _sz:
2478: continue
2479: elif _hlen > _sz:
2480: _item=_host[-_sz:]
2481: else:
2482: _item=_host
2483: fail=0
2484: for i in range(_sz):
2485: h=_item[i]
2486: o=_ob[i]
2487: if (o != h) and (o != '*'):
2488: fail=1
2489: break
2490: if fail:
2491: continue
2492: return 1
2493: return 0
2494:
2495: Globals.default__class_init__(ECHO_userFolder)
2496:
2497:
2498:
2499: def manage_addECHO_userFolder(self,dtself=None,REQUEST=None,**ignored):
2500: """add a user folder """
2501: f=ECHO_userFolder()
2502: self=self.this()
2503: try: self._setObject('acl_users', f)
2504: except: return MessageDialog(
2505: title ='Item Exists',
2506: message='This object already contains a User Folder',
2507: action ='%s/manage_main' % REQUEST['URL1'])
2508: self.__allow_groups__=f
2509: if REQUEST is not None:
2510: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
2511:
2512: def manage_addECHO_userFolderForm(self):
2513: """add a user folder form"""
2514: return manage_addECHO_userFolder(self)
2515:
2516: class ECHO_root(Folder,Persistent,Implicit):
2517: """ECHO Root Folder"""
2518:
2519: security=ClassSecurityInfo()
2520:
2521: meta_type="ECHO_root"
2522:
2523: def showRDF(self):
2524: """showrdf"""
2525: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
2526: 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"""
2527: ret+=self.getRDF(urn="echo:collectionroot")+"\n"
2528:
2529: ret+="""</RDF:RDF>"""
2530: return ret
2531:
2532: def getRDF(self,urn=None):
2533: """rdf of the collection"""
2534:
2535: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
2536:
2537: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
2538:
2539: li="""<RDF:li resource="%s" />\n"""
2540:
2541:
2542: for content in contents:
2543: ret+=content[1].getRDF()+"\n"
2544:
2545: ret+="""<RDF:Seq about="%s">\n"""%urn
2546: for content in contents:
2547: nurn="urn:"+re.sub('/',':',content[1].absolute_url())
2548: ret+=li%nurn
2549: return ret+"</RDF:Seq>"
2550:
2551:
2552: def showContent(self,path):
2553: """return content/html"""
2554:
2555: return urllib.urlopen(path+"/content_html").read()
2556:
2557: def getImageViewers(self):
2558: """images"""
2559: viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject'])
2560: return viewers
2561:
2562:
2563: def getBibTag(self,tag,content):
2564: """get field tag für index-meta-generation"""
2565: if not content or content=="":
2566: return ""
2567: ret="<%s>"%tag
2568: #ret+=urllib.quote(content)
2569: ret+=content
2570:
2571: ret+="</%s>"%tag
2572: return ret
2573:
2574: def getValueFromClass(self,field,found):
2575: """retattribute falss existing"""
2576: try:
2577:
2578: return getattr(found,field).decode('ascii','ignore')
2579: except:
2580: return ""
2581:
2582: def getImageTag(self):
2583: """needed by main_template"""
2584: return ""
2585: secondaryLink="" #needed by main_template
2586: secondaryLinkTitle="" #needed by main_template
2587:
2588: def getBgcolour(self):
2589: """hack"""
2590: return "#dddddd"
2591:
2592: def contentTypeSelector_HTML(self,selected=None):
2593: """give type selector"""
2594: if not selected:
2595: retStr="<option selected>\n"
2596: else:
2597: retStr="<option>\n"
2598:
2599: try: # erste version contentTypes exists
2600: for contentType in self.ZopeFind(self.contentTypes,obj_metatypes=["ECHO_contentType","OSAS_MetadataMapping"]):
2601: if selected and (contentType[0]==selected):
2602: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
2603: else:
2604: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
2605: except:
2606: try:
2607: for contentType in self.ZopeFind(self.standardMD,obj_metatypes=["OSAS_MetadataMapping"]):
2608: if selected and (contentType[0]==selected):
2609: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
2610: else:
2611: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
2612: except:
2613: """nothing"""
2614:
2615: return retStr
2616:
2617: def renderingTypeSelector_HTML(self,selected=None):
2618: """give type selector"""
2619: if not selected:
2620: retStr="<option selected>\n"
2621: else:
2622: retStr="<option>\n"
2623:
2624: try: # erste version renderingTypes exists
2625: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
2626: if selected and (renderingType[0]==selected):
2627: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
2628: else:
2629: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
2630: except:
2631: """nothing"""
2632: return retStr
2633:
2634: def renderingTypeSelector_HTML(self,selected=None):
2635: """give type selector"""
2636: if not selected:
2637: retStr="<option selected>\n"
2638: else:
2639: retStr="<option>\n"
2640:
2641: try: # erste version renderingTypes exists
2642: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
2643: if selected and (renderingType[0]==selected):
2644: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
2645: else:
2646: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
2647: except:
2648: """nothing"""
2649: return retStr
2650:
2651:
2652: def copyrightTypeSelector_HTML(self,selected=None,first=None):
2653: """give type selector"""
2654:
2655: if not first:
2656: if not selected:
2657: retStr="<option selected>\n"
2658: else:
2659: retStr="<option>\n"
2660: else:
2661: if not selected:
2662: retStr="""<option selected value="%s">%s\n"""%first
2663: else:
2664: retStr="""<option value="%s">%s\n"""%first
2665:
2666:
2667: try: # erste version copyrightTypes exists
2668: for copyrightType in self.ZopeFind(self.copyrightTypes,obj_metatypes=["ECHO_copyrightType"]):
2669: if selected and (copyrightType[0]==selected):
2670: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2671: else:
2672: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2673: except:
2674: """nothing"""
2675: return retStr
2676:
2677: def partnerSelector_HTML(self,selected=None):
2678: """give type selector"""
2679: if not selected:
2680: retStr="<option selected>\n"
2681: else:
2682: retStr="<option>\n"
2683:
2684: try: # erste version copyrightTypes exists
2685: for copyrightType in self.ZopeFind(self.partners,obj_metatypes=["ECHO_partner"]):
2686: if selected and (copyrightType[0]==selected):
2687: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2688: else:
2689: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
2690: except:
2691: """nothing"""
2692: return retStr
2693:
2694: mediaTypes=['all','text','images','sound','video'] # konfigurierbar in neuer version über echoroot??
2695:
2696: def mediaTypeSelector_HTML(self,selected=None):
2697: """give type selector"""
2698: if not selected:
2699: retStr="<option selected>\n"
2700: else:
2701: retStr="<option>\n"
2702:
2703: try: # erste version mediatypesTypes exists
2704: for mediaType in self.mediaTypes:
2705: if selected and (mediaType in selected):
2706: retStr+="""<option selected value="%s">%s\n"""%(mediaType,mediaType)
2707: else:
2708: retStr+="""<option value="%s">%s\n"""%(mediaType,mediaType)
2709: except:
2710: """nothing"""
2711: return retStr
2712:
2713:
2714: def patchContentType(self,obj=None):
2715: """austauschen content_type with contentType (patch bei umstieg von alter Version)"""
2716:
2717:
2718: if not obj:
2719: obj = self
2720:
2721: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate'])
2722:
2723: for entry in entries:
2724: setattr(entry[1],'contentType',entry[1].content_type)
2725: #entry[1].contentType == entry[1].content_type
2726:
2727: if entry[1].meta_type == 'ECHO_collection':
2728: entry[1].patchContentType(entry[1])
2729:
2730:
2731: return "changed all contenttypes in: "+self.title
2732:
2733:
2734: def patchViewClassification(self,obj=None):
2735: """setze viewClassification heuristisch"""
2736:
2737: def checkIfArrow(obj):
2738: if hasattr(obj,'coords'):
2739: for coordtemp in obj.coords:
2740:
2741: if (len(coordtemp)>4) and not (coordtemp[4]==''):
2742: return 4
2743: return None
2744: return None
2745:
2746: if not obj:
2747: obj = self
2748:
2749: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_group'])
2750:
2751: for entry in entries:
2752:
2753: if checkIfArrow(entry[1]):
2754: setattr(entry[1],'viewClassification','view point')
2755: else:
2756: setattr(entry[1],'viewClassification','area')
2757:
2758: #entry[1].contentType == entry[1].content_type
2759:
2760: if entry[1].meta_type in ['ECHO_collection','ECHO_group']:
2761: entry[1].patchViewClassification(entry[1])
2762:
2763:
2764: return "changed all contenttypes in: "+self.title
2765:
2766: def ECHO_newViewerLink(self,obj=None):
2767: """change links (:86 faellt weg)"""
2768:
2769: if not obj:
2770: obj = self
2771:
2772: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
2773:
2774: for entry in entries:
2775:
2776: if entry[1].meta_type == 'ECHO_resource':
2777:
2778: entry[1].link=re.sub('\:86','',entry[1].link)
2779:
2780: else:
2781:
2782: entry[1].ECHO_newViewerLink(entry[1])
2783:
2784: return "Rerenderd all links to resources in: "+self.title
2785:
2786: def __init__(self,id,title):
2787: """init"""
2788: self.id = id
2789: self.title=title
2790:
2791: def deleteSpace(self,str):
2792: """delete space at the end of a line"""
2793: if str[len(str)-1]==" ":
2794: return str[0:len(str)-1]
2795: else:
2796: return str
2797:
2798:
2799:
2800: # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt
2801:
2802: def formatAscii(self,str,url=None):
2803: """ersetze ascii umbrueche durch <br>"""
2804: #url=None
2805: if url:
2806:
2807: retStr=""
2808: words=str.split("\n")
2809:
2810: for word in words:
2811: strUrl=url%word
2812:
2813: retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
2814: str=retStr
2815: if str:
2816: return re.sub(r"[\n]","<br/>",str)
2817: else:
2818: return ""
2819:
2820: def link2html(self,str):
2821: """link2html fuer VLP muss hier noch raus"""
2822: if str:
2823:
2824: str=re.sub("\&","&",str)
2825: dom=xml.dom.minidom.parseString("<?xml version='1.0' encoding='utf-8'?><txt>"+str+"</txt>")
2826: links=dom.getElementsByTagName("link")
2827:
2828:
2829: for link in links:
2830: link.tagName="a"
2831: ref=link.getAttribute("ref")
2832: if self.checkRef(ref):
2833: link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref)
2834:
2835: newxml=dom.toxml('utf-8')
2836: match=re.sub(r'<\?xml version=\"1.0\" encoding=\"utf-8\"\?>\n<txt>','',newxml)
2837: match=re.sub(r'</txt>','',match)
2838:
2839: return match
2840:
2841: return ""
2842:
2843: def xml2html(self,str):
2844: """link2html fuer VLP muss hier noch raus"""
2845: if str:
2846:
2847: str=re.sub("\&","&",str)
2848: dom=xml.dom.minidom.parseString(str)
2849: links=dom.getElementsByTagName("link")
2850:
2851:
2852: for link in links:
2853: link.tagName="a"
2854: ref=link.getAttribute("ref")
2855: if self.checkRef(ref):
2856: link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref)
2857:
2858: return dom.toxml('utf-8')
2859: return ""
2860:
2861: def checkRef(self,ref):
2862: dbs={'vl_literature':'AND CD LIKE \'%lise%\'','vl_technology':'','vl_people':''}
2863: res=None
2864: for db in dbs.keys():
2865:
2866: res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))
2867: return res
2868:
2869: #Ende Methode fuer vlp
2870:
2871: def PgQuoteString(self,string):
2872: """Quote string"""
2873:
2874: return libpq.PgQuoteString(string)
2875:
2876: def getPartners(self):
2877: """Get list of Partners. Presently only from a subfolder partners"""
2878:
2879: return [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])]
2880:
2881:
2882:
2883:
2884:
2885: def getPartnersXML(self):
2886: """partner liste als xml"""
2887: partners=self.getPartners()
2888: ret="""<?xml version="1.0" encoding="utf-8" ?>
2889: <partners>"""
2890:
2891: for partner in partners:
2892: ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),unicode(partner.title,'utf-8','replace'))
2893:
2894: return ret+"\n</partners>"
2895:
2896: def getCollectionTree(self):
2897: """get the collection tree (list of triples (parent,child, depth)"""
2898:
2899: def getCollection(object,depth=0):
2900: depth+=1
2901: collections=[]
2902: for entry in object.__dict__.keys():
2903: element=getattr(object,entry)
2904: try:
2905: if element.meta_type=="ECHO_collection":
2906: collections.append((object,element,depth))
2907: collections+=getCollection(element,depth)
2908: except:
2909: """nothing"""
2910: return collections
2911:
2912:
2913: return getCollection(self)
2914:
2915: def getCollectionTreeIds(self):
2916: """Show the IDs of the Tree"""
2917: ret=[]
2918: for collection in self.getCollectionTree():
2919: ret.append((collection[0].getId(),collection[1].getId(),collection[2]))
2920: return ret
2921:
2922: def getResourcesHTML(self,viewerType=None,filter=None):
2923: """gebe all ressourcen aus"""
2924:
2925: def sortHTML(x,y):
2926: return cmp(x[1].title,y[1].title)
2927:
2928: ret="""<html><body><h2>Resources in ECHO</h3>"""
2929:
2930: resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
2931: ret+="""<h3>Found %i resources</h3>"""%len(resources)
2932: resources.sort(sortHTML)
2933: for resource in resources:
2934: echo_url=resource[1].absolute_url()
2935:
2936: if hasattr(resource[1],'title'):
2937: title=resource[1].title
2938: else:
2939: title="None"
2940: if filter:
2941: if re.search(filter,title):
2942: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
2943: else:
2944: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
2945:
2946: ret +="""\n</body></html>"""
2947:
2948: #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html")
2949: #self.REQUEST.RESPONSE.write(ret)
2950: return ret
2951:
2952: def getResourcesXML(self,viewerType=None,filter=None):
2953: """gebe all ressourcen aus"""
2954: ret="""<?xml version="1.0" ?>
2955: <index>"""
2956: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
2957:
2958: echo_url=resource[1].absolute_url()
2959: if hasattr(resource[1],'link'):
2960: viewer_url=resource[1].link
2961: else:
2962: viewer_url="NO URL"
2963: if filter:
2964: if re.search(filter,viewer_url):
2965: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
2966: else:
2967: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
2968: ret +="""\n</index>"""
2969:
2970: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
2971: self.REQUEST.RESPONSE.write(ret)
2972:
2973: def getFullTextsXML(self,viewerType=None,filter=None):
2974: """gebe all ressourcen aus"""
2975: ret="""<?xml version="1.0" ?>
2976: <index>"""
2977: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
2978:
2979: echo_url=resource[1].absolute_url()
2980: if resource[1].getFullTextXML(noredirect="yes"):
2981: if hasattr(resource[1],'link'):
2982: viewer_url=echo_url+"/getFullTextXML"
2983: else:
2984: viewer_url="NO URL"
2985: if filter:
2986: if re.search(filter,viewer_url):
2987: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
2988: else:
2989: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
2990: ret +="""\n</index>"""
2991:
2992:
2993: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
2994: self.REQUEST.RESPONSE.write(ret)
2995:
2996:
2997: def getMetaDatasXML(self,viewerType=None,filter=None):
2998: """gebe all ressourcen aus"""
2999: ret="""<?xml version="1.0" ?>
3000: <index>"""
3001: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3002:
3003: echo_url=resource[1].absolute_url()
3004:
3005: if hasattr(resource[1],'link'):
3006: meta_url=echo_url+"/getMetaDataXML"
3007: else:
3008: meta_url="NO_URL"
3009:
3010: if filter and not re.search(filter,viewer_url):
3011: continue
3012:
3013: ret+="""\n<resource resourceLink="%s" metaLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(meta_url,safe='/:?'))
3014:
3015: ret +="""\n</index>"""
3016:
3017:
3018: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3019: self.REQUEST.RESPONSE.write(ret)
3020:
3021:
3022: def findPartners(self):
3023: """find all partners in partners"""
3024: par=self.ZopeFind(self.partners, obj_metatypes='ECHO_partner')
3025: return par
3026:
3027: def getPartnerFromID(self):
3028: """find partner form ID return object"""
3029: pa=self.REQUEST['partner']
3030: par=self.ZopeFind(self.partners, obj_ids=[pa])
3031: return par
3032:
3033: def getPartnerFromIDParameter(self, id):
3034: """ find partners from ID"""
3035: par=self.ZopeFind(self.partners, obj_ids=[id])
3036: return par
3037:
3038:
3039:
3040: def manage_addECHO_root(self,id,title,RESPONSE=None):
3041: """Add an ECHO_root"""
3042: self._setObject(id,ECHO_root(id,title))
3043:
3044: if RESPONSE is not None:
3045: RESPONSE.redirect('manage_main')
3046:
3047: def manage_addECHO_rootForm(self):
3048: """Nothing yet"""
3049: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_root.zpt').__of__(self)
3050: return pt()
3051:
3052: class ECHO_copyrightType(Folder):
3053: """copyright typ"""
3054:
3055: meta_type="ECHO_copyrightType"
3056:
3057: def __init__(self,id,title,label,url):
3058: """init"""
3059: self.id=id
3060: self.title=title
3061: self.label=label
3062: self.url=url
3063:
3064: manage_options = Folder.manage_options+(
3065: {'label':'Main Config','action':'ECHO_copyrightType_config_mainForm'},
3066: )
3067:
3068: def ECHO_copyrightType_config_mainForm(self):
3069: """change form"""
3070: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_copyrightType').__of__(self)
3071: pt.content_type="text/html"
3072: return pt()
3073:
3074: def ECHO_copyrightType_config_main(self,title,label,url,RESPONSE=None):
3075: """change"""
3076: self.title=title
3077: self.label=label
3078: self.url=url
3079:
3080: if RESPONSE is not None:
3081: RESPONSE.redirect('manage_main')
3082:
3083: def manage_addECHO_copyrightTypeForm(self):
3084: """Form for adding a ressource"""
3085: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_copyrightTypeForm.zpt').__of__(self)
3086: return pt()
3087:
3088:
3089: def manage_addECHO_copyrightType(self,id,title,label,url,RESPONSE=None):
3090: """addaresource"""
3091:
3092: newObj=ECHO_copyrightType(id,title,label,url)
3093:
3094: self._setObject(id,newObj)
3095:
3096: if RESPONSE is not None:
3097: RESPONSE.redirect('manage_main')
3098:
3099:
3100:
3101: class ECHO_partner(Image,Persistent):
3102: """ECHO Partner"""
3103:
3104: meta_type="ECHO_partner"
3105:
3106: def __init__(self, id, title,url, file, copyrightType, person, email, country, color, content_type='', precondition=''):
3107: self.__name__=id
3108: self.title=title
3109: self.url=url
3110: self.person=person
3111: self.email=email
3112: self.country=country
3113: self.color=color
3114: self.precondition=precondition
3115: self.copyrightType=copyrightType
3116: data, size = self._read_data(file)
3117: content_type=self._get_content_type(file, data, id, content_type)
3118: self.update_data(data, content_type, size)
3119:
3120: manage_options = Image.manage_options+(
3121: {'label':'Partner Information','action':'ECHO_partner_config'},
3122: )
3123:
3124:
3125: def changeECHO_partner(self,url,copyrightType,person, email, country, color, RESPONSE=None):
3126: """Change main information"""
3127: self.url=url
3128: self.person=person
3129: self.email=email
3130: self.country=country
3131: self.color=color
3132: self.copyrightType=copyrightType
3133: if RESPONSE is not None:
3134: RESPONSE.redirect('manage_main')
3135:
3136:
3137:
3138: def ECHO_partner_config(self):
3139: """Main configuration"""
3140: if not hasattr(self,'url'):
3141: self.url=""
3142: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_partner.zpt').__of__(self)
3143: return pt()
3144:
3145:
3146: manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(),
3147: Kind='ECHO_partner',kind='ECHO_partner')
3148:
3149:
3150:
3151: def manage_addECHO_partner(self, id, url, person, email, country, color, file=None, copyrightType='', title='', precondition='', content_type='',
3152: REQUEST=None):
3153: """
3154: Add a new ECHO_partner object.
3155:
3156: Creates a new ECHO_partner object 'id' with the contents of 'file'.
3157: Based on Image.manage_addImage
3158: """
3159:
3160: id=str(id)
3161: title=str(title)
3162: content_type=str(content_type)
3163: precondition=str(precondition)
3164:
3165: id, title = OFS.Image.cookId(id, title, file)
3166:
3167: self=self.this()
3168:
3169: # First, we create the image without data:
3170: self._setObject(id, ECHO_partner(id,title,url,'',copyrightType, person, email, country, color, content_type, precondition))
3171:
3172: # Now we "upload" the data. By doing this in two steps, we
3173: # can use a database trick to make the upload more efficient.
3174: if file:
3175: self._getOb(id).manage_upload(file)
3176: if content_type:
3177: self._getOb(id).content_type=content_type
3178:
3179: if REQUEST is not None:
3180: try: url=self.DestinationURL()
3181: except: url=REQUEST['URL1']
3182: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
3183: return id
3184:
3185:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>