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