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