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