1: """New version of the product started February, 8th. Without scientific classification, use content-type for further classification."""
2: """Echo collection provides the classes for the ECHO content web-site.
3:
4: class ECHO_collection is the basis class for an ECHO collection.
5:
6: class ECHO_resource contains information on ECHO resources (e.g. an Display environment for Metadata
7:
8: class ECHO_externalLink contains information on externalLinks
9:
10:
11: """
12: import string
13: import re
14: import os
15: import OFS.Image
16: from types import *
17: from OFS.Image import Image
18: from Globals import DTMLFile
19: from OFS.Folder import Folder
20: from OFS.SimpleItem import SimpleItem
21: from AccessControl import ClassSecurityInfo
22: from Globals import InitializeClass
23: from Globals import DTMLFile
24: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
25: from Products.PageTemplates.PageTemplate import PageTemplate
26: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
27: from Globals import Persistent, package_home
28: from Acquisition import Implicit
29:
30: #from psycopg import libpq
31: #from pyPgSQL import libpq
32: import xml.dom.minidom
33:
34: import urllib
35: import xml.dom.minidom
36: from ECHO_graphicalOverview import javaHandler,javaScriptMain
37:
38: #List of different types for the graphical linking viewer
39: viewClassificationListMaster=['view point','area']
40:
41: def content_html(self,type):
42: """template fuer content"""
43: #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
44: #
45: #if templates:
46: # return templates[0][1]()
47:
48: try:
49: obj=getattr(self,type+"_template")
50: return obj()
51: except:
52: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
53: pt.content_type="text/html"
54: return pt()
55:
56: def toList(field):
57: """Einzelfeld in Liste umwandeln"""
58: if type(field)==StringType:
59: return [field]
60: else:
61: return field
62:
63: def getText(nodelist):
64:
65: rc = ""
66: for node in nodelist:
67: if node.nodeType == node.TEXT_NODE:
68: rc = rc + node.data
69: return rc
70:
71:
72: def readMetadata(url):
73: """Methoden zum Auslesen der Metadateninformation zu einer Resource
74: Vorerst noch Typ bib"""
75:
76: metadict={}
77: try:
78: geturl=""
79: for line in urllib.urlopen(url).readlines():
80: geturl=geturl+line
81:
82:
83: except:
84: return (None,"Cannot open: "+url)
85:
86: try:
87: dom=xml.dom.minidom.parseString(geturl)
88: except:
89: return (None,"Cannot parse: "+url+"<br>"+geturl)
90:
91: metanode=dom.getElementsByTagName('bib')
92: metadict['bib_type']='Book'
93: if len(metanode)==0:
94: metanode=dom.getElementsByTagName('archimedes')
95: metadict['bib_type']='Archimedes'
96: #print "HELLO"
97:
98: if not len(metanode)==0:
99: metacontent=metanode[0].childNodes
100:
101: try:
102: metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
103: except:
104: """nothing"""
105:
106: for node in metacontent:
107: try:
108: metadict[node.tagName.lower()]=getText(node.childNodes)
109: except:
110: """nothing"""
111:
112: #print metadict
113: return metadict,""
114:
115:
116: def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs,viewClassification=""):
117:
118: """Allegemeine Informationen zu einer ECHO Collection"""
119:
120: self.viewClassification=viewClassification
121:
122: self.label = label
123: self.title=title
124: self.description=description
125: self.contentType=contentType
126: self.responsible=responsible
127: self.credits=toList(credits)
128: self.weight=weight
129:
130: coords=[]
131: #coordinates of for rectangles
132:
133: #print "cs", coordstrs
134: if coordstrs:
135: for coordstr in coordstrs:
136: #print "cs", coordstr
137: try:
138: temco=coordstr.split(",")
139: except:
140: temco=[]
141: #temco.append(angle)
142: coords.append(temco)
143:
144:
145: self.coords=coords[0:]
146:
147:
148: class scientificClassification(SimpleItem,Persistent,Implicit):
149: """outdated will be deleeted in the next versions: subclass"""
150: security=ClassSecurityInfo()
151:
152: def __init__(self,context,science,practice):
153: self.context=context
154: self.science=science
155: self.practice=practice
156: self.id="scientific_Classification"
157:
158: security.declarePublic('get_context')
159: def get_context(self):
160: return self.context
161:
162: security.declarePublic('get_science')
163: def get_science(self):
164: return self.science
165:
166: security.declarePublic('get_practice')
167: def get_practice(self):
168: return self.practice
169:
170:
171: class scientificInformation(Folder,Persistent,Implicit):
172: """outdated will be deleted in the next versions: subclass scientificInformation"""
173: security=ClassSecurityInfo()
174:
175:
176:
177: def __init__(self,source_type,period):
178:
179: self.id="scientific_Information"
180: self.source_type=source_type
181: self.period=period
182:
183:
184:
185: security.declarePublic('get_source_type')
186: def get_source_type(self):
187: return self.source_type
188:
189: security.declarePublic('get_period')
190: def get_period(self):
191: return self.period
192:
193: class ECHO_layoutTemplate(ZopePageTemplate):
194: """Create a layout Template for different purposes"""
195:
196: meta_type="ECHO_layoutTemplate"
197:
198: #manage_options=ZopePageTemplate.manage_options+(
199: # {'label':'Set back to Standard','action':'changeECHO_layoutTemplateToStandardForm'},
200: # )
201:
202:
203: def __init__(self, id, text=None, content_type=None,EchoType=None):
204: self.id = str(id)
205:
206:
207:
208: self.ZBindings_edit(self._default_bindings)
209: if text is None:
210: self._default_content_fn = os.path.join(package_home(globals()),
211: 'zpt/ECHO_%s_template_standard.zpt'%EchoType)
212: text = open(self._default_content_fn).read()
213: self.pt_edit(text, content_type)
214:
215: ## def changeECHO_layoutTemplateToStandardForm(self):
216: ## """change form"""
217: ## pt=PageTemplateFile('Products/ECHO_content/zpt/changeECHO_pageTemplateWeightForm.zpt').__of__(self)
218: ## return pt()
219:
220:
221: """change form"""
222:
223:
224: def manage_addECHO_layoutTemplateForm(self):
225: """Form for adding"""
226: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_layoutTemplate.zpt').__of__(self)
227: return pt()
228:
229: from urllib import quote
230:
231:
232: def manage_addECHO_layoutTemplate(self, EchoType,title=None,REQUEST=None):
233: "Add a Page Template with optional file content."
234: if type(EchoType)==StringType:
235: EchoTypes=[EchoType]
236: else:
237: EchoTypes=EchoType
238:
239: for singleType in EchoTypes:
240:
241: id = str(singleType)+"_template"
242: if REQUEST is None:
243: self._setObject(id, ECHO_layoutTemplate(id, text,EchoType=singleType))
244: ob = getattr(self, id)
245:
246: if title:
247: ob.pt_setTitle(title)
248: return ob
249: else:
250: file = REQUEST.form.get('file')
251: headers = getattr(file, 'headers', None)
252: if headers is None or not file.filename:
253: zpt = ECHO_layoutTemplate(id,EchoType=singleType)
254: else:
255: zpt = ECHO_layoutTemplate(id, file, headers.get('content_type'))
256:
257: self._setObject(id, zpt)
258: ob = getattr(self, id)
259: if title:
260: ob.pt_setTitle(title)
261:
262: try:
263: u = self.DestinationURL()
264: except AttributeError:
265: u = REQUEST['URL1']
266:
267:
268: REQUEST.RESPONSE.redirect(u+'/manage_main')
269: return ''
270:
271: class ECHO_resource(Folder):
272: """ECHO Ressource"""
273: meta_type='ECHO_resource'
274:
275: viewClassificationList=viewClassificationListMaster
276:
277: def content_html(self):
278: """template fuer content"""
279: return content_html(self,'resource')
280:
281: def getViewClassification(self):
282: if hasattr(self,'viewClassification'):
283: return self.viewClassification
284: else:
285: return ""
286:
287: def getCredits(self):
288: """Ausgabe der credits"""
289: if self.credits:
290: return self.credits
291: else:
292: return []
293:
294: def __init__(self,id,link,metalink,title,label,description,contentType,responsible,credits,weight,coords):
295:
296: self.id = id
297: """Festlegen der ID"""
298:
299: self.label = label
300: self.link= link
301: self.metalink=metalink
302: self.title=title
303: self.weight=weight
304: self.credits=toList(credits)
305: self.description=description
306: self.contentType=contentType
307: self.responsible=responsible
308:
309: if coords:
310: coordsnew=[ string.split(x,",") for x in coords]
311: else:
312: coordsnew=[]
313:
314: self.coords=coordsnew
315:
316:
317: def getCoords(self):
318: try:
319: return [string.join(x,",") for x in self.coords]
320: except:
321: return []
322:
323:
324: def ECHO_resource_config(self):
325: """Main configuration"""
326:
327: if not hasattr(self,'weight'):
328: self.weight=""
329: if not hasattr(self,'coords'):
330: self.coords=[]
331:
332: print "vorher",self.coords
333: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource.zpt').__of__(self)
334: return pt()
335:
336:
337: def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,viewClassification="",coords=None,credits=None,RESPONSE=None):
338: """Änderung der Properties"""
339:
340: try:
341: coordsnew=[ string.split(x,",") for x in coords]
342: except:
343: coordsnew=[]
344:
345: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
346:
347: self.coords=coordsnew[0:]
348: self.link=link
349: self.metalink=metalink
350:
351: if RESPONSE is not None:
352: RESPONSE.redirect('manage_main')
353:
354:
355: manage_options = Folder.manage_options+(
356: {'label':'Main Config','action':'ECHO_resource_config'},
357: {'label':'Metadata','action':'ECHO_getResourceMD'},
358: {'label':'Graphics','action':'ECHO_graphicEntry'},
359: )
360:
361: def getOverview(self):
362: """overview graphics"""
363:
364: return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
365:
366: def ECHO_graphicEntry(self):
367: """DO nothing"""
368: overview = self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])
369: if overview:
370: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
371: return pt()
372: else:
373: return "NO OVERVIEW GRAPHICS"
374:
375: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
376: """Enter coords"""
377: coords=self.coords
378: temco=coordstr.split(",")
379: temco.append(angle)
380: coords.append(temco)
381:
382: self.coords=coords[0:]
383:
384: if RESPONSE is not None:
385: RESPONSE.redirect('ECHO_graphicEntry')
386:
387: def ECHO_getResourceMD(self,template="yes"):
388: """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""
389: (metadict, error)=readMetadata(self.metalink)
390:
391:
392:
393: if not error=="": #Fehler beim Auslesen des Metafiles
394: return "ERROR:",error
395: for key in metadict.keys():#Hinzufügen der Felder
396:
397: setattr(self,key,metadict[key].encode('ascii','replace'))
398:
399:
400: self.metadata=metadict.keys()
401:
402: self.label=self.generate_label()
403:
404: if template=="yes":
405: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_resourceMD.zpt').__of__(self)
406: return pt()
407:
408: def ECHO_getMD(self,item):
409: """Ausgabe der MD"""
410: return getattr(self,item)
411:
412: def index_html(self):
413: """standard page"""
414:
415: return self.REQUEST.RESPONSE.redirect(self.link)
416:
417: def generate_label(self):
418: """Erzeugt_standard_Label aus Template"""
419: pt=getattr(self,"label_template_"+self.bib_type)
420:
421: return pt()
422:
423: def manage_addECHO_resourceForm(self):
424: """Form for adding a ressource"""
425: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_resourceForm.zpt').__of__(self)
426: return pt()
427:
428:
429:
430: def manage_addECHO_resource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None):
431: """addaresource"""
432:
433: newObj=ECHO_resource(id,link,metalink,title,label,description,contentType,responsible,credits,weight,coords)
434:
435: self._setObject(id,newObj)
436:
437: if RESPONSE is not None:
438: RESPONSE.redirect('manage_main')
439:
440:
441: class ECHO_externalLink(Folder):
442: """Link zu einer externen Ressource"""
443: security=ClassSecurityInfo()
444: meta_type='ECHO_externalLink'
445:
446: def content_html(self):
447: """template fuer content"""
448: return content_html(self,'externalLink')
449:
450: def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords):
451:
452: self.id = id
453: """Festlegen der ID"""
454:
455: self.credits=toList(credits)
456: self.label = label
457: self.link= link
458: self.title=title
459: self.weight=weight
460: self.description=description
461: self.contentType=contentType
462: self.responsible=responsible
463: coordsnew=[ string.split(x,",") for x in coords]
464: self.coords=coordsnew
465:
466: def ECHO_externalLink_config(self):
467: """Main configuration"""
468:
469: if not hasattr(self,'weight'):
470: self.weight=""
471: if not hasattr(self,'coords'):
472:
473: self.coords=['']
474: #print "G",self.coords
475:
476: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_externalLink.zpt').__of__(self)
477: return pt()
478:
479:
480: def changeECHO_externalLink(self,link,title,label,description,contentType,responsible,weight,coords=,credits=None,RESPONSE=None):
481:
482: """Änderung der Properties"""
483: try:
484: coordsnew=[ string.split(x,",") for x in coords]
485: except:
486: coordsnew=[]
487:
488: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coords)
489:
490: self.coords=coordsnew[0:]
491: self.link=link
492: if RESPONSE is not None:
493: RESPONSE.redirect('manage_main')
494:
495:
496: manage_options = Folder.manage_options+(
497: {'label':'Main Config','action':'ECHO_externalLink_config'},
498: )
499:
500: def getCredits(self):
501: """Ausgabe der credits"""
502: if self.credits:
503: return self.credits
504: else:
505: return []
506:
507: def index_html(self):
508: """standard page"""
509:
510: return self.REQUEST.RESPONSE.redirect(self.link)
511:
512: def manage_addECHO_externalLinkForm(self):
513: """Form for external Links"""
514: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_externalLinkForm.zpt').__of__(self)
515: return pt()
516:
517:
518: def manage_addECHO_externalLink(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None):
519: """Add an external Link"""
520:
521: newObj=ECHO_externalLink(id,link,title,label,description,contentType,responsible,credits,weight,coords)
522:
523: self._setObject(id,newObj)
524:
525: if RESPONSE is not None:
526: RESPONSE.redirect('manage_main')
527:
528:
529:
530: class ECHO_collection(Folder, Persistent, Implicit):
531: """ECHO Collection"""
532: security=ClassSecurityInfo()
533: meta_type='ECHO_collection'
534:
535: def getImageTag(self):
536: """GetTag"""
537: try:
538: return self.imageTag
539: except:
540: return ""
541:
542: def addResource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None):
543: """SSS"""
544: try:
545: manage_addECHO_resource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None)
546: return "done"
547: except:
548: return None
549:
550: def getSecondaryLink(self):
551: """secondary link"""
552: try:
553: return self.secondaryLink
554: except:
555: return ""
556:
557: def getSecondaryLinkTitle(self):
558: """secondary link"""
559: try:
560: return self.secondaryLinkTitle
561: except:
562: return ""
563:
564: def getCollectionTreeXML(self):
565: """Tree as XML"""
566:
567: def getCollection(object,depth=0):
568: depth+=1
569: collections=""
570: for entry in object.__dict__.keys():
571: element=getattr(object,entry)
572: try:
573: if element.meta_type=="ECHO_collection":
574: collections+="<element name=\""+element.title+"\" url=\""+element.absolute_url()+"\">"
575: collections+=getCollection(element,depth)+"</element>\n"
576: except:
577: """nothing"""
578: return collections
579:
580:
581: return "<collection>"+getCollection(self)+"</collection>"
582:
583: def createJavaScript(self):
584: """CreateJava"""
585: ret=javaScriptMain
586:
587: dynamical=""
588: for ob in self.getGraphicCoords():
589: dynamical+="""Coords.push(new Coord('%s', Img, %s));\n"""%(ob[1],ob[0])
590: ret+=javaHandler%dynamical
591: return ret
592:
593: security.declarePublic('getCreditObject')
594: def getCreditObject(self,name):
595: """credit id to credititem"""
596: try:
597: return getattr(self.partners,name)
598: except:
599: return ""
600:
601: security.declarePublic('ECHO_generateNavBar')
602: def ECHO_generateNavBar(self):
603: """Erzeuge Navigationsbar"""
604: link=""
605: object="self"
606: ret=[]
607: path=self.getPhysicalPath()
608: for element in path:
609:
610:
611: if not element=="":
612: object+="."+element
613:
614: label=eval(object).label
615: link+="/"+element
616: if not label=="":
617: ret.append((label,link))
618: return ret
619:
620: security.declarePublic('ECHO_rerenderLinksMD')
621: def ECHO_rerenderLinksMD(self):
622: """Rerender all Links"""
623:
624: for entry in self.__dict__.keys():
625: object=getattr(self,entry)
626:
627:
628: try:
629:
630: if object.meta_type == 'ECHO_resource':
631:
632: object.ECHO_getResourceMD(template="no")
633:
634: except:
635: """nothing"""
636:
637: return "Rerenderd all links to resources in: "+self.title
638:
639: security.declarePublic('ECHO_newViewerLink')
640:
641:
642: def getCoords(self):
643: try:
644:
645: x= [string.join(x,",") for x in self.coords]
646: return x
647:
648: except:
649:
650: return []
651:
652: def __init__(self,id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle,secondaryLink,imageTag="",bgcolour=""):
653: #print "CO",coords
654:
655: self.id = id
656: """Festlegen der ID"""
657: self.credits=toList(credits)
658: self.label = label
659: self.title=title
660: self.description=description
661: self.contentType=contentType
662: self.responsible=responsible
663: self.imageTag=imageTag
664: self.weight=weight
665: self.sortfield=sortfield
666: coordsnew=[ string.split(x,",") for x in coords]
667: self.coords=coordsnew
668: self.secondaryLinkTitle=secondaryLinkTitle
669: self.secondaryLink=secondaryLink
670: self.bgcolour=bgcolour
671:
672:
673: manage_options = Folder.manage_options+(
674: {'label':'Main Config','action':'ECHO_collection_config'},
675: {'label':'Rerender Links','action':'ECHO_rerenderLinksMD'},
676: {'label':'Graphics','action':'ECHO_graphicEntry'},
677:
678: )
679:
680: def getOverview(self):
681: """overview graphics"""
682:
683: return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
684:
685:
686: def ECHO_graphicEntry(self):
687: """DO nothing"""
688: overview = self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])
689:
690:
691: if overview:
692: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
693: return pt()
694: else:
695: return "NO OVERVIEW GRAPHICS"
696:
697: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
698: """Enter coords"""
699: coords=self.coords
700: temco=coordstr.split(",")
701: temco.append(angle)
702: coords.append(temco)
703: self.coords=coords[0:]
704:
705: if RESPONSE is not None:
706: RESPONSE.redirect('ECHO_graphicEntry')
707:
708:
709: security.declarePublic('ECHO_collection_config')
710: def ECHO_collection_config(self):
711: """Main configuration"""
712:
713: if not hasattr(self,'weight'):
714: self.weight=""
715:
716: if not hasattr(self,'sortfield'):
717: self.sortfield="weight"
718:
719: if not hasattr(self,'coords'):
720: self.coords=[]
721:
722: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_collection.zpt').__of__(self)
723: return pt()
724:
725:
726: security.declarePublic('changeECHO_collection')
727:
728:
729: def getBgcolour(self):
730: """colour"""
731: if hasattr(self,'bgcolour') and not (self.bgcolour==""):
732: return self.bgcolour
733: else:
734: return "#dddddd"
735:
736: def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour=""):
737: """Änderung der Properties"""
738:
739: self.secondaryLink=secondaryLink
740: self.secondaryLinkTitle=secondaryLinkTitle
741: self.imageTag=imageTag
742: self.bgcolour=bgcolour
743:
744: if coords:
745: coordsnew=[ string.split(x,",") for x in coords]
746: self.coords=coordsnew[0:]
747: else:
748: coordsnew=None
749: self.coords=None
750:
751: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordsnew)
752:
753:
754:
755: self.sortfield=sortfield
756:
757: if RESPONSE is not None:
758: RESPONSE.redirect('manage_main')
759:
760: security.declarePublic('index_html')
761:
762:
763: def showOverview(self):
764: """overview"""
765: if 'ECHO_overview.html' in self.__dict__.keys():
766: return getattr(self,'ECHO_overview.html')()
767: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_content_overview.zpt').__of__(self)
768: return pt()
769:
770:
771: def index_html(self):
772: """standard page"""
773:
774: if 'index.html' in self.__dict__.keys():
775: return getattr(self,'index.html')()
776:
777: elif 'overview' in self.__dict__.keys():
778: return self.showOverview()
779: elif hasattr(self,'collection_index_template'):
780: return self.collection_index_template()
781:
782: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_content_standard.zpt').__of__(self)
783: pt.content_type="text/html"
784: return pt()
785:
786: def content_html(self):
787: """template fuer content"""
788: return content_html(self,'collection')
789:
790: def getCredits(self):
791: """Ausgabe der credits"""
792: if self.credits:
793: return self.credits
794: else:
795: return []
796:
797:
798:
799: def getGraphicCoords(self):
800: """Give list of coordinates"""
801: subColTypes=['ECHO_collection','ECHO_externalLink','ECHO_resource']
802: ids=[]
803: for entry in self.__dict__.keys():
804: object=getattr(self,entry)
805: try:
806: if object.meta_type in subColTypes:
807: for coordtemp in object.coords:
808: if len(coordtemp)>3:
809: coord=coordtemp[0:4]
810: if hasattr(object,'label') and not object.label=="":
811: ids.append([string.join(coord,", "),object.getId(),object.label,object])
812: elif hasattr(object,'title'):
813: if not object.title=="":
814: ids.append([string.join(coord,", "),object.getId(),object.title,object])
815: else:
816: ids.append([string.join(coord,", "),object.getId(),object.getId(),object])
817: else:
818: ids.append([string.join(coord,", "),object.getId(),object.getId(),object])
819:
820: except:
821: """nothing"""
822:
823: return ids
824:
825: def getSubCols(self,sortfield="weight"):
826:
827: subColTypes=['ECHO_collection','ECHO_externalLink','ECHO_resource']
828: ids=[]
829: for entry in self.__dict__.keys():
830: object=getattr(self,entry)
831: try:
832: if object.meta_type in subColTypes:
833: ids.append(object)
834:
835: except:
836: """nothing"""
837: try:
838: sortfield=self.sortfield
839: except:
840: """nothing"""
841:
842: tmplist=[]
843: for x in ids:
844: if hasattr(x,sortfield):
845: try:
846: x=int(x)
847: except:
848: """nothing"""
849: tmp=getattr(x,sortfield)
850: else:
851: tmp=10000000
852: tmplist.append((tmp,x))
853: tmplist.sort()
854: return [x for (key,x) in tmplist]
855:
856:
857:
858:
859:
860:
861: def manage_addECHO_collectionForm(self):
862: """Add collection form"""
863: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_collectionForm.zpt').__of__(self)
864: return pt()
865:
866:
867: def manage_addECHO_collection(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour=""):
868: """add a echo collection"""
869:
870:
871: newObj=ECHO_collection(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
872:
873: self._setObject(id,newObj)
874:
875: if RESPONSE is not None:
876: RESPONSE.redirect('manage_main')
877:
878: class ECHO_root(Folder,Persistent,Implicit):
879: """ECHO Root Folder"""
880: meta_type="ECHO_root"
881:
882: def getBgcolour(self):
883: """hack"""
884: return "#dddddd"
885:
886: def contentTypeSelector_HTML(self,selected=None):
887: """give type selector"""
888: if not selected:
889: retStr="<option selected>\n"
890: else:
891: retStr="<option>\n"
892:
893: try:
894: for contentType in self.ZopeFind(self.contentTypes,obj_metatypes="ECHO_contentType"):
895: if selected and (contentType[0]==selected):
896: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
897: else:
898: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
899: except:
900: """nothing"""
901: return retStr
902:
903: def patchContentType(self,obj=None):
904: """austauschen content_type with contentType (patch bei umstieg von alter Version)"""
905:
906:
907: if not obj:
908: obj = self
909:
910: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate'])
911:
912: for entry in entries:
913: setattr(entry[1],'contentType',entry[1].content_type)
914: #entry[1].contentType == entry[1].content_type
915:
916: if entry[1].meta_type == 'ECHO_collection':
917: entry[1].patchContentType(entry[1])
918:
919:
920: return "Rerenderd all links to resources in: "+self.title
921:
922: def ECHO_newViewerLink(self,obj=None):
923: """change links (:86 faellt weg)"""
924:
925: if not obj:
926: obj = self
927:
928: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
929:
930: for entry in entries:
931:
932: if entry[1].meta_type == 'ECHO_resource':
933:
934: entry[1].link=re.sub('\:86','',entry[1].link)
935:
936: else:
937:
938: entry[1].ECHO_newViewerLink(entry[1])
939:
940: return "Rerenderd all links to resources in: "+self.title
941:
942: def __init__(self,id,title):
943: """init"""
944: self.id = id
945: self.title=title
946:
947: def deleteSpace(self,str):
948: """delete space at the end of a line"""
949: if str[len(str)-1]==" ":
950: return str[0:len(str)-1]
951: else:
952: return str
953:
954:
955:
956: # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt
957:
958: def formatAscii(self,str,url=None):
959: """ersetze ascii umbrueche durch <br>"""
960: #url=None
961: if url:
962:
963: retStr=""
964: words=str.split("\n")
965:
966: for word in words:
967: strUrl=url%word
968: print "str",strUrl
969: retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
970: str=retStr
971: if str:
972: return re.sub(r"[\n]","<br/>",str)
973: else:
974: return ""
975:
976: def link2html(self,str):
977: """link2html fuer VLP muss hier noch raus"""
978: if str:
979: print str
980: str=re.sub("\&","&",str)
981: dom=xml.dom.minidom.parseString("<?xml version='1.0' ?><txt>"+str+"</txt>")
982: links=dom.getElementsByTagName("link")
983:
984: print "link",links
985: for link in links:
986: link.tagName="a"
987: ref=link.getAttribute("ref")
988: if self.checkRef(ref):
989: link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref)
990:
991: return dom.toxml('utf-8')
992: return ""
993:
994:
995: def checkRef(self,ref):
996: dbs={'vl_literature':'AND CD LIKE \'%lise%\'','vl_technology':'','vl_people':''}
997: res=None
998: for db in dbs.keys():
999: #print ref,"select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])
1000:
1001: res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))
1002: return res
1003:
1004: #Ende Methode fuer vlp
1005:
1006: def PgQuoteString(self,string):
1007: """Quote string"""
1008: #print "PG",string
1009: return libpq.PgQuoteString(string)
1010:
1011: def getPartners(self):
1012: """Get list of Partners. Presently only from a subfolder partners"""
1013:
1014: return [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])]
1015:
1016:
1017:
1018:
1019:
1020: def getPartnersXML(self):
1021: """partner liste als xml"""
1022: partners=self.getPartners()
1023: ret="<partners>"
1024: for partner in partners:
1025: ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),partner.title)
1026:
1027: return ret+"\n</partners>"
1028:
1029: def getCollectionTree(self):
1030: """get the collection tree (list of triples (parent,child, depth)"""
1031:
1032: def getCollection(object,depth=0):
1033: depth+=1
1034: collections=[]
1035: for entry in object.__dict__.keys():
1036: element=getattr(object,entry)
1037: try:
1038: if element.meta_type=="ECHO_collection":
1039: collections.append((object,element,depth))
1040: collections+=getCollection(element,depth)
1041: except:
1042: """nothing"""
1043: return collections
1044:
1045:
1046: return getCollection(self)
1047:
1048: def getCollectionTreeIds(self):
1049: """Show the IDs of the Tree"""
1050: ret=[]
1051: for collection in self.getCollectionTree():
1052: ret.append((collection[0].getId(),collection[1].getId(),collection[2]))
1053: return ret
1054:
1055:
1056:
1057: def manage_addECHO_root(self,id,title,RESPONSE=None):
1058: """Add an ECHO_root"""
1059: self._setObject(id,ECHO_root(id,title))
1060:
1061: if RESPONSE is not None:
1062: RESPONSE.redirect('manage_main')
1063:
1064: def manage_addECHO_rootForm(self):
1065: """Nothing yet"""
1066: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_root.zpt').__of__(self)
1067: return pt()
1068:
1069: class ECHO_partner(Image,Persistent):
1070: """ECHO Partner"""
1071:
1072: meta_type="ECHO_partner"
1073:
1074: def __init__(self, id, title,url, file, content_type='', precondition=''):
1075: self.__name__=id
1076: self.title=title
1077: self.url=url
1078: self.precondition=precondition
1079:
1080: data, size = self._read_data(file)
1081: content_type=self._get_content_type(file, data, id, content_type)
1082: self.update_data(data, content_type, size)
1083:
1084: manage_options = Image.manage_options+(
1085: {'label':'Partner Information','action':'ECHO_partner_config'},
1086: )
1087:
1088: def changeECHO_partner(self,url,RESPONSE=None):
1089: """Change main information"""
1090: self.url=url
1091: if RESPONSE is not None:
1092: RESPONSE.redirect('manage_main')
1093:
1094:
1095:
1096: def ECHO_partner_config(self):
1097: """Main configuration"""
1098: if not hasattr(self,'url'):
1099: self.url=""
1100: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_partner.zpt').__of__(self)
1101: return pt()
1102:
1103:
1104: manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(),
1105: Kind='ECHO_partner',kind='ECHO_partner')
1106:
1107:
1108:
1109: def manage_addECHO_partner(self, id, file,url, title='', precondition='', content_type='',
1110: REQUEST=None):
1111: """
1112: Add a new ECHO_partner object.
1113:
1114: Creates a new ECHO_partner object 'id' with the contents of 'file'.
1115: Based on Image.manage_addImage
1116: """
1117:
1118: id=str(id)
1119: title=str(title)
1120: content_type=str(content_type)
1121: precondition=str(precondition)
1122:
1123: id, title = OFS.Image.cookId(id, title, file)
1124:
1125: self=self.this()
1126:
1127: # First, we create the image without data:
1128: self._setObject(id, ECHO_partner(id,title,url,'',content_type, precondition))
1129:
1130: # Now we "upload" the data. By doing this in two steps, we
1131: # can use a database trick to make the upload more efficient.
1132: if file:
1133: self._getOb(id).manage_upload(file)
1134: if content_type:
1135: self._getOb(id).content_type=content_type
1136:
1137: if REQUEST is not None:
1138: try: url=self.DestinationURL()
1139: except: url=REQUEST['URL1']
1140: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
1141: return id
1142:
1143:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>