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