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