Annotation of ECHO_content/ECHO_collection.py, revision 1.90
1.13 dwinter 1: """New version of the product started February, 8th. Without scientific classification, use content-type for further classification."""
1.1 casties 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
1.14 dwinter 13: import re
1.29 dwinter 14: import os
1.1 casties 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
1.85 dwinter 22: from AccessControl.User import UserFolder
1.1 casties 23: from Globals import InitializeClass
24: from Globals import DTMLFile
1.84 dwinter 25: import Globals
1.1 casties 26: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
27: from Products.PageTemplates.PageTemplate import PageTemplate
1.29 dwinter 28: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
29: from Globals import Persistent, package_home
1.1 casties 30: from Acquisition import Implicit
1.52 dwinter 31: from ECHO_helpers import displayTypes
1.84 dwinter 32:
33:
1.50 dwinter 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:
1.14 dwinter 42: import xml.dom.minidom
1.1 casties 43:
44: import urllib
45: import xml.dom.minidom
1.23 dwinter 46: from ECHO_graphicalOverview import javaHandler,javaScriptMain
1.41 dwinter 47: import ECHO_helpers
1.1 casties 48:
1.6 dwinter 49: #List of different types for the graphical linking viewer
50: viewClassificationListMaster=['view point','area']
51:
1.73 dwinter 52: def checkDiffs(self,metadict):
53: """check differences"""
54:
1.90 ! dwinter 55:
! 56:
! 57:
1.73 dwinter 58: def NoneToEmpty(obj):
59: if obj:
60: return obj
61: else:
62: return ""
1.90 ! dwinter 63:
! 64:
1.73 dwinter 65:
66: diffs={}
1.90 ! dwinter 67:
1.73 dwinter 68: tags=self.findTagsFromMapping(self.contentType)
1.90 ! dwinter 69: self.referencetypes=tags[2]
! 70: self.fields=tags[3]
! 71:
! 72:
1.73 dwinter 73: for field in tags[1]:
74: try:
75: if (NoneToEmpty(self.getFieldValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
76: diffs[self.getFieldTag(tags,field)]=1
77: else:
1.90 ! dwinter 78: #print "DIFF",field,self.getFieldValue(self.getFieldTag(tags,field)),metadict[self.getFieldTag(tags,field)]
1.73 dwinter 79: diffs[self.getFieldTag(tags,field)]=0
80: except:
81: diffs[self.getFieldTag(tags,field)]=0
1.90 ! dwinter 82: #print "EX",field
1.73 dwinter 83: return diffs
84:
1.29 dwinter 85: def content_html(self,type):
86: """template fuer content"""
87: #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
88: #
89: #if templates:
90: # return templates[0][1]()
1.6 dwinter 91:
1.29 dwinter 92: try:
93: obj=getattr(self,type+"_template")
94: return obj()
95: except:
96: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
97: pt.content_type="text/html"
98: return pt()
99:
1.1 casties 100: def toList(field):
101: """Einzelfeld in Liste umwandeln"""
102: if type(field)==StringType:
103: return [field]
104: else:
105: return field
106:
107: def getText(nodelist):
108:
109: rc = ""
110: for node in nodelist:
111: if node.nodeType == node.TEXT_NODE:
112: rc = rc + node.data
113: return rc
114:
115:
1.65 casties 116: def sendFile(self, filename, type):
117: """sends an object or a local file (in the product) as response"""
118: paths = filename.split('/')
119: object = self
120: # look for an object called filename
121: for path in paths:
122: if hasattr(object, path):
123: object = getattr(object, path)
124: else:
125: object = None
126: break
127: if object:
128: # if the object exists then send it
1.76 casties 129: return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
1.65 casties 130: else:
131: # send a local file with the given content-type
132: fn = os.path.join(package_home(globals()), filename)
133: self.REQUEST.RESPONSE.setHeader("Content-Type", type)
134: self.REQUEST.RESPONSE.write(file(fn).read())
135: return
136:
1.87 casties 137: class BrowserCheck:
138: """check the browsers request to find out the browser type"""
139:
140: def __init__(self, zope):
141: self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
142: self.isN4 = (string.find(self.ua, 'Mozilla/4.') > -1) and (string.find(self.ua, 'MSIE') < 0)
143: self.isIE = string.find(self.ua, 'MSIE') > -1
144: self.nav = self.ua[string.find(self.ua, '('):]
145: ie = string.split(self.nav, "; ")[1]
146: if string.find(ie, "MSIE") > -1:
147: self.versIE = string.split(ie, " ")[1]
148: self.isMac = string.find(self.ua, 'Macintosh') > -1
149: self.isWin = string.find(self.ua, 'Windows') > -1
150: self.isIEWin = self.isIE and self.isWin
151: self.isIEMac = self.isIE and self.isMac
152:
1.65 casties 153:
1.73 dwinter 154: def writeMetadata(url,metadict):
1.87 casties 155: """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
1.73 dwinter 156:
157: try:
158: geturl=""
159: for line in urllib.urlopen(url).readlines():
160: geturl=geturl+line
161:
162:
163: except:
164: return (None,"Cannot open: "+url)
165:
166: try:
167: dom=xml.dom.minidom.parseString(geturl)
168: except:
169: return (None,"Cannot parse: "+url+"<br>"+geturl)
170:
171: metanodes=dom.getElementsByTagName('bib')
172:
173: if not metanodes:
174: metanodes=dom.getElementsByTagName('archimedes')
175:
176: metanode=metanodes[0]
177:
178: for metaData in metadict.keys():
1.90 ! dwinter 179:
1.73 dwinter 180: try:
181: nodeOld=metanode.getElementsByTagName(metaData)
182: except:
183: nodeOld=None
184:
185: if nodeOld:
186: metanode.removeChild(nodeOld[0]).unlink()
187: else:
188: # try also old writing rule - instead of _:
189: try:
190: nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
191: except:
192: nodeOld=None
193:
194: if nodeOld:
195: metanode.removeChild(nodeOld[0]).unlink()
196:
197: metanodeneu=dom.createElement(metaData)
1.90 ! dwinter 198: try:
! 199: metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
! 200: except:
! 201: metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
1.73 dwinter 202: metanodeneu.appendChild(metanodetext)
203: metanode.appendChild(metanodeneu)
204:
205:
1.90 ! dwinter 206: return dom.toxml().encode('utf-8')
1.73 dwinter 207:
1.90 ! dwinter 208:
! 209:
1.1 casties 210: def readMetadata(url):
1.73 dwinter 211: """Methode zum Auslesen der Metadateninformation zu einer Resource
1.1 casties 212: Vorerst noch Typ bib"""
213:
214: metadict={}
215: try:
216: geturl=""
217: for line in urllib.urlopen(url).readlines():
218: geturl=geturl+line
219:
220:
221: except:
222: return (None,"Cannot open: "+url)
223:
224: try:
225: dom=xml.dom.minidom.parseString(geturl)
226: except:
227: return (None,"Cannot parse: "+url+"<br>"+geturl)
228:
229: metanode=dom.getElementsByTagName('bib')
230: metadict['bib_type']='Book'
231: if len(metanode)==0:
232: metanode=dom.getElementsByTagName('archimedes')
233: metadict['bib_type']='Archimedes'
234: #print "HELLO"
235:
236: if not len(metanode)==0:
237: metacontent=metanode[0].childNodes
238:
239: try:
240: metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
241: except:
242: """nothing"""
243:
244: for node in metacontent:
245: try:
1.90 ! dwinter 246: metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
1.1 casties 247: except:
248: """nothing"""
249:
1.73 dwinter 250:
1.1 casties 251: return metadict,""
252:
253:
1.27 dwinter 254: def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs,viewClassification=""):
1.1 casties 255:
256: """Allegemeine Informationen zu einer ECHO Collection"""
257:
1.6 dwinter 258: self.viewClassification=viewClassification
259:
1.1 casties 260: self.label = label
261: self.title=title
262: self.description=description
1.27 dwinter 263: self.contentType=contentType
1.1 casties 264: self.responsible=responsible
265: self.credits=toList(credits)
266: self.weight=weight
267:
1.5 dwinter 268: coords=[]
1.1 casties 269: #coordinates of for rectangles
1.10 dwinter 270:
1.9 dwinter 271: #print "cs", coordstrs
272: if coordstrs:
273: for coordstr in coordstrs:
1.12 dwinter 274: #print "cs", coordstr
1.9 dwinter 275: try:
276: temco=coordstr.split(",")
277: except:
278: temco=[]
279: #temco.append(angle)
280: coords.append(temco)
281:
1.10 dwinter 282:
1.5 dwinter 283: self.coords=coords[0:]
1.1 casties 284:
285:
286: class scientificClassification(SimpleItem,Persistent,Implicit):
1.13 dwinter 287: """outdated will be deleeted in the next versions: subclass"""
1.1 casties 288: security=ClassSecurityInfo()
289:
290: def __init__(self,context,science,practice):
291: self.context=context
292: self.science=science
293: self.practice=practice
294: self.id="scientific_Classification"
295:
296: security.declarePublic('get_context')
297: def get_context(self):
298: return self.context
299:
300: security.declarePublic('get_science')
301: def get_science(self):
302: return self.science
303:
304: security.declarePublic('get_practice')
305: def get_practice(self):
306: return self.practice
307:
308:
309: class scientificInformation(Folder,Persistent,Implicit):
1.13 dwinter 310: """outdated will be deleted in the next versions: subclass scientificInformation"""
1.1 casties 311: security=ClassSecurityInfo()
312:
313:
314:
315: def __init__(self,source_type,period):
316:
317: self.id="scientific_Information"
318: self.source_type=source_type
319: self.period=period
320:
321:
322:
323: security.declarePublic('get_source_type')
324: def get_source_type(self):
325: return self.source_type
326:
327: security.declarePublic('get_period')
328: def get_period(self):
329: return self.period
330:
1.29 dwinter 331: class ECHO_layoutTemplate(ZopePageTemplate):
332: """Create a layout Template for different purposes"""
333:
334: meta_type="ECHO_layoutTemplate"
335:
336: def __init__(self, id, text=None, content_type=None,EchoType=None):
337: self.id = str(id)
338:
339:
340:
341: self.ZBindings_edit(self._default_bindings)
342: if text is None:
343: self._default_content_fn = os.path.join(package_home(globals()),
344: 'zpt/ECHO_%s_template_standard.zpt'%EchoType)
345: text = open(self._default_content_fn).read()
346: self.pt_edit(text, content_type)
347:
1.32 dwinter 348:
1.29 dwinter 349: """change form"""
350:
351:
352: def manage_addECHO_layoutTemplateForm(self):
353: """Form for adding"""
354: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_layoutTemplate.zpt').__of__(self)
355: return pt()
356:
357: from urllib import quote
358:
359:
360: def manage_addECHO_layoutTemplate(self, EchoType,title=None,REQUEST=None):
361: "Add a Page Template with optional file content."
362: if type(EchoType)==StringType:
363: EchoTypes=[EchoType]
364: else:
365: EchoTypes=EchoType
366:
367: for singleType in EchoTypes:
1.32 dwinter 368:
1.29 dwinter 369: id = str(singleType)+"_template"
370: if REQUEST is None:
371: self._setObject(id, ECHO_layoutTemplate(id, text,EchoType=singleType))
372: ob = getattr(self, id)
373:
374: if title:
375: ob.pt_setTitle(title)
376: return ob
377: else:
378: file = REQUEST.form.get('file')
379: headers = getattr(file, 'headers', None)
380: if headers is None or not file.filename:
381: zpt = ECHO_layoutTemplate(id,EchoType=singleType)
382: else:
383: zpt = ECHO_layoutTemplate(id, file, headers.get('content_type'))
384:
385: self._setObject(id, zpt)
386: ob = getattr(self, id)
387: if title:
388: ob.pt_setTitle(title)
389:
390: try:
391: u = self.DestinationURL()
392: except AttributeError:
393: u = REQUEST['URL1']
394:
395:
396: REQUEST.RESPONSE.redirect(u+'/manage_main')
397: return ''
1.1 casties 398:
1.90 ! dwinter 399: class ECHO_resource(Folder,Persistent):
1.1 casties 400: """ECHO Ressource"""
401: meta_type='ECHO_resource'
402:
1.6 dwinter 403: viewClassificationList=viewClassificationListMaster
1.1 casties 404:
1.41 dwinter 405: getSubCols = ECHO_helpers.getSubCols
1.48 dwinter 406: def getTitle(self):
407: """title"""
408: return self.title.encode('utf-8')
409:
410: def getLabel(self):
411: """title"""
412: return self.label.encode('utf-8')
1.41 dwinter 413:
1.29 dwinter 414: def content_html(self):
415: """template fuer content"""
416: return content_html(self,'resource')
417:
1.6 dwinter 418: def getViewClassification(self):
419: if hasattr(self,'viewClassification'):
420: return self.viewClassification
421: else:
422: return ""
1.83 dwinter 423:
424: def getFullTextXML(self,noredirect=None):
1.90 ! dwinter 425: """getFullTextXML; gives the FullText as an XML Document, and <error></error> if somthing goes wrong."""
1.83 dwinter 426: try:
427: fh=urllib.urlopen(self.metalink)
428: dom=xml.dom.minidom.parse(fh)
429: texttools=dom.getElementsByTagName('texttool')
430: text=texttools[0].getElementsByTagName('text')
431: texturl=getText(text[0].childNodes)
1.90 ! dwinter 432: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1.83 dwinter 433: if not noredirect:
434: self.REQUEST.RESPONSE.redirect(texturl)
435: else:
436: return texturl
437: except:
1.90 ! dwinter 438:
! 439: if not noredirect:
! 440: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
! 441: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
! 442: else:
! 443: return "<error>no fulltext available</error>"
1.83 dwinter 444:
1.9 dwinter 445: def getCredits(self):
446: """Ausgabe der credits"""
447: if self.credits:
448: return self.credits
449: else:
450: return []
1.6 dwinter 451:
1.90 ! dwinter 452: def __init__(self,id,link,metalink,resourceID,title,label,description,contentType,renderingType,responsible,credits,weight,coords):
1.1 casties 453:
454: self.id = id
455: """Festlegen der ID"""
456:
457: self.label = label
458: self.link= link
459: self.metalink=metalink
460: self.title=title
461: self.weight=weight
462: self.credits=toList(credits)
463: self.description=description
1.27 dwinter 464: self.contentType=contentType
1.90 ! dwinter 465: self.renderingType=renderingType
1.1 casties 466: self.responsible=responsible
1.90 ! dwinter 467: self.resourceID=resourceID
! 468:
1.9 dwinter 469: if coords:
470: coordsnew=[ string.split(x,",") for x in coords]
471: else:
472: coordsnew=[]
473:
1.1 casties 474: self.coords=coordsnew
475:
1.3 dwinter 476:
477: def getCoords(self):
1.73 dwinter 478: """gibt coordinaten als String zurück und löscht zugleich einträge die keine Koordinaten sind, letzteres zur korrektur der Eingabe der alten version"""
479: retList=[]
480: if hasattr(self,'coords'):
481: for x in self.coords:
482: if len(x)>1:
483: retList.append(string.join(x,","))
484: return retList
485:
486:
1.3 dwinter 487:
1.49 dwinter 488: def getContentType(self):
489: try:
490: return self.contentType
491: except:
492: return ""
1.1 casties 493:
1.73 dwinter 494: def getCopyrightType(self):
495: try:
496: return self.copyrightType
497: except:
498: return ""
499:
500: def getRenderingType(self):
501: try:
502: return self.renderingType
503: except:
504: return ""
505:
1.1 casties 506: def ECHO_resource_config(self):
507: """Main configuration"""
508:
509: if not hasattr(self,'weight'):
510: self.weight=""
511:
1.13 dwinter 512: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource.zpt').__of__(self)
1.1 casties 513: return pt()
514:
515:
1.73 dwinter 516: def ECHO_resource_config_main(self):
517: """Main configuration"""
518:
519: if not hasattr(self,'weight'):
520: self.weight=""
521:
522: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_main.zpt').__of__(self)
523: return pt()
524:
525: def ECHO_resource_config_coords(self):
526: """Coords configuration """
527:
528: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_coords.zpt').__of__(self)
529: return pt()
530:
531: def ECHO_resource_config_credits(self):
532: """Main configuration"""
533:
534: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_credits.zpt').__of__(self)
535: return pt()
536:
537: def ECHO_resource_config_metadata(self):
538: """Main configuration"""
539:
540: if (hasattr(self,'metadata')) and not (hasattr(self,'metaDataHash')):
541: self.metaDataHash={}
542: self.contentType=self.bib_type
543: for data in self.metadata:
544: data_neu=re.sub('-','_',data)
545: self.metaDataHash[data_neu]=getattr(self,data)
546: #print data_neu, getattr(self,data)
547: #print self.metaDataHash,self.metadata
548:
549: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_metadata.zpt').__of__(self)
550: return pt()
551:
552:
553:
554:
555: def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,RESPONSE=None):
556: """Änderung der Properties"""
557: self.resourceID=resourceID
558: self.title=title
559: self.label=label
560: self.description=description
561:
562: self.contentType=contentType
563: self.renderingType=renderingType
564: self.weight=weight
565:
566: self.link=link
567: self.metalink=metalink
568:
569: if RESPONSE is not None:
570: RESPONSE.redirect('manage_main')
571:
572:
573: def changeECHO_resource_coords(self,coords,viewClassification,RESPONSE=None):
574: """Änderung der Properties - coords"""
575:
1.78 dwinter 576: if type(coords)==StringType:
577: coords=[coords]
578:
1.79 casties 579: try:
1.73 dwinter 580: coordsnew=[ string.split(x,",") for x in coords]
581: except:
582: coordsnew=[]
583:
584: self.coords=coordsnew[0:]
585: self.viewClassification=viewClassification
586:
587: if RESPONSE is not None:
588: RESPONSE.redirect('manage_main')
589:
590: def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None):
591: """Änderung der Properties"""
592: self.credits=credits
593: self.responsible=responsible
594: self.copyrightType=copyrightType
595:
596: if RESPONSE is not None:
597: RESPONSE.redirect('manage_main')
598:
599:
1.90 ! dwinter 600: def changeECHO_resource_metadata_local(self,RESPONSE=None):
! 601: """change metadata"""
! 602: tags=self.findTagsFromMapping(self.contentType)
! 603: for field in tags[1]:
! 604: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]
! 605:
! 606:
! 607:
! 608: if RESPONSE is not None:
! 609: RESPONSE.redirect('manage_main')
! 610:
1.73 dwinter 611: def changeECHO_resource_metadata(self,RESPONSE=None):
612: """change metadata"""
613: tags=self.findTagsFromMapping(self.contentType)
1.75 dwinter 614: self.OSAS_meta={}
1.73 dwinter 615: for field in tags[1]:
616: try:
617: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]
618: self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)]
619: except:
620: """nothing"""
621:
1.75 dwinter 622: return 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()
1.73 dwinter 623:
624: if RESPONSE is not None:
625: RESPONSE.redirect('manage_main')
626:
627:
1.90 ! dwinter 628: def getMDValue(self,fieldName):
! 629: return self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%self.contentType)
! 630:
1.73 dwinter 631: def newMetaXML(self):
1.75 dwinter 632: """new index.meta"""
1.73 dwinter 633: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
634: return writeMetadata(self.metalink,self.OSAS_meta)
635:
1.90 ! dwinter 636:
! 637: def getMetaDataXML(self):
! 638: """prints out metadata as stored in the echo environment, format is the index.meta format"""
! 639: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
! 640: return writeMetadata(self.metalink,self.metaDataHash)
! 641:
1.27 dwinter 642: def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,viewClassification="",coords=None,credits=None,RESPONSE=None):
1.1 casties 643: """Änderung der Properties"""
644:
1.33 dwinter 645: try:
646: coordsnew=[ string.split(x,",") for x in coords]
647: except:
648: coordsnew=[]
1.21 dwinter 649:
1.27 dwinter 650: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
1.62 dwinter 651: self.viewClassification=viewClassification
1.21 dwinter 652: self.coords=coordsnew[0:]
1.1 casties 653: self.link=link
654: self.metalink=metalink
655:
656: if RESPONSE is not None:
657: RESPONSE.redirect('manage_main')
658:
659:
660: manage_options = Folder.manage_options+(
1.73 dwinter 661: {'label':'Main Config','action':'ECHO_resource_config_main'},
662: {'label':'Change Credits & Copyright','action':'ECHO_resource_config_credits'},
663: {'label':'Change Metadata','action':'ECHO_resource_config_metadata'},
664: {'label':'Change Coords','action':'ECHO_resource_config_coords'},
665: {'label':'Add coords','action':'ECHO_graphicEntry'},
666: {'label':'Sync Metadata','action':'ECHO_getResourceMD'},
667: )
1.1 casties 668:
1.20 dwinter 669: def getOverview(self):
670: """overview graphics"""
671:
672: return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
673:
1.3 dwinter 674: def ECHO_graphicEntry(self):
675: """DO nothing"""
1.20 dwinter 676: overview = self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])
1.19 dwinter 677: if overview:
1.13 dwinter 678: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
1.3 dwinter 679: return pt()
680: else:
681: return "NO OVERVIEW GRAPHICS"
682:
1.4 dwinter 683: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
1.3 dwinter 684: """Enter coords"""
685: coords=self.coords
1.4 dwinter 686: temco=coordstr.split(",")
687: temco.append(angle)
688: coords.append(temco)
689:
1.3 dwinter 690: self.coords=coords[0:]
1.13 dwinter 691:
1.3 dwinter 692: if RESPONSE is not None:
693: RESPONSE.redirect('ECHO_graphicEntry')
694:
1.73 dwinter 695:
696: def isDefinedInThisSet(self,fields,field):
697: """checks if field is defined in fields"""
698: if (fields[0].has_key(field)) and not (fields[0][field]==""):
699: return 1
700: else:
701:
702: return 0
703:
704: def getFieldLabel(self,fields,field):
705: """get labels"""
706: try:
707: ret =fields[0][field]
708: if ret == "":
709: return field
710: else:
711: return ret
712: except:
713: return field
714:
715:
716:
717: def getFieldTag(self,fields,field):
718: """get labels"""
719: try:
720: ret =fields[0][field]
721: if ret == "":
722: return field
723: else:
724: return ret
725: except:
726: return field
727:
728:
729:
730: def getFieldValue(self,field):
731: """get value"""
732: #print field
733: try:
734:
735: ret=self.metaDataHash[field]
736: if ret == "":
737: return None
738: else:
739: return ret
740: except:
741: return None
742:
1.90 ! dwinter 743: def getMetaDataHash(self):
! 744: """md hash"""
! 745: return self.metaDataHash
! 746:
! 747: def setFieldValue(self,field,value):
! 748: """get value"""
! 749: #print field
! 750: if not hasattr(self,'metaDataHash'):
! 751: setattr(self,'metaDataHash',{})
! 752: self.metaDataHash[field]=value[0:]
! 753:
! 754:
! 755:
1.73 dwinter 756: def findLabelsFromMapping(self,referenceType):
757: """gib hash mit label -> generic zurueck"""
1.90 ! dwinter 758: #return {},[]
! 759:
! 760: temp=self.ZopeFind(self.standardMD)
! 761:
! 762: if referenceType=="":
! 763: referenceType="book"
! 764:
1.73 dwinter 765:
766: bibdata={}
767: retdata={}
1.90 ! dwinter 768: fields=[]
1.73 dwinter 769: fieldlist=self.standardMD.fieldList
770:
771: for referenceTypeF in self.referencetypes:
772: #print referenceTypeF[1].title,referenceType
1.86 dwinter 773: if referenceTypeF[1].title.lower() == referenceType.lower():
1.73 dwinter 774: #print "OK"
1.86 dwinter 775: try:
776: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
777: referenceType=referenceTypeF[1].title
778: except:
779: bibdata[referenceType]=referenceTypeF[1].fields
780:
781:
1.73 dwinter 782: bibdata['data']=referenceTypeF[1]
1.90 ! dwinter 783: fields=bibdata[referenceType]
1.73 dwinter 784: for field in fieldlist:
785: retdata[field]=referenceTypeF[1].getValue(field)[1]
786: #print retdata,fieldlist
1.90 ! dwinter 787: return retdata,fieldlist,temp,fields
1.73 dwinter 788:
789: def findTagsFromMapping(self,referenceType):
790: """gib hash mit label -> generic zurueck"""
1.90 ! dwinter 791:
! 792:
! 793: if referenceType=="":
! 794: referenceType="book"
! 795:
! 796: temp = self.ZopeFind(self.standardMD)[0:]
! 797:
! 798:
! 799: #self.referencetypes=temp[0:]
! 800:
1.73 dwinter 801:
802:
1.90 ! dwinter 803:
! 804:
! 805:
1.73 dwinter 806: bibdata={}
807: retdata={}
808: fieldlist=self.standardMD.fieldList
809:
1.90 ! dwinter 810: for referenceTypeF in temp:
1.73 dwinter 811:
1.86 dwinter 812: if referenceTypeF[1].title.lower() == referenceType.lower():
813: try:
814: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
815: referenceType=referenceTypeF[1].title
816: except:
817: bibdata[referenceType]=referenceTypeF[1].fields
1.73 dwinter 818: bibdata['data']=referenceTypeF[1]
1.90 ! dwinter 819: fields=bibdata[referenceType]
1.73 dwinter 820: for field in fieldlist:
821: retdata[field]=referenceTypeF[1].getValue(field)[0]
822:
1.90 ! dwinter 823: return retdata,fieldlist,temp,fields
1.73 dwinter 824:
825:
1.90 ! dwinter 826:
! 827: def copyIndex_meta2echo_resource(self,RESPONSE=None):
! 828: """copy MD von Index_meta to the echo_resource"""
! 829:
! 830: (metadict, error)=readMetadata(self.metalink)
! 831:
! 832: self.metaDataHash={}
! 833: if not error=="": #Fehler beim Auslesen des Metafiles
! 834: return "ERROR:",error
! 835: fields=self.findTagsFromMapping(self.contentType)
! 836: #fields=self.findLabelsFromMapping(self.contentType)
! 837: for field in fields[1]:
! 838: if self.isDefinedInThisSet(fields,field):
! 839: self.setFieldValue(self.getFieldTag(fields,field),metadict.get(self.getFieldTag(fields,field),''))
! 840:
! 841:
! 842:
! 843: if RESPONSE:
! 844: return RESPONSE.redirect('manage_main')
! 845:
1.1 casties 846: def ECHO_getResourceMD(self,template="yes"):
847: """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""
848: (metadict, error)=readMetadata(self.metalink)
849:
1.90 ! dwinter 850:
1.1 casties 851:
852: if not error=="": #Fehler beim Auslesen des Metafiles
1.73 dwinter 853: return "ERROR:",error
854:
855:
1.86 dwinter 856: if not (metadict['bib_type'].lower()==self.contentType.lower()):
1.73 dwinter 857: self.REQUEST.SESSION['contentStorage']=metadict['bib_type']
858: self.REQUEST.SESSION['contentZope']=self.contentType
1.1 casties 859:
1.73 dwinter 860: return PageTemplateFile('Products/ECHO_content/zpt/ECHO_getResourceMDErrorContentType.zpt').__of__(self)()
1.1 casties 861:
1.90 ! dwinter 862: self.REQUEST.SESSION['metadict']=metadict
! 863:
! 864:
! 865:
! 866: self.REQUEST.SESSION['diffs']=checkDiffs(self,self.REQUEST.SESSION['metadict'])
! 867:
1.13 dwinter 868:
1.73 dwinter 869:
1.1 casties 870: if template=="yes":
1.90 ! dwinter 871: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_resourceMD.zpt').__of__(self)
! 872: return pt()
1.73 dwinter 873:
1.90 ! dwinter 874:
1.73 dwinter 875:
876:
1.1 casties 877:
878: def ECHO_getMD(self,item):
879: """Ausgabe der MD"""
880: return getattr(self,item)
881:
882: def index_html(self):
883: """standard page"""
884:
885: return self.REQUEST.RESPONSE.redirect(self.link)
886:
1.90 ! dwinter 887: def startpage_html(self):
! 888: """prints out a startpage for a resource for use e.g. in the BVE"""
! 889:
! 890: # suche ob startpage.html in dem Ordner vorhanden ist, dann wir diese angezeigt
! 891:
! 892: sp=self.ZopeFind(self,obj_ids=['startpage.html'])
! 893:
! 894: if sp:
! 895: return sp[1]()
! 896:
! 897: #prüfen ob irgendwo ein template
! 898: if hasattr(self,'startpage_index_template'):
! 899: return self.startpage_index_template()
! 900:
! 901: #generisches template ausgeben
! 902:
! 903: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_startpage_index_template_standard.zpt').__of__(self)
! 904: pt.content_type="text/html"
! 905: return pt()
! 906:
! 907: def toc_html(self):
! 908:
! 909: sp=self.ZopeFind(self,obj_ids=['toc.html'])
! 910:
! 911: if sp:
! 912: return sp[0][1]()
! 913:
! 914:
! 915:
1.1 casties 916: def generate_label(self):
917: """Erzeugt_standard_Label aus Template"""
918: pt=getattr(self,"label_template_"+self.bib_type)
1.13 dwinter 919:
1.1 casties 920: return pt()
921:
1.90 ! dwinter 922: def generate_title(self,RESPONSE=None):
! 923: """Erzeugt_standard_Label aus Template"""
! 924: pt=getattr(self,"label_template_"+self.contentType)
! 925:
! 926: self.title=pt()
! 927:
! 928: return pt()
! 929:
1.13 dwinter 930: def manage_addECHO_resourceForm(self):
931: """Form for adding a ressource"""
932: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_resourceForm.zpt').__of__(self)
1.1 casties 933: return pt()
934:
935:
1.10 dwinter 936:
1.90 ! dwinter 937: def manage_addECHO_resource(self,id,title,label,description,responsible,link,metalink,weight,resourceID=None,contentType=None,renderingType=None,credits=None,coords=None,RESPONSE=None):
1.13 dwinter 938: """addaresource"""
1.1 casties 939:
1.90 ! dwinter 940: newObj=ECHO_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,responsible,credits,weight,coords)
1.1 casties 941:
942: self._setObject(id,newObj)
1.13 dwinter 943:
1.1 casties 944: if RESPONSE is not None:
945: RESPONSE.redirect('manage_main')
946:
947:
948: class ECHO_externalLink(Folder):
949: """Link zu einer externen Ressource"""
950: security=ClassSecurityInfo()
951: meta_type='ECHO_externalLink'
952:
1.48 dwinter 953: def getTitle(self):
954: """title"""
955: return self.title.encode('utf-8')
956:
957: def getLabel(self):
958: """title"""
959: return self.label.encode('utf-8')
960:
1.29 dwinter 961: def content_html(self):
962: """template fuer content"""
963: return content_html(self,'externalLink')
964:
1.27 dwinter 965: def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords):
1.1 casties 966:
967: self.id = id
968: """Festlegen der ID"""
969:
970: self.credits=toList(credits)
971: self.label = label
972: self.link= link
973: self.title=title
974: self.weight=weight
975: self.description=description
1.27 dwinter 976: self.contentType=contentType
1.1 casties 977: self.responsible=responsible
978: coordsnew=[ string.split(x,",") for x in coords]
979: self.coords=coordsnew
980:
981: def ECHO_externalLink_config(self):
982: """Main configuration"""
983:
984: if not hasattr(self,'weight'):
985: self.weight=""
986: if not hasattr(self,'coords'):
1.9 dwinter 987:
1.1 casties 988: self.coords=['']
1.12 dwinter 989: #print "G",self.coords
1.1 casties 990:
1.13 dwinter 991: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_externalLink.zpt').__of__(self)
1.1 casties 992: return pt()
993:
994:
1.37 dwinter 995: def changeECHO_externalLink(self,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None):
1.1 casties 996:
997: """Änderung der Properties"""
1.36 dwinter 998: try:
999: coordsnew=[ string.split(x,",") for x in coords]
1000: except:
1001: coordsnew=[]
1.1 casties 1002:
1.27 dwinter 1003: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coords)
1.1 casties 1004:
1.21 dwinter 1005: self.coords=coordsnew[0:]
1.1 casties 1006: self.link=link
1007: if RESPONSE is not None:
1008: RESPONSE.redirect('manage_main')
1009:
1010:
1011: manage_options = Folder.manage_options+(
1012: {'label':'Main Config','action':'ECHO_externalLink_config'},
1013: )
1.17 dwinter 1014:
1015: def getCredits(self):
1016: """Ausgabe der credits"""
1017: if self.credits:
1018: return self.credits
1019: else:
1020: return []
1021:
1.1 casties 1022: def index_html(self):
1023: """standard page"""
1024:
1025: return self.REQUEST.RESPONSE.redirect(self.link)
1026:
1.13 dwinter 1027: def manage_addECHO_externalLinkForm(self):
1028: """Form for external Links"""
1029: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_externalLinkForm.zpt').__of__(self)
1.1 casties 1030: return pt()
1031:
1032:
1.27 dwinter 1033: def manage_addECHO_externalLink(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None):
1.13 dwinter 1034: """Add an external Link"""
1.1 casties 1035:
1.27 dwinter 1036: newObj=ECHO_externalLink(id,link,title,label,description,contentType,responsible,credits,weight,coords)
1.1 casties 1037:
1038: self._setObject(id,newObj)
1.13 dwinter 1039:
1.1 casties 1040: if RESPONSE is not None:
1041: RESPONSE.redirect('manage_main')
1042:
1.24 dwinter 1043:
1.51 dwinter 1044: class ECHO_link(ECHO_externalLink):
1045: """external_link"""
1046:
1047: meta_type="ECHO_link"
1048:
1049:
1.53 dwinter 1050: def content_html(self):
1.80 dwinter 1051: """template fuer link"""
1052: if hasattr(self,"link_template"):
1053: return content_html(self,'link')
1054: else:
1055: return content_html(self,'collection')
1.53 dwinter 1056:
1.51 dwinter 1057: def manage_addECHO_linkForm(self):
1058: """Form for external Links"""
1059: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_linkForm.zpt').__of__(self)
1060: return pt()
1061:
1062:
1063: def manage_addECHO_link(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None):
1064: """Add an external Link"""
1065:
1066: newObj=ECHO_link(id,link,title,label,description,contentType,responsible,credits,weight,coords)
1067:
1068: self._setObject(id,newObj)
1069:
1070: if RESPONSE is not None:
1071: RESPONSE.redirect('manage_main')
1072:
1.24 dwinter 1073:
1.1 casties 1074: class ECHO_collection(Folder, Persistent, Implicit):
1075: """ECHO Collection"""
1.84 dwinter 1076:
1.1 casties 1077: security=ClassSecurityInfo()
1078: meta_type='ECHO_collection'
1.69 dwinter 1079: viewClassificationList=viewClassificationListMaster
1080: displayTypes=displayTypes
1081:
1082: def getViewClassification(self):
1083: if hasattr(self,'viewClassification'):
1084: return self.viewClassification
1085: else:
1086: return ""
1.48 dwinter 1087:
1088: def getTitle(self):
1089: """title"""
1090: return self.title.encode('utf-8')
1091:
1092: def getLabel(self):
1093: """title"""
1094: return self.label.encode('utf-8')
1.1 casties 1095:
1.83 dwinter 1096:
1097:
1.45 dwinter 1098: def createRessourcesFromXMLForm(self):
1099: """form"""
1100: pt=PageTemplateFile('Products/ECHO_content/zpt/createRessourcesFromXMLForm.zpt').__of__(self)
1101: return pt()
1.83 dwinter 1102:
1.45 dwinter 1103: def createRessourcesFromXML(self,fileupload):
1104: """read an XML file for generating resources"""
1105: dom=xml.dom.minidom.parse(fileupload)
1106: ret="<h2>Added</h2>"
1107: for resource in dom.getElementsByTagName('resource'):
1108: link=getText(resource.getElementsByTagName('link')[0].childNodes)
1109: label=getText(resource.getElementsByTagName('label')[0].childNodes)
1110: #splitted=link.split("?")[0].split("/")
1111: #id=splitted[len(splitted)-1].encode('ascii')
1112: id=re.sub(" ","_",label).encode('ascii')
1113:
1114: ret+="<p>"+label+"</p>"
1.46 dwinter 1115: manage_addECHO_resource(self,id,label.encode('ascii'),label.encode('ascii'),"","","",link.encode('ascii'),"","")
1.45 dwinter 1116: return ret
1.25 dwinter 1117: def getImageTag(self):
1118: """GetTag"""
1119: try:
1120: return self.imageTag
1121: except:
1122: return ""
1123:
1.27 dwinter 1124: def addResource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None):
1.24 dwinter 1125: """SSS"""
1126: try:
1.27 dwinter 1127: manage_addECHO_resource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None)
1.24 dwinter 1128: return "done"
1129: except:
1130: return None
1.32 dwinter 1131:
1132: def getSecondaryLink(self):
1133: """secondary link"""
1134: try:
1135: return self.secondaryLink
1136: except:
1137: return ""
1138:
1139: def getSecondaryLinkTitle(self):
1140: """secondary link"""
1141: try:
1142: return self.secondaryLinkTitle
1143: except:
1144: return ""
1145:
1.24 dwinter 1146: def getCollectionTreeXML(self):
1147: """Tree as XML"""
1148:
1149: def getCollection(object,depth=0):
1150: depth+=1
1151: collections=""
1152: for entry in object.__dict__.keys():
1153: element=getattr(object,entry)
1154: try:
1.40 dwinter 1155: if element.meta_type in ["ECHO_collection","ECHO_group"]:
1.60 dwinter 1156: collections+="<element name=\""+quote(element.title)+"\" url=\""+element.absolute_url()+"\">"
1.24 dwinter 1157: collections+=getCollection(element,depth)+"</element>\n"
1158: except:
1159: """nothing"""
1160: return collections
1161:
1.60 dwinter 1162: ret="""<?xml version="1.0" encoding="utf-8" ?>"""
1163: return ret+"<collection>"+getCollection(self)+"</collection>"
1.24 dwinter 1164:
1.23 dwinter 1165: def createJavaScript(self):
1.88 casties 1166: """OLD CreateJava"""
1.72 casties 1167: ret=javaScriptMain
1.23 dwinter 1168:
1.65 casties 1169: dynamical="\n"
1.23 dwinter 1170: for ob in self.getGraphicCoords():
1.47 casties 1171: if ob[4][4] == "":
1.72 casties 1172: dynamical+="""Coords.push(new Coord('%s', Img, %s));\n"""%(ob[1],ob[0])
1173: else:
1174: dynamical+="""Coords.push(new Coord('%s', Img, %s));//%s\n"""%(ob[1],ob[0],ob[4][4])
1175: dynamical+="ShowArrow(new getObj('i.%s'),Img,%s);\n"%(ob[1],ob[0])
1176: ret+=javaHandler%dynamical
1177: return ret
1178:
1179: def createJSAreas(self):
1.88 casties 1180: """create area calls for JavaScript"""
1.72 casties 1181: dynamical="\n"
1182: for ob in self.getGraphicCoords():
1.74 casties 1183: if ob[5] == "area":
1.65 casties 1184: dynamical+="""addArea('%s', 'overview', %s, 'area');\n"""%(ob[1],ob[0])
1.47 casties 1185: else:
1.65 casties 1186: dynamical+="""addArea('%s', 'overview', %s, 'arrow');\n"""%(ob[1],ob[0])
1.72 casties 1187: return dynamical
1.74 casties 1188:
1189: def createMapHead(self):
1.88 casties 1190: """create javascript include and script tags for head"""
1.74 casties 1191: pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_content_map_frag_js')).__of__(self)
1192: return pt()
1.87 casties 1193:
1194: def createMapImg(self):
1195: """generate img-tag for map"""
1196: bt = BrowserCheck(self)
1197: tag = ""
1198: src = self.REQUEST['URL1'] + "/overview"
1199: if bt.isN4:
1200: tag += '<ilayer id="overview" visibility="show"><img src="%s"></ilayer>'%src
1201: else:
1202: tag += '<img id="overview" src="%s" />'%src
1203: return tag
1.74 casties 1204:
1205: def createMapLink(self, ob, text=None):
1206: """generate map link"""
1.87 casties 1207: bt = BrowserCheck(self)
1.74 casties 1208: id = ob[1]
1209: link = ob[1]
1210: if text == None:
1211: text = ob[2]
1.87 casties 1212: tag = ""
1213: if bt.isN4:
1214: tag += '<ilayer id="a.%s"><a onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
1215: tag += ">" + text + "</a></ilayer>"
1216: else:
1217: tag = '<a id="a.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
1218: if ob[3].contentType == 'text-popup':
1219: tag += ' title="%s"'%ob[3].description
1220: tag += ">" + text + "</a>"
1.74 casties 1221: return tag
1222:
1223: def createMapAux(self, ob, arrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil"):
1224: """generate map link image, text and other stuff"""
1225: id = ob[1]
1226: link = ob[1]
1227: vtype = ob[5]
1228: ctype = ob[3].contentType
1.87 casties 1229: bt = BrowserCheck(self)
1230: tag = ""
1231:
1232: if bt.isN4:
1233: tag += '<layer id="i.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)">'%(id,id,id)
1234: if vtype == "view point":
1235: rot = ob[4][4]
1236: tag += '<a href="%s"><img border="0" src="%s&rot=%s" /></a>'%(link,arrowsrc,rot)
1237: else:
1238: tag += '<a href="%s"><img border="0" width="1000" height="1000" src="trans_img"'%(link)
1239: if ctype == "text-popup":
1240: desc = ob[3].description
1241: tag += ' alt="%s"'%desc
1242: tag += ' /></a>'
1243: tag += '</layer>'
1.74 casties 1244: else:
1.87 casties 1245: tag = '<a id="b.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank">'%(id,id,id,link)
1246: if vtype == "view point":
1247: rot = ob[4][4]
1248: if bt.isIEWin and bt.versIE > 5:
1249: 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)
1250: else:
1251: tag += '<img id="i.%s" src="%s&rot=%s" border="1" style="position:absolute; top:-100px; left:-100px; border-style:none;" />'%(id,arrowsrc,rot)
1252: else:
1253: if bt.isIEWin:
1254: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;background:url(area_img)"'%(id)
1255: else:
1256: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;"'%(id)
1257: if ctype == "text-popup":
1258: desc = ob[3].description
1259: tag += ' title="%s"'%desc
1260: tag += '> </div>'
1261: tag += '</a>'
1.74 casties 1262: return tag
1263:
1.1 casties 1264:
1265: security.declarePublic('getCreditObject')
1266: def getCreditObject(self,name):
1267: """credit id to credititem"""
1.15 dwinter 1268: try:
1269: return getattr(self.partners,name)
1270: except:
1271: return ""
1.17 dwinter 1272:
1.1 casties 1273: security.declarePublic('ECHO_generateNavBar')
1274: def ECHO_generateNavBar(self):
1275: """Erzeuge Navigationsbar"""
1276: link=""
1277: object="self"
1278: ret=[]
1279: path=self.getPhysicalPath()
1280: for element in path:
1281:
1282:
1283: if not element=="":
1284: object+="."+element
1285:
1286: label=eval(object).label
1287: link+="/"+element
1288: if not label=="":
1289: ret.append((label,link))
1290: return ret
1291:
1292: security.declarePublic('ECHO_rerenderLinksMD')
1.73 dwinter 1293:
1.49 dwinter 1294: def ECHO_rerenderLinksMD(self,obj=None):
1.1 casties 1295: """Rerender all Links"""
1.49 dwinter 1296: if not obj:
1297: obj = self
1.1 casties 1298:
1.49 dwinter 1299: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
1300:
1301: for entry in entries:
1302: if entry[1].meta_type == 'ECHO_resource':
1303: entry[1].ECHO_getResourceMD(template="no")
1.73 dwinter 1304: #print "rerender",entry[1].getId()
1.49 dwinter 1305: else:
1306: self.ECHO_rerenderLinksMD(entry[1])
1307:
1.1 casties 1308:
1309:
1310: return "Rerenderd all links to resources in: "+self.title
1.19 dwinter 1311:
1312: security.declarePublic('ECHO_newViewerLink')
1.1 casties 1313:
1314:
1315: def getCoords(self):
1316: try:
1.11 dwinter 1317:
1318: x= [string.join(x,",") for x in self.coords]
1319: return x
1.4 dwinter 1320:
1.11 dwinter 1321: except:
1.4 dwinter 1322:
1.1 casties 1323: return []
1.3 dwinter 1324:
1.34 dwinter 1325: def __init__(self,id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle,secondaryLink,imageTag="",bgcolour=""):
1.9 dwinter 1326: #print "CO",coords
1.1 casties 1327:
1328: self.id = id
1329: """Festlegen der ID"""
1330: self.credits=toList(credits)
1331: self.label = label
1332: self.title=title
1333: self.description=description
1.27 dwinter 1334: self.contentType=contentType
1.1 casties 1335: self.responsible=responsible
1.25 dwinter 1336: self.imageTag=imageTag
1.1 casties 1337: self.weight=weight
1338: self.sortfield=sortfield
1339: coordsnew=[ string.split(x,",") for x in coords]
1340: self.coords=coordsnew
1.32 dwinter 1341: self.secondaryLinkTitle=secondaryLinkTitle
1342: self.secondaryLink=secondaryLink
1.35 dwinter 1343: self.bgcolour=bgcolour
1.32 dwinter 1344:
1.1 casties 1345:
1346: manage_options = Folder.manage_options+(
1.13 dwinter 1347: {'label':'Main Config','action':'ECHO_collection_config'},
1.1 casties 1348: {'label':'Rerender Links','action':'ECHO_rerenderLinksMD'},
1349: {'label':'Graphics','action':'ECHO_graphicEntry'},
1.45 dwinter 1350: {'label':'create resources from XML','action':'createRessourcesFromXMLForm'},
1.1 casties 1351:
1352: )
1353:
1.19 dwinter 1354: def getOverview(self):
1355: """overview graphics"""
1.20 dwinter 1356:
1357: return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
1358:
1.19 dwinter 1359:
1.1 casties 1360: def ECHO_graphicEntry(self):
1361: """DO nothing"""
1.20 dwinter 1362: overview = self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])
1.19 dwinter 1363:
1.20 dwinter 1364:
1.19 dwinter 1365: if overview:
1.13 dwinter 1366: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
1.1 casties 1367: return pt()
1368: else:
1369: return "NO OVERVIEW GRAPHICS"
1370:
1.4 dwinter 1371: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
1.1 casties 1372: """Enter coords"""
1.2 dwinter 1373: coords=self.coords
1.4 dwinter 1374: temco=coordstr.split(",")
1375: temco.append(angle)
1376: coords.append(temco)
1.2 dwinter 1377: self.coords=coords[0:]
1.13 dwinter 1378:
1.2 dwinter 1379: if RESPONSE is not None:
1380: RESPONSE.redirect('ECHO_graphicEntry')
1.1 casties 1381:
1382:
1.13 dwinter 1383: security.declarePublic('ECHO_collection_config')
1384: def ECHO_collection_config(self):
1.1 casties 1385: """Main configuration"""
1386:
1387: if not hasattr(self,'weight'):
1388: self.weight=""
1389:
1390: if not hasattr(self,'sortfield'):
1391: self.sortfield="weight"
1.13 dwinter 1392:
1.1 casties 1393: if not hasattr(self,'coords'):
1394: self.coords=[]
1395:
1.13 dwinter 1396: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_collection.zpt').__of__(self)
1.1 casties 1397: return pt()
1398:
1399:
1.13 dwinter 1400: security.declarePublic('changeECHO_collection')
1.1 casties 1401:
1.10 dwinter 1402:
1.34 dwinter 1403: def getBgcolour(self):
1404: """colour"""
1405: if hasattr(self,'bgcolour') and not (self.bgcolour==""):
1406: return self.bgcolour
1407: else:
1408: return "#dddddd"
1409:
1.69 dwinter 1410: def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",viewClassification=None):
1.71 casties 1411: """Aenderung der Properties"""
1.10 dwinter 1412:
1.32 dwinter 1413: self.secondaryLink=secondaryLink
1414: self.secondaryLinkTitle=secondaryLinkTitle
1.25 dwinter 1415: self.imageTag=imageTag
1.34 dwinter 1416: self.bgcolour=bgcolour
1.69 dwinter 1417: self.viewClassification=viewClassification
1.34 dwinter 1418:
1.32 dwinter 1419: if coords:
1420: coordsnew=[ string.split(x,",") for x in coords]
1421: self.coords=coordsnew[0:]
1422: else:
1423: coordsnew=None
1424: self.coords=None
1425:
1426: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
1.44 dwinter 1427: try:
1428: self.coords=coordsnew[0:] # HACK fehler in setECHO_collection
1429: except:
1430: """none"""
1431:
1.1 casties 1432: self.sortfield=sortfield
1433:
1434: if RESPONSE is not None:
1435: RESPONSE.redirect('manage_main')
1436:
1.23 dwinter 1437:
1438: def showOverview(self):
1439: """overview"""
1440: if 'ECHO_overview.html' in self.__dict__.keys():
1441: return getattr(self,'ECHO_overview.html')()
1442: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_content_overview.zpt').__of__(self)
1443: return pt()
1444:
1.84 dwinter 1445: security.declareProtected('View','index_html')
1.1 casties 1446:
1447: def index_html(self):
1448: """standard page"""
1449:
1450: if 'index.html' in self.__dict__.keys():
1451: return getattr(self,'index.html')()
1.32 dwinter 1452:
1.1 casties 1453: elif 'overview' in self.__dict__.keys():
1454: return self.showOverview()
1.32 dwinter 1455: elif hasattr(self,'collection_index_template'):
1456: return self.collection_index_template()
1.54 dwinter 1457: elif hasattr(self,'main_index_template'):
1.55 dwinter 1458: return self.main_index_template()
1.1 casties 1459:
1.54 dwinter 1460: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_main_index_template_standard.zpt').__of__(self)
1.29 dwinter 1461: pt.content_type="text/html"
1.1 casties 1462: return pt()
1463:
1.29 dwinter 1464: def content_html(self):
1465: """template fuer content"""
1466: return content_html(self,'collection')
1467:
1.11 dwinter 1468: def getCredits(self):
1469: """Ausgabe der credits"""
1470: if self.credits:
1471: return self.credits
1472: else:
1473: return []
1.1 casties 1474:
1.65 casties 1475: def area_img(self):
1476: """area image"""
1.88 casties 1477: bt = BrowserCheck(self)
1.89 casties 1478: if bt.isIE or bt.isN4:
1.88 casties 1479: return sendFile(self, 'images/red.gif', 'image/gif')
1480: else:
1481: return sendFile(self, 'images/reda.png', 'image/png')
1.87 casties 1482:
1483: def trans_img(self):
1484: """empty image"""
1485: return sendFile(self, 'images/trans.gif', 'image/gif')
1.65 casties 1486:
1487: def hl_lib_js(self):
1488: """javascript"""
1.79 casties 1489: return sendFile(self, 'js/hl_lib.js', 'text/plain')
1.65 casties 1490:
1491: def js_lib_js(self):
1492: """javascript"""
1.79 casties 1493: return sendFile(self, 'js/js_lib.js', 'text/plain')
1.23 dwinter 1494:
1.1 casties 1495: def getGraphicCoords(self):
1496: """Give list of coordinates"""
1.68 casties 1497: subColTypes=['ECHO_collection','ECHO_resource']
1.1 casties 1498: ids=[]
1.67 casties 1499: for entrySearch in self.ZopeFind(self,obj_metatypes=subColTypes):
1.66 dwinter 1500: object=entrySearch[1]
1501: if hasattr(object,'coords'):
1502: for coordtemp in object.coords:
1503: if len(coordtemp)>3:
1504: coord=coordtemp[0:4]
1505: label=""
1.70 casties 1506: vc=""
1.66 dwinter 1507: if hasattr(object,'label') and not object.label=="":
1508: label=object.label
1509: elif hasattr(object,'title') and not object.title=="":
1510: label=object.title
1511: else:
1512: label=object.getId()
1.70 casties 1513: if object.viewClassification != "":
1514: vc=object.viewClassification
1515: else:
1516: if len(coordtemp) > 4 and coordtemp[4] != "":
1517: vc="view point"
1518: else:
1519: vc="area"
1520: ids.append([string.join(coord,", "),object.getId(),label,object,coordtemp,vc])
1.1 casties 1521: return ids
1522:
1.42 dwinter 1523:
1524:
1525:
1.41 dwinter 1526: getSubCols = ECHO_helpers.getSubCols
1.84 dwinter 1527:
1528: Globals.InitializeClass(ECHO_collection)
1.1 casties 1529:
1.13 dwinter 1530: def manage_addECHO_collectionForm(self):
1531: """Add collection form"""
1532: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_collectionForm.zpt').__of__(self)
1.1 casties 1533: return pt()
1534:
1535:
1.34 dwinter 1536: def manage_addECHO_collection(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour=""):
1.13 dwinter 1537: """add a echo collection"""
1.1 casties 1538:
1539:
1.34 dwinter 1540: newObj=ECHO_collection(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
1.1 casties 1541:
1542: self._setObject(id,newObj)
1.13 dwinter 1543:
1.1 casties 1544: if RESPONSE is not None:
1545: RESPONSE.redirect('manage_main')
1546:
1.38 dwinter 1547: class ECHO_group(ECHO_collection):
1548: """ECHO Gruppe"""
1.84 dwinter 1549: security=ClassSecurityInfo()
1.38 dwinter 1550: meta_type="ECHO_group"
1551:
1552: manage_options = Folder.manage_options+(
1553: {'label':'Main Config','action':'ECHO_group_config'},
1554: {'label':'Rerender Links','action':'ECHO_rerenderLinksMD'},
1555: {'label':'Graphics','action':'ECHO_graphicEntry'},
1556: )
1.84 dwinter 1557:
1558: security.declareProtected('View','index_html')
1.52 dwinter 1559: def index_html(self):
1560: """standard page"""
1561: displayedObjects=self.ZopeFind(self,obj_metatypes=displayTypes)
1.61 dwinter 1562: #if (len(displayedObjects)==1) and (displayedObjects[0][1].meta_type=="ECHO_collection"): # nur ein Object dann redirect auf dieses Object
1563: # return self.REQUEST.RESPONSE.redirect(displayedObjects[0][1].absolute_url())
1.52 dwinter 1564:
1565: if 'index.html' in self.__dict__.keys():
1566: return getattr(self,'index.html')()
1.56 dwinter 1567:
1.52 dwinter 1568: elif 'overview' in self.__dict__.keys():
1.56 dwinter 1569: return self.showOverview()
1.52 dwinter 1570: elif hasattr(self,'group_index_template'):
1.56 dwinter 1571: return self.group_index_template()
1572: elif hasattr(self,'collection_index_template'):
1573: return self.collection_index_template()
1.54 dwinter 1574: elif hasattr(self,'main_index_template'):
1.55 dwinter 1575: return self.main_index_template()
1.52 dwinter 1576:
1.54 dwinter 1577: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_main_index_template_standard.zpt').__of__(self)
1.52 dwinter 1578: pt.content_type="text/html"
1579: return pt()
1580:
1.38 dwinter 1581: def ECHO_group_config(self):
1582: """Main configuration"""
1583:
1584: if not hasattr(self,'weight'):
1585: self.weight=""
1586:
1587: if not hasattr(self,'sortfield'):
1588: self.sortfield="weight"
1589:
1590: if not hasattr(self,'coords'):
1591: self.coords=[]
1592:
1593: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_group.zpt').__of__(self)
1594: return pt()
1595:
1.43 dwinter 1596: def changeECHO_group(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
1.38 dwinter 1597: """Änderung der Properties"""
1598:
1599: self.secondaryLink=secondaryLink
1600: self.secondaryLinkTitle=secondaryLinkTitle
1601: self.imageTag=imageTag
1602: self.bgcolour=bgcolour
1.43 dwinter 1603: self.logo=logo
1604:
1.38 dwinter 1605: if coords:
1606: coordsnew=[ string.split(x,",") for x in coords]
1607: self.coords=coordsnew[0:]
1608: else:
1609: coordsnew=None
1610: self.coords=None
1611:
1612: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
1613:
1614:
1615:
1616: self.sortfield=sortfield
1617:
1618: if RESPONSE is not None:
1619: RESPONSE.redirect('manage_main')
1.40 dwinter 1620:
1621: def getLogo(self):
1622: """logo ausgeben"""
1.43 dwinter 1623: try:
1624: return self.logo
1625: except:
1626: return "ECHO_groups"
1.40 dwinter 1627:
1.38 dwinter 1628: def content_html(self):
1629: """template fuer content"""
1630: return content_html(self,'group')
1631:
1632:
1633:
1634: def manage_addECHO_groupForm(self):
1635: """Add group form"""
1636: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_groupForm.zpt').__of__(self)
1637: return pt()
1638:
1639:
1.43 dwinter 1640: def manage_addECHO_group(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
1.38 dwinter 1641: """add a echo group"""
1642:
1643:
1644: newObj=ECHO_group(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
1645:
1.43 dwinter 1646: setattr(newObj,'logo',logo)
1.38 dwinter 1647: self._setObject(id,newObj)
1.43 dwinter 1648:
1.38 dwinter 1649: if RESPONSE is not None:
1650: RESPONSE.redirect('manage_main')
1651:
1.84 dwinter 1652: Globals.InitializeClass(ECHO_group)
1.85 dwinter 1653:
1654:
1655: class ECHO_userFolder(UserFolder):
1656: """User folder for Intranet"""
1657: _domain_auth_mode=1 # Identification via domain
1658: meta_type="ECHO_userFolder"
1.38 dwinter 1659:
1.85 dwinter 1660: def authenticate(self, name, password, request):
1661: emergency = self._emergency_user
1662: if name is None:
1663: return None
1664: if emergency and name==emergency.getUserName():
1665: user = emergency
1666: else:
1667: user = self.getUser(name)
1668: if user is not None and user.authenticate(password, request):
1669: return user
1670: else:
1671: return None
1672:
1673: def domainSpecMatch(self,spec, request):
1674: host=''
1675: addr=''
1676:
1677: # Fast exit for the match-all case
1678: if len(spec) == 1 and spec[0] == '*':
1679: return 1
1680:
1681: if request.has_key('REMOTE_HOST'):
1682: host=request['REMOTE_HOST']
1683:
1684: if request.has_key('REMOTE_ADDR'):
1685: addr=request['REMOTE_ADDR']
1686:
1687: if request.has_key('HTTP_X_FORWARDED_FOR'):
1688: addr=request['HTTP_X_FORWARDED_FOR']
1689:
1690:
1691: if not host and not addr:
1692: return 0
1693:
1694: if not host:
1695: try: host=socket.gethostbyaddr(addr)[0]
1696: except: pass
1697: if not addr:
1698: try: addr=socket.gethostbyname(host)
1699: except: pass
1700:
1701:
1702: _host=host.split('.')
1703: _addr=addr.split('.')
1704: _hlen=len(_host)
1705: _alen=len(_addr)
1706:
1707: for ob in spec:
1708: sz=len(ob)
1709: _ob=ob.split('.')
1710: _sz=len(_ob)
1711:
1712: mo = addr_match(ob)
1713: if mo is not None:
1714: if mo.end(0)==sz:
1715: fail=0
1716: for i in range(_sz):
1717: a=_addr[i]
1718: o=_ob[i]
1719: if (o != a) and (o != '*'):
1720: fail=1
1721: break
1722: if fail:
1723: continue
1724: return 1
1725:
1726: mo = host_match(ob)
1727: if mo is not None:
1728: if mo.end(0)==sz:
1729: if _hlen < _sz:
1730: continue
1731: elif _hlen > _sz:
1732: _item=_host[-_sz:]
1733: else:
1734: _item=_host
1735: fail=0
1736: for i in range(_sz):
1737: h=_item[i]
1738: o=_ob[i]
1739: if (o != h) and (o != '*'):
1740: fail=1
1741: break
1742: if fail:
1743: continue
1744: return 1
1745: return 0
1746:
1747: Globals.default__class_init__(ECHO_userFolder)
1748:
1749:
1750:
1751: def manage_addECHO_userFolder(self,dtself=None,REQUEST=None,**ignored):
1752: """add a user folder """
1753: f=ECHO_userFolder()
1754: self=self.this()
1755: try: self._setObject('acl_users', f)
1756: except: return MessageDialog(
1757: title ='Item Exists',
1758: message='This object already contains a User Folder',
1759: action ='%s/manage_main' % REQUEST['URL1'])
1760: self.__allow_groups__=f
1761: if REQUEST is not None:
1762: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
1763:
1764: def manage_addECHO_userFolderForm(self):
1765: """add a user folder form"""
1766: return manage_addECHO_userFolder(self)
1767:
1.1 casties 1768: class ECHO_root(Folder,Persistent,Implicit):
1769: """ECHO Root Folder"""
1.85 dwinter 1770:
1771: security=ClassSecurityInfo()
1772:
1.1 casties 1773: meta_type="ECHO_root"
1.90 ! dwinter 1774:
! 1775:
! 1776: def getBibTag(self,tag,content):
! 1777: """get field tag für index-meta-generation"""
! 1778: if not content or content=="":
! 1779: return ""
! 1780: ret="<%s>"%tag
! 1781: ret+=urllib.quote(content)
! 1782: ret+="</%s>"%tag
! 1783: return ret
! 1784:
! 1785: def getValueFromClass(self,field,found):
! 1786: """retattribute falss existing"""
! 1787: try:
! 1788: return getattr(found,field)
! 1789: except:
! 1790: return ""
1.49 dwinter 1791:
1792: def getImageTag(self):
1793: """needed by main_template"""
1794: return ""
1795: secondaryLink="" #needed by main_template
1796: secondaryLinkTitle="" #needed by main_template
1797:
1.35 dwinter 1798: def getBgcolour(self):
1799: """hack"""
1800: return "#dddddd"
1.28 dwinter 1801:
1802: def contentTypeSelector_HTML(self,selected=None):
1803: """give type selector"""
1804: if not selected:
1805: retStr="<option selected>\n"
1806: else:
1807: retStr="<option>\n"
1808:
1.62 dwinter 1809: try: # erste version contentTypes exists
1.73 dwinter 1810: for contentType in self.ZopeFind(self.contentTypes,obj_metatypes=["ECHO_contentType","OSAS_MetadataMapping"]):
1.28 dwinter 1811: if selected and (contentType[0]==selected):
1812: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
1813: else:
1814: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
1815: except:
1.62 dwinter 1816: try:
1817: for contentType in self.ZopeFind(self.standardMD,obj_metatypes=["OSAS_MetadataMapping"]):
1818: if selected and (contentType[0]==selected):
1819: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
1820: else:
1821: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
1822: except:
1823: """nothing"""
1824:
1.73 dwinter 1825: return retStr
1826:
1827: def renderingTypeSelector_HTML(self,selected=None):
1828: """give type selector"""
1829: if not selected:
1830: retStr="<option selected>\n"
1831: else:
1832: retStr="<option>\n"
1833:
1834: try: # erste version renderingTypes exists
1835: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
1836: if selected and (renderingType[0]==selected):
1837: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
1838: else:
1839: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
1840: except:
1841: """nothing"""
1842: return retStr
1843:
1844: def renderingTypeSelector_HTML(self,selected=None):
1845: """give type selector"""
1846: if not selected:
1847: retStr="<option selected>\n"
1848: else:
1849: retStr="<option>\n"
1850:
1851: try: # erste version renderingTypes exists
1852: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
1853: if selected and (renderingType[0]==selected):
1854: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
1855: else:
1856: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
1857: except:
1858: """nothing"""
1859: return retStr
1860:
1861:
1862: def copyrightTypeSelector_HTML(self,selected=None):
1863: """give type selector"""
1864: if not selected:
1865: retStr="<option selected>\n"
1866: else:
1867: retStr="<option>\n"
1868:
1869: try: # erste version copyrightTypes exists
1870: for copyrightType in self.ZopeFind(self.copyrightTypes,obj_metatypes=["ECHO_copyrightType"]):
1871: if selected and (copyrightType[0]==selected):
1872: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
1873: else:
1874: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
1875: except:
1876: """nothing"""
1877: return retStr
1878:
1.28 dwinter 1879:
1.27 dwinter 1880: def patchContentType(self,obj=None):
1881: """austauschen content_type with contentType (patch bei umstieg von alter Version)"""
1882:
1883:
1884: if not obj:
1885: obj = self
1886:
1.30 dwinter 1887: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate'])
1.27 dwinter 1888:
1889: for entry in entries:
1.31 dwinter 1890: setattr(entry[1],'contentType',entry[1].content_type)
1891: #entry[1].contentType == entry[1].content_type
1.27 dwinter 1892:
1893: if entry[1].meta_type == 'ECHO_collection':
1894: entry[1].patchContentType(entry[1])
1.19 dwinter 1895:
1.27 dwinter 1896:
1.49 dwinter 1897: return "changed all contenttypes in: "+self.title
1.63 dwinter 1898:
1899:
1900: def patchViewClassification(self,obj=None):
1901: """setze viewClassification heuristisch"""
1902:
1903: def checkIfArrow(obj):
1904: if hasattr(obj,'coords'):
1905: for coordtemp in obj.coords:
1.73 dwinter 1906: #print obj.title,len(coordtemp)
1.64 dwinter 1907: if (len(coordtemp)>4) and not (coordtemp[4]==''):
1.63 dwinter 1908: return 4
1909: return None
1910: return None
1911:
1912: if not obj:
1913: obj = self
1914:
1915: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_group'])
1916:
1917: for entry in entries:
1918:
1.64 dwinter 1919: if checkIfArrow(entry[1]):
1.63 dwinter 1920: setattr(entry[1],'viewClassification','view point')
1921: else:
1922: setattr(entry[1],'viewClassification','area')
1923:
1924: #entry[1].contentType == entry[1].content_type
1925:
1926: if entry[1].meta_type in ['ECHO_collection','ECHO_group']:
1927: entry[1].patchViewClassification(entry[1])
1928:
1929:
1930: return "changed all contenttypes in: "+self.title
1931:
1.19 dwinter 1932: def ECHO_newViewerLink(self,obj=None):
1933: """change links (:86 faellt weg)"""
1934:
1935: if not obj:
1936: obj = self
1937:
1938: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
1939:
1940: for entry in entries:
1941:
1942: if entry[1].meta_type == 'ECHO_resource':
1943:
1944: entry[1].link=re.sub('\:86','',entry[1].link)
1945:
1946: else:
1947:
1948: entry[1].ECHO_newViewerLink(entry[1])
1949:
1950: return "Rerenderd all links to resources in: "+self.title
1.1 casties 1951:
1952: def __init__(self,id,title):
1953: """init"""
1954: self.id = id
1955: self.title=title
1.13 dwinter 1956:
1.14 dwinter 1957: def deleteSpace(self,str):
1958: """delete space at the end of a line"""
1959: if str[len(str)-1]==" ":
1960: return str[0:len(str)-1]
1961: else:
1962: return str
1963:
1964:
1965:
1966: # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt
1967:
1968: def formatAscii(self,str,url=None):
1969: """ersetze ascii umbrueche durch <br>"""
1970: #url=None
1971: if url:
1972:
1973: retStr=""
1974: words=str.split("\n")
1975:
1976: for word in words:
1977: strUrl=url%word
1.73 dwinter 1978: #print "str",strUrl
1.14 dwinter 1979: retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
1980: str=retStr
1981: if str:
1982: return re.sub(r"[\n]","<br/>",str)
1983: else:
1984: return ""
1985:
1986: def link2html(self,str):
1987: """link2html fuer VLP muss hier noch raus"""
1988: if str:
1.73 dwinter 1989: #print str
1.14 dwinter 1990: str=re.sub("\&","&",str)
1991: dom=xml.dom.minidom.parseString("<?xml version='1.0' ?><txt>"+str+"</txt>")
1992: links=dom.getElementsByTagName("link")
1993:
1.73 dwinter 1994: #print "link",links
1.14 dwinter 1995: for link in links:
1996: link.tagName="a"
1997: ref=link.getAttribute("ref")
1998: if self.checkRef(ref):
1999: link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref)
2000:
2001: return dom.toxml('utf-8')
2002: return ""
2003:
2004:
2005: def checkRef(self,ref):
2006: dbs={'vl_literature':'AND CD LIKE \'%lise%\'','vl_technology':'','vl_people':''}
2007: res=None
2008: for db in dbs.keys():
2009: #print ref,"select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])
2010:
2011: res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))
2012: return res
2013:
2014: #Ende Methode fuer vlp
2015:
1.13 dwinter 2016: def PgQuoteString(self,string):
2017: """Quote string"""
1.14 dwinter 2018: #print "PG",string
1.13 dwinter 2019: return libpq.PgQuoteString(string)
1.1 casties 2020:
2021: def getPartners(self):
2022: """Get list of Partners. Presently only from a subfolder partners"""
1.26 dwinter 2023:
2024: return [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])]
1.13 dwinter 2025:
1.1 casties 2026:
1.26 dwinter 2027:
1.1 casties 2028:
1.24 dwinter 2029:
1.26 dwinter 2030: def getPartnersXML(self):
2031: """partner liste als xml"""
2032: partners=self.getPartners()
1.60 dwinter 2033: ret="""<?xml version="1.0" encoding="utf-8" ?>
2034: <partners>"""
2035:
2036: for partner in partners:
2037: ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),unicode(partner.title,'utf-8','replace'))
1.26 dwinter 2038:
2039: return ret+"\n</partners>"
1.24 dwinter 2040:
1.1 casties 2041: def getCollectionTree(self):
2042: """get the collection tree (list of triples (parent,child, depth)"""
2043:
2044: def getCollection(object,depth=0):
2045: depth+=1
2046: collections=[]
2047: for entry in object.__dict__.keys():
2048: element=getattr(object,entry)
2049: try:
2050: if element.meta_type=="ECHO_collection":
2051: collections.append((object,element,depth))
2052: collections+=getCollection(element,depth)
2053: except:
2054: """nothing"""
2055: return collections
2056:
2057:
2058: return getCollection(self)
2059:
2060: def getCollectionTreeIds(self):
2061: """Show the IDs of the Tree"""
2062: ret=[]
2063: for collection in self.getCollectionTree():
2064: ret.append((collection[0].getId(),collection[1].getId(),collection[2]))
2065: return ret
2066:
1.82 dwinter 2067: def getResourcesHTML(self,viewerType=None,filter=None):
2068: """gebe all ressourcen aus"""
1.81 dwinter 2069:
1.82 dwinter 2070: def sortHTML(x,y):
2071: return cmp(x[1].title,y[1].title)
2072:
2073: ret="""<html><body><h2>Resources in ECHO</h3>"""
2074:
2075: resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
2076: ret+="""<h3>Found %i resources</h3>"""%len(resources)
2077: resources.sort(sortHTML)
2078: for resource in resources:
2079: echo_url=resource[1].absolute_url()
2080:
2081: if hasattr(resource[1],'title'):
2082: title=resource[1].title
2083: else:
2084: title="None"
2085: if filter:
2086: if re.search(filter,title):
2087: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
2088: else:
2089: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
2090:
2091: ret +="""\n</body></html>"""
2092:
2093: #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html")
2094: #self.REQUEST.RESPONSE.write(ret)
2095: return ret
2096:
1.81 dwinter 2097: def getResourcesXML(self,viewerType=None,filter=None):
2098: """gebe all ressourcen aus"""
2099: ret="""<?xml version="1.0" ?>
2100: <index>"""
2101: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
2102:
2103: echo_url=resource[1].absolute_url()
2104: if hasattr(resource[1],'link'):
2105: viewer_url=resource[1].link
2106: else:
2107: viewer_url="NO URL"
2108: if filter:
2109: if re.search(filter,viewer_url):
2110: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
2111: else:
2112: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
2113: ret +="""\n</index>"""
2114:
2115: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
2116: self.REQUEST.RESPONSE.write(ret)
1.83 dwinter 2117:
2118: def getFullTextsXML(self,viewerType=None,filter=None):
2119: """gebe all ressourcen aus"""
2120: ret="""<?xml version="1.0" ?>
2121: <index>"""
2122: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
2123:
2124: echo_url=resource[1].absolute_url()
2125: if resource[1].getFullTextXML(noredirect="yes"):
2126: if hasattr(resource[1],'link'):
2127: viewer_url=echo_url+"/getFullTextXML"
2128: else:
2129: viewer_url="NO URL"
2130: if filter:
2131: if re.search(filter,viewer_url):
2132: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
2133: else:
2134: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
2135: ret +="""\n</index>"""
1.90 ! dwinter 2136:
1.81 dwinter 2137:
1.83 dwinter 2138: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
2139: self.REQUEST.RESPONSE.write(ret)
1.1 casties 2140:
1.13 dwinter 2141: def manage_addECHO_root(self,id,title,RESPONSE=None):
1.1 casties 2142: """Add an ECHO_root"""
2143: self._setObject(id,ECHO_root(id,title))
2144:
2145: if RESPONSE is not None:
2146: RESPONSE.redirect('manage_main')
2147:
1.13 dwinter 2148: def manage_addECHO_rootForm(self):
1.1 casties 2149: """Nothing yet"""
1.13 dwinter 2150: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_root.zpt').__of__(self)
1.1 casties 2151: return pt()
2152:
2153: class ECHO_partner(Image,Persistent):
2154: """ECHO Partner"""
2155:
2156: meta_type="ECHO_partner"
2157:
1.29 dwinter 2158: def __init__(self, id, title,url, file, content_type='', precondition=''):
1.1 casties 2159: self.__name__=id
2160: self.title=title
2161: self.url=url
2162: self.precondition=precondition
2163:
2164: data, size = self._read_data(file)
1.29 dwinter 2165: content_type=self._get_content_type(file, data, id, content_type)
2166: self.update_data(data, content_type, size)
1.1 casties 2167:
2168: manage_options = Image.manage_options+(
2169: {'label':'Partner Information','action':'ECHO_partner_config'},
2170: )
2171:
2172: def changeECHO_partner(self,url,RESPONSE=None):
2173: """Change main information"""
2174: self.url=url
2175: if RESPONSE is not None:
2176: RESPONSE.redirect('manage_main')
2177:
2178:
2179:
2180: def ECHO_partner_config(self):
2181: """Main configuration"""
2182: if not hasattr(self,'url'):
2183: self.url=""
1.13 dwinter 2184: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_partner.zpt').__of__(self)
1.1 casties 2185: return pt()
2186:
2187:
1.13 dwinter 2188: manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(),
1.1 casties 2189: Kind='ECHO_partner',kind='ECHO_partner')
2190:
2191:
2192:
1.29 dwinter 2193: def manage_addECHO_partner(self, id, file,url, title='', precondition='', content_type='',
1.1 casties 2194: REQUEST=None):
2195: """
2196: Add a new ECHO_partner object.
2197:
2198: Creates a new ECHO_partner object 'id' with the contents of 'file'.
2199: Based on Image.manage_addImage
2200: """
2201:
2202: id=str(id)
2203: title=str(title)
1.29 dwinter 2204: content_type=str(content_type)
1.1 casties 2205: precondition=str(precondition)
2206:
2207: id, title = OFS.Image.cookId(id, title, file)
2208:
2209: self=self.this()
2210:
2211: # First, we create the image without data:
1.29 dwinter 2212: self._setObject(id, ECHO_partner(id,title,url,'',content_type, precondition))
1.1 casties 2213:
2214: # Now we "upload" the data. By doing this in two steps, we
2215: # can use a database trick to make the upload more efficient.
2216: if file:
2217: self._getOb(id).manage_upload(file)
1.29 dwinter 2218: if content_type:
2219: self._getOb(id).content_type=content_type
1.1 casties 2220:
2221: if REQUEST is not None:
2222: try: url=self.DestinationURL()
2223: except: url=REQUEST['URL1']
2224: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
2225: return id
2226:
2227:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>