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