Annotation of ECHO_content/ECHO_root.py, revision 1.1.2.4
1.1.2.1 dwinter 1: """ECHO_root for the central functions for ECHO used by all objects
2:
3: """
4:
5:
6: import urlparse
7: import string
8: import tempfile
9: import zipfile
10: import re
11: import os,shutil
12: import OFS.Image
13: from types import *
14: from OFS.Cache import Cacheable
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 AccessControl.User import UserFolder
21: from Globals import InitializeClass
22: from Globals import DTMLFile
23: import Globals
24: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
25: from Products.PageTemplates.PageTemplate import PageTemplate
26: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate,manage_addPageTemplate
27: from Globals import Persistent, package_home
28: from Acquisition import Implicit
29: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
30: from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon
31: import ECHO_helpers
32: from Acquisition import aq_parent
33: try:
34: from Products.MetaDataProvider.MetaDataClient import MetaDataClient
35: except:
36: print "no metadataclient"
37: import urllib
38: import urllib2
39: import cgi
40: import smtplib
41: import time
42: #from Ft.Xml.Domlette import NonvalidatingReader
43: #from Ft.Xml.Domlette import PrettyPrint, Print
44: #from Ft.Xml import EMPTY_NAMESPACE
45: #
46: #import Ft.Xml.XPath
47: import cStringIO
48:
49: import sys
50: import logging
51:
52: try:
53: from psycopg import libpq
54: except:
55: try:
56: from pyPgSQL import libpq
57: except:
58: print "ECHO_collection: Warning - No libpq imported!"
59:
60: import xml.dom.minidom
61:
62: import urllib
63: import xml.dom.minidom
64: import ECHO_helpers
65: from ECHO_helpers import *
66:
67:
68:
69: #import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen
70: import xmlrpclib
71:
72: import logging
73:
74: #ersetzt logging.info
75: def logger(txt,method,txt2):
76: """logging"""
77: logging.info(txt+ txt2)
78:
79:
80:
81:
82: class ECHO_root(Folder,Persistent,Implicit):
83: """ECHO Root Folder"""
84:
85: security=ClassSecurityInfo()
86:
87: meta_type="ECHO_root"
88: management_page_charset="utf-8"
89:
90: getSubCols = ECHO_helpers.getSubCols
91:
92: manage_options=Folder.manage_options+(
93: {'label':'Main Config','action':'mainConfig_html'},
94: {'label':'Change Weights','action':'changeWeights'},
95: {'label':'Generate from RDF','action':'generateFromRDFForm'},
96: {'label':'update Resource Catalog','action':'updateResourceCatalog'},
97: )
98:
99:
100: def mainConfig_html(self):
101: """change form"""
102: pt=zptFile(self, 'zpt/ChangeECHO_root.zpt')
103: pt.content_type="text/html"
104: return pt()
105:
106:
107: def getMetaDataManagerName(self):
108: """name of the metadatamanager"""
109: return getattr(self,"metaDataManagerName","metadata");
110:
111:
112: def changeECHO_root(self,metaDataManagerName,REQUEST=None):
113: """change the main properties"""
114: self.metaDataManagerName=metaDataManagerName
115:
116: if self.getMetaDataManager() is None:
117: return """"<html><body>ERROR: Folder: %s does not exist.
118: </body></html>
119: """%metaDataManagerName
120:
121: if REQUEST is not None:
122: REQUEST.RESPONSE.redirect('manage_main')
123: else:
124: return ""
125:
126:
127: def getMetaDataManager(self):
128: """hole eine Instanz von MetaDataFolder
129: """
130:
131: mf= getattr(self,self.getMetaDataManagerName(),None)
132:
133: return mf
134:
135:
136: def getECHORootURL(self):
137: return self.absolute_url()
138:
139: def getECHORoot(self):
140: return self
141:
142: def getBrowserType(self):
143: """returns browserType object"""
144: return browserType(self)
145:
146: def mod_re_sub(self,pattern,replace,string):
147: """re.sub aus mod re zur Verfuegung stellen"""
148: return re.sub(pattern,replace,string)
149:
150: def findObjectFromFulltext(self,existUri):
151: '''
152:
153: @param url:
154: @param existUri:
155: '''
156:
157: if existUri:
158: #TODO: at the moment assume that the filename is unique, the whole has to changed to a system of ids.
159: filename=existUri.split("/")[-1]
160:
161: founds=self.resourceCatalog.search({'fullTextUrl':os.path.splitext(filename)[0]})
162:
163: ret=[(found.title,found.getObject().absolute_url(),found.getObject().aq_parent.absolute_url()) for found in founds]
164:
165: return ret
166:
167: def reindex(self,RESPONSE=None):
168: """indiziere alle Objecte neu"""
169:
170: if RESPONSE:
171: RESPONSE.write("<html><body>")
172:
173: resources=self.ZopeFind(self,obj_metatypes=["ECHO_resource"], search_sub=1)
174:
175: for resource in resources:
176: resource[1].reindex()
177: #print "<p> done %s </p>\n"
178: if RESPONSE:
179: RESPONSE.write("<p> done %s </p>\n"%resource[0])
180:
181: if RESPONSE:
182: RESPONSE.write("<p> ok </p></html></body>\n")
183:
184:
185: def setLanguage(self,lang):
186: """Set language cookie"""
187: self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")
188:
189: def switchLanguage(self):
190: """Set language cookie"""
191: if self.getLanguage()=="en":
192: lang="de"
193: else:
194: lang="en"
195:
196: self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")
197: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1'])
198:
199: def getLanguage(self):
200: """get language cookie"""
201: lang= self.REQUEST.cookies.get('lang_exhibition','de')
202: if lang == '':
203: lang="de"
204: return lang
205:
206: def getContentOverviewTemplate(self):
207: """produces overview template with macro"""
208: pt = zptObjectOrFile(self, 'content_overview_template')
209: return pt
210:
211: def mapstyle_css(self):
212: """send mapstyle.css"""
213: sendFile(self, 'html/ECHO_mapstyle.css', 'text/css')
214:
215:
216: ###Cdli adds -> have to be removed
217: def getTablet(self,item):
218: #print "getTablet"
219: try:
220: read=urllib.urlopen("http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"%item).read()
221: read=re.sub("\[search\]","search",read)
222: return read[read.find("<body>")+6:read.rfind("</body>")]
223: except:
224: return "<h1>Sorry no connection to the data server enlil.museum.upenn.edu</h1>"
225: #return "http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"
226: ###END CDLI add
227:
228:
229: def URLquote(self, text):
230: """urllib.quote fuer Michael"""
231: return urllib.quote(text)
232:
233:
234: def checkResource(self,id):
235: """checks if a resource is in the tree, gives back none or list of resources"""
236: if not id:
237: id=""
238: splitted=id.split("/")
239: id=splitted[len(splitted)-1]
240: if hasattr(self,"_v_checkResource") and self._v_checkResource.has_key(id): #existiert ein cache und id ist bereits drin?
241: return self._v_checkResource[id]
242:
243: else:
244: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],obj_ids=[id],search_sub=1)
245:
246: if not hasattr(self,"_v_checkResource"): self._v_checkResource={}#lege cache an falls nicht existent
247: if resources:
248: self._v_checkResource[id]=resources[0:] # slicing to be sure that data is stabil
249: else:
250: self._v_checkResource[id]=None
251:
252: return self._v_checkResource[id]
253:
254: def sendForm(self,fromaddr,content,server='mail.mpiwg-berlin.mpg.de'):
255: """sendform"""
256: toaddrs=["dwinter@mpiwg-berlin.mpg.de"]
257:
258: msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
259: % (fromaddr, ", ".join(toaddrs),"testsub"))
260: server = smtplib.SMTP(server)
261: #server.set_debuglevel(1)
262: msg=msg+content
263: server.sendmail(fromaddr, toaddrs, msg)
264: server.quit()
265:
266: def generateFromRDFForm(self):
267: """change form"""
268: pt=zptFile(self, 'zpt/generateFromRDFForm')
269: pt.content_type="text/html"
270: return pt()
271:
272: def generateFromRDF(self,file,startNode="/Cuneiform Corpus"):
273:
274: """generate from RDF"""
275:
276: global seqs
277: seqs={}
278: global descrs
279: descrs={}
280: global key
281: key=""
282: global value
283: value=""
284:
285: def getEdges(seqs,urn):
286: """edges"""
287: ret=[]
288: return seqs[urn]
289:
290: def createSubs(self,seqs,descrs,urn,level=0):
291: """create subs"""
292: for edge in getEdges(seqs,urn):
293: cn=createNode(self,descrs,edge)
294: if cn[0]=="CDLI_group":
295: createSubs(cn[1],seqs,descrs,cn[2],level+1)
296: return
297:
298: def start_element(name,attrs):
299:
300: global seqs
301: global descrs
302: global key
303: global value
304: seq=""
305: if name=="rdf:Seq":
306: key=attrs.get('rdf:about')
307: try: # teste ob liste
308: x=seqs[key][0]
309: except:
310:
311: seqs[key]=[]
312:
313:
314: elif name=="rdf:Description":
315: key=attrs.get('rdf:about')
316:
317:
318: elif name=="rdf:li":
319: name=attrs.get('rdf:resource')
320: seqs[key].append(name)
321:
322: elif name=="echonavigation:type":
323: value="type"
324:
325: elif name=="echonavigation:name":
326: value="name"
327: elif name=="echonavigation:linkClickable":
328: value="linkClickable"
329:
330: def end_element(name):
331: """nothing"""
332: key=""
333: value=""
334:
335: def char_data(data):
336: """nothing"""
337:
338: data=re.sub("\n","",data)
339: try:
340: if descrs[key].has_key(value):
341: descrs[key][value]+=data
342: else:
343: descrs[key][value]=data
344: except:
345:
346: descrs[key]={}
347: descrs[key][value]=data
348:
349: p = xml.parsers.expat.ParserCreate()
350:
351: p.StartElementHandler = start_element
352: p.EndElementHandler = end_element
353: p.CharacterDataHandler = char_data
354:
355:
356: p.ParseFile(file)
357: self.REQUEST.RESPONSE.write("<html><body><h1>Start</h1>")
358: createSubs(self,seqs,descrs,startNode)
359: self.REQUEST.RESPONSE.write("<h1>done</h1></body></html>")
360: #print "done"
361:
362:
363: return "done"
364:
365:
366:
367:
368: def changeWeightsInCollection(self):
369: """change all lables of a collection"""
370: ret=""
371: argv=self.REQUEST.form
372:
373: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
374: for resource in resources:
375:
376: try:
377: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
378: resource[1].weight=argv[resource[1].getId()][0:]
379: except:
380: pass
381: return ret
382:
383: def changeWeights(self):
384: """change form"""
385: pt=zptFile(self, 'zpt/changeWeightForm')
386: pt.content_type="text/html"
387: return pt()
388:
389:
390: def getRDF(self,urn=None):
391: """rdf of the collection"""
392:
393: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
394:
395: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
396:
397: li="""<rdf:li rdf:resource="%s" />\n"""
398:
399:
400: for content in contents:
401: ret+=content[1].getRDF()+"\n"
402:
403: ret+="""<rdf:Seq rdf:about="%s">\n"""%urn
404: for content in contents:
405: nurn=content[1].absolute_url()
406: ret+=li%nurn
407: return ret+"</rdf:Seq>"
408:
409:
410: def showContent(self,path):
411: """return content/html"""
412:
413: return ECHO_helpers.urlopen(path+"/content_html").read()
414:
415:
416:
417: def getBibTag(self,tag,content):
418: """get field tag for index-meta-generation"""
419: if not content or content=="":
420: return ""
421: ret="<%s>"%tag
422: #ret+=urllib.quote(content)
423: ret+=content
424:
425: ret+="</%s>"%tag
426: return ret
427:
428: def getValueFromClass(self,field,found):
429: """ret attribute if existing"""
430: try:
431:
432:
433: return getattr(found,field)#.decode('ascii','ignore')
434:
435:
436:
437: except:
438: logging.error("can't: decode: %s"%repr(field))
439: logging.error(" %s %s"%(sys.exc_info()[0],sys.exc_info()[1]))
440: return ""
441:
442: security.declarePublic('getImageTag')
443: def getImageTag(self):
444: """needed by main_template"""
445: return ""
446:
447: secondaryLink="" #needed by main_template
448: secondaryLinkTitle="" #needed by main_template
449:
450: def getBgcolour(self):
451: """hack"""
452: return "#dddddd"
453:
454: security.declareProtected('View','contentTypeSelector_HTML')
455: def contentTypeSelector_HTML(self,selected=None):
456: """give type selector"""
457: if not selected:
458: retStr="<option selected>\n"
459: else:
460: retStr="<option>\n"
461:
462: try: # erste version contentTypes exists
463: for contentType in self.ZopeFind(self.contentTypes,obj_metatypes=["ECHO_contentType"]):
464: if selected and (contentType[0]==selected):
465: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
466: else:
467: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
468: except:
469:
470: """nothing"""
471:
472: return retStr
473:
474: def renderingTypeSelector_HTML(self,selected=None):
475: """give type selector"""
476: if not selected:
477: retStr="<option selected>\n"
478: else:
479: retStr="<option>\n"
480:
481: try: # erste version renderingTypes exists
482: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
483: if selected and (renderingType[0]==selected):
484: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
485: else:
486: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
487: except:
488: """nothing"""
489: return retStr
490:
491:
492: def copyrightTypeSelector_HTML(self, object=None, selected=None,first=None):
493: """give type selector"""
494:
495: if not first:
496: if not selected:
497: retStr="<option selected>\n"
498: else:
499: retStr="<option>\n"
500: else:
501: if not selected:
502: retStr="""<option selected value="%s">%s\n"""%first
503: else:
504: retStr="""<option value="%s">%s\n"""%first
505:
506:
507: try: # erste version copyrightTypes exists
508: for copyrightType in self.ZopeFind(self.copyrightTypes,obj_metatypes=["ECHO_copyrightType"]):
509: if selected and (copyrightType[0]==selected):
510: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
511: else:
512: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
513:
514: for copyrightTypeSelf in self.ZopeFind(object,obj_metatypes=["ECHO_copyrightType"],search_sub=1):
515: if selected and (copyrightTypeSelf[0]==selected):
516: retStr+="""<option selected value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
517: else:
518: retStr+="""<option value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
519:
520: except:
521: """nothing"""
522:
523: return retStr
524:
525: def partnerSelector_HTML(self,selected=None):
526: """give type selector"""
527: if not selected:
528: retStr="<option selected>\n"
529: else:
530: retStr="<option>\n"
531:
532: try: # erste version copyrightTypes exists
533: for copyrightType in self.ZopeFind(self.partners,obj_metatypes=["ECHO_partner"]):
534: if selected and (copyrightType[0]==selected):
535: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
536: else:
537: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
538: except:
539: """nothing"""
540: return retStr
541:
542: mediaTypes=['all','text','images','sound','video'] # konfigurierbar in neuer version ueber echoroot??
543:
544: def mediaTypeSelector_HTML(self,selected=None):
545: """give type selector"""
546: if not selected:
547: retStr="<option selected>\n"
548: else:
549: retStr="<option>\n"
550:
551: try: # erste version mediatypesTypes exists
552: for mediaType in self.mediaTypes:
553: if selected and (mediaType in selected):
554: retStr+="""<option selected value="%s">%s\n"""%(mediaType,mediaType)
555: else:
556: retStr+="""<option value="%s">%s\n"""%(mediaType,mediaType)
557: except:
558: """nothing"""
559: return retStr
560:
561:
562: def patchContentType(self,obj=None):
563: """austauschen content_type with contentType (patch bei umstieg von alter Version)"""
564:
565:
566: if not obj:
567: obj = self
568:
569: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate'])
570:
571: for entry in entries:
572: setattr(entry[1],'contentType',entry[1].content_type)
573: #entry[1].contentType == entry[1].content_type
574:
575: if entry[1].meta_type == 'ECHO_collection':
576: entry[1].patchContentType(entry[1])
577:
578:
579: return "changed all contenttypes in: "+self.title
580:
581:
582: def repairAllCoords(self):
583: """updates map coordinates on the same and sublevels"""
584: return repairCoords(self)
585:
586:
587: def patchViewClassification(self,obj=None):
588: """setze viewClassification heuristisch"""
589:
590: def checkIfArrow(obj):
591: if hasattr(obj,'coords'):
592: for coordtemp in obj.coords:
593:
594: if (len(coordtemp)>4) and not (coordtemp[4]==''):
595: return 4
596: return None
597: return None
598:
599: if not obj:
600: obj = self
601:
602: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_group'])
603:
604: for entry in entries:
605:
606: if checkIfArrow(entry[1]):
607: setattr(entry[1],'viewClassification','view point')
608: else:
609: setattr(entry[1],'viewClassification','area')
610:
611: #entry[1].contentType == entry[1].content_type
612:
613: if entry[1].meta_type in ['ECHO_collection','ECHO_group']:
614: entry[1].patchViewClassification(entry[1])
615:
616:
617: return "changed all contenttypes in: "+self.title
618:
619: def deleteCache(self,obj=None,RESPONSE=None):
620: """setze alle collections auf cache = CacheManager"""
621: if not obj:
622: obj = self
623: entries=obj.ZopeFind(obj,search_sub=1)
624: for entry in entries:
625: if hasattr(entry[1],'_v_hash'):
626: entry[1]._v_hash=None
627:
628: return "changed all CM in: "+self.title
629:
630:
631: security.declarePublic('ECHO_newViewerLink')
632: def ECHO_newViewerLink(self,obj=None):
633: """change links (:86 faellt weg)"""
634:
635: if not obj:
636: obj = self
637:
638: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
639:
640: for entry in entries:
641:
642: if entry[1].meta_type == 'ECHO_resource':
643:
644: entry[1].link=re.sub('\:86','',entry[1].link)
645:
646: else:
647:
648: entry[1].ECHO_newViewerLink(entry[1])
649:
650: return "Rerenderd all links to resources in: "+self.title
651:
652: def __init__(self,id,title):
653: """init"""
654: self.id = id
655: self.title=title
656:
657: def deleteSpace(self,str):
658: """delete space at the end of a line"""
659: if str[len(str)-1]==" ":
660: return str[0:len(str)-1]
661: else:
662: return str
663:
664:
665:
666: # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt
667:
668: def formatAscii(self,str,url=None):
669: """ersetze ascii umbrueche durch <br>"""
670:
671: if not str:
672: return ""
673:
674: if url:
675:
676: retStr=""
677: words=str.split("\n")
678:
679: for word in words:
680: strUrl=url%word
681:
682: retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
683: str=retStr
684: if str:
685: str = re.sub(r"[\n]","<br/>",str)
686: return unicodify(str)
687: else:
688: return u""
689:
690: #link2html=vlp_xmlhelpers.link2html
691: #related2html=vlp_xmlhelpers.related2html
692:
693: #xml2html=vlp_xmlhelpers.xml2html
694:
695: #checkRef=vlp_xmlhelpers.checkRef
696:
697: # def checkRef(self,ref):
698: # if ref[0:3]=='lit':
699: # if len(self.library_data({ 'id':ref}))>0:
700: # return 1
701: # try:
702: # if ref[0:7]=="tec_cat":
703: # return 1
704: # except:
705: # """nothing"""
706: #
707: # dbs={'vl_technology':'','vl_people':" AND complete='yes'",'vl_sites':''}
708: # res=None
709: # for db in dbs.keys():
710: # res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))
711: # return res
712: #
713: # #Ende Methode fuer vlp
714:
715: def PgQuoteString(self,string):
716: """Quote string"""
717:
718: return libpq.PgQuoteString(string)
719:
720: security.declareProtected('View','getPartners')
721: def getPartners(self):
722: """Get list of Partners. Presently only from a subfolder partners"""
723: if hasattr(self,'partners'):
724: ret = [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])]
725: def sort_title(one, another) : return cmp(one.title, another.title)
726: ret.sort(sort_title)
727: return ret
728: else:
729: return []
730:
731: def getInstitutions(self):
732: """Get list of Partners. Presently only from a subfolder partners"""
733:
734: return [ item[1] for item in self.institutions.ZopeFind(self.institutions,obj_metatypes=['ECHO_institution'])]
735:
736:
737: def getPartnersXML(self):
738: """partner liste als xml"""
739: partners=self.getPartners()
740: ret="""<?xml version="1.0" encoding="utf-8" ?>
741: <partners>"""
742:
743: for partner in partners:
744: ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),partner.title)
745:
746: return ret+"\n</partners>"
747:
748: def getCollectionTree(self):
749: """get the collection tree (list of triples (parent,child, depth)"""
750:
751: def getCollection(object,depth=0):
752: depth+=1
753: collections=[]
754: for entry in object.__dict__.keys():
755: element=getattr(object,entry)
756: try:
757: if element.meta_type=="ECHO_collection":
758: collections.append((object,element,depth))
759: collections+=getCollection(element,depth)
760: except:
761: """nothing"""
762: return collections
763:
764:
765: return getCollection(self)
766:
767: def getCollectionTreeIds(self):
768: """Show the IDs of the Tree"""
769: ret=[]
770: for collection in self.getCollectionTree():
771: ret.append((collection[0].getId(),collection[1].getId(),collection[2]))
772: return ret
773:
1.1.2.4 ! dwinter 774:
1.1.2.3 dwinter 775: def exportAllCollectionsAsJSON(self,REQUEST=None,exportTypes=['ECHO_resource']):
1.1.2.2 dwinter 776: "export all collections"
777: import json
1.1.2.3 dwinter 778: collections = self.ZopeFind(self,obj_metatypes=['ECHO_collection','ECHO_group'],search_sub=1)
1.1.2.4 ! dwinter 779: #collections = self.ZopeFind(self,obj_metatypes=['ECHO_group'],search_sub=1)
1.1.2.2 dwinter 780:
781: ret={}
782: for collection in collections:
783: colId = collection[1].absolute_url().replace(self.absolute_url(),'')
1.1.2.3 dwinter 784: ret[colId]=collection[1].getExport(metatypes=exportTypes);
1.1.2.2 dwinter 785:
786: if REQUEST:
787: REQUEST.response.setHeader("Content-type", "text/json; charset=utf-8")
788:
789: return json.dumps(ret)
790:
1.1.2.3 dwinter 791: def exportAllCollectionsAndSubCollectionAsJSON(self,REQUEST):
792: "exportiere alle collectionen und subcolletionen, export nicht die inhalte der collectionen sondern nur die hierarchie"
793: return self.exportAllCollectionsAsJSON(REQUEST=None,exportTypes=['ECHO_collection','ECHO_group'])
1.1.2.2 dwinter 794:
1.1.2.3 dwinter 795:
1.1.2.2 dwinter 796:
1.1.2.1 dwinter 797: def getResourcesHTML(self,viewerType=None,filter=None):
798: """gebe all ressourcen aus"""
799:
800: def sortHTML(x,y):
801: return cmp(x[1].title,y[1].title)
802:
803: ret="""<html><body><h2>Resources in ECHO</h3>"""
804:
1.1.2.2 dwinter 805:
1.1.2.1 dwinter 806: resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource','VLP_resource'],search_sub=1)
807: ret+="""<h3>Found %i resources</h3>"""%len(resources)
808: resources.sort(sortHTML)
809: for resource in resources:
810: echo_url=resource[1].absolute_url()
811:
812: if hasattr(resource[1],'title'):
813: title=resource[1].title
814: else:
815: title="None"
816: if filter:
817: if re.search(filter,title):
818: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
819: else:
820: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
821:
822: ret +="""\n</body></html>"""
823:
824: #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html")
825: #self.REQUEST.RESPONSE.write(ret)
826: return ret
827:
828: def getResourcesXML(self,viewerType=None,filter=None):
829: """gebe all ressourcen aus"""
830: ret="""<?xml version="1.0" ?>
831: <index>"""
832: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource','VLP_resource'],search_sub=1):
833:
834: echo_url=resource[1].absolute_url()
835: if hasattr(resource[1],'link'):
836: viewer_url=resource[1].link
837: else:
838: viewer_url="NO URL"
839: if filter:
840: if re.search(filter,viewer_url):
841: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
842: else:
843: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
844: ret +="""\n</index>"""
845:
846: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
847: self.REQUEST.RESPONSE.write(ret)
848:
849: def getCollectionsXML(self,viewerType=None,filter=None):
850: """gebe collections aus"""
851: ret="""<?xml version="1.0" ?>
852: <index>"""
853: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_collection','ECHO_group'],search_sub=1):
854:
855: echo_url=resource[1].absolute_url()
856:
857: ret+="""\n<collection echoLink="%s"/>"""%urllib.quote(echo_url,safe='/:?')
858: ret +="""\n</index>"""
859:
860: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
861: self.REQUEST.RESPONSE.write(ret)
862:
863: def getFullTextsXML(self,viewerType=None,filter=None):
864: """gebe all ressourcen aus"""
865: ret="""<?xml version="1.0" ?>
866: <index>"""
867: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
868:
869: echo_url=resource[1].absolute_url()
870: if resource[1].getFullTextXML(noredirect="yes"):
871: if hasattr(resource[1],'link'):
872: viewer_url=echo_url+"/getFullTextXML"
873: else:
874: viewer_url="NO URL"
875: if filter:
876: if re.search(filter,viewer_url):
877: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
878: else:
879: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
880: ret +="""\n</index>"""
881:
882:
883: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
884: self.REQUEST.RESPONSE.write(ret)
885:
886:
887: def getMetaDatasXML(self,viewerType=None,filter=None):
888: """gebe all ressourcen aus"""
889: # check if the request's host part was OK
890: http_host = self.REQUEST['HTTP_HOST']
891: host_port = self.REQUEST['SERVER_PORT']
892: fix_host = None
893: if http_host and http_host.rfind(host_port) == -1:
894: print "HTTP_HOST needs fixing!"
895: fix_host = http_host + ":" + host_port
896:
897: ret="""<?xml version="1.0" ?>
898: <index>"""
899: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
900:
901: echo_url=resource[1].absolute_url()
902: if fix_host:
903: #print "replacing ", http_host, " by ", fix_host
904: echo_url = string.replace(echo_url, http_host, fix_host, 1)
905:
906: if hasattr(resource[1],'link'):
907: meta_url=echo_url+"/getMetaDataXML"
908: else:
909: meta_url="NO_URL"
910:
911: if filter and not re.search(filter,viewer_url):
912: continue
913:
914: #modificationDate=time.strptime(str(resource[1].bobobase_modification_time()),"%Y/%m/%d %H:%M:%S %Z")
915:
916: modificationDate=resource[1].bobobase_modification_time().strftime("%Y/%m/%d %H:%M:%S")
917:
918: ret+="""\n<resource resourceLink="%s" metaLink="%s" modificationDate="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(meta_url,safe='/:?'),modificationDate)
919:
920:
921: ret +="""\n</index>"""
922:
923: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
924: self.REQUEST.RESPONSE.write(ret)
925:
926:
927: def findPartners(self):
928: """find all partners in partners"""
929: par=self.ZopeFind(self.partners, obj_metatypes='ECHO_partner')
930: return par
931:
932: def getPartnerFromID(self):
933: """find partner form ID return object"""
934: pa=self.REQUEST['partner']
935: par=self.ZopeFind(self.partners, obj_ids=[pa])
936: return par
937:
938: def getPartnerFromIDParameter(self, id):
939: """ find partners from ID"""
940: par=self.ZopeFind(self.partners, obj_ids=[id])
941: return par
942:
943: def getInstitutionFromID(self,id):
944: """ find institution from id """
945: inst=self.ZopeFind(self.institutions, obj_ids=[id])
946: return inst
947:
948: def updateResourceCatalog(self,REQUEST,RESPONSE):
949: """update ressource catalog"""
950: catalog=getattr(self,'resourceCatalog',None)
951: if not catalog:
952: return """<html><body><h3>No resourceCatalog available</h3></body></html>"""
953:
954: else:
955: class element:
956: def __init__(self,group,name):
957: self.group=group
958: self.name=name
959: catalog.manage_delObjects('author splitter')
960: #elements=[element('Stop Words',""" Don't remove stop words' """),element('Word Splitter','ECHO author splitter')]
961: elements=[element('Word Splitter','ECHO author splitter')]
962: manage_addLexicon(catalog,id="author splitter",elements=elements)
963:
964: return catalog.manage_catalogReindex(REQUEST,RESPONSE,'manage_main')
965:
966:
967: def checkMetaDataLinks(self,correct=None):
968: """check all metadatalinks and if correct is set change the servername to content.mpiwg-berlin.mpg.de"""
969:
970: self.REQUEST.RESPONSE.write("<html><body>")
971: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
972: metalink=resource[1].metalink
973:
974: try:
975: url=urllib.urlopen(metalink)
976: except:
977:
978: self.REQUEST.RESPONSE.write("<p>ERROR (opening %s):"%resource[1].absolute_url() +" -- %s %s <br>"%sys.exc_info()[0:2])
979: self.REQUEST.RESPONSE.write("-----------%s"%metalink)
980:
981: if correct:
982: urlparsed=[x for x in urlparse.urlparse(metalink)]
983: urlparsed[1]="content.mpiwg-berlin.mpg.de"
984: neu=urlparse.urlunparse(urlparsed)
985: resource[1].metalink=neu[0:]
986: self.REQUEST.RESPONSE.write("----------changed to:%s)"%neu)
987:
988:
989:
990: def manage_addECHO_root(self,id,title,RESPONSE=None):
991: """Add an ECHO_root"""
992: self._setObject(id,ECHO_root(id,title))
993:
994: if RESPONSE is not None:
995: RESPONSE.redirect('manage_main')
996:
997: def manage_addECHO_rootForm(self):
998: """Nothing yet"""
999: pt=zptFile(self, 'zpt/AddECHO_root.zpt')
1000: return pt()
1001:
1002:
1003:
1004: from ECHO_Nav import ECHO_navigation
1005:
1006: class ECHO_main(ECHO_root,ECHO_navigation):
1007: """echo main object combines ECHO_root and ECHO_navigation"""
1008:
1009: meta_type="ECHO_main"
1010:
1011: def __init__(self,id,title):
1012: """init"""
1013: self.id=id
1014: self.title=title
1015: self.pathToHierarchy="/"+self.id # hierarchie always starts with the object.
1016: self.displayedMetaTypes=displayTypes
1017:
1018:
1019: manage_options = Folder.manage_options+(
1020: {'label':'Main Config','action':'ECHO_navigationConfigForm'},
1021: {'label':'Cache','action':'ECHO_cacheManageForm'},
1022: {'label':'Main Config','action':'ECHO_copyright_configForm'},
1023: {'label':'Change Weights','action':'changeWeights'},
1024: {'label':'Generate from RDF','action':'generateFromRDFForm'},
1025: {'label':'update Resource Catalog','action':'updateResourceCatalog'},
1026: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
1027: )
1028:
1029:
1030: def manage_addECHO_mainForm(self):
1031: """Form for adding"""
1032: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_main.zpt')).__of__(self)
1033: return pt()
1034:
1035: def manage_addECHO_main(self,id,title,RESPONSE=None):
1036: """Add an ECHO_main"""
1037: self._setObject(id,ECHO_main(id,title))
1038:
1039: obj=self._getOb(id)
1040: text=file(os.path.join(package_home(globals()),'zpt','main_template')).read()
1041:
1042: manage_addPageTemplate(obj,'main_template',text=text)
1043:
1044:
1045: if RESPONSE is not None:
1046: RESPONSE.redirect('manage_main')
1047:
1048:
1049:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>