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