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