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 OFS.Image
14: from types import *
15: from OFS.Image import Image
16: from Globals import DTMLFile
17: from OFS.Folder import Folder
18: from OFS.SimpleItem import SimpleItem
19: from AccessControl import ClassSecurityInfo
20: from Globals import InitializeClass
21: from Globals import DTMLFile
22: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
23: from Products.PageTemplates.PageTemplate import PageTemplate
24: from Globals import Persistent
25: from Acquisition import Implicit
26: from pyPgSQL import libpq
27:
28: import urllib
29: import xml.dom.minidom
30:
31:
32: #List of different types for the graphical linking viewer
33: viewClassificationListMaster=['view point','area']
34:
35:
36: def toList(field):
37: """Einzelfeld in Liste umwandeln"""
38: if type(field)==StringType:
39: return [field]
40: else:
41: return field
42:
43: def getText(nodelist):
44:
45: rc = ""
46: for node in nodelist:
47: if node.nodeType == node.TEXT_NODE:
48: rc = rc + node.data
49: return rc
50:
51:
52: def readMetadata(url):
53: """Methoden zum Auslesen der Metadateninformation zu einer Resource
54: Vorerst noch Typ bib"""
55:
56: metadict={}
57: try:
58: geturl=""
59: for line in urllib.urlopen(url).readlines():
60: geturl=geturl+line
61:
62:
63: except:
64: return (None,"Cannot open: "+url)
65:
66: try:
67: dom=xml.dom.minidom.parseString(geturl)
68: except:
69: return (None,"Cannot parse: "+url+"<br>"+geturl)
70:
71: metanode=dom.getElementsByTagName('bib')
72: metadict['bib_type']='Book'
73: if len(metanode)==0:
74: metanode=dom.getElementsByTagName('archimedes')
75: metadict['bib_type']='Archimedes'
76: #print "HELLO"
77:
78: if not len(metanode)==0:
79: metacontent=metanode[0].childNodes
80:
81: try:
82: metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
83: except:
84: """nothing"""
85:
86: for node in metacontent:
87: try:
88: metadict[node.tagName.lower()]=getText(node.childNodes)
89: except:
90: """nothing"""
91:
92: #print metadict
93: return metadict,""
94:
95:
96: def setECHO_collectionInformation(self,title,label,description,content_type,responsible,credits,weight,coordstrs,viewClassification=""):
97:
98: """Allegemeine Informationen zu einer ECHO Collection"""
99:
100: self.viewClassification=viewClassification
101:
102: self.label = label
103: self.title=title
104: self.description=description
105: self.content_type=content_type
106: self.responsible=responsible
107: self.credits=toList(credits)
108: self.weight=weight
109:
110: coords=[]
111: #coordinates of for rectangles
112:
113: #print "cs", coordstrs
114: if coordstrs:
115: for coordstr in coordstrs:
116: #print "cs", coordstr
117: try:
118: temco=coordstr.split(",")
119: except:
120: temco=[]
121: #temco.append(angle)
122: coords.append(temco)
123:
124:
125: self.coords=coords[0:]
126:
127:
128: class scientificClassification(SimpleItem,Persistent,Implicit):
129: """outdated will be deleeted in the next versions: subclass"""
130: security=ClassSecurityInfo()
131:
132: def __init__(self,context,science,practice):
133: self.context=context
134: self.science=science
135: self.practice=practice
136: self.id="scientific_Classification"
137:
138: security.declarePublic('get_context')
139: def get_context(self):
140: return self.context
141:
142: security.declarePublic('get_science')
143: def get_science(self):
144: return self.science
145:
146: security.declarePublic('get_practice')
147: def get_practice(self):
148: return self.practice
149:
150:
151: class scientificInformation(Folder,Persistent,Implicit):
152: """outdated will be deleted in the next versions: subclass scientificInformation"""
153: security=ClassSecurityInfo()
154:
155:
156:
157: def __init__(self,source_type,period):
158:
159: self.id="scientific_Information"
160: self.source_type=source_type
161: self.period=period
162:
163:
164:
165: security.declarePublic('get_source_type')
166: def get_source_type(self):
167: return self.source_type
168:
169: security.declarePublic('get_period')
170: def get_period(self):
171: return self.period
172:
173:
174: class ECHO_resource(Folder):
175: """ECHO Ressource"""
176: meta_type='ECHO_resource'
177:
178: viewClassificationList=viewClassificationListMaster
179:
180: def getViewClassification(self):
181: if hasattr(self,'viewClassification'):
182: return self.viewClassification
183: else:
184: return ""
185:
186: def getCredits(self):
187: """Ausgabe der credits"""
188: if self.credits:
189: return self.credits
190: else:
191: return []
192:
193: def __init__(self,id,link,metalink,title,label,description,content_type,responsible,credits,weight,coords):
194:
195: self.id = id
196: """Festlegen der ID"""
197:
198: self.label = label
199: self.link= link
200: self.metalink=metalink
201: self.title=title
202: self.weight=weight
203: self.credits=toList(credits)
204: self.description=description
205: self.content_type=content_type
206: self.responsible=responsible
207:
208: if coords:
209: coordsnew=[ string.split(x,",") for x in coords]
210: else:
211: coordsnew=[]
212:
213: self.coords=coordsnew
214:
215:
216: def getCoords(self):
217: try:
218: return [string.join(x,",") for x in self.coords]
219: except:
220: return []
221:
222:
223: def ECHO_resource_config(self):
224: """Main configuration"""
225:
226: if not hasattr(self,'weight'):
227: self.weight=""
228: if not hasattr(self,'coords'):
229: self.coords=[]
230:
231: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource.zpt').__of__(self)
232: return pt()
233:
234:
235: def changeECHO_resource(self,metalink,link,title,label,description,content_type,responsible,weight,viewClassification="",coords=None,credits=None,RESPONSE=None):
236:
237:
238: """Änderung der Properties"""
239:
240:
241: setECHO_collectionInformation(self,title,label,description,content_type,responsible,credits,weight,coords,viewClassification)
242:
243:
244: self.link=link
245: self.metalink=metalink
246:
247: if RESPONSE is not None:
248: RESPONSE.redirect('manage_main')
249:
250:
251: manage_options = Folder.manage_options+(
252: {'label':'Main Config','action':'ECHO_resource_config'},
253: {'label':'Metadata','action':'ECHO_getResourceMD'},
254: {'label':'Graphics','action':'ECHO_graphicEntry'},
255: )
256:
257: def ECHO_graphicEntry(self):
258: """DO nothing"""
259: if 'overview' in self.aq_parent.__dict__.keys():
260: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
261: return pt()
262: else:
263: return "NO OVERVIEW GRAPHICS"
264:
265: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
266: """Enter coords"""
267: coords=self.coords
268: temco=coordstr.split(",")
269: temco.append(angle)
270: coords.append(temco)
271:
272: self.coords=coords[0:]
273:
274: if RESPONSE is not None:
275: RESPONSE.redirect('ECHO_graphicEntry')
276:
277: def ECHO_getResourceMD(self,template="yes"):
278: """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""
279: (metadict, error)=readMetadata(self.metalink)
280:
281:
282:
283: if not error=="": #Fehler beim Auslesen des Metafiles
284: return "ERROR:",error
285: for key in metadict.keys():#Hinzufügen der Felder
286:
287: setattr(self,key,metadict[key].encode('ascii','replace'))
288:
289:
290: self.metadata=metadict.keys()
291:
292: self.label=self.generate_label()
293:
294: if template=="yes":
295: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_resourceMD.zpt').__of__(self)
296: return pt()
297:
298: def ECHO_getMD(self,item):
299: """Ausgabe der MD"""
300: return getattr(self,item)
301:
302: def index_html(self):
303: """standard page"""
304:
305: return self.REQUEST.RESPONSE.redirect(self.link)
306:
307: def generate_label(self):
308: """Erzeugt_standard_Label aus Template"""
309: pt=getattr(self,"label_template_"+self.bib_type)
310:
311: return pt()
312:
313: def manage_addECHO_resourceForm(self):
314: """Form for adding a ressource"""
315: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_resourceForm.zpt').__of__(self)
316: return pt()
317:
318:
319:
320: def manage_addECHO_resource(self,id,title,label,description,content_type,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None):
321: """addaresource"""
322:
323: newObj=ECHO_resource(id,link,metalink,title,label,description,content_type,responsible,credits,weight,coords)
324:
325: self._setObject(id,newObj)
326:
327: if RESPONSE is not None:
328: RESPONSE.redirect('manage_main')
329:
330:
331: class ECHO_externalLink(Folder):
332: """Link zu einer externen Ressource"""
333: security=ClassSecurityInfo()
334: meta_type='ECHO_externalLink'
335:
336:
337: def __init__(self,id,link,title,label,description,content_type,responsible,credits,weight,coords):
338:
339: self.id = id
340: """Festlegen der ID"""
341:
342: self.credits=toList(credits)
343: self.label = label
344: self.link= link
345: self.title=title
346: self.weight=weight
347: self.description=description
348: self.content_type=content_type
349: self.responsible=responsible
350: coordsnew=[ string.split(x,",") for x in coords]
351: self.coords=coordsnew
352:
353: def ECHO_externalLink_config(self):
354: """Main configuration"""
355:
356: if not hasattr(self,'weight'):
357: self.weight=""
358: if not hasattr(self,'coords'):
359:
360: self.coords=['']
361: #print "G",self.coords
362:
363: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_externalLink.zpt').__of__(self)
364: return pt()
365:
366:
367: def changeECHO_externalLink(self,link,title,label,description,content_type,responsible,weight,coords=None,credits=None,RESPONSE=None):
368:
369: """Änderung der Properties"""
370:
371:
372: setECHO_collectionInformation(self,title,label,description,content_type,responsible,credits,weight,coords)
373:
374:
375: self.link=link
376: if RESPONSE is not None:
377: RESPONSE.redirect('manage_main')
378:
379:
380: manage_options = Folder.manage_options+(
381: {'label':'Main Config','action':'ECHO_externalLink_config'},
382: )
383:
384: def index_html(self):
385: """standard page"""
386:
387: return self.REQUEST.RESPONSE.redirect(self.link)
388:
389: def manage_addECHO_externalLinkForm(self):
390: """Form for external Links"""
391: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_externalLinkForm.zpt').__of__(self)
392: return pt()
393:
394:
395: def manage_addECHO_externalLink(self,id,title,label,description,content_type,responsible,link,weight,coords=None,credits=None,RESPONSE=None):
396: """Add an external Link"""
397:
398: newObj=ECHO_externalLink(id,link,title,label,description,content_type,responsible,credits,weight,coords)
399:
400: self._setObject(id,newObj)
401:
402: if RESPONSE is not None:
403: RESPONSE.redirect('manage_main')
404:
405:
406: class ECHO_collection(Folder, Persistent, Implicit):
407: """ECHO Collection"""
408: security=ClassSecurityInfo()
409: meta_type='ECHO_collection'
410:
411:
412:
413: security.declarePublic('getCreditObject')
414: def getCreditObject(self,name):
415: """credit id to credititem"""
416: return getattr(self.partners,name)
417:
418: security.declarePublic('ECHO_generateNavBar')
419: def ECHO_generateNavBar(self):
420: """Erzeuge Navigationsbar"""
421: link=""
422: object="self"
423: ret=[]
424: path=self.getPhysicalPath()
425: for element in path:
426:
427:
428: if not element=="":
429: object+="."+element
430:
431: label=eval(object).label
432: link+="/"+element
433: if not label=="":
434: ret.append((label,link))
435: return ret
436:
437: security.declarePublic('ECHO_rerenderLinksMD')
438: def ECHO_rerenderLinksMD(self):
439: """Rerender all Links"""
440:
441: for entry in self.__dict__.keys():
442: object=getattr(self,entry)
443:
444:
445: try:
446:
447: if object.meta_type == 'ECHO_resource':
448:
449: object.ECHO_getResourceMD(template="no")
450:
451: except:
452: """nothing"""
453:
454: return "Rerenderd all links to resources in: "+self.title
455:
456:
457: def getCoords(self):
458: try:
459:
460: x= [string.join(x,",") for x in self.coords]
461: return x
462:
463: except:
464:
465: return []
466:
467: def __init__(self,id,title,label,description,content_type,responsible,credits,weight,sortfield,coords):
468: #print "CO",coords
469:
470: self.id = id
471: """Festlegen der ID"""
472: self.credits=toList(credits)
473: self.label = label
474: self.title=title
475: self.description=description
476: self.content_type=content_type
477: self.responsible=responsible
478:
479: self.weight=weight
480: self.sortfield=sortfield
481: coordsnew=[ string.split(x,",") for x in coords]
482: self.coords=coordsnew
483:
484:
485: manage_options = Folder.manage_options+(
486: {'label':'Main Config','action':'ECHO_collection_config'},
487: {'label':'Rerender Links','action':'ECHO_rerenderLinksMD'},
488: {'label':'Graphics','action':'ECHO_graphicEntry'},
489:
490: )
491:
492: def ECHO_graphicEntry(self):
493: """DO nothing"""
494: if 'overview' in self.aq_parent.__dict__.keys():
495: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_draw.zpt').__of__(self)
496: return pt()
497: else:
498: return "NO OVERVIEW GRAPHICS"
499:
500: def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None):
501: """Enter coords"""
502: coords=self.coords
503: temco=coordstr.split(",")
504: temco.append(angle)
505: coords.append(temco)
506: self.coords=coords[0:]
507:
508: if RESPONSE is not None:
509: RESPONSE.redirect('ECHO_graphicEntry')
510:
511:
512: security.declarePublic('ECHO_collection_config')
513: def ECHO_collection_config(self):
514: """Main configuration"""
515:
516: if not hasattr(self,'weight'):
517: self.weight=""
518:
519: if not hasattr(self,'sortfield'):
520: self.sortfield="weight"
521:
522: if not hasattr(self,'coords'):
523: self.coords=[]
524:
525: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_collection.zpt').__of__(self)
526: return pt()
527:
528:
529: security.declarePublic('changeECHO_collection')
530:
531:
532: def changeECHO_collection(self,title,label,description,content_type,responsible,weight,credits=None,sortfield="weight",coords=None,RESPONSE=None):
533: """Änderung der Properties"""
534:
535: coordsnew=[ string.split(x,",") for x in coords]
536:
537: setECHO_collectionInformation(self,title,label,description,content_type,responsible,credits,weight,coordsnew)
538:
539: self.sortfield=sortfield
540:
541: if RESPONSE is not None:
542: RESPONSE.redirect('manage_main')
543:
544: security.declarePublic('index_html')
545:
546: showOverview=DTMLFile('ECHO_content_overview',globals())
547:
548:
549: def index_html(self):
550: """standard page"""
551:
552: if 'index.html' in self.__dict__.keys():
553: return getattr(self,'index.html')()
554: elif 'overview' in self.__dict__.keys():
555: return self.showOverview()
556:
557:
558: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_content_standard.zpt').__of__(self)
559: pt.content_type="text/html"
560: return pt()
561:
562: def getCredits(self):
563: """Ausgabe der credits"""
564: if self.credits:
565: return self.credits
566: else:
567: return []
568:
569: def getGraphicCoords(self):
570: """Give list of coordinates"""
571: subColTypes=['ECHO_collection','ECHO_externalLink','ECHO_resource']
572: ids=[]
573: for entry in self.__dict__.keys():
574: object=getattr(self,entry)
575: try:
576: if object.meta_type in subColTypes:
577: for coordtemp in object.coords:
578: if len(coordtemp)>3:
579: coord=coordtemp[0:4]
580: if hasattr(object,'title'):
581: if not object.title=="":
582: ids.append([string.join(coord,", "),object.getId(),object.title])
583: else:
584: ids.append([string.join(coord,", "),object.getId(),object.getId()])
585: else:
586: ids.append([string.join(coord,", "),object.getId(),object.getId()])
587:
588: except:
589: """nothing"""
590:
591: return ids
592:
593: def getSubCols(self,sortfield="weight"):
594:
595: subColTypes=['ECHO_collection','ECHO_externalLink','ECHO_resource']
596: ids=[]
597: for entry in self.__dict__.keys():
598: object=getattr(self,entry)
599: try:
600: if object.meta_type in subColTypes:
601: ids.append(object)
602:
603: except:
604: """nothing"""
605: try:
606: sortfield=self.sortfield
607: except:
608: """nothing"""
609:
610: tmplist=[]
611: for x in ids:
612: if hasattr(x,sortfield):
613: try:
614: x=int(x)
615: except:
616: """nothing"""
617: tmp=getattr(x,sortfield)
618: else:
619: tmp=10000000
620: tmplist.append((tmp,x))
621: tmplist.sort()
622: return [x for (key,x) in tmplist]
623:
624:
625:
626:
627:
628:
629: def manage_addECHO_collectionForm(self):
630: """Add collection form"""
631: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_collectionForm.zpt').__of__(self)
632: return pt()
633:
634:
635: def manage_addECHO_collection(self,id,title,label,description,content_type,responsible,weight,sortfield,coords="",credits=None,RESPONSE=None):
636: """add a echo collection"""
637:
638:
639: newObj=ECHO_collection(id,title,label,description,content_type,responsible,credits,weight,sortfield,coords)
640:
641: self._setObject(id,newObj)
642:
643: if RESPONSE is not None:
644: RESPONSE.redirect('manage_main')
645:
646: class ECHO_root(Folder,Persistent,Implicit):
647: """ECHO Root Folder"""
648: meta_type="ECHO_root"
649:
650: def __init__(self,id,title):
651: """init"""
652: self.id = id
653: self.title=title
654:
655: def PgQuoteString(self,string):
656: """Quote string"""
657: print "PG",string
658: return libpq.PgQuoteString(string)
659:
660: def getPartners(self):
661: """Get list of Partners. Presently only from a subfolder partners"""
662: partnerTypes=['ECHO_partner']
663: ids=[]
664: try:
665: for entry in self.partners.__dict__.keys():
666: object=getattr(self.partners,entry)
667:
668: try:
669:
670: if object.meta_type in partnerTypes:
671: ids.append(object)
672:
673: except:
674: """nothing"""
675: except:
676: ids=[] # no partners
677: return ids
678:
679: def getCollectionTree(self):
680: """get the collection tree (list of triples (parent,child, depth)"""
681:
682: def getCollection(object,depth=0):
683: depth+=1
684: collections=[]
685: for entry in object.__dict__.keys():
686: element=getattr(object,entry)
687: try:
688: if element.meta_type=="ECHO_collection":
689: collections.append((object,element,depth))
690: collections+=getCollection(element,depth)
691: except:
692: """nothing"""
693: return collections
694:
695:
696: return getCollection(self)
697:
698: def getCollectionTreeIds(self):
699: """Show the IDs of the Tree"""
700: ret=[]
701: for collection in self.getCollectionTree():
702: ret.append((collection[0].getId(),collection[1].getId(),collection[2]))
703: return ret
704:
705:
706:
707: def manage_addECHO_root(self,id,title,RESPONSE=None):
708: """Add an ECHO_root"""
709: self._setObject(id,ECHO_root(id,title))
710:
711: if RESPONSE is not None:
712: RESPONSE.redirect('manage_main')
713:
714: def manage_addECHO_rootForm(self):
715: """Nothing yet"""
716: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_root.zpt').__of__(self)
717: return pt()
718:
719: class ECHO_partner(Image,Persistent):
720: """ECHO Partner"""
721:
722: meta_type="ECHO_partner"
723:
724: def __init__(self, id, title,url, file, content_type='', precondition=''):
725: self.__name__=id
726: self.title=title
727: self.url=url
728: self.precondition=precondition
729:
730: data, size = self._read_data(file)
731: content_type=self._get_content_type(file, data, id, content_type)
732: self.update_data(data, content_type, size)
733:
734: manage_options = Image.manage_options+(
735: {'label':'Partner Information','action':'ECHO_partner_config'},
736: )
737:
738: def changeECHO_partner(self,url,RESPONSE=None):
739: """Change main information"""
740: self.url=url
741: if RESPONSE is not None:
742: RESPONSE.redirect('manage_main')
743:
744:
745:
746: def ECHO_partner_config(self):
747: """Main configuration"""
748: if not hasattr(self,'url'):
749: self.url=""
750: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_partner.zpt').__of__(self)
751: return pt()
752:
753:
754: manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(),
755: Kind='ECHO_partner',kind='ECHO_partner')
756:
757:
758:
759: def manage_addECHO_partner(self, id, file,url, title='', precondition='', content_type='',
760: REQUEST=None):
761: """
762: Add a new ECHO_partner object.
763:
764: Creates a new ECHO_partner object 'id' with the contents of 'file'.
765: Based on Image.manage_addImage
766: """
767:
768: id=str(id)
769: title=str(title)
770: content_type=str(content_type)
771: precondition=str(precondition)
772:
773: id, title = OFS.Image.cookId(id, title, file)
774:
775: self=self.this()
776:
777: # First, we create the image without data:
778: self._setObject(id, ECHO_partner(id,title,url,'',content_type, precondition))
779:
780: # Now we "upload" the data. By doing this in two steps, we
781: # can use a database trick to make the upload more efficient.
782: if file:
783: self._getOb(id).manage_upload(file)
784: if content_type:
785: self._getOb(id).content_type=content_type
786:
787: if REQUEST is not None:
788: try: url=self.DestinationURL()
789: except: url=REQUEST['URL1']
790: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
791: return id
792:
793:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>