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